Skip to content

Commit

Permalink
feat: added missing fold keymaps. folding is now feature complete
Browse files Browse the repository at this point in the history
  • Loading branch information
folke committed May 30, 2024
1 parent 0189184 commit 9fb1be0
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
19 changes: 19 additions & 0 deletions lua/trouble/config/actions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,25 @@ local M = {
fold_close_all = function(self)
self:fold_level({ level = 0 })
end,
fold_update = function(self, ctx)
self:fold_level({})
self:fold(ctx.node, { action = "open" })
end,
fold_update_all = function(self)
self:fold_level({})
end,
fold_disable = function(self)
self.renderer.foldenable = false
self:render()
end,
fold_enable = function(self)
self.renderer.foldenable = true
self:render()
end,
fold_toggle_enable = function(self)
self.renderer.foldenable = not self.renderer.foldenable
self:render()
end,
}

for _, fold_action in ipairs({ "toggle", "open", "close" }) do
Expand Down
5 changes: 5 additions & 0 deletions lua/trouble/config/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ local defaults = {
zM = "fold_close_all",
zr = "fold_reduce",
zR = "fold_open_all",
zx = "fold_update",
zX = "fold_update_all",
zn = "fold_disable",
zN = "fold_enable",
zi = "fold_toggle_enable",
},
---@type table<string, trouble.Mode>
modes = {
Expand Down
2 changes: 2 additions & 0 deletions lua/trouble/tree.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---@class trouble.Node
---@field id string
---@field depth number
---@field parent? trouble.Node
---@field count? number
---@field item? trouble.Item
---@field items? trouble.Item[]
Expand All @@ -26,6 +27,7 @@ end
function M:add(node)
assert(self.index[node.id] == nil, "node already exists")
self.index[node.id] = node
node.parent = self
table.insert(self.nodes, node)
return node
end
Expand Down
17 changes: 15 additions & 2 deletions lua/trouble/view/render.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ local Text = require("trouble.view.text")
---@field _folded table<string, true>
---@field root_nodes trouble.Node[]
---@field foldlevel? number
---@field foldenable boolean
---@field max_depth number
---@field opts trouble.Render.opts
local M = setmetatable({}, Text)
Expand All @@ -23,6 +24,7 @@ function M.new(opts)
---@diagnostic disable-next-line: assign-type-mismatch
local self = setmetatable(text, M)
self._folded = {}
self.foldenable = true
self:clear()
return self
end
Expand All @@ -31,6 +33,7 @@ end
---@param node trouble.Node
---@param opts? trouble.Render.fold_opts
function M:fold(node, opts)
self.foldenable = true
opts = opts or {}
local action = opts.action or "toggle"
local id = node.id
Expand All @@ -46,6 +49,11 @@ function M:fold(node, opts)
local n = table.remove(stack)
if action == "open" then
self._folded[n.id] = nil
local parent = n.parent
while parent do
self._folded[parent.id] = nil
parent = parent.parent
end
else
self._folded[n.id] = true
end
Expand All @@ -59,6 +67,7 @@ end

---@param opts {level?:number, add?:number}
function M:fold_level(opts)
self.foldenable = true
self.foldlevel = self.foldlevel or self.max_depth or 0
if opts.level then
self.foldlevel = opts.level
Expand Down Expand Up @@ -102,14 +111,18 @@ function M:section(section, nodes)
end
end

function M:is_folded(node)
return self.foldenable and self._folded[node.id]
end

---@param node trouble.Node
---@param section trouble.Section
---@param indent trouble.Indent
---@param is_last boolean
function M:node(node, section, indent, is_last)
if node.item then
---@type trouble.Indent.type
local symbol = self._folded[node.id] and "fold_closed"
local symbol = self:is_folded(node) and "fold_closed"
or node.depth == 1 and "fold_open"
or is_last and "last"
or "middle"
Expand All @@ -118,7 +131,7 @@ function M:node(node, section, indent, is_last)
indent:del()
end

if self._folded[node.id] then
if self:is_folded(node) then
return -- don't render children
end

Expand Down

0 comments on commit 9fb1be0

Please sign in to comment.