diff --git a/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs b/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs index 7c71afa358..9b5c512756 100644 --- a/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs +++ b/src/GitHub.App/SampleData/PullRequestListViewModelDesigner.cs @@ -58,7 +58,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/GitHubPane/PullRequestListViewModel.cs b/src/GitHub.App/ViewModels/GitHubPane/PullRequestListViewModel.cs index 988cbe3c94..88f79ffb9d 100644 --- a/src/GitHub.App/ViewModels/GitHubPane/PullRequestListViewModel.cs +++ b/src/GitHub.App/ViewModels/GitHubPane/PullRequestListViewModel.cs @@ -41,10 +41,12 @@ public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListV public PullRequestListViewModel( IModelServiceFactory modelServiceFactory, IPackageSettings settings, + IPullRequestSessionManager sessionManager, IVisualStudioBrowser visualStudioBrowser) { Guard.ArgumentNotNull(modelServiceFactory, nameof(modelServiceFactory)); Guard.ArgumentNotNull(settings, nameof(settings)); + Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); Guard.ArgumentNotNull(visualStudioBrowser, nameof(visualStudioBrowser)); constructing = true; @@ -100,6 +102,19 @@ public PullRequestListViewModel( OpenPullRequestOnGitHub = ReactiveCommand.Create(); OpenPullRequestOnGitHub.Subscribe(x => DoOpenPullRequestOnGitHub((int)x)); + // Get the current pull request session and the 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; } @@ -245,6 +260,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/GitHubPane/IPullRequestListViewModel.cs b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestListViewModel.cs index 0c1b3f6ff8..5a7d91e3b6 100644 --- a/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestListViewModel.cs +++ b/src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestListViewModel.cs @@ -33,6 +33,7 @@ public interface IPullRequestListViewModel : ISearchablePageViewModel, IOpenInBr 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 20e9428cf4..ed3bbb281e 100644 --- a/src/GitHub.UI/GitHub.UI.csproj +++ b/src/GitHub.UI/GitHub.UI.csproj @@ -89,6 +89,7 @@ Spinner.xaml + diff --git a/src/GitHub.VisualStudio.UI/Styles/ThemeBlue.xaml b/src/GitHub.VisualStudio.UI/Styles/ThemeBlue.xaml index 281e058482..f2a8b1f284 100644 --- a/src/GitHub.VisualStudio.UI/Styles/ThemeBlue.xaml +++ b/src/GitHub.VisualStudio.UI/Styles/ThemeBlue.xaml @@ -63,4 +63,5 @@ + \ No newline at end of file diff --git a/src/GitHub.VisualStudio.UI/Styles/ThemeDark.xaml b/src/GitHub.VisualStudio.UI/Styles/ThemeDark.xaml index 52ec1f78da..2a2dd5f175 100644 --- a/src/GitHub.VisualStudio.UI/Styles/ThemeDark.xaml +++ b/src/GitHub.VisualStudio.UI/Styles/ThemeDark.xaml @@ -63,4 +63,5 @@ + \ No newline at end of file diff --git a/src/GitHub.VisualStudio.UI/Styles/ThemeLight.xaml b/src/GitHub.VisualStudio.UI/Styles/ThemeLight.xaml index 79610a3f9f..cbaa1fa55d 100644 --- a/src/GitHub.VisualStudio.UI/Styles/ThemeLight.xaml +++ b/src/GitHub.VisualStudio.UI/Styles/ThemeLight.xaml @@ -63,4 +63,5 @@ + \ No newline at end of file diff --git a/src/GitHub.VisualStudio/Views/GitHubPane/PullRequestListItem.xaml b/src/GitHub.VisualStudio/Views/GitHubPane/PullRequestListItem.xaml index a9aece170e..a413c38a7f 100644 --- a/src/GitHub.VisualStudio/Views/GitHubPane/PullRequestListItem.xaml +++ b/src/GitHub.VisualStudio/Views/GitHubPane/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.Views.GitHubPane"> @@ -15,135 +16,153 @@ - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - + + + + - + + + - - + + - - - - - - - - -