From 34b39f2cfef1dab04b7aec2d1f1e7af7f141a997 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 3 Aug 2017 12:01:15 +0200 Subject: [PATCH 1/5] Highlight checked out PR in list. --- .../PullRequestListViewModelDesigner.cs | 2 +- .../ViewModels/PullRequestListViewModel.cs | 31 ++- .../ViewModels/IPullRequestListViewModel.cs | 1 + src/GitHub.UI/Converters/EqualityConverter.cs | 33 +++ src/GitHub.UI/GitHub.UI.csproj | 1 + .../Views/Controls/PullRequestListItem.xaml | 245 ++++++++++-------- .../UI/Views/PullRequestListView.xaml | 2 - 7 files changed, 196 insertions(+), 119 deletions(-) create mode 100644 src/GitHub.UI/Converters/EqualityConverter.cs diff --git a/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs b/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs index 70153645fe..da39f3a142 100644 --- a/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs +++ b/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs @@ -57,7 +57,7 @@ public PullRequestListViewModelDesigner() public IReadOnlyList Repositories { get; } public IRemoteRepositoryModel SelectedRepository { get; set; } - + public IPullRequestModel CheckedOutPullRequest { get; set; } public ITrackingCollection PullRequests { get; set; } public IPullRequestModel SelectedPullRequest { get; set; } diff --git a/src/GitHub.App/ViewModels/PullRequestListViewModel.cs b/src/GitHub.App/ViewModels/PullRequestListViewModel.cs index bfeba84293..72ca11b8d5 100644 --- a/src/GitHub.App/ViewModels/PullRequestListViewModel.cs +++ b/src/GitHub.App/ViewModels/PullRequestListViewModel.cs @@ -40,22 +40,26 @@ public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListV PullRequestListViewModel( IConnectionRepositoryHostMap connectionRepositoryHostMap, ITeamExplorerServiceHolder teservice, - IPackageSettings settings) - : this(connectionRepositoryHostMap.CurrentRepositoryHost, teservice.ActiveRepo, settings) + IPackageSettings settings, + IPullRequestSessionManager sessionManager) + : this(connectionRepositoryHostMap.CurrentRepositoryHost, teservice.ActiveRepo, settings, sessionManager) { Guard.ArgumentNotNull(connectionRepositoryHostMap, nameof(connectionRepositoryHostMap)); Guard.ArgumentNotNull(teservice, nameof(teservice)); Guard.ArgumentNotNull(settings, nameof(settings)); + Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); } public PullRequestListViewModel( IRepositoryHost repositoryHost, ILocalRepositoryModel repository, - IPackageSettings settings) + IPackageSettings settings, + IPullRequestSessionManager sessionManager) { Guard.ArgumentNotNull(repositoryHost, nameof(repositoryHost)); Guard.ArgumentNotNull(repository, nameof(repository)); Guard.ArgumentNotNull(settings, nameof(settings)); + Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); constructing = true; this.repositoryHost = repositoryHost; @@ -108,6 +112,20 @@ public PullRequestListViewModel( CreatePullRequest = ReactiveCommand.Create(); CreatePullRequest.Subscribe(_ => DoCreatePullRequest()); + // Get the current pull request session and the this list's selected repository. + // When the session's repository is the same as our selected repository set + // CheckedOutPullRequest to the current session's model, so that the checked out + // PR can be highlighted. + Observable.CombineLatest( + sessionManager.WhenAnyValue(x => x.CurrentSession), + this.WhenAnyValue(x => x.SelectedRepository), + (s, r) => new { Session = s, Repository = r }) + .Subscribe(x => + { + CheckedOutPullRequest = x.Session?.RepositoryOwner == x.Repository?.Owner ? + x.Session?.PullRequest : null; + }); + constructing = false; } @@ -215,6 +233,13 @@ public IPullRequestModel SelectedPullRequest set { this.RaiseAndSetIfChanged(ref selectedPullRequest, value); } } + IPullRequestModel checkedOutPullRequest; + public IPullRequestModel CheckedOutPullRequest + { + get { return checkedOutPullRequest; } + set { this.RaiseAndSetIfChanged(ref checkedOutPullRequest, value); } + } + IReadOnlyList states; public IReadOnlyList States { diff --git a/src/GitHub.Exports.Reactive/ViewModels/IPullRequestListViewModel.cs b/src/GitHub.Exports.Reactive/ViewModels/IPullRequestListViewModel.cs index e5965e6181..ce49780cf3 100644 --- a/src/GitHub.Exports.Reactive/ViewModels/IPullRequestListViewModel.cs +++ b/src/GitHub.Exports.Reactive/ViewModels/IPullRequestListViewModel.cs @@ -33,6 +33,7 @@ public interface IPullRequestListViewModel : IViewModel, ICanNavigate, IHasBusy IRemoteRepositoryModel SelectedRepository { get; set; } ITrackingCollection PullRequests { get; } IPullRequestModel SelectedPullRequest { get; } + IPullRequestModel CheckedOutPullRequest { get; } IReadOnlyList States { get; set; } PullRequestState SelectedState { get; set; } ObservableCollection Authors { get; } diff --git a/src/GitHub.UI/Converters/EqualityConverter.cs b/src/GitHub.UI/Converters/EqualityConverter.cs new file mode 100644 index 0000000000..4750aa65f2 --- /dev/null +++ b/src/GitHub.UI/Converters/EqualityConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using System.Windows; + +namespace GitHub.UI +{ + [Localizability(LocalizationCategory.NeverLocalize)] + public sealed class EqualityConverter : MultiValueConverterMarkupExtension + { + public override object Convert( + object[] value, + Type targetType, + object parameter, + CultureInfo culture) + { + if (value.Length == 2) + { + return Equals(value[0], value[1]); + } + + return false; + } + + public override object[] ConvertBack( + object value, + Type[] targetType, + object parameter, + CultureInfo culture) + { + return null; + } + } +} diff --git a/src/GitHub.UI/GitHub.UI.csproj b/src/GitHub.UI/GitHub.UI.csproj index 754bbe4db5..71b8a04708 100644 --- a/src/GitHub.UI/GitHub.UI.csproj +++ b/src/GitHub.UI/GitHub.UI.csproj @@ -85,6 +85,7 @@ Spinner.xaml + diff --git a/src/GitHub.VisualStudio/UI/Views/Controls/PullRequestListItem.xaml b/src/GitHub.VisualStudio/UI/Views/Controls/PullRequestListItem.xaml index e6b43efe3d..f8064fa5bf 100644 --- a/src/GitHub.VisualStudio/UI/Views/Controls/PullRequestListItem.xaml +++ b/src/GitHub.VisualStudio/UI/Views/Controls/PullRequestListItem.xaml @@ -7,7 +7,8 @@ xmlns:viewmodels="clr-namespace:GitHub.ViewModels;assembly=GitHub.Exports.Reactive" xmlns:vsui="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.14.0" xmlns:ui="clr-namespace:GitHub.UI;assembly=GitHub.UI" - xmlns:prop="clr-namespace:GitHub.VisualStudio.UI;assembly=GitHub.VisualStudio.UI"> + xmlns:prop="clr-namespace:GitHub.VisualStudio.UI;assembly=GitHub.VisualStudio.UI" + xmlns:views="clr-namespace:GitHub.VisualStudio.UI.Views"> @@ -15,135 +16,153 @@ - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - + + + + - + + + - - + + - - - - - - - - -