add a ui (wip)
This commit is contained in:
84
lua/dep/ui/page.lua
Normal file
84
lua/dep/ui/page.lua
Normal file
@ -0,0 +1,84 @@
|
||||
---@class chunk: table
|
||||
---@field [1] string text to be displayed
|
||||
---@field [2] string neovim highlight group to use
|
||||
|
||||
---@class page
|
||||
---@field name string name of the ui page
|
||||
---@field kb string keybind of the page
|
||||
---@field content chunk[]|chunk[][] all the chunks
|
||||
---@field hlns number highlight namespace
|
||||
---@field pre_draw function things to do prior to drawing to the buffer
|
||||
---@field post_draw function things to do post drawing to the buffer
|
||||
local page = {}
|
||||
|
||||
--- create a new page
|
||||
---@param name string the name of the page
|
||||
---@param kb string keybind to change to the page
|
||||
---@return page page
|
||||
function page:new(name, kb)
|
||||
local o = {}
|
||||
self.__index = self
|
||||
setmetatable(o, self)
|
||||
|
||||
o.hlns = vim.api.nvim_create_namespace("DepUi")
|
||||
o.name = name
|
||||
o.kb = kb
|
||||
o.content = {}
|
||||
|
||||
return o
|
||||
end
|
||||
|
||||
--- add a new line to the page
|
||||
---@param line chunk|chunk[] new line
|
||||
function page:new_line(line)
|
||||
table.insert(self.content, line)
|
||||
end
|
||||
|
||||
--- draw the page to the given buffer
|
||||
---@param bufnr number buffer number
|
||||
function page:draw(bufnr)
|
||||
-- try to run pre_draw steps
|
||||
if self.pre_draw then
|
||||
self.pre_draw()
|
||||
end
|
||||
|
||||
-- ready all information for rendering
|
||||
for i, chunk in ipairs(self.content) do
|
||||
local linenr = i - 1
|
||||
local text = ""
|
||||
local hls = {}
|
||||
|
||||
if type(chunk[1]) == "table" then
|
||||
local j = 0
|
||||
for _, ch in ipairs(chunk) do
|
||||
text = text..ch[1]
|
||||
table.insert(hls, { ch[2], j, j + #ch[1] })
|
||||
j = j + #ch[1]
|
||||
end
|
||||
elseif type(chunk[1]) == "string" then
|
||||
text = chunk[1]
|
||||
table.insert(hls, { chunk[2], 0, #text })
|
||||
end
|
||||
|
||||
-- draw the text to the buffer
|
||||
vim.api.nvim_buf_set_lines(bufnr, linenr, -1, false, { text })
|
||||
|
||||
-- highlight the buffer
|
||||
for _, hl in ipairs(hls) do
|
||||
vim.api.nvim_buf_set_extmark(bufnr, self.hlns, linenr, hl[2], {
|
||||
hl_mode = "replace",
|
||||
hl_group = hl[1],
|
||||
end_col = hl[3],
|
||||
end_row = linenr
|
||||
})
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- try to run post_draw steps
|
||||
if self.post_draw then
|
||||
self.post_draw()
|
||||
end
|
||||
end
|
||||
|
||||
return page
|
Reference in New Issue
Block a user