Skip to content

Commit aeb406b

Browse files
committed
project monitor tile
1 parent 5b251e9 commit aeb406b

File tree

2 files changed

+128
-18
lines changed

2 files changed

+128
-18
lines changed

lib/runtime.coffee

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
{ CompositeDisposable, Disposable } = require 'atom'
22

33
module.exports =
4-
modules: require './runtime/modules'
5-
evaluation: require './runtime/evaluation'
6-
console: require './runtime/console'
7-
completions: require './runtime/completions'
8-
workspace: require './runtime/workspace'
9-
plots: require './runtime/plots'
10-
frontend: require './runtime/frontend'
11-
debugger: require './runtime/debugger'
12-
profiler: require './runtime/profiler'
13-
outline: require './runtime/outline'
14-
linter: require './runtime/linter'
15-
packages: require './runtime/packages'
16-
debuginfo: require './runtime/debuginfo'
17-
formatter: require './runtime/formatter'
18-
goto: require './runtime/goto'
4+
modules: require './runtime/modules'
5+
environments: require './runtime/environments'
6+
evaluation: require './runtime/evaluation'
7+
console: require './runtime/console'
8+
completions: require './runtime/completions'
9+
workspace: require './runtime/workspace'
10+
plots: require './runtime/plots'
11+
frontend: require './runtime/frontend'
12+
debugger: require './runtime/debugger'
13+
profiler: require './runtime/profiler'
14+
outline: require './runtime/outline'
15+
linter: require './runtime/linter'
16+
packages: require './runtime/packages'
17+
debuginfo: require './runtime/debuginfo'
18+
formatter: require './runtime/formatter'
19+
goto: require './runtime/goto'
1920

2021
activate: ->
2122
@subs = new CompositeDisposable()
@@ -41,15 +42,22 @@ module.exports =
4142
for mod in [@workspace, @plots]
4243
mod.ink = ink
4344
mod.activate()
44-
@subs.add new Disposable(=>
45-
mod.deactivate() for mod in [@console, @debugger, @profiler, @linter, @goto, @outline])
45+
@subs.add new Disposable =>
46+
mod.deactivate() for mod in [@console, @debugger, @profiler, @linter, @goto, @outline]
47+
@environments.consumeInk(ink)
4648

4749
provideAutoComplete: -> @completions
4850

4951
provideHyperclick: -> @goto.provideHyperclick()
5052

5153
consumeStatusBar: (bar) ->
52-
@modules.consumeStatusBar bar
54+
m = @modules.consumeStatusBar bar
55+
e = @environments.consumeStatusBar bar
56+
d = new Disposable =>
57+
m.dispose()
58+
e.dispose()
59+
@subs.add d
60+
return d
5361

5462
consumeDatatip: (datatipService) ->
5563
datatipProvider = require './runtime/datatip'

lib/runtime/environments.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/** @babel */
2+
3+
import fs from 'fs'
4+
import path from 'path'
5+
import { CompositeDisposable, Disposable } from 'atom'
6+
import { client } from '../connection'
7+
import { show } from '../ui/selector'
8+
9+
const { allProjects, updateProject, activateProject } =
10+
client.import({ rpc: ['allProjects', 'updateProject'], msg: ['activateProject'] })
11+
12+
let ink
13+
export function consumeInk (_ink) {
14+
ink = _ink
15+
}
16+
17+
export function consumeStatusBar (statusBar) {
18+
const subs = new CompositeDisposable()
19+
20+
const dom = document.createElement('a')
21+
const tileDom = document.createElement('span') // only `span` element can be hide completely
22+
tileDom.classList.add('julia', 'inline-block')
23+
tileDom.appendChild(dom)
24+
const tile = statusBar.addRightTile({
25+
item: tileDom,
26+
priority: 10
27+
})
28+
29+
let projectName = ''
30+
let projectPath = ''
31+
32+
const showTile = () => tileDom.style.display = ''
33+
const hideTile = () => tileDom.style.display = 'none'
34+
const updateTile = (proj) => {
35+
if (!proj) return
36+
dom.innerText = projectName = proj.name
37+
projectPath = proj.path
38+
showTile()
39+
}
40+
41+
client.handle({ updateProject: updateTile })
42+
43+
const onClick = (event) => {
44+
if (process.platform === 'darwin' ? event.metaKey : event.ctrlKey) {
45+
if (!fs.existsSync(projectPath)) return
46+
if (ink) {
47+
ink.Opener.open(projectPath, {
48+
pending: atom.config.get('core.allowPendingPaneItems')
49+
})
50+
} else {
51+
atom.workspace.open(projectPath, {
52+
pending: atom.config.get('core.allowPendingPaneItems'),
53+
searchAllPanes: true
54+
})
55+
}
56+
} else {
57+
client.require('choose environment', () => {
58+
const p = allProjects()
59+
.then(proj => {
60+
return proj.map(proj => {
61+
proj.primary = proj.name
62+
proj.secondary = proj.path
63+
return proj
64+
})
65+
})
66+
.catch(err => console.log(err))
67+
show(p, { active: projectName }).then(proj => {
68+
if (!proj) return
69+
const dir = path.dirname(proj.path)
70+
activateProject(dir)
71+
})
72+
})
73+
}
74+
}
75+
76+
const modifiler = process.platform == 'darwin' ? 'Cmd' : 'Ctrl'
77+
const title = () => {
78+
return `Currently working in environment ${projectName} at ${projectPath}<br >` +
79+
`Click to choose an environment<br >` +
80+
`${modifiler}-Click to open project file`
81+
}
82+
83+
const tilesub = new Disposable(() => {
84+
dom.removeEventListener('click', onClick)
85+
tile.destroy()
86+
})
87+
88+
dom.addEventListener('click', onClick)
89+
subs.add(
90+
client.onAttached(() => {
91+
updateProject()
92+
.then(updateTile)
93+
.catch(err => console.log(err))
94+
}),
95+
client.onDetached(hideTile),
96+
atom.tooltips.add(dom, { title }),
97+
tilesub
98+
)
99+
100+
hideTile()
101+
return subs
102+
}

0 commit comments

Comments
 (0)