irongit

A Neovim plugin enabling you to solve LeetCode problems.

133 lines2.5 KBLua
1local NuiPopup = require("nui.popup")
2local Renderer = require("leetcode-ui.renderer")
3local config = require("leetcode.config")
4local keys = config.user.keys
5
6local log = require("leetcode.logger")
7
8---@class lc.ui.Popup : NuiPopup
9---@field visible boolean
10---@field renderer lc.ui.Renderer
11local Popup = NuiPopup:extend("LeetPopup")
12
13function Popup:_open_window()
14 Popup.super._open_window(self)
15 self:update_renderer()
16end
17
18function Popup:_close_window()
19 Popup.super._close_window(self)
20 self:update_renderer()
21end
22
23function Popup:_buf_create()
24 Popup.super._buf_create(self)
25 self:update_renderer()
26end
27
28function Popup:_buf_destory()
29 Popup.super._buf_destory(self)
30 self:update_renderer()
31end
32
33function Popup:focus()
34 if self.winid and vim.api.nvim_win_is_valid(self.winid) then
35 vim.api.nvim_set_current_win(self.winid)
36 end
37end
38
39function Popup:clear() --
40 self.renderer:clear()
41end
42
43function Popup:show()
44 if not self._.mounted then
45 self:mount()
46 elseif not self.visible then
47 Popup.super.show(self)
48 end
49
50 self.visible = true
51end
52
53function Popup:unmount()
54 self:clear()
55 Popup.super.unmount(self)
56
57 self.visible = false
58end
59
60function Popup:map(...)
61 self.renderer:map(...)
62end
63
64function Popup:mount()
65 Popup.super.mount(self)
66
67 self.visible = true
68
69 self:on({ "BufLeave", "WinLeave" }, function()
70 self:handle_leave()
71 end)
72 self:map("n", keys.toggle, function()
73 self:hide()
74 end)
75end
76
77function Popup:hide()
78 if not self.visible then
79 return
80 end
81 Popup.super.hide(self)
82
83 self.visible = false
84end
85
86function Popup:toggle()
87 if not self.visible then
88 self:show()
89 else
90 self:hide()
91 end
92end
93
94function Popup:handle_leave()
95 self:hide()
96end
97
98function Popup:draw()
99 self.renderer:draw(self)
100end
101
102function Popup:update_renderer()
103 self.renderer.bufnr = self.bufnr
104 self.renderer.winid = self.winid
105end
106
107function Popup:init(opts)
108 local options = vim.tbl_deep_extend("force", {
109 focusable = true,
110 border = {
111 padding = {
112 top = 1,
113 bottom = 1,
114 left = 3,
115 right = 3,
116 },
117 style = "rounded",
118 },
119 buf_options = {
120 filetype = config.name,
121 },
122 }, opts or {})
123
124 self.renderer = self.renderer or Renderer()
125 self.visible = false
126
127 Popup.super.init(self, options)
128end
129
130---@type fun(opts: table): lc.ui.Popup
131local LeetPopup = Popup
132
133return LeetPopup