1
1
using System . ComponentModel ;
2
2
using System . Reactive ;
3
3
using System . Reactive . Disposables ;
4
+ using System . Reactive . Linq ;
4
5
using Avalonia . Controls . Models . TreeDataGrid ;
5
6
using DynamicData ;
6
7
using DynamicData . Binding ;
@@ -23,7 +24,7 @@ public class LoadOrderViewModel : AViewModel<ILoadOrderViewModel>, ILoadOrderVie
23
24
public ReactiveCommand < Unit , Unit > InfoAlertCommand { get ; } = ReactiveCommand . Create ( ( ) => { } ) ;
24
25
public string TrophyToolTip { get ; }
25
26
[ Reactive ] public ListSortDirection SortDirectionCurrent { get ; set ; }
26
- [ Reactive ] public bool IsWinnerTop { get ; set ; }
27
+ [ Reactive ] public bool IsWinnerTop { get ; private set ; }
27
28
public string EmptyStateMessageTitle { get ; }
28
29
public string EmptyStateMessageContents { get ; }
29
30
@@ -32,30 +33,40 @@ public class LoadOrderViewModel : AViewModel<ILoadOrderViewModel>, ILoadOrderVie
32
33
public LoadOrderViewModel ( LoadoutId loadoutId , ISortableItemProviderFactory itemProviderFactory )
33
34
{
34
35
var provider = itemProviderFactory . GetLoadoutSortableItemProvider ( loadoutId ) ;
35
-
36
+
36
37
SortOrderName = itemProviderFactory . SortOrderName ;
37
38
InfoAlertTitle = itemProviderFactory . OverrideInfoTitle ;
38
39
InfoAlertHeading = itemProviderFactory . OverrideInfoHeading ;
39
40
InfoAlertMessage = itemProviderFactory . OverrideInfoMessage ;
40
41
TrophyToolTip = itemProviderFactory . WinnerIndexToolTip ;
41
42
EmptyStateMessageTitle = itemProviderFactory . EmptyStateMessageTitle ;
42
43
EmptyStateMessageContents = itemProviderFactory . EmptyStateMessageContents ;
43
-
44
+
44
45
// TODO: load these from settings
45
46
SortDirectionCurrent = itemProviderFactory . SortDirectionDefault ;
46
- IsWinnerTop = itemProviderFactory . IndexOverrideBehavior == IndexOverrideBehavior . SmallerIndexWins &&
47
- SortDirectionCurrent == ListSortDirection . Ascending ;
48
47
InfoAlertIsVisible = true ;
49
48
50
-
51
- Adapter = new LoadOrderTreeDataGridAdapter ( provider ) ;
49
+ IsWinnerTop = SortDirectionCurrent == ListSortDirection . Ascending &&
50
+ itemProviderFactory . IndexOverrideBehavior == IndexOverrideBehavior . SmallerIndexWins ;
51
+
52
+ var sortDirectionObservable = this . WhenAnyValue ( vm => vm . SortDirectionCurrent ) ;
53
+ Adapter = new LoadOrderTreeDataGridAdapter ( provider , sortDirectionObservable ) ;
52
54
Adapter . ViewHierarchical . Value = true ;
53
55
54
56
this . WhenActivated ( d =>
55
57
{
56
58
Adapter . Activate ( ) ;
57
59
Disposable . Create ( ( ) => Adapter . Deactivate ( ) )
58
60
. DisposeWith ( d ) ;
61
+
62
+ sortDirectionObservable . Subscribe ( sortDirection =>
63
+ {
64
+ var isAscending = sortDirection == ListSortDirection . Ascending ;
65
+ IsWinnerTop = isAscending &&
66
+ itemProviderFactory . IndexOverrideBehavior == IndexOverrideBehavior . SmallerIndexWins ;
67
+ }
68
+ )
69
+ . DisposeWith ( d ) ;
59
70
}
60
71
) ;
61
72
}
@@ -64,17 +75,34 @@ public LoadOrderViewModel(LoadoutId loadoutId, ISortableItemProviderFactory item
64
75
public class LoadOrderTreeDataGridAdapter : TreeDataGridAdapter < ILoadOrderItemModel , Guid >
65
76
{
66
77
private ILoadoutSortableItemProvider _sortableItemsProvider ;
78
+ private IObservable < ListSortDirection > _sortDirectionObservable ;
67
79
68
- public LoadOrderTreeDataGridAdapter ( ILoadoutSortableItemProvider sortableItemsProvider )
80
+ public LoadOrderTreeDataGridAdapter ( ILoadoutSortableItemProvider sortableItemsProvider , IObservable < ListSortDirection > sortDirectionObservable )
69
81
{
70
82
_sortableItemsProvider = sortableItemsProvider ;
83
+ _sortDirectionObservable = sortDirectionObservable ;
71
84
}
72
85
73
86
protected override IObservable < IChangeSet < ILoadOrderItemModel , Guid > > GetRootsObservable ( bool viewHierarchical )
74
87
{
75
- return _sortableItemsProvider . SortableItems
76
- . ToObservableChangeSet ( item => item . ItemId )
77
- . Transform ( item => ( ILoadOrderItemModel ) new LoadOrderItemModel ( item ) ) ;
88
+ var sortableItems = _sortableItemsProvider . SortableItems
89
+ . ToObservableChangeSet ( item => item . ItemId ) ;
90
+
91
+ var ascendingSortableItems = sortableItems
92
+ . ToSortedCollection ( item => item . SortIndex , SortDirection . Ascending )
93
+ . ToObservableChangeSet ( item => item . ItemId ) ;
94
+
95
+ var descendingSortableItems = sortableItems
96
+ . ToSortedCollection ( item => item . SortIndex , SortDirection . Descending )
97
+ . ToObservableChangeSet ( item => item . ItemId ) ;
98
+
99
+ // Sort the items based on SortDirection
100
+ var sortedItems = _sortDirectionObservable
101
+ . Select ( direction => direction == ListSortDirection . Ascending ? ascendingSortableItems : descendingSortableItems )
102
+ . Switch ( )
103
+ . Transform ( ILoadOrderItemModel ( item ) => new LoadOrderItemModel ( item ) ) ;
104
+
105
+ return sortedItems ;
78
106
}
79
107
80
108
protected override IColumn < ILoadOrderItemModel > [ ] CreateColumns ( bool viewHierarchical )
@@ -83,10 +111,10 @@ protected override IColumn<ILoadOrderItemModel>[] CreateColumns(bool viewHierarc
83
111
[
84
112
// TODO: Use <see cref="ColumnCreator"/> to create the columns using interfaces
85
113
new HierarchicalExpanderColumn < ILoadOrderItemModel > (
86
- inner : CreateIndexColumn ( _sortableItemsProvider . ParentFactory . IndexColumnHeader ) ,
87
- childSelector : static model => model . Children ,
88
- hasChildrenSelector : static model => model . HasChildren . Value ,
89
- isExpandedSelector : static model => model . IsExpanded
114
+ inner : CreateIndexColumn ( _sortableItemsProvider . ParentFactory . IndexColumnHeader ) ,
115
+ childSelector : static model => model . Children ,
116
+ hasChildrenSelector : static model => model . HasChildren . Value ,
117
+ isExpandedSelector : static model => model . IsExpanded
90
118
)
91
119
{
92
120
Tag = "expander" ,
0 commit comments