Skip to content

Commit 1692c0a

Browse files
authored
Merge pull request #253 from jeffsieu/sort
Add sort button to app ribbon
2 parents d62533a + 65ea5f5 commit 1692c0a

17 files changed

+210
-134
lines changed

Files UWP/Filesystem/ItemViewModel.cs

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
using System;
77
using System.Collections.Generic;
88
using System.Collections.ObjectModel;
9+
using System.ComponentModel;
910
using System.Diagnostics;
1011
using System.Globalization;
1112
using System.IO;
1213
using System.Linq;
14+
using System.Runtime.CompilerServices;
1315
using System.Runtime.InteropServices;
1416
using System.Threading;
1517
using System.Threading.Tasks;
@@ -31,7 +33,7 @@
3133

3234
namespace Files.Filesystem
3335
{
34-
public class ItemViewModel
36+
public class ItemViewModel : INotifyPropertyChanged
3537
{
3638
public ReadOnlyObservableCollection<ListedItem> FilesAndFolders { get; }
3739
public CollectionViewSource viewSource;
@@ -44,6 +46,7 @@ public class ItemViewModel
4446
private QueryOptions _options;
4547
private volatile bool _filesRefreshing;
4648
private const int _step = 250;
49+
public event PropertyChangedEventHandler PropertyChanged;
4750

4851
private SortOption _directorySortOption = SortOption.Name;
4952
private SortDirection _directorySortDirection = SortDirection.Ascending;
@@ -59,6 +62,11 @@ public SortOption DirectorySortOption
5962
if (value != _directorySortOption)
6063
{
6164
_directorySortOption = value;
65+
NotifyPropertyChanged("DirectorySortOption");
66+
NotifyPropertyChanged("IsSortedByName");
67+
NotifyPropertyChanged("IsSortedByDate");
68+
NotifyPropertyChanged("IsSortedByType");
69+
NotifyPropertyChanged("IsSortedBySize");
6270
OrderFiles();
6371
}
6472
}
@@ -75,11 +83,94 @@ public SortDirection DirectorySortDirection
7583
if (value != _directorySortDirection)
7684
{
7785
_directorySortDirection = value;
86+
NotifyPropertyChanged("DirectorySortDirection");
87+
NotifyPropertyChanged("IsSortedAscending");
88+
NotifyPropertyChanged("IsSortedDescending");
7889
OrderFiles();
7990
}
8091
}
8192
}
8293

94+
public bool IsSortedByName
95+
{
96+
get => DirectorySortOption == SortOption.Name;
97+
set
98+
{
99+
if (value)
100+
{
101+
DirectorySortOption = SortOption.Name;
102+
NotifyPropertyChanged("IsSortedByName");
103+
NotifyPropertyChanged("DirectorySortOption");
104+
}
105+
}
106+
}
107+
108+
public bool IsSortedByDate
109+
{
110+
get => DirectorySortOption == SortOption.DateModified;
111+
set
112+
{
113+
if (value)
114+
{
115+
DirectorySortOption = SortOption.DateModified;
116+
NotifyPropertyChanged("IsSortedByDate");
117+
NotifyPropertyChanged("DirectorySortOption");
118+
}
119+
}
120+
}
121+
122+
public bool IsSortedByType
123+
{
124+
get => DirectorySortOption == SortOption.FileType;
125+
set
126+
{
127+
if (value)
128+
{
129+
DirectorySortOption = SortOption.FileType;
130+
NotifyPropertyChanged("IsSortedByType");
131+
NotifyPropertyChanged("DirectorySortOption");
132+
}
133+
}
134+
}
135+
136+
public bool IsSortedBySize
137+
{
138+
get => DirectorySortOption == SortOption.Size;
139+
set
140+
{
141+
if (value)
142+
{
143+
DirectorySortOption = SortOption.Size;
144+
NotifyPropertyChanged("IsSortedBySize");
145+
NotifyPropertyChanged("DirectorySortOption");
146+
}
147+
}
148+
}
149+
150+
public bool IsSortedAscending
151+
{
152+
get => DirectorySortDirection == SortDirection.Ascending;
153+
set
154+
{
155+
DirectorySortDirection = value ? SortDirection.Ascending : SortDirection.Descending;
156+
NotifyPropertyChanged("IsSortedAscending");
157+
NotifyPropertyChanged("IsSortedDescending");
158+
NotifyPropertyChanged("DirectorySortDirection");
159+
}
160+
}
161+
162+
public bool IsSortedDescending
163+
{
164+
get => !IsSortedAscending;
165+
set
166+
{
167+
DirectorySortDirection = value ? SortDirection.Descending : SortDirection.Ascending;
168+
NotifyPropertyChanged("IsSortedAscending");
169+
NotifyPropertyChanged("IsSortedDescending");
170+
NotifyPropertyChanged("DirectorySortDirection");
171+
}
172+
}
173+
83174
public ItemViewModel()
84175
{
85176
_filesAndFolders = new ObservableCollection<ListedItem>();
@@ -813,5 +904,9 @@ await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPrio
813904
_filesRefreshing = false;
814905
Debug.WriteLine("Filesystem refresh complete");
815906
}
907+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
908+
{
909+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
910+
}
816911
}
817912
}

Files UWP/GenericFileBrowser.xaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,13 @@
158158
<MenuFlyoutSubItem.Icon>
159159
<FontIcon Glyph="&#xE8CB;"/>
160160
</MenuFlyoutSubItem.Icon>
161-
<uilib:RadioMenuFlyoutItem Text="Name" GroupName="SortGroup" IsChecked="{x:Bind IsSortedByName, Mode=TwoWay}"/>
162-
<uilib:RadioMenuFlyoutItem Text="Date modified" GroupName="SortGroup" IsChecked="{x:Bind IsSortedByDate, Mode=TwoWay}"/>
163-
<uilib:RadioMenuFlyoutItem Text="Type" GroupName="SortGroup" IsChecked="{x:Bind IsSortedByType, Mode=TwoWay}"/>
164-
<uilib:RadioMenuFlyoutItem Text="Size" GroupName="SortGroup" IsChecked="{x:Bind IsSortedBySize, Mode=TwoWay}"/>
161+
<uilib:RadioMenuFlyoutItem Text="Name" GroupName="SortGroup" IsChecked="{x:Bind viewModelInstance.IsSortedByName, Mode=TwoWay}"/>
162+
<uilib:RadioMenuFlyoutItem Text="Date modified" GroupName="SortGroup" IsChecked="{x:Bind viewModelInstance.IsSortedByDate, Mode=TwoWay}"/>
163+
<uilib:RadioMenuFlyoutItem Text="Type" GroupName="SortGroup" IsChecked="{x:Bind viewModelInstance.IsSortedByType, Mode=TwoWay}"/>
164+
<uilib:RadioMenuFlyoutItem Text="Size" GroupName="SortGroup" IsChecked="{x:Bind viewModelInstance.IsSortedBySize, Mode=TwoWay}"/>
165165
<MenuFlyoutSeparator/>
166-
<uilib:RadioMenuFlyoutItem Text="Ascending" GroupName="SortOrderGroup" IsChecked="{x:Bind IsSortedAscending, Mode=TwoWay}"/>
167-
<uilib:RadioMenuFlyoutItem Text="Descending" GroupName="SortOrderGroup" IsChecked="{x:Bind IsSortedDescending, Mode=TwoWay}"/>
166+
<uilib:RadioMenuFlyoutItem Text="Ascending" GroupName="SortOrderGroup" IsChecked="{x:Bind viewModelInstance.IsSortedAscending, Mode=TwoWay}"/>
167+
<uilib:RadioMenuFlyoutItem Text="Descending" GroupName="SortOrderGroup" IsChecked="{x:Bind viewModelInstance.IsSortedDescending, Mode=TwoWay}"/>
168168
</MenuFlyoutSubItem>
169169
<MenuFlyoutItem Text="Refresh" x:Name="RefreshEmptySpace">
170170
<MenuFlyoutItem.Icon>

Files UWP/GenericFileBrowser.xaml.cs

Lines changed: 36 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@
1010
using Files.Enums;
1111
using Files.Filesystem;
1212
using Files.Interacts;
13-
using System.Diagnostics;
14-
using Windows.UI.Core;
15-
using System.Text.RegularExpressions;
1613
using System.IO;
14+
using System.Runtime.CompilerServices;
1715

1816
namespace Files
1917
{
20-
public sealed partial class GenericFileBrowser : Page, INotifyPropertyChanged
18+
public sealed partial class GenericFileBrowser : Page
2119
{
2220
public TextBlock emptyTextGFB;
2321
public TextBlock textBlock;
@@ -37,8 +35,6 @@ public sealed partial class GenericFileBrowser : Page, INotifyPropertyChanged
3735
ItemViewModel viewModelInstance;
3836
ProHome tabInstance;
3937

40-
public event PropertyChangedEventHandler PropertyChanged;
41-
4238
public EmptyFolderTextState TextState { get; set; } = new EmptyFolderTextState();
4339

4440
public DataGridColumn SortedColumn
@@ -65,42 +61,12 @@ public DataGridColumn SortedColumn
6561
// Remove arrow on previous sorted column
6662
if (_sortedColumn != null)
6763
_sortedColumn.SortDirection = null;
68-
value.SortDirection = IsSortedAscending ? DataGridSortDirection.Ascending : DataGridSortDirection.Descending;
6964
}
65+
value.SortDirection = viewModelInstance.DirectorySortDirection == SortDirection.Ascending ? DataGridSortDirection.Ascending : DataGridSortDirection.Descending;
7066
_sortedColumn = value;
7167
}
7268
}
7369

74-
private bool IsSortedByName { get { return SortedColumn == nameColumn; } set { if (value) SortedColumn = nameColumn; } }
75-
private bool IsSortedByDate { get { return SortedColumn == dateColumn; } set { if (value) SortedColumn = dateColumn; } }
76-
private bool IsSortedByType { get { return SortedColumn == typeColumn; } set { if (value) SortedColumn = typeColumn; } }
77-
private bool IsSortedBySize { get { return SortedColumn == sizeColumn; } set { if (value) SortedColumn = sizeColumn; } }
78-
79-
private bool IsSortedAscending
80-
{
81-
get
82-
{
83-
return viewModelInstance.DirectorySortDirection == SortDirection.Ascending;
84-
}
85-
set
86-
{
87-
viewModelInstance.DirectorySortDirection = value ? SortDirection.Ascending : SortDirection.Descending;
88-
_sortedColumn.SortDirection = value ? DataGridSortDirection.Ascending : DataGridSortDirection.Descending;
89-
}
90-
}
91-
92-
private bool IsSortedDescending
93-
{
94-
get
95-
{
96-
return !IsSortedAscending;
97-
}
98-
set
99-
{
100-
IsSortedAscending = !value;
101-
}
102-
}
103-
10470
public GenericFileBrowser()
10571
{
10672
this.InitializeComponent();
@@ -154,9 +120,36 @@ public GenericFileBrowser()
154120
SortedColumn = typeColumn;
155121
break;
156122
case SortOption.Size:
157-
SortedColumn = nameColumn;
123+
SortedColumn = sizeColumn;
158124
break;
159125
}
126+
viewModelInstance.PropertyChanged += ViewModel_PropertyChanged;
127+
}
128+
129+
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
130+
{
131+
if (e.PropertyName == "DirectorySortOption")
132+
{
133+
switch (viewModelInstance.DirectorySortOption)
134+
{
135+
case SortOption.Name:
136+
SortedColumn = nameColumn;
137+
break;
138+
case SortOption.DateModified:
139+
SortedColumn = dateColumn;
140+
break;
141+
case SortOption.FileType:
142+
SortedColumn = typeColumn;
143+
break;
144+
case SortOption.Size:
145+
SortedColumn = sizeColumn;
146+
break;
147+
}
148+
} else if (e.PropertyName == "DirectorySortDirection")
149+
{
150+
// Swap arrows
151+
SortedColumn = _sortedColumn;
152+
}
160153
}
161154

162155
private void AddItem_Click(object sender, RoutedEventArgs e)
@@ -410,23 +403,10 @@ private void RightClickContextMenu_Opened(object sender, object e)
410403

411404
private void AllView_Sorting(object sender, DataGridColumnEventArgs e)
412405
{
413-
if (e.Column == iconColumn)
414-
return;
415-
if (SortedColumn == e.Column)
416-
IsSortedAscending = !IsSortedAscending;
417-
else
418-
{
419-
IsSortedAscending = true;
406+
if (e.Column == SortedColumn)
407+
viewModelInstance.IsSortedAscending = !viewModelInstance.IsSortedAscending;
408+
else if (e.Column != iconColumn)
420409
SortedColumn = e.Column;
421-
}
422-
423-
NotifyPropertyChanged("IsSortedAscending");
424-
NotifyPropertyChanged("IsSortedDescending");
425-
}
426-
427-
private void NotifyPropertyChanged(string info)
428-
{
429-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
430410
}
431411
}
432412

@@ -451,9 +431,9 @@ public Visibility isVisible
451431
}
452432
public event PropertyChangedEventHandler PropertyChanged;
453433

454-
private void NotifyPropertyChanged(string info)
434+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
455435
{
456-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
436+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
457437
}
458438
}
459439
}

Files UWP/Interacts/ItemInteractions.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel;
2+
using System.Runtime.CompilerServices;
23

34
namespace Files.Interacts
45
{
@@ -23,9 +24,9 @@ public bool isEnabled
2324
}
2425
public event PropertyChangedEventHandler PropertyChanged;
2526

26-
private void NotifyPropertyChanged(string info)
27+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
2728
{
28-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
29+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
2930
}
3031
}
3132

@@ -50,9 +51,9 @@ public bool isEnabled
5051
}
5152
public event PropertyChangedEventHandler PropertyChanged;
5253

53-
private void NotifyPropertyChanged(string info)
54+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
5455
{
55-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
56+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
5657
}
5758
}
5859

@@ -77,9 +78,9 @@ public bool isEnabled
7778
}
7879
public event PropertyChangedEventHandler PropertyChanged;
7980

80-
private void NotifyPropertyChanged(string info)
81+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
8182
{
82-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
83+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
8384
}
8485
}
8586
}

Files UWP/Interacts/RibbonActions/Home.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel;
2+
using System.Runtime.CompilerServices;
23

34
namespace Files.Interacts.Home
45
{
@@ -23,9 +24,9 @@ public bool isEnabled
2324
}
2425
public event PropertyChangedEventHandler PropertyChanged;
2526

26-
private void NotifyPropertyChanged(string info)
27+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
2728
{
28-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
29+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
2930
}
3031
}
3132
}

Files UWP/Interacts/RibbonActions/Layout.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel;
2+
using System.Runtime.CompilerServices;
23

34
namespace Files.Interacts.Layout
45
{
@@ -23,9 +24,9 @@ public bool isEnabled
2324
}
2425
public event PropertyChangedEventHandler PropertyChanged;
2526

26-
private void NotifyPropertyChanged(string info)
27+
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
2728
{
28-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
29+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
2930
}
3031
}
3132
}

0 commit comments

Comments
 (0)