66using System . Reactive . Linq ;
77using System . Windows . Input ;
88using System . Windows . Media . Imaging ;
9+ using System . Windows . Threading ;
910using GitHub . Collections ;
1011using GitHub . Exports ;
1112using GitHub . Models ;
1213using GitHub . Services ;
14+ using GitHub . Settings ;
1315using GitHub . UI ;
1416using NullGuard ;
1517using ReactiveUI ;
@@ -25,17 +27,31 @@ public class PullRequestListViewModel : BaseViewModel, IPullRequestListViewModel
2527 readonly ISimpleRepositoryModel repository ;
2628 readonly TrackingCollection < IAccount > trackingAuthors ;
2729 readonly TrackingCollection < IAccount > trackingAssignees ;
30+ readonly IPackageSettings settings ;
31+ readonly PullRequestListUIState listSettings ;
32+ bool pullRequestsLoaded ;
2833
2934 [ ImportingConstructor ]
3035 PullRequestListViewModel (
31- IConnectionRepositoryHostMap connectionRepositoryHostMap , ITeamExplorerServiceHolder teservice )
32- : this ( connectionRepositoryHostMap . CurrentRepositoryHost , teservice . ActiveRepo )
33- { }
36+ IConnectionRepositoryHostMap connectionRepositoryHostMap ,
37+ ITeamExplorerServiceHolder teservice ,
38+ IPackageSettings settings )
39+ : this ( connectionRepositoryHostMap . CurrentRepositoryHost , teservice . ActiveRepo , settings )
40+ {
41+ }
3442
35- public PullRequestListViewModel ( IRepositoryHost repositoryHost , ISimpleRepositoryModel repository )
43+ public PullRequestListViewModel (
44+ IRepositoryHost repositoryHost ,
45+ ISimpleRepositoryModel repository ,
46+ IPackageSettings settings )
3647 {
3748 this . repositoryHost = repositoryHost ;
3849 this . repository = repository ;
50+ this . settings = settings ;
51+
52+ this . listSettings = settings . UIState
53+ . GetOrCreateRepositoryState ( repository . CloneUrl )
54+ . PullRequests ;
3955
4056 openPullRequestCommand = ReactiveCommand . Create ( ) ;
4157 openPullRequestCommand . Subscribe ( _ =>
@@ -48,23 +64,10 @@ public PullRequestListViewModel(IRepositoryHost repositoryHost, ISimpleRepositor
4864 new PullRequestState { IsOpen = false , Name = "Closed" } ,
4965 new PullRequestState { Name = "All" }
5066 } ;
51- SelectedState = States [ 0 ] ;
52-
53- this . WhenAny ( x => x . SelectedState , x => x . Value )
54- . Where ( x => PullRequests != null )
55- . Subscribe ( s => UpdateFilter ( s , SelectedAssignee , SelectedAuthor ) ) ;
56-
57- this . WhenAny ( x => x . SelectedAssignee , x => x . Value )
58- . Where ( x => PullRequests != null && x != EmptyUser )
59- . Subscribe ( a => UpdateFilter ( SelectedState , a , SelectedAuthor ) ) ;
60-
61- this . WhenAny ( x => x . SelectedAuthor , x => x . Value )
62- . Where ( x => PullRequests != null && x != EmptyUser )
63- . Subscribe ( a => UpdateFilter ( SelectedState , SelectedAssignee , a ) ) ;
6467
6568 trackingAuthors = new TrackingCollection < IAccount > ( Observable . Empty < IAccount > ( ) ,
6669 OrderedComparer < IAccount > . OrderByDescending ( x => x . Login ) . Compare ) ;
67- trackingAssignees = new TrackingCollection < IAccount > ( Observable . Empty < IAccount > ( ) ,
70+ trackingAssignees = new TrackingCollection < IAccount > ( Observable . Empty < IAccount > ( ) ,
6871 OrderedComparer < IAccount > . OrderByDescending ( x => x . Login ) . Compare ) ;
6972 trackingAuthors . Subscribe ( ) ;
7073 trackingAssignees . Subscribe ( ) ;
@@ -74,20 +77,53 @@ public PullRequestListViewModel(IRepositoryHost repositoryHost, ISimpleRepositor
7477
7578 PullRequests = new TrackingCollection < IPullRequestModel > ( ) ;
7679 pullRequests . Comparer = OrderedComparer < IPullRequestModel > . OrderByDescending ( x => x . UpdatedAt ) . Compare ;
77- pullRequests . Filter = ( pr , i , l ) => pr . IsOpen ;
7880 pullRequests . NewerComparer = OrderedComparer < IPullRequestModel > . OrderByDescending ( x => x . UpdatedAt ) . Compare ;
81+
82+ this . WhenAny ( x => x . SelectedState , x => x . Value )
83+ . Where ( x => PullRequests != null )
84+ . Subscribe ( s => UpdateFilter ( s , SelectedAssignee , SelectedAuthor ) ) ;
85+
86+ this . WhenAny ( x => x . SelectedAssignee , x => x . Value )
87+ . Where ( x => PullRequests != null && x != EmptyUser && pullRequestsLoaded )
88+ . Subscribe ( a => UpdateFilter ( SelectedState , a , SelectedAuthor ) ) ;
89+
90+ this . WhenAny ( x => x . SelectedAuthor , x => x . Value )
91+ . Where ( x => PullRequests != null && x != EmptyUser && pullRequestsLoaded )
92+ . Subscribe ( a => UpdateFilter ( SelectedState , SelectedAssignee , a ) ) ;
93+
94+ SelectedState = States . FirstOrDefault ( x => x . Name == listSettings . SelectedState ) ?? States [ 0 ] ;
7995 }
8096
8197 public override void Initialize ( [ AllowNull ] ViewWithData data )
8298 {
8399 base . Initialize ( data ) ;
84100
101+ pullRequestsLoaded = false ;
102+
85103 PullRequests = repositoryHost . ModelService . GetPullRequests ( repository , pullRequests ) ;
86104 pullRequests . Subscribe ( pr =>
87105 {
88106 trackingAssignees . AddItem ( pr . Assignee ) ;
89107 trackingAuthors . AddItem ( pr . Author ) ;
90108 } , ( ) => { } ) ;
109+
110+ pullRequests . OriginalCompleted
111+ . ObserveOn ( RxApp . MainThreadScheduler )
112+ . Subscribe ( _ =>
113+ {
114+ if ( listSettings . SelectedAuthor != null )
115+ {
116+ SelectedAuthor = Authors . FirstOrDefault ( x => x . Login == listSettings . SelectedAuthor ) ;
117+ }
118+
119+ if ( listSettings . SelectedAssignee != null )
120+ {
121+ SelectedAssignee = Assignees . FirstOrDefault ( x => x . Login == listSettings . SelectedAssignee ) ;
122+ }
123+
124+ pullRequestsLoaded = true ;
125+ UpdateFilter ( SelectedState , SelectedAssignee , SelectedAuthor ) ;
126+ } ) ;
91127 }
92128
93129 void UpdateFilter ( PullRequestState state , [ AllowNull ] IAccount ass , [ AllowNull ] IAccount aut )
@@ -132,6 +168,7 @@ public IReadOnlyList<PullRequestState> States
132168 PullRequestState selectedState ;
133169 public PullRequestState SelectedState
134170 {
171+ [ return : AllowNull ]
135172 get { return selectedState ; }
136173 set { this . RaiseAndSetIfChanged ( ref selectedState , value ) ; }
137174 }
@@ -174,7 +211,6 @@ public IAccount EmptyUser
174211 get { return emptyUser ; }
175212 }
176213
177-
178214 bool disposed ;
179215 protected void Dispose ( bool disposing )
180216 {
@@ -184,6 +220,7 @@ protected void Dispose(bool disposing)
184220 pullRequests . Dispose ( ) ;
185221 trackingAuthors . Dispose ( ) ;
186222 trackingAssignees . Dispose ( ) ;
223+ SaveSettings ( ) ;
187224 disposed = true ;
188225 }
189226 }
@@ -193,5 +230,13 @@ public void Dispose()
193230 Dispose ( true ) ;
194231 GC . SuppressFinalize ( this ) ;
195232 }
233+
234+ void SaveSettings ( )
235+ {
236+ listSettings . SelectedState = SelectedState . Name ;
237+ listSettings . SelectedAssignee = SelectedAssignee ? . Login ;
238+ listSettings . SelectedAuthor = SelectedAuthor ? . Login ;
239+ settings . Save ( ) ;
240+ }
196241 }
197242}
0 commit comments