Skip to content

Commit 160fcb6

Browse files
authored
Merge pull request #722 from JunoLab/avi/selectlist
use atom-select-list instead of atom-space-pen-view:
2 parents b19db10 + d5bb9ea commit 160fcb6

File tree

8 files changed

+139
-202
lines changed

8 files changed

+139
-202
lines changed

lib/runtime/evaluation.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ module.exports =
190190
else if dirs.length == 1
191191
@_cd dirs[0]
192192
else
193-
selector.show(dirs)
193+
selector.show(dirs, { infoMessage: 'Select project to work in' })
194194
.then (dir) =>
195195
return unless dir?
196196
@_cd dir

lib/runtime/modules.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ module.exports =
6666
modules
6767
modules.catch (err) =>
6868
console.log err
69-
selector.show(modules, active: active).then (mod) =>
69+
selector.show(modules, { active, infoMessage: 'Select module to evaluate in' }).then (mod) =>
7070
return unless mod?
7171
if mod is @autodetect
7272
delete item.juliaModule

lib/runtime/packages.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import { selector } from '../ui'
66
var { packages } = client.import({ rpc: ['packages'] })
77

88
export function openPackage (newWindow = true) {
9-
let pkgs = packages()
9+
const pkgs = packages()
1010
pkgs.then(pkgs => {
11-
ps = []
12-
for (pkg in pkgs) {
13-
ps.push({primary: pkg, secondary: pkgs[pkg]})
11+
const ps = []
12+
for (const pkg in pkgs) {
13+
ps.push({ primary: pkg, secondary: pkgs[pkg] })
1414
}
15-
selector.show(ps).then( pkg => {
15+
selector.show(ps, { infoMessage: 'Select package to open' }).then( pkg => {
1616
if (pkg) {
1717
if (newWindow) {
1818
atom.open({ pathsToOpen: [pkgs[pkg.primary]]})

lib/ui.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ module.exports =
3232

3333
consumeInk: (@ink) ->
3434
@views.ink = @ink
35-
@selector.ink = @ink
3635
@progress.ink = @ink
36+
@selector.activate(@ink)
3737
@docpane.activate(@ink)
3838
@progress.activate()
3939
@focusutils.activate(@ink)

lib/ui/selector.coffee

Lines changed: 0 additions & 63 deletions
This file was deleted.

lib/ui/selector.js

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/** @babel */
2+
3+
import SelectList from 'atom-select-list'
4+
5+
/**
6+
* @type {SelectList}
7+
*/
8+
let selector
9+
let panel, ink
10+
11+
export function activate (_ink) {
12+
ink = _ink
13+
selector = new SelectList({
14+
items: [],
15+
elementForItem
16+
})
17+
selector.element.classList.add('command-palette', 'julia-clientselector')
18+
panel = atom.workspace.addModalPanel({ item: selector.element })
19+
}
20+
21+
function elementForItem (item, { selected }) {
22+
const view = document.createElement('li')
23+
if (selected) view.classList.add('active')
24+
const name = (item.primary) ? item.primary.toString() : item.toString()
25+
const primary = ink.matchHighlighter.highlightMatches(name, selector.getFilterQuery())
26+
view.appendChild(primary)
27+
if (item.secondary) {
28+
const secondary = document.createElement('div')
29+
secondary.classList.add('secondary-line', 'path')
30+
secondary.innerText = item.secondary
31+
view.classList.add('two-lines')
32+
primary.classList.add('primary-line')
33+
view.append(secondary)
34+
}
35+
return view
36+
}
37+
38+
export function show (items, { active, emptyMessage, errorMessage, infoMessage, allowCustom } = {}) {
39+
selector.update({
40+
items: [],
41+
query: '',
42+
loadingMessage: 'Loading ...',
43+
})
44+
const lastFocusedPane = atom.workspace.getActivePane()
45+
panel.show()
46+
selector.focus()
47+
let confirmed = false
48+
return new Promise((resolve, reject) => {
49+
selector.props.didConfirmSelection = (item) => {
50+
confirmed = true
51+
selector.cancelSelection()
52+
resolve(item)
53+
}
54+
selector.props.didConfirmEmptySelection = () => {
55+
confirmed = true
56+
selector.cancelSelection()
57+
const query = selector.getQuery()
58+
if (allowCustom && query.length > 0) {
59+
resolve(query)
60+
} else {
61+
resolve()
62+
}
63+
}
64+
selector.props.didCancelSelection = () => {
65+
panel.hide()
66+
lastFocusedPane.activate()
67+
const query = selector.getQuery()
68+
if (!confirmed) {
69+
if (allowCustom && query.length > 0) {
70+
resolve(query)
71+
} else {
72+
resolve()
73+
}
74+
}
75+
}
76+
if (items.constructor == Promise) {
77+
items.then(items => {
78+
const filterKeyForItem = (items.length > 0 && items[0] instanceof Object) ?
79+
item => item.primary : item => item
80+
selector.update({
81+
items,
82+
filterKeyForItem,
83+
emptyMessage,
84+
errorMessage,
85+
infoMessage,
86+
loadingMessage: ''
87+
})
88+
if (active) {
89+
const index = (active instanceof Number) ? active :
90+
(active instanceof Function) ? items.findIndex(active) :
91+
items.findIndex(item => item == active)
92+
selector.selectIndex(index)
93+
}
94+
}).catch(err => {
95+
reject(err)
96+
selector.cancelSelection()
97+
})
98+
} else {
99+
const filterKeyForItem = (items.length > 0 && items[0] instanceof Object) ?
100+
item => item.primary : item => item
101+
selector.update({
102+
items,
103+
filterKeyForItem,
104+
emptyMessage,
105+
errorMessage,
106+
infoMessage,
107+
loadingMessage: ''
108+
})
109+
if (active) {
110+
const index = (active instanceof Number) ? active :
111+
(active instanceof Function) ? items.findIndex(active) :
112+
items.findIndex(item => item == active)
113+
selector.selectIndex(index)
114+
}
115+
}
116+
})
117+
}

0 commit comments

Comments
 (0)