diff options
| -rw-r--r-- | .config/awesome/ui/fresnel/init.lua | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/.config/awesome/ui/fresnel/init.lua b/.config/awesome/ui/fresnel/init.lua index 613bc9c..42ae328 100644 --- a/.config/awesome/ui/fresnel/init.lua +++ b/.config/awesome/ui/fresnel/init.lua @@ -147,6 +147,9 @@ function fresnel:_exec_entry(entry) if type(entry) == "number" then entry = self._visible_entries[entry] end + if not entry then + error("entry does not exist") + end local exec = entry.exec if type(exec) ~= "userdata" and type(exec) ~= "nil" then if exec[2] then @@ -234,8 +237,9 @@ function fresnel:_render(update) self._prev_selected_idx = self._selected_idx end +---@private ---@param up boolean Whether to scroll up or down -function fresnel:scroll(up) +function fresnel:_scroll_impl(up) local direction = up and -1 or 1 local offset = direction @@ -270,6 +274,14 @@ function fresnel:scroll(up) self:_render(false) end +function fresnel:scroll_down() + self:_scroll_impl(false) +end + +function fresnel:scroll_up() + self:_scroll_impl(true) +end + fresnel._prev_text = "" fresnel._w_prompt = wibox.widget { widget = text_input, @@ -295,16 +307,37 @@ fresnel._w_prompt:connect_signal("key::press", function(_, _mods, key) if key == "Escape" or key == " " and mods.Mod4 then fresnel:hide() elseif key == "Return" then - fresnel:_exec_entry(fresnel._selected_idx) - fresnel:hide() + local ok = pcall(fresnel._exec_entry, fresnel, fresnel._selected_idx) + if ok then + fresnel:hide() + end elseif key == "k" and mods.Mod1 then - fresnel:scroll(true) + fresnel:scroll_up() elseif key == "j" and mods.Mod1 then - fresnel:scroll(false) + fresnel:scroll_down() end end) -local max_height = qui.BIG_PADDING * 2 + (qui.BIG_PADDING * 2 + qui.CHAR_HEIGHT) * 10 +local PROMPT_HEIGHT = + qui.BIG_PADDING + + qui.CHAR_HEIGHT + + qui.BIG_PADDING + +local ENTRY_HEIGHT = + qui.PADDING + + qui.CHAR_HEIGHT + + qui.PADDING + +local MAX_HEIGHT = + qui.BIG_PADDING + + PROMPT_HEIGHT + + qui.PADDING + + ( + qui.PADDING * 9 + -- there's n-1 gaps between n elements + ENTRY_HEIGHT * 10 + ) + + qui.BIG_PADDING + + 1 -- it's off by one for some reason local width = awful.screen.focused().geometry.width / 2 @@ -379,7 +412,10 @@ function fresnel:show() self._first_query = true self._toggled = true self._t_opacity.target = 1 - self._t_height:set(max_height) + self._t_height:set { + pos = 0, + target = MAX_HEIGHT + } self:_update() self._w_prompt:focus() end @@ -388,7 +424,10 @@ end function fresnel:_hide() self._toggled = false self._t_opacity.target = 0 - self._t_height:set(0) + self._t_height:set { + pos = fresnel._w_popup.height, + target = 0 + } for _, lense in ipairs(qnative.lenses) do lense:interrupt() end @@ -406,6 +445,11 @@ fresnel._t_height = qanim:new { subscribed = function(pos) fresnel._w_popup.shape_height = pos end, + signals = { + ended = function() + fresnel._w_popup.shape_height = nil + end + } } fresnel._t_opacity = rubato.timed { |
