local awful = require "awful" local beautiful = require "beautiful" local gtimer = require "gears.timer" local phosphor = require "assets.phosphor" local qmath = require "quarrel.math" local qui = require "quarrel.ui" local qdebug = require "quarrel.debug" local gshape = require "gears.shape" local qanim = require "quarrel.animation" local qvars = require "quarrel.vars" local rubato = require "lib.rubato" local wibox = require "wibox" -- local mpris_widget = require "ui.osd.mpris" local MAX_HEIGHT = qui.BIG_PADDING * 2 + qui.CHAR_HEIGHT local M = { _toggled = false } local geo = awful.screen.focused().geometry M._w_popup = qui.animateable_shape(qui.popup { ontop = true, visible = true, shape = function(cr, w, h) gshape.partially_rounded_rect(cr, w, h, true, true, false, false, qui.BORDER_RADIUS) end, placement = function (d) return (awful.placement.bottom + awful.placement.center_horizontal)(d, { offset = { y = qui.BORDER_WIDTH + 1 -- Needs one more pixel to fully occlude the bottom border for some reason } }) end, -- placement = function(d) -- awful.placement.bottom(d, { -- margins = { -- top = beautiful.useless_gap * 2, -- }, -- }) -- end, -- x = geo.width / 2, -- y = geo.height - 10, minimum_height = qui.CHAR_HEIGHT, widget = { widget = wibox.widget.textbox, text = "blah" } -- widget = mpris_widget -- minimum_width = awful.screen.focused().geometry.width / 2, -- widget = { -- { -- widget = wibox.container.place, -- -- qui.icon { -- icon = phosphor.speaker_simple_none_fill, -- widget = { -- forced_height = qui.CHAR_HEIGHT * 1.2, -- forced_width = qui.CHAR_HEIGHT * 1.2, -- id = "icon", -- }, -- }, -- }, -- { -- widget = wibox.container.place, -- { -- widget = wibox.widget.progressbar, -- max_value = 100, -- value = 20, -- forced_height = qui.CHAR_HEIGHT / 1.5, -- forced_width = qvars.expanded_bar_size -- - (qui.BIG_PADDING + qui.BIG_PADDING * 2 + qui.PADDING * 2) -- - (qui.CHAR_HEIGHT / 1.25 + qui.PADDING) * 3, -- color = qcolor.palette.yellow(), -- background_color = qcolor.palette.border.variant, -- shape = qui.shape, -- id = "progress", -- }, -- }, -- -- { -- widget = wibox.widget.textbox, -- text = "20%", -- font = qui.font(1.2), -- id = "percentage", -- }, -- layout = wibox.layout.fixed.horizontal, -- spacing = qui.BIG_PADDING, -- }, }) M._t_height = qanim:new { duration = qvars.anim_duration, pos = 0, easing = qvars.easing, subscribed = function(pos) M._w_popup.shape_height = pos end, } -- TODO: optimize the search algo to be more efficient and not require making fresnel invisible M._t_opacity = rubato.timed { duration = qvars.anim_duration, pos = 0, subscribed = function(pos) M._w_popup.opacity = pos if pos == 0 then M._w_popup.visible = false else M._w_popup.visible = true end end, } M._t_height:set(qui.BIG_PADDING * 2 + qui.CHAR_HEIGHT) M._t_opacity.target = 1 function M:show() self._toggled = true self._t_opacity.target = 1 self._t_height:set(MAX_HEIGHT) end function M:hide() self._toggled = false self._t_opacity.target = 0 self._t_height:set(0) end function M:toggle() if self._toggled then self:hide() else self:show() end end -- local timer -- -- local anim = rubato.timed { -- duration = qvars.anim_duration, -- intro = qvars.anim_intro, -- pos = 1, -- subscribed = function(pos) -- widget.opacity = pos -- if pos == 0 then -- widget.visible = false -- elseif not widget.visible then -- widget.visible = true -- elseif pos == 1 then -- -- timer:start() -- end -- end, -- } -- -- timer = gtimer { -- timeout = 1, -- callback = function() -- -- anim.target = 0 -- end, -- single_shot = true, -- } -- function M.notify(icon, value, max) -- anim.target = 1 -- widget:get_children_by_id("icon")[1].image = icon -- widget:get_children_by_id("progress")[1].value = value -- widget:get_children_by_id("progress")[1].max_value = max -- widget:get_children_by_id("percentage")[1].text = tostring(qmath.percentage(value, max)) .. "%" -- end return M