Add support for passing in a template for the app widget

This commit is contained in:
Ksaper 2023-02-05 02:17:46 +02:00
parent c6a245365b
commit 6f1198e75d
1 changed files with 135 additions and 114 deletions

View File

@ -94,146 +94,155 @@ local function select_app(self, x, y)
if widgets then if widgets then
self._private.active_widget = widgets[1] self._private.active_widget = widgets[1]
if self._private.active_widget ~= nil then if self._private.active_widget ~= nil then
if self.app_template == nil then
self._private.active_widget:get_children_by_id("background_role")[1].bg = self.app_selected_color
local name_widget = self._private.active_widget:get_children_by_id("name_role")[1]
if name_widget then
name_widget.markup = string.format("<span foreground='%s'>%s</span>", self.app_name_selected_color, name_widget.text)
end
local generic_name_widget = self._private.active_widget:get_children_by_id("generic_name_role")[1]
if generic_name_widget then
generic_name_widget.markup = string.format("<i><span weight='300'foreground='%s'>%s</span></i>", self.app_name_selected_color, generic_name_widget.text)
end
end
self._private.active_widget:emit_signal("selected")
self._private.active_widget.selected = true self._private.active_widget.selected = true
self._private.active_widget:get_children_by_id("background_role")[1].bg = self.app_selected_color
local name_widget = self._private.active_widget:get_children_by_id("name_role")[1]
if name_widget then
name_widget.markup = string.format("<span foreground='%s'>%s</span>", self.app_name_selected_color, name_widget.text)
end
local generic_name_widget = self._private.active_widget:get_children_by_id("generic_name_role")[1]
if generic_name_widget then
generic_name_widget.markup = string.format("<i><span weight='300'foreground='%s'>%s</span></i>", self.app_name_selected_color, generic_name_widget.text)
end
end end
end end
end end
local function unselect_app(self) local function unselect_app(self)
if self._private.active_widget ~= nil then if self._private.active_widget ~= nil then
self._private.active_widget.selected = false if self.app_template == nil then
self._private.active_widget:get_children_by_id("background_role")[1].bg = self.app_normal_color self._private.active_widget:get_children_by_id("background_role")[1].bg = self.app_normal_color
local name_widget = self._private.active_widget:get_children_by_id("name_role")[1] local name_widget = self._private.active_widget:get_children_by_id("name_role")[1]
if name_widget then if name_widget then
name_widget.markup = string.format("<span foreground='%s'>%s</span>", self.app_name_normal_color, name_widget.text) name_widget.markup = string.format("<span foreground='%s'>%s</span>", self.app_name_normal_color, name_widget.text)
end end
local generic_name_widget = self._private.active_widget:get_children_by_id("generic_name_role")[1] local generic_name_widget = self._private.active_widget:get_children_by_id("generic_name_role")[1]
if generic_name_widget then if generic_name_widget then
generic_name_widget.markup = string.format("<i><span weight='300'foreground='%s'>%s</span></i>", self.app_name_normal_color, generic_name_widget.text) generic_name_widget.markup = string.format("<i><span weight='300'foreground='%s'>%s</span></i>", self.app_name_normal_color, generic_name_widget.text)
end
end end
self._private.active_widget:emit_signal("unselected")
self._private.active_widget.selected = false
self._private.active_widget = nil self._private.active_widget = nil
end end
end end
local function create_app_widget(self, entry) local function create_app_widget(self, app)
local icon = self.app_show_icon == true and local app_widget = nil
{
widget = wibox.widget.imagebox,
id = "icon_role",
halign = self.app_icon_halign,
forced_width = self.app_icon_width,
forced_height = self.app_icon_height,
image = entry.icon
} or nil
local name = self.app_show_name == true and if self.app_template == nil then
{ local icon = self.app_show_icon == true and
widget = wibox.widget.textbox,
id = "name_role",
font = self.app_name_font,
markup = string.format("<span foreground='%s'>%s</span>", self.app_name_normal_color, entry.name)
} or nil
local generic_name = entry.generic_name ~= nil and self.app_show_generic_name == true and
{
widget = wibox.widget.textbox,
id = "generic_name_role",
font = self.app_name_font,
markup = entry.generic_name ~= "" and "<span weight='300'> <i>(" .. entry.generic_name .. ")</i></span>" or ""
} or nil
local app = wibox.widget
{
widget = wibox.container.background,
id = "background_role",
forced_width = self.app_width,
forced_height = self.app_height,
shape = self.app_shape,
bg = self.app_normal_color,
{ {
widget = wibox.container.margin, widget = wibox.widget.imagebox,
margins = self.app_content_padding, id = "icon_role",
halign = self.app_icon_halign,
forced_width = self.app_icon_width,
forced_height = self.app_icon_height,
image = app.icon
} or nil
local name = self.app_show_name == true and
{
widget = wibox.widget.textbox,
id = "name_role",
font = self.app_name_font,
markup = string.format("<span foreground='%s'>%s</span>", self.app_name_normal_color, app.name)
} or nil
local generic_name = app.generic_name ~= nil and self.app_show_generic_name == true and
{
widget = wibox.widget.textbox,
id = "generic_name_role",
font = self.app_name_font,
markup = app.generic_name ~= "" and "<span weight='300'> <i>(" .. app.generic_name .. ")</i></span>" or ""
} or nil
app_widget = wibox.widget
{
widget = wibox.container.background,
id = "background_role",
forced_width = self.app_width,
forced_height = self.app_height,
shape = self.app_shape,
bg = self.app_normal_color,
{ {
-- Using this hack instead of container.place because that will fuck with the name/icon halign widget = wibox.container.margin,
layout = wibox.layout.align.vertical, margins = self.app_content_padding,
expand = "outside",
nil,
{ {
layout = wibox.layout.fixed.vertical, -- Using this hack instead of container.place because that will fuck with the name/icon halign
spacing = self.app_content_spacing, layout = wibox.layout.align.vertical,
icon, expand = "outside",
nil,
{ {
widget = wibox.container.place, layout = wibox.layout.fixed.vertical,
halign = self.app_name_halign, spacing = self.app_content_spacing,
icon,
{ {
layout = wibox.layout.fixed.horizontal, widget = wibox.container.place,
spacing = self.app_name_generic_name_spacing, halign = self.app_name_halign,
name, {
generic_name layout = wibox.layout.fixed.horizontal,
spacing = self.app_name_generic_name_spacing,
name,
generic_name
}
} }
} },
}, nil
nil }
} }
} }
}
function app:spawn() app_widget:connect_signal("mouse::enter", function()
if entry.terminal == true then local widget = capi.mouse.current_wibox
awful.spawn.with_shell(AWESOME_SENSIBLE_TERMINAL_PATH .. " -e " .. entry.executable) if widget then
else widget.cursor = "hand2"
awful.spawn(entry.executable) end
if app_widget.selected then
app_widget:get_children_by_id("background_role")[1].bg = self.app_selected_hover_color
else
app_widget:get_children_by_id("background_role")[1].bg = self.app_normal_hover_color
end
end)
app_widget:connect_signal("mouse::leave", function()
local widget = capi.mouse.current_wibox
if widget then
widget.cursor = "left_ptr"
end
if app_widget.selected then
app_widget:get_children_by_id("background_role")[1].bg = self.app_selected_color
else
app_widget:get_children_by_id("background_role")[1].bg = self.app_normal_color
end
end)
else
app_widget = self.app_template(app)
local icon = app_widget:get_children_by_id("icon_role")[1]
if icon then
icon.image = app.icon
end end
local name = app_widget:get_children_by_id("name_role")[1]
if self.hide_on_launch then if name then
self:hide() name.text = app.name
end
local generic_name = app_widget:get_children_by_id("generic_name_role")[1]
if generic_name then
generic_name.text = app.generic_name
end
local command = app_widget:get_children_by_id("command_role")[1]
if command then
command.text = app.executable
end end
end end
app:connect_signal("mouse::enter", function(_self) app_widget:connect_signal("button::press", function(app, _, __, button)
local widget = capi.mouse.current_wibox
if widget then
widget.cursor = "hand2"
end
local app = _self
if app.selected then
app:get_children_by_id("background_role")[1].bg = self.app_selected_hover_color
else
local is_opaque = color.is_opaque(self.app_normal_color)
local is_dark = color.is_dark(self.app_normal_color)
local app_normal_color = color.hex_to_rgba(self.app_normal_color)
local hover_color = (is_dark or is_opaque) and
color.rgba_to_hex(color.multiply(app_normal_color, 2.5)) or
color.rgba_to_hex(color.multiply(app_normal_color, 0.5))
app:get_children_by_id("background_role")[1].bg = self.app_normal_hover_color
end
end)
app:connect_signal("mouse::leave", function(_self)
local widget = capi.mouse.current_wibox
if widget then
widget.cursor = "left_ptr"
end
local app = _self
if app.selected then
app:get_children_by_id("background_role")[1].bg = self.app_selected_color
else
app:get_children_by_id("background_role")[1].bg = self.app_normal_color
end
end)
app:connect_signal("button::press", function(app, _, __, button)
if button == 1 then if button == 1 then
if self._private.active_widget == app or not self.select_before_spawn then if self._private.active_widget == app or not self.select_before_spawn then
app:spawn() app:spawn()
@ -248,7 +257,19 @@ local function create_app_widget(self, entry)
end end
end) end)
return app function app_widget:spawn()
if app.terminal == true then
awful.spawn.with_shell(AWESOME_SENSIBLE_TERMINAL_PATH .. " -e " .. app.executable)
else
awful.spawn(app.executable)
end
if self.hide_on_launch then
self:hide()
end
end
return app_widget
end end
local function search(self, text) local function search(self, text)