-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
127 lines (102 loc) · 3.41 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const meta = require('meta-keys')(window, true)
const Disposable = require('atom').Disposable
const findup = require('findup-element')
exports.activate = activate
exports.config = {
enabledByDefault: {
'type': 'boolean',
'default': false,
'title': 'Enable By Default',
'description': 'Next time your editor starts up, number-slider will be enabled by default'
}
}
function activate () {
atom.workspace.getTextEditors().forEach(attach)
atom.workspace.onDidAddTextEditor(function (d) {
return attach(d.textEditor)
})
atom.commands.add('atom-workspace', 'number-slider:disable', setState(false))
atom.commands.add('atom-workspace', 'number-slider:enable', setState(true))
atom.commands.add('atom-workspace', 'number-slider:toggle', setState())
setState(atom.config.get('number-slider.enabledByDefault'))()
}
var enabled = false
function setState (_enabled) {
return function () {
if (typeof _enabled === 'undefined') _enabled = !enabled
if ((enabled = _enabled)) {
document.body.classList.add('number-slider-enabled')
} else {
document.body.classList.remove('number-slider-enabled')
}
}
}
function attach (editor) {
const view = atom.views.getView(editor)
const subs = []
var clientX = null
var range = null
var check = null
var value = null
view.shadowRoot.addEventListener('mousedown', mousedown, false)
window.addEventListener('mousemove', mousemove, true)
window.addEventListener('mouseup', clear, true)
function mousedown (e) {
if (!enabled) return
const el = findup(e.target, function (el) {
return el.classList && el.classList.contains('numeric')
})
if (!el) return
const operator = (
el.previousElementSibling &&
el.previousElementSibling.innerHTML
)
range = editor.bufferRangeForScopeAtCursor('.numeric')
if (!range) return
if (operator === '-' || operator === '+') {
range.start.column = Math.max(0, range.start.column - 1)
}
value = Number(editor.getTextInBufferRange(range))
if (isNaN(value)) return
check = editor.getBuffer().createCheckpoint()
editor.setSelectedBufferRange(range)
clientX = e.clientX
document.body.classList.add('number-slider-down')
}
function mousemove (e) {
if (!range) return
const diff = e.clientX - clientX
const nval = fixRounding(value + Math.round(diff / 2) * getAmplitude(value))
range = editor.setTextInBufferRange(range, String(nval))
editor.setSelectedBufferRange(range)
e.stopPropagation()
e.preventDefault()
return false
}
function clear () {
editor.getBuffer().groupChangesSinceCheckpoint(check)
check = null
range = null
document.body.classList.remove('number-slider-down')
document.body.style.cursor = null
}
subs.push(new Disposable(function () {
view.shadowRoot.removeEventListener('mousedown', mousedown, false)
window.removeEventListener('mousemove', mousemove, true)
window.removeEventListener('mouseup', clear, true)
}))
subs.push(editor.onDidDestroy(function () {
subs.forEach(function (sub) { return sub.dispose() })
subs.length = 0
}))
}
function getAmplitude (value) {
if (meta.shift[0]) return 10
if (meta.shift[1]) return 10
if (meta.alt[0]) return 1
if (meta.alt[1]) return 1
return Math.min(1, Math.pow(10, Math.floor(Math.log10(value)))) || 1
}
function fixRounding (number) {
return Math.round(number * 10000) / 10000
}