mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-23 20:47:25 -08:00
fix: ahead/behind indicator of commit in histories view not updated after upstream changed
This commit is contained in:
parent
ce7420354d
commit
c596427380
6 changed files with 99 additions and 29 deletions
|
@ -25,8 +25,6 @@ namespace SourceGit.Models
|
||||||
public bool HasDecorators => Decorators.Count > 0;
|
public bool HasDecorators => Decorators.Count > 0;
|
||||||
|
|
||||||
public bool IsMerged { get; set; } = false;
|
public bool IsMerged { get; set; } = false;
|
||||||
public bool CanPushToUpstream { get; set; } = false;
|
|
||||||
public bool CanPullFromUpstream { get; set; } = false;
|
|
||||||
public Thickness Margin { get; set; } = new Thickness(0);
|
public Thickness Margin { get; set; } = new Thickness(0);
|
||||||
|
|
||||||
public string AuthorTimeStr => DateTime.UnixEpoch.AddSeconds(AuthorTime).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss");
|
public string AuthorTimeStr => DateTime.UnixEpoch.AddSeconds(AuthorTime).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss");
|
||||||
|
|
|
@ -128,7 +128,7 @@ namespace SourceGit.Models
|
||||||
_penCount = colors.Count;
|
_penCount = colors.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommitGraph Parse(List<Commit> commits, HashSet<string> canPushCommits, HashSet<string> canPullCommits)
|
public static CommitGraph Parse(List<Commit> commits)
|
||||||
{
|
{
|
||||||
double UNIT_WIDTH = 12;
|
double UNIT_WIDTH = 12;
|
||||||
double HALF_WIDTH = 6;
|
double HALF_WIDTH = 6;
|
||||||
|
@ -148,9 +148,6 @@ namespace SourceGit.Models
|
||||||
var isMerged = commit.IsMerged;
|
var isMerged = commit.IsMerged;
|
||||||
var oldCount = unsolved.Count;
|
var oldCount = unsolved.Count;
|
||||||
|
|
||||||
commit.CanPushToUpstream = canPushCommits.Remove(commit.SHA);
|
|
||||||
commit.CanPullFromUpstream = canPullCommits.Remove(commit.SHA);
|
|
||||||
|
|
||||||
// Update current y offset
|
// Update current y offset
|
||||||
offsetY += UNIT_HEIGHT;
|
offsetY += UNIT_HEIGHT;
|
||||||
|
|
||||||
|
|
|
@ -749,20 +749,8 @@ namespace SourceGit.ViewModels
|
||||||
limits += "--branches --remotes --tags";
|
limits += "--branches --remotes --tags";
|
||||||
}
|
}
|
||||||
|
|
||||||
var canPushCommits = new HashSet<string>();
|
|
||||||
var canPullCommits = new HashSet<string>();
|
|
||||||
var currentBranch = _branches.Find(x => x.IsCurrent);
|
|
||||||
if (currentBranch != null)
|
|
||||||
{
|
|
||||||
foreach (var sha in currentBranch.TrackStatus.Ahead)
|
|
||||||
canPushCommits.Add(sha);
|
|
||||||
|
|
||||||
foreach (var sha in currentBranch.TrackStatus.Behind)
|
|
||||||
canPullCommits.Add(sha);
|
|
||||||
}
|
|
||||||
|
|
||||||
var commits = new Commands.QueryCommits(_fullpath, limits).Result();
|
var commits = new Commands.QueryCommits(_fullpath, limits).Result();
|
||||||
var graph = Models.CommitGraph.Parse(commits, canPushCommits, canPullCommits);
|
var graph = Models.CommitGraph.Parse(commits);
|
||||||
|
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,15 +62,10 @@
|
||||||
<DataTemplate x:DataType="{x:Type m:Commit}">
|
<DataTemplate x:DataType="{x:Type m:Commit}">
|
||||||
<Border Margin="{Binding Margin}">
|
<Border Margin="{Binding Margin}">
|
||||||
<StackPanel Orientation="Horizontal" Margin="2,0,0,0">
|
<StackPanel Orientation="Horizontal" Margin="2,0,0,0">
|
||||||
<Ellipse Width="5" Height="5"
|
<v:CommitStatusIndicator CurrentBranch="{Binding $parent[v:Histories].CurrentBranch}"
|
||||||
Margin="0,0,4,0"
|
AheadBrush="{DynamicResource Brush.Accent}"
|
||||||
Fill="{DynamicResource Brush.Accent}"
|
BehindBrush="{DynamicResource Brush.FG1}"
|
||||||
IsVisible="{Binding CanPushToUpstream}"/>
|
VerticalAlignment="Center"/>
|
||||||
|
|
||||||
<Ellipse Width="5" Height="5"
|
|
||||||
Margin="0,0,4,0"
|
|
||||||
Fill="{DynamicResource Brush.FG1}"
|
|
||||||
IsVisible="{Binding CanPullFromUpstream}"/>
|
|
||||||
|
|
||||||
<v:CommitRefsPresenter IsVisible="{Binding HasDecorators}"
|
<v:CommitRefsPresenter IsVisible="{Binding HasDecorators}"
|
||||||
IconBackground="{DynamicResource Brush.DecoratorIconBG}"
|
IconBackground="{DynamicResource Brush.DecoratorIconBG}"
|
||||||
|
|
|
@ -74,6 +74,88 @@ namespace SourceGit.Views
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CommitStatusIndicator : Control
|
||||||
|
{
|
||||||
|
public static readonly StyledProperty<Models.Branch> CurrentBranchProperty =
|
||||||
|
AvaloniaProperty.Register<CommitStatusIndicator, Models.Branch>(nameof(CurrentBranch));
|
||||||
|
|
||||||
|
public Models.Branch CurrentBranch
|
||||||
|
{
|
||||||
|
get => GetValue(CurrentBranchProperty);
|
||||||
|
set => SetValue(CurrentBranchProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly StyledProperty<IBrush> AheadBrushProperty =
|
||||||
|
AvaloniaProperty.Register<CommitStatusIndicator, IBrush>(nameof(AheadBrush));
|
||||||
|
|
||||||
|
public IBrush AheadBrush
|
||||||
|
{
|
||||||
|
get => GetValue(AheadBrushProperty);
|
||||||
|
set => SetValue(AheadBrushProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly StyledProperty<IBrush> BehindBrushProperty =
|
||||||
|
AvaloniaProperty.Register<CommitStatusIndicator, IBrush>(nameof(BehindBrush));
|
||||||
|
|
||||||
|
public IBrush BehindBrush
|
||||||
|
{
|
||||||
|
get => GetValue(BehindBrushProperty);
|
||||||
|
set => SetValue(BehindBrushProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Status
|
||||||
|
{
|
||||||
|
Normal,
|
||||||
|
Ahead,
|
||||||
|
Behind,
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Render(DrawingContext context)
|
||||||
|
{
|
||||||
|
if (_status == Status.Normal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
context.DrawEllipse(_status == Status.Ahead ? AheadBrush : BehindBrush, null, new Rect(0, 0, 5, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Size MeasureOverride(Size availableSize)
|
||||||
|
{
|
||||||
|
if (DataContext is Models.Commit commit && CurrentBranch is not null)
|
||||||
|
{
|
||||||
|
var sha = commit.SHA;
|
||||||
|
var track = CurrentBranch.TrackStatus;
|
||||||
|
|
||||||
|
if (track.Ahead.Contains(sha))
|
||||||
|
_status = Status.Ahead;
|
||||||
|
else if (track.Behind.Contains(sha))
|
||||||
|
_status = Status.Behind;
|
||||||
|
else
|
||||||
|
_status = Status.Normal;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_status = Status.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _status == Status.Normal ? new Size(0, 0) : new Size(9, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDataContextChanged(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnDataContextChanged(e);
|
||||||
|
InvalidateMeasure();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
||||||
|
{
|
||||||
|
base.OnPropertyChanged(change);
|
||||||
|
if (change.Property == CurrentBranchProperty)
|
||||||
|
InvalidateMeasure();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Status _status = Status.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
public class CommitSubjectPresenter : TextBlock
|
public class CommitSubjectPresenter : TextBlock
|
||||||
{
|
{
|
||||||
public static readonly StyledProperty<string> SubjectProperty =
|
public static readonly StyledProperty<string> SubjectProperty =
|
||||||
|
@ -450,6 +532,15 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
public partial class Histories : UserControl
|
public partial class Histories : UserControl
|
||||||
{
|
{
|
||||||
|
public static readonly StyledProperty<Models.Branch> CurrentBranchProperty =
|
||||||
|
AvaloniaProperty.Register<Histories, Models.Branch>(nameof(CurrentBranch));
|
||||||
|
|
||||||
|
public Models.Branch CurrentBranch
|
||||||
|
{
|
||||||
|
get => GetValue(CurrentBranchProperty);
|
||||||
|
set => SetValue(CurrentBranchProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
public static readonly StyledProperty<long> NavigationIdProperty =
|
public static readonly StyledProperty<long> NavigationIdProperty =
|
||||||
AvaloniaProperty.Register<Histories, long>(nameof(NavigationId));
|
AvaloniaProperty.Register<Histories, long>(nameof(NavigationId));
|
||||||
|
|
||||||
|
|
|
@ -728,7 +728,8 @@
|
||||||
<ContentControl Grid.Row="2" Content="{Binding SelectedView}">
|
<ContentControl Grid.Row="2" Content="{Binding SelectedView}">
|
||||||
<ContentControl.DataTemplates>
|
<ContentControl.DataTemplates>
|
||||||
<DataTemplate DataType="vm:Histories">
|
<DataTemplate DataType="vm:Histories">
|
||||||
<v:Histories NavigationId="{Binding NavigationId}"/>
|
<v:Histories CurrentBranch="{Binding $parent[v:Repository].((vm:Repository)DataContext).CurrentBranch}"
|
||||||
|
NavigationId="{Binding NavigationId}"/>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
<DataTemplate DataType="vm:WorkingCopy">
|
<DataTemplate DataType="vm:WorkingCopy">
|
||||||
|
|
Loading…
Reference in a new issue