irongit

A Neovim plugin enabling you to solve LeetCode problems.

118 lines3.3 KBLua
1local Testcase = require("leetcode-ui.popup.console.testcase")
2local Result = require("leetcode-ui.popup.console.result")
3local NuiLayout = require("nui.layout")
4local Layout = require("leetcode-ui.layout")
5local Popup = require("leetcode-ui.popup")
6
7local config = require("leetcode.config")
8local keys = config.user.keys
9local Runner = require("leetcode.runner")
10local log = require("leetcode.logger")
11
12---@class lc.ui.Console : lc.ui.Layout
13---@field question lc.ui.Question
14---@field testcase lc.ui.Console.TestcasePopup
15---@field result lc.ui.Console.ResultPopup
16---@field popups lc.ui.Console.Popup[]
17local ConsoleLayout = Layout:extend("LeetConsoleLayout")
18
19function ConsoleLayout:unmount() --
20 ConsoleLayout.super.unmount(self)
21
22 self.testcase = Testcase(self)
23 self.result = Result(self)
24 self.popups = { self.testcase, self.result }
25end
26
27function ConsoleLayout:hide()
28 ConsoleLayout.super.hide(self)
29
30 pcall(function()
31 local winid = vim.api.nvim_get_current_win()
32 if winid == self.question.description.winid then
33 vim.api.nvim_set_current_win(self.question.winid)
34 end
35 end)
36end
37
38function ConsoleLayout:mount()
39 self:update(NuiLayout.Box({
40 NuiLayout.Box(self.testcase, { size = config.user.console.testcase.size }),
41 NuiLayout.Box(self.result, { size = config.user.console.result.size }),
42 }, { dir = config.user.console.dir }))
43
44 ConsoleLayout.super.mount(self)
45
46 self:set_keymaps({
47 [keys.reset_testcases] = function()
48 self.testcase:reset()
49 end,
50 [keys.use_testcase] = function()
51 self:use_testcase()
52 end,
53 [keys.focus_testcases] = function()
54 self.testcase:focus()
55 end,
56 [keys.focus_result] = function()
57 self.result:focus()
58 end,
59 })
60end
61
62function ConsoleLayout:run(submit)
63 local range = self.question:editor_section_range("code")
64 if not range:is_valid_or_log() then
65 return
66 end
67
68 if config.user.console.open_on_runcode then
69 self:show()
70 end
71
72 self.result:focus()
73
74 Runner:init(self.question):run(submit)
75end
76
77function ConsoleLayout:use_testcase()
78 local last_testcase = self.result.last_testcase
79 if last_testcase and last_testcase ~= "" then
80 self.testcase:append(last_testcase)
81 else
82 log.warn("No testcase to use")
83 end
84end
85
86function ConsoleLayout:set_keymaps(keymaps)
87 for _, popup in pairs(self.popups) do
88 for key, fn in pairs(keymaps) do
89 popup:map("n", key, fn)
90 end
91 end
92end
93
94---@param parent lc.ui.Question
95function ConsoleLayout:init(parent)
96 self.question = parent
97 self.testcase = Testcase(self)
98 self.result = Result(self)
99 self.popups = { self.testcase, self.result }
100
101 ConsoleLayout.super.init(
102 self,
103 {
104 relative = "editor",
105 position = "50%",
106 size = config.user.console.size,
107 },
108 NuiLayout.Box({
109 NuiLayout.Box(self.testcase, { size = config.user.console.testcase.size }),
110 NuiLayout.Box(self.result, { size = config.user.console.result.size }),
111 }, { dir = config.user.console.dir })
112 )
113end
114
115---@type fun(parent: lc.ui.Question): lc.ui.Console
116local LeetConsoleLayout = ConsoleLayout
117
118return LeetConsoleLayout