@@ -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