@@ -4,6 +4,47 @@ local utils = require("diffview.utils")
44
55local pl = utils .path
66
7+ --- Format a folder name, optionally appending a trailing slash.
8+ --- @param name string
9+ --- @param tree_options table
10+ --- @return string
11+ local function format_folder_name (name , tree_options )
12+ return name .. (tree_options .folder_trailing_slash and " /" or " " )
13+ end
14+
15+ --- Render the file count annotation for a collapsed folder.
16+ --- @param comp table RenderComponent-like object supporting add_text ().
17+ --- @param node table Tree node whose leaves () will be counted.
18+ --- @param tree_options table Config tree_options table.
19+ local function render_folder_count (comp , node , tree_options )
20+ if tree_options .folder_count_style == " none" then return end
21+
22+ if tree_options .folder_count_style == " grouped" then
23+ local leaves = node :leaves ()
24+ local status_counts = {}
25+ for _ , leaf in ipairs (leaves ) do
26+ local s = leaf .data .status or " ?"
27+ status_counts [s ] = (status_counts [s ] or 0 ) + 1
28+ end
29+
30+ -- Sort status letters for consistent display order.
31+ local statuses = vim .tbl_keys (status_counts )
32+ table.sort (statuses )
33+
34+ comp :add_text (" (" , " DiffviewDim1" )
35+ for i , s in ipairs (statuses ) do
36+ if i > 1 then
37+ comp :add_text (" " , " DiffviewDim1" )
38+ end
39+ comp :add_text (tostring (status_counts [s ]) .. hl .get_status_icon (s ), hl .get_git_hl (s ))
40+ end
41+ comp :add_text (" )" , " DiffviewDim1" )
42+ else
43+ local file_count = # node :leaves ()
44+ comp :add_text (" (" .. file_count .. " )" , " DiffviewDim1" )
45+ end
46+ end
47+
748--- @param conf DiffviewConfig
849--- @param panel FilePanel
950--- @param comp RenderComponent
@@ -161,28 +202,11 @@ local function render_file_tree_recurse(conf, panel, depth, comp)
161202 " DiffviewFolderSign"
162203 )
163204
164- dir :add_text (ctx .name .. " /" , " DiffviewFolderName" )
165- -- Show file count grouped by status when folder is collapsed.
205+ local tree_options = conf .file_panel .tree_options
206+ dir :add_text (format_folder_name (ctx .name , tree_options ), " DiffviewFolderName" )
207+ -- Show file count when folder is collapsed.
166208 if ctx .collapsed and ctx ._node then
167- local leaves = ctx ._node :leaves ()
168- local status_counts = {}
169- for _ , node in ipairs (leaves ) do
170- local s = node .data .status or " ?"
171- status_counts [s ] = (status_counts [s ] or 0 ) + 1
172- end
173-
174- -- Sort status letters for consistent display order.
175- local statuses = vim .tbl_keys (status_counts )
176- table.sort (statuses )
177-
178- dir :add_text (" (" , " DiffviewDim1" )
179- for i , s in ipairs (statuses ) do
180- if i > 1 then
181- dir :add_text (" " , " DiffviewDim1" )
182- end
183- dir :add_text (tostring (status_counts [s ]) .. hl .get_status_icon (s ), hl .get_git_hl (s ))
184- end
185- dir :add_text (" )" , " DiffviewDim1" )
209+ render_folder_count (dir , ctx ._node , tree_options )
186210 end
187211 dir :ln ()
188212
@@ -214,7 +238,7 @@ local function render_files(conf, panel, listing_style, comp)
214238end
215239
216240--- @param panel FilePanel
217- return function (panel )
241+ local function render_panel (panel )
218242 if not panel .render_data then
219243 return
220244 end
@@ -314,3 +338,13 @@ return function(panel)
314338 end
315339 end
316340end
341+
342+ return setmetatable ({
343+ -- Exposed for testing only.
344+ _test = {
345+ format_folder_name = format_folder_name ,
346+ render_folder_count = render_folder_count ,
347+ },
348+ }, {
349+ __call = function (_ , panel ) render_panel (panel ) end ,
350+ })
0 commit comments