@@ -557,7 +557,7 @@ private void ToggleMenuFlyoutItem_Click(object sender, RoutedEventArgs e)
557
557
558
558
private void GridSplitter_DoubleTapped ( object sender , DoubleTappedRoutedEventArgs e )
559
559
{
560
- var columnToResize = ( Grid . GetColumn ( sender as CommunityToolkit . WinUI . UI . Controls . GridSplitter ) - 1 ) / 2 ;
560
+ var columnToResize = Grid . GetColumn ( sender as CommunityToolkit . WinUI . UI . Controls . GridSplitter ) / 2 ;
561
561
ResizeColumnToFit ( columnToResize ) ;
562
562
e . Handled = true ;
563
563
}
@@ -582,7 +582,7 @@ private void ResizeColumnToFit(int columnToResize)
582
582
{
583
583
1 => 40 , // Check all items columns
584
584
2 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => x . Name ? . Length ?? 0 ) . Max ( ) , // file name column
585
- 3 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => x . FileTagsUI ? . FirstOrDefault ( ) ? . Name ? . Length ?? 0 ) . Max ( ) , // file tag column
585
+ 3 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => x . FileTagsUI ? . Sum ( x => x ? . Name ? . Length ?? 0 ) ?? 0 ) . Max ( ) , // file tag column
586
586
4 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => ( x as RecycleBinItem ) ? . ItemOriginalPath ? . Length ?? 0 ) . Max ( ) , // original path column
587
587
5 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => ( x as RecycleBinItem ) ? . ItemDateDeleted ? . Length ?? 0 ) . Max ( ) , // date deleted column
588
588
6 => FileList . Items . Cast < ListedItem > ( ) . Select ( x => x . ItemDateModified ? . Length ?? 0 ) . Max ( ) , // date modified column
@@ -597,7 +597,8 @@ private void ResizeColumnToFit(int columnToResize)
597
597
if ( maxItemLength == 0 )
598
598
return ;
599
599
600
- var columnSizeToFit = columnToResize == 10 ? maxItemLength : MeasureTextColumnEstimate ( columnToResize , 5 , maxItemLength ) ;
600
+ var columnSizeToFit = MeasureColumnEstimate ( columnToResize , 5 , maxItemLength ) ;
601
+
601
602
if ( columnSizeToFit > 1 )
602
603
{
603
604
var column = columnToResize switch
@@ -613,7 +614,7 @@ private void ResizeColumnToFit(int columnToResize)
613
614
_ => ColumnsViewModel . StatusColumn
614
615
} ;
615
616
616
- if ( columnToResize == 1 ) // file name column
617
+ if ( columnToResize == 2 ) // file name column
617
618
columnSizeToFit += 20 ;
618
619
619
620
var minFitLength = Math . Max ( columnSizeToFit , column . NormalMinLength ) ;
@@ -625,48 +626,90 @@ private void ResizeColumnToFit(int columnToResize)
625
626
FolderSettings . ColumnsViewModel = ColumnsViewModel ;
626
627
}
627
628
628
- private double MeasureTextColumnEstimate ( int columnIndex , int measureItemsCount , int maxItemLength )
629
+ private double MeasureColumnEstimate ( int columnIndex , int measureItemsCount , int maxItemLength )
630
+ {
631
+ if ( columnIndex == 10 )
632
+ return maxItemLength ;
633
+
634
+ if ( columnIndex == 3 )
635
+ return MeasureTagColumnEstimate ( columnIndex ) ;
636
+
637
+ return MeasureTextColumnEstimate ( columnIndex , measureItemsCount , maxItemLength ) ;
638
+ }
639
+
640
+ private double MeasureTagColumnEstimate ( int columnIndex )
629
641
{
630
- var tbs = DependencyObjectHelpers . FindChildren < TextBlock > ( FileList . ItemsPanelRoot ) . Where ( tb =>
642
+ var grids = DependencyObjectHelpers
643
+ . FindChildren < Grid > ( FileList . ItemsPanelRoot )
644
+ . Where ( grid => IsCorrectColumn ( grid , columnIndex ) ) ;
645
+
646
+ // Get the list of stack panels with the most letters
647
+ var stackPanels = grids
648
+ . Select ( DependencyObjectHelpers . FindChildren < StackPanel > )
649
+ . OrderByDescending ( sps => sps . Select ( sp => DependencyObjectHelpers . FindChildren < TextBlock > ( sp ) . Select ( tb => tb . Text . Length ) . Sum ( ) ) . Sum ( ) )
650
+ . First ( )
651
+ . ToArray ( ) ;
652
+
653
+ var mesuredSize = stackPanels . Select ( x =>
631
654
{
632
- int columnIndexFromName = tb . Name switch
633
- {
634
- "ItemName" => 1 ,
635
- "ItemTag" => 2 ,
636
- "ItemOriginalPath" => 3 ,
637
- "ItemDateDeleted" => 4 ,
638
- "ItemDateModified" => 5 ,
639
- "ItemDateCreated" => 6 ,
640
- "ItemType" => 7 ,
641
- "ItemSize" => 8 ,
642
- "ItemStatus" => 9 ,
643
- _ => - 1 ,
644
- } ;
655
+ x . Measure ( new Size ( Double . PositiveInfinity , Double . PositiveInfinity ) ) ;
645
656
646
- if ( columnIndexFromName == - 1 )
647
- return false ;
657
+ return x . DesiredSize . Width ;
658
+ } ) . Sum ( ) ;
648
659
649
- return columnIndexFromName == columnIndex ;
650
- } ) ;
660
+ if ( stackPanels . Length >= 2 )
661
+ mesuredSize += 4 * ( stackPanels . Length - 1 ) ; // The spacing between the tags
662
+
663
+ return mesuredSize ;
664
+ }
665
+
666
+ private double MeasureTextColumnEstimate ( int columnIndex , int measureItemsCount , int maxItemLength )
667
+ {
668
+ var tbs = DependencyObjectHelpers
669
+ . FindChildren < TextBlock > ( FileList . ItemsPanelRoot )
670
+ . Where ( tb => IsCorrectColumn ( tb , columnIndex ) ) ;
651
671
652
672
// heuristic: usually, text with more letters are wider than shorter text with wider letters
653
673
// with this, we can calculate avg width using longest text(s) to avoid overshooting the width
654
- var widthPerLetter = tbs . OrderByDescending ( x => x . Text . Length ) . Where ( tb => ! string . IsNullOrEmpty ( tb . Text ) ) . Take ( measureItemsCount ) . Select ( tb =>
655
- {
656
- var sampleTb = new TextBlock { Text = tb . Text , FontSize = tb . FontSize , FontFamily = tb . FontFamily } ;
657
- sampleTb . Measure ( new Size ( Double . PositiveInfinity , Double . PositiveInfinity ) ) ;
674
+ var widthPerLetter = tbs
675
+ . OrderByDescending ( x => x . Text . Length )
676
+ . Where ( tb => ! string . IsNullOrEmpty ( tb . Text ) )
677
+ . Take ( measureItemsCount )
678
+ . Select ( tb =>
679
+ {
680
+ var sampleTb = new TextBlock { Text = tb . Text , FontSize = tb . FontSize , FontFamily = tb . FontFamily } ;
681
+ sampleTb . Measure ( new Size ( Double . PositiveInfinity , Double . PositiveInfinity ) ) ;
658
682
659
- return sampleTb . DesiredSize . Width / Math . Max ( 1 , tb . Text . Length ) ;
660
- } ) ;
683
+ return sampleTb . DesiredSize . Width / Math . Max ( 1 , tb . Text . Length ) ;
684
+ } ) ;
661
685
662
686
if ( ! widthPerLetter . Any ( ) )
663
687
return 0 ;
664
688
665
- // take weighted avg between mean and max since width is an estimate
689
+ // Take weighted avg between mean and max since width is an estimate
666
690
var weightedAvg = ( widthPerLetter . Average ( ) + widthPerLetter . Max ( ) ) / 2 ;
667
691
return weightedAvg * maxItemLength ;
668
692
}
669
693
694
+ private bool IsCorrectColumn ( FrameworkElement element , int columnIndex )
695
+ {
696
+ int columnIndexFromName = element . Name switch
697
+ {
698
+ "ItemName" => 2 ,
699
+ "ItemTagGrid" => 3 ,
700
+ "ItemOriginalPath" => 4 ,
701
+ "ItemDateDeleted" => 5 ,
702
+ "ItemDateModified" => 6 ,
703
+ "ItemDateCreated" => 7 ,
704
+ "ItemType" => 8 ,
705
+ "ItemSize" => 9 ,
706
+ "ItemStatus" => 10 ,
707
+ _ => - 1 ,
708
+ } ;
709
+
710
+ return columnIndexFromName != - 1 && columnIndexFromName == columnIndex ;
711
+ }
712
+
670
713
private void FileList_Loaded ( object sender , RoutedEventArgs e )
671
714
{
672
715
ContentScroller = FileList . FindDescendant < ScrollViewer > ( x => x . Name == "ScrollViewer" ) ;
0 commit comments