diff --git a/modules/volume/widget-old.lua b/modules/volume/widget-old.lua new file mode 100755 index 0000000..f6451df --- /dev/null +++ b/modules/volume/widget-old.lua @@ -0,0 +1,133 @@ +local volume = req_rel(..., "util") +local widget = {} + + +widget.icon = wibox.widget { + resize = true, + image = beautiful.icons.volume.mute, + widget = wibox.widget.imagebox +} + +widget.arc = wibox.widget { + { + widget.icon, + top = beautiful.dpi(1), + bottom = beautiful.dpi(1), + layout = wibox.container.margin, + }, + max_value = 1, + thickness = beautiful.dpi(4), + start_angle = 4.71238898, -- 2pi*3/4 + --forced_height = beautiful.dpi(16), + --forced_width = beautiful.dpi(16), + colors = {"#27D4CC", "#00446B"}, + bg = "#FFFFFF30", + paddings = beautiful.dpi(2), + rounded_edge = true, + widget = wibox.container.arcchart +} + +widget.bar = wibox.widget { + max_value = 100, + value = 0, + --forced_height = 20, + forced_width = beautiful.dpi(50), + paddings = 0, + border_width = 0, + color = { + type = "linear", + from = {0, 0}, to = {beautiful.dpi(50), 0}, + stops = { { 0, "#27D4CC" }, { 1, "#00446B" }} + }, + background_color = "#FFFFFF30", + widget = wibox.widget.progressbar, + shape = gears.shape.rounded_bar, +} + + +widget.widget = wibox.widget { + { + { -- Right space + widget = wibox.widget.separator, + color = beautiful.color.transparent, + forced_width = beautiful.dpi(3) + }, + { + widget.arc, + top = beautiful.dpi(2), + bottom = beautiful.dpi(2), + layout = wibox.container.margin, + }, + { -- Left space + widget = wibox.widget.separator, + color = beautiful.color.transparent, + forced_width = beautiful.dpi(3) + }, + layout = wibox.layout.align.horizontal, + }, + layout = wibox.container.background, +} + +widget.widget:connect_signal("mouse::enter", function(result) + widget.widget.bg = beautiful.color.bar.hover_bg + awesome.emit_signal("module::volume:popup_show_stay") +end) + +widget.widget:connect_signal("mouse::leave", function(result) + widget.widget.bg = beautiful.color.transparent + awesome.emit_signal("module::volume:popup_show") +end) + +widget.widget:connect_signal("button::press", + function(_, _, _, button, mods) + + -- Left-click + if (button == 1) then + volume.toggle_mute() + + -- Scroll up + elseif (button == 4) then + volume.volume_up(config.volume.scroll_step) + + -- Scroll down + elseif (button == 5) then + volume.volume_down(config.volume.scroll_step) + end + awesome.emit_signal("module::volume:popup_show_stay") + end +) + +awesome.connect_signal("module::volume:update", + function(status) + if (status.value == false) then + widget.icon.image = beautiful.icons.volume.error + widget.arc.value = 100; + widget.bar.value = 100; + return + end + + widget.arc.value = status.value / 100; + widget.bar.value = status.value; + + + if (status.mute) then + -- Set muted icon + widget.icon.image = beautiful.icons.volume.mute + else + -- Set icon by value + if status.value > 70 then + widget.icon.image = beautiful.icons.volume.high + elseif status.value > 40 then + widget.icon.image = beautiful.icons.volume.medium + elseif status.value > 0 then + widget.icon.image = beautiful.icons.volume.low + elseif status.value == 0 then + widget.icon.image = beautiful.icons.volume.off + end + end + + w.update(); + end +) + +return widget diff --git a/modules/volume/widget.lua b/modules/volume/widget.lua index 0b788d7..2fa56ec 100755 --- a/modules/volume/widget.lua +++ b/modules/volume/widget.lua @@ -1,69 +1,20 @@ local volume = req_rel(..., "util") local widget = {} +local dotgrid = require("widgets.dotgrid") - -widget.icon = wibox.widget { - resize = true, - image = beautiful.icons.volume.mute, - widget = wibox.widget.imagebox -} - -widget.arc = wibox.widget { - { - widget.icon, - top = beautiful.dpi(1), - bottom = beautiful.dpi(1), - layout = wibox.container.margin, - }, - max_value = 1, - thickness = beautiful.dpi(4), - start_angle = 4.71238898, -- 2pi*3/4 - --forced_height = beautiful.dpi(16), - --forced_width = beautiful.dpi(16), - colors = {"#27D4CC", "#00446B"}, - bg = "#FFFFFF30", - paddings = beautiful.dpi(2), - rounded_edge = true, - widget = wibox.container.arcchart -} - -widget.bar = wibox.widget { - max_value = 100, - value = 0, - --forced_height = 20, - forced_width = beautiful.dpi(50), - paddings = 0, - border_width = 0, - color = { - type = "linear", - from = {0, 0}, to = {beautiful.dpi(50), 0}, - stops = { { 0, "#27D4CC" }, { 1, "#00446B" }} - }, - background_color = "#FFFFFF30", - widget = wibox.widget.progressbar, - shape = gears.shape.rounded_bar, -} - +widget.dots = dotgrid:new(); +widget.dots.on_color = {1, 0, 0} +widget.dots.off_color = {0.5, 0, 0} +widget.dots.spacing = beautiful.dpi(2) widget.widget = wibox.widget { { - { -- Right space - widget = wibox.widget.separator, - color = beautiful.color.transparent, - forced_width = beautiful.dpi(3) - }, - { - widget.arc, - top = beautiful.dpi(2), - bottom = beautiful.dpi(2), - layout = wibox.container.margin, - }, - { -- Left space - widget = wibox.widget.separator, - color = beautiful.color.transparent, - forced_width = beautiful.dpi(3) - }, - layout = wibox.layout.align.horizontal, + widget.dots, + top = beautiful.dpi(2), + bottom = beautiful.dpi(2), + left = beautiful.dpi(2), + right = beautiful.dpi(2), + layout = wibox.container.margin, }, layout = wibox.container.background, } @@ -100,31 +51,21 @@ widget.widget:connect_signal("button::press", awesome.connect_signal("module::volume:update", function(status) if (status.value == false) then - widget.icon.image = beautiful.icons.volume.error - widget.arc.value = 100; - widget.bar.value = 100; + widget.dots.value = 100 return end - widget.arc.value = status.value / 100; - widget.bar.value = status.value; - + widget.dots.value = status.value if (status.mute) then - -- Set muted icon - widget.icon.image = beautiful.icons.volume.mute + widget.dots.on_color = {0.7, 0.7, 0.7} + widget.dots.off_color = {0.3, 0.3, 0.3} else - -- Set icon by value - if status.value > 70 then - widget.icon.image = beautiful.icons.volume.high - elseif status.value > 40 then - widget.icon.image = beautiful.icons.volume.medium - elseif status.value > 0 then - widget.icon.image = beautiful.icons.volume.low - elseif status.value == 0 then - widget.icon.image = beautiful.icons.volume.off - end + widget.dots.on_color = {0, 1, 0} + widget.dots.off_color = {0, 0.5, 0} end + + widget.dots:emit_signal("widget::redraw_needed") end ) diff --git a/widgets/dotgrid.lua b/widgets/dotgrid.lua new file mode 100644 index 0000000..963ab65 --- /dev/null +++ b/widgets/dotgrid.lua @@ -0,0 +1,137 @@ +local dotgrid = {} + +function dotgrid:shuffle(tbl) + for i = #tbl, 2, -1 do + local j = math.random(i) + tbl[i], tbl[j] = tbl[j], tbl[i] + end + return tbl +end + +function dotgrid:new() + local dots = wibox.widget.base.make_widget(); + + dots.on_color = {1, 0, 0} + dots.off_color = {0.5, 0, 0} + dots.value = 0 + dots.max = 100 + dots.rows = 5 + dots.cols = 5 + dots.spacing = 2 + + dots.map = {} + local idx + for i=1, dots.rows*dots.cols do + dots.map[i] = false; + end + --dots.map = dotgrid:shuffle(dots.map) + + + function dots:fit(context, width, height) + local m = math.min(width, height) + return m, m + end + + function dots:draw(context, cr, width, height) + local col_size = (height - self.spacing * (self.rows-1)) // self.rows + local row_size = (width - self.spacing * (self.cols-1)) // self.cols + + -- Compute rounding offsets for better centering + local xoffset = ( + width - ( + (col_size * self.cols) + + (self.spacing * (self.cols - 1)) + ) + ) // 2 + + local yoffset = ( + height - ( + (row_size * self.rows) + + (self.spacing * (self.rows - 1)) + ) + ) // 2 + + -- How many dots should be on + local on = math.floor((self.value / self.max) * (self.rows * self.cols)) + + -- How many dote are currently on + local current_value = 0 + for i=1, dots.rows*dots.cols do + if dots.map[i] then + current_value = current_value + 1 + end + end + + local change, remove + if current_value ~= on then + change = on - current_value + remove = change < 0 + change = math.abs(change) + + local flip + for i=1, change do + if remove then + -- Flip the nth on dot + flip = math.random(1, current_value) + for i=1, dots.rows*dots.cols do + if dots.map[i] then + if flip == 1 then + dots.map[i] = false + break + else + flip = flip - 1 + end + end + end + current_value = current_value - 1 + else + -- Flip the nth off dot + flip = math.random(1, dots.rows*dots.cols - current_value) + for i=1, dots.rows*dots.cols do + if not dots.map[i] then + if flip == 1 then + dots.map[i] = true + break + else + flip = flip - 1 + end + end + end + current_value = current_value + 1 + end + end + + end + + for r=1, self.rows do + for c=1, self.cols do + idx = c + ((r-1)*self.cols) + + --idx_mapped = self.map[idx] - 1 + --r_mapped = (idx_mapped % self.rows) + 1 + --c_mapped = (idx_mapped // self.cols) + 1 + + cr:new_path(); + if self.map[idx] then + cr:set_source_rgb(self.on_color[1], self.on_color[2], self.on_color[3]) + else + cr:set_source_rgb(self.off_color[1], self.off_color[2], self.off_color[3]) + end + + cr:rectangle( + (c-1) * (col_size + self.spacing) + xoffset, + (r-1) * (row_size + self.spacing) + yoffset, + col_size, + row_size + ) + cr:fill() + end + end + + + end + + return dots +end + +return dotgrid \ No newline at end of file