From 7261f0ba40b2d86da92cd54fdf3698d6408c11dc Mon Sep 17 00:00:00 2001 From: undefinedDarkness Date: Mon, 27 Sep 2021 11:44:33 +0530 Subject: [PATCH] Use grid layout in custom_tasklist Export draw_widget from tag_preview --- widget/tabbed_misc/custom_tasklist.lua | 78 +++++++++++------------ widget/tabbed_misc/titlebar_indicator.lua | 76 ++++++++++++++++++++++ widget/tag_preview.lua | 32 ++++------ 3 files changed, 125 insertions(+), 61 deletions(-) diff --git a/widget/tabbed_misc/custom_tasklist.lua b/widget/tabbed_misc/custom_tasklist.lua index 2e105c6..ac22377 100644 --- a/widget/tabbed_misc/custom_tasklist.lua +++ b/widget/tabbed_misc/custom_tasklist.lua @@ -5,51 +5,47 @@ local beautiful = require("beautiful") local dpi = require("beautiful.xresources").apply_dpi local function tabobj_support(self, c, index, clients) - -- Self is the background widget in this context - if not c.bling_tabbed then - return - end + -- Self is the background widget in this context + if not c.bling_tabbed and #c.bling_tabbed.clients > 1 then + return + end - local group = c.bling_tabbed + local group = c.bling_tabbed + + -- TODO: Allow customization here + local layout_v = wibox.widget { + vertical_spacing = dpi(2), + horizontal_spacing = dpi(2), + layout = wibox.layout.grid.horizontal, + forced_num_rows = 2, + forced_num_cols = 2, + homogeneous = true + } - -- Single item tabbed group's dont get special rendering - if #group.clients > 1 then - local wrapper = wibox.widget({ - { - -- This is so dumb... but it works so meh - { - id = "row1", - layout = wibox.layout.flex.horizontal, - }, - { - id = "row2", - layout = wibox.layout.flex.horizontal, - }, - spacing = dpi(2), - layout = wibox.layout.fixed.vertical, - }, - id = "click_role", - widget = wibox.container.margin, - margins = dpi(5), - }) + local wrapper = wibox.widget({ + layout_v, + id = "click_role", + widget = wibox.container.margin, + margins = dpi(5), + }) - for idx, c in ipairs(group.clients) do - if c and c.icon then - -- TODO: Don't do this in a -1iq way - if idx <= 2 then - wrapper - :get_children_by_id("row1")[1] - :add(awful.widget.clienticon(c)) - else - wrapper - :get_children_by_id("row2")[1] - :add(awful.widget.clienticon(c)) - end - end - end + -- To get the ball rolling. + for idx, c in ipairs(group.clients) do + if not (c and c.icon) then goto skip end - self.widget = wrapper - end + -- Add to the last layout + layout_v:add(wibox.widget { + { + widget = awful.widget.clienticon, + client = c + }, + widget = wibox.container.constraint, + width = dpi(24), + height = dpi(24) + }) + ::skip:: + end + self.widget = wrapper end return tabobj_support diff --git a/widget/tabbed_misc/titlebar_indicator.lua b/widget/tabbed_misc/titlebar_indicator.lua index 2549d83..de40216 100644 --- a/widget/tabbed_misc/titlebar_indicator.lua +++ b/widget/tabbed_misc/titlebar_indicator.lua @@ -54,6 +54,7 @@ return function(c, opts) end end) +<<<<<<< HEAD local function recreate(group) if tbl_contains(group.clients, c) then tabbed_icons:reset() @@ -117,4 +118,79 @@ return function(c, opts) awesome.connect_signal("bling::tabbed::changed_focus", recreate) return tabbed_icons +======= + local function recreate(group) + if tbl_contains(group.clients, c) then + tabbed_icons:reset() + local focused = group.clients[group.focused_idx] + + -- Autohide? + if #group.clients == 1 then + return + end + + for idx, client in ipairs(group.clients) do + local widget = wibox.widget( + opts.widget_template or { + { + { + { + id = "icon_role", + forced_width = opts.icon_size, + forced_height = opts.icon_size, + widget = awful.widget.clienticon, + }, + margins = opts.icon_margin, + widget = wibox.container.margin, + }, + shape = opts.icon_shape, + id = "bg_role", + widget = wibox.container.background, + }, + halign = "center", + valign = "center", + widget = wibox.container.place, + }) + + widget._client = client + + -- No creation call back since this would be called on creation & every time the widget updated. + if opts.widget_template and opts.widget_template.update_callback then + opts.widget_template.update_callback(widget, client, group) + end + + -- Add icons & etc + for _, w in ipairs(widget:get_children_by_id("icon_role")) do + -- TODO: Allow fallback icon? + w.image = client.icon + w.client = client + end + + for _, w in ipairs(widget:get_children_by_id("bg_role")) do + w:add_button(awful.button({}, 1, function() + tabbed_module.switch_to(group, idx) + end)) + if client == focused then + w.bg = opts.bg_color_focus + w.fg = opts.fg_color_focus + else + w.bg = opts.bg_color + w.fg = opts.fg_color + end + end + + for _, w in ipairs(widget:get_children_by_id("text_role")) do + w.text = client.name + end + + tabbed_icons:add(widget) + end + end + end + + awesome.connect_signal("bling::tabbed::client_added", recreate) + awesome.connect_signal("bling::tabbed::changed_focus", recreate) + + return tabbed_icons +>>>>>>> 848ddd9 (Use grid layout in custom_tasklist) end diff --git a/widget/tag_preview.lua b/widget/tag_preview.lua index f2ef42b..d73d42a 100644 --- a/widget/tag_preview.lua +++ b/widget/tag_preview.lua @@ -36,7 +36,8 @@ local function draw_widget( local tag_screen = t.screen for i, c in ipairs(t:clients()) do if not c.hidden and not c.minimized then - local img_box = wibox.widget({ + + local img_box = wibox.widget({ image = gears.surface.load(c.icon), resize = true, forced_height = 100 * scale, @@ -182,24 +183,15 @@ local enable = function(opts) tag_preview_box.maximum_width = scale * geo.width + margin * 2 tag_preview_box.maximum_height = scale * geo.height + margin * 2 - tag_preview_box:setup( - draw_widget( - t, - tag_preview_image, - scale, - screen_radius, - client_radius, - client_opacity, - client_bg, - client_border_color, - client_border_width, - widget_bg, - widget_border_color, - widget_border_width, - geo, - margin - ) - ) + + -- TODO: Use a table here + tag_preview_box:setup(draw_widget(t, tag_preview_image, scale, + screen_radius, client_radius, + client_opacity, client_bg, + client_border_color, + client_border_width, widget_bg, + widget_border_color, + widget_border_width, geo, margin)) end) awesome.connect_signal("bling::tag_preview::visibility", function(s, v) @@ -212,4 +204,4 @@ local enable = function(opts) end) end -return { enable = enable } +return {enable = enable, draw_widget = draw_widget}