Skip to content

Commit 8f1eda4

Browse files
authored
Merge pull request #26 from will-stone/sortable
Sortable
2 parents 40b1eaa + fabaed2 commit 8f1eda4

File tree

6 files changed

+127
-18
lines changed

6 files changed

+127
-18
lines changed

package.json

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
"bugs": {
1717
"url": "https://github.com/will-stone/browserosaurus/issues"
1818
},
19-
"keywords": ["Electron", "Browser chooser"],
19+
"keywords": [
20+
"Electron",
21+
"Browser chooser"
22+
],
2023
"author": "Will Stone",
2124
"license": "MIT",
2225
"devDependencies": {
@@ -41,25 +44,35 @@
4144
"mousetrap": "^1.6.1",
4245
"opn": "^5.1.0",
4346
"pretty-checkbox": "^3.0.3",
47+
"sortablejs": "^1.7.0",
4448
"xml2json": "^0.11.0"
4549
},
4650
"config": {
4751
"forge": {
4852
"make_targets": {
49-
"darwin": ["dmg"]
53+
"darwin": [
54+
"dmg"
55+
]
5056
},
5157
"electronPackagerConfig": {
5258
"packageManager": "yarn",
5359
"icon": "src/images/icon/icon.icns",
54-
"ignore": ["docs"],
60+
"ignore": [
61+
"docs"
62+
],
5563
"protocols": [
5664
{
5765
"name": "HTTP link",
58-
"schemes": ["http", "https"]
66+
"schemes": [
67+
"http",
68+
"https"
69+
]
5970
},
6071
{
6172
"name": "File",
62-
"schemes": ["file"]
73+
"schemes": [
74+
"file"
75+
]
6376
}
6477
]
6578
}

src/main.js

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const store = new Store({ defaults: defaultConfig })
2929
*/
3030
function loadConfig() {
3131
return new Promise(fulfill => {
32-
userConfig['browsers'] = store.get('browsers')
32+
userConfig.browsers = store.get('browsers')
3333

3434
let userBrowserFound
3535

@@ -87,11 +87,11 @@ function findInstalledBrowsers() {
8787
profile,
8888
'plist.array.dict.array[1].dict[*].string[0]'
8989
)
90-
installedBrowsers = installedApps
91-
.map(appName => {
92-
for (let i = 0; i < userConfig.browsers.length; i++) {
93-
const browser = userConfig.browsers[i]
94-
if (browser.name === appName) {
90+
installedBrowsers = userConfig.browsers
91+
.map(browser => {
92+
for (let i = 0; i < installedApps.length; i++) {
93+
//const browser = installedApps[i]
94+
if (browser.name === installedApps[i]) {
9595
return browser
9696
}
9797
}
@@ -240,6 +240,19 @@ function togglePreferencesWindow(callback) {
240240
}
241241
}
242242

243+
/**
244+
* Array Move
245+
*
246+
* Utility function to move an array item to a specific spot in the array.
247+
* @param {Array} array
248+
* @param {Number} fromIndex
249+
* @param {Number} toIndex
250+
*/
251+
function arrayMove(array, fromIndex, toIndex) {
252+
array.splice(toIndex, 0, array.splice(fromIndex, 1)[0])
253+
return array
254+
}
255+
243256
/**
244257
* Toggle browser event
245258
*
@@ -252,12 +265,34 @@ ipcMain.on('toggle-browser', (event, { browserName, enabled }) => {
252265
const browserIndex = userConfig.browsers.findIndex(
253266
browser => browser.name === browserName
254267
)
255-
256268
userConfig.browsers[browserIndex].enabled = enabled
257-
258269
store.set('browsers', userConfig.browsers)
270+
pickerWindow.webContents.send('incomingBrowsers', installedBrowsers)
271+
})
259272

273+
/**
274+
* Sort browser event
275+
*
276+
* Listens for the sort-browser event, triggered from the preferences renderer
277+
* when a browser is dragged to a new position.
278+
* @param {Number} oldIndex index of browser being moved from.
279+
* @param {Number} newIndex index of place browser is being moved to.
280+
*/
281+
ipcMain.on('sort-browser', (event, { oldIndex, newIndex }) => {
282+
const from = installedBrowsers[oldIndex].name
283+
const to = installedBrowsers[newIndex].name
284+
285+
const fromIndex = userConfig.browsers.findIndex(
286+
browser => browser.name === from
287+
)
288+
const toIndex = userConfig.browsers.findIndex(browser => browser.name === to)
289+
290+
userConfig.browsers = arrayMove(userConfig.browsers, fromIndex, toIndex)
291+
installedBrowsers = arrayMove(installedBrowsers, oldIndex, newIndex)
292+
293+
store.set('browsers', userConfig.browsers)
260294
pickerWindow.webContents.send('incomingBrowsers', installedBrowsers)
295+
preferencesWindow.webContents.send('incomingBrowsers', installedBrowsers)
261296
})
262297

263298
/**
@@ -281,8 +316,7 @@ app.on('ready', () => {
281316
})
282317
})
283318
createPreferencesWindow()
284-
findInstalledBrowsers().then(data => {
285-
installedBrowsers = data
319+
findInstalledBrowsers().then(installedBrowsers => {
286320
pickerWindow.webContents.send('incomingBrowsers', installedBrowsers)
287321
preferencesWindow.webContents.send('incomingBrowsers', installedBrowsers)
288322
})

src/main.scss

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,29 @@ body {
2828
#browserList {
2929
margin: 0;
3030
padding: 0;
31+
user-select: none;
32+
33+
.handle {
34+
display: inline-block;
35+
overflow: hidden;
36+
width: 16px;
37+
height: 20px;
38+
margin-top: -0.7em;
39+
margin-right: 0.3em;
40+
padding: 3px 4px;
41+
content: '....';
42+
cursor: move;
43+
vertical-align: middle;
44+
letter-spacing: 2px;
45+
color: #aaaaaa;
46+
font-size: 12px;
47+
font-weight: bold;
48+
line-height: 5px;
49+
50+
&:after {
51+
content: '.. .. .. ..';
52+
}
53+
}
3154

3255
> li {
3356
position: relative;
@@ -66,6 +89,14 @@ body {
6689

6790
#preferences {
6891
color: #111111;
92+
93+
#browserList > li {
94+
cursor: default;
95+
96+
&.sortable-ghost {
97+
opacity: 0;
98+
}
99+
}
69100
}
70101

71102
#picker {

src/preferences.html

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99

1010
<body id="preferences">
1111

12-
<ul id="browserList"><li>Loading..<li></ul>
12+
<ul id="browserList">
13+
<li>Loading&hellip;
14+
<li>
15+
</ul>
1316

1417
</body>
1518

1619
<script>
17-
require('./preferencesRenderer.js')
20+
require('./preferencesRenderer.js')
1821
</script>
1922

20-
</html>
23+
</html>

src/preferencesRenderer.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const Sortable = require('sortablejs')
12
const electron = require('electron')
23
const browserList = document.getElementById('browserList')
34

@@ -14,6 +15,18 @@ function toggleBrowser(browserName, enabled) {
1415
electron.ipcRenderer.send('toggle-browser', { browserName, enabled })
1516
}
1617

18+
/**
19+
* Sort browser
20+
*
21+
* Sends the sort-browser event to main.js. This allows browsers to be
22+
* reordered.
23+
* @param {Number} oldIndex index of browser being moved from.
24+
* @param {*} newIndex index of place browser is being moved to.
25+
*/
26+
function sortBrowser(oldIndex, newIndex) {
27+
electron.ipcRenderer.send('sort-browser', { oldIndex, newIndex })
28+
}
29+
1730
/**
1831
* Incoming browsers event
1932
*
@@ -54,6 +67,11 @@ function populatePreferences(installedBrowsers) {
5467
})
5568
.map(browser => {
5669
const li = document.createElement('li')
70+
li.classList.add('browserItem')
71+
72+
const handle = document.createElement('span')
73+
handle.classList.add('handle')
74+
li.appendChild(handle)
5775

5876
const logo = document.createElement('img')
5977
logo.classList.add('browserLogo')
@@ -97,6 +115,12 @@ function populatePreferences(installedBrowsers) {
97115

98116
browserList.appendChild(li)
99117
})
118+
119+
Sortable.create(browserList, {
120+
draggable: '.browserItem',
121+
handle: '.handle',
122+
onEnd: e => sortBrowser(e.oldIndex, e.newIndex)
123+
})
100124
} else {
101125
const listItem = document.createElement('li')
102126

yarn.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5319,6 +5319,10 @@ sort-keys@^1.0.0:
53195319
dependencies:
53205320
is-plain-obj "^1.0.0"
53215321

5322+
sortablejs@^1.7.0:
5323+
version "1.7.0"
5324+
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
5325+
53225326
source-map-support@^0.4.15:
53235327
version "0.4.18"
53245328
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"

0 commit comments

Comments
 (0)