bling/widget/tabbar/modern.lua

221 lines
7.1 KiB
Lua
Raw Normal View History

local awful = require("awful")
2020-11-24 01:13:58 +01:00
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
2021-01-23 23:04:22 +01:00
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
2020-11-24 01:13:58 +01:00
local bg_normal = beautiful.tabbar_bg_normal or beautiful.bg_normal or "#ffffff"
local fg_normal = beautiful.tabbar_fg_normal or beautiful.fg_normal or "#000000"
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
local size = beautiful.tabbar_size or dpi(40)
2020-11-24 01:13:58 +01:00
local border_radius =
beautiful.mstab_border_radius or beautiful.border_radius or 6
2021-01-28 20:23:01 +01:00
local position = beautiful.tabbar_position or "top"
2020-11-24 01:13:58 +01:00
local close_color = beautiful.tabbar_color_close or beautiful.xcolor1 or
"#f9929b"
local min_color = beautiful.tabbar_color_min or beautiful.xcolor3 or "#fbdf90"
local float_color = beautiful.tabbar_color_float or beautiful.xcolor5 or
"#ccaced"
-- Helper to create buttons
local function create_title_button(c, color_focus, color_unfocus)
local tb_color = wibox.widget {
2020-11-29 11:57:51 +01:00
wibox.widget.textbox(),
2020-11-24 01:13:58 +01:00
forced_width = dpi(8),
forced_height = dpi(8),
bg = color_focus,
shape = gears.shape.circle,
widget = wibox.container.background
}
local tb = wibox.widget {
tb_color,
width = dpi(25),
2020-11-24 06:24:49 +01:00
height = dpi(25),
2020-11-24 01:13:58 +01:00
strategy = "min",
layout = wibox.layout.constraint
}
local function update()
if client.focus == c then
tb_color.bg = color_focus
else
tb_color.bg = color_unfocus
end
end
update()
c:connect_signal("focus", update)
c:connect_signal("unfocus", update)
tb:connect_signal("mouse::enter",
function() tb_color.bg = color_focus .. "70" end)
tb:connect_signal("mouse::leave", function() tb_color.bg = color_focus end)
2020-11-24 01:13:58 +01:00
tb.visible = true
return tb
end
local function create(c, focused_bool, buttons)
-- local flexlist = wibox.layout.flex.horizontal()
local title_temp = c.name or c.class or "-"
local bg_temp = bg_normal
local fg_temp = fg_normal
if focused_bool then
bg_temp = bg_focus
fg_temp = fg_focus
end
local text_temp = wibox.widget.textbox()
text_temp.align = "center"
text_temp.valign = "center"
text_temp.font = font
text_temp.markup = "<span foreground='" .. fg_temp .. "'>" .. title_temp ..
"</span>"
c:connect_signal("property::name", function(_)
local title_temp = c.name or c.class or "-"
text_temp.markup =
"<span foreground='" .. fg_temp .. "'>" .. title_temp .. "</span>"
end)
local tab_content = wibox.widget {
{
awful.widget.clienticon(c),
2021-03-10 10:26:30 +01:00
top = dpi(6),
left = dpi(15),
2021-03-10 10:26:30 +01:00
bottom = dpi(6),
widget = wibox.container.margin
},
text_temp,
nill,
expand = "none",
layout = wibox.layout.align.horizontal
}
2020-11-24 01:13:58 +01:00
local close = create_title_button(c, close_color, bg_normal)
close:connect_signal("button::press", function() c:kill() end)
local floating = create_title_button(c, float_color, bg_normal)
floating:connect_signal("button::press",
function() c.floating = not c.floating end)
local min = create_title_button(c, min_color, bg_normal)
min:connect_signal("button::press", function() c.minimized = true end)
2020-11-24 01:13:58 +01:00
if focused_bool then
tab_content = wibox.widget {
{
awful.widget.clienticon(c),
top = dpi(10),
2020-11-24 06:24:49 +01:00
left = dpi(15),
bottom = dpi(10),
2020-11-24 01:13:58 +01:00
widget = wibox.container.margin
},
text_temp,
{
{min, floating, close, layout = wibox.layout.fixed.horizontal},
top = dpi(10),
right = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin
},
2020-11-24 01:13:58 +01:00
expand = "none",
layout = wibox.layout.align.horizontal
}
end
local main_content = nil
local left_shape = nil
local right_shape = nil
if position == "top" then
main_content = wibox.widget {
{
tab_content,
bg = bg_temp,
2021-03-10 10:26:30 +01:00
shape = helpers.shape.prrect(border_radius, true, true, false,
false),
widget = wibox.container.background
},
top = dpi(8),
widget = wibox.container.margin
}
2021-03-10 10:26:30 +01:00
left_shape = helpers.shape.prrect(border_radius, false, false, true,
false)
right_shape = helpers.shape.prrect(border_radius, false, false, false,
true)
else
main_content = wibox.widget {
{
tab_content,
bg = bg_temp,
2021-03-10 10:26:30 +01:00
shape = helpers.shape.prrect(border_radius, false, false, true,
true),
widget = wibox.container.background
},
bottom = dpi(8),
widget = wibox.container.margin
}
2021-03-10 10:26:30 +01:00
left_shape = helpers.shape.prrect(border_radius, false, true, false,
false)
right_shape = helpers.shape.prrect(border_radius, true, false, false,
false)
end
2020-11-24 01:13:58 +01:00
local wid_temp = wibox.widget({
buttons = buttons,
{
2020-11-26 01:42:05 +01:00
{
{
2020-11-29 11:57:51 +01:00
wibox.widget.textbox(),
2020-11-26 01:42:05 +01:00
bg = bg_normal,
shape = left_shape,
2020-11-26 01:42:05 +01:00
widget = wibox.container.background
},
bg = bg_temp,
shape = gears.rectangle,
widget = wibox.container.background
},
2020-11-26 05:14:53 +01:00
width = border_radius + (border_radius / 2),
height = size,
2020-11-26 01:42:05 +01:00
strategy = "exact",
layout = wibox.layout.constraint
},
main_content,
2020-11-26 01:42:05 +01:00
{
{
{
2020-11-29 11:57:51 +01:00
wibox.widget.textbox(),
2020-11-26 01:42:05 +01:00
bg = bg_normal,
shape = right_shape,
2020-11-26 01:42:05 +01:00
widget = wibox.container.background
},
bg = bg_temp,
shape = gears.rectangle,
widget = wibox.container.background
},
2020-11-26 05:14:53 +01:00
width = border_radius + (border_radius / 2),
height = size,
2020-11-26 01:42:05 +01:00
strategy = "exact",
layout = wibox.layout.constraint
},
layout = wibox.layout.align.horizontal
2020-11-24 01:13:58 +01:00
})
return wid_temp
end
return {
layout = wibox.layout.flex.horizontal,
create = create,
position = position,
2020-11-24 01:13:58 +01:00
size = size,
bg_normal = bg_normal,
bg_focus = bg_focus
}