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

121 lines
2.7 KiB
Lua

local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local rubato = require("lib.rubato")
local dpi = beautiful.xresources.apply_dpi
local theme = beautiful.get()
-- Var
local width = dpi(410)
local height = awful.screen.focused().geometry.height - dpi(100)
-- Helper
-----------
local function round_widget(radius)
return function(cr, w, h)
gears.shape.rounded_rect(cr, w, h, radius)
end
end
local function box_widget(widgets, _width, _height)
return wibox.widget({
{
{
widgets,
margins = dpi(16),
widget = wibox.container.margin,
},
forced_width = dpi(_width),
forced_height = dpi(_height),
shape = round_widget(8),
bg = theme.bg_focus, --for widget Rounded and Border
widget = wibox.container.background,
},
margins = { left = dpi(20), right = dpi(20) },
widget = wibox.container.margin,
})
end
-- Get widgets
local weather_widget = require("ui.info-panel.weather")
local profile_widget = require("ui.info-panel.profile")
local calendar_widget = require("ui.info-panel.calendar")
local music_widget = require("ui.info-panel.music-player")
-- Combine some widgets
local weather = box_widget(weather_widget, 380, 180)
local profile = box_widget(profile_widget, 380, 210)
local calendar = box_widget(calendar_widget, 380, 340)
-- Sidebar
local sidebar = wibox({
visible = false,
ontop = true,
width = width,
height = height,
y = dpi(60),
bg = theme.bg_normal,
border_width = theme.border_width * 2,
border_color = theme.border_normal,
})
-- Sidebar widget setup
sidebar:setup({
{
profile,
music_widget,
weather,
calendar,
spacing = dpi(20),
layout = wibox.layout.fixed.vertical,
},
margins = { top = dpi(20), bottom = dpi(20) },
widget = wibox.container.margin,
})
-- Slide animation
local slide = rubato.timed({
pos = awful.screen.focused().geometry.x - sidebar.width,
rate = 60,
intro = 0.2,
duration = 0.4,
subscribed = function(pos)
sidebar.x = awful.screen.focused().geometry.x + pos
end,
})
-- Timer of sidebar's death
sidebar.timer = gears.timer({
timeout = 0.5,
single_shot = true,
callback = function()
sidebar.visible = not sidebar.visible
end,
})
sidebar.shape = function(cr, w, h) --Rounded Corners
gears.shape.rounded_rect(cr, w, h, 14)
end
-- Toggle function
sidebar.toggle = function()
if sidebar.visible then
slide.target = awful.screen.focused().geometry.x - sidebar.width
sidebar.timer:start()
else
awesome.emit_signal("widget::update_uptime")
slide.target = awful.screen.focused().geometry.x + dpi(20)
sidebar.visible = not sidebar.visible
end
end
-- Get signal to execute the function (if that makes sense)
awesome.connect_signal("sidebar::toggle", function()
sidebar.toggle()
end)
return sidebar