-
Notifications
You must be signed in to change notification settings - Fork 496
Expand file tree
/
Copy pathslider.lua
More file actions
60 lines (51 loc) · 1.89 KB
/
slider.lua
File metadata and controls
60 lines (51 loc) · 1.89 KB
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
local core = require('gui.widgets.slide_core')
--------------------------------
-- Slider
--------------------------------
---@class widgets.Slider.attrs: widgets.Widget.attrs
---@field get_idx_fn? function
---@field on_change? fun(index: integer)
---@field is_single boolean
---@class widgets.Slider.attrs.partial: widgets.Slider.attrs
---@class widgets.Slider.initTable: widgets.Slider.attrs
---@field num_stops integer
---@class widgets.Slider: widgets.Widget, widgets.Slider.attrs
---@field super widgets.Widget
---@field ATTRS widgets.Slider.attrs|fun(attributes: widgets.Slider.attrs.partial)
---@overload fun(init_table: widgets.Slider.initTable): self
Slider = defclass(Slider, core)
Slider.ATTRS{
get_idx_fn=DEFAULT_NIL,
on_change=DEFAULT_NIL,
num_stops=DEFAULT_NIL,
is_single=true,
}
function Slider:get_width_per_idx()
local min_value = (self.is_single) and 3 or 5 -- Single slider = 3, else 5
return math.max(min_value, (self.frame_body.width-7) // (self.num_stops-1))
end
function Slider:onInput(keys)
if not keys._MOUSE_L then return false end
local x = self:getMousePos()
if not x then return false end
local left_idx, right_idx = self.get_idx_fn(), self.get_idx_fn()
local width_per_idx = self:get_width_per_idx()
local left_pos = width_per_idx*(left_idx-1)
local right_pos = width_per_idx*(right_idx-1) + 4
if x < left_pos then
self.on_change(self:clamp_idx(self.get_idx_fn() - 1))
elseif x < left_pos+3 then
self.is_dragging_target = 'left'
self.is_dragging_idx = x - left_pos
elseif x < right_pos then
self.is_dragging_target = 'both'
self.is_dragging_idx = x - left_pos
elseif x < right_pos+3 then
self.is_dragging_target = 'right'
self.is_dragging_idx = x - right_pos
else
self.on_change(self:clamp_idx(self.get_idx_fn() + 1))
end
return true
end
return Slider