118 lines
3.0 KiB
Lua
118 lines
3.0 KiB
Lua
-- Default widget requirements
|
|
local base = require('wibox.widget.base')
|
|
local gtable = require('gears.table')
|
|
local setmetatable = setmetatable
|
|
local dpi = require('beautiful').xresources.apply_dpi
|
|
|
|
-- Commons requirements
|
|
local wibox = require('wibox')
|
|
local gears = require('gears')
|
|
local beautiful = require('beautiful')
|
|
local mat_colors = require('theme.color-schemes')
|
|
-- Local declarations
|
|
|
|
local mat_slider = {
|
|
mt = {}
|
|
}
|
|
|
|
local properties = {
|
|
read_only = false
|
|
}
|
|
|
|
function mat_slider:set_value(value)
|
|
if self._private.value ~= value then
|
|
self._private.value = value
|
|
self._private.progress_bar:set_value(self._private.value)
|
|
self._private.slider:set_value(self._private.value)
|
|
self:emit_signal('property::value')
|
|
-- self:emit_signal('widget::layout_changed')
|
|
end
|
|
end
|
|
|
|
function mat_slider:get_value(value)
|
|
return self._private.value
|
|
end
|
|
|
|
function mat_slider:set_read_only(value)
|
|
if self._private.read_only ~= value then
|
|
self._private.read_only = value
|
|
self:emit_signal('property::read_only')
|
|
self:emit_signal('widget::layout_changed')
|
|
end
|
|
end
|
|
|
|
function mat_slider:get_read_only(value)
|
|
return self._private.read_only
|
|
end
|
|
|
|
function mat_slider:layout(_, width, height)
|
|
local layout = {}
|
|
table.insert(layout, base.place_widget_at(self._private.progress_bar, 0, dpi(21), width, height - dpi(42)))
|
|
if (not self._private.read_only) then
|
|
table.insert(layout, base.place_widget_at(self._private.slider, 0, dpi(6), width, height - dpi(12)))
|
|
end
|
|
return layout
|
|
end
|
|
|
|
function mat_slider:draw(_, cr, width, height)
|
|
if (self._private.read_only) then
|
|
self._private.slider.forced_height = 0
|
|
end
|
|
end
|
|
|
|
function mat_slider:fit(_, width, height)
|
|
return width, height
|
|
end
|
|
|
|
local function new(args)
|
|
local ret = base.make_widget(nil, nil, {
|
|
enable_properties = true
|
|
})
|
|
|
|
gtable.crush(ret._private, args or {})
|
|
|
|
gtable.crush(ret, mat_slider, true)
|
|
|
|
ret._private.progress_bar = wibox.widget {
|
|
max_value = 100,
|
|
value = 25,
|
|
forced_height = dpi(6),
|
|
paddings = 0,
|
|
shape = gears.shape.rounded_rect,
|
|
background_color = beautiful.primary.hue_100,
|
|
color = beautiful.accent.hue_400,
|
|
widget = wibox.widget.progressbar
|
|
}
|
|
|
|
ret._private.slider = wibox.widget {
|
|
forced_height = dpi(8),
|
|
bar_shape = gears.shape.rounded_rect,
|
|
bar_height = 0,
|
|
bar_color = beautiful.accent.hue_500,
|
|
handle_color = beautiful.accent.hue_300,
|
|
handle_shape = gears.shape.circle,
|
|
handle_border_color = '#00000012',
|
|
handle_border_width = dpi(3),
|
|
value = 25,
|
|
widget = wibox.widget.slider
|
|
}
|
|
|
|
ret._private.slider:connect_signal('property::value', function()
|
|
ret:set_value(ret._private.slider.value)
|
|
end)
|
|
|
|
ret._private.read_only = false
|
|
|
|
return ret
|
|
end
|
|
|
|
function mat_slider.mt:__call(...)
|
|
return new(...)
|
|
end
|
|
|
|
-- @DOC_widget_COMMON@
|
|
|
|
-- @DOC_object_COMMON@
|
|
|
|
return setmetatable(mat_slider, mat_slider.mt)
|