feat(w.w.slider): Add signals for the dragging state
When trying to hook up the slider to an external value, one would usually have two data streams: - `property::value` -> set external value - external value changed -> `.value = new_value` The problem is that without manual intervention, these two streams form a loop, as setting `.value` also emits `property::value`. The new set of signals is disconnected from the `value` property and its signal and allows for more fine grained inspection of the dragging state. Signed-off-by: Lucas Schwiderski <lucas@lschwiderski.de>
This commit is contained in:
parent
1f7ac8f9c7
commit
5eee348d3f
|
@ -274,6 +274,28 @@ local slider = {mt={}}
|
|||
-- @beautiful beautiful.slider_bar_active_color
|
||||
-- @param color
|
||||
|
||||
--- Emitted when the user starts dragging the handle.
|
||||
--
|
||||
-- @signal drag_start
|
||||
-- @tparam number value The current value
|
||||
|
||||
--- Emitted for every mouse move while the handle is being dragged.
|
||||
--
|
||||
-- This signal is only emitted by the user dragging the handle. It is therefore
|
||||
-- preferrable over `property::value`, as it cannot create a loop when trying to
|
||||
-- hook up the slider as representation of an external value (e.g. system
|
||||
-- volume).
|
||||
--
|
||||
-- @signal drag
|
||||
-- @tparam number value The current value
|
||||
|
||||
--- Emitted when the user stops dragging the handle.
|
||||
--
|
||||
-- This signal is emitted when the user releases the mouse button after dragging
|
||||
-- the handle.
|
||||
--
|
||||
-- @signal drag_end
|
||||
-- @tparam number value The current value
|
||||
|
||||
local properties = {
|
||||
-- Handle
|
||||
|
@ -334,6 +356,15 @@ function slider:set_value(value)
|
|||
end
|
||||
end
|
||||
|
||||
--- Returns `true` while the user is dragging the handle.
|
||||
--
|
||||
-- @property is_dragging
|
||||
-- @propertydefault Depends on the current dragging state.
|
||||
-- @treturn boolean
|
||||
function slider:get_is_dragging()
|
||||
return self._private.is_dragging
|
||||
end
|
||||
|
||||
local function get_extremums(self)
|
||||
local min = self._private.minimum or properties.minimum
|
||||
local max = self._private.maximum or properties.maximum
|
||||
|
@ -535,6 +566,9 @@ local function mouse_press(self, x, y, button_id, _, geo)
|
|||
|
||||
move_handle(self, width, x, y)
|
||||
|
||||
self._private.is_dragging = true
|
||||
self:emit_signal("drag_start", self.value)
|
||||
|
||||
-- Calculate a matrix transforming from screen coordinates into widget coordinates
|
||||
local wgeo = geo.drawable.drawable:geometry()
|
||||
local matrix = matrix_from_device:translate(-wgeo.x, -wgeo.y)
|
||||
|
@ -545,11 +579,14 @@ local function mouse_press(self, x, y, button_id, _, geo)
|
|||
|
||||
capi.mousegrabber.run(function(mouse)
|
||||
if not mouse.buttons[1] then
|
||||
self._private.is_dragging = false
|
||||
self:emit_signal("drag_end", self.value)
|
||||
return false
|
||||
end
|
||||
|
||||
-- Calculate the point relative to the widget
|
||||
move_handle(self, width, matrix:transform_point(mouse.x, mouse.y))
|
||||
self:emit_signal("drag", self.value)
|
||||
|
||||
return true
|
||||
end,handle_cursor)
|
||||
|
|
Loading…
Reference in New Issue