Skip to content

Commit

Permalink
add tabbar widget
Browse files Browse the repository at this point in the history
  • Loading branch information
TanvirOnGH committed Sep 3, 2024
1 parent 2b39521 commit 8223891
Show file tree
Hide file tree
Showing 4 changed files with 476 additions and 0 deletions.
58 changes: 58 additions & 0 deletions widget/tabbar/boxes.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
-- Based on: <https://github.com/BlingCorp/bling/blob/master/widget/tabbar/boxes.lua>
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")

local beautiful = require("beautiful")

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 bg_focus_inactive = beautiful.tabbar_bg_focus_inactive or bg_focus
local fg_focus_inactive = beautiful.tabbar_fg_focus_inactive or fg_focus
local bg_normal_inactive = beautiful.tabbar_bg_normal_inactive or bg_normal
local fg_normal_inactive = beautiful.tabbar_fg_normal_inactive or fg_normal
local font = beautiful.tabbar_font or beautiful.font or "Fira Code 13"
local size = beautiful.tabbar_size or 40
local position = beautiful.tabbar_position or "bottom"

local function create(c, focused_bool, buttons, inactive_bool)
local bg_temp = inactive_bool and bg_normal_inactive or bg_normal
local fg_temp = inactive_bool and fg_normal_inactive or fg_normal
if focused_bool then
bg_temp = inactive_bool and bg_focus_inactive or bg_focus
fg_temp = inactive_bool and fg_focus_inactive or fg_focus
end
local wid_temp = wibox.widget({
{
{
awful.widget.clienticon(c),
left = 10,
right = 10,
bottom = 10,
top = 10,
widget = wibox.container.margin(),
},
widget = wibox.container.place(),
},
buttons = buttons,
bg = bg_temp,
widget = wibox.container.background(),
})
return wid_temp
end

local layout = wibox.layout.fixed.horizontal
if position == "left" or position == "right" then
layout = wibox.layout.fixed.vertical
end

return {
layout = layout,
create = create,
position = position,
size = size,
bg_normal = bg_normal,
bg_focus = bg_normal,
}
62 changes: 62 additions & 0 deletions widget/tabbar/default.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
-- Based on: <https://github.com/BlingCorp/bling/blob/master/widget/tabbar/default.lua>
local gears = require("gears")
local wibox = require("wibox")

local beautiful = require("beautiful")

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 bg_focus_inactive = beautiful.tabbar_bg_focus_inactive or bg_focus
local fg_focus_inactive = beautiful.tabbar_fg_focus_inactive or fg_focus
local bg_normal_inactive = beautiful.tabbar_bg_normal_inactive or bg_normal
local fg_normal_inactive = beautiful.tabbar_fg_normal_inactive or fg_normal
local font = beautiful.tabbar_font or beautiful.font or "Fira Code 13"
local size = beautiful.tabbar_size or 20
local position = beautiful.tabbar_position or "top"

local function create(c, focused_bool, buttons, inactive_bool)
local flexlist = wibox.layout.flex.horizontal()
local title_temp = c.name or c.class or "-"
title_temp = gears.string.xml_escape(title_temp)
local bg_temp = inactive_bool and bg_normal_inactive or bg_normal
local fg_temp = inactive_bool and fg_normal_inactive or fg_normal
if focused_bool then
bg_temp = inactive_bool and bg_focus_inactive or bg_focus
fg_temp = inactive_bool and fg_focus_inactive or 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 wid_temp = wibox.widget({
text_temp,
buttons = buttons,
bg = bg_temp,
widget = wibox.container.background(),
})
return wid_temp
end

return {
layout = wibox.layout.flex.horizontal,
create = create,
position = position,
size = size,
bg_normal = bg_normal,
bg_focus = bg_focus,
}
274 changes: 274 additions & 0 deletions widget/tabbar/modern.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
-- Based on: <https://github.com/BlingCorp/bling/blob/master/widget/tabbar/modern.lua>
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
local helpers = require(tostring(...):match(".*bling") .. ".helpers")

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 bg_focus_inactive = beautiful.tabbar_bg_focus_inactive or bg_focus
local fg_focus_inactive = beautiful.tabbar_fg_focus_inactive or fg_focus
local bg_normal_inactive = beautiful.tabbar_bg_normal_inactive or bg_normal
local fg_normal_inactive = beautiful.tabbar_fg_normal_inactive or fg_normal
local font = beautiful.tabbar_font or beautiful.font or "Fira Code 13"
local size = beautiful.tabbar_size or dpi(40)
local border_radius = beautiful.mstab_border_radius
or beautiful.border_radius
or 6
local position = beautiful.tabbar_position or "top"
local close_color = beautiful.tabbar_color_close
or beautiful.xcolor1
or "#C38F8F"
local min_color = beautiful.tabbar_color_min or beautiful.xcolor3 or "#a0a0a0"
local float_color = beautiful.tabbar_color_float
or beautiful.xcolor5
or "#8DB8CD"

-- Helper to create buttons
local function create_title_button(c, color_focus, color_unfocus)
local tb_color = wibox.widget({
wibox.widget.textbox(),
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),
height = dpi(25),
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)

tb.visible = true
return tb
end

local function create(c, focused_bool, buttons, inactive_bool)
-- local flexlist = wibox.layout.flex.horizontal()
local title_temp = c.name or c.class or "-"
title_temp = gears.string.xml_escape(title_temp)
local bg_temp = inactive_bool and bg_normal_inactive or bg_normal
local fg_temp = inactive_bool and fg_normal_inactive or fg_normal
if focused_bool then
bg_temp = inactive_bool and bg_focus_inactive or bg_focus
fg_temp = inactive_bool and fg_focus_inactive or 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),
top = dpi(6),
left = dpi(15),
bottom = dpi(6),
widget = wibox.container.margin,
},
text_temp,
nill,
expand = "inside",
layout = wibox.layout.align.horizontal,
})

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)

if focused_bool then
tab_content = wibox.widget({
{
awful.widget.clienticon(c),
top = dpi(6),
left = dpi(15),
right = dpi(10),
bottom = dpi(6),
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,
},
expand = "inside",
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,
shape = helpers.shape.prrect(
border_radius,
true,
true,
false,
false
),
widget = wibox.container.background,
},
top = dpi(8),
widget = wibox.container.margin,
})

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,
shape = helpers.shape.prrect(
border_radius,
false,
false,
true,
true
),
widget = wibox.container.background,
},
bottom = dpi(8),
widget = wibox.container.margin,
})

left_shape = helpers.shape.prrect(
border_radius,
false,
true,
false,
false
)
right_shape = helpers.shape.prrect(
border_radius,
true,
false,
false,
false
)
end

local wid_temp = wibox.widget({
buttons = buttons,
{
{
{
wibox.widget.textbox(),
bg = bg_normal,
shape = left_shape,
widget = wibox.container.background,
},
bg = bg_temp,
shape = gears.rectangle,
widget = wibox.container.background,
},
width = border_radius + (border_radius / 2),
height = size,
strategy = "exact",
layout = wibox.layout.constraint,
},
main_content,
{
{
{
wibox.widget.textbox(),
bg = bg_normal,
shape = right_shape,
widget = wibox.container.background,
},
bg = bg_temp,
shape = gears.rectangle,
widget = wibox.container.background,
},
width = border_radius + (border_radius / 2),
height = size,
strategy = "exact",
layout = wibox.layout.constraint,
},

layout = wibox.layout.align.horizontal,
})
return wid_temp
end

return {
layout = wibox.layout.flex.horizontal,
create = create,
position = position,
size = size,
bg_normal = bg_normal,
bg_focus = bg_focus,
}
Loading

0 comments on commit 8223891

Please sign in to comment.