dotfiles/.config/awesome/ui/notif-panel/init.lua
2024-02-22 20:33:20 -08:00

324 lines
7.5 KiB
Lua

local gears = require("gears")
local awful = require("awful")
local wibox = require("wibox")
local beautiful = require("beautiful").get()
local helpers = require("helpers")
local naughty = require("naughty")
local rubato = require("lib.rubato")
local dpi = require("beautiful.xresources").apply_dpi
local notifs_text = wibox.widget({
font = beautiful.font .. " Bold 20",
markup = "Notifications",
halign = "center",
widget = wibox.widget.textbox,
})
local notifs_clear = wibox.widget({
markup = "<span foreground='" .. beautiful.xcolor10 .. "'> </span>",
font = beautiful.font_name .. " Bold 21",
align = "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 = "<span foreground='" .. beautiful.xcolorT2 .. "'>Nothing Here!</span>",
font = beautiful.font .. " Bold 17",
align = "center",
valign = "center",
widget = wibox.widget.textbox,
},
layout = wibox.layout.align.vertical,
},
layout = wibox.layout.align.horizontal,
},
forced_height = 730,
widget = wibox.container.background,
bg = beautiful.xcolorS0,
shape = helpers.ui.rrect(8),
})
local notifs_container = wibox.widget({
spacing = 10,
spacing_widget = {
{
shape = helpers.ui.rrect(8),
widget = wibox.container.background,
},
top = 2,
bottom = 2,
left = 6,
right = 6,
widget = wibox.container.margin,
},
forced_width = 320,
forced_height = 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 = 50,
width = 50,
widget = wibox.container.constraint,
},
{
{
nil,
{
{
{
step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
speed = 50,
{
markup = n.title,
font = beautiful.font .. " Bold 9",
align = "left",
widget = wibox.widget.textbox,
},
forced_width = 140,
widget = wibox.container.scroll.horizontal,
},
nil,
{
markup = "<span foreground='" .. beautiful.xcolorT2 .. "'>" .. time .. "</span>",
align = "right",
valign = "bottom",
font = beautiful.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 = 50,
{
markup = n.message,
align = "left",
widget = wibox.widget.textbox,
},
forced_width = 165,
widget = wibox.container.scroll.horizontal,
},
spacing = 3,
layout = wibox.layout.fixed.vertical,
},
expand = "none",
layout = wibox.layout.align.vertical,
},
left = 17,
widget = wibox.container.margin,
},
layout = wibox.layout.align.horizontal,
},
margins = 15,
widget = wibox.container.margin,
},
forced_height = 85,
widget = wibox.container.background,
bg = beautiful.xcolorS0,
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 = beautiful.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 = 5,
right = 5,
top = 7,
bottom = 7,
layout = wibox.container.margin,
},
widget = wibox.container.background,
bg = beautiful.xcolorS0,
shape = helpers.ui.rrect(8),
},
notifs_container,
spacing = 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 = 1,
},
widget = wibox.container.margin,
top = 20,
bottom = 20,
left = 35,
right = 35,
},
forced_height = 120,
widget = wibox.container.background,
bg = beautiful.xcolorS0,
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 = beautiful.bg_normal,
border_width = dpi(3),
border_color = beautiful.xcolorS0,
})
-- Sidebar widget setup
action:setup({
{
notifs,
actions,
spacing = dpi(20),
layout = wibox.layout.fixed.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