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

Commit 5ede6bc

Browse files
committed
Make ChangedFilesTree a read-only list.
Rather than using a reactive list and clearing and rebuilding on refresh, expose a read-only list and completely replace it on refresh. This prevents the UI jumping around as the list is cleared and rebuilt.
1 parent abc1415 commit 5ede6bc

File tree

3 files changed

+16
-14
lines changed

3 files changed

+16
-14
lines changed

src/GitHub.App/SampleData/PullRequestDetailViewModelDesigner.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics.CodeAnalysis;
34
using System.Reactive;
45
using System.Threading.Tasks;
@@ -27,6 +28,8 @@ public class PullRequestUpdateStateDesigner : IPullRequestUpdateState
2728
[ExcludeFromCodeCoverage]
2829
public class PullRequestDetailViewModelDesigner : PanePageViewModelBase, IPullRequestDetailViewModel
2930
{
31+
private List<IPullRequestChangeNode> changedFilesTree;
32+
3033
public PullRequestDetailViewModelDesigner()
3134
{
3235
var repoPath = @"C:\Repo";
@@ -63,8 +66,8 @@ public PullRequestDetailViewModelDesigner()
6366
modelsDir.Files.Add(oldBranchModel);
6467
gitHubDir.Directories.Add(modelsDir);
6568

66-
ChangedFilesTree = new ReactiveList<IPullRequestChangeNode>();
67-
ChangedFilesTree.Add(gitHubDir);
69+
changedFilesTree = new List<IPullRequestChangeNode>();
70+
changedFilesTree.Add(gitHubDir);
6871
}
6972

7073
public IPullRequestModel Model { get; }
@@ -74,7 +77,7 @@ public PullRequestDetailViewModelDesigner()
7477
public bool IsBusy { get; }
7578
public bool IsFromFork { get; }
7679
public string Body { get; }
77-
public IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; }
80+
public IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree => changedFilesTree;
7881
public IPullRequestCheckoutState CheckoutState { get; set; }
7982
public IPullRequestUpdateState UpdateState { get; set; }
8083
public string OperationError { get; set; }

src/GitHub.App/ViewModels/PullRequestDetailViewModel.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class PullRequestDetailViewModel : PanePageViewModelBase, IPullRequestDet
3535
string sourceBranchDisplayName;
3636
string targetBranchDisplayName;
3737
string body;
38+
IReadOnlyList<IPullRequestChangeNode> changedFilesTree;
3839
IPullRequestCheckoutState checkoutState;
3940
IPullRequestUpdateState updateState;
4041
string operationError;
@@ -213,7 +214,11 @@ public string OperationError
213214
/// <summary>
214215
/// Gets the changed files as a tree.
215216
/// </summary>
216-
public IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; } = new ReactiveList<IPullRequestChangeNode>();
217+
public IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree
218+
{
219+
get { return changedFilesTree; }
220+
private set { this.RaiseAndSetIfChanged(ref changedFilesTree, value); }
221+
}
217222

218223
/// <summary>
219224
/// Gets a command that checks out the pull request locally.
@@ -280,15 +285,8 @@ public async Task Load(IPullRequestModel pullRequest)
280285
TargetBranchDisplayName = GetBranchDisplayName(IsFromFork, pullRequest.Base.Label);
281286
Body = !string.IsNullOrWhiteSpace(pullRequest.Body) ? pullRequest.Body : Resources.NoDescriptionProvidedMarkdown;
282287

283-
ChangedFilesTree.Clear();
284-
285-
var treeChanges = await pullRequestsService.GetTreeChanges(repository, pullRequest);
286-
287-
// WPF doesn't support AddRange here so iterate through the changes.
288-
foreach (var change in CreateChangedFilesTree(pullRequest, treeChanges).Children)
289-
{
290-
ChangedFilesTree.Add(change);
291-
}
288+
var changes = await pullRequestsService.GetTreeChanges(repository, pullRequest);
289+
ChangedFilesTree = CreateChangedFilesTree(pullRequest, changes).Children.ToList();
292290

293291
var localBranches = await pullRequestsService.GetLocalBranches(repository, pullRequest).ToList();
294292
var isCheckedOut = localBranches.Contains(repository.CurrentBranch);

src/GitHub.Exports.Reactive/ViewModels/IPullRequestDetailViewModel.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Reactive;
34
using System.Threading.Tasks;
45
using GitHub.Models;
@@ -92,7 +93,7 @@ public interface IPullRequestDetailViewModel : IViewModel, IHasLoading, IHasBusy
9293
/// <summary>
9394
/// Gets the changed files as a tree.
9495
/// </summary>
95-
IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; }
96+
IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree { get; }
9697

9798
/// <summary>
9899
/// Gets the state associated with the <see cref="Checkout"/> command.

0 commit comments

Comments
 (0)