Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit f778c6c

Browse files
authored
Merge pull request #933 from github/grokys/refactor-idialogview
Move cancel/done/load signals to view models.
2 parents 584f70b + cf72e85 commit f778c6c

File tree

73 files changed

+501
-358
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+501
-358
lines changed

src/GitHub.App/Controllers/NavigationController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ void CreateOrReuseView(IConnection connection, ViewWithData data, Action<IView>
130130
{
131131
disposablesForCurrentView?.Clear();
132132

133-
var action = view as ICanLoad;
133+
var action = view.ViewModel as ICanNavigate;
134134
if (action != null)
135135
{
136-
disposablesForCurrentView.Add(action?.Load.Subscribe(d =>
136+
disposablesForCurrentView.Add(action?.Navigate.Subscribe(d =>
137137
{
138138
LoadView(connection, d, onViewLoad);
139139
}));

src/GitHub.App/Controllers/UIController.cs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ just so we can call the corresponding state machine that handles the logic (defi
8282
*/
8383

8484
using App.Factories;
85+
using ViewModels;
8586
using StateMachineType = StateMachine<UIViewType, UIController.Trigger>;
8687

8788
public class UIController : IUIController
@@ -524,13 +525,15 @@ void RunView(UIViewType viewType, ViewWithData arg = null)
524525
if (!firstTime)
525526
return;
526527

527-
SetupView(viewType, view);
528+
SetupView(viewType, view.ViewModel);
528529
}
529530

530-
void SetupView(UIViewType viewType, IView view)
531+
void SetupView(UIViewType viewType, IViewModel viewModel)
531532
{
532533
var list = GetObjectsForFlow(activeFlow);
533534
var pair = list[viewType];
535+
var hasDone = viewModel as IHasDone;
536+
var hasCancel = viewModel as IHasCancel;
534537

535538
// 2FA is set up when login is set up, so nothing to do
536539
if (viewType == UIViewType.TwoFactor)
@@ -543,29 +546,35 @@ void SetupView(UIViewType viewType, IView view)
543546
if (viewType == UIViewType.Login)
544547
{
545548
var pair2fa = list[UIViewType.TwoFactor];
546-
pair2fa.AddHandler(pair2fa.ViewModel.WhenAny(x => x.IsShowing, x => x.Value)
549+
pair2fa.AddHandler(((IDialogViewModel)pair2fa.ViewModel).WhenAny(x => x.IsShowing, x => x.Value)
547550
.Where(x => x)
548551
.ObserveOn(RxApp.MainThreadScheduler)
549552
.Subscribe(_ => Fire(Trigger.Next)));
550553

551-
pair2fa.AddHandler(pair2fa.View.Cancel
554+
pair2fa.AddHandler(((IHasCancel)pair2fa.ViewModel).Cancel
552555
.ObserveOn(RxApp.MainThreadScheduler)
553556
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
554557

555-
pair.AddHandler(view.Done
556-
.ObserveOn(RxApp.MainThreadScheduler)
557-
.Subscribe(_ => Fire(Trigger.Finish)));
558+
if (hasDone != null)
559+
{
560+
pair.AddHandler(hasDone.Done
561+
.ObserveOn(RxApp.MainThreadScheduler)
562+
.Subscribe(_ => Fire(Trigger.Finish)));
563+
}
558564
}
559-
else
565+
else if (hasDone != null)
560566
{
561-
pair.AddHandler(view.Done
567+
pair.AddHandler(hasDone.Done
562568
.ObserveOn(RxApp.MainThreadScheduler)
563569
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Next) ? Trigger.Next : Trigger.Finish)));
564570
}
565571

566-
pair.AddHandler(view.Cancel
567-
.ObserveOn(RxApp.MainThreadScheduler)
568-
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
572+
if (hasCancel != null)
573+
{
574+
pair.AddHandler(hasCancel.Cancel
575+
.ObserveOn(RxApp.MainThreadScheduler)
576+
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
577+
}
569578
}
570579

571580
/// <summary>

src/GitHub.App/GitHub.App.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
<Reference Include="WindowsBase" />
133133
</ItemGroup>
134134
<ItemGroup>
135+
<Compile Include="ViewModels\ViewModelBase.cs" />
135136
<None Include="..\..\script\Key.snk" Condition="$(Buildtype) == 'Internal'">
136137
<Link>Key.snk</Link>
137138
</None>
@@ -217,7 +218,8 @@
217218
<Compile Include="UserErrors\PublishRepositoryUserError.cs" />
218219
<Compile Include="UserErrors\PrivateRepositoryOnFreeAccountUserError.cs" />
219220
<Compile Include="UserErrors\PrivateRepositoryQuotaExceededUserError.cs" />
220-
<Compile Include="ViewModels\BaseViewModel.cs" />
221+
<Compile Include="ViewModels\PanePageViewModelBase.cs" />
222+
<Compile Include="ViewModels\DialogViewModelBase.cs" />
221223
<Compile Include="Models\ConnectionRepositoryHostMap.cs" />
222224
<Compile Include="ViewModels\GistCreationViewModel.cs" />
223225
<Compile Include="ViewModels\NotAGitRepositoryViewModel.cs" />

src/GitHub.App/SampleData/LoggedOutViewModelDesigner.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
3+
using System.Reactive;
34
using System.Reactive.Linq;
4-
using System.Windows.Input;
5-
using GitHub.Collections;
6-
using GitHub.Models;
75
using GitHub.ViewModels;
86

97
namespace GitHub.SampleData
108
{
119
[ExcludeFromCodeCoverage]
12-
public class LoggedOutViewModelDesigner : BaseViewModel, IViewModel
10+
public class LoggedOutViewModelDesigner : PanePageViewModelBase, IViewModel
1311
{
1412
public LoggedOutViewModelDesigner()
1513
{

src/GitHub.App/SampleData/PullRequestCreationViewModelDesigner.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
using GitHub.Models;
55
using GitHub.Validation;
66
using ReactiveUI;
7+
using System;
8+
using System.Reactive;
79

810
namespace GitHub.SampleData
911
{
1012
[ExcludeFromCodeCoverage]
11-
public class PullRequestCreationViewModelDesigner : BaseViewModel, IPullRequestCreationViewModel
13+
public class PullRequestCreationViewModelDesigner : DialogViewModelBase, IPullRequestCreationViewModel
1214
{
1315
public PullRequestCreationViewModelDesigner()
1416
{
@@ -46,5 +48,6 @@ public PullRequestCreationViewModelDesigner()
4648

4749
public ReactivePropertyValidator BranchValidator { get; }
4850

51+
public override IObservable<Unit> Done { get; }
4952
}
5053
}

src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class PullRequestUpdateStateDesigner : IPullRequestUpdateState
2525
}
2626

2727
[ExcludeFromCodeCoverage]
28-
public class PullRequestDetailViewModelDesigner : BaseViewModel, IPullRequestDetailViewModel
28+
public class PullRequestDetailViewModelDesigner : PanePageViewModelBase, IPullRequestDetailViewModel
2929
{
3030
public PullRequestDetailViewModelDesigner()
3131
{
@@ -70,6 +70,7 @@ public PullRequestDetailViewModelDesigner()
7070
public IPullRequestModel Model { get; }
7171
public string SourceBranchDisplayName { get; set; }
7272
public string TargetBranchDisplayName { get; set; }
73+
public bool IsBusy { get; }
7374
public bool IsCheckedOut { get; }
7475
public bool IsFromFork { get; }
7576
public string Body { get; }

src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
using ReactiveUI;
1010
using System.Collections.ObjectModel;
1111
using System.Linq;
12+
using GitHub.UI;
1213

1314
namespace GitHub.SampleData
1415
{
1516
[ExcludeFromCodeCoverage]
16-
public class PullRequestListViewModelDesigner : BaseViewModel, IPullRequestListViewModel
17+
public class PullRequestListViewModelDesigner : PanePageViewModelBase, IPullRequestListViewModel
1718
{
1819
public PullRequestListViewModelDesigner()
1920
{
@@ -56,7 +57,6 @@ public PullRequestListViewModelDesigner()
5657

5758
public ITrackingCollection<IPullRequestModel> PullRequests { get; set; }
5859
public IPullRequestModel SelectedPullRequest { get; set; }
59-
public ICommand OpenPullRequest { get; set; }
6060

6161
public IReadOnlyList<PullRequestState> States { get; set; }
6262
public PullRequestState SelectedState { get; set; }
@@ -66,5 +66,9 @@ public PullRequestListViewModelDesigner()
6666

6767
public ObservableCollection<IAccount> Assignees { get; set; }
6868
public IAccount SelectedAssignee { get; set; }
69+
public IObservable<ViewWithData> Navigate { get; }
70+
71+
public ReactiveCommand<object> OpenPullRequest { get; }
72+
public ReactiveCommand<object> CreatePullRequest { get; }
6973
}
7074
}

src/GitHub.App/SampleData/SampleViewModels.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
namespace GitHub.SampleData
2424
{
2525
[ExcludeFromCodeCoverage]
26-
public class RepositoryCreationViewModelDesigner : BaseViewModel, IRepositoryCreationViewModel
26+
public class RepositoryCreationViewModelDesigner : DialogViewModelBase, IRepositoryCreationViewModel
2727
{
2828
public RepositoryCreationViewModelDesigner()
2929
{
@@ -186,6 +186,8 @@ public LicenseItem SelectedLicense
186186
get;
187187
set;
188188
}
189+
190+
public override IObservable<Unit> Done { get; }
189191
}
190192

191193
[ExcludeFromCodeCoverage]
@@ -230,12 +232,6 @@ public bool IsHostComboBoxVisible
230232
}
231233
}
232234

233-
public bool IsPublishing
234-
{
235-
get;
236-
private set;
237-
}
238-
239235
public IReactiveCommand<ProgressState> PublishRepository
240236
{
241237
get;
@@ -329,7 +325,7 @@ public static IRemoteRepositoryModel Create(string name = null, string owner = n
329325
}
330326
}
331327

332-
public class RepositoryCloneViewModelDesigner : BaseViewModel, IRepositoryCloneViewModel
328+
public class RepositoryCloneViewModelDesigner : DialogViewModelBase, IRepositoryCloneViewModel
333329
{
334330
public RepositoryCloneViewModelDesigner()
335331
{
@@ -423,6 +419,8 @@ public ReactivePropertyValidator<string> BaseRepositoryPathValidator
423419
get;
424420
private set;
425421
}
422+
423+
public override IObservable<Unit> Done { get; }
426424
}
427425

428426
public class GitHubHomeSectionDesigner : IGitHubHomeSection

src/GitHub.App/SampleData/StartPageCloneViewModelDesigner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88

99
namespace GitHub.SampleData
1010
{
11-
public class StartPageCloneViewModelDesigner : BaseViewModel, IBaseCloneViewModel
11+
public class StartPageCloneViewModelDesigner : DialogViewModelBase, IBaseCloneViewModel
1212
{
1313
public string BaseRepositoryPath { get; set; }
1414
public ReactivePropertyValidator<string> BaseRepositoryPathValidator { get; }
1515
public ICommand BrowseForDirectory { get; }
1616
public IReactiveCommand<object> CloneCommand { get; }
1717
public IRepositoryModel SelectedRepository { get; set; }
18+
public override IObservable<Unit> Done { get; }
1819
}
1920
}

src/GitHub.App/Services/DialogService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Task<CloneDialogResult> ShowCloneDialog([AllowNull] IConnection connectio
3030
{
3131
var vm = x.View.ViewModel as IBaseCloneViewModel;
3232

33-
x.View.Done.Subscribe(_ =>
33+
vm.Done.Subscribe(_ =>
3434
{
3535
basePath = vm?.BaseRepositoryPath;
3636
repository = vm?.SelectedRepository;
@@ -58,7 +58,7 @@ public Task<string> ShowReCloneDialog(IRepositoryModel repository)
5858
vm.SelectedRepository = repository;
5959
}
6060

61-
x.View.Done.Subscribe(_ =>
61+
vm.Done.Subscribe(_ =>
6262
{
6363
basePath = vm?.BaseRepositoryPath;
6464
});

0 commit comments

Comments
 (0)