Skip to content

Commit 0a683ca

Browse files
committed
Minor tweak to prune empty folders if we are filtering.
Signed-off-by: Sam.Richards@taurich.org <Sam.Richards@taurich.org>
1 parent d89383d commit 0a683ca

1 file changed

Lines changed: 82 additions & 55 deletions

File tree

src/plugin/python_plugins/filesystem_browser/qml/FilesystemBrowser.1/FilesystemBrowser.qml

Lines changed: 82 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ Rectangle {
204204
onValueChanged: {
205205
console.log("QML: filter_time changed to: " + value)
206206
currentFilterTime = value || "Any"
207+
refreshFiltering()
207208
}
208209
Component.onCompleted: {
209210
console.log("QML: filter_time init value: " + value)
@@ -218,6 +219,7 @@ Rectangle {
218219
onValueChanged: {
219220
console.log("QML: filter_version changed to: " + value)
220221
currentFilterVersion = value || "All Versions"
222+
refreshFiltering()
221223
}
222224
Component.onCompleted: {
223225
console.log("QML: filter_version init value: " + value)
@@ -315,6 +317,70 @@ Rectangle {
315317
property var visibleTreeList: []
316318
property var collapsedPaths: ({})
317319

320+
function isVisible(data) {
321+
if (!data) return true;
322+
323+
// Text Filter
324+
var filterText = filterField.text.trim();
325+
if (filterText !== "") {
326+
if (data.name.toLowerCase().indexOf(filterText.toLowerCase()) === -1) return false;
327+
}
328+
329+
// Time Filter
330+
var t_val = currentFilterTime;
331+
if (t_val !== "Any" && data.date) {
332+
var now = Date.now() / 1000.0;
333+
var diff = now - data.date;
334+
var day = 86400;
335+
var timeMatch = true;
336+
if (t_val === "Last 1 day") timeMatch = diff <= day;
337+
else if (t_val === "Last 2 days") timeMatch = diff <= 2*day;
338+
else if (t_val === "Last 1 week") timeMatch = diff <= 7*day;
339+
else if (t_val === "Last 1 month") timeMatch = diff <= 30*day;
340+
341+
if (!timeMatch) return false;
342+
}
343+
344+
// Version Filter
345+
var v_val = currentFilterVersion;
346+
if (v_val === "Latest Version") {
347+
if (data.is_latest_version !== true) return false;
348+
} else if (v_val === "Latest 2 Versions") {
349+
if (data.version_rank !== undefined && data.version_rank > 1) return false;
350+
}
351+
352+
return true;
353+
}
354+
355+
function updateTreeVisibility(nodes) {
356+
var hasVisible = false;
357+
for(var i=0; i<nodes.length; i++) {
358+
var node = nodes[i];
359+
360+
if (node.isFolder) {
361+
// Recursive check for folders
362+
var childrenVisible = updateTreeVisibility(node.children);
363+
// In Tree/Grouped view, folder is visible if it has visible children
364+
// OR if the folder itself matches the text filter?
365+
// Usually for pruning, we only care if content is visible.
366+
// But if user searches for "folderName", they might expect to see it.
367+
// For now, strict pruning: only show if children are visible.
368+
node.visible = childrenVisible;
369+
} else {
370+
// File/Sequence
371+
node.visible = isVisible(node.data);
372+
}
373+
374+
if (node.visible) hasVisible = true;
375+
}
376+
return hasVisible;
377+
}
378+
379+
function refreshFiltering() {
380+
updateTreeVisibility(treeRoots);
381+
flattenTree();
382+
}
383+
318384
function buildTree() {
319385
var roots = []
320386

@@ -333,11 +399,13 @@ Rectangle {
333399
"isFolder": false,
334400
"data": file,
335401
"children": [],
336-
"expanded": false
402+
"expanded": false,
403+
"visible": true // Default
337404
}
338405
roots.push(node)
339406
}
340407
treeRoots = roots
408+
refreshFiltering() // Calculate visibility and flatten
341409
sortTree()
342410
return
343411
}
@@ -353,7 +421,8 @@ Rectangle {
353421
"isFolder": true,
354422
"children": [],
355423
"data": null,
356-
"expanded": (collapsedPaths[path] === undefined)
424+
"expanded": (collapsedPaths[path] === undefined),
425+
"visible": true
357426
}
358427
lookups[path] = node
359428
if (parent) parent.children.push(node);
@@ -398,7 +467,8 @@ Rectangle {
398467
"isFolder": false,
399468
"data": file,
400469
"children": [],
401-
"expanded": false
470+
"expanded": false,
471+
"visible": true
402472
}
403473
if (parentNode) parentNode.children.push(leaf);
404474
else roots.push(leaf);
@@ -435,6 +505,7 @@ Rectangle {
435505
}
436506

437507
treeRoots = roots
508+
refreshFiltering() // Calculate visibility and flatten
438509
sortTree()
439510
}
440511

@@ -480,10 +551,12 @@ Rectangle {
480551
function traverse(nodes, depth) {
481552
for(var i=0; i<nodes.length; i++) {
482553
var node = nodes[i]
483-
node.depth = depth
484-
visible.push(node)
485-
if (node.isFolder && node.expanded) {
486-
traverse(node.children, depth + 1)
554+
if (node.visible) {
555+
node.depth = depth
556+
visible.push(node)
557+
if (node.isFolder && node.expanded) {
558+
traverse(node.children, depth + 1)
559+
}
487560
}
488561
}
489562
}
@@ -1034,6 +1107,7 @@ Rectangle {
10341107
font.pixelSize: fontSize
10351108
leftPadding: 5
10361109
background: Rectangle { color: "#333333"; border.color: "#555555" }
1110+
onTextEdited: refreshFiltering()
10371111
}
10381112
}
10391113

@@ -1126,54 +1200,7 @@ Rectangle {
11261200
delegate: Rectangle {
11271201
id: delegate
11281202
width: totalContentWidth
1129-
property bool matchesFilter: {
1130-
// Always show folders
1131-
if (modelData.isFolder) return true;
1132-
1133-
// Text Filter
1134-
var filterText = filterField.text.trim();
1135-
if (filterText !== "") {
1136-
// Simple name match for now
1137-
return (modelData.name.toLowerCase().indexOf(filterText.toLowerCase()) !== -1);
1138-
}
1139-
1140-
// Access the underlying data
1141-
var d = modelData.data;
1142-
if (!d) return true; // Should not happen for files, but safe fallback
1143-
1144-
// Time Filter
1145-
var timeMatch = true;
1146-
var t_val = currentFilterTime; // e.g. "Last 1 day"
1147-
if (t_val !== "Any" && d.date) {
1148-
var now = Date.now() / 1000.0;
1149-
var diff = now - d.date;
1150-
var day = 86400;
1151-
if (t_val === "Last 1 day") timeMatch = diff <= day;
1152-
else if (t_val === "Last 2 days") timeMatch = diff <= 2*day;
1153-
else if (t_val === "Last 1 week") timeMatch = diff <= 7*day;
1154-
else if (t_val === "Last 1 month") timeMatch = diff <= 30*day;
1155-
}
1156-
if (!timeMatch) return false;
1157-
1158-
// Version Filter
1159-
var verMatch = true;
1160-
var v_val = currentFilterVersion;
1161-
if (v_val === "Latest Version") {
1162-
verMatch = d.is_latest_version === true;
1163-
} else if (v_val === "Latest 2 Versions") {
1164-
// Using version_rank exposed by scanner.py
1165-
if (d.version_rank !== undefined) {
1166-
verMatch = (d.version_rank <= 1);
1167-
}
1168-
}
1169-
1170-
return verMatch;
1171-
}
1172-
1173-
1174-
1175-
height: matchesFilter ? rowHeight : 0
1176-
visible: matchesFilter
1203+
height: rowHeight
11771204

11781205
property bool isSelected: ListView.isCurrentItem
11791206
property bool isHovered: false

0 commit comments

Comments
 (0)