diff --git a/lua/lylla/init.lua b/lua/lylla/init.lua index 326d618..04dd857 100644 --- a/lua/lylla/init.lua +++ b/lua/lylla/init.lua @@ -39,12 +39,10 @@ function M.init() callback = function() local win = vim.api.nvim_get_current_win() require("lylla.statusline"):new(win):init() - require("lylla.winbar"):new(win):init() end, }) local win = vim.api.nvim_get_current_win() require("lylla.statusline"):new(win):init() - require("lylla.winbar"):new(win):init() vim.api.nvim_create_autocmd("WinClosed", { group = vim.api.nvim_create_augroup("lylla:close", { clear = true }), @@ -53,10 +51,6 @@ function M.init() if stl then stl:close() end - local wbar = require("lylla.winbar").wins[ev.match] - if wbar then - wbar:close() - end end, }) diff --git a/lua/lylla/statusline.lua b/lua/lylla/statusline.lua index 14a349b..8c034ad 100644 --- a/lua/lylla/statusline.lua +++ b/lua/lylla/statusline.lua @@ -4,6 +4,7 @@ local utils = require("lylla.utils") ---@field wins table ---@field win integer ---@field modules any[] +---@field winbar any[] ---@field timer uv.uv_timer_t ---@field refreshau integer local statusline = {} @@ -19,6 +20,7 @@ function statusline:new(win) local stl = setmetatable({ win = win, modules = vim.deepcopy(require("lylla.config").get().modules, true), + winbar = vim.deepcopy(require("lylla.config").get().winbar, true), }, { __index = statusline }) statusline.wins[win] = stl return stl @@ -61,31 +63,21 @@ end ---@field refresh fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) function statusline:refresh(ev) vim.schedule(function() - if vim.o.cmdheight == 0 and vim.api.nvim_get_mode().mode == "c" then - return - end - if not vim.api.nvim_win_is_valid(self.win) then return end - local ok, result = pcall(vim.api.nvim_win_call, self.win, function() - return self:get(ev) - end) - if not ok then - return - end - - vim.wo[self.win].statusline = result + self:set(ev) + self:setwinbar(ev) end) end ---@class lylla.proto ----@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args): string -function statusline:fold(ev) - local modules = vim - .iter(ipairs(self.modules)) - :map(function(i, module) +---@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args, modules: any[]): string +function statusline:fold(ev, modules) + local lst = vim + .iter(ipairs(modules)) + :map(function(_, module) if type(module) == "table" and module._type == "component" then if module.opts and module.opts.events then -- refresh from timer @@ -106,8 +98,8 @@ function statusline:fold(ev) return module end) :totable() - modules = utils.flatten(modules, 1) - return vim.iter(modules):fold("", function(str, module) + lst = utils.flatten(lst, 1) + return vim.iter(lst):fold("", function(str, module) if type(module) ~= "table" or #module == 0 then return str end @@ -122,7 +114,44 @@ end ---@class lylla.proto ---@field get fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) function statusline:get(ev) - return self:fold(ev) + return self:fold(ev, self.modules) +end + +---@class lylla.proto +---@field getwinbar fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) +function statusline:getwinbar(ev) + return self:fold(ev, self.winbar) +end + +---@class lylla.proto +---@field setwinbar fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) +function statusline:setwinbar(ev) + local buf = vim.api.nvim_win_get_buf(self.win) + if vim.bo[buf].buftype ~= "" then + return + end + + local ok, result = pcall(vim.api.nvim_win_call, self.win, function() + return self:getwinbar(ev) + end) + if not ok then + return + end + + vim.wo[self.win].winbar = result +end + +---@class lylla.proto +---@field set fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) +function statusline:set(ev) + local ok, result = pcall(vim.api.nvim_win_call, self.win, function() + return self:get(ev) + end) + if not ok then + return + end + + vim.wo[self.win].statusline = result end return statusline diff --git a/lua/lylla/winbar.lua b/lua/lylla/winbar.lua deleted file mode 100644 index 0e7391e..0000000 --- a/lua/lylla/winbar.lua +++ /dev/null @@ -1,125 +0,0 @@ -local utils = require("lylla.utils") - ----@type lylla.proto ----@diagnostic disable-next-line: missing-fields -local winbar = {} - -winbar.wins = {} - ----@class lylla.proto ----@field new fun(self, win): lylla.proto -function winbar:new(win) - if winbar.wins[win] then - winbar.wins[win]:close() - end - local stl = setmetatable({ - win = win, - modules = vim.deepcopy(require("lylla.config").get().winbar, true), - }, { __index = winbar }) - winbar.wins[win] = stl - return stl -end - ----@class lylla.proto ----@field init fun(self) -function winbar:init() - local err, err_kind - ---@diagnostic disable-next-line: assign-type-mismatch - self.timer, err, err_kind = vim.uv.new_timer() - if not self.timer or err then - vim.api.nvim_echo({ { err_kind }, { "\n\t" }, { err } }, true, { err = true }) - return - end - - local refresh = require("lylla.config").get().refresh_rate - self.timer:start(0, refresh, function() - self:refresh() - end) - - self.refreshau = vim.api.nvim_create_autocmd(require("lylla.config").get().events, { - group = vim.api.nvim_create_augroup("lylla:refresh", { clear = false }), - callback = function(ev) - self:refresh(ev) - end, - }) -end - ----@class lylla.proto ----@field close fun(self) -function winbar:close() - self.timer:stop() - self.timer:close() - vim.api.nvim_del_autocmd(self.refreshau) - winbar.wins[self.win] = nil -end - ----@class lylla.proto ----@field refresh fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) -function winbar:refresh(ev) - vim.schedule(function() - if not vim.api.nvim_win_is_valid(self.win) then - return - end - - local buf = vim.api.nvim_win_get_buf(self.win) - if vim.bo[buf].buftype ~= "" then - return - end - - local ok, result = pcall(vim.api.nvim_win_call, self.win, function() - return self:get(ev) - end) - if not ok then - return - end - - vim.wo[self.win].winbar = result - end) -end - ----@class lylla.proto ----@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args): string -function winbar:fold(ev) - local modules = vim - .iter(ipairs(self.modules)) - :map(function(i, module) - if type(module) == "table" and module._type == "component" then - if module.opts and module.opts.events then - -- refresh from timer - if not ev and module.prev then - return module.prev - end - -- refresh from non-match event - if ev and not vim.tbl_contains(module.opts.events, ev.event) and module.prev then - return module.prev - end - end - module.prev = module.fn() - return module.prev - end - if type(module) == "function" then - module = module() - end - return module - end) - :totable() - modules = utils.flatten(modules, 1) - return vim.iter(modules):fold("", function(str, module) - if type(module) ~= "table" or #module == 0 then - return str - end - local text = module[1] - if #module > 1 then - return str .. "%#" .. module[2] .. "#" .. text .. "%*" - end - return str .. "%*" .. text - end) -end - ----@class lylla.proto ----@field get fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) -function winbar:get(ev) - return self:fold(ev) -end - -return winbar