mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-24 03:45:00 +00:00
align code
This commit is contained in:
parent
4eedb2f3e1
commit
f6d870ab48
28 changed files with 452 additions and 582 deletions
|
@ -47,7 +47,7 @@
|
|||
|
||||
## Translation Status
|
||||
|
||||
[](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md)
|
||||
[](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md) [](TRANSLATION.md)
|
||||
|
||||
## How to Use
|
||||
|
||||
|
|
|
@ -58,28 +58,12 @@
|
|||
|
||||
</details>
|
||||
|
||||
### it_IT.axaml: 97.87%
|
||||
### it_IT.axaml: 100.0%
|
||||
|
||||
|
||||
<details>
|
||||
<summary>Missing Keys</summary>
|
||||
|
||||
- Text.CommitDetail.Info.Children
|
||||
- Text.Configure.IssueTracker.AddSampleGitLabMergeRequest
|
||||
- Text.Configure.OpenAI.Preferred
|
||||
- Text.Configure.OpenAI.Preferred.Tip
|
||||
- Text.Fetch.Force
|
||||
- Text.Preference.General.ShowChildren
|
||||
- Text.Repository.FilterCommits
|
||||
- Text.Repository.FilterCommits.Default
|
||||
- Text.Repository.FilterCommits.Exclude
|
||||
- Text.Repository.FilterCommits.Include
|
||||
- Text.Repository.HistoriesOrder
|
||||
- Text.Repository.HistoriesOrder.ByDate
|
||||
- Text.Repository.HistoriesOrder.Topo
|
||||
- Text.SHALinkCM.CopySHA
|
||||
- Text.SHALinkCM.NavigateTo
|
||||
|
||||
</details>
|
||||
|
||||
### pt_BR.axaml: 99.29%
|
||||
|
|
|
@ -4,12 +4,14 @@ namespace SourceGit.Commands
|
|||
{
|
||||
public class QueryCommitChildren : Command
|
||||
{
|
||||
public QueryCommitChildren(string repo, string commit, int max)
|
||||
public QueryCommitChildren(string repo, string commit, int max, string filters)
|
||||
{
|
||||
WorkingDirectory = repo;
|
||||
Context = repo;
|
||||
_commit = commit;
|
||||
Args = $"rev-list -{max} --parents --branches --remotes ^{commit}";
|
||||
if (string.IsNullOrEmpty(filters))
|
||||
filters = "--branches --remotes --tags";
|
||||
Args = $"rev-list -{max} --parents {filters} ^{commit}";
|
||||
}
|
||||
|
||||
public IEnumerable<string> Result()
|
||||
|
|
|
@ -25,6 +25,7 @@ namespace SourceGit.Models
|
|||
get => _pattern;
|
||||
set => SetProperty(ref _pattern, value);
|
||||
}
|
||||
|
||||
public FilterType Type
|
||||
{
|
||||
get;
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using Avalonia.Collections;
|
||||
using Avalonia.Threading;
|
||||
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
|
@ -153,22 +152,51 @@ namespace SourceGit.Models
|
|||
set;
|
||||
} = "---";
|
||||
|
||||
public FilterMode GetHistoriesFilterMode(string pattern, FilterType type)
|
||||
public Dictionary<string, FilterMode> CollectHistoriesFilters()
|
||||
{
|
||||
var map = new Dictionary<string, FilterMode>();
|
||||
foreach (var filter in HistoriesFilters)
|
||||
{
|
||||
if (filter.Type != type)
|
||||
continue;
|
||||
|
||||
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
|
||||
return filter.Mode;
|
||||
}
|
||||
|
||||
return FilterMode.None;
|
||||
map.Add(filter.Pattern, filter.Mode);
|
||||
return map;
|
||||
}
|
||||
|
||||
public bool UpdateHistoriesFilter(string pattern, FilterType type, FilterMode mode)
|
||||
{
|
||||
// Clear all filters when there's a filter that has different mode.
|
||||
if (mode != FilterMode.None)
|
||||
{
|
||||
var clear = false;
|
||||
foreach (var filter in HistoriesFilters)
|
||||
{
|
||||
if (filter.Mode != mode)
|
||||
{
|
||||
clear = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (clear)
|
||||
{
|
||||
HistoriesFilters.Clear();
|
||||
HistoriesFilters.Add(new Filter(pattern, type, mode));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < HistoriesFilters.Count; i++)
|
||||
{
|
||||
var filter = HistoriesFilters[i];
|
||||
if (filter.Type == type && filter.Pattern.Equals(pattern, StringComparison.Ordinal))
|
||||
{
|
||||
HistoriesFilters.RemoveAt(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < HistoriesFilters.Count; i++)
|
||||
{
|
||||
var filter = HistoriesFilters[i];
|
||||
|
@ -176,34 +204,33 @@ namespace SourceGit.Models
|
|||
continue;
|
||||
|
||||
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
|
||||
{
|
||||
if (mode == FilterMode.None)
|
||||
{
|
||||
HistoriesFilters.RemoveAt(i);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mode != filter.Mode)
|
||||
{
|
||||
filter.Mode = mode;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode != FilterMode.None)
|
||||
{
|
||||
HistoriesFilters.Add(new Filter(pattern, type, mode));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
public void RemoveChildrenBranchFilters(string pattern)
|
||||
{
|
||||
var dirty = new List<Filter>();
|
||||
var prefix = $"{pattern}/";
|
||||
|
||||
foreach (var filter in HistoriesFilters)
|
||||
{
|
||||
if (filter.Type == FilterType.Tag)
|
||||
continue;
|
||||
|
||||
if (filter.Pattern.StartsWith(prefix, StringComparison.Ordinal))
|
||||
dirty.Add(filter);
|
||||
}
|
||||
|
||||
foreach (var filter in dirty)
|
||||
HistoriesFilters.Remove(filter);
|
||||
}
|
||||
|
||||
public string BuildHistoriesFilter()
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
|
||||
var excludedBranches = new List<string>();
|
||||
var excludedRemotes = new List<string>();
|
||||
var excludedTags = new List<string>();
|
||||
|
@ -258,14 +285,11 @@ namespace SourceGit.Models
|
|||
}
|
||||
}
|
||||
|
||||
foreach (var b in excludedBranches)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(b);
|
||||
builder.Append(' ');
|
||||
}
|
||||
bool hasIncluded = includedBranches.Count > 0 || includedRemotes.Count > 0 || includedTags.Count > 0;
|
||||
bool hasExcluded = excludedBranches.Count > 0 || excludedRemotes.Count > 0 || excludedTags.Count > 0;
|
||||
|
||||
if (includedBranches.Count > 0)
|
||||
var builder = new StringBuilder();
|
||||
if (hasIncluded)
|
||||
{
|
||||
foreach (var b in includedBranches)
|
||||
{
|
||||
|
@ -273,42 +297,14 @@ namespace SourceGit.Models
|
|||
builder.Append(b);
|
||||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
else if (excludedBranches.Count > 0)
|
||||
{
|
||||
builder.Append("--branches ");
|
||||
}
|
||||
|
||||
foreach (var r in excludedRemotes)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(r);
|
||||
builder.Append(' ');
|
||||
}
|
||||
|
||||
if (includedRemotes.Count > 0)
|
||||
{
|
||||
foreach (var r in includedRemotes)
|
||||
{
|
||||
builder.Append("--remotes=");
|
||||
builder.Append(r);
|
||||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
else if (excludedRemotes.Count > 0)
|
||||
{
|
||||
builder.Append("--remotes ");
|
||||
}
|
||||
|
||||
foreach (var t in excludedTags)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(t);
|
||||
builder.Append(' ');
|
||||
}
|
||||
|
||||
if (includedTags.Count > 0)
|
||||
{
|
||||
foreach (var t in includedTags)
|
||||
{
|
||||
builder.Append("--tags=");
|
||||
|
@ -316,8 +312,48 @@ namespace SourceGit.Models
|
|||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
else if (excludedTags.Count > 0)
|
||||
else if (hasExcluded)
|
||||
{
|
||||
if (excludedBranches.Count > 0)
|
||||
{
|
||||
foreach (var b in excludedBranches)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(b);
|
||||
builder.Append(" --decorate-refs-exclude=refs/heads/");
|
||||
builder.Append(b);
|
||||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
builder.Append("--exclude=HEA[D] --branches ");
|
||||
|
||||
if (excludedRemotes.Count > 0)
|
||||
{
|
||||
foreach (var r in excludedRemotes)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(r);
|
||||
builder.Append(" --decorate-refs-exclude=refs/remotes/");
|
||||
builder.Append(r);
|
||||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
builder.Append("--exclude=origin/HEA[D] --remotes ");
|
||||
|
||||
if (excludedTags.Count > 0)
|
||||
{
|
||||
foreach (var t in excludedTags)
|
||||
{
|
||||
builder.Append("--exclude=");
|
||||
builder.Append(t);
|
||||
builder.Append(" --decorate-refs-exclude=refs/tags/");
|
||||
builder.Append(t);
|
||||
builder.Append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
builder.Append("--tags ");
|
||||
}
|
||||
|
||||
|
|
|
@ -341,7 +341,7 @@
|
|||
<x:String x:Key="Text.GitLFS.Remote" xml:space="preserve">Remote:</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">Track files named '{0}'</x:String>
|
||||
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">Track all *{0} files</x:String>
|
||||
<x:String x:Key="Text.Histories" xml:space="preserve">HISTORY</x:String>
|
||||
<x:String x:Key="Text.Histories" xml:space="preserve">Histories</x:String>
|
||||
<x:String x:Key="Text.Histories.DisplayMode" xml:space="preserve">Switch Horizontal/Vertical Layout</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.Author" xml:space="preserve">AUTHOR</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.AuthorTime" xml:space="preserve">AUTHOR TIME</x:String>
|
||||
|
@ -453,7 +453,7 @@
|
|||
<x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">Language</x:String>
|
||||
<x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">History Commits</x:String>
|
||||
<x:String x:Key="Text.Preference.General.ShowAuthorTime" xml:space="preserve">Show author time instead of commit time in graph</x:String>
|
||||
<x:String x:Key="Text.Preference.General.ShowChildren" xml:space="preserve">Show children in the commit details</x:String>
|
||||
<x:String x:Key="Text.Preference.General.ShowChildren" xml:space="preserve">Show children in the comment details</x:String>
|
||||
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">Subject Guide Length</x:String>
|
||||
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Preference.Git.CRLF" xml:space="preserve">Enable Auto CRLF</x:String>
|
||||
|
@ -621,7 +621,7 @@
|
|||
<x:String x:Key="Text.StashCM.Pop" xml:space="preserve">Pop</x:String>
|
||||
<x:String x:Key="Text.StashDropConfirm" xml:space="preserve">Drop Stash</x:String>
|
||||
<x:String x:Key="Text.StashDropConfirm.Label" xml:space="preserve">Drop:</x:String>
|
||||
<x:String x:Key="Text.Stashes" xml:space="preserve">STASHES</x:String>
|
||||
<x:String x:Key="Text.Stashes" xml:space="preserve">Stashes</x:String>
|
||||
<x:String x:Key="Text.Stashes.Changes" xml:space="preserve">CHANGES</x:String>
|
||||
<x:String x:Key="Text.Stashes.Stashes" xml:space="preserve">STASHES</x:String>
|
||||
<x:String x:Key="Text.Statistics" xml:space="preserve">Statistics</x:String>
|
||||
|
@ -668,7 +668,7 @@
|
|||
<x:String x:Key="Text.Welcome.ScanDefaultCloneDir" xml:space="preserve">Rescan Repositories in Default Clone Dir</x:String>
|
||||
<x:String x:Key="Text.Welcome.Search" xml:space="preserve">Search Repositories...</x:String>
|
||||
<x:String x:Key="Text.Welcome.Sort" xml:space="preserve">Sort</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy" xml:space="preserve">LOCAL CHANGES</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy" xml:space="preserve">Changes</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">Git Ignore</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">Ignore all *{0} files</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">Ignore *{0} files in the same folder</x:String>
|
||||
|
|
|
@ -164,7 +164,6 @@
|
|||
<Style Selector="ToolTip">
|
||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
|
||||
<Setter Property="Background" Value="{DynamicResource Brush.Popup}"/>
|
||||
<Setter Property="MaxWidth" Value="800"/>
|
||||
<Setter Property="VerticalOffset" Value="-8"/>
|
||||
<Setter Property="TextBlock.TextDecorations" Value=""/>
|
||||
<Setter Property="Template">
|
||||
|
@ -1182,7 +1181,7 @@
|
|||
<Path x:Name="PART_IndicatorIcon"
|
||||
Margin="{TemplateBinding Padding}"
|
||||
Stretch="Fill"
|
||||
Width="14" Height="14"
|
||||
Width="14" Height="10"
|
||||
Data="{StaticResource Icons.EyeClose}"
|
||||
Fill="{DynamicResource Brush.FG1}"
|
||||
Opacity=".8"/>
|
||||
|
|
|
@ -37,11 +37,11 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="11.2.2" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="11.2.2" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.2" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.2" />
|
||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.2.2" Condition="'$(Configuration)' == 'Debug'" />
|
||||
<PackageReference Include="Avalonia" Version="11.2.1" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="11.2.1" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.1" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.1" />
|
||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.2.1" Condition="'$(Configuration)' == 'Debug'" />
|
||||
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.1.0" />
|
||||
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.1.0" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2" />
|
||||
|
|
|
@ -59,11 +59,6 @@ namespace SourceGit.ViewModels
|
|||
public List<BranchTreeNode> Locals => _locals;
|
||||
public List<BranchTreeNode> Remotes => _remotes;
|
||||
|
||||
public Builder(Models.RepositorySettings settings)
|
||||
{
|
||||
_settings = settings;
|
||||
}
|
||||
|
||||
public void Run(List<Models.Branch> branches, List<Models.Remote> remotes, bool bForceExpanded)
|
||||
{
|
||||
var folders = new Dictionary<string, BranchTreeNode>();
|
||||
|
@ -77,7 +72,6 @@ namespace SourceGit.ViewModels
|
|||
Path = path,
|
||||
Backend = remote,
|
||||
IsExpanded = bForceExpanded || _expanded.Contains(path),
|
||||
FilterMode = _settings.GetHistoriesFilterMode(path, Models.FilterType.RemoteBranchFolder)
|
||||
};
|
||||
|
||||
folders.Add(path, node);
|
||||
|
@ -129,7 +123,6 @@ namespace SourceGit.ViewModels
|
|||
Path = fullpath,
|
||||
Backend = branch,
|
||||
IsExpanded = false,
|
||||
FilterMode = _settings.GetHistoriesFilterMode(fullpath, branch.IsLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch),
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
@ -154,7 +147,6 @@ namespace SourceGit.ViewModels
|
|||
Name = name,
|
||||
Path = folder,
|
||||
IsExpanded = bForceExpanded || branch.IsCurrent || _expanded.Contains(folder),
|
||||
FilterMode = _settings.GetHistoriesFilterMode(folder, branch.IsLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder),
|
||||
};
|
||||
roots.Add(lastFolder);
|
||||
folders.Add(folder, lastFolder);
|
||||
|
@ -166,7 +158,6 @@ namespace SourceGit.ViewModels
|
|||
Name = name,
|
||||
Path = folder,
|
||||
IsExpanded = bForceExpanded || branch.IsCurrent || _expanded.Contains(folder),
|
||||
FilterMode = _settings.GetHistoriesFilterMode(folder, branch.IsLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder),
|
||||
};
|
||||
lastFolder.Children.Add(cur);
|
||||
folders.Add(folder, cur);
|
||||
|
@ -183,7 +174,6 @@ namespace SourceGit.ViewModels
|
|||
Path = fullpath,
|
||||
Backend = branch,
|
||||
IsExpanded = false,
|
||||
FilterMode = _settings.GetHistoriesFilterMode(fullpath, branch.IsLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -204,7 +194,6 @@ namespace SourceGit.ViewModels
|
|||
SortNodes(node.Children);
|
||||
}
|
||||
|
||||
private readonly Models.RepositorySettings _settings = null;
|
||||
private readonly List<BranchTreeNode> _locals = new List<BranchTreeNode>();
|
||||
private readonly List<BranchTreeNode> _remotes = new List<BranchTreeNode>();
|
||||
private readonly HashSet<string> _expanded = new HashSet<string>();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
|
@ -64,8 +64,8 @@ namespace SourceGit.ViewModels
|
|||
CallUIThread(() =>
|
||||
{
|
||||
var b = _repo.Branches.Find(x => x.IsLocal && x.Name == Branch);
|
||||
if (b != null)
|
||||
_repo.UpdateHistoriesFilterAfterCheckout(b);
|
||||
if (b != null && _repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.Settings.UpdateHistoriesFilter(b.FullName, Models.FilterType.LocalBranch, Models.FilterMode.Included);
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
|
|
@ -576,7 +576,8 @@ namespace SourceGit.ViewModels
|
|||
Task.Run(() =>
|
||||
{
|
||||
var max = Preference.Instance.MaxHistoryCommits;
|
||||
var cmdChildren = new Commands.QueryCommitChildren(_repo.FullPath, _commit.SHA, max) { Cancel = _cancelToken };
|
||||
var filter = _repo.Settings.BuildHistoriesFilter();
|
||||
var cmdChildren = new Commands.QueryCommitChildren(_repo.FullPath, _commit.SHA, max, filter) { Cancel = _cancelToken };
|
||||
var children = cmdChildren.Result();
|
||||
if (!cmdChildren.Cancel.Requested)
|
||||
Dispatcher.UIThread.Post(() => Children.AddRange(children));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
|
@ -125,14 +125,8 @@ namespace SourceGit.ViewModels
|
|||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
if (CheckoutAfterCreated)
|
||||
{
|
||||
_repo.UpdateHistoriesFilterAfterCheckout(new Models.Branch()
|
||||
{
|
||||
FullName = $"refs/heads/{_name}",
|
||||
Upstream = BasedOn is Models.Branch { IsLocal: false } remoteBranch ? remoteBranch.FullName : string.Empty,
|
||||
});
|
||||
}
|
||||
if (CheckoutAfterCreated && _repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.Settings.UpdateHistoriesFilter($"refs/heads/{_name}", Models.FilterType.LocalBranch, Models.FilterMode.Included);
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
|
|
@ -65,8 +65,7 @@ namespace SourceGit.ViewModels
|
|||
get => _defaultFontFamily;
|
||||
set
|
||||
{
|
||||
var trimmed = value.Trim();
|
||||
if (SetProperty(ref _defaultFontFamily, trimmed) && !_isLoading)
|
||||
if (SetProperty(ref _defaultFontFamily, value) && !_isLoading)
|
||||
App.SetFonts(_defaultFontFamily, _monospaceFontFamily, _onlyUseMonoFontInEditor);
|
||||
}
|
||||
}
|
||||
|
@ -76,8 +75,7 @@ namespace SourceGit.ViewModels
|
|||
get => _monospaceFontFamily;
|
||||
set
|
||||
{
|
||||
var trimmed = value.Trim();
|
||||
if (SetProperty(ref _monospaceFontFamily, trimmed) && !_isLoading)
|
||||
if (SetProperty(ref _monospaceFontFamily, value) && !_isLoading)
|
||||
App.SetFonts(_defaultFontFamily, _monospaceFontFamily, _onlyUseMonoFontInEditor);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
@ -46,6 +46,12 @@ namespace SourceGit.ViewModels
|
|||
get => _settings;
|
||||
}
|
||||
|
||||
public Models.FilterMode HistoriesFilterMode
|
||||
{
|
||||
get => _historiesFilterMode;
|
||||
private set => SetProperty(ref _historiesFilterMode, value);
|
||||
}
|
||||
|
||||
public bool HasAllowedSignersFile
|
||||
{
|
||||
get => _hasAllowedSignersFile;
|
||||
|
@ -100,6 +106,16 @@ namespace SourceGit.ViewModels
|
|||
}
|
||||
}
|
||||
|
||||
public bool EnableTopoOrderInHistories
|
||||
{
|
||||
get => _enableTopoOrderInHistories;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _enableTopoOrderInHistories, value))
|
||||
Task.Run(RefreshCommits);
|
||||
}
|
||||
}
|
||||
|
||||
public string Filter
|
||||
{
|
||||
get => _filter;
|
||||
|
@ -336,14 +352,7 @@ namespace SourceGit.ViewModels
|
|||
|
||||
public InProgressContext InProgressContext
|
||||
{
|
||||
get => _inProgressContext;
|
||||
private set => SetProperty(ref _inProgressContext, value);
|
||||
}
|
||||
|
||||
public bool HasUnsolvedConflicts
|
||||
{
|
||||
get => _hasUnsolvedConflicts;
|
||||
private set => SetProperty(ref _hasUnsolvedConflicts, value);
|
||||
get => _workingCopy?.InProgressContext;
|
||||
}
|
||||
|
||||
public Models.Commit SearchResultSelectedCommit
|
||||
|
@ -390,13 +399,16 @@ namespace SourceGit.ViewModels
|
|||
App.RaiseException(string.Empty, $"Failed to start watcher for repository: '{_fullpath}'. You may need to press 'F5' to refresh repository manually!\n\nReason: {ex.Message}");
|
||||
}
|
||||
|
||||
if (_settings.HistoriesFilters.Count > 0)
|
||||
_historiesFilterMode = _settings.HistoriesFilters[0].Mode;
|
||||
else
|
||||
_historiesFilterMode = Models.FilterMode.None;
|
||||
|
||||
_histories = new Histories(this);
|
||||
_workingCopy = new WorkingCopy(this);
|
||||
_stashesPage = new StashesPage(this);
|
||||
_selectedView = _histories;
|
||||
_selectedViewIndex = 0;
|
||||
_inProgressContext = null;
|
||||
_hasUnsolvedConflicts = false;
|
||||
|
||||
_autoFetchTimer = new Timer(AutoFetchImpl, null, 5000, 5000);
|
||||
RefreshAll();
|
||||
|
@ -416,6 +428,7 @@ namespace SourceGit.ViewModels
|
|||
// Ignore
|
||||
}
|
||||
_settings = null;
|
||||
_historiesFilterMode = Models.FilterMode.None;
|
||||
|
||||
_autoFetchTimer.Dispose();
|
||||
_autoFetchTimer = null;
|
||||
|
@ -429,7 +442,6 @@ namespace SourceGit.ViewModels
|
|||
_histories = null;
|
||||
_workingCopy = null;
|
||||
_stashesPage = null;
|
||||
_inProgressContext = null;
|
||||
|
||||
_localChangesCount = 0;
|
||||
_stashesCount = 0;
|
||||
|
@ -456,13 +468,9 @@ namespace SourceGit.ViewModels
|
|||
_hasAllowedSignersFile = !string.IsNullOrEmpty(allowedSignersFile);
|
||||
});
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
RefreshBranches();
|
||||
RefreshTags();
|
||||
RefreshCommits();
|
||||
});
|
||||
|
||||
Task.Run(RefreshBranches);
|
||||
Task.Run(RefreshTags);
|
||||
Task.Run(RefreshCommits);
|
||||
Task.Run(RefreshSubmodules);
|
||||
Task.Run(RefreshWorktrees);
|
||||
Task.Run(RefreshWorkingCopyChanges);
|
||||
|
@ -642,12 +650,8 @@ namespace SourceGit.ViewModels
|
|||
{
|
||||
if (_watcher == null)
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
RefreshBranches();
|
||||
RefreshCommits();
|
||||
});
|
||||
|
||||
Task.Run(RefreshBranches);
|
||||
Task.Run(RefreshCommits);
|
||||
Task.Run(RefreshWorkingCopyChanges);
|
||||
Task.Run(RefreshWorktrees);
|
||||
}
|
||||
|
@ -688,18 +692,71 @@ namespace SourceGit.ViewModels
|
|||
public void ClearHistoriesFilter()
|
||||
{
|
||||
_settings.HistoriesFilters.Clear();
|
||||
HistoriesFilterMode = Models.FilterMode.None;
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
RefreshBranches();
|
||||
RefreshTags();
|
||||
RefreshCommits();
|
||||
});
|
||||
ResetBranchTreeFilterMode(LocalBranchTrees);
|
||||
ResetBranchTreeFilterMode(RemoteBranchTrees);
|
||||
ResetTagFilterMode();
|
||||
Task.Run(RefreshCommits);
|
||||
}
|
||||
|
||||
public void UpdateHistoriesFilterAfterCheckout(Models.Branch local)
|
||||
public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
|
||||
{
|
||||
// TODO:
|
||||
var changed = _settings.UpdateHistoriesFilter(tag.Name, Models.FilterType.Tag, mode);
|
||||
if (changed)
|
||||
RefreshHistoriesFilters();
|
||||
}
|
||||
|
||||
public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode)
|
||||
{
|
||||
var node = FindBranchNode(branch.IsLocal ? _localBranchTrees : _remoteBranchTrees, branch.FullName);
|
||||
if (node != null)
|
||||
SetBranchFilterMode(node, mode);
|
||||
}
|
||||
|
||||
public void SetBranchFilterMode(BranchTreeNode node, Models.FilterMode mode)
|
||||
{
|
||||
var isLocal = node.Path.StartsWith("refs/heads/", StringComparison.Ordinal);
|
||||
var tree = isLocal ? _localBranchTrees : _remoteBranchTrees;
|
||||
|
||||
if (node.Backend is Models.Branch branch)
|
||||
{
|
||||
var type = isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;
|
||||
var changed = _settings.UpdateHistoriesFilter(node.Path, type, mode);
|
||||
if (!changed)
|
||||
return;
|
||||
|
||||
if (isLocal && !string.IsNullOrEmpty(branch.Upstream))
|
||||
_settings.UpdateHistoriesFilter(branch.Upstream, Models.FilterType.RemoteBranch, mode);
|
||||
}
|
||||
else
|
||||
{
|
||||
var type = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
|
||||
var changed = _settings.UpdateHistoriesFilter(node.Path, type, mode);
|
||||
if (!changed)
|
||||
return;
|
||||
|
||||
_settings.RemoveChildrenBranchFilters(node.Path);
|
||||
}
|
||||
|
||||
var parentType = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
|
||||
var cur = node;
|
||||
do
|
||||
{
|
||||
var lastSepIdx = cur.Path.LastIndexOf('/');
|
||||
if (lastSepIdx <= 0)
|
||||
break;
|
||||
|
||||
var parentPath = cur.Path.Substring(0, lastSepIdx);
|
||||
var parent = FindBranchNode(tree, parentPath);
|
||||
if (parent == null)
|
||||
break;
|
||||
|
||||
_settings.UpdateHistoriesFilter(parent.Path, parentType, Models.FilterMode.None);
|
||||
cur = parent;
|
||||
} while (true);
|
||||
|
||||
RefreshHistoriesFilters();
|
||||
}
|
||||
|
||||
public void StashAll(bool autoStart)
|
||||
|
@ -713,40 +770,9 @@ namespace SourceGit.ViewModels
|
|||
SelectedViewIndex = 1;
|
||||
}
|
||||
|
||||
public async void ContinueMerge()
|
||||
public void AbortMerge()
|
||||
{
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
var succ = await Task.Run(_inProgressContext.Continue);
|
||||
if (succ && _workingCopy != null)
|
||||
{
|
||||
_workingCopy.CommitMessage = string.Empty;
|
||||
}
|
||||
SetWatcherEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
MarkWorkingCopyDirtyManually();
|
||||
}
|
||||
}
|
||||
|
||||
public async void AbortMerge()
|
||||
{
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
var succ = await Task.Run(_inProgressContext.Abort);
|
||||
if (succ && _workingCopy != null)
|
||||
{
|
||||
_workingCopy.CommitMessage = string.Empty;
|
||||
}
|
||||
SetWatcherEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
MarkWorkingCopyDirtyManually();
|
||||
}
|
||||
_workingCopy?.AbortMerge();
|
||||
}
|
||||
|
||||
public void RefreshBranches()
|
||||
|
@ -790,9 +816,6 @@ namespace SourceGit.ViewModels
|
|||
public void RefreshTags()
|
||||
{
|
||||
var tags = new Commands.QueryTags(_fullpath).Result();
|
||||
foreach (var tag in tags)
|
||||
tag.FilterMode = _settings.GetHistoriesFilterMode(tag.Name, Models.FilterType.Tag);
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
Tags = tags;
|
||||
|
@ -811,14 +834,13 @@ namespace SourceGit.ViewModels
|
|||
if (_enableFirstParentInHistories)
|
||||
builder.Append("--first-parent ");
|
||||
|
||||
var invalidFilters = new List<Models.Filter>();
|
||||
var filters = _settings.BuildHistoriesFilter();
|
||||
if (string.IsNullOrEmpty(filters))
|
||||
builder.Append("--branches --remotes --tags");
|
||||
else
|
||||
builder.Append(filters);
|
||||
|
||||
var commits = new Commands.QueryCommits(_fullpath, builder.ToString()).Result();
|
||||
var commits = new Commands.QueryCommits(_fullpath, _enableTopoOrderInHistories, builder.ToString()).Result();
|
||||
var graph = Models.CommitGraph.Parse(commits, _enableFirstParentInHistories);
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
|
@ -850,23 +872,12 @@ namespace SourceGit.ViewModels
|
|||
if (_workingCopy == null)
|
||||
return;
|
||||
|
||||
var hasUnsolvedConflict = _workingCopy.SetData(changes);
|
||||
var inProgress = null as InProgressContext;
|
||||
|
||||
if (File.Exists(Path.Combine(_gitDir, "CHERRY_PICK_HEAD")))
|
||||
inProgress = new CherryPickInProgress(_fullpath);
|
||||
else if (File.Exists(Path.Combine(_gitDir, "REBASE_HEAD")) && Directory.Exists(Path.Combine(_gitDir, "rebase-merge")))
|
||||
inProgress = new RebaseInProgress(this);
|
||||
else if (File.Exists(Path.Combine(_gitDir, "REVERT_HEAD")))
|
||||
inProgress = new RevertInProgress(_fullpath);
|
||||
else if (File.Exists(Path.Combine(_gitDir, "MERGE_HEAD")))
|
||||
inProgress = new MergeInProgress(_fullpath);
|
||||
_workingCopy.SetData(changes);
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
InProgressContext = inProgress;
|
||||
HasUnsolvedConflicts = hasUnsolvedConflict;
|
||||
LocalChangesCount = changes.Count;
|
||||
OnPropertyChanged(nameof(InProgressContext));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1990,7 +2001,7 @@ namespace SourceGit.ViewModels
|
|||
|
||||
private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, List<Models.Remote> remotes)
|
||||
{
|
||||
var builder = new BranchTreeNode.Builder(_settings);
|
||||
var builder = new BranchTreeNode.Builder();
|
||||
if (string.IsNullOrEmpty(_filter))
|
||||
{
|
||||
builder.CollectExpandedNodes(_localBranchTrees);
|
||||
|
@ -2009,6 +2020,9 @@ namespace SourceGit.ViewModels
|
|||
builder.Run(visibles, remotes, true);
|
||||
}
|
||||
|
||||
var historiesFilters = _settings.CollectHistoriesFilters();
|
||||
UpdateBranchTreeFilterMode(builder.Locals, historiesFilters);
|
||||
UpdateBranchTreeFilterMode(builder.Remotes, historiesFilters);
|
||||
return builder;
|
||||
}
|
||||
|
||||
|
@ -2028,6 +2042,8 @@ namespace SourceGit.ViewModels
|
|||
}
|
||||
}
|
||||
|
||||
var historiesFilters = _settings.CollectHistoriesFilters();
|
||||
UpdateTagFilterMode(historiesFilters);
|
||||
return visible;
|
||||
}
|
||||
|
||||
|
@ -2049,6 +2065,80 @@ namespace SourceGit.ViewModels
|
|||
return visible;
|
||||
}
|
||||
|
||||
private void RefreshHistoriesFilters()
|
||||
{
|
||||
var filters = _settings.CollectHistoriesFilters();
|
||||
UpdateBranchTreeFilterMode(LocalBranchTrees, filters);
|
||||
UpdateBranchTreeFilterMode(RemoteBranchTrees, filters);
|
||||
UpdateTagFilterMode(filters);
|
||||
|
||||
if (_settings.HistoriesFilters.Count > 0)
|
||||
HistoriesFilterMode = _settings.HistoriesFilters[0].Mode;
|
||||
else
|
||||
HistoriesFilterMode = Models.FilterMode.None;
|
||||
|
||||
Task.Run(RefreshCommits);
|
||||
}
|
||||
|
||||
private void UpdateBranchTreeFilterMode(List<BranchTreeNode> nodes, Dictionary<string, Models.FilterMode> filters)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (filters.TryGetValue(node.Path, out var value))
|
||||
node.FilterMode = value;
|
||||
else
|
||||
node.FilterMode = Models.FilterMode.None;
|
||||
|
||||
if (!node.IsBranch)
|
||||
UpdateBranchTreeFilterMode(node.Children, filters);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTagFilterMode(Dictionary<string, Models.FilterMode> filters)
|
||||
{
|
||||
foreach (var tag in _tags)
|
||||
{
|
||||
if (filters.TryGetValue(tag.Name, out var value))
|
||||
tag.FilterMode = value;
|
||||
else
|
||||
tag.FilterMode = Models.FilterMode.None;
|
||||
}
|
||||
}
|
||||
|
||||
private void ResetBranchTreeFilterMode(List<BranchTreeNode> nodes)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
node.FilterMode = Models.FilterMode.None;
|
||||
if (!node.IsBranch)
|
||||
ResetBranchTreeFilterMode(node.Children);
|
||||
}
|
||||
}
|
||||
|
||||
private void ResetTagFilterMode()
|
||||
{
|
||||
foreach (var tag in _tags)
|
||||
tag.FilterMode = Models.FilterMode.None;
|
||||
}
|
||||
|
||||
private BranchTreeNode FindBranchNode(List<BranchTreeNode> nodes, string path)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node.Path.Equals(path, StringComparison.Ordinal))
|
||||
return node;
|
||||
|
||||
if (path!.StartsWith(node.Path, StringComparison.Ordinal))
|
||||
{
|
||||
var founded = FindBranchNode(node.Children, path);
|
||||
if (founded != null)
|
||||
return founded;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void UpdateCurrentRevisionFilesForSearchSuggestion()
|
||||
{
|
||||
_revisionFiles.Clear();
|
||||
|
@ -2103,7 +2193,7 @@ namespace SourceGit.ViewModels
|
|||
|
||||
IsAutoFetching = true;
|
||||
Dispatcher.UIThread.Invoke(() => OnPropertyChanged(nameof(IsAutoFetching)));
|
||||
new Commands.Fetch(_fullpath, "--all", false, _settings.EnablePruneOnFetch, null) { RaiseError = false }.Exec();
|
||||
new Commands.Fetch(_fullpath, "--all", false, _settings.EnablePruneOnFetch, false, null) { RaiseError = false }.Exec();
|
||||
_lastFetchTime = DateTime.Now;
|
||||
IsAutoFetching = false;
|
||||
Dispatcher.UIThread.Invoke(() => OnPropertyChanged(nameof(IsAutoFetching)));
|
||||
|
@ -2112,6 +2202,7 @@ namespace SourceGit.ViewModels
|
|||
private string _fullpath = string.Empty;
|
||||
private string _gitDir = string.Empty;
|
||||
private Models.RepositorySettings _settings = null;
|
||||
private Models.FilterMode _historiesFilterMode = Models.FilterMode.None;
|
||||
private bool _hasAllowedSignersFile = false;
|
||||
|
||||
private Models.Watcher _watcher = null;
|
||||
|
@ -2131,6 +2222,7 @@ namespace SourceGit.ViewModels
|
|||
private bool _onlySearchCommitsInCurrentBranch = false;
|
||||
private bool _enableReflog = false;
|
||||
private bool _enableFirstParentInHistories = false;
|
||||
private bool _enableTopoOrderInHistories = false;
|
||||
private string _searchCommitFilter = string.Empty;
|
||||
private List<Models.Commit> _searchedCommits = new List<Models.Commit>();
|
||||
private List<string> _revisionFiles = new List<string>();
|
||||
|
@ -2154,10 +2246,7 @@ namespace SourceGit.ViewModels
|
|||
private List<Models.Submodule> _visibleSubmodules = new List<Models.Submodule>();
|
||||
|
||||
private bool _includeUntracked = true;
|
||||
private InProgressContext _inProgressContext = null;
|
||||
private bool _hasUnsolvedConflicts = false;
|
||||
private Models.Commit _searchResultSelectedCommit = null;
|
||||
|
||||
private Timer _autoFetchTimer = null;
|
||||
private DateTime _lastFetchTime = DateTime.MinValue;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
<!-- Content Area (allows double-click) -->
|
||||
<Grid Grid.Column="1"
|
||||
Background="Transparent"
|
||||
ColumnDefinitions="18,*,Auto,20"
|
||||
ColumnDefinitions="18,*,Auto,Auto"
|
||||
DoubleTapped="OnDoubleTappedBranchNode">
|
||||
|
||||
<!-- Icon -->
|
||||
|
@ -72,7 +72,9 @@
|
|||
Background="{DynamicResource Brush.Badge}"/>
|
||||
|
||||
<!-- Filter Mode Switcher -->
|
||||
<v:FilterModeSwitchButton Grid.Column="3" Mode="{Binding FilterMode}"/>
|
||||
<v:FilterModeSwitchButton Grid.Column="3"
|
||||
Margin="0,0,8,0"
|
||||
Mode="{Binding FilterMode}"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
|
|
@ -33,20 +33,21 @@
|
|||
Margin="0,0,8,0"
|
||||
Text="{DynamicResource Text.Checkout.LocalChanges}"/>
|
||||
<WrapPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<WrapPanel.Resources>
|
||||
<ac:EnumToBoolConverter x:Key="EnumToBoolConverter"/>
|
||||
</WrapPanel.Resources>
|
||||
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.DoNothing}"
|
||||
x:Name="RadioDoNothing"
|
||||
GroupName="LocalChanges"
|
||||
Margin="0,0,8,0"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.DoNothing}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.StashAndReply}"
|
||||
x:Name="RadioStashAndReply"
|
||||
GroupName="LocalChanges"
|
||||
Margin="0,0,8,0"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.StashAndReaply}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.Discard}"
|
||||
x:Name="RadioDiscard"
|
||||
GroupName="LocalChanges"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.Discard}}"/>
|
||||
</WrapPanel>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
|
@ -9,51 +8,5 @@ namespace SourceGit.Views
|
|||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnLoaded(RoutedEventArgs e)
|
||||
{
|
||||
base.OnLoaded(e);
|
||||
|
||||
var vm = DataContext as ViewModels.Checkout;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
switch (vm.PreAction)
|
||||
{
|
||||
case Models.DealWithLocalChanges.DoNothing:
|
||||
RadioDoNothing.IsChecked = true;
|
||||
break;
|
||||
case Models.DealWithLocalChanges.StashAndReaply:
|
||||
RadioStashAndReply.IsChecked = true;
|
||||
break;
|
||||
default:
|
||||
RadioDiscard.IsChecked = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnLocalChangeActionIsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var vm = DataContext as ViewModels.Checkout;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
if (RadioDoNothing.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.DoNothing)
|
||||
vm.PreAction = Models.DealWithLocalChanges.DoNothing;
|
||||
return;
|
||||
}
|
||||
|
||||
if (RadioStashAndReply.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.StashAndReaply)
|
||||
vm.PreAction = Models.DealWithLocalChanges.StashAndReaply;
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.Discard)
|
||||
vm.PreAction = Models.DealWithLocalChanges.Discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,6 +73,12 @@
|
|||
</Button>
|
||||
|
||||
<ContentControl Content="{Binding #ThisControl.SignInfo}">
|
||||
<ContentControl.Styles>
|
||||
<Style Selector="ToolTip">
|
||||
<Setter Property="MaxWidth" Value="800"/>
|
||||
</Style>
|
||||
</ContentControl.Styles>
|
||||
|
||||
<ContentControl.DataTemplates>
|
||||
<DataTemplate DataType="m:CommitSignInfo">
|
||||
<Border Width="24" Background="Transparent">
|
||||
|
@ -113,6 +119,12 @@
|
|||
Margin="0,0,16,0"
|
||||
PointerEntered="OnSHAPointerEntered"
|
||||
PointerPressed="OnSHAPressed">
|
||||
<TextBlock.Styles>
|
||||
<Style Selector="ToolTip">
|
||||
<Setter Property="MaxWidth" Value="600"/>
|
||||
</Style>
|
||||
</TextBlock.Styles>
|
||||
|
||||
<TextBlock.DataTemplates>
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
|
@ -150,6 +162,12 @@
|
|||
Margin="0,0,16,0"
|
||||
PointerEntered="OnSHAPointerEntered"
|
||||
PointerPressed="OnSHAPressed">
|
||||
<TextBlock.Styles>
|
||||
<Style Selector="ToolTip">
|
||||
<Setter Property="MaxWidth" Value="600"/>
|
||||
</Style>
|
||||
</TextBlock.Styles>
|
||||
|
||||
<TextBlock.DataTemplates>
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
|
@ -188,6 +206,12 @@
|
|||
IssueTrackerRules="{Binding #ThisControl.IssueTrackerRules}"
|
||||
HorizontalAlignment="Stretch"
|
||||
TextWrapping="Wrap">
|
||||
<v:CommitMessagePresenter.Styles>
|
||||
<Style Selector="ToolTip">
|
||||
<Setter Property="MaxWidth" Value="800"/>
|
||||
</Style>
|
||||
</v:CommitMessagePresenter.Styles>
|
||||
|
||||
<v:CommitMessagePresenter.DataTemplates>
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
|
|
|
@ -69,20 +69,21 @@
|
|||
Margin="0,0,8,0"
|
||||
Text="{DynamicResource Text.CreateBranch.LocalChanges}"/>
|
||||
<WrapPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<WrapPanel.Resources>
|
||||
<ac:EnumToBoolConverter x:Key="EnumToBoolConverter"/>
|
||||
</WrapPanel.Resources>
|
||||
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.DoNothing}"
|
||||
x:Name="RadioDoNothing"
|
||||
GroupName="LocalChanges"
|
||||
Margin="0,0,8,0"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.DoNothing}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.StashAndReply}"
|
||||
x:Name="RadioStashAndReply"
|
||||
GroupName="LocalChanges"
|
||||
Margin="0,0,8,0"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.StashAndReaply}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.CreateBranch.LocalChanges.Discard}"
|
||||
x:Name="RadioDiscard"
|
||||
GroupName="LocalChanges"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.Discard}}"/>
|
||||
</WrapPanel>
|
||||
|
||||
<CheckBox Grid.Row="3" Grid.Column="1"
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
|
@ -9,51 +8,5 @@ namespace SourceGit.Views
|
|||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnLoaded(RoutedEventArgs e)
|
||||
{
|
||||
base.OnLoaded(e);
|
||||
|
||||
var vm = DataContext as ViewModels.CreateBranch;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
switch (vm.PreAction)
|
||||
{
|
||||
case Models.DealWithLocalChanges.DoNothing:
|
||||
RadioDoNothing.IsChecked = true;
|
||||
break;
|
||||
case Models.DealWithLocalChanges.StashAndReaply:
|
||||
RadioStashAndReply.IsChecked = true;
|
||||
break;
|
||||
default:
|
||||
RadioDiscard.IsChecked = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnLocalChangeActionIsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var vm = DataContext as ViewModels.CreateBranch;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
if (RadioDoNothing.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.DoNothing)
|
||||
vm.PreAction = Models.DealWithLocalChanges.DoNothing;
|
||||
return;
|
||||
}
|
||||
|
||||
if (RadioStashAndReply.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.StashAndReaply)
|
||||
vm.PreAction = Models.DealWithLocalChanges.StashAndReaply;
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.Discard)
|
||||
vm.PreAction = Models.DealWithLocalChanges.Discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,17 +15,8 @@
|
|||
<Grid>
|
||||
<Path Width="12" Height="12"
|
||||
Data="{StaticResource Icons.Eye}"
|
||||
Fill="{DynamicResource Brush.FG2}">
|
||||
<Path.IsVisible>
|
||||
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
||||
<Binding Path="#ThisControl.Mode" Converter="{x:Static ObjectConverters.Equal}" ConverterParameter="{x:Static m:FilterMode.None}"/>
|
||||
<MultiBinding Converter="{x:Static BoolConverters.Or}">
|
||||
<Binding Path="#ThisControl.IsNoneVisible"/>
|
||||
<Binding Path="#ThisControl.IsContextMenuOpening"/>
|
||||
</MultiBinding>
|
||||
</MultiBinding>
|
||||
</Path.IsVisible>
|
||||
</Path>
|
||||
Fill="{DynamicResource Brush.FG2}"
|
||||
IsVisible="{Binding #ThisControl.Mode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.None}}"/>
|
||||
|
||||
<Path Width="12" Height="12"
|
||||
Data="{StaticResource Icons.Filter}"
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
|
@ -40,9 +36,23 @@ namespace SourceGit.Views
|
|||
|
||||
public FilterModeSwitchButton()
|
||||
{
|
||||
IsVisible = false;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
||||
{
|
||||
base.OnPropertyChanged(change);
|
||||
|
||||
if (change.Property == ModeProperty ||
|
||||
change.Property == IsNoneVisibleProperty ||
|
||||
change.Property == IsContextMenuOpeningProperty)
|
||||
{
|
||||
var visible = (Mode != Models.FilterMode.None || IsNoneVisible || IsContextMenuOpening);
|
||||
SetCurrentValue(IsVisibleProperty, visible);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnChangeFilterModeButtonClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var repoView = this.FindAncestorOfType<Repository>();
|
||||
|
@ -57,91 +67,90 @@ namespace SourceGit.Views
|
|||
if (button == null)
|
||||
return;
|
||||
|
||||
var menu = new ContextMenu();
|
||||
var mode = Models.FilterMode.None;
|
||||
if (DataContext is Models.Tag tag)
|
||||
{
|
||||
var mode = tag.FilterMode;
|
||||
mode = tag.FilterMode;
|
||||
|
||||
var none = new MenuItem();
|
||||
none.Icon = App.CreateMenuIcon("Icons.Eye");
|
||||
none.Header = "Default";
|
||||
none.IsEnabled = mode != Models.FilterMode.None;
|
||||
none.Click += (_, ev) =>
|
||||
if (mode != Models.FilterMode.None)
|
||||
{
|
||||
UpdateTagFilterMode(repo, tag, Models.FilterMode.None);
|
||||
var unset = new MenuItem();
|
||||
unset.Header = App.Text("Repository.FilterCommits.Default");
|
||||
unset.Click += (_, ev) =>
|
||||
{
|
||||
repo.SetTagFilterMode(tag, Models.FilterMode.None);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(unset);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
}
|
||||
|
||||
var include = new MenuItem();
|
||||
include.Icon = App.CreateMenuIcon("Icons.Filter");
|
||||
include.Header = "Filter";
|
||||
include.Header = App.Text("Repository.FilterCommits.Include");
|
||||
include.IsEnabled = mode != Models.FilterMode.Included;
|
||||
include.Click += (_, ev) =>
|
||||
{
|
||||
UpdateTagFilterMode(repo, tag, Models.FilterMode.Included);
|
||||
repo.SetTagFilterMode(tag, Models.FilterMode.Included);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var exclude = new MenuItem();
|
||||
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
|
||||
exclude.Header = "Hide";
|
||||
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
|
||||
exclude.IsEnabled = mode != Models.FilterMode.Excluded;
|
||||
exclude.Click += (_, ev) =>
|
||||
{
|
||||
UpdateTagFilterMode(repo, tag, Models.FilterMode.Excluded);
|
||||
repo.SetTagFilterMode(tag, Models.FilterMode.Excluded);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var menu = new ContextMenu();
|
||||
menu.Items.Add(none);
|
||||
menu.Items.Add(include);
|
||||
menu.Items.Add(exclude);
|
||||
|
||||
if (mode == Models.FilterMode.None)
|
||||
{
|
||||
IsContextMenuOpening = true;
|
||||
menu.Closed += (_, _) => IsContextMenuOpening = false;
|
||||
}
|
||||
|
||||
menu.Open(button);
|
||||
}
|
||||
else if (DataContext is ViewModels.BranchTreeNode node)
|
||||
{
|
||||
var mode = node.FilterMode;
|
||||
mode = node.FilterMode;
|
||||
|
||||
var none = new MenuItem();
|
||||
none.Icon = App.CreateMenuIcon("Icons.Eye");
|
||||
none.Header = "Default";
|
||||
none.IsEnabled = mode != Models.FilterMode.None;
|
||||
none.Click += (_, ev) =>
|
||||
if (mode != Models.FilterMode.None)
|
||||
{
|
||||
UpdateBranchFilterMode(repo, node, Models.FilterMode.None);
|
||||
var unset = new MenuItem();
|
||||
unset.Header = App.Text("Repository.FilterCommits.Default");
|
||||
unset.Click += (_, ev) =>
|
||||
{
|
||||
repo.SetBranchFilterMode(node, Models.FilterMode.None);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(unset);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
}
|
||||
|
||||
var include = new MenuItem();
|
||||
include.Icon = App.CreateMenuIcon("Icons.Filter");
|
||||
include.Header = "Filter";
|
||||
include.Header = App.Text("Repository.FilterCommits.Include");
|
||||
include.IsEnabled = mode != Models.FilterMode.Included;
|
||||
include.Click += (_, ev) =>
|
||||
{
|
||||
UpdateBranchFilterMode(repo, node, Models.FilterMode.Included);
|
||||
repo.SetBranchFilterMode(node, Models.FilterMode.Included);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var exclude = new MenuItem();
|
||||
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
|
||||
exclude.Header = "Hide";
|
||||
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
|
||||
exclude.IsEnabled = mode != Models.FilterMode.Excluded;
|
||||
exclude.Click += (_, ev) =>
|
||||
{
|
||||
UpdateBranchFilterMode(repo, node, Models.FilterMode.Excluded);
|
||||
repo.SetBranchFilterMode(node, Models.FilterMode.Excluded);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var menu = new ContextMenu();
|
||||
menu.Items.Add(none);
|
||||
menu.Items.Add(include);
|
||||
menu.Items.Add(exclude);
|
||||
}
|
||||
|
||||
if (mode == Models.FilterMode.None)
|
||||
{
|
||||
|
@ -150,106 +159,8 @@ namespace SourceGit.Views
|
|||
}
|
||||
|
||||
menu.Open(button);
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void UpdateTagFilterMode(ViewModels.Repository repo, Models.Tag tag, Models.FilterMode mode)
|
||||
{
|
||||
var changed = repo.Settings.UpdateHistoriesFilter(tag.Name, Models.FilterType.Tag, mode);
|
||||
if (changed)
|
||||
{
|
||||
tag.FilterMode = mode;
|
||||
Task.Run(repo.RefreshCommits);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateBranchFilterMode(ViewModels.Repository repo, ViewModels.BranchTreeNode node, Models.FilterMode mode)
|
||||
{
|
||||
var isLocal = node.Path.StartsWith("refs/heads/", StringComparison.Ordinal);
|
||||
var type = isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;
|
||||
var tree = isLocal ? repo.LocalBranchTrees : repo.RemoteBranchTrees;
|
||||
|
||||
if (node.Backend is Models.Branch branch)
|
||||
{
|
||||
var changed = repo.Settings.UpdateHistoriesFilter(node.Path, type, mode);
|
||||
if (!changed)
|
||||
return;
|
||||
|
||||
node.FilterMode = mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
var changed = repo.Settings.UpdateHistoriesFilter(node.Path, isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder, mode);
|
||||
if (!changed)
|
||||
return;
|
||||
|
||||
node.FilterMode = mode;
|
||||
ResetChildrenBranchNodeFilterMode(repo, node, isLocal);
|
||||
}
|
||||
|
||||
var parentType = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
|
||||
var cur = node;
|
||||
do
|
||||
{
|
||||
var lastSepIdx = cur.Path.LastIndexOf('/');
|
||||
if (lastSepIdx <= 0)
|
||||
break;
|
||||
|
||||
var parentPath = cur.Path.Substring(0, lastSepIdx);
|
||||
var parent = FindParentNode(tree, parentPath);
|
||||
if (parent == null)
|
||||
break;
|
||||
|
||||
repo.Settings.UpdateHistoriesFilter(parent.Path, parentType, Models.FilterMode.None);
|
||||
parent.FilterMode = Models.FilterMode.None;
|
||||
cur = parent;
|
||||
} while (true);
|
||||
|
||||
Task.Run(repo.RefreshCommits);
|
||||
}
|
||||
|
||||
private void ResetChildrenBranchNodeFilterMode(ViewModels.Repository repo, ViewModels.BranchTreeNode node, bool isLocal)
|
||||
{
|
||||
foreach (var child in node.Children)
|
||||
{
|
||||
child.FilterMode = Models.FilterMode.None;
|
||||
|
||||
if (child.IsBranch)
|
||||
{
|
||||
var type = isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;
|
||||
repo.Settings.UpdateHistoriesFilter(child.Path, type, Models.FilterMode.None);
|
||||
}
|
||||
else
|
||||
{
|
||||
var type = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
|
||||
repo.Settings.UpdateHistoriesFilter(child.Path, type, Models.FilterMode.None);
|
||||
ResetChildrenBranchNodeFilterMode(repo, child, isLocal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ViewModels.BranchTreeNode FindParentNode(List<ViewModels.BranchTreeNode> nodes, string parent)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node.IsBranch)
|
||||
continue;
|
||||
|
||||
if (node.Path.Equals(parent, StringComparison.Ordinal))
|
||||
return node;
|
||||
|
||||
if (parent.StartsWith(node.Path, StringComparison.Ordinal))
|
||||
{
|
||||
var founded = FindParentNode(node.Children, parent);
|
||||
if (founded != null)
|
||||
return founded;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -72,11 +72,6 @@ namespace SourceGit.Views
|
|||
return _unhandledModifiers.HasFlag(modifier);
|
||||
}
|
||||
|
||||
public void ClearKeyModifier()
|
||||
{
|
||||
_unhandledModifiers = KeyModifiers.None;
|
||||
}
|
||||
|
||||
protected override void OnOpened(EventArgs e)
|
||||
{
|
||||
base.OnOpened(e);
|
||||
|
|
|
@ -77,20 +77,21 @@
|
|||
Margin="0,0,8,0"
|
||||
Text="{DynamicResource Text.Pull.LocalChanges}"/>
|
||||
<WrapPanel Grid.Row="3" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<WrapPanel.Resources>
|
||||
<ac:EnumToBoolConverter x:Key="EnumToBoolConverter"/>
|
||||
</WrapPanel.Resources>
|
||||
|
||||
<RadioButton Content="{DynamicResource Text.Pull.LocalChanges.DoNothing}"
|
||||
x:Name="RadioDoNothing"
|
||||
Margin="0,0,8,0"
|
||||
GroupName="LocalChanges"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.DoNothing}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.Pull.LocalChanges.StashAndReply}"
|
||||
x:Name="RadioStashAndReply"
|
||||
Margin="0,0,8,0"
|
||||
GroupName="LocalChanges"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.StashAndReaply}}"/>
|
||||
<RadioButton Content="{DynamicResource Text.Pull.LocalChanges.Discard}"
|
||||
x:Name="RadioDiscard"
|
||||
GroupName="LocalChanges"
|
||||
IsCheckedChanged="OnLocalChangeActionIsCheckedChanged"/>
|
||||
IsChecked="{Binding PreAction, Mode=TwoWay, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static m:DealWithLocalChanges.Discard}}"/>
|
||||
</WrapPanel>
|
||||
|
||||
<CheckBox Grid.Row="4" Grid.Column="1"
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
|
@ -9,51 +8,5 @@ namespace SourceGit.Views
|
|||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnLoaded(RoutedEventArgs e)
|
||||
{
|
||||
base.OnLoaded(e);
|
||||
|
||||
var vm = DataContext as ViewModels.Pull;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
switch (vm.PreAction)
|
||||
{
|
||||
case Models.DealWithLocalChanges.DoNothing:
|
||||
RadioDoNothing.IsChecked = true;
|
||||
break;
|
||||
case Models.DealWithLocalChanges.StashAndReaply:
|
||||
RadioStashAndReply.IsChecked = true;
|
||||
break;
|
||||
default:
|
||||
RadioDiscard.IsChecked = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnLocalChangeActionIsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var vm = DataContext as ViewModels.Pull;
|
||||
if (vm == null)
|
||||
return;
|
||||
|
||||
if (RadioDoNothing.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.DoNothing)
|
||||
vm.PreAction = Models.DealWithLocalChanges.DoNothing;
|
||||
return;
|
||||
}
|
||||
|
||||
if (RadioStashAndReply.IsChecked == true)
|
||||
{
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.StashAndReaply)
|
||||
vm.PreAction = Models.DealWithLocalChanges.StashAndReaply;
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm.PreAction != Models.DealWithLocalChanges.Discard)
|
||||
vm.PreAction = Models.DealWithLocalChanges.Discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
</ListBox.ItemsPanel>
|
||||
|
||||
<ListBoxItem>
|
||||
<Grid Classes="view_mode" ColumnDefinitions="32,*,Auto,Auto,Auto">
|
||||
<Grid Classes="view_mode" ColumnDefinitions="32,*,Auto,Auto,Auto,Auto">
|
||||
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.Histories}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{DynamicResource Text.Histories}"/>
|
||||
<ToggleButton Grid.Column="2"
|
||||
|
@ -91,6 +91,13 @@
|
|||
ToolTip.Tip="{DynamicResource Text.Repository.FirstParentFilterToggle}">
|
||||
<Path Width="12" Height="12" Data="{StaticResource Icons.FirstParentFilter}"/>
|
||||
</ToggleButton>
|
||||
<Button Grid.Column="5"
|
||||
Classes="icon_button"
|
||||
Width="28" Height="26"
|
||||
Click="OnSwitchHistoriesOrderClicked"
|
||||
ToolTip.Tip="{DynamicResource Text.Repository.HistoriesOrder}">
|
||||
<Path Width="12" Height="12" Margin="0,2,0,0" Data="{StaticResource Icons.Order}"/>
|
||||
</Button>
|
||||
</Grid>
|
||||
</ListBoxItem>
|
||||
|
||||
|
@ -524,7 +531,7 @@
|
|||
|
||||
<!-- Right -->
|
||||
<Grid Grid.Column="2" RowDefinitions="Auto,Auto,*">
|
||||
<Grid Grid.Row="0" Height="28" ColumnDefinitions="*,Auto,Auto,Auto" Background="{DynamicResource Brush.Conflict}" IsVisible="{Binding InProgressContext, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||
<Grid Grid.Row="0" Height="28" ColumnDefinitions="*,Auto,Auto" Background="{DynamicResource Brush.Conflict}" IsVisible="{Binding InProgressContext, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||
<ContentControl Grid.Column="0" Margin="8,0" Content="{Binding InProgressContext}">
|
||||
<ContentControl.DataTemplates>
|
||||
<DataTemplate DataType="vm:CherryPickInProgress">
|
||||
|
@ -557,14 +564,6 @@
|
|||
</Button.IsVisible>
|
||||
</Button>
|
||||
<Button Grid.Column="2"
|
||||
Classes="flat primary"
|
||||
FontWeight="Regular"
|
||||
BorderThickness="0"
|
||||
Content="{DynamicResource Text.Repository.Continue}"
|
||||
Padding="8,0" Margin="4,0"
|
||||
Command="{Binding ContinueMerge}"
|
||||
IsVisible="{Binding !HasUnsolvedConflicts}"/>
|
||||
<Button Grid.Column="3"
|
||||
Classes="flat"
|
||||
FontWeight="Regular"
|
||||
BorderThickness="0"
|
||||
|
@ -582,7 +581,18 @@
|
|||
</Border.IsVisible>
|
||||
|
||||
<Grid Height="28" ColumnDefinitions="Auto,*,Auto">
|
||||
<TextBlock Grid.Column="0" Margin="8,0,0,0" Classes="table_header" Text="{DynamicResource Text.Repository.FilterCommitPrefix}"/>
|
||||
<Path Grid.Column="0"
|
||||
Margin="8,0,0,0"
|
||||
Width="12" Height="12"
|
||||
Data="{StaticResource Icons.Filter}"
|
||||
Fill="{DynamicResource Brush.FG2}"
|
||||
IsVisible="{Binding HistoriesFilterMode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Included}}"/>
|
||||
<Path Grid.Column="0"
|
||||
Margin="8,0,0,0"
|
||||
Width="12" Height="12"
|
||||
Data="{StaticResource Icons.EyeClose}"
|
||||
Fill="{DynamicResource Brush.FG2}"
|
||||
IsVisible="{Binding HistoriesFilterMode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Excluded}}"/>
|
||||
|
||||
<ItemsControl Grid.Column="1" Margin="8,0,0,0" ItemsSource="{Binding Settings.HistoriesFilters}">
|
||||
<ItemsControl.ItemsPanel>
|
||||
|
@ -593,29 +603,23 @@
|
|||
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate DataType="m:Filter">
|
||||
<Grid Height="20" Margin="0,0,6,0">
|
||||
<Border BorderThickness="1"
|
||||
BorderBrush="Green"
|
||||
<Border Height="20"
|
||||
Margin="0,0,6,0"
|
||||
CornerRadius="12"
|
||||
IsVisible="{Binding Mode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Included}}"/>
|
||||
|
||||
<Border BorderThickness="1"
|
||||
BorderBrush="Red"
|
||||
CornerRadius="12"
|
||||
IsVisible="{Binding Mode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Excluded}}"/>
|
||||
|
||||
BorderThickness="1"
|
||||
BorderBrush="{Binding Mode, Converter={x:Static c:FilterModeConverters.ToBorderBrush}}">
|
||||
<StackPanel Orientation="Horizontal" Margin="8,0">
|
||||
<Path Width="10" Height="10" Data="{StaticResource Icons.Branch}" IsVisible="{Binding IsBranch}"/>
|
||||
<Path Width="10" Height="10" Data="{StaticResource Icons.Tag}" IsVisible="{Binding !IsBranch}"/>
|
||||
<TextBlock Classes="primary" Text="{Binding Pattern, Converter={x:Static c:StringConverters.TrimRefsPrefix}}" Margin="4,0,0,0"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
<Button Grid.Column="2" Classes="icon_button" Command="{Binding ClearHistoriesFilter}">
|
||||
<TextBlock Margin="16,0,8,0" Text="{DynamicResource Text.Repository.ClearAllCommitsFilter}" Foreground="{DynamicResource Brush.Accent}"/>
|
||||
<Button Grid.Column="2" Classes="icon_button" Command="{Binding ClearHistoriesFilter}" ToolTip.Tip="{DynamicResource Text.Repository.ClearAllCommitsFilter}">
|
||||
<Path Width="14" Height="14" Margin="16,0,8,0" Data="{StaticResource Icons.RemoveAll}"/>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
|
|
@ -53,7 +53,6 @@ namespace SourceGit.Views
|
|||
if (!startDirectly && OperatingSystem.IsMacOS())
|
||||
startDirectly = launcher.HasKeyModifier(KeyModifiers.Meta);
|
||||
|
||||
launcher.ClearKeyModifier();
|
||||
repo.Fetch(startDirectly);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
@ -68,7 +67,6 @@ namespace SourceGit.Views
|
|||
if (!startDirectly && OperatingSystem.IsMacOS())
|
||||
startDirectly = launcher.HasKeyModifier(KeyModifiers.Meta);
|
||||
|
||||
launcher.ClearKeyModifier();
|
||||
repo.Pull(startDirectly);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
@ -83,7 +81,6 @@ namespace SourceGit.Views
|
|||
if (!startDirectly && OperatingSystem.IsMacOS())
|
||||
startDirectly = launcher.HasKeyModifier(KeyModifiers.Meta);
|
||||
|
||||
launcher.ClearKeyModifier();
|
||||
repo.Push(startDirectly);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
@ -92,17 +89,9 @@ namespace SourceGit.Views
|
|||
private void StashAll(object _, RoutedEventArgs e)
|
||||
{
|
||||
var launcher = this.FindAncestorOfType<Launcher>();
|
||||
if (launcher is not null && DataContext is ViewModels.Repository repo)
|
||||
{
|
||||
var startDirectly = launcher.HasKeyModifier(KeyModifiers.Control);
|
||||
if (!startDirectly && OperatingSystem.IsMacOS())
|
||||
startDirectly = launcher.HasKeyModifier(KeyModifiers.Meta);
|
||||
|
||||
launcher.ClearKeyModifier();
|
||||
repo.StashAll(startDirectly);
|
||||
(DataContext as ViewModels.Repository)?.StashAll(launcher?.HasKeyModifier(KeyModifiers.Control) ?? false);
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void OpenGitFlowMenu(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
|
|
@ -619,7 +619,6 @@ namespace SourceGit.Views
|
|||
TextArea.TextView.VisualLinesChanged += OnTextViewVisualLinesChanged;
|
||||
|
||||
UpdateTextMate();
|
||||
OnTextViewVisualLinesChanged(null, null);
|
||||
}
|
||||
|
||||
protected override void OnUnloaded(RoutedEventArgs e)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue