dotfiles/dot_config/awesome/ui/notif-panel/init.lua
2024-04-14 18:41:15 -07:00

334 lines
7.6 KiB
Lua

local gears = require("gears")
local awful = require("awful")
local wibox = require("wibox")
local beautiful = require("beautiful")
local helpers = require("helpers")
local naughty = require("naughty")
local rubato = require("lib.rubato")
local theme = beautiful.get()
local dpi = beautiful.xresources.apply_dpi
local notifs_text = wibox.widget({
font = helpers.ui.set_font("Bold 20"),
markup = "Notifications",
halign = "center",
widget = wibox.widget.textbox,
})
local notifs_clear = wibox.widget({
markup = helpers.ui.colorize_text("", theme.color.red),
font = helpers.ui.set_font("Bold 21"),
halign = "center",
valign = "center",
widget = wibox.widget.textbox,
})
notifs_clear:buttons(gears.table.join(awful.button({}, 1, function()
_G.Notif_center_reset_notifs_container()
end)))
helpers.ui.add_hover_cursor(notifs_clear, "hand2")
local notifs_empty = wibox.widget({
{
nil,
{
nil,
{
markup = helpers.ui.colorize_text("Nothing Here!", theme.color.subtext1),
font = helpers.ui.set_font("Bold 17"),
halign = "center",
valign = "center",
widget = wibox.widget.textbox,
},
layout = wibox.layout.align.vertical,
},
layout = wibox.layout.align.horizontal,
},
forced_height = dpi(730),
widget = wibox.container.background,
bg = theme.color.surface0,
shape = helpers.ui.rrect(8),
})
local notifs_container = wibox.widget({
spacing = dpi(10),
spacing_widget = {
{
shape = helpers.ui.rrect(8),
widget = wibox.container.background,
},
top = dpi(2),
bottom = dpi(2),
left = dpi(6),
right = dpi(6),
widget = wibox.container.margin,
},
forced_width = dpi(320),
forced_height = dpi(730), --Use it like in notifs_empty else it will look weird
layout = wibox.layout.fixed.vertical,
})
local remove_notifs_empty = true
Notif_center_reset_notifs_container = function()
notifs_container:reset(notifs_container)
notifs_container:insert(1, notifs_empty)
remove_notifs_empty = true
end
Notif_center_remove_notif = function(box)
notifs_container:remove_widgets(box)
if #notifs_container.children == 0 then
notifs_container:insert(1, notifs_empty)
remove_notifs_empty = true
end
end
local create_notif = function(icon, n)
local time = os.date("%H:%M")
local box = {}
box = wibox.widget({
{
{
{
{
image = icon,
resize = true,
clip_shape = helpers.ui.rrect(8),
halign = "center",
valign = "center",
widget = wibox.widget.imagebox,
},
strategy = "exact",
height = dpi(50),
width = dpi(50),
widget = wibox.container.constraint,
},
{
{
nil,
{
{
{
step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
speed = dpi(50),
{
markup = n.title,
font = helpers.ui.set_font("Bold 9"),
halign = "left",
widget = wibox.widget.textbox,
},
forced_width = dpi(140),
widget = wibox.container.scroll.horizontal,
},
nil,
{
markup = helpers.ui.colorize_text(time, theme.color.subtext1),
halign = "right",
valign = "bottom",
font = helpers.ui.set_font("Bold 10"),
widget = wibox.widget.textbox,
},
expand = "none",
layout = wibox.layout.align.horizontal,
},
{
step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
speed = dpi(50),
{
markup = n.message,
halign = "left",
widget = wibox.widget.textbox,
},
forced_width = dpi(165),
widget = wibox.container.scroll.horizontal,
},
spacing = dpi(3),
layout = wibox.layout.fixed.vertical,
},
expand = "none",
layout = wibox.layout.align.vertical,
},
left = dpi(17),
widget = wibox.container.margin,
},
layout = wibox.layout.align.horizontal,
},
margins = dpi(15),
widget = wibox.container.margin,
},
forced_height = dpi(85),
widget = wibox.container.background,
bg = theme.color.surface0,
shape = helpers.ui.rrect(8),
})
box:buttons(gears.table.join(awful.button({}, 1, function()
_G.Notif_center_remove_notif(box)
end)))
return box
end
notifs_container:buttons(gears.table.join(
awful.button({}, 4, nil, function()
if #notifs_container.children == 1 then
return
end
notifs_container:insert(1, notifs_container.children[#notifs_container.children])
notifs_container:remove(#notifs_container.children)
end),
awful.button({}, 5, nil, function()
if #notifs_container.children == 1 then
return
end
notifs_container:insert(#notifs_container.children + 1, notifs_container.children[1])
notifs_container:remove(1)
end)
))
notifs_container:insert(1, notifs_empty)
naughty.connect_signal("request::display", function(n)
if #notifs_container.children == 1 and remove_notifs_empty then
notifs_container:reset(notifs_container)
remove_notifs_empty = false
end
local appicon = n.icon or n.app_icon
if not appicon then
appicon = theme.pfp --notification_icon
end
notifs_container:insert(1, create_notif(appicon, n))
end)
local notifs = wibox.widget({
{
{
{
nil,
notifs_text,
notifs_clear,
expand = "none",
layout = wibox.layout.align.horizontal,
},
left = dpi(5),
right = dpi(5),
top = dpi(7),
bottom = dpi(7),
layout = wibox.container.margin,
},
widget = wibox.container.background,
bg = theme.color.surface0,
shape = helpers.ui.rrect(8),
},
notifs_container,
spacing = dpi(20),
layout = wibox.layout.fixed.vertical,
})
local actions = wibox.widget({
{
{
{
widget = require("ui.notif-panel.widgets.vol_slider"),
},
{
widget = require("ui.notif-panel.widgets.mic_slider"),
},
layout = wibox.layout.flex.vertical,
spacing = dpi(1),
},
widget = wibox.container.margin,
top = dpi(20),
bottom = dpi(20),
left = dpi(35),
right = dpi(35),
},
forced_height = dpi(120),
widget = wibox.container.background,
bg = theme.color.surface0,
shape = helpers.ui.rrect(8),
})
-- Sidebar
local action = wibox({
visible = false,
ontop = true,
width = dpi(410),
height = awful.screen.focused().geometry.height - dpi(100),
y = dpi(60),
bg = theme.bg_normal,
border_width = theme.border_width * 2,
border_color = theme.border_normal,
})
-- Sidebar widget setup
action:setup({
{
notifs,
nil,
actions,
spacing = dpi(20),
layout = wibox.layout.align.vertical,
},
margins = {
top = dpi(20),
bottom = dpi(20),
left = dpi(20),
right = dpi(20),
},
widget = wibox.container.margin,
})
-- Slide animation
local slide = rubato.timed({
pos = awful.screen.focused().geometry.x - awful.screen.focused().geometry.width,
rate = 60,
intro = 0.2,
duration = 0.4,
subscribed = function(pos)
action.x = awful.screen.focused().geometry.x - pos
end,
})
-- Timer of action's death
action.timer = gears.timer({
timeout = 0.5,
single_shot = true,
callback = function()
action.visible = not action.visible
end,
})
action.shape = function(cr, w, h) --Rounded Corners
gears.shape.rounded_rect(cr, w, h, 14)
end
-- Toggle function
action.toggle = function()
if action.visible then
slide.target = awful.screen.focused().geometry.x - awful.screen.focused().geometry.width
action.timer:start()
else
awesome.emit_signal("widget::update_vol")
awesome.emit_signal("widget::update_mic")
slide.target = awful.screen.focused().geometry.x
- awful.screen.focused().geometry.width
+ action.width
+ dpi(25)
action.visible = not action.visible
end
end
-- Get signal to execute the function (if that makes sense)
awesome.connect_signal("action::toggle", function()
action.toggle()
end)
return action