A Neovim plugin enabling you to solve LeetCode problems.
| 1 | local NuiPopup = require("nui.popup") |
| 2 | local Renderer = require("leetcode-ui.renderer") |
| 3 | local config = require("leetcode.config") |
| 4 | local keys = config.user.keys |
| 5 | |
| 6 | local log = require("leetcode.logger") |
| 7 | |
| 8 | ---@class lc.ui.Popup : NuiPopup |
| 9 | ---@field visible boolean |
| 10 | ---@field renderer lc.ui.Renderer |
| 11 | local Popup = NuiPopup:extend("LeetPopup") |
| 12 | |
| 13 | |
| 14 | Popup.super._open_window(self) |
| 15 | self:update_renderer() |
| 16 | end |
| 17 | |
| 18 | |
| 19 | Popup.super._close_window(self) |
| 20 | self:update_renderer() |
| 21 | end |
| 22 | |
| 23 | |
| 24 | Popup.super._buf_create(self) |
| 25 | self:update_renderer() |
| 26 | end |
| 27 | |
| 28 | |
| 29 | Popup.super._buf_destory(self) |
| 30 | self:update_renderer() |
| 31 | end |
| 32 | |
| 33 | |
| 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 |
| 37 | end |
| 38 | |
| 39 | -- |
| 40 | self.renderer:clear() |
| 41 | end |
| 42 | |
| 43 | |
| 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 |
| 51 | end |
| 52 | |
| 53 | |
| 54 | self:clear() |
| 55 | Popup.super.unmount(self) |
| 56 | |
| 57 | self.visible = false |
| 58 | end |
| 59 | |
| 60 | |
| 61 | self.renderer:map(...) |
| 62 | end |
| 63 | |
| 64 | |
| 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) |
| 75 | end |
| 76 | |
| 77 | |
| 78 | if not self.visible then |
| 79 | return |
| 80 | end |
| 81 | Popup.super.hide(self) |
| 82 | |
| 83 | self.visible = false |
| 84 | end |
| 85 | |
| 86 | |
| 87 | if not self.visible then |
| 88 | self:show() |
| 89 | else |
| 90 | self:hide() |
| 91 | end |
| 92 | end |
| 93 | |
| 94 | |
| 95 | self:hide() |
| 96 | end |
| 97 | |
| 98 | |
| 99 | self.renderer:draw(self) |
| 100 | end |
| 101 | |
| 102 | |
| 103 | self.renderer.bufnr = self.bufnr |
| 104 | self.renderer.winid = self.winid |
| 105 | end |
| 106 | |
| 107 | |
| 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) |
| 128 | end |
| 129 | |
| 130 | ---@type fun(opts: table): lc.ui.Popup |
| 131 | local LeetPopup = Popup |
| 132 | |
| 133 | return LeetPopup |