mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-11-01 13:13:21 -07:00
Merge branch 'release/v8.19'
This commit is contained in:
commit
b193579d3c
84 changed files with 3037 additions and 1440 deletions
|
@ -21,6 +21,7 @@ Opensource Git GUI client.
|
||||||
* Tags
|
* Tags
|
||||||
* Stashes
|
* Stashes
|
||||||
* Submodules
|
* Submodules
|
||||||
|
* Worktrees
|
||||||
* Archive
|
* Archive
|
||||||
* Diff
|
* Diff
|
||||||
* Save as patch/apply
|
* Save as patch/apply
|
||||||
|
@ -105,7 +106,8 @@ This app supports open repository in external tools listed in the table below.
|
||||||
| Color.ToolBar | Tool bar background color |
|
| Color.ToolBar | Tool bar background color |
|
||||||
| Color.Popup | Popup panel background color |
|
| Color.Popup | Popup panel background color |
|
||||||
| Color.Contents | Background color used in inputs, data grids, file content viewer, change lists, text diff viewer, etc. |
|
| Color.Contents | Background color used in inputs, data grids, file content viewer, change lists, text diff viewer, etc. |
|
||||||
| Color.Badage | Badage background color |
|
| Color.Badge | Badge background color |
|
||||||
|
| Color.BadgeFG | Badge foreground color |
|
||||||
| Color.Conflict | Conflict panel background color |
|
| Color.Conflict | Conflict panel background color |
|
||||||
| Color.ConflictForeground | Conflict panel foreground color |
|
| Color.ConflictForeground | Conflict panel foreground color |
|
||||||
| Color.Border0 | Border color used in some controls, like Window, Tab, Toolbar, etc. |
|
| Color.Border0 | Border color used in some controls, like Window, Tab, Toolbar, etc. |
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
8.18
|
8.19
|
|
@ -17,12 +17,12 @@ rm -f SourceGit/sourcegit.icns
|
||||||
|
|
||||||
# Debain/Ubuntu package
|
# Debain/Ubuntu package
|
||||||
mkdir -p resources/deb/opt/sourcegit/
|
mkdir -p resources/deb/opt/sourcegit/
|
||||||
mkdir -p resources/deb/usr/bin
|
|
||||||
mkdir -p resources/deb/usr/share/applications
|
mkdir -p resources/deb/usr/share/applications
|
||||||
mkdir -p resources/deb/usr/share/icons
|
mkdir -p resources/deb/usr/share/icons
|
||||||
cp -f SourceGit/* resources/deb/opt/sourcegit/
|
cp -f SourceGit/* resources/deb/opt/sourcegit/
|
||||||
cp -r resources/_common/usr resources/deb/
|
cp -r resources/_common/applications resources/deb/usr/share/
|
||||||
chmod -R 755 resources/deb
|
cp -r resources/_common/icons resources/deb/usr/share/
|
||||||
|
chmod +x -R resources/deb/opt/sourcegit
|
||||||
sed -i "2s/.*/Version: ${version}/g" resources/deb/DEBIAN/control
|
sed -i "2s/.*/Version: ${version}/g" resources/deb/DEBIAN/control
|
||||||
dpkg-deb --build resources/deb ./sourcegit_${version}-1_amd64.deb
|
dpkg-deb --build resources/deb ./sourcegit_${version}-1_amd64.deb
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
@ -1,2 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
exec /opt/sourcegit/sourcegit $1
|
|
2
build/resources/deb/DEBIAN/control
Normal file → Executable file
2
build/resources/deb/DEBIAN/control
Normal file → Executable file
|
@ -1,5 +1,5 @@
|
||||||
Package: sourcegit
|
Package: sourcegit
|
||||||
Version: 8.8
|
Version: 8.18
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Depends: libx11-6, libice6, libsm6
|
Depends: libx11-6, libice6, libsm6
|
||||||
Architecture: amd64
|
Architecture: amd64
|
||||||
|
|
5
build/resources/deb/DEBIAN/postinst
Executable file
5
build/resources/deb/DEBIAN/postinst
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!bin/sh
|
||||||
|
|
||||||
|
echo 'Create link on /usr/bin'
|
||||||
|
ln -s /opt/sourcegit/sourcegit /usr/bin/sourcegit
|
||||||
|
exit 0
|
4
build/resources/deb/DEBIAN/postrm
Executable file
4
build/resources/deb/DEBIAN/postrm
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!bin/sh
|
||||||
|
|
||||||
|
rm -f /usr/bin/sourcegit
|
||||||
|
exit 0
|
|
@ -15,17 +15,23 @@ Open-source & Free Git Gui Client
|
||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p $RPM_BUILD_ROOT/opt/sourcegit
|
mkdir -p $RPM_BUILD_ROOT/opt/sourcegit
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/bin
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/share/applications
|
mkdir -p $RPM_BUILD_ROOT/usr/share/applications
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/share/icons
|
mkdir -p $RPM_BUILD_ROOT/usr/share/icons
|
||||||
cp -r ../../_common/usr $RPM_BUILD_ROOT/
|
cp -r ../../_common/applications $RPM_BUILD_ROOT/usr/share/
|
||||||
|
cp -r ../../_common/icons $RPM_BUILD_ROOT/usr/share/
|
||||||
cp -f ../../../SourceGit/* $RPM_BUILD_ROOT/opt/sourcegit/
|
cp -f ../../../SourceGit/* $RPM_BUILD_ROOT/opt/sourcegit/
|
||||||
chmod 755 -R $RPM_BUILD_ROOT
|
chmod 755 -R $RPM_BUILD_ROOT/opt/sourcegit
|
||||||
|
chmod 755 $RPM_BUILD_ROOT/usr/share/applications/sourcegit.desktop
|
||||||
|
|
||||||
%files
|
%files
|
||||||
/opt
|
/opt/sourcegit
|
||||||
%attr(555,root,root)/usr/bin
|
|
||||||
/usr/share
|
/usr/share
|
||||||
|
|
||||||
|
%post
|
||||||
|
ln -s /opt/sourcegit/sourcegit /usr/bin/sourcegit
|
||||||
|
|
||||||
|
%postun
|
||||||
|
rm -f /usr/bin/sourcegit
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
# skip
|
# skip
|
Binary file not shown.
Before Width: | Height: | Size: 559 KiB After Width: | Height: | Size: 329 KiB |
Binary file not shown.
Before Width: | Height: | Size: 569 KiB After Width: | Height: | Size: 334 KiB |
|
@ -61,6 +61,12 @@ namespace SourceGit
|
||||||
builder.Append($"Source: {ex.Source}\n");
|
builder.Append($"Source: {ex.Source}\n");
|
||||||
builder.Append($"---------------------------\n\n");
|
builder.Append($"---------------------------\n\n");
|
||||||
builder.Append(ex.StackTrace);
|
builder.Append(ex.StackTrace);
|
||||||
|
while (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
ex = ex.InnerException;
|
||||||
|
builder.Append($"\n\nInnerException::: {ex.GetType().FullName}: {ex.Message}\n");
|
||||||
|
builder.Append(ex.StackTrace);
|
||||||
|
}
|
||||||
|
|
||||||
var time = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
|
var time = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
|
||||||
var file = Path.Combine(Native.OS.DataDir, $"crash_{time}.log");
|
var file = Path.Combine(Native.OS.DataDir, $"crash_{time}.log");
|
||||||
|
@ -112,20 +118,14 @@ namespace SourceGit
|
||||||
|
|
||||||
public static void RaiseException(string context, string message)
|
public static void RaiseException(string context, string message)
|
||||||
{
|
{
|
||||||
if (Current is App app && app._notificationReceiver != null)
|
if (Current is App app && app._launcher != null)
|
||||||
{
|
app._launcher.DispatchNotification(context, message, true);
|
||||||
var notice = new Models.Notification() { IsError = true, Message = message };
|
|
||||||
app._notificationReceiver.OnReceiveNotification(context, notice);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SendNotification(string context, string message)
|
public static void SendNotification(string context, string message)
|
||||||
{
|
{
|
||||||
if (Current is App app && app._notificationReceiver != null)
|
if (Current is App app && app._launcher != null)
|
||||||
{
|
app._launcher.DispatchNotification(context, message, false);
|
||||||
var notice = new Models.Notification() { IsError = false, Message = message };
|
|
||||||
app._notificationReceiver.OnReceiveNotification(context, notice);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetLocale(string localeKey)
|
public static void SetLocale(string localeKey)
|
||||||
|
@ -285,9 +285,8 @@ namespace SourceGit
|
||||||
BindingPlugins.DataValidators.RemoveAt(0);
|
BindingPlugins.DataValidators.RemoveAt(0);
|
||||||
Native.OS.SetupEnternalTools();
|
Native.OS.SetupEnternalTools();
|
||||||
|
|
||||||
var launcher = new Views.Launcher();
|
_launcher = new ViewModels.Launcher();
|
||||||
_notificationReceiver = launcher;
|
desktop.MainWindow = new Views.Launcher() { DataContext = _launcher };
|
||||||
desktop.MainWindow = launcher;
|
|
||||||
|
|
||||||
if (ViewModels.Preference.Instance.ShouldCheck4UpdateOnStartup)
|
if (ViewModels.Preference.Instance.ShouldCheck4UpdateOnStartup)
|
||||||
{
|
{
|
||||||
|
@ -330,8 +329,8 @@ namespace SourceGit
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ViewModels.Launcher _launcher = null;
|
||||||
private ResourceDictionary _activeLocale = null;
|
private ResourceDictionary _activeLocale = null;
|
||||||
private ResourceDictionary _colorOverrides = null;
|
private ResourceDictionary _colorOverrides = null;
|
||||||
private Models.INotificationReceiver _notificationReceiver = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace SourceGit.Commands
|
||||||
|
|
||||||
public bool Install()
|
public bool Install()
|
||||||
{
|
{
|
||||||
return new SubCmd(_repo, $"lfs install", null).Exec();
|
return new SubCmd(_repo, "lfs install --local", null).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Track(string pattern, bool isFilenameMode = false)
|
public bool Track(string pattern, bool isFilenameMode = false)
|
||||||
|
@ -55,14 +55,19 @@ namespace SourceGit.Commands
|
||||||
return new SubCmd(_repo, $"lfs track {opt} \"{pattern}\"", null).Exec();
|
return new SubCmd(_repo, $"lfs track {opt} \"{pattern}\"", null).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Fetch(Action<string> outputHandler)
|
public void Fetch(string remote, Action<string> outputHandler)
|
||||||
{
|
{
|
||||||
new SubCmd(_repo, $"lfs fetch", outputHandler).Exec();
|
new SubCmd(_repo, $"lfs fetch {remote}", outputHandler).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Pull(Action<string> outputHandler)
|
public void Pull(string remote, Action<string> outputHandler)
|
||||||
{
|
{
|
||||||
new SubCmd(_repo, $"lfs pull", outputHandler).Exec();
|
new SubCmd(_repo, $"lfs pull {remote}", outputHandler).Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Push(string remote, Action<string> outputHandler)
|
||||||
|
{
|
||||||
|
new SubCmd(_repo, $"lfs push {remote}", outputHandler).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Prune(Action<string> outputHandler)
|
public void Prune(Action<string> outputHandler)
|
||||||
|
@ -70,10 +75,10 @@ namespace SourceGit.Commands
|
||||||
new SubCmd(_repo, "lfs prune", outputHandler).Exec();
|
new SubCmd(_repo, "lfs prune", outputHandler).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Models.LFSLock> Locks()
|
public List<Models.LFSLock> Locks(string remote)
|
||||||
{
|
{
|
||||||
var locks = new List<Models.LFSLock>();
|
var locks = new List<Models.LFSLock>();
|
||||||
var cmd = new SubCmd(_repo, "lfs locks", null);
|
var cmd = new SubCmd(_repo, $"lfs locks --remote={remote}", null);
|
||||||
var rs = cmd.ReadToEnd();
|
var rs = cmd.ReadToEnd();
|
||||||
if (rs.IsSuccess)
|
if (rs.IsSuccess)
|
||||||
{
|
{
|
||||||
|
@ -96,21 +101,21 @@ namespace SourceGit.Commands
|
||||||
return locks;
|
return locks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Lock(string file)
|
public bool Lock(string remote, string file)
|
||||||
{
|
{
|
||||||
return new SubCmd(_repo, $"lfs lock \"{file}\"", null).Exec();
|
return new SubCmd(_repo, $"lfs lock --remote={remote} \"{file}\"", null).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Unlock(string file, bool force)
|
public bool Unlock(string remote, string file, bool force)
|
||||||
{
|
{
|
||||||
var opt = force ? "-f" : "";
|
var opt = force ? "-f" : "";
|
||||||
return new SubCmd(_repo, $"lfs unlock {opt} \"{file}\"", null).Exec();
|
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} \"{file}\"", null).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Unlock(long id, bool force)
|
public bool Unlock(string remote, long id, bool force)
|
||||||
{
|
{
|
||||||
var opt = force ? "-f" : "";
|
var opt = force ? "-f" : "";
|
||||||
return new SubCmd(_repo, $"lfs unlock {opt} --id={id}", null).Exec();
|
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} --id={id}", null).Exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly string _repo;
|
private readonly string _repo;
|
||||||
|
|
126
src/Commands/Worktree.cs
Normal file
126
src/Commands/Worktree.cs
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace SourceGit.Commands
|
||||||
|
{
|
||||||
|
public partial class Worktree : Command
|
||||||
|
{
|
||||||
|
[GeneratedRegex(@"^(\w)\s(\d+)$")]
|
||||||
|
private static partial Regex REG_AHEAD_BEHIND();
|
||||||
|
|
||||||
|
public Worktree(string repo)
|
||||||
|
{
|
||||||
|
WorkingDirectory = repo;
|
||||||
|
Context = repo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Models.Worktree> List()
|
||||||
|
{
|
||||||
|
Args = "worktree list --porcelain";
|
||||||
|
|
||||||
|
var rs = ReadToEnd();
|
||||||
|
var worktrees = new List<Models.Worktree>();
|
||||||
|
var last = null as Models.Worktree;
|
||||||
|
if (rs.IsSuccess)
|
||||||
|
{
|
||||||
|
var lines = rs.StdOut.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
foreach (var line in lines)
|
||||||
|
{
|
||||||
|
if (line.StartsWith("worktree ", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last = new Models.Worktree() { FullPath = line.Substring(9).Trim() };
|
||||||
|
worktrees.Add(last);
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("bare", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.IsBare = true;
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("HEAD ", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.Head = line.Substring(5).Trim();
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("branch ", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.Branch = line.Substring(7).Trim();
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("detached", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.IsDetached = true;
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("locked", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.IsLocked = true;
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("prunable", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
last.IsPrunable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return worktrees;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Add(string fullpath, string name, bool createNew, string tracking, Action<string> outputHandler)
|
||||||
|
{
|
||||||
|
Args = "worktree add ";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(tracking))
|
||||||
|
Args += "--track ";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(name))
|
||||||
|
{
|
||||||
|
if (createNew)
|
||||||
|
Args += $"-b {name} ";
|
||||||
|
else
|
||||||
|
Args += $"-B {name} ";
|
||||||
|
}
|
||||||
|
|
||||||
|
Args += $"\"{fullpath}\" ";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(tracking))
|
||||||
|
Args += tracking;
|
||||||
|
|
||||||
|
_outputHandler = outputHandler;
|
||||||
|
return Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Prune(Action<string> outputHandler)
|
||||||
|
{
|
||||||
|
Args = "worktree prune -v";
|
||||||
|
_outputHandler = outputHandler;
|
||||||
|
return Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Lock(string fullpath)
|
||||||
|
{
|
||||||
|
Args = $"worktree lock \"{fullpath}\"";
|
||||||
|
return Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Unlock(string fullpath)
|
||||||
|
{
|
||||||
|
Args = $"worktree unlock \"{fullpath}\"";
|
||||||
|
return Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(string fullpath, bool force, Action<string> outputHandler)
|
||||||
|
{
|
||||||
|
if (force)
|
||||||
|
Args = $"worktree remove -f \"{fullpath}\"";
|
||||||
|
else
|
||||||
|
Args = $"worktree remove \"{fullpath}\"";
|
||||||
|
|
||||||
|
_outputHandler = outputHandler;
|
||||||
|
return Exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnReadline(string line)
|
||||||
|
{
|
||||||
|
_outputHandler?.Invoke(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Action<string> _outputHandler = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ namespace SourceGit.Models
|
||||||
string GitDir { get; set; }
|
string GitDir { get; set; }
|
||||||
|
|
||||||
void RefreshBranches();
|
void RefreshBranches();
|
||||||
|
void RefreshWorktrees();
|
||||||
void RefreshTags();
|
void RefreshTags();
|
||||||
void RefreshCommits();
|
void RefreshCommits();
|
||||||
void RefreshSubmodules();
|
void RefreshSubmodules();
|
||||||
|
@ -132,6 +133,7 @@ namespace SourceGit.Models
|
||||||
}
|
}
|
||||||
|
|
||||||
Task.Run(_repo.RefreshWorkingCopyChanges);
|
Task.Run(_repo.RefreshWorkingCopyChanges);
|
||||||
|
Task.Run(_repo.RefreshWorktrees);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_updateWC > 0 && now > _updateWC)
|
if (_updateWC > 0 && now > _updateWC)
|
||||||
|
|
39
src/Models/Worktree.cs
Normal file
39
src/Models/Worktree.cs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
|
||||||
|
namespace SourceGit.Models
|
||||||
|
{
|
||||||
|
public class Worktree : ObservableObject
|
||||||
|
{
|
||||||
|
public string Branch { get; set; } = string.Empty;
|
||||||
|
public string FullPath { get; set; } = string.Empty;
|
||||||
|
public string Head { get; set; } = string.Empty;
|
||||||
|
public bool IsBare { get; set; } = false;
|
||||||
|
public bool IsDetached { get; set; } = false;
|
||||||
|
public bool IsPrunable { get; set; } = false;
|
||||||
|
|
||||||
|
public bool IsLocked
|
||||||
|
{
|
||||||
|
get => _isLocked;
|
||||||
|
set => SetProperty(ref _isLocked, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (IsDetached)
|
||||||
|
return $"(deteched HEAD at {Head.Substring(10)})";
|
||||||
|
|
||||||
|
if (Branch.StartsWith("refs/heads/", System.StringComparison.Ordinal))
|
||||||
|
return $"({Branch.Substring(11)})";
|
||||||
|
|
||||||
|
if (Branch.StartsWith("refs/remotes/", System.StringComparison.Ordinal))
|
||||||
|
return $"({Branch.Substring(13)})";
|
||||||
|
|
||||||
|
return $"({Branch})";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _isLocked = false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -93,11 +93,9 @@ namespace SourceGit.Native
|
||||||
{
|
{
|
||||||
var dir = Path.GetDirectoryName(path);
|
var dir = Path.GetDirectoryName(path);
|
||||||
if (Directory.Exists(dir))
|
if (Directory.Exists(dir))
|
||||||
{
|
|
||||||
Process.Start(_xdgOpenPath, $"\"{dir}\"");
|
Process.Start(_xdgOpenPath, $"\"{dir}\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void OpenTerminal(string workdir)
|
public void OpenTerminal(string workdir)
|
||||||
{
|
{
|
||||||
|
@ -133,10 +131,8 @@ namespace SourceGit.Native
|
||||||
{
|
{
|
||||||
var test = Path.Combine(path, filename);
|
var test = Path.Combine(path, filename);
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
@ -149,33 +145,27 @@ namespace SourceGit.Native
|
||||||
{
|
{
|
||||||
var test = Path.Combine(path, "gnome-terminal");
|
var test = Path.Combine(path, "gnome-terminal");
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return new Terminal(test, "--working-directory=\"{0}\"");
|
return new Terminal(test, "--working-directory=\"{0}\"");
|
||||||
}
|
|
||||||
|
|
||||||
test = Path.Combine(path, "konsole");
|
test = Path.Combine(path, "konsole");
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return new Terminal(test, "--workdir \"{0}\"");
|
return new Terminal(test, "--workdir \"{0}\"");
|
||||||
}
|
|
||||||
|
|
||||||
test = Path.Combine(path, "xfce4-terminal");
|
test = Path.Combine(path, "xfce4-terminal");
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return new Terminal(test, "--working-directory=\"{0}\"");
|
return new Terminal(test, "--working-directory=\"{0}\"");
|
||||||
}
|
|
||||||
|
|
||||||
test = Path.Combine(path, "lxterminal");
|
test = Path.Combine(path, "lxterminal");
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return new Terminal(test, "--working-directory=\"{0}\"");
|
return new Terminal(test, "--working-directory=\"{0}\"");
|
||||||
}
|
|
||||||
|
|
||||||
test = Path.Combine(path, "deepin-terminal");
|
test = Path.Combine(path, "deepin-terminal");
|
||||||
if (File.Exists(test))
|
if (File.Exists(test))
|
||||||
{
|
|
||||||
return new Terminal(test, "--work-directory \"{0}\"");
|
return new Terminal(test, "--work-directory \"{0}\"");
|
||||||
}
|
|
||||||
|
test = Path.Combine(path, "mate-terminal");
|
||||||
|
if (File.Exists(test))
|
||||||
|
return new Terminal(test, "--working-directory=\"{0}\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -149,7 +149,7 @@ namespace SourceGit.Native
|
||||||
break;
|
break;
|
||||||
case Models.Shell.PowerShell:
|
case Models.Shell.PowerShell:
|
||||||
startInfo.FileName = ChoosePowerShell();
|
startInfo.FileName = ChoosePowerShell();
|
||||||
startInfo.Arguments = startInfo.FileName.EndsWith("pswd.exe") ? $"-WorkingDirectory \"{workdir}\" -Nologo" : "-Nologo";
|
startInfo.Arguments = startInfo.FileName.EndsWith("pwsh.exe") ? $"-WorkingDirectory \"{workdir}\" -Nologo" : "-Nologo";
|
||||||
break;
|
break;
|
||||||
case Models.Shell.CommandPrompt:
|
case Models.Shell.CommandPrompt:
|
||||||
startInfo.FileName = "cmd";
|
startInfo.FileName = "cmd";
|
||||||
|
|
|
@ -1,106 +1,109 @@
|
||||||
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
<StreamGeometry x:Key="Icons.Window.Minimize">M0 0M1024 1024 M960 544H64a32 32 0 1 1 0-64h896a32 32 0 1 1 0 64</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Archive">M715 254h-405l-58 57h520zm-492 86v201h578V340zm405 143h-29v-29H425v29h-29v-57h231v57zm-405 295h578V559H223zm174-133h231v57h-29v-29H425v29h-29v-57z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Window.Maximize">M153 154h768v768h-768v-768zm64 64v640h640v-640h-640z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Binary">M71 1024V0h661L953 219V1024H71zm808-731-220-219H145V951h735V293zM439 512h-220V219h220V512zm-74-219H292v146h74v-146zm0 512h74v73h-220v-73H292v-146H218V585h147v219zm294-366h74V512H512v-73h74v-146H512V219h147v219zm74 439H512V585h220v293zm-74-219h-74v146h74v-146z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Window.Restore">M256 128l0 192L64 320l0 576 704 0 0-192 192 0L960 128 256 128zM704 832 128 832 128 384l576 0L704 832zM896 640l-128 0L768 320 320 320 320 192l576 0L896 640z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Blame">M128 256h192a64 64 0 110 128H128a64 64 0 110-128zm576 192h192a64 64 0 010 128h-192a64 64 0 010-128zm-576 192h192a64 64 0 010 128H128a64 64 0 010-128zm576 0h192a64 64 0 010 128h-192a64 64 0 010-128zm0-384h192a64 64 0 010 128h-192a64 64 0 010-128zM128 448h192a64 64 0 110 128H128a64 64 0 110-128zm384-320a64 64 0 0164 64v640a64 64 0 01-128 0V192a64 64 0 0164-64z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Window.Close">M519 459 222 162a37 37 0 10-52 52l297 297L169 809a37 37 0 1052 52l297-297 297 297a37 37 0 1052-52l-297-297 297-297a37 37 0 10-52-52L519 459z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.MacOS.Minimize">M1024 750v110c0 50-41 91-91 91h-841A92 92 0 010 859v-110C0 699 41 658 91 658h841c50 0 91 41 91 91z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.MacOS.Maximize">M0 4 0 20 16 20 0 4M4 0 20 0 20 16 4 0z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.MacOS.Close">M851 755q0 23-16 39l-78 78q-16 16-39 16t-39-16l-168-168-168 168q-16 16-39 16t-39-16l-78-78q-16-16-16-39t16-39l168-168-168-168q-16-16-16-39t16-39l78-78q16-16 39-16t39 16l168 168 168-168q16-16 39-16t39 16l78 78q16 16 16 39t-16 39l-168 168 168 168q16 16 16 39z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.TriangleLeft">M30 0 30 30 0 15z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.TriangleRight">M0 0 0 30 30 15z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Menu">M192 192m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM192 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM192 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM864 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32zM864 480H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32zM864 800H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Error">M576 832C576 867 547 896 512 896 477 896 448 867 448 832 448 797 477 768 512 768 547 768 576 797 576 832ZM512 256C477 256 448 285 448 320L448 640C448 675 477 704 512 704 547 704 576 675 576 640L576 320C576 285 547 256 512 256ZM1024 896C1024 967 967 1024 896 1024L128 1024C57 1024 0 967 0 896 0 875 5 855 14 837L14 837 398 69 398 69C420 28 462 0 512 0 562 0 604 28 626 69L1008 835C1018 853 1024 874 1024 896ZM960 896C960 885 957 875 952 865L952 864 951 863 569 98C557 77 536 64 512 64 488 64 466 77 455 99L452 105 92 825 93 825 71 867C66 876 64 886 64 896 64 931 93 960 128 960L896 960C931 960 960 931 960 896Z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Conflict">M608 0q48 0 88 23t63 63 23 87v70h55q35 0 67 14t57 38 38 57 14 67V831q0 34-14 66t-38 57-57 38-67 13H426q-34 0-66-13t-57-38-38-57-14-66v-70h-56q-34 0-66-14t-57-38-38-57-13-67V174q0-47 23-87T109 23 196 0h412m175 244H426q-46 0-86 22T278 328t-26 85v348H608q47 0 86-22t63-62 25-85l1-348m-269 318q18 0 31 13t13 31-13 31-31 13-31-13-13-31 13-31 31-13m0-212q13 0 22 9t11 22v125q0 14-9 23t-22 10-23-7-11-22l-1-126q0-13 10-23t23-10z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Plus">m186 532 287 0 0 287c0 11 9 20 20 20s20-9 20-20l0-287 287 0c11 0 20-9 20-20s-9-20-20-20l-287 0 0-287c0-11-9-20-20-20s-20 9-20 20l0 287-287 0c-11 0-20 9-20 20s9 20 20 20z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Settings">M928 500a21 21 0 00-19-20L858 472a11 11 0 01-9-9c-1-6-2-13-3-19a11 11 0 015-12l46-25a21 21 0 0010-26l-8-22a21 21 0 00-24-13l-51 10a11 11 0 01-12-6c-3-6-6-11-10-17a11 11 0 011-13l34-39a21 21 0 001-28l-15-18a20 20 0 00-27-4l-45 27a11 11 0 01-13-1c-5-4-10-9-15-12a11 11 0 01-3-12l19-49a21 21 0 00-9-26l-20-12a21 21 0 00-27 6L650 193a9 9 0 01-11 3c-1-1-12-5-20-7a11 11 0 01-7-10l1-52a21 21 0 00-17-22l-23-4a21 21 0 00-24 14L532 164a11 11 0 01-11 7h-20a11 11 0 01-11-7l-17-49a21 21 0 00-24-15l-23 4a21 21 0 00-17 22l1 52a11 11 0 01-8 11c-5 2-15 6-19 7c-4 1-8 0-12-4l-33-40A21 21 0 00313 146l-20 12A21 21 0 00285 184l19 49a11 11 0 01-3 12c-5 4-10 8-15 12a11 11 0 01-13 1L228 231a21 21 0 00-27 4L186 253a21 21 0 001 28L221 320a11 11 0 011 13c-3 5-7 11-10 17a11 11 0 01-12 6l-51-10a21 21 0 00-24 13l-8 22a21 21 0 0010 26l46 25a11 11 0 015 12l0 3c-1 6-2 11-3 16a11 11 0 01-9 9l-51 8A21 21 0 0096 500v23A21 21 0 00114 544l51 8a11 11 0 019 9c1 6 2 13 3 19a11 11 0 01-5 12l-46 25a21 21 0 00-10 26l8 22a21 21 0 0024 13l51-10a11 11 0 0112 6c3 6 6 11 10 17a11 11 0 01-1 13l-34 39a21 21 0 00-1 28l15 18a20 20 0 0027 4l45-27a11 11 0 0113 1c5 4 10 9 15 12a11 11 0 013 12l-19 49a21 21 0 009 26l20 12a21 21 0 0027-6L374 832c3-3 7-5 10-4c7 3 12 5 20 7a11 11 0 018 10l-1 52a21 21 0 0017 22l23 4a21 21 0 0024-14l17-50a11 11 0 0111-7h20a11 11 0 0111 7l17 49a21 21 0 0020 15a19 19 0 004 0l23-4a21 21 0 0017-22l-1-52a11 11 0 018-10c8-3 13-5 18-7l1 0c6-2 9 0 11 3l34 41A21 21 0 00710 878l20-12a21 21 0 009-26l-18-49a11 11 0 013-12c5-4 10-8 15-12a11 11 0 0113-1l45 27a21 21 0 0027-4l15-18a21 21 0 00-1-28l-34-39a11 11 0 01-1-13c3-5 7-11 10-17a11 11 0 0112-6l51 10a21 21 0 0024-13l8-22a21 21 0 00-10-26l-46-25a11 11 0 01-5-12l0-3c1-6 2-11 3-16a11 11 0 019-9l51-8a21 21 0 0018-21v-23zm-565 188a32 32 0 01-51 5a270 270 0 011-363a32 32 0 0151 6l91 161a32 32 0 010 31zM512 782a270 270 0 01-57-6a32 32 0 01-20-47l92-160a32 32 0 0127-16h184a32 32 0 0130 41c-35 109-137 188-257 188zm15-328L436 294a32 32 0 0121-47a268 268 0 0155-6c120 0 222 79 257 188a32 32 0 01-30 41h-184a32 32 0 01-28-16z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Info">M512 0C229 0 0 229 0 512s229 512 512 512 512-229 512-512S795 0 512 0zM512 928c-230 0-416-186-416-416S282 96 512 96s416 186 416 416S742 928 512 928zM538 343c47 0 83-38 83-78 0-32-21-61-62-61-55 0-82 45-82 77C475 320 498 343 538 343zM533 729c-8 0-11-10-3-40l43-166c16-61 11-100-22-100-39 0-131 40-211 108l16 27c25-17 68-35 78-35 8 0 7 10 0 36l-38 158c-23 89 1 110 34 110 33 0 118-30 196-110l-19-25C575 717 543 729 533 729z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Search">M702 677 590 565a148 148 0 10-25 27L676 703zm-346-200a115 115 0 11115 115A115 115 0 01355 478z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Clear">M512 57c251 0 455 204 455 455S763 967 512 967 57 763 57 512 261 57 512 57zm181 274c-11-11-29-11-40 0L512 472 371 331c-11-11-29-11-40 0-11 11-11 29 0 40L471 512 331 653c-11 11-11 29 0 40 11 11 29 11 40 0l141-141 141 141c11 11 29 11 40 0 11-11 11-29 0-40L552 512l141-141c11-11 11-29 0-40z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Repositories">M960 146v91C960 318 759 384 512 384S64 318 64 238V146C64 66 265 0 512 0s448 66 448 146zM960 352v206C960 638 759 704 512 704S64 638 64 558V352c96 66 272 97 448 97S864 418 960 352zm0 320v206C960 958 759 1024 512 1024S64 958 64 878V672c96 66 272 97 448 97S864 738 960 672z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Bookmark">M800 928l-512 0 0-704 224 0 0 292 113-86 111 86 0-292 128 0 0 640c0 35-29 64-64 64zM625 388l-81 64 0-260 160 0 0 260-79-64zM192 160l0 32c0 18 14 32 32 32l32 0 0 704-32 0c-35 0-64-29-64-64l0-704c0-35 29-64 64-64l576 0c24 0 44 13 55 32l-631 0c-18 0-32 14-32 32z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Bookmark">M800 928l-512 0 0-704 224 0 0 292 113-86 111 86 0-292 128 0 0 640c0 35-29 64-64 64zM625 388l-81 64 0-260 160 0 0 260-79-64zM192 160l0 32c0 18 14 32 32 32l32 0 0 704-32 0c-35 0-64-29-64-64l0-704c0-35 29-64 64-64l576 0c24 0 44 13 55 32l-631 0c-18 0-32 14-32 32z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Branch">M757 226a143 143 0 00-55 276 96 96 0 01-88 59h-191a187 187 0 00-96 27V312a143 143 0 10-96 0v399a143 143 0 10103 2 96 96 0 0188-59h191a191 191 0 00187-151 143 143 0 00-43-279zM280 130a48 48 0 110 96 48 48 0 010-96zm0 764a48 48 0 110-96 48 48 0 010 96zM757 417a48 48 0 110-96 48 48 0 010 96z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Branch.Add">M896 128h-64V64c0-35-29-64-64-64s-64 29-64 64v64h-64c-35 0-64 29-64 64s29 64 64 64h64v64c0 35 29 64 64 64s64-29 64-64V256h64c35 0 64-29 64-64s-29-64-64-64zm-204 307C673 481 628 512 576 512H448c-47 0-90 13-128 35V372C394 346 448 275 448 192c0-106-86-192-192-192S64 86 64 192c0 83 54 154 128 180v280c-74 26-128 97-128 180c0 106 86 192 192 192s192-86 192-192c0-67-34-125-84-159c22-20 52-33 84-33h128c122 0 223-85 249-199c-19 4-37 7-57 7c-26 0-51-5-76-13zM256 128c35 0 64 29 64 64s-29 64-64 64s-64-29-64-64s29-64 64-64zm0 768c-35 0-64-29-64-64s29-64 64-64s64 29 64 64s-29 64-64 64z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Check">M512 597m-1 0a1 1 0 103 0a1 1 0 10-3 0ZM810 393 732 315 448 600 293 444 214 522l156 156 78 78 362-362z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.CherryPick">M529 511c115 0 212 79 239 185h224a62 62 0 017 123l-7 0-224 0a247 247 0 01-479 0H65a62 62 0 01-7-123l7-0h224a247 247 0 01239-185zm0 124a124 124 0 100 247 124 124 0 000-247zm0-618c32 0 58 24 61 55l0 7V206c89 11 165 45 225 103a74 74 0 0122 45l0 9v87a62 62 0 01-123 7l-0-7v-65l-6-4c-43-33-97-51-163-53l-17-0c-74 0-133 18-180 54l-6 4v65a62 62 0 01-55 61l-7 0a62 62 0 01-61-55l-0-7V362c0-20 8-39 23-53 60-58 135-92 224-103V79c0-34 28-62 62-62z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Clear">M512 57c251 0 455 204 455 455S763 967 512 967 57 763 57 512 261 57 512 57zm181 274c-11-11-29-11-40 0L512 472 371 331c-11-11-29-11-40 0-11 11-11 29 0 40L471 512 331 653c-11 11-11 29 0 40 11 11 29 11 40 0l141-141 141 141c11 11 29 11 40 0 11-11 11-29 0-40L552 512l141-141c11-11 11-29 0-40z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Clean">M797 829a49 49 0 1049 49 49 49 0 00-49-49zm147-114A49 49 0 10992 764a49 49 0 00-49-49zM928 861a49 49 0 1049 49A49 49 0 00928 861zm-5-586L992 205 851 64l-71 71a67 67 0 00-94 0l235 235a67 67 0 000-94zm-853 128a32 32 0 00-32 50 1291 1291 0 0075 112L288 552c20 0 25 21 8 37l-93 86a1282 1282 0 00120 114l100-32c19-6 28 15 14 34l-40 55c26 19 53 36 82 53a89 89 0 00115-20 1391 1391 0 00256-485l-188-188s-306 224-595 198z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Commit">M796 471A292 292 0 00512 256a293 293 0 00-284 215H0v144h228A293 293 0 00512 832a291 291 0 00284-217H1024V471h-228M512 688A146 146 0 01366 544A145 145 0 01512 400c80 0 146 63 146 144A146 146 0 01512 688</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Compare">M645 448l64 64 220-221L704 64l-64 64 115 115H128v90h628zM375 576l-64-64-220 224L314 960l64-64-116-115H896v-90H262z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Conflict">M608 0q48 0 88 23t63 63 23 87v70h55q35 0 67 14t57 38 38 57 14 67V831q0 34-14 66t-38 57-57 38-67 13H426q-34 0-66-13t-57-38-38-57-14-66v-70h-56q-34 0-66-14t-57-38-38-57-13-67V174q0-47 23-87T109 23 196 0h412m175 244H426q-46 0-86 22T278 328t-26 85v348H608q47 0 86-22t63-62 25-85l1-348m-269 318q18 0 31 13t13 31-13 31-31 13-31-13-13-31 13-31 31-13m0-212q13 0 22 9t11 22v125q0 14-9 23t-22 10-23-7-11-22l-1-126q0-13 10-23t23-10z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Copy">M896 811l-128 0c-23 0-43-19-43-43 0-23 19-43 43-43l107 0c13 0 21-9 21-21L896 107c0-13-9-21-21-21L448 85c-13 0-21 9-21 21l0 21c0 23-19 43-43 43-23 0-43-19-43-43L341 85c0-47 38-85 85-85l469 0c47 0 85 38 85 85l0 640C981 772 943 811 896 811zM683 299l0 640c0 47-38 85-85 85L128 1024c-47 0-85-38-85-85L43 299c0-47 38-85 85-85l469 0C644 213 683 252 683 299zM576 299 149 299c-13 0-21 9-21 21l0 597c0 13 9 21 21 21l427 0c13 0 21-9 21-21L597 320C597 307 589 299 576 299z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Cut">M280 145l243 341 0-0 45 63-0 0 79 110a143 143 0 11-36 75l-88-123-92 126c1 4 1 9 1 13l0 5a143 143 0 11-36-95l82-113L221 188l60-43zm473 541a70 70 0 100 140 70 70 0 000-140zm-463 0a70 70 0 100 140 70 70 0 000-140zM772 145l59 43-232 319-45-63L772 145z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Detached">M128 183C128 154 154 128 183 128h521c30 0 55 26 55 55v38c0 17-17 34-34 34s-34-17-34-34v-26H196v495h26c17 0 34 17 34 34s-17 34-34 34h-38c-30 0-55-26-55-55V183zM380 896h-34c-26 0-47-21-47-47v-90h68V828h64V896H380c4 0 0 0 0 0zM759 828V896h90c26 0 47-21 47-47v-90h-68V828h-68zM828 435H896V346c0-26-21-47-47-47h-90v68H828v68zM435 299v68H367V439H299V346C299 320 320 299 346 299h90zM367 649H299v-107h68v107zM546 367V299h107v68h-107zM828 546H896v107h-68v-107zM649 828V896h-107v-68h107zM730 508v188c0 17-17 34-34 34h-188c-17 0-34-17-34-34s17-34 34-34h102l-124-124c-13-13-13-34 0-47 13-13 34-13 47 0l124 124V512c0-17 17-34 34-34 21-4 38 9 38 30z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Detail">M888.8 0H135.2c-32.3 0-58.9 26.1-58.9 58.9v906.2c0 32.3 26.1 58.9 58.9 58.9h753.2c32.3 0 58.9-26.1 58.9-58.9v-906.2c.5-32.8-26.1-58.9-58.4-58.9zm-164.9 176.6c30.7 0 55.8 25.1 55.8 55.8s-25.1 55.8-55.8 55.8s-55.8-25.1-55.8-55.8s24.6-55.8 55.8-55.8zm-212 0c30.7 0 55.8 25.1 55.8 55.8S542.7 288.3 512 288.3s-55.8-25.1-55.8-55.8S481.3 176.6 512 176.6zm-212 0c30.7 0 55.8 25.1 55.8 55.8s-25.1 55.8-55.8 55.8s-55.8-25.1-55.8-55.8s25.1-55.8 55.8-55.8zm208.9 606.2H285.2c-24.6 0-44-20-44-44c0-24.6 20-44 44-44h223.7c24.6 0 44 20 44 44c0 24.1-19.5 44-44 44zm229.9-212H285.2c-24.6 0-44-20-44-44c0-24.6 20-44 44-44h453.1c24.6 0 44 20 44 44c.5 24.1-19.5 44-43.5 44z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Diff">M854 307 611 73c-6-6-14-9-22-9H296c-4 0-8 4-8 8v56c0 4 4 8 8 8h277l219 211V824c0 4 4 8 8 8h56c4 0 8-4 8-8V330c0-9-4-17-10-23zM553 201c-6-6-14-9-23-9H192c-18 0-32 14-32 32v704c0 18 14 32 32 32h512c18 0 32-14 32-32V397c0-9-3-17-9-23L553 201zM568 753c0 4-3 7-8 7h-225c-4 0-8-3-8-7v-42c0-4 3-7 8-7h225c4 0 8 3 8 7v42zm0-220c0 4-3 7-8 7H476v85c0 4-3 7-7 7h-42c-4 0-7-3-7-7V540h-85c-4 0-8-3-8-7v-42c0-4 3-7 8-7H420v-85c0-4 3-7 7-7h42c4 0 7 3 7 7V484h85c4 0 8 3 8 7v42z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.DoubleDown">M256 224l0 115L512 544l256-205 0-115-256 205L256 224zM512 685l-256-205L256 595 512 800 768 595l0-115L512 685z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.DoubleUp">M768 800V685L512 480 256 685V800l256-205L768 800zM512 339 768 544V429L512 224 256 429V544l256-205z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Down">M509 546l271-271 91 91-348 349-1-1-13 13-363-361 91-91z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Edit">M652 157a113 113 0 11156 161L731 395 572 236l80-80 1 1zM334 792v0H175v-159l358-358 159 159-358 358zM62 850h900v113H62v-113z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Empty">M469 235V107h85v128h-85zm-162-94 85 85-60 60-85-85 60-60zm469 60-85 85-60-60 85-85 60 60zm-549 183A85 85 0 01302 341H722a85 85 0 0174 42l131 225A85 85 0 01939 652V832a85 85 0 01-85 85H171a85 85 0 01-85-85v-180a85 85 0 0112-43l131-225zM722 427H302l-100 171h255l10 29a59 59 0 002 5c2 4 5 9 9 14 8 9 18 17 34 17 16 0 26-7 34-17a72 72 0 0011-18l0-0 10-29h255l-100-171zM853 683H624a155 155 0 01-12 17C593 722 560 747 512 747c-48 0-81-25-99-47a155 155 0 01-12-17H171v149h683v-149z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Error">M576 832C576 867 547 896 512 896 477 896 448 867 448 832 448 797 477 768 512 768 547 768 576 797 576 832ZM512 256C477 256 448 285 448 320L448 640C448 675 477 704 512 704 547 704 576 675 576 640L576 320C576 285 547 256 512 256ZM1024 896C1024 967 967 1024 896 1024L128 1024C57 1024 0 967 0 896 0 875 5 855 14 837L14 837 398 69 398 69C420 28 462 0 512 0 562 0 604 28 626 69L1008 835C1018 853 1024 874 1024 896ZM960 896C960 885 957 875 952 865L952 864 951 863 569 98C557 77 536 64 512 64 488 64 466 77 455 99L452 105 92 825 93 825 71 867C66 876 64 886 64 896 64 931 93 960 128 960L896 960C931 960 960 931 960 896Z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Eye">M520 168C291 168 95 311 16 512c79 201 275 344 504 344 229 0 425-143 504-344-79-201-275-344-504-344zm0 573c-126 0-229-103-229-229s103-229 229-229c126 0 229 103 229 229s-103 229-229 229zm0-367c-76 0-137 62-137 137s62 137 137 137S657 588 657 512s-62-137-137-137z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.EyeClose">M734 128c-33-19-74-8-93 25l-41 70c-28-6-58-9-90-9-294 0-445 298-445 298s82 149 231 236l-31 54c-19 33-8 74 25 93 33 19 74 8 93-25L759 222C778 189 767 147 734 128zM305 512c0-115 93-208 207-208 14 0 27 1 40 4l-37 64c-1 0-2 0-2 0-77 0-140 63-140 140 0 26 7 51 20 71l-37 64C324 611 305 564 305 512zM771 301 700 423c13 27 20 57 20 89 0 110-84 200-192 208l-51 89c12 1 24 2 36 2 292 0 446-298 446-298S895 388 771 301z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.FastForward">M826 498 538 250c-11-9-26-1-26 14v496c0 15 16 23 26 14L826 526c8-7 8-21 0-28zm-320 0L218 250c-11-9-26-1-26 14v496c0 15 16 23 26 14L506 526c4-4 6-9 6-14 0-5-2-10-6-14z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Fetch">M1024 896v128H0V704h128v192h768V704h128v192zM576 555 811 320 896 405l-384 384-384-384L213 320 448 555V0h128v555z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.File">M959 320H960v640A64 64 0 01896 1024H192A64 64 0 01128 960V64A64 64 0 01192 0H640v321h320L959 320zM320 544c0 17 14 32 32 32h384A32 32 0 00768 544c0-17-14-32-32-32H352A32 32 0 00320 544zm0 128c0 17 14 32 32 32h384a32 32 0 0032-32c0-17-14-32-32-32H352a32 32 0 00-32 32zm0 128c0 17 14 32 32 32h384a32 32 0 0032-32c0-17-14-32-32-32H352a32 32 0 00-32 32z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.File.Add">M683 85l213 213v598a42 42 0 01-42 42H170A43 43 0 01128 896V128C128 104 147 85 170 85H683zm-213 384H341v85h128v128h85v-128h128v-85h-128V341h-85v128z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.File.Ignore">M416 832H128V128h384v192C512 355 541 384 576 384L768 384v32c0 19 13 32 32 32S832 435 832 416v-64c0-6 0-19-6-25l-256-256c-6-6-19-6-25-6H128A64 64 0 0064 128v704C64 867 93 896 129 896h288c19 0 32-13 32-32S435 832 416 832zM576 172 722 320H576V172zM736 512C614 512 512 614 512 736S614 960 736 960s224-102 224-224S858 512 736 512zM576 736C576 646 646 576 736 576c32 0 58 6 83 26l-218 218c-19-26-26-51-26-83zm160 160c-32 0-64-13-96-32l224-224c19 26 32 58 32 96 0 90-70 160-160 160z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.File.Remove">M896 320c0-19-6-32-19-45l-192-192c-13-13-26-19-45-19H192c-38 0-64 26-64 64v768c0 38 26 64 64 64h640c38 0 64-26 64-64V320zm-256 384H384c-19 0-32-13-32-32s13-32 32-32h256c19 0 32 13 32 32s-13 32-32 32zm166-384H640V128l192 192h-26z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Filter">M599 425 599 657 425 832 425 425 192 192 832 192Z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Folder">M64 864h896V288h-396a64 64 0 01-57-35L460 160H64v704zm-64 32V128a32 32 0 0132-32h448a32 32 0 0129 18L564 224H992a32 32 0 0132 32v640a32 32 0 01-32 32H32a32 32 0 01-32-32z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Folder">M64 864h896V288h-396a64 64 0 01-57-35L460 160H64v704zm-64 32V128a32 32 0 0132-32h448a32 32 0 0129 18L564 224H992a32 32 0 0132 32v640a32 32 0 01-32 32H32a32 32 0 01-32-32z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Folder.Add">M1088 227H609L453 78a11 11 0 00-7-3H107a43 43 0 00-43 43v789a43 43 0 0043 43h981a43 43 0 0043-43V270a43 43 0 00-43-43zM757 599c0 5-5 9-10 9h-113v113c0 5-4 9-9 9h-56c-5 0-9-4-9-9V608h-113c-5 0-10-4-10-9V543c0-5 5-9 10-9h113V420c0-5 4-9 9-9h56c5 0 9 4 9 9V533h113c5 0 10 4 10 9v56z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Folder.Add">M1088 227H609L453 78a11 11 0 00-7-3H107a43 43 0 00-43 43v789a43 43 0 0043 43h981a43 43 0 0043-43V270a43 43 0 00-43-43zM757 599c0 5-5 9-10 9h-113v113c0 5-4 9-9 9h-56c-5 0-9-4-9-9V608h-113c-5 0-10-4-10-9V543c0-5 5-9 10-9h113V420c0-5 4-9 9-9h56c5 0 9 4 9 9V533h113c5 0 10 4 10 9v56z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Folder.Add2">M960 784h-48v-48a48 48 0 10-96 0v48h-48a48 48 0 100 96h48v48a48 48 0 1096 0v-48h48a48 48 0 100-96zM0 816a48 48 0 0048 48h630A96 96 0 01672 832a96 96 0 0196-96 96 96 0 11192 0c25 0 47 10 64 25V304H0v512zm976-656H384L288 64H48a48 48 0 00-48 48v144h1024v-48a48 48 0 00-48-48z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Folder.Add2">M960 784h-48v-48a48 48 0 10-96 0v48h-48a48 48 0 100 96h48v48a48 48 0 1096 0v-48h48a48 48 0 100-96zM0 816a48 48 0 0048 48h630A96 96 0 01672 832a96 96 0 0196-96 96 96 0 11192 0c25 0 47 10 64 25V304H0v512zm976-656H384L288 64H48a48 48 0 00-48 48v144h1024v-48a48 48 0 00-48-48z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Folder.Fill">M448 64l128 128h448v768H0V64z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Folder.Fill">M448 64l128 128h448v768H0V64z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Folder.Open">M832 960l192-512H192L0 960zM128 384L0 960V128h288l128 128h416v128z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Folder.Open">M832 960l192-512H192L0 960zM128 384L0 960V128h288l128 128h416v128z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.File">M959 320H960v640A64 64 0 01896 1024H192A64 64 0 01128 960V64A64 64 0 01192 0H640v321h320L959 320zM320 544c0 17 14 32 32 32h384A32 32 0 00768 544c0-17-14-32-32-32H352A32 32 0 00320 544zm0 128c0 17 14 32 32 32h384a32 32 0 0032-32c0-17-14-32-32-32H352a32 32 0 00-32 32zm0 128c0 17 14 32 32 32h384a32 32 0 0032-32c0-17-14-32-32-32H352a32 32 0 00-32 32z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow">M509 556l93 149h124l-80-79 49-50 165 164-165 163-49-50 79-79h-163l-96-153 41-65zm187-395 165 164-165 163-49-50L726 360H530l-136 224H140v-70h215l136-224h236l-80-79 49-50z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.File.Add">M683 85l213 213v598a42 42 0 01-42 42H170A43 43 0 01128 896V128C128 104 147 85 170 85H683zm-213 384H341v85h128v128h85v-128h128v-85h-128V341h-85v128z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.File.Remove">M896 320c0-19-6-32-19-45l-192-192c-13-13-26-19-45-19H192c-38 0-64 26-64 64v768c0 38 26 64 64 64h640c38 0 64-26 64-64V320zm-256 384H384c-19 0-32-13-32-32s13-32 32-32h256c19 0 32 13 32 32s-13 32-32 32zm166-384H640V128l192 192h-26z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.File.Ignore">M416 832H128V128h384v192C512 355 541 384 576 384L768 384v32c0 19 13 32 32 32S832 435 832 416v-64c0-6 0-19-6-25l-256-256c-6-6-19-6-25-6H128A64 64 0 0064 128v704C64 867 93 896 129 896h288c19 0 32-13 32-32S435 832 416 832zM576 172 722 320H576V172zM736 512C614 512 512 614 512 736S614 960 736 960s224-102 224-224S858 512 736 512zM576 736C576 646 646 576 736 576c32 0 58 6 83 26l-218 218c-19-26-26-51-26-83zm160 160c-32 0-64-13-96-32l224-224c19 26 32 58 32 96 0 90-70 160-160 160z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Binary">M71 1024V0h661L953 219V1024H71zm808-731-220-219H145V951h735V293zM439 512h-220V219h220V512zm-74-219H292v146h74v-146zm0 512h74v73h-220v-73H292v-146H218V585h147v219zm294-366h74V512H512v-73h74v-146H512V219h147v219zm74 439H512V585h220v293zm-74-219h-74v146h74v-146z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Fetch">M1024 896v128H0V704h128v192h768V704h128v192zM576 555 811 320 896 405l-384 384-384-384L213 320 448 555V0h128v555z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Pull">M432 0h160c27 0 48 21 48 48v336h175c36 0 53 43 28 68L539 757c-15 15-40 15-55 0L180 452c-25-25-7-68 28-68H384V48c0-27 21-48 48-48zm592 752v224c0 27-21 48-48 48H48c-27 0-48-21-48-48V752c0-27 21-48 48-48h293l98 98c40 40 105 40 145 0l98-98H976c27 0 48 21 48 48zm-248 176c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40zm128 0c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Push">M592 768h-160c-27 0-48-21-48-48V384h-175c-36 0-53-43-28-68L485 11c15-15 40-15 55 0l304 304c25 25 7 68-28 68H640v336c0 27-21 48-48 48zm432-16v224c0 27-21 48-48 48H48c-27 0-48-21-48-48V752c0-27 21-48 48-48h272v16c0 62 50 112 112 112h160c62 0 112-50 112-112v-16h272c27 0 48 21 48 48zm-248 176c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40zm128 0c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Stashes">M961 320 512 577 63 320 512 62l449 258zM512 628 185 442 63 512 512 770 961 512l-123-70L512 628zM512 821 185 634 63 704 512 962l449-258L839 634 512 821z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Terminal">M144 112h736c18 0 32 14 32 32v736c0 18-14 32-32 32H144c-18 0-32-14-32-32V144c0-18 14-32 32-32zm112 211v72a9 9 0 003 7L386 509 259 615a9 9 0 00-3 7v72a9 9 0 0015 7L493 516a9 9 0 000-14l-222-186a9 9 0 00-15 7zM522 624a10 10 0 00-10 10v60a10 10 0 0010 10h237a10 10 0 0010-10v-60a10 10 0 00-10-10H522z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Flow">M509 556l93 149h124l-80-79 49-50 165 164-165 163-49-50 79-79h-163l-96-153 41-65zm187-395 165 164-165 163-49-50L726 360H530l-136 224H140v-70h215l136-224h236l-80-79 49-50z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.OpenWith">M683 409v204L1024 308 683 0v191c-413 0-427 526-427 526c117-229 203-307 427-307zm85 492H102V327h153s38-63 114-122H51c-28 0-51 27-51 61v697c0 34 23 61 51 61h768c28 0 51-27 51-61V614l-102 100v187z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Edit">M652 157a113 113 0 11156 161L731 395 572 236l80-80 1 1zM334 792v0H175v-159l358-358 159 159-358 358zM62 850h900v113H62v-113z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Rename">M853 256h-43v512h43c47 0 85-38 85-85v-341c0-47-38-85-85-85zM725 768V171h128V85h-341v85H640v85H171c-47 0-85 38-85 85v341c0 47 38 85 85 85h469V853h-128v85h341v-85H725v-86zm-469-171v-171h384v171H256z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Undo">M762 1024C876 818 895 504 448 514V768L64 384l384-384v248c535-14 595 472 314 776z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Diff">M854 307 611 73c-6-6-14-9-22-9H296c-4 0-8 4-8 8v56c0 4 4 8 8 8h277l219 211V824c0 4 4 8 8 8h56c4 0 8-4 8-8V330c0-9-4-17-10-23zM553 201c-6-6-14-9-23-9H192c-18 0-32 14-32 32v704c0 18 14 32 32 32h512c18 0 32-14 32-32V397c0-9-3-17-9-23L553 201zM568 753c0 4-3 7-8 7h-225c-4 0-8-3-8-7v-42c0-4 3-7 8-7h225c4 0 8 3 8 7v42zm0-220c0 4-3 7-8 7H476v85c0 4-3 7-7 7h-42c-4 0-7-3-7-7V540h-85c-4 0-8-3-8-7v-42c0-4 3-7 8-7H420v-85c0-4 3-7 7-7h42c4 0 7 3 7 7V484h85c4 0 8 3 8 7v42z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Clean">M797 829a49 49 0 1049 49 49 49 0 00-49-49zm147-114A49 49 0 10992 764a49 49 0 00-49-49zM928 861a49 49 0 1049 49A49 49 0 00928 861zm-5-586L992 205 851 64l-71 71a67 67 0 00-94 0l235 235a67 67 0 000-94zm-853 128a32 32 0 00-32 50 1291 1291 0 0075 112L288 552c20 0 25 21 8 37l-93 86a1282 1282 0 00120 114l100-32c19-6 28 15 14 34l-40 55c26 19 53 36 82 53a89 89 0 00115-20 1391 1391 0 00256-485l-188-188s-306 224-595 198z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Commit">M796 471A292 292 0 00512 256a293 293 0 00-284 215H0v144h228A293 293 0 00512 832a291 291 0 00284-217H1024V471h-228M512 688A146 146 0 01366 544A145 145 0 01512 400c80 0 146 63 146 144A146 146 0 01512 688</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.CherryPick">M529 511c115 0 212 79 239 185h224a62 62 0 017 123l-7 0-224 0a247 247 0 01-479 0H65a62 62 0 01-7-123l7-0h224a247 247 0 01239-185zm0 124a124 124 0 100 247 124 124 0 000-247zm0-618c32 0 58 24 61 55l0 7V206c89 11 165 45 225 103a74 74 0 0122 45l0 9v87a62 62 0 01-123 7l-0-7v-65l-6-4c-43-33-97-51-163-53l-17-0c-74 0-133 18-180 54l-6 4v65a62 62 0 01-55 61l-7 0a62 62 0 01-61-55l-0-7V362c0-20 8-39 23-53 60-58 135-92 224-103V79c0-34 28-62 62-62z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Merge">M824 645V307c0-56-46-102-102-102h-102V102l-154 154 154 154V307h102v338c-46 20-82 67-82 123 0 72 61 133 133 133 72 0 133-61 133-133 0-56-36-102-82-123zm-51 195c-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72s-31 72-72 72zM384 256c0-72-61-133-133-133-72 0-133 61-133 133 0 56 36 102 82 123v266C154 666 118 712 118 768c0 72 61 133 133 133 72 0 133-61 133-133 0-56-36-102-82-123V379C348 358 384 312 384 256zM323 768c0 41-31 72-72 72-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72zM251 328c-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72s-31 72-72 72z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.FastForward">M826 498 538 250c-11-9-26-1-26 14v496c0 15 16 23 26 14L826 526c8-7 8-21 0-28zm-320 0L218 250c-11-9-26-1-26 14v496c0 15 16 23 26 14L506 526c4-4 6-9 6-14 0-5-2-10-6-14z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.SquashIntoParent">M512 939C465 939 427 900 427 853 427 806 465 768 512 768 559 768 597 806 597 853 597 900 559 939 512 939M555 85 555 555 747 363 807 423 512 719 217 423 277 363 469 555 469 85 555 85Z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Reset">M883 567l-128-128c-17-17-43-17-60 0l-128 128c-17 17-17 43 0 60 17 17 43 17 60 0l55-55V683c0 21-21 43-43 43H418c-13-38-43-64-77-77V375c51-17 85-64 85-119 0-73-60-128-128-128-73 0-128 55-128 128 0 55 34 102 85 119v269c-51 17-85 64-85 119 0 73 55 128 128 128 55 0 102-34 119-85H640c73 0 128-55 128-128v-111l55 55c9 9 17 13 30 13 13 0 21-4 30-13 17-13 17-43 0-55zM299 213c26 0 43 17 43 43 0 21-21 43-43 43-26 0-43-21-43-43 0-26 17-43 43-43zm0 597c-26 0-43-21-43-43 0-26 17-43 43-43s43 17 43 43c0 21-17 43-43 43zM725 384c-73 0-128-60-128-128 0-73 55-128 128-128s128 55 128 128c0 68-55 128-128 128zm0-171c-26 0-43 17-43 43s17 43 43 43 43-17 43-43-17-43-43-43z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Rebase">M277 85a149 149 0 00-43 292v230a32 32 0 0064 0V555h267A160 160 0 00725 395v-12a149 149 0 10-64-5v17a96 96 0 01-96 96H299V383A149 149 0 00277 85zM228 720a32 32 0 00-37-52 150 150 0 00-53 68 32 32 0 1060 23 85 85 0 0130-39zm136-52a32 32 0 00-37 52 86 86 0 0130 39 32 32 0 1060-23 149 149 0 00-53-68zM204 833a32 32 0 10-55 32 149 149 0 0063 58 32 32 0 0028-57 85 85 0 01-36-33zm202 32a32 32 0 00-55-32 85 85 0 01-36 33 32 32 0 0028 57 149 149 0 0063-58z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Send">M0 586l404 119 498-410-386 441-2 251 155-205 279 83L1170 37z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Blame">M128 256h192a64 64 0 110 128H128a64 64 0 110-128zm576 192h192a64 64 0 010 128h-192a64 64 0 010-128zm-576 192h192a64 64 0 010 128H128a64 64 0 010-128zm576 0h192a64 64 0 010 128h-192a64 64 0 010-128zm0-384h192a64 64 0 010 128h-192a64 64 0 010-128zM128 448h192a64 64 0 110 128H128a64 64 0 110-128zm384-320a64 64 0 0164 64v640a64 64 0 01-128 0V192a64 64 0 0164-64z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Histories">M24 512A488 488 0 01512 24A488 488 0 011000 512A488 488 0 01512 1000A488 488 0 0124 512zm447-325v327L243 619l51 111 300-138V187H471z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Archive">M715 254h-405l-58 57h520zm-492 86v201h578V340zm405 143h-29v-29H425v29h-29v-57h231v57zm-405 295h578V559H223zm174-133h231v57h-29v-29H425v29h-29v-57z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Branch">M757 226a143 143 0 00-55 276 96 96 0 01-88 59h-191a187 187 0 00-96 27V312a143 143 0 10-96 0v399a143 143 0 10103 2 96 96 0 0188-59h191a191 191 0 00187-151 143 143 0 00-43-279zM280 130a48 48 0 110 96 48 48 0 010-96zm0 764a48 48 0 110-96 48 48 0 010 96zM757 417a48 48 0 110-96 48 48 0 010 96z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Branch.Add">M896 128h-64V64c0-35-29-64-64-64s-64 29-64 64v64h-64c-35 0-64 29-64 64s29 64 64 64h64v64c0 35 29 64 64 64s64-29 64-64V256h64c35 0 64-29 64-64s-29-64-64-64zm-204 307C673 481 628 512 576 512H448c-47 0-90 13-128 35V372C394 346 448 275 448 192c0-106-86-192-192-192S64 86 64 192c0 83 54 154 128 180v280c-74 26-128 97-128 180c0 106 86 192 192 192s192-86 192-192c0-67-34-125-84-159c22-20 52-33 84-33h128c122 0 223-85 249-199c-19 4-37 7-57 7c-26 0-51-5-76-13zM256 128c35 0 64 29 64 64s-29 64-64 64s-64-29-64-64s29-64 64-64zm0 768c-35 0-64-29-64-64s29-64 64-64s64 29 64 64s-29 64-64 64z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Remote">M706 302a289 289 0 00-173 44 27 27 0 1029 46 234 234 0 01125-36c23 0 45 3 66 9 93 28 161 114 161 215C914 704 813 805 687 805H337C211 805 110 704 110 580c0-96 61-178 147-210C282 263 379 183 495 183a245 245 0 01210 119z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Remote.Add">M364 512h67v108h108v67h-108v108h-67v-108h-108v-67h108v-108zm298-64A107 107 0 01768 555C768 614 720 660 660 660h-108v-54h-108v-108h-94v108h-94c4-21 22-47 44-51l-1-12a75 75 0 0171-75a128 128 0 01239-7a106 106 0 0153-14z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Tag">M177 156c-22 5-33 17-36 37c-10 57-33 258-13 278l445 445c23 23 61 23 84 0l246-246c23-23 23-61 0-84l-445-445C437 120 231 145 177 156zM331 344c-26 26-69 26-95 0c-26-26-26-69 0-95s69-26 95 0C357 276 357 318 331 344z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Tag.Add">M683 537h-144v-142h-142V283H239a44 44 0 00-41 41v171a56 56 0 0014 34l321 321a41 41 0 0058 0l174-174a41 41 0 000-58zm-341-109a41 41 0 110-58a41 41 0 010 58zM649 284V142h-69v142h-142v68h142v142h69v-142h142v-68h-142z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Submodule">M557.7 545.3 789.9 402.7c24-15 31.3-46.5 16.4-70.5c-14.8-23.8-46-31.2-70-16.7L506.5 456.6 277.1 315.4c-24.1-14.8-55.6-7.3-70.5 16.8c-14.8 24.1-7.3 55.6 16.8 70.5l231.8 142.6V819.1c0 28.3 22.9 51.2 51.2 51.2c28.3 0 51.2-22.9 51.2-51.2V545.3h.1zM506.5 0l443.4 256v511.9L506.5 1023.9 63.1 767.9v-511.9L506.5 0z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Submodule.Add">M770 320a41 41 0 00-56-14l-252 153L207 306a41 41 0 10-43 70l255 153 2 296a41 41 0 0082 0l-2-295 255-155a41 41 0 0014-56zM481 935a42 42 0 01-42 0L105 741a42 42 0 01-21-36v-386a42 42 0 0121-36L439 89a42 42 0 0142 0l335 193a42 42 0 0121 36v87h84v-87a126 126 0 00-63-109L523 17a126 126 0 00-126 0L63 210a126 126 0 00-63 109v386a126 126 0 0063 109l335 193a126 126 0 00126 0l94-54-42-72zM1029 700h-126v-125a42 42 0 00-84 0v126h-126a42 42 0 000 84h126v126a42 42 0 1084 0v-126h126a42 42 0 000-84z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Waiting">M812 864h-29V654c0-21-11-40-28-52l-133-88 134-89c18-12 28-31 28-52V164h28c18 0 32-14 32-32s-14-32-32-32H212c-18 0-32 14-32 32s14 32 32 32h30v210c0 21 11 40 28 52l133 88-134 89c-18 12-28 31-28 52V864H212c-18 0-32 14-32 32s14 32 32 32h600c18 0 32-14 32-32s-14-32-32-32zM441 566c18-12 28-31 28-52s-11-40-28-52L306 373V164h414v209l-136 90c-18 12-28 31-28 52 0 21 11 40 28 52l135 89V695c-9-7-20-13-32-19-30-15-93-41-176-41-63 0-125 14-175 38-12 6-22 12-31 18v-36l136-90z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Loading">M512 0C233 0 7 223 0 500C6 258 190 64 416 64c230 0 416 200 416 448c0 53 43 96 96 96s96-43 96-96c0-283-229-512-512-512zm0 1023c279 0 505-223 512-500c-6 242-190 436-416 436c-230 0-416-200-416-448c0-53-43-96-96-96s-96 43-96 96c0 283 229 512 512 512z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Detail">M888.8 0H135.2c-32.3 0-58.9 26.1-58.9 58.9v906.2c0 32.3 26.1 58.9 58.9 58.9h753.2c32.3 0 58.9-26.1 58.9-58.9v-906.2c.5-32.8-26.1-58.9-58.4-58.9zm-164.9 176.6c30.7 0 55.8 25.1 55.8 55.8s-25.1 55.8-55.8 55.8s-55.8-25.1-55.8-55.8s24.6-55.8 55.8-55.8zm-212 0c30.7 0 55.8 25.1 55.8 55.8S542.7 288.3 512 288.3s-55.8-25.1-55.8-55.8S481.3 176.6 512 176.6zm-212 0c30.7 0 55.8 25.1 55.8 55.8s-25.1 55.8-55.8 55.8s-55.8-25.1-55.8-55.8s25.1-55.8 55.8-55.8zm208.9 606.2H285.2c-24.6 0-44-20-44-44c0-24.6 20-44 44-44h223.7c24.6 0 44 20 44 44c0 24.1-19.5 44-44 44zm229.9-212H285.2c-24.6 0-44-20-44-44c0-24.6 20-44 44-44h453.1c24.6 0 44 20 44 44c.5 24.1-19.5 44-43.5 44z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Check">M512 597m-1 0a1 1 0 103 0a1 1 0 10-3 0ZM810 393 732 315 448 600 293 444 214 522l156 156 78 78 362-362z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.List">M0 33h1024v160H0zM0 432h1024v160H0zM0 831h1024v160H0z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Tree">M912 800a48 48 0 1 1 0 96h-416a48 48 0 1 1 0-96h416z m-704-704A112 112 0 0 1 256 309.184V480h80a48 48 0 0 1 0 96H256v224h81.664a48 48 0 1 1 0 96H256a96 96 0 0 1-96-96V309.248A112 112 0 0 1 208 96z m704 384a48 48 0 1 1 0 96h-416a48 48 0 0 1 0-96h416z m0-320a48 48 0 1 1 0 96h-416a48 48 0 0 1 0-96h416z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Grid">M30 271l241 0 0-241-241 0 0 241zM392 271l241 0 0-241-241 0 0 241zM753 30l0 241 241 0 0-241-241 0zM30 632l241 0 0-241-241 0 0 241zM392 632l241 0 0-241-241 0 0 241zM753 632l241 0 0-241-241 0 0 241zM30 994l241 0 0-241-241 0 0 241zM392 994l241 0 0-241-241 0 0 241zM753 994l241 0 0-241-241 0 0 241z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Down">M509 546l271-271 91 91-348 349-1-1-13 13-363-361 91-91z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.DoubleDown">M256 224l0 115L512 544l256-205 0-115-256 205L256 224zM512 685l-256-205L256 595 512 800 768 595l0-115L512 685z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Up">M170 831l343-342L855 831l105-105-448-448L64 726 170 831z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.DoubleUp">M768 800V685L512 480 256 685V800l256-205L768 800zM512 339 768 544V429L512 224 256 429V544l256-205z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Filter">M599 425 599 657 425 832 425 425 192 192 832 192Z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Cut">M280 145l243 341 0-0 45 63-0 0 79 110a143 143 0 11-36 75l-88-123-92 126c1 4 1 9 1 13l0 5a143 143 0 11-36-95l82-113L221 188l60-43zm473 541a70 70 0 100 140 70 70 0 000-140zm-463 0a70 70 0 100 140 70 70 0 000-140zM772 145l59 43-232 319-45-63L772 145z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Copy">M896 811l-128 0c-23 0-43-19-43-43 0-23 19-43 43-43l107 0c13 0 21-9 21-21L896 107c0-13-9-21-21-21L448 85c-13 0-21 9-21 21l0 21c0 23-19 43-43 43-23 0-43-19-43-43L341 85c0-47 38-85 85-85l469 0c47 0 85 38 85 85l0 640C981 772 943 811 896 811zM683 299l0 640c0 47-38 85-85 85L128 1024c-47 0-85-38-85-85L43 299c0-47 38-85 85-85l469 0C644 213 683 252 683 299zM576 299 149 299c-13 0-21 9-21 21l0 597c0 13 9 21 21 21l427 0c13 0 21-9 21-21L597 320C597 307 589 299 576 299z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Paste">M544 85c49 0 90 37 95 85h75a96 96 0 0196 89L811 267a32 32 0 01-28 32L779 299a32 32 0 01-32-28L747 267a32 32 0 00-28-32L715 235h-91a96 96 0 01-80 42H395c-33 0-62-17-80-42L224 235a32 32 0 00-32 28L192 267v576c0 16 12 30 28 32l4 0h128a32 32 0 0132 28l0 4a32 32 0 01-32 32h-128a96 96 0 01-96-89L128 843V267a96 96 0 0189-96L224 171h75a96 96 0 0195-85h150zm256 256a96 96 0 0196 89l0 7v405a96 96 0 01-89 96L800 939h-277a96 96 0 01-96-89L427 843v-405a96 96 0 0189-96L523 341h277zm-256-192H395a32 32 0 000 64h150a32 32 0 100-64z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Save">M293 122v244h439V146l171 175V829a73 73 0 01-73 73h-98V536H293v366H195a73 73 0 01-73-73V195a73 73 0 0173-73h98zm366 512v268H366V634h293zm-49 49h-195v73h195v-73zm49-561v171H366V122h293z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Eye">M520 168C291 168 95 311 16 512c79 201 275 344 504 344 229 0 425-143 504-344-79-201-275-344-504-344zm0 573c-126 0-229-103-229-229s103-229 229-229c126 0 229 103 229 229s-103 229-229 229zm0-367c-76 0-137 62-137 137s62 137 137 137S657 588 657 512s-62-137-137-137z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.EyeClose">M734 128c-33-19-74-8-93 25l-41 70c-28-6-58-9-90-9-294 0-445 298-445 298s82 149 231 236l-31 54c-19 33-8 74 25 93 33 19 74 8 93-25L759 222C778 189 767 147 734 128zM305 512c0-115 93-208 207-208 14 0 27 1 40 4l-37 64c-1 0-2 0-2 0-77 0-140 63-140 140 0 26 7 51 20 71l-37 64C324 611 305 564 305 512zM771 301 700 423c13 27 20 57 20 89 0 110-84 200-192 208l-51 89c12 1 24 2 36 2 292 0 446-298 446-298S895 388 771 301z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Empty">M469 235V107h85v128h-85zm-162-94 85 85-60 60-85-85 60-60zm469 60-85 85-60-60 85-85 60 60zm-549 183A85 85 0 01302 341H722a85 85 0 0174 42l131 225A85 85 0 01939 652V832a85 85 0 01-85 85H171a85 85 0 01-85-85v-180a85 85 0 0112-43l131-225zM722 427H302l-100 171h255l10 29a59 59 0 002 5c2 4 5 9 9 14 8 9 18 17 34 17 16 0 26-7 34-17a72 72 0 0011-18l0-0 10-29h255l-100-171zM853 683H624a155 155 0 01-12 17C593 722 560 747 512 747c-48 0-81-25-99-47a155 155 0 01-12-17H171v149h683v-149z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Statistics">M447 561a26 26 0 0126 26v171H421v-171a26 26 0 0126-26zm-98 65a26 26 0 0126 26v104H323v-104a26 26 0 0126-26zm0 0M561 268a32 32 0 0132 30v457h-65V299a32 32 0 0132-32zm0 0M675 384a26 26 0 0126 26v348H649v-350a26 26 0 0126-24zm0 0M801 223v579H223V223h579M805 171H219A49 49 0 00171 219v585A49 49 0 00219 853h585A49 49 0 00853 805V219A49 49 0 00805 171z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Hotkeys">M512 0C229.216 0 0 229.216 0 512c0 282.752 229.216 512 512 512s512-229.248 512-512c0-282.784-229.216-512-512-512z m0 957.92C266.112 957.92 66.08 757.888 66.08 512S266.112 66.08 512 66.08 957.92 266.112 957.92 512 757.888 957.92 512 957.92zM192 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32H192a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM384 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM576 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM832 320h-64a32 32 0 0 0-32 32v128h-160a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32zM320 544v-32a32 32 0 0 0-32-32H192a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h96a32 32 0 0 0 32-32zM384 576h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM800 640H256a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h544a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.LayoutHorizontal">M875 117H149C109 117 75 151 75 192v640c0 41 34 75 75 75h725c41 0 75-34 75-75V192c0-41-34-75-75-75zM139 832V192c0-6 4-11 11-11h331v661H149c-6 0-11-4-11-11zm747 0c0 6-4 11-11 11H544v-661H875c6 0 11 4 11 11v640z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.LayoutVertical">M875 117H149C109 117 75 151 75 192v640c0 41 34 75 75 75h725c41 0 75-34 75-75V192c0-41-34-75-75-75zm-725 64h725c6 0 11 4 11 11v288h-747V192c0-6 4-11 11-11zm725 661H149c-6 0-11-4-11-11V544h747V832c0 6-4 11-11 11z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.SyntaxHighlight">M875 128h-725A107 107 0 0043 235v555A107 107 0 00149 896h725a107 107 0 00107-107v-555A107 107 0 00875 128zm-115 640h-183v-58l25-3c15 0 19-8 14-24l-22-61H419l-28 82 39 2V768h-166v-58l18-3c18-2 22-11 26-24l125-363-40-4V256h168l160 448 39 3zM506 340l-72 218h145l-71-218h-2z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.SoftwareUpdate">M900 287c40 69 60 144 60 225s-20 156-60 225c-40 69-94 123-163 163-69 40-144 60-225 60s-156-20-225-60c-69-40-123-94-163-163C84 668 64 593 64 512s20-156 60-225 94-123 163-163c69-40 144-60 225-60s156 20 225 60 123 94 163 163zM762 512c0-9-3-16-9-22L578 315l-44-44c-6-6-13-9-22-9s-16 3-22 9l-44 44-176 176c-6 6-9 13-9 22s3 16 9 22l44 44c6 6 13 9 22 9s16-3 22-9l92-92v269c0 9 3 16 9 22 6 6 13 9 22 9h62c8 0 16-3 22-9 6-6 9-13 9-22V486l92 92c6 6 13 9 22 9 8 0 16-3 22-9l44-44c6-6 9-13 9-22z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Target">M765 118 629 239l-16 137-186 160 54 59 183-168 144 4 136-129 47-43-175-12L827 67zM489 404c-66 0-124 55-124 125s54 121 124 121c66 0 120-55 120-121H489l23-121c-8-4-16-4-23-4zM695 525c0 114-93 207-206 207s-206-94-206-207 93-207 206-207c16 0 27 0 43 4l43-207c-27-4-54-8-85-8-229 0-416 188-416 419s187 419 416 419c225 0 408-180 416-403v-12l-210-4z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Incoming">M973 358a51 51 0 0151 51v563a51 51 0 01-51 51H51a51 51 0 01-51-51V410a51 51 0 0151-51h256a51 51 0 110 102H102v461h819V461h-205a51 51 0 110-102h256zM51 102a51 51 0 110-102h256c141 0 256 115 256 256v388l66-66a51 51 0 1172 72l-154 154a51 51 0 01-72 0l-154-154a51 51 0 1172-72L461 644V256c0-85-69-154-154-154H51z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Local">M976 0h-928A48 48 0 000 48v652a48 48 0 0048 48h416V928H200a48 48 0 000 96h624a48 48 0 000-96H560v-180h416a48 48 0 0048-48V48A48 48 0 00976 0zM928 652H96V96h832v556z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Init">M412 66C326 132 271 233 271 347c0 17 1 34 4 50-41-48-98-79-162-83a444 444 0 00-46 196c0 207 142 382 337 439h2c19 0 34 15 34 33 0 11-6 21-14 26l1 14C183 973 0 763 0 511 0 272 166 70 393 7A35 35 0 01414 0c19 0 34 15 34 33a33 33 0 01-36 33zm200 893c86-66 141-168 141-282 0-17-1-34-4-50 41 48 98 79 162 83a444 444 0 0046-196c0-207-142-382-337-439h-2a33 33 0 01-34-33c0-11 6-21 14-26L596 0C841 51 1024 261 1024 513c0 239-166 441-393 504A35 35 0 01610 1024a33 33 0 01-34-33 33 33 0 0136-33zM512 704a192 192 0 110-384 192 192 0 010 384z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Feature">M939 94v710L512 998 85 805V94h-64A21 21 0 010 73v-0C0 61 10 51 21 51h981c12 0 21 10 21 21v0c0 12-10 21-21 21h-64zm-536 588L512 624l109 58c6 3 13 4 20 3a32 32 0 0026-37l-21-122 88-87c5-5 8-11 9-18a32 32 0 00-27-37l-122-18-54-111a32 32 0 00-57 0l-54 111-122 18c-7 1-13 4-18 9a33 33 0 001 46l88 87-21 122c-1 7-0 14 3 20a32 32 0 0043 14z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Feature">M939 94v710L512 998 85 805V94h-64A21 21 0 010 73v-0C0 61 10 51 21 51h981c12 0 21 10 21 21v0c0 12-10 21-21 21h-64zm-536 588L512 624l109 58c6 3 13 4 20 3a32 32 0 0026-37l-21-122 88-87c5-5 8-11 9-18a32 32 0 00-27-37l-122-18-54-111a32 32 0 00-57 0l-54 111-122 18c-7 1-13 4-18 9a33 33 0 001 46l88 87-21 122c-1 7-0 14 3 20a32 32 0 0043 14z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Hotfix">M236 542a32 32 0 109 63l86-12a180 180 0 0022 78l-71 47a32 32 0 1035 53l75-50a176 176 0 00166 40L326 529zM512 16C238 16 16 238 16 512s222 496 496 496 496-222 496-496S786 16 512 16zm0 896c-221 0-400-179-400-400a398 398 0 0186-247l561 561A398 398 0 01512 912zm314-154L690 622a179 179 0 004-29l85 12a32 32 0 109-63l-94-13v-49l94-13a32 32 0 10-9-63l-87 12a180 180 0 00-20-62l71-47A32 32 0 10708 252l-75 50a181 181 0 00-252 10l-115-115A398 398 0 01512 112c221 0 400 179 400 400a398 398 0 01-86 247z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Hotfix">M236 542a32 32 0 109 63l86-12a180 180 0 0022 78l-71 47a32 32 0 1035 53l75-50a176 176 0 00166 40L326 529zM512 16C238 16 16 238 16 512s222 496 496 496 496-222 496-496S786 16 512 16zm0 896c-221 0-400-179-400-400a398 398 0 0186-247l561 561A398 398 0 01512 912zm314-154L690 622a179 179 0 004-29l85 12a32 32 0 109-63l-94-13v-49l94-13a32 32 0 10-9-63l-87 12a180 180 0 00-20-62l71-47A32 32 0 10708 252l-75 50a181 181 0 00-252 10l-115-115A398 398 0 01512 112c221 0 400 179 400 400a398 398 0 01-86 247z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Release">M884 159l-18-18a43 43 0 00-38-12l-235 43a166 166 0 00-101 60L400 349a128 128 0 00-148 47l-120 171a21 21 0 005 29l17 12a128 128 0 00178-32l27-38 124 124-38 27a128 128 0 00-32 178l12 17a21 21 0 0029 5l171-120a128 128 0 0047-148l117-92A166 166 0 00853 431l43-235a43 43 0 00-12-38zm-177 249a64 64 0 110-90 64 64 0 010 90zm-373 312a21 21 0 010 30l-139 139a21 21 0 01-30 0l-30-30a21 21 0 010-30l139-139a21 21 0 0130 0z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Release">M884 159l-18-18a43 43 0 00-38-12l-235 43a166 166 0 00-101 60L400 349a128 128 0 00-148 47l-120 171a21 21 0 005 29l17 12a128 128 0 00178-32l27-38 124 124-38 27a128 128 0 00-32 178l12 17a21 21 0 0029 5l171-120a128 128 0 0047-148l117-92A166 166 0 00853 431l43-235a43 43 0 00-12-38zm-177 249a64 64 0 110-90 64 64 0 010 90zm-373 312a21 21 0 010 30l-139 139a21 21 0 01-30 0l-30-30a21 21 0 010-30l139-139a21 21 0 0130 0z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.GitIgnore">M590 74 859 342V876c0 38-31 68-68 68H233c-38 0-68-31-68-68V142c0-38 31-68 68-68h357zm-12 28H233a40 40 0 00-40 38L193 142v734a40 40 0 0038 40L233 916h558a40 40 0 0040-38L831 876V354L578 102zM855 371h-215c-46 0-83-36-84-82l0-2V74h28v213c0 30 24 54 54 55l2 0h215v28zM57 489m28 0 853 0q28 0 28 28l0 284q0 28-28 28l-853 0q-28 0-28-28l0-284q0-28 28-28ZM157 717c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C184 610 172 603 156 603c-29 0-54 21-54 57 0 37 24 56 54 56zM245 711v-108h-34v108h34zm69 0v-86H341V603H262v22h28V711h24zM393 711v-108h-34v108h34zm66 6c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C485 610 474 603 458 603c-29 0-54 21-54 57 0 37 24 56 54 56zm88-6v-36c0-13-2-28-3-40h1l10 24 25 52H603v-108h-23v36c0 13 2 28 3 40h-1l-10-24L548 603H523v108h23zM677 717c30 0 51-22 51-57 0-36-21-56-51-56-30 0-51 20-51 56 0 36 21 57 51 57zm3-23c-16 0-26-12-26-32 0-19 10-31 26-31 16 0 26 11 26 31S696 694 680 694zm93 17v-38h13l21 38H836l-25-43c12-5 19-15 19-31 0-26-20-34-44-34H745v108h27zm16-51H774v-34h15c16 0 25 4 25 16s-9 18-25 18zM922 711v-22h-43v-23h35v-22h-35V625h41V603H853v108h68z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Grid">M30 271l241 0 0-241-241 0 0 241zM392 271l241 0 0-241-241 0 0 241zM753 30l0 241 241 0 0-241-241 0zM30 632l241 0 0-241-241 0 0 241zM392 632l241 0 0-241-241 0 0 241zM753 632l241 0 0-241-241 0 0 241zM30 994l241 0 0-241-241 0 0 241zM392 994l241 0 0-241-241 0 0 241zM753 994l241 0 0-241-241 0 0 241z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Histories">M24 512A488 488 0 01512 24A488 488 0 011000 512A488 488 0 01512 1000A488 488 0 0124 512zm447-325v327L243 619l51 111 300-138V187H471z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Home">M832 64h128v278l-128-146V64zm64 448L512 73 128 512H0L448 0h128l448 512h-128zm0 83V1024H640V704c0-35-29-64-64-64h-128a64 64 0 00-64 64v320H128V595l384-424 384 424z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Hotkeys">M512 0C229.216 0 0 229.216 0 512c0 282.752 229.216 512 512 512s512-229.248 512-512c0-282.784-229.216-512-512-512z m0 957.92C266.112 957.92 66.08 757.888 66.08 512S266.112 66.08 512 66.08 957.92 266.112 957.92 512 757.888 957.92 512 957.92zM192 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32H192a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM384 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM576 416h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM832 320h-64a32 32 0 0 0-32 32v128h-160a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32zM320 544v-32a32 32 0 0 0-32-32H192a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h96a32 32 0 0 0 32-32zM384 576h96a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32h-96a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32zM800 640H256a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h544a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Incoming">M973 358a51 51 0 0151 51v563a51 51 0 01-51 51H51a51 51 0 01-51-51V410a51 51 0 0151-51h256a51 51 0 110 102H102v461h819V461h-205a51 51 0 110-102h256zM51 102a51 51 0 110-102h256c141 0 256 115 256 256v388l66-66a51 51 0 1172 72l-154 154a51 51 0 01-72 0l-154-154a51 51 0 1172-72L461 644V256c0-85-69-154-154-154H51z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Info">M512 0C229 0 0 229 0 512s229 512 512 512 512-229 512-512S795 0 512 0zM512 928c-230 0-416-186-416-416S282 96 512 96s416 186 416 416S742 928 512 928zM538 343c47 0 83-38 83-78 0-32-21-61-62-61-55 0-82 45-82 77C475 320 498 343 538 343zM533 729c-8 0-11-10-3-40l43-166c16-61 11-100-22-100-39 0-131 40-211 108l16 27c25-17 68-35 78-35 8 0 7 10 0 36l-38 158c-23 89 1 110 34 110 33 0 118-30 196-110l-19-25C575 717 543 729 533 729z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Init">M412 66C326 132 271 233 271 347c0 17 1 34 4 50-41-48-98-79-162-83a444 444 0 00-46 196c0 207 142 382 337 439h2c19 0 34 15 34 33 0 11-6 21-14 26l1 14C183 973 0 763 0 511 0 272 166 70 393 7A35 35 0 01414 0c19 0 34 15 34 33a33 33 0 01-36 33zm200 893c86-66 141-168 141-282 0-17-1-34-4-50 41 48 98 79 162 83a444 444 0 0046-196c0-207-142-382-337-439h-2a33 33 0 01-34-33c0-11 6-21 14-26L596 0C841 51 1024 261 1024 513c0 239-166 441-393 504A35 35 0 01610 1024a33 33 0 01-34-33 33 33 0 0136-33zM512 704a192 192 0 110-384 192 192 0 010 384z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.InteractiveRebase">M512 64A447 447 0 0064 512c0 248 200 448 448 448s448-200 448-448S760 64 512 64zM218 295h31c54 0 105 19 145 55 13 12 13 31 3 43a35 35 0 01-22 10 36 36 0 01-21-7 155 155 0 00-103-39h-31a32 32 0 01-31-31c0-18 13-31 30-31zm31 433h-31a32 32 0 01-31-31c0-16 13-31 31-31h31A154 154 0 00403 512 217 217 0 01620 295h75l-93-67a33 33 0 01-7-43 33 33 0 0143-7l205 148-205 148a29 29 0 01-18 6 32 32 0 01-31-31c0-10 4-19 13-25l93-67H620a154 154 0 00-154 154c0 122-97 220-217 220zm390 118a29 29 0 01-18 6 32 32 0 01-31-31c0-10 4-19 13-25l93-67h-75c-52 0-103-19-143-54-12-12-13-31-1-43a30 30 0 0142-3 151 151 0 00102 39h75L602 599a33 33 0 01-7-43 33 33 0 0143-7l205 148-203 151z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.LayoutHorizontal">M875 117H149C109 117 75 151 75 192v640c0 41 34 75 75 75h725c41 0 75-34 75-75V192c0-41-34-75-75-75zM139 832V192c0-6 4-11 11-11h331v661H149c-6 0-11-4-11-11zm747 0c0 6-4 11-11 11H544v-661H875c6 0 11 4 11 11v640z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.LayoutVertical">M875 117H149C109 117 75 151 75 192v640c0 41 34 75 75 75h725c41 0 75-34 75-75V192c0-41-34-75-75-75zm-725 64h725c6 0 11 4 11 11v288h-747V192c0-6 4-11 11-11zm725 661H149c-6 0-11-4-11-11V544h747V832c0 6-4 11-11 11z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.LFS">M40 9 15 23 15 31 9 28 9 20 34 5 24 0 0 14 0 34 25 48 25 28 49 14zM26 29 26 48 49 34 49 15z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Lines.Incr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l132 0 0-128 64 0 0 128 132 0 0 64-132 0 0 128-64 0 0-128-132 0Z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Lines.Incr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l132 0 0-128 64 0 0 128 132 0 0 64-132 0 0 128-64 0 0-128-132 0Z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Lines.Decr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l328 0 0 64-328 0Z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Lines.Decr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l328 0 0 64-328 0Z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Compare">M645 448l64 64 220-221L704 64l-64 64 115 115H128v90h628zM375 576l-64-64-220 224L314 960l64-64-116-115H896v-90H262z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.List">M0 33h1024v160H0zM0 432h1024v160H0zM0 831h1024v160H0z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.WordWrap">M248 221a77 77 0 00-30-21c-18-7-40-10-68-5a224 224 0 00-45 13c-5 2-10 5-15 8l-3 2v68l11-9c10-8 21-14 34-19 13-5 26-7 39-7 12 0 21 3 28 10 6 6 9 16 9 29l-62 9c-14 2-26 6-36 11a80 80 0 00-25 20c-7 8-12 17-15 27-6 21-6 44 1 65a70 70 0 0041 43c10 4 21 6 34 6a80 80 0 0063-28v22h64V298c0-16-2-31-6-44a91 91 0 00-18-33zm-41 121v15c0 8-1 15-4 22a48 48 0 01-24 29 44 44 0 01-33 2 29 29 0 01-10-6 25 25 0 01-6-9 30 30 0 01-2-12c0-5 1-9 2-14a21 21 0 015-9 28 28 0 0110-7 83 83 0 0120-5l42-6zm323-68a144 144 0 00-16-42 87 87 0 00-28-29 75 75 0 00-41-11 73 73 0 00-44 14c-6 5-12 11-17 17V64H326v398h59v-18c8 10 18 17 30 21 6 2 13 3 21 3 16 0 31-4 43-11 12-7 23-18 31-31a147 147 0 0019-46 248 248 0 006-57c0-17-2-33-5-49zm-55 49c0 15-1 28-4 39-2 11-6 20-10 27a41 41 0 01-15 15 37 37 0 01-36 1 44 44 0 01-13-12 59 59 0 01-9-18A76 76 0 01384 352v-33c0-10 1-20 4-29 2-8 6-15 10-22a43 43 0 0115-13 37 37 0 0119-5 35 35 0 0132 18c4 6 7 14 9 23 2 9 3 20 3 31zM154 634a58 58 0 0120-15c14-6 35-7 49-1 7 3 13 6 20 12l21 17V572l-6-4a124 124 0 00-58-14c-20 0-38 4-54 11-16 7-30 17-41 30-12 13-20 29-26 46-6 17-9 36-9 57 0 18 3 36 8 52 6 16 14 30 24 42 10 12 23 21 38 28 15 7 32 10 50 10 15 0 28-2 39-5 11-3 21-8 30-14l5-4v-57l-13 6a26 26 0 01-5 2c-3 1-6 2-8 3-2 1-15 6-15 6-4 2-9 3-14 4a63 63 0 01-38-4 53 53 0 01-20-14 70 70 0 01-13-24 111 111 0 01-5-34c0-13 2-26 5-36 3-10 8-19 14-26zM896 384h-256V320h288c21 1 32 12 32 32v384c0 18-12 32-32 32H504l132 133-45 45-185-185c-16-21-16-25 0-45l185-185L637 576l-128 128H896V384z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Loading">M512 0C233 0 7 223 0 500C6 258 190 64 416 64c230 0 416 200 416 448c0 53 43 96 96 96s96-43 96-96c0-283-229-512-512-512zm0 1023c279 0 505-223 512-500c-6 242-190 436-416 436c-230 0-416-200-416-448c0-53-43-96-96-96s-96 43-96 96c0 283 229 512 512 512z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Detached">M128 183C128 154 154 128 183 128h521c30 0 55 26 55 55v38c0 17-17 34-34 34s-34-17-34-34v-26H196v495h26c17 0 34 17 34 34s-17 34-34 34h-38c-30 0-55-26-55-55V183zM380 896h-34c-26 0-47-21-47-47v-90h68V828h64V896H380c4 0 0 0 0 0zM759 828V896h90c26 0 47-21 47-47v-90h-68V828h-68zM828 435H896V346c0-26-21-47-47-47h-90v68H828v68zM435 299v68H367V439H299V346C299 320 320 299 346 299h90zM367 649H299v-107h68v107zM546 367V299h107v68h-107zM828 546H896v107h-68v-107zM649 828V896h-107v-68h107zM730 508v188c0 17-17 34-34 34h-188c-17 0-34-17-34-34s17-34 34-34h102l-124-124c-13-13-13-34 0-47 13-13 34-13 47 0l124 124V512c0-17 17-34 34-34 21-4 38 9 38 30z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Local">M976 0h-928A48 48 0 000 48v652a48 48 0 0048 48h416V928H200a48 48 0 000 96h624a48 48 0 000-96H560v-180h416a48 48 0 0048-48V48A48 48 0 00976 0zM928 652H96V96h832v556z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.GitIgnore">M590 74 859 342V876c0 38-31 68-68 68H233c-38 0-68-31-68-68V142c0-38 31-68 68-68h357zm-12 28H233a40 40 0 00-40 38L193 142v734a40 40 0 0038 40L233 916h558a40 40 0 0040-38L831 876V354L578 102zM855 371h-215c-46 0-83-36-84-82l0-2V74h28v213c0 30 24 54 54 55l2 0h215v28zM57 489m28 0 853 0q28 0 28 28l0 284q0 28-28 28l-853 0q-28 0-28-28l0-284q0-28 28-28ZM157 717c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C184 610 172 603 156 603c-29 0-54 21-54 57 0 37 24 56 54 56zM245 711v-108h-34v108h34zm69 0v-86H341V603H262v22h28V711h24zM393 711v-108h-34v108h34zm66 6c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C485 610 474 603 458 603c-29 0-54 21-54 57 0 37 24 56 54 56zm88-6v-36c0-13-2-28-3-40h1l10 24 25 52H603v-108h-23v36c0 13 2 28 3 40h-1l-10-24L548 603H523v108h23zM677 717c30 0 51-22 51-57 0-36-21-56-51-56-30 0-51 20-51 56 0 36 21 57 51 57zm3-23c-16 0-26-12-26-32 0-19 10-31 26-31 16 0 26 11 26 31S696 694 680 694zm93 17v-38h13l21 38H836l-25-43c12-5 19-15 19-31 0-26-20-34-44-34H745v108h27zm16-51H774v-34h15c16 0 25 4 25 16s-9 18-25 18zM922 711v-22h-43v-23h35v-22h-35V625h41V603H853v108h68z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.LFS">M40 9 15 23 15 31 9 28 9 20 34 5 24 0 0 14 0 34 25 48 25 28 49 14zM26 29 26 48 49 34 49 15z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="Icons.Lock">M832 464h-68V240a128 128 0 00-128-128h-248a128 128 0 00-128 128v224H192c-18 0-32 14-32 32v384c0 18 14 32 32 32h640c18 0 32-14 32-32v-384c0-18-14-32-32-32zm-292 237v53a8 8 0 01-8 8h-40a8 8 0 01-8-8v-53a48 48 0 1156 0zm152-237H332V240a56 56 0 0156-56h248a56 56 0 0156 56v224z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Lock">M832 464h-68V240a128 128 0 00-128-128h-248a128 128 0 00-128 128v224H192c-18 0-32 14-32 32v384c0 18 14 32 32 32h640c18 0 32-14 32-32v-384c0-18-14-32-32-32zm-292 237v53a8 8 0 01-8 8h-40a8 8 0 01-8-8v-53a48 48 0 1156 0zm152-237H332V240a56 56 0 0156-56h248a56 56 0 0156 56v224z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Unlock">M832 464H332V240c0-31 25-56 56-56h248c31 0 56 25 56 56v68c0 4 4 8 8 8h56c4 0 8-4 8-8v-68c0-71-57-128-128-128H388c-71 0-128 57-128 128v224h-68c-18 0-32 14-32 32v384c0 18 14 32 32 32h640c18 0 32-14 32-32V496c0-18-14-32-32-32zM540 701v53c0 4-4 8-8 8h-40c-4 0-8-4-8-8v-53c-12-9-20-23-20-39 0-27 22-48 48-48s48 22 48 48c0 16-8 30-20 39z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.MacOS.Close">M851 755q0 23-16 39l-78 78q-16 16-39 16t-39-16l-168-168-168 168q-16 16-39 16t-39-16l-78-78q-16-16-16-39t16-39l168-168-168-168q-16-16-16-39t16-39l78-78q16-16 39-16t39 16l168 168 168-168q16-16 39-16t39 16l78 78q16 16 16 39t-16 39l-168 168 168 168q16 16 16 39z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.MacOS.Minimize">M1024 750v110c0 50-41 91-91 91h-841A92 92 0 010 859v-110C0 699 41 658 91 658h841c50 0 91 41 91 91z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.MacOS.Maximize">M0 4 0 20 16 20 0 4M4 0 20 0 20 16 4 0z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Menu">M192 192m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM192 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM192 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0ZM864 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32zM864 480H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32zM864 800H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h512c17.7 0 32-14.3 32-32s-14.3-32-32-32z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Merge">M824 645V307c0-56-46-102-102-102h-102V102l-154 154 154 154V307h102v338c-46 20-82 67-82 123 0 72 61 133 133 133 72 0 133-61 133-133 0-56-36-102-82-123zm-51 195c-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72s-31 72-72 72zM384 256c0-72-61-133-133-133-72 0-133 61-133 133 0 56 36 102 82 123v266C154 666 118 712 118 768c0 72 61 133 133 133 72 0 133-61 133-133 0-56-36-102-82-123V379C348 358 384 312 384 256zM323 768c0 41-31 72-72 72-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72zM251 328c-41 0-72-31-72-72s31-72 72-72c41 0 72 31 72 72s-31 72-72 72z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.OpenWith">M683 409v204L1024 308 683 0v191c-413 0-427 526-427 526c117-229 203-307 427-307zm85 492H102V327h153s38-63 114-122H51c-28 0-51 27-51 61v697c0 34 23 61 51 61h768c28 0 51-27 51-61V614l-102 100v187z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Paste">M544 85c49 0 90 37 95 85h75a96 96 0 0196 89L811 267a32 32 0 01-28 32L779 299a32 32 0 01-32-28L747 267a32 32 0 00-28-32L715 235h-91a96 96 0 01-80 42H395c-33 0-62-17-80-42L224 235a32 32 0 00-32 28L192 267v576c0 16 12 30 28 32l4 0h128a32 32 0 0132 28l0 4a32 32 0 01-32 32h-128a96 96 0 01-96-89L128 843V267a96 96 0 0189-96L224 171h75a96 96 0 0195-85h150zm256 256a96 96 0 0196 89l0 7v405a96 96 0 01-89 96L800 939h-277a96 96 0 01-96-89L427 843v-405a96 96 0 0189-96L523 341h277zm-256-192H395a32 32 0 000 64h150a32 32 0 100-64z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Plus">m186 532 287 0 0 287c0 11 9 20 20 20s20-9 20-20l0-287 287 0c11 0 20-9 20-20s-9-20-20-20l-287 0 0-287c0-11-9-20-20-20s-20 9-20 20l0 287-287 0c-11 0-20 9-20 20s9 20 20 20z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Pull">M432 0h160c27 0 48 21 48 48v336h175c36 0 53 43 28 68L539 757c-15 15-40 15-55 0L180 452c-25-25-7-68 28-68H384V48c0-27 21-48 48-48zm592 752v224c0 27-21 48-48 48H48c-27 0-48-21-48-48V752c0-27 21-48 48-48h293l98 98c40 40 105 40 145 0l98-98H976c27 0 48 21 48 48zm-248 176c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40zm128 0c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Push">M592 768h-160c-27 0-48-21-48-48V384h-175c-36 0-53-43-28-68L485 11c15-15 40-15 55 0l304 304c25 25 7 68-28 68H640v336c0 27-21 48-48 48zm432-16v224c0 27-21 48-48 48H48c-27 0-48-21-48-48V752c0-27 21-48 48-48h272v16c0 62 50 112 112 112h160c62 0 112-50 112-112v-16h272c27 0 48 21 48 48zm-248 176c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40zm128 0c0-22-18-40-40-40s-40 18-40 40s18 40 40 40s40-18 40-40z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Rebase">M277 85a149 149 0 00-43 292v230a32 32 0 0064 0V555h267A160 160 0 00725 395v-12a149 149 0 10-64-5v17a96 96 0 01-96 96H299V383A149 149 0 00277 85zM228 720a32 32 0 00-37-52 150 150 0 00-53 68 32 32 0 1060 23 85 85 0 0130-39zm136-52a32 32 0 00-37 52 86 86 0 0130 39 32 32 0 1060-23 149 149 0 00-53-68zM204 833a32 32 0 10-55 32 149 149 0 0063 58 32 32 0 0028-57 85 85 0 01-36-33zm202 32a32 32 0 00-55-32 85 85 0 01-36 33 32 32 0 0028 57 149 149 0 0063-58z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Remote">M706 302a289 289 0 00-173 44 27 27 0 1029 46 234 234 0 01125-36c23 0 45 3 66 9 93 28 161 114 161 215C914 704 813 805 687 805H337C211 805 110 704 110 580c0-96 61-178 147-210C282 263 379 183 495 183a245 245 0 01210 119z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Remote.Add">M364 512h67v108h108v67h-108v108h-67v-108h-108v-67h108v-108zm298-64A107 107 0 01768 555C768 614 720 660 660 660h-108v-54h-108v-108h-94v108h-94c4-21 22-47 44-51l-1-12a75 75 0 0171-75a128 128 0 01239-7a106 106 0 0153-14z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Rename">M853 256h-43v512h43c47 0 85-38 85-85v-341c0-47-38-85-85-85zM725 768V171h128V85h-341v85H640v85H171c-47 0-85 38-85 85v341c0 47 38 85 85 85h469V853h-128v85h341v-85H725v-86zm-469-171v-171h384v171H256z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Repositories">M960 146v91C960 318 759 384 512 384S64 318 64 238V146C64 66 265 0 512 0s448 66 448 146zM960 352v206C960 638 759 704 512 704S64 638 64 558V352c96 66 272 97 448 97S864 418 960 352zm0 320v206C960 958 759 1024 512 1024S64 958 64 878V672c96 66 272 97 448 97S864 738 960 672z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Reset">M883 567l-128-128c-17-17-43-17-60 0l-128 128c-17 17-17 43 0 60 17 17 43 17 60 0l55-55V683c0 21-21 43-43 43H418c-13-38-43-64-77-77V375c51-17 85-64 85-119 0-73-60-128-128-128-73 0-128 55-128 128 0 55 34 102 85 119v269c-51 17-85 64-85 119 0 73 55 128 128 128 55 0 102-34 119-85H640c73 0 128-55 128-128v-111l55 55c9 9 17 13 30 13 13 0 21-4 30-13 17-13 17-43 0-55zM299 213c26 0 43 17 43 43 0 21-21 43-43 43-26 0-43-21-43-43 0-26 17-43 43-43zm0 597c-26 0-43-21-43-43 0-26 17-43 43-43s43 17 43 43c0 21-17 43-43 43zM725 384c-73 0-128-60-128-128 0-73 55-128 128-128s128 55 128 128c0 68-55 128-128 128zm0-171c-26 0-43 17-43 43s17 43 43 43 43-17 43-43-17-43-43-43z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Save">M293 122v244h439V146l171 175V829a73 73 0 01-73 73h-98V536H293v366H195a73 73 0 01-73-73V195a73 73 0 0173-73h98zm366 512v268H366V634h293zm-49 49h-195v73h195v-73zm49-561v171H366V122h293z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Search">M702 677 590 565a148 148 0 10-25 27L676 703zm-346-200a115 115 0 11115 115A115 115 0 01355 478z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Send">M0 586l404 119 498-410-386 441-2 251 155-205 279 83L1170 37z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Settings">M928 500a21 21 0 00-19-20L858 472a11 11 0 01-9-9c-1-6-2-13-3-19a11 11 0 015-12l46-25a21 21 0 0010-26l-8-22a21 21 0 00-24-13l-51 10a11 11 0 01-12-6c-3-6-6-11-10-17a11 11 0 011-13l34-39a21 21 0 001-28l-15-18a20 20 0 00-27-4l-45 27a11 11 0 01-13-1c-5-4-10-9-15-12a11 11 0 01-3-12l19-49a21 21 0 00-9-26l-20-12a21 21 0 00-27 6L650 193a9 9 0 01-11 3c-1-1-12-5-20-7a11 11 0 01-7-10l1-52a21 21 0 00-17-22l-23-4a21 21 0 00-24 14L532 164a11 11 0 01-11 7h-20a11 11 0 01-11-7l-17-49a21 21 0 00-24-15l-23 4a21 21 0 00-17 22l1 52a11 11 0 01-8 11c-5 2-15 6-19 7c-4 1-8 0-12-4l-33-40A21 21 0 00313 146l-20 12A21 21 0 00285 184l19 49a11 11 0 01-3 12c-5 4-10 8-15 12a11 11 0 01-13 1L228 231a21 21 0 00-27 4L186 253a21 21 0 001 28L221 320a11 11 0 011 13c-3 5-7 11-10 17a11 11 0 01-12 6l-51-10a21 21 0 00-24 13l-8 22a21 21 0 0010 26l46 25a11 11 0 015 12l0 3c-1 6-2 11-3 16a11 11 0 01-9 9l-51 8A21 21 0 0096 500v23A21 21 0 00114 544l51 8a11 11 0 019 9c1 6 2 13 3 19a11 11 0 01-5 12l-46 25a21 21 0 00-10 26l8 22a21 21 0 0024 13l51-10a11 11 0 0112 6c3 6 6 11 10 17a11 11 0 01-1 13l-34 39a21 21 0 00-1 28l15 18a20 20 0 0027 4l45-27a11 11 0 0113 1c5 4 10 9 15 12a11 11 0 013 12l-19 49a21 21 0 009 26l20 12a21 21 0 0027-6L374 832c3-3 7-5 10-4c7 3 12 5 20 7a11 11 0 018 10l-1 52a21 21 0 0017 22l23 4a21 21 0 0024-14l17-50a11 11 0 0111-7h20a11 11 0 0111 7l17 49a21 21 0 0020 15a19 19 0 004 0l23-4a21 21 0 0017-22l-1-52a11 11 0 018-10c8-3 13-5 18-7l1 0c6-2 9 0 11 3l34 41A21 21 0 00710 878l20-12a21 21 0 009-26l-18-49a11 11 0 013-12c5-4 10-8 15-12a11 11 0 0113-1l45 27a21 21 0 0027-4l15-18a21 21 0 00-1-28l-34-39a11 11 0 01-1-13c3-5 7-11 10-17a11 11 0 0112-6l51 10a21 21 0 0024-13l8-22a21 21 0 00-10-26l-46-25a11 11 0 01-5-12l0-3c1-6 2-11 3-16a11 11 0 019-9l51-8a21 21 0 0018-21v-23zm-565 188a32 32 0 01-51 5a270 270 0 011-363a32 32 0 0151 6l91 161a32 32 0 010 31zM512 782a270 270 0 01-57-6a32 32 0 01-20-47l92-160a32 32 0 0127-16h184a32 32 0 0130 41c-35 109-137 188-257 188zm15-328L436 294a32 32 0 0121-47a268 268 0 0155-6c120 0 222 79 257 188a32 32 0 01-30 41h-184a32 32 0 01-28-16z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.SoftwareUpdate">M900 287c40 69 60 144 60 225s-20 156-60 225c-40 69-94 123-163 163-69 40-144 60-225 60s-156-20-225-60c-69-40-123-94-163-163C84 668 64 593 64 512s20-156 60-225 94-123 163-163c69-40 144-60 225-60s156 20 225 60 123 94 163 163zM762 512c0-9-3-16-9-22L578 315l-44-44c-6-6-13-9-22-9s-16 3-22 9l-44 44-176 176c-6 6-9 13-9 22s3 16 9 22l44 44c6 6 13 9 22 9s16-3 22-9l92-92v269c0 9 3 16 9 22 6 6 13 9 22 9h62c8 0 16-3 22-9 6-6 9-13 9-22V486l92 92c6 6 13 9 22 9 8 0 16-3 22-9l44-44c6-6 9-13 9-22z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.SquashIntoParent">M512 939C465 939 427 900 427 853 427 806 465 768 512 768 559 768 597 806 597 853 597 900 559 939 512 939M555 85 555 555 747 363 807 423 512 719 217 423 277 363 469 555 469 85 555 85Z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Stashes">M961 320 512 577 63 320 512 62l449 258zM512 628 185 442 63 512 512 770 961 512l-123-70L512 628zM512 821 185 634 63 704 512 962l449-258L839 634 512 821z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Statistics">M447 561a26 26 0 0126 26v171H421v-171a26 26 0 0126-26zm-98 65a26 26 0 0126 26v104H323v-104a26 26 0 0126-26zm0 0M561 268a32 32 0 0132 30v457h-65V299a32 32 0 0132-32zm0 0M675 384a26 26 0 0126 26v348H649v-350a26 26 0 0126-24zm0 0M801 223v579H223V223h579M805 171H219A49 49 0 00171 219v585A49 49 0 00219 853h585A49 49 0 00853 805V219A49 49 0 00805 171z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Submodule">M557.7 545.3 789.9 402.7c24-15 31.3-46.5 16.4-70.5c-14.8-23.8-46-31.2-70-16.7L506.5 456.6 277.1 315.4c-24.1-14.8-55.6-7.3-70.5 16.8c-14.8 24.1-7.3 55.6 16.8 70.5l231.8 142.6V819.1c0 28.3 22.9 51.2 51.2 51.2c28.3 0 51.2-22.9 51.2-51.2V545.3h.1zM506.5 0l443.4 256v511.9L506.5 1023.9 63.1 767.9v-511.9L506.5 0z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Submodule.Add">M770 320a41 41 0 00-56-14l-252 153L207 306a41 41 0 10-43 70l255 153 2 296a41 41 0 0082 0l-2-295 255-155a41 41 0 0014-56zM481 935a42 42 0 01-42 0L105 741a42 42 0 01-21-36v-386a42 42 0 0121-36L439 89a42 42 0 0142 0l335 193a42 42 0 0121 36v87h84v-87a126 126 0 00-63-109L523 17a126 126 0 00-126 0L63 210a126 126 0 00-63 109v386a126 126 0 0063 109l335 193a126 126 0 00126 0l94-54-42-72zM1029 700h-126v-125a42 42 0 00-84 0v126h-126a42 42 0 000 84h126v126a42 42 0 1084 0v-126h126a42 42 0 000-84z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.SyntaxHighlight">M875 128h-725A107 107 0 0043 235v555A107 107 0 00149 896h725a107 107 0 00107-107v-555A107 107 0 00875 128zm-115 640h-183v-58l25-3c15 0 19-8 14-24l-22-61H419l-28 82 39 2V768h-166v-58l18-3c18-2 22-11 26-24l125-363-40-4V256h168l160 448 39 3zM506 340l-72 218h145l-71-218h-2z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Tag">M177 156c-22 5-33 17-36 37c-10 57-33 258-13 278l445 445c23 23 61 23 84 0l246-246c23-23 23-61 0-84l-445-445C437 120 231 145 177 156zM331 344c-26 26-69 26-95 0c-26-26-26-69 0-95s69-26 95 0C357 276 357 318 331 344z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Tag.Add">M683 537h-144v-142h-142V283H239a44 44 0 00-41 41v171a56 56 0 0014 34l321 321a41 41 0 0058 0l174-174a41 41 0 000-58zm-341-109a41 41 0 110-58a41 41 0 010 58zM649 284V142h-69v142h-142v68h142v142h69v-142h142v-68h-142z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Target">M765 118 629 239l-16 137-186 160 54 59 183-168 144 4 136-129 47-43-175-12L827 67zM489 404c-66 0-124 55-124 125s54 121 124 121c66 0 120-55 120-121H489l23-121c-8-4-16-4-23-4zM695 525c0 114-93 207-206 207s-206-94-206-207 93-207 206-207c16 0 27 0 43 4l43-207c-27-4-54-8-85-8-229 0-416 188-416 419s187 419 416 419c225 0 408-180 416-403v-12l-210-4z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Terminal">M144 112h736c18 0 32 14 32 32v736c0 18-14 32-32 32H144c-18 0-32-14-32-32V144c0-18 14-32 32-32zm112 211v72a9 9 0 003 7L386 509 259 615a9 9 0 00-3 7v72a9 9 0 0015 7L493 516a9 9 0 000-14l-222-186a9 9 0 00-15 7zM522 624a10 10 0 00-10 10v60a10 10 0 0010 10h237a10 10 0 0010-10v-60a10 10 0 00-10-10H522z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Track">M897 673v13c0 51-42 93-93 93h-10c-1 0-2 0-2 0H220c-23 0-42 19-42 42v13c0 23 19 42 42 42h552c14 0 26 12 26 26 0 14-12 26-26 26H220c-51 0-93-42-93-93v-13c0-51 42-93 93-93h20c1-0 2-0 2-0h562c23 0 42-19 42-42v-13c0-11-5-22-13-29-8-7-17-11-28-10H660c-14 0-26-12-26-26 0-14 12-26 26-26h144c24-1 47 7 65 24 18 17 29 42 29 67zM479 98c-112 0-203 91-203 203 0 44 14 85 38 118l132 208c15 24 50 24 66 0l133-209c23-33 37-73 37-117 0-112-91-203-203-203zm0 327c-68 0-122-55-122-122s55-122 122-122 122 55 122 122-55 122-122 122z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Track">M897 673v13c0 51-42 93-93 93h-10c-1 0-2 0-2 0H220c-23 0-42 19-42 42v13c0 23 19 42 42 42h552c14 0 26 12 26 26 0 14-12 26-26 26H220c-51 0-93-42-93-93v-13c0-51 42-93 93-93h20c1-0 2-0 2-0h562c23 0 42-19 42-42v-13c0-11-5-22-13-29-8-7-17-11-28-10H660c-14 0-26-12-26-26 0-14 12-26 26-26h144c24-1 47 7 65 24 18 17 29 42 29 67zM479 98c-112 0-203 91-203 203 0 44 14 85 38 118l132 208c15 24 50 24 66 0l133-209c23-33 37-73 37-117 0-112-91-203-203-203zm0 327c-68 0-122-55-122-122s55-122 122-122 122 55 122 122-55 122-122 122z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Tree">M912 800a48 48 0 1 1 0 96h-416a48 48 0 1 1 0-96h416z m-704-704A112 112 0 0 1 256 309.184V480h80a48 48 0 0 1 0 96H256v224h81.664a48 48 0 1 1 0 96H256a96 96 0 0 1-96-96V309.248A112 112 0 0 1 208 96z m704 384a48 48 0 1 1 0 96h-416a48 48 0 0 1 0-96h416z m0-320a48 48 0 1 1 0 96h-416a48 48 0 0 1 0-96h416z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.TriangleLeft">M30 0 30 30 0 15z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.TriangleRight">M0 0 0 30 30 15z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Undo">M762 1024C876 818 895 504 448 514V768L64 384l384-384v248c535-14 595 472 314 776z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Unlock">M832 464H332V240c0-31 25-56 56-56h248c31 0 56 25 56 56v68c0 4 4 8 8 8h56c4 0 8-4 8-8v-68c0-71-57-128-128-128H388c-71 0-128 57-128 128v224h-68c-18 0-32 14-32 32v384c0 18 14 32 32 32h640c18 0 32-14 32-32V496c0-18-14-32-32-32zM540 701v53c0 4-4 8-8 8h-40c-4 0-8-4-8-8v-53c-12-9-20-23-20-39 0-27 22-48 48-48s48 22 48 48c0 16-8 30-20 39z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Up">M170 831l343-342L855 831l105-105-448-448L64 726 170 831z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Waiting">M812 864h-29V654c0-21-11-40-28-52l-133-88 134-89c18-12 28-31 28-52V164h28c18 0 32-14 32-32s-14-32-32-32H212c-18 0-32 14-32 32s14 32 32 32h30v210c0 21 11 40 28 52l133 88-134 89c-18 12-28 31-28 52V864H212c-18 0-32 14-32 32s14 32 32 32h600c18 0 32-14 32-32s-14-32-32-32zM441 566c18-12 28-31 28-52s-11-40-28-52L306 373V164h414v209l-136 90c-18 12-28 31-28 52 0 21 11 40 28 52l135 89V695c-9-7-20-13-32-19-30-15-93-41-176-41-63 0-125 14-175 38-12 6-22 12-31 18v-36l136-90z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.Whitespace">M416 64H768v64h-64v704h64v64H448v-64h64V512H416a224 224 0 1 1 0-448zM576 832h64V128H576v704zM416 128H512v320H416a160 160 0 0 1 0-320z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Whitespace">M416 64H768v64h-64v704h64v64H448v-64h64V512H416a224 224 0 1 1 0-448zM576 832h64V128H576v704zM416 128H512v320H416a160 160 0 0 1 0-320z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.InteractiveRebase">M512 64A447 447 0 0064 512c0 248 200 448 448 448s448-200 448-448S760 64 512 64zM218 295h31c54 0 105 19 145 55 13 12 13 31 3 43a35 35 0 01-22 10 36 36 0 01-21-7 155 155 0 00-103-39h-31a32 32 0 01-31-31c0-18 13-31 30-31zm31 433h-31a32 32 0 01-31-31c0-16 13-31 31-31h31A154 154 0 00403 512 217 217 0 01620 295h75l-93-67a33 33 0 01-7-43 33 33 0 0143-7l205 148-205 148a29 29 0 01-18 6 32 32 0 01-31-31c0-10 4-19 13-25l93-67H620a154 154 0 00-154 154c0 122-97 220-217 220zm390 118a29 29 0 01-18 6 32 32 0 01-31-31c0-10 4-19 13-25l93-67h-75c-52 0-103-19-143-54-12-12-13-31-1-43a30 30 0 0142-3 151 151 0 00102 39h75L602 599a33 33 0 01-7-43 33 33 0 0143-7l205 148-203 151z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.Window.Close">M519 459 222 162a37 37 0 10-52 52l297 297L169 809a37 37 0 1052 52l297-297 297 297a37 37 0 1052-52l-297-297 297-297a37 37 0 10-52-52L519 459z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Window.Minimize">M0 0M1024 1024 M960 544H64a32 32 0 1 1 0-64h896a32 32 0 1 1 0 64</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Window.Maximize">M153 154h768v768h-768v-768zm64 64v640h640v-640h-640z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Window.Restore">M256 128l0 192L64 320l0 576 704 0 0-192 192 0L960 128 256 128zM704 832 128 832 128 384l576 0L704 832zM896 640l-128 0L768 320 320 320 320 192l576 0L896 640z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.WordWrap">M248 221a77 77 0 00-30-21c-18-7-40-10-68-5a224 224 0 00-45 13c-5 2-10 5-15 8l-3 2v68l11-9c10-8 21-14 34-19 13-5 26-7 39-7 12 0 21 3 28 10 6 6 9 16 9 29l-62 9c-14 2-26 6-36 11a80 80 0 00-25 20c-7 8-12 17-15 27-6 21-6 44 1 65a70 70 0 0041 43c10 4 21 6 34 6a80 80 0 0063-28v22h64V298c0-16-2-31-6-44a91 91 0 00-18-33zm-41 121v15c0 8-1 15-4 22a48 48 0 01-24 29 44 44 0 01-33 2 29 29 0 01-10-6 25 25 0 01-6-9 30 30 0 01-2-12c0-5 1-9 2-14a21 21 0 015-9 28 28 0 0110-7 83 83 0 0120-5l42-6zm323-68a144 144 0 00-16-42 87 87 0 00-28-29 75 75 0 00-41-11 73 73 0 00-44 14c-6 5-12 11-17 17V64H326v398h59v-18c8 10 18 17 30 21 6 2 13 3 21 3 16 0 31-4 43-11 12-7 23-18 31-31a147 147 0 0019-46 248 248 0 006-57c0-17-2-33-5-49zm-55 49c0 15-1 28-4 39-2 11-6 20-10 27a41 41 0 01-15 15 37 37 0 01-36 1 44 44 0 01-13-12 59 59 0 01-9-18A76 76 0 01384 352v-33c0-10 1-20 4-29 2-8 6-15 10-22a43 43 0 0115-13 37 37 0 0119-5 35 35 0 0132 18c4 6 7 14 9 23 2 9 3 20 3 31zM154 634a58 58 0 0120-15c14-6 35-7 49-1 7 3 13 6 20 12l21 17V572l-6-4a124 124 0 00-58-14c-20 0-38 4-54 11-16 7-30 17-41 30-12 13-20 29-26 46-6 17-9 36-9 57 0 18 3 36 8 52 6 16 14 30 24 42 10 12 23 21 38 28 15 7 32 10 50 10 15 0 28-2 39-5 11-3 21-8 30-14l5-4v-57l-13 6a26 26 0 01-5 2c-3 1-6 2-8 3-2 1-15 6-15 6-4 2-9 3-14 4a63 63 0 01-38-4 53 53 0 01-20-14 70 70 0 01-13-24 111 111 0 01-5-34c0-13 2-26 5-36 3-10 8-19 14-26zM896 384h-256V320h288c21 1 32 12 32 32v384c0 18-12 32-32 32H504l132 133-45 45-185-185c-16-21-16-25 0-45l185-185L637 576l-128 128H896V384z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Worktree">M512 0C229 0 0 72 0 160v128C0 376 229 448 512 448s512-72 512-160v-128C1024 72 795 0 512 0zM512 544C229 544 0 472 0 384v192c0 88 229 160 512 160s512-72 512-160V384c0 88-229 160-512 160zM512 832c-283 0-512-72-512-160v192C0 952 229 1024 512 1024s512-72 512-160v-192c0 88-229 160-512 160z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Worktree.Add">M640 725 768 725 768 597 853 597 853 725 981 725 981 811 853 811 853 939 768 939 768 811 640 811 640 725M384 128C573 128 725 204 725 299 725 393 573 469 384 469 195 469 43 393 43 299 43 204 195 128 384 128M43 384C43 478 195 555 384 555 573 555 725 478 725 384L725 512 683 512 683 595C663 612 640 627 610 640L555 640 555 660C504 675 446 683 384 683 195 683 43 606 43 512L43 384M43 597C43 692 195 768 384 768 446 768 504 760 555 745L555 873C504 888 446 896 384 896 195 896 43 820 43 725L43 597Z</StreamGeometry>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
@ -7,6 +7,16 @@
|
||||||
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• Monospace fonts come from </x:String>
|
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• Monospace fonts come from </x:String>
|
||||||
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• Source code can be found at </x:String>
|
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• Source code can be found at </x:String>
|
||||||
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">Opensource & Free Git GUI Client</x:String>
|
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">Opensource & Free Git GUI Client</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree" xml:space="preserve">Add Worktree</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout" xml:space="preserve">What to Checkout:</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.Existing" xml:space="preserve">Existing Branch</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.CreateNew" xml:space="preserve">Create New Branch</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location" xml:space="preserve">Location:</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location.Placeholder" xml:space="preserve">Path for this worktree. Relative path is supported.</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name" xml:space="preserve">Branch Name:</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name.Placeholder" xml:space="preserve">Optional. Default is the destination folder name.</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking" xml:space="preserve">Track Branch:</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking.Toggle" xml:space="preserve">Tracking remote branch</x:String>
|
||||||
<x:String x:Key="Text.Apply" xml:space="preserve">Patch</x:String>
|
<x:String x:Key="Text.Apply" xml:space="preserve">Patch</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error" xml:space="preserve">Error</x:String>
|
<x:String x:Key="Text.Apply.Error" xml:space="preserve">Error</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">Raise errors and refuses to apply the patch</x:String>
|
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">Raise errors and refuses to apply the patch</x:String>
|
||||||
|
@ -105,8 +115,8 @@
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">PARENTS</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">PARENTS</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">REFS</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">REFS</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">SHA</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">SHA</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Placeholder" xml:space="preserve">Enter commit subject & message</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Enter commit subject</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Tip" xml:space="preserve">Git uses an empty line to separate the subject and extra message body.</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.MessagePlaceholder" xml:space="preserve">Description</x:String>
|
||||||
<x:String x:Key="Text.Configure" xml:space="preserve">Repository Configure</x:String>
|
<x:String x:Key="Text.Configure" xml:space="preserve">Repository Configure</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email" xml:space="preserve">Email Address</x:String>
|
<x:String x:Key="Text.Configure.Email" xml:space="preserve">Email Address</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">Email address</x:String>
|
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">Email address</x:String>
|
||||||
|
@ -115,6 +125,7 @@
|
||||||
<x:String x:Key="Text.Configure.User" xml:space="preserve">User Name</x:String>
|
<x:String x:Key="Text.Configure.User" xml:space="preserve">User Name</x:String>
|
||||||
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">User name for this repository</x:String>
|
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">User name for this repository</x:String>
|
||||||
<x:String x:Key="Text.Copy" xml:space="preserve">Copy</x:String>
|
<x:String x:Key="Text.Copy" xml:space="preserve">Copy</x:String>
|
||||||
|
<x:String x:Key="Text.CopyMessage" xml:space="preserve">COPY MESSAGE</x:String>
|
||||||
<x:String x:Key="Text.CopyPath" xml:space="preserve">Copy Path</x:String>
|
<x:String x:Key="Text.CopyPath" xml:space="preserve">Copy Path</x:String>
|
||||||
<x:String x:Key="Text.CopyFileName" xml:space="preserve">Copy File Name</x:String>
|
<x:String x:Key="Text.CopyFileName" xml:space="preserve">Copy File Name</x:String>
|
||||||
<x:String x:Key="Text.CreateBranch" xml:space="preserve">Create Branch...</x:String>
|
<x:String x:Key="Text.CreateBranch" xml:space="preserve">Create Branch...</x:String>
|
||||||
|
@ -253,6 +264,10 @@
|
||||||
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">Pull</x:String>
|
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">Pull</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">Pull LFS Objects</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">Pull LFS Objects</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">Run `git lfs pull` to download all Git LFS files for current ref & checkout</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">Run `git lfs pull` to download all Git LFS files for current ref & checkout</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push" xml:space="preserve">Push</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Title" xml:space="preserve">Push LFS Objects</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Tips" xml:space="preserve">Push queued large files to the Git LFS endpoint</x:String>
|
||||||
|
<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.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.GitLFS.TrackByExtension" xml:space="preserve">Track all *{0} files</x:String>
|
||||||
<x:String x:Key="Text.Histories" xml:space="preserve">Histories</x:String>
|
<x:String x:Key="Text.Histories" xml:space="preserve">Histories</x:String>
|
||||||
|
@ -272,9 +287,10 @@
|
||||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit staged changes</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit staged changes</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">Commit and push staged changes</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">Commit and push staged changes</x:String>
|
||||||
|
<x:String x:Key="Text.Hotkeys.Repo.GoHome" xml:space="preserve">Dashboard mode (Default)</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">Force to reload this repository</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">Force to reload this repository</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">Stage/Unstage selected changes</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">Stage/Unstage selected changes</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">Open commit search</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">Commit search mode</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">Switch to 'Changes'</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">Switch to 'Changes'</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">Switch to 'Histories'</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">Switch to 'Histories'</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">Switch to 'Stashes'</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">Switch to 'Stashes'</x:String>
|
||||||
|
@ -329,9 +345,10 @@
|
||||||
<x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">Check for updates on startup</x:String>
|
<x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">Check for updates on startup</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">Language</x:String>
|
<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.MaxHistoryCommits" xml:space="preserve">History Commits</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">Restore windows</x:String>
|
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">Restore last opened tab(s) on startup</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">Subject Guide Length</x:String>
|
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">Subject Guide Length</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">Use fixed tab width in titlebar</x:String>
|
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">Use fixed tab width in titlebar</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.General.VisibleDiffContextLines" xml:space="preserve">Visible Diff Context Lines</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT</x:String>
|
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">Fetch remotes automatically</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">Fetch remotes automatically</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">Auto Fetch Interval</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">Auto Fetch Interval</x:String>
|
||||||
|
@ -360,6 +377,8 @@
|
||||||
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">Tool</x:String>
|
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">Tool</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote" xml:space="preserve">Prune Remote</x:String>
|
<x:String x:Key="Text.PruneRemote" xml:space="preserve">Prune Remote</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">Target:</x:String>
|
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">Target:</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees" xml:space="preserve">Prune Worktrees</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees.Tip" xml:space="preserve">Prune worktree information in `$GIT_DIR/worktrees`</x:String>
|
||||||
<x:String x:Key="Text.Pull" xml:space="preserve">Pull</x:String>
|
<x:String x:Key="Text.Pull" xml:space="preserve">Pull</x:String>
|
||||||
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">Branch:</x:String>
|
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">Branch:</x:String>
|
||||||
<x:String x:Key="Text.Pull.Into" xml:space="preserve">Into:</x:String>
|
<x:String x:Key="Text.Pull.Into" xml:space="preserve">Into:</x:String>
|
||||||
|
@ -401,6 +420,9 @@
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Target:</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Target:</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Confirm to Remove Worktree</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Enable `--force` Option</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Target:</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch" xml:space="preserve">Rename Branch</x:String>
|
<x:String x:Key="Text.RenameBranch" xml:space="preserve">Rename Branch</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">New Name:</x:String>
|
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">New Name:</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">Unique name for this branch</x:String>
|
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">Unique name for this branch</x:String>
|
||||||
|
@ -412,7 +434,6 @@
|
||||||
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configure this repository</x:String>
|
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configure this repository</x:String>
|
||||||
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUE</x:String>
|
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUE</x:String>
|
||||||
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Open In File Browser</x:String>
|
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Open In File Browser</x:String>
|
||||||
<x:String x:Key="Text.Repository.FilterBranchTip" xml:space="preserve">Filter Branches</x:String>
|
|
||||||
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">FILTERED BY:</x:String>
|
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">FILTERED BY:</x:String>
|
||||||
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">LOCAL BRANCHES</x:String>
|
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">LOCAL BRANCHES</x:String>
|
||||||
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">Navigate To HEAD</x:String>
|
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">Navigate To HEAD</x:String>
|
||||||
|
@ -427,6 +448,7 @@
|
||||||
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">Search By</x:String>
|
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">Search By</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">Information</x:String>
|
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">Information</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">File</x:String>
|
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">File</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.SearchBranchTag" xml:space="preserve">Search Branches & Tags</x:String>
|
||||||
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">Statistics</x:String>
|
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">Statistics</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">SUBMODULES</x:String>
|
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">SUBMODULES</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">ADD SUBMODULE</x:String>
|
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">ADD SUBMODULE</x:String>
|
||||||
|
@ -434,7 +456,9 @@
|
||||||
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">TAGS</x:String>
|
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">TAGS</x:String>
|
||||||
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">NEW TAG</x:String>
|
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">NEW TAG</x:String>
|
||||||
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">Open In Terminal</x:String>
|
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">Open In Terminal</x:String>
|
||||||
<x:String x:Key="Text.Repository.Workspace" xml:space="preserve">WORKSPACE</x:String>
|
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">WORKTREES</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">ADD WORKTREE</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">PRUNE</x:String>
|
||||||
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">Git Repository URL</x:String>
|
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">Git Repository URL</x:String>
|
||||||
<x:String x:Key="Text.Reset" xml:space="preserve">Reset Current Branch To Revision</x:String>
|
<x:String x:Key="Text.Reset" xml:space="preserve">Reset Current Branch To Revision</x:String>
|
||||||
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">Reset Mode:</x:String>
|
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">Reset Mode:</x:String>
|
||||||
|
@ -445,8 +469,7 @@
|
||||||
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">Commit:</x:String>
|
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">Commit:</x:String>
|
||||||
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">Commit revert changes</x:String>
|
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">Commit revert changes</x:String>
|
||||||
<x:String x:Key="Text.Reword" xml:space="preserve">Reword Commit Message</x:String>
|
<x:String x:Key="Text.Reword" xml:space="preserve">Reword Commit Message</x:String>
|
||||||
<x:String x:Key="Text.Reword.Message" xml:space="preserve">Message:</x:String>
|
<x:String x:Key="Text.Reword.Tip" xml:space="preserve">Use 'Shift+Enter' to input a new line. 'Enter' is the hotkey of OK button</x:String>
|
||||||
<x:String x:Key="Text.Reword.On" xml:space="preserve">On:</x:String>
|
|
||||||
<x:String x:Key="Text.Running" xml:space="preserve">Running. Please wait...</x:String>
|
<x:String x:Key="Text.Running" xml:space="preserve">Running. Please wait...</x:String>
|
||||||
<x:String x:Key="Text.Save" xml:space="preserve">SAVE</x:String>
|
<x:String x:Key="Text.Save" xml:space="preserve">SAVE</x:String>
|
||||||
<x:String x:Key="Text.SaveAs" xml:space="preserve">Save As...</x:String>
|
<x:String x:Key="Text.SaveAs" xml:space="preserve">Save As...</x:String>
|
||||||
|
@ -459,9 +482,6 @@
|
||||||
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Software Update</x:String>
|
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Software Update</x:String>
|
||||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">There are currently no updates available.</x:String>
|
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">There are currently no updates available.</x:String>
|
||||||
<x:String x:Key="Text.Squash" xml:space="preserve">Squash HEAD Into Parent</x:String>
|
<x:String x:Key="Text.Squash" xml:space="preserve">Squash HEAD Into Parent</x:String>
|
||||||
<x:String x:Key="Text.Squash.Head" xml:space="preserve">HEAD:</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.Message" xml:space="preserve">Reword:</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.To" xml:space="preserve">To:</x:String>
|
|
||||||
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH Private Key:</x:String>
|
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH Private Key:</x:String>
|
||||||
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">Private SSH key store path</x:String>
|
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">Private SSH key store path</x:String>
|
||||||
<x:String x:Key="Text.Start" xml:space="preserve">START</x:String>
|
<x:String x:Key="Text.Start" xml:space="preserve">START</x:String>
|
||||||
|
@ -539,4 +559,8 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">VIEW ASSUME UNCHANGED</x:String>
|
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">VIEW ASSUME UNCHANGED</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">Right-click the selected file(s), and make your choice to resolve conflicts.</x:String>
|
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">Right-click the selected file(s), and make your choice to resolve conflicts.</x:String>
|
||||||
<x:String x:Key="Text.Worktree" xml:space="preserve">WORKTREE</x:String>
|
<x:String x:Key="Text.Worktree" xml:space="preserve">WORKTREE</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">Copy Path</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Lock" xml:space="preserve">Lock</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Remove" xml:space="preserve">Remove</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Unlock" xml:space="preserve">Unlock</x:String>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
@ -10,6 +10,16 @@
|
||||||
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• 等宽字体来自于 </x:String>
|
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• 等宽字体来自于 </x:String>
|
||||||
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• 项目源代码地址 </x:String>
|
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• 项目源代码地址 </x:String>
|
||||||
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">开源免费的Git客户端</x:String>
|
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">开源免费的Git客户端</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree" xml:space="preserve">新增工作树</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout" xml:space="preserve">检出分支方式 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.Existing" xml:space="preserve">已有分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.CreateNew" xml:space="preserve">创建新分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location" xml:space="preserve">工作树路径 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location.Placeholder" xml:space="preserve">填写该工作树的路径。支持相对路径。</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name" xml:space="preserve">分支名 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name.Placeholder" xml:space="preserve">选填。默认使用目标文件夹名称。</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking" xml:space="preserve">跟踪分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking.Toggle" xml:space="preserve">设置上游跟踪分支</x:String>
|
||||||
<x:String x:Key="Text.Apply" xml:space="preserve">应用补丁(apply)</x:String>
|
<x:String x:Key="Text.Apply" xml:space="preserve">应用补丁(apply)</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error" xml:space="preserve">错误</x:String>
|
<x:String x:Key="Text.Apply.Error" xml:space="preserve">错误</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">输出错误,并终止应用补丁</x:String>
|
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">输出错误,并终止应用补丁</x:String>
|
||||||
|
@ -108,8 +118,8 @@
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">父提交</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">父提交</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">相关引用</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">相关引用</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">提交指纹</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">提交指纹</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Placeholder" xml:space="preserve">填写提交信息</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">填写提交信息主题</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Tip" xml:space="preserve">Git使用空白行来划分提交信息中的主题与内容</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.MessagePlaceholder" xml:space="preserve">详细描述</x:String>
|
||||||
<x:String x:Key="Text.Configure" xml:space="preserve">仓库配置</x:String>
|
<x:String x:Key="Text.Configure" xml:space="preserve">仓库配置</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email" xml:space="preserve">电子邮箱</x:String>
|
<x:String x:Key="Text.Configure.Email" xml:space="preserve">电子邮箱</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">邮箱地址</x:String>
|
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">邮箱地址</x:String>
|
||||||
|
@ -118,6 +128,7 @@
|
||||||
<x:String x:Key="Text.Configure.User" xml:space="preserve">用户名</x:String>
|
<x:String x:Key="Text.Configure.User" xml:space="preserve">用户名</x:String>
|
||||||
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">应用于本仓库的用户名</x:String>
|
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">应用于本仓库的用户名</x:String>
|
||||||
<x:String x:Key="Text.Copy" xml:space="preserve">复制</x:String>
|
<x:String x:Key="Text.Copy" xml:space="preserve">复制</x:String>
|
||||||
|
<x:String x:Key="Text.CopyMessage" xml:space="preserve">复制内容</x:String>
|
||||||
<x:String x:Key="Text.CopyPath" xml:space="preserve">复制路径</x:String>
|
<x:String x:Key="Text.CopyPath" xml:space="preserve">复制路径</x:String>
|
||||||
<x:String x:Key="Text.CopyFileName" xml:space="preserve">复制文件名</x:String>
|
<x:String x:Key="Text.CopyFileName" xml:space="preserve">复制文件名</x:String>
|
||||||
<x:String x:Key="Text.CreateBranch" xml:space="preserve">新建分支 ...</x:String>
|
<x:String x:Key="Text.CreateBranch" xml:space="preserve">新建分支 ...</x:String>
|
||||||
|
@ -256,6 +267,10 @@
|
||||||
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">拉回LFS对象 (pull)</x:String>
|
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">拉回LFS对象 (pull)</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">拉回LFS对象</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">拉回LFS对象</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">运行`git lfs pull`命令,下载远程LFS对象并更新工作副本。</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">运行`git lfs pull`命令,下载远程LFS对象并更新工作副本。</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push" xml:space="preserve">推送</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Title" xml:space="preserve">推送LFS对象</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Tips" xml:space="preserve">将排队的大文件推送到Git LFS远程服务</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Remote" xml:space="preserve">远程 :</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">跟踪名为'{0}'的文件</x:String>
|
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">跟踪名为'{0}'的文件</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">跟踪所有 *{0} 文件</x:String>
|
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">跟踪所有 *{0} 文件</x:String>
|
||||||
<x:String x:Key="Text.Histories" xml:space="preserve">历史记录</x:String>
|
<x:String x:Key="Text.Histories" xml:space="preserve">历史记录</x:String>
|
||||||
|
@ -275,9 +290,10 @@
|
||||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">仓库页面快捷键</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">仓库页面快捷键</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暂存区更改</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暂存区更改</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暂存区更改并推送</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暂存区更改并推送</x:String>
|
||||||
|
<x:String x:Key="Text.Hotkeys.Repo.GoHome" xml:space="preserve">切换左边栏为分支/标签等显示模式(默认)</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">重新加载仓库状态</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">重新加载仓库状态</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">将选中的变更暂存或从暂存列表中移除</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">将选中的变更暂存或从暂存列表中移除</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">打开历史搜索</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">切换左边栏为提交搜索模式</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">显示本地更改</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">显示本地更改</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">显示历史记录</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">显示历史记录</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">显示贮藏列表</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">显示贮藏列表</x:String>
|
||||||
|
@ -335,6 +351,7 @@
|
||||||
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">启动时恢复上次打开的仓库</x:String>
|
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">启动时恢复上次打开的仓库</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">SUBJECT字数检测</x:String>
|
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">SUBJECT字数检测</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">使用固定宽度的标题栏标签</x:String>
|
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">使用固定宽度的标题栏标签</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.General.VisibleDiffContextLines" xml:space="preserve">DIFF上下文行数</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT配置</x:String>
|
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT配置</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">启用定时自动拉取远程更新</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">启用定时自动拉取远程更新</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">自动拉取间隔</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">自动拉取间隔</x:String>
|
||||||
|
@ -363,6 +380,8 @@
|
||||||
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">工具</x:String>
|
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">工具</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote" xml:space="preserve">清理远程已删除分支</x:String>
|
<x:String x:Key="Text.PruneRemote" xml:space="preserve">清理远程已删除分支</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">目标 :</x:String>
|
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">目标 :</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees" xml:space="preserve">清理工作树</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees.Tip" xml:space="preserve">清理在`$GIT_DIR/worktrees`中的无效工作树信息</x:String>
|
||||||
<x:String x:Key="Text.Pull" xml:space="preserve">拉回(pull)</x:String>
|
<x:String x:Key="Text.Pull" xml:space="preserve">拉回(pull)</x:String>
|
||||||
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">拉取分支 :</x:String>
|
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">拉取分支 :</x:String>
|
||||||
<x:String x:Key="Text.Pull.Into" xml:space="preserve">本地分支 :</x:String>
|
<x:String x:Key="Text.Pull.Into" xml:space="preserve">本地分支 :</x:String>
|
||||||
|
@ -403,6 +422,9 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">拉取(fetch)更新</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">拉取(fetch)更新</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在浏览器中打开</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在浏览器中打开</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理远程已删除分支</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理远程已删除分支</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">移除工作树操作确认</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">启用`--force`选项</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">目标工作树 :</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch" xml:space="preserve">分支重命名</x:String>
|
<x:String x:Key="Text.RenameBranch" xml:space="preserve">分支重命名</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">新的名称 :</x:String>
|
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">新的名称 :</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">新的分支名不能与现有分支名相同</x:String>
|
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">新的分支名不能与现有分支名相同</x:String>
|
||||||
|
@ -414,7 +436,6 @@
|
||||||
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">配置本仓库</x:String>
|
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">配置本仓库</x:String>
|
||||||
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">下一步</x:String>
|
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">下一步</x:String>
|
||||||
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在文件浏览器中打开</x:String>
|
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在文件浏览器中打开</x:String>
|
||||||
<x:String x:Key="Text.Repository.FilterBranchTip" xml:space="preserve">过滤显示分支</x:String>
|
|
||||||
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">过滤规则 :</x:String>
|
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">过滤规则 :</x:String>
|
||||||
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">本地分支</x:String>
|
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">本地分支</x:String>
|
||||||
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">定位HEAD</x:String>
|
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">定位HEAD</x:String>
|
||||||
|
@ -429,6 +450,7 @@
|
||||||
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">搜索途径</x:String>
|
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">搜索途径</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">摘要</x:String>
|
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">摘要</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">文件</x:String>
|
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">文件</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.SearchBranchTag" xml:space="preserve">快速查找分支、标签</x:String>
|
||||||
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">提交统计</x:String>
|
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">提交统计</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">子模块列表</x:String>
|
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">子模块列表</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">添加子模块</x:String>
|
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">添加子模块</x:String>
|
||||||
|
@ -436,7 +458,9 @@
|
||||||
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">标签列表</x:String>
|
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">标签列表</x:String>
|
||||||
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">新建标签</x:String>
|
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">新建标签</x:String>
|
||||||
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">在终端中打开</x:String>
|
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">在终端中打开</x:String>
|
||||||
<x:String x:Key="Text.Repository.Workspace" xml:space="preserve">工作区</x:String>
|
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">工作树列表</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">新增工作树</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">清理</x:String>
|
||||||
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">远程仓库地址</x:String>
|
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">远程仓库地址</x:String>
|
||||||
<x:String x:Key="Text.Reset" xml:space="preserve">重置(reset)当前分支到指定版本</x:String>
|
<x:String x:Key="Text.Reset" xml:space="preserve">重置(reset)当前分支到指定版本</x:String>
|
||||||
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">重置模式 :</x:String>
|
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">重置模式 :</x:String>
|
||||||
|
@ -447,8 +471,7 @@
|
||||||
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">目标提交 :</x:String>
|
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">目标提交 :</x:String>
|
||||||
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">回滚后提交更改</x:String>
|
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">回滚后提交更改</x:String>
|
||||||
<x:String x:Key="Text.Reword" xml:space="preserve">编辑提交信息</x:String>
|
<x:String x:Key="Text.Reword" xml:space="preserve">编辑提交信息</x:String>
|
||||||
<x:String x:Key="Text.Reword.Message" xml:space="preserve">提交信息:</x:String>
|
<x:String x:Key="Text.Reword.Tip" xml:space="preserve">请使用Shift+Enter换行。Enter键已被【确 定】按钮占用。</x:String>
|
||||||
<x:String x:Key="Text.Reword.On" xml:space="preserve">提交:</x:String>
|
|
||||||
<x:String x:Key="Text.Running" xml:space="preserve">执行操作中,请耐心等待...</x:String>
|
<x:String x:Key="Text.Running" xml:space="preserve">执行操作中,请耐心等待...</x:String>
|
||||||
<x:String x:Key="Text.Save" xml:space="preserve">保 存</x:String>
|
<x:String x:Key="Text.Save" xml:space="preserve">保 存</x:String>
|
||||||
<x:String x:Key="Text.SaveAs" xml:space="preserve">另存为...</x:String>
|
<x:String x:Key="Text.SaveAs" xml:space="preserve">另存为...</x:String>
|
||||||
|
@ -461,9 +484,6 @@
|
||||||
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">软件更新</x:String>
|
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">软件更新</x:String>
|
||||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">当前已是最新版本。</x:String>
|
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">当前已是最新版本。</x:String>
|
||||||
<x:String x:Key="Text.Squash" xml:space="preserve">合并HEAD到上一个提交</x:String>
|
<x:String x:Key="Text.Squash" xml:space="preserve">合并HEAD到上一个提交</x:String>
|
||||||
<x:String x:Key="Text.Squash.Head" xml:space="preserve">当前提交 :</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.Message" xml:space="preserve">修改提交信息:</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.To" xml:space="preserve">合并到 :</x:String>
|
|
||||||
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH密钥 :</x:String>
|
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH密钥 :</x:String>
|
||||||
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH密钥文件</x:String>
|
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH密钥文件</x:String>
|
||||||
<x:String x:Key="Text.Start" xml:space="preserve">开 始</x:String>
|
<x:String x:Key="Text.Start" xml:space="preserve">开 始</x:String>
|
||||||
|
@ -541,4 +561,8 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">查看忽略变更文件</x:String>
|
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">查看忽略变更文件</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">请选中冲突文件,打开右键菜单,选择合适的解决方式</x:String>
|
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">请选中冲突文件,打开右键菜单,选择合适的解决方式</x:String>
|
||||||
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作树</x:String>
|
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作树</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">复制工作树路径</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Lock" xml:space="preserve">锁定工作树</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Remove" xml:space="preserve">移除工作树</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Unlock" xml:space="preserve">解除工作树锁定</x:String>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
@ -10,6 +10,16 @@
|
||||||
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• 等寬字型來自於 </x:String>
|
<x:String x:Key="Text.About.Fonts" xml:space="preserve">• 等寬字型來自於 </x:String>
|
||||||
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• 專案原始碼地址 </x:String>
|
<x:String x:Key="Text.About.SourceCode" xml:space="preserve">• 專案原始碼地址 </x:String>
|
||||||
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">開源免費的Git客戶端</x:String>
|
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">開源免費的Git客戶端</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree" xml:space="preserve">新增工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout" xml:space="preserve">檢出分支方式 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.Existing" xml:space="preserve">已有分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.WhatToCheckout.CreateNew" xml:space="preserve">創建新分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location" xml:space="preserve">工作樹路徑 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Location.Placeholder" xml:space="preserve">填寫該工作樹的路徑。支援相對路徑。</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name" xml:space="preserve">分支名 :</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Name.Placeholder" xml:space="preserve">選填。 預設使用目標資料夾名稱。</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking" xml:space="preserve">跟蹤分支</x:String>
|
||||||
|
<x:String x:Key="Text.AddWorktree.Tracking.Toggle" xml:space="preserve">設置上游跟蹤分支</x:String>
|
||||||
<x:String x:Key="Text.Apply" xml:space="preserve">應用補丁(apply)</x:String>
|
<x:String x:Key="Text.Apply" xml:space="preserve">應用補丁(apply)</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error" xml:space="preserve">錯誤</x:String>
|
<x:String x:Key="Text.Apply.Error" xml:space="preserve">錯誤</x:String>
|
||||||
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">輸出錯誤,並終止應用補丁</x:String>
|
<x:String x:Key="Text.Apply.Error.Desc" xml:space="preserve">輸出錯誤,並終止應用補丁</x:String>
|
||||||
|
@ -108,8 +118,8 @@
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">父提交</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">父提交</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">相關引用</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">相關引用</x:String>
|
||||||
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">提交指紋</x:String>
|
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">提交指紋</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Placeholder" xml:space="preserve">填寫提交資訊</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">填寫提交信息主題</x:String>
|
||||||
<x:String x:Key="Text.CommitMessageTextBox.Tip" xml:space="preserve">Git使用空白行來劃分提交資訊中的主題與內容</x:String>
|
<x:String x:Key="Text.CommitMessageTextBox.MessagePlaceholder" xml:space="preserve">詳細描述</x:String>
|
||||||
<x:String x:Key="Text.Configure" xml:space="preserve">倉庫配置</x:String>
|
<x:String x:Key="Text.Configure" xml:space="preserve">倉庫配置</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email" xml:space="preserve">電子郵箱</x:String>
|
<x:String x:Key="Text.Configure.Email" xml:space="preserve">電子郵箱</x:String>
|
||||||
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">郵箱地址</x:String>
|
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">郵箱地址</x:String>
|
||||||
|
@ -118,6 +128,7 @@
|
||||||
<x:String x:Key="Text.Configure.User" xml:space="preserve">使用者名稱</x:String>
|
<x:String x:Key="Text.Configure.User" xml:space="preserve">使用者名稱</x:String>
|
||||||
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">應用於本倉庫的使用者名稱</x:String>
|
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">應用於本倉庫的使用者名稱</x:String>
|
||||||
<x:String x:Key="Text.Copy" xml:space="preserve">複製</x:String>
|
<x:String x:Key="Text.Copy" xml:space="preserve">複製</x:String>
|
||||||
|
<x:String x:Key="Text.CopyMessage" xml:space="preserve">複製內容</x:String>
|
||||||
<x:String x:Key="Text.CopyPath" xml:space="preserve">複製路徑</x:String>
|
<x:String x:Key="Text.CopyPath" xml:space="preserve">複製路徑</x:String>
|
||||||
<x:String x:Key="Text.CopyFileName" xml:space="preserve">複製檔名</x:String>
|
<x:String x:Key="Text.CopyFileName" xml:space="preserve">複製檔名</x:String>
|
||||||
<x:String x:Key="Text.CreateBranch" xml:space="preserve">新建分支 ...</x:String>
|
<x:String x:Key="Text.CreateBranch" xml:space="preserve">新建分支 ...</x:String>
|
||||||
|
@ -256,6 +267,10 @@
|
||||||
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">拉回LFS物件 (pull)</x:String>
|
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">拉回LFS物件 (pull)</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">拉回LFS物件</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">拉回LFS物件</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">執行`git lfs pull`命令,下載遠端LFS物件并更新工作副本。</x:String>
|
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">執行`git lfs pull`命令,下載遠端LFS物件并更新工作副本。</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push" xml:space="preserve">推送</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Title" xml:space="preserve">推送LFS物件</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Push.Tips" xml:space="preserve">將排隊的大檔推送到Git LFS遠端服務</x:String>
|
||||||
|
<x:String x:Key="Text.GitLFS.Remote" xml:space="preserve">遠端倉庫 :</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">跟蹤名為'{0}'的檔案</x:String>
|
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">跟蹤名為'{0}'的檔案</x:String>
|
||||||
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">跟蹤所有 *{0} 檔案</x:String>
|
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">跟蹤所有 *{0} 檔案</x:String>
|
||||||
<x:String x:Key="Text.Histories" xml:space="preserve">歷史記錄</x:String>
|
<x:String x:Key="Text.Histories" xml:space="preserve">歷史記錄</x:String>
|
||||||
|
@ -275,9 +290,10 @@
|
||||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">倉庫頁面快捷鍵</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">倉庫頁面快捷鍵</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暫存區變更</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暫存區變更</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暫存區變更併推送</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暫存區變更併推送</x:String>
|
||||||
|
<x:String x:Key="Text.Hotkeys.Repo.GoHome" xml:space="preserve">切換左邊欄為分支/標籤等顯示模式(預設)</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">重新載入倉庫狀態</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">重新載入倉庫狀態</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">將選中的變更暫存或從暫存列表中移除</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.StageOrUnstageSelected" xml:space="preserve">將選中的變更暫存或從暫存列表中移除</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">開啟歷史搜尋</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">切換左邊欄為歷史搜尋模式</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">顯示本地更改</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">顯示本地更改</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">顯示歷史記錄</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">顯示歷史記錄</x:String>
|
||||||
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">顯示儲藏列表</x:String>
|
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">顯示儲藏列表</x:String>
|
||||||
|
@ -335,6 +351,7 @@
|
||||||
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">啟動時恢復上次開啟的倉庫</x:String>
|
<x:String x:Key="Text.Preference.General.RestoreTabs" xml:space="preserve">啟動時恢復上次開啟的倉庫</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">SUBJECT字數檢測</x:String>
|
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">SUBJECT字數檢測</x:String>
|
||||||
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">使用固定寬度的標題欄標籤</x:String>
|
<x:String x:Key="Text.Preference.General.UseFixedTabWidth" xml:space="preserve">使用固定寬度的標題欄標籤</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.General.VisibleDiffContextLines" xml:space="preserve">DIFF上下文行數</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT配置</x:String>
|
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT配置</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">啟用定時自動拉取遠端更新</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetch" xml:space="preserve">啟用定時自動拉取遠端更新</x:String>
|
||||||
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">自動拉取間隔</x:String>
|
<x:String x:Key="Text.Preference.Git.AutoFetchInterval" xml:space="preserve">自動拉取間隔</x:String>
|
||||||
|
@ -363,6 +380,8 @@
|
||||||
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">工具</x:String>
|
<x:String x:Key="Text.Preference.DiffMerge.Type" xml:space="preserve">工具</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote" xml:space="preserve">清理遠端已刪除分支</x:String>
|
<x:String x:Key="Text.PruneRemote" xml:space="preserve">清理遠端已刪除分支</x:String>
|
||||||
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">目標 :</x:String>
|
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">目標 :</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees" xml:space="preserve">清理工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.PruneWorktrees.Tip" xml:space="preserve">清理在`$GIT_DIR/worktrees`中的無效工作樹資訊</x:String>
|
||||||
<x:String x:Key="Text.Pull" xml:space="preserve">拉回(pull)</x:String>
|
<x:String x:Key="Text.Pull" xml:space="preserve">拉回(pull)</x:String>
|
||||||
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">拉取分支 :</x:String>
|
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">拉取分支 :</x:String>
|
||||||
<x:String x:Key="Text.Pull.Into" xml:space="preserve">本地分支 :</x:String>
|
<x:String x:Key="Text.Pull.Into" xml:space="preserve">本地分支 :</x:String>
|
||||||
|
@ -403,6 +422,9 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">拉取(fetch)更新</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">拉取(fetch)更新</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在瀏覽器中訪問網址</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在瀏覽器中訪問網址</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理遠端已刪除分支</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理遠端已刪除分支</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">刪除工作樹操作確認</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">啟用`--force`選項</x:String>
|
||||||
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">目標工作樹 :</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch" xml:space="preserve">分支重新命名</x:String>
|
<x:String x:Key="Text.RenameBranch" xml:space="preserve">分支重新命名</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">新的名稱 :</x:String>
|
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">新的名稱 :</x:String>
|
||||||
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">新的分支名不能與現有分支名相同</x:String>
|
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">新的分支名不能與現有分支名相同</x:String>
|
||||||
|
@ -414,7 +436,6 @@
|
||||||
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">配置本倉庫</x:String>
|
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">配置本倉庫</x:String>
|
||||||
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">下一步</x:String>
|
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">下一步</x:String>
|
||||||
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在檔案瀏覽器中開啟</x:String>
|
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在檔案瀏覽器中開啟</x:String>
|
||||||
<x:String x:Key="Text.Repository.FilterBranchTip" xml:space="preserve">過濾顯示分支</x:String>
|
|
||||||
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">過濾規則 :</x:String>
|
<x:String x:Key="Text.Repository.FilterCommitPrefix" xml:space="preserve">過濾規則 :</x:String>
|
||||||
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">本地分支</x:String>
|
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">本地分支</x:String>
|
||||||
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">定位HEAD</x:String>
|
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">定位HEAD</x:String>
|
||||||
|
@ -429,6 +450,7 @@
|
||||||
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">查詢方式</x:String>
|
<x:String x:Key="Text.Repository.Search.By" xml:space="preserve">查詢方式</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">摘要</x:String>
|
<x:String x:Key="Text.Repository.Search.ByBaseInfo" xml:space="preserve">摘要</x:String>
|
||||||
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">檔案</x:String>
|
<x:String x:Key="Text.Repository.Search.ByFile" xml:space="preserve">檔案</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.SearchBranchTag" xml:space="preserve">快速查找分支、標籤</x:String>
|
||||||
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">提交統計</x:String>
|
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">提交統計</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">子模組列表</x:String>
|
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">子模組列表</x:String>
|
||||||
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">新增子模組</x:String>
|
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">新增子模組</x:String>
|
||||||
|
@ -436,7 +458,9 @@
|
||||||
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">標籤列表</x:String>
|
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">標籤列表</x:String>
|
||||||
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">新建標籤</x:String>
|
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">新建標籤</x:String>
|
||||||
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">在終端中開啟</x:String>
|
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">在終端中開啟</x:String>
|
||||||
<x:String x:Key="Text.Repository.Workspace" xml:space="preserve">工作區</x:String>
|
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">工作樹清單</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">新建工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">清理</x:String>
|
||||||
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">遠端倉庫地址</x:String>
|
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">遠端倉庫地址</x:String>
|
||||||
<x:String x:Key="Text.Reset" xml:space="preserve">重置(reset)當前分支到指定版本</x:String>
|
<x:String x:Key="Text.Reset" xml:space="preserve">重置(reset)當前分支到指定版本</x:String>
|
||||||
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">重置模式 :</x:String>
|
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">重置模式 :</x:String>
|
||||||
|
@ -447,8 +471,7 @@
|
||||||
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">目標提交 :</x:String>
|
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">目標提交 :</x:String>
|
||||||
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">回滾後提交更改</x:String>
|
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">回滾後提交更改</x:String>
|
||||||
<x:String x:Key="Text.Reword" xml:space="preserve">編輯提交資訊</x:String>
|
<x:String x:Key="Text.Reword" xml:space="preserve">編輯提交資訊</x:String>
|
||||||
<x:String x:Key="Text.Reword.Message" xml:space="preserve">提交資訊:</x:String>
|
<x:String x:Key="Text.Reword.Tip" xml:space="preserve">請使用Shift+Enter換行。Enter鍵已被【確 定】按鈕佔用。</x:String>
|
||||||
<x:String x:Key="Text.Reword.On" xml:space="preserve">提交:</x:String>
|
|
||||||
<x:String x:Key="Text.Running" xml:space="preserve">執行操作中,請耐心等待...</x:String>
|
<x:String x:Key="Text.Running" xml:space="preserve">執行操作中,請耐心等待...</x:String>
|
||||||
<x:String x:Key="Text.Save" xml:space="preserve">保 存</x:String>
|
<x:String x:Key="Text.Save" xml:space="preserve">保 存</x:String>
|
||||||
<x:String x:Key="Text.SaveAs" xml:space="preserve">另存為...</x:String>
|
<x:String x:Key="Text.SaveAs" xml:space="preserve">另存為...</x:String>
|
||||||
|
@ -461,9 +484,6 @@
|
||||||
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">軟體更新</x:String>
|
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">軟體更新</x:String>
|
||||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">當前已是最新版本。</x:String>
|
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">當前已是最新版本。</x:String>
|
||||||
<x:String x:Key="Text.Squash" xml:space="preserve">合併HEAD到上一個提交</x:String>
|
<x:String x:Key="Text.Squash" xml:space="preserve">合併HEAD到上一個提交</x:String>
|
||||||
<x:String x:Key="Text.Squash.Head" xml:space="preserve">當前提交 :</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.Message" xml:space="preserve">修改提交資訊:</x:String>
|
|
||||||
<x:String x:Key="Text.Squash.To" xml:space="preserve">合併到 :</x:String>
|
|
||||||
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH金鑰 :</x:String>
|
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH金鑰 :</x:String>
|
||||||
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH金鑰檔案</x:String>
|
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH金鑰檔案</x:String>
|
||||||
<x:String x:Key="Text.Start" xml:space="preserve">開 始</x:String>
|
<x:String x:Key="Text.Start" xml:space="preserve">開 始</x:String>
|
||||||
|
@ -541,4 +561,8 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">檢視忽略變更檔案</x:String>
|
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchaged" xml:space="preserve">檢視忽略變更檔案</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">請選中衝突檔案,開啟右鍵選單,選擇合適的解決方式</x:String>
|
<x:String x:Key="Text.WorkingCopy.ResolveTip" xml:space="preserve">請選中衝突檔案,開啟右鍵選單,選擇合適的解決方式</x:String>
|
||||||
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作樹</x:String>
|
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">拷贝工作樹路徑</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Lock" xml:space="preserve">鎖定工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Remove" xml:space="preserve">移除工作樹</x:String>
|
||||||
|
<x:String x:Key="Text.Worktree.Unlock" xml:space="preserve">解除鎖定工作樹</x:String>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<Styles xmlns="https://github.com/avaloniaui"
|
<Styles xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:vm="using:SourceGit.ViewModels"
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
xmlns:c="using:SourceGit.Converters"
|
||||||
xmlns:ae="using:AvaloniaEdit"
|
xmlns:ae="using:AvaloniaEdit"
|
||||||
xmlns:aes="using:AvaloniaEdit.Search">
|
xmlns:aes="using:AvaloniaEdit.Search">
|
||||||
<Design.PreviewWith>
|
<Design.PreviewWith>
|
||||||
|
@ -218,6 +219,7 @@
|
||||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
|
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
|
||||||
|
<Setter Property="FontSize" Value="{Binding Source={x:Static vm:Preference.Instance}, Path=DefaultFontSize}"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="TextBlock.bold">
|
<Style Selector="TextBlock.bold">
|
||||||
<Setter Property="FontWeight" Value="Bold"/>
|
<Setter Property="FontWeight" Value="Bold"/>
|
||||||
|
@ -231,7 +233,7 @@
|
||||||
<Style Selector="TextBlock.group_header_label">
|
<Style Selector="TextBlock.group_header_label">
|
||||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
|
<Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
|
||||||
<Setter Property="FontWeight" Value="Bold"/>
|
<Setter Property="FontWeight" Value="Bold"/>
|
||||||
<Setter Property="Margin" Value="8,0,0,0"/>
|
<Setter Property="Margin" Value="10,0,0,0"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="TextBlock.info_label">
|
<Style Selector="TextBlock.info_label">
|
||||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
|
<Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
|
||||||
|
@ -326,6 +328,7 @@
|
||||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="TextBlock.tab_header">
|
<Style Selector="TextBlock.tab_header">
|
||||||
|
<Setter Property="FontSize" Value="{Binding Source={x:Static vm:Preference.Instance}, Path=DefaultFontSize, Converter={x:Static c:DoubleConverters.Increase}}"/>
|
||||||
<Setter Property="FontWeight" Value="Bold"/>
|
<Setter Property="FontWeight" Value="Bold"/>
|
||||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
|
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
|
||||||
<Setter Property="Opacity" Value=".56"/>
|
<Setter Property="Opacity" Value=".56"/>
|
||||||
|
@ -624,10 +627,6 @@
|
||||||
</Setter>
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style Selector="Border.launcher_pagetab">
|
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
|
||||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ListBox.launcher_page_tabbar">
|
<Style Selector="ListBox.launcher_page_tabbar">
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
@ -639,26 +638,12 @@
|
||||||
<Setter Property="Opacity" Value=".5"/>
|
<Setter Property="Opacity" Value=".5"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="ListBox.launcher_page_tabbar ListBoxItem:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
<Style Selector="ListBox.launcher_page_tabbar ListBoxItem:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||||||
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
<Setter Property="Opacity" Value=".85"/>
|
<Setter Property="Opacity" Value=".85"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="ListBox.launcher_page_tabbar ListBoxItem:selected /template/ ContentPresenter#PART_ContentPresenter">
|
<Style Selector="ListBox.launcher_page_tabbar ListBoxItem:selected /template/ ContentPresenter#PART_ContentPresenter">
|
||||||
<Setter Property="Opacity" Value="1"/>
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ListBoxItem:selected Border.launcher_pagetab">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource Brush.ToolBar}"/>
|
|
||||||
<Setter Property="BorderBrush" Value="{DynamicResource Brush.Border0}"/>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="ListBox.page_switcher ListBoxItem">
|
|
||||||
<Setter Property="Margin" Value="4,0,2,0"/>
|
|
||||||
<Setter Property="Padding" Value="0"/>
|
|
||||||
<Setter Property="CornerRadius" Value="4"/>
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ListBox.page_switcher ListBoxItem:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
</Style>
|
<Setter Property="Opacity" Value="1"/>
|
||||||
<Style Selector="ListBox.page_switcher ListBoxItem:selected /template/ ContentPresenter#PART_ContentPresenter">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}"/>
|
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style Selector="ContextMenu">
|
<Style Selector="ContextMenu">
|
||||||
|
@ -969,8 +954,32 @@
|
||||||
</Style>
|
</Style>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
<Style Selector="RadioButton.icon_button">
|
||||||
|
<Setter Property="BorderThickness" Value="0"/>
|
||||||
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<ControlTemplate>
|
||||||
|
<Border Background="Transparent">
|
||||||
|
<ContentPresenter x:Name="PART_ContentPresenter"
|
||||||
|
Margin="0"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Content="{TemplateBinding Content}"
|
||||||
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
|
Foreground="{TemplateBinding Foreground}"
|
||||||
|
RecognizesAccessKey="True" />
|
||||||
|
</Border>
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter>
|
||||||
|
|
||||||
|
<Style Selector="^:checked Path">
|
||||||
|
<Setter Property="Fill" Value="{DynamicResource Brush.Accent}"/>
|
||||||
|
<Setter Property="Opacity" Value="0.65"/>
|
||||||
|
</Style>
|
||||||
|
</Style>
|
||||||
|
|
||||||
<Style Selector="ToggleButton.group_expander">
|
<Style Selector="ToggleButton.group_expander">
|
||||||
<Setter Property="Margin" Value="0"/>
|
<Setter Property="Margin" Value="6,0,0,0"/>
|
||||||
<Setter Property="Padding" Value="0"/>
|
<Setter Property="Padding" Value="0"/>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||||
|
@ -980,8 +989,8 @@
|
||||||
<Grid ColumnDefinitions="Auto,*">
|
<Grid ColumnDefinitions="Auto,*">
|
||||||
<Path Grid.Column="0"
|
<Path Grid.Column="0"
|
||||||
x:Name="PART_IndicatorIcon"
|
x:Name="PART_IndicatorIcon"
|
||||||
Margin="4,0,0,0"
|
|
||||||
Width="10"
|
Width="10"
|
||||||
|
Margin="0,0,2,0"
|
||||||
Data="{StaticResource Icons.Down}"
|
Data="{StaticResource Icons.Down}"
|
||||||
Fill="{DynamicResource Brush.FG2}"
|
Fill="{DynamicResource Brush.FG2}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
@ -1291,6 +1300,9 @@
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style Selector="TreeDataGridRow">
|
<Style Selector="TreeDataGridRow">
|
||||||
|
<Style.Resources>
|
||||||
|
<SolidColorBrush x:Key="TreeDataGridSelectedCellBackgroundBrush" Color="{DynamicResource SystemAccentColor}" Opacity="0.4" />
|
||||||
|
</Style.Resources>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,13 @@
|
||||||
<Color x:Key="Color.MacOS.Minimize">#FFFFBE2F</Color>
|
<Color x:Key="Color.MacOS.Minimize">#FFFFBE2F</Color>
|
||||||
<Color x:Key="Color.MacOS.Maximize">#FF29c941</Color>
|
<Color x:Key="Color.MacOS.Maximize">#FF29c941</Color>
|
||||||
<Color x:Key="Color.Window">#FFF0F5F9</Color>
|
<Color x:Key="Color.Window">#FFF0F5F9</Color>
|
||||||
<Color x:Key="Color.WindowBorder">#FFAFAFAF</Color>
|
<Color x:Key="Color.WindowBorder">#00000000</Color>
|
||||||
<Color x:Key="Color.TitleBar">#FFCFDEEA</Color>
|
<Color x:Key="Color.TitleBar">#FFCFDEEA</Color>
|
||||||
<Color x:Key="Color.ToolBar">#FFF0F5F9</Color>
|
<Color x:Key="Color.ToolBar">#FFF0F5F9</Color>
|
||||||
<Color x:Key="Color.Popup">#FFF8F8F8</Color>
|
<Color x:Key="Color.Popup">#FFF8F8F8</Color>
|
||||||
<Color x:Key="Color.Contents">#FFFAFAFA</Color>
|
<Color x:Key="Color.Contents">#FFFAFAFA</Color>
|
||||||
<Color x:Key="Color.Badge">#FFB0CEE8</Color>
|
<Color x:Key="Color.Badge">#FFB0CEE8</Color>
|
||||||
|
<Color x:Key="Color.BadgeFG">#FF1F1F1F</Color>
|
||||||
<Color x:Key="Color.Decorator">#FF6F6F6F</Color>
|
<Color x:Key="Color.Decorator">#FF6F6F6F</Color>
|
||||||
<Color x:Key="Color.DecoratorIcon">#FFF8F8F8</Color>
|
<Color x:Key="Color.DecoratorIcon">#FFF8F8F8</Color>
|
||||||
<Color x:Key="Color.Conflict">#FF836C2E</Color>
|
<Color x:Key="Color.Conflict">#FF836C2E</Color>
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
<Color x:Key="Color.Popup">#FF2B2B2B</Color>
|
<Color x:Key="Color.Popup">#FF2B2B2B</Color>
|
||||||
<Color x:Key="Color.Contents">#FF1B1B1B</Color>
|
<Color x:Key="Color.Contents">#FF1B1B1B</Color>
|
||||||
<Color x:Key="Color.Badge">#FF8F8F8F</Color>
|
<Color x:Key="Color.Badge">#FF8F8F8F</Color>
|
||||||
|
<Color x:Key="Color.BadgeFG">#FFDDDDDD</Color>
|
||||||
<Color x:Key="Color.Decorator">#FF505050</Color>
|
<Color x:Key="Color.Decorator">#FF505050</Color>
|
||||||
<Color x:Key="Color.DecoratorIcon">#FFF8F8F8</Color>
|
<Color x:Key="Color.DecoratorIcon">#FFF8F8F8</Color>
|
||||||
<Color x:Key="Color.Conflict">#FFFAFAD2</Color>
|
<Color x:Key="Color.Conflict">#FFFAFAD2</Color>
|
||||||
|
@ -70,6 +72,7 @@
|
||||||
<SolidColorBrush x:Key="Brush.Popup" Color="{DynamicResource Color.Popup}"/>
|
<SolidColorBrush x:Key="Brush.Popup" Color="{DynamicResource Color.Popup}"/>
|
||||||
<SolidColorBrush x:Key="Brush.Contents" Color="{DynamicResource Color.Contents}"/>
|
<SolidColorBrush x:Key="Brush.Contents" Color="{DynamicResource Color.Contents}"/>
|
||||||
<SolidColorBrush x:Key="Brush.Badge" Color="{DynamicResource Color.Badge}"/>
|
<SolidColorBrush x:Key="Brush.Badge" Color="{DynamicResource Color.Badge}"/>
|
||||||
|
<SolidColorBrush x:Key="Brush.BadgeFG" Color="{DynamicResource Color.BadgeFG}"/>
|
||||||
<SolidColorBrush x:Key="Brush.Decorator" Color="{DynamicResource Color.Decorator}"/>
|
<SolidColorBrush x:Key="Brush.Decorator" Color="{DynamicResource Color.Decorator}"/>
|
||||||
<SolidColorBrush x:Key="Brush.DecoratorIcon" Color="{DynamicResource Color.DecoratorIcon}"/>
|
<SolidColorBrush x:Key="Brush.DecoratorIcon" Color="{DynamicResource Color.DecoratorIcon}"/>
|
||||||
<SolidColorBrush x:Key="Brush.Conflict" Color="{DynamicResource Color.Conflict}"/>
|
<SolidColorBrush x:Key="Brush.Conflict" Color="{DynamicResource Color.Conflict}"/>
|
||||||
|
|
129
src/ViewModels/AddWorktree.cs
Normal file
129
src/ViewModels/AddWorktree.cs
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SourceGit.ViewModels
|
||||||
|
{
|
||||||
|
public class AddWorktree : Popup
|
||||||
|
{
|
||||||
|
[Required(ErrorMessage = "Worktree path is required!")]
|
||||||
|
[CustomValidation(typeof(AddWorktree), nameof(ValidateWorktreePath))]
|
||||||
|
public string Path
|
||||||
|
{
|
||||||
|
get => _path;
|
||||||
|
set => SetProperty(ref _path, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CreateNewBranch
|
||||||
|
{
|
||||||
|
get => _createNewBranch;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (SetProperty(ref _createNewBranch, value, true))
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
SelectedBranch = string.Empty;
|
||||||
|
else
|
||||||
|
SelectedBranch = LocalBranches.Count > 0 ? LocalBranches[0] : string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> LocalBranches
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> RemoteBranches
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SelectedBranch
|
||||||
|
{
|
||||||
|
get => _selectedBranch;
|
||||||
|
set => SetProperty(ref _selectedBranch, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SetTrackingBranch
|
||||||
|
{
|
||||||
|
get => _setTrackingBranch;
|
||||||
|
set => SetProperty(ref _setTrackingBranch, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SelectedTrackingBranch
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddWorktree(Repository repo)
|
||||||
|
{
|
||||||
|
_repo = repo;
|
||||||
|
|
||||||
|
LocalBranches = new List<string>();
|
||||||
|
RemoteBranches = new List<string>();
|
||||||
|
foreach (var branch in repo.Branches)
|
||||||
|
{
|
||||||
|
if (branch.IsLocal)
|
||||||
|
LocalBranches.Add(branch.Name);
|
||||||
|
else
|
||||||
|
RemoteBranches.Add($"{branch.Remote}/{branch.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RemoteBranches.Count > 0)
|
||||||
|
SelectedTrackingBranch = RemoteBranches[0];
|
||||||
|
else
|
||||||
|
SelectedTrackingBranch = string.Empty;
|
||||||
|
|
||||||
|
View = new Views.AddWorktree() { DataContext = this };
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ValidationResult ValidateWorktreePath(string path, ValidationContext ctx)
|
||||||
|
{
|
||||||
|
var creator = ctx.ObjectInstance as AddWorktree;
|
||||||
|
if (creator == null)
|
||||||
|
return new ValidationResult("Missing runtime context to create branch!");
|
||||||
|
|
||||||
|
var fullPath = System.IO.Path.IsPathRooted(path) ? path : System.IO.Path.Combine(creator._repo.FullPath, path);
|
||||||
|
var info = new DirectoryInfo(fullPath);
|
||||||
|
if (info.Exists)
|
||||||
|
{
|
||||||
|
var files = info.GetFiles();
|
||||||
|
if (files.Length > 0)
|
||||||
|
return new ValidationResult("Given path is not empty!!!");
|
||||||
|
|
||||||
|
var folders = info.GetDirectories();
|
||||||
|
if (folders.Length > 0)
|
||||||
|
return new ValidationResult("Given path is not empty!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValidationResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> Sure()
|
||||||
|
{
|
||||||
|
_repo.SetWatcherEnabled(false);
|
||||||
|
ProgressDescription = "Adding worktree ...";
|
||||||
|
|
||||||
|
var branchName = _selectedBranch;
|
||||||
|
var tracking = _setTrackingBranch ? SelectedTrackingBranch : string.Empty;
|
||||||
|
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
var succ = new Commands.Worktree(_repo.FullPath).Add(_path, branchName, _createNewBranch, tracking, SetProgressDescription);
|
||||||
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
|
return succ;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Repository _repo = null;
|
||||||
|
private string _path = string.Empty;
|
||||||
|
private bool _createNewBranch = true;
|
||||||
|
private string _selectedBranch = string.Empty;
|
||||||
|
private bool _setTrackingBranch = false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,16 +57,6 @@ namespace SourceGit.ViewModels
|
||||||
private set => SetProperty(ref _content, value);
|
private set => SetProperty(ref _content, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Unified
|
|
||||||
{
|
|
||||||
get => _unified;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (SetProperty(ref _unified, value))
|
|
||||||
LoadDiffContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DiffContext(string repo, Models.DiffOption option, DiffContext previous = null)
|
public DiffContext(string repo, Models.DiffOption option, DiffContext previous = null)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
@ -88,12 +78,20 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
public void IncrUnified()
|
public void IncrUnified()
|
||||||
{
|
{
|
||||||
Unified = _unified + 1;
|
var pref = Preference.Instance;
|
||||||
|
pref.DiffViewVisualLineNumbers = pref.DiffViewVisualLineNumbers + 1;
|
||||||
|
LoadDiffContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DecrUnified()
|
public void DecrUnified()
|
||||||
{
|
{
|
||||||
Unified = Math.Max(4, _unified - 1);
|
var pref = Preference.Instance;
|
||||||
|
var unified = pref.DiffViewVisualLineNumbers - 1;
|
||||||
|
if (pref.DiffViewVisualLineNumbers != unified)
|
||||||
|
{
|
||||||
|
pref.DiffViewVisualLineNumbers = unified;
|
||||||
|
LoadDiffContent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenExternalMergeTool()
|
public void OpenExternalMergeTool()
|
||||||
|
@ -105,9 +103,10 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
private void LoadDiffContent()
|
private void LoadDiffContent()
|
||||||
{
|
{
|
||||||
|
var unified = Preference.Instance.DiffViewVisualLineNumbers;
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
var latest = new Commands.Diff(_repo, _option, _unified).Result();
|
var latest = new Commands.Diff(_repo, _option, unified).Result();
|
||||||
var rs = null as object;
|
var rs = null as object;
|
||||||
|
|
||||||
if (latest.TextDiff != null)
|
if (latest.TextDiff != null)
|
||||||
|
@ -238,6 +237,5 @@ namespace SourceGit.ViewModels
|
||||||
private bool _isLoading = true;
|
private bool _isLoading = true;
|
||||||
private bool _isTextDiff = false;
|
private bool _isTextDiff = false;
|
||||||
private object _content = null;
|
private object _content = null;
|
||||||
private int _unified = 4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,6 +217,12 @@ namespace SourceGit.ViewModels
|
||||||
reword.Icon = App.CreateMenuIcon("Icons.Edit");
|
reword.Icon = App.CreateMenuIcon("Icons.Edit");
|
||||||
reword.Click += (o, e) =>
|
reword.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
|
if (_repo.WorkingCopyChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (PopupHost.CanCreatePopup())
|
if (PopupHost.CanCreatePopup())
|
||||||
PopupHost.ShowPopup(new Reword(_repo, commit));
|
PopupHost.ShowPopup(new Reword(_repo, commit));
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
|
@ -229,6 +235,12 @@ namespace SourceGit.ViewModels
|
||||||
squash.IsEnabled = commit.Parents.Count == 1;
|
squash.IsEnabled = commit.Parents.Count == 1;
|
||||||
squash.Click += (o, e) =>
|
squash.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
|
if (_repo.WorkingCopyChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (commit.Parents.Count == 1)
|
if (commit.Parents.Count == 1)
|
||||||
{
|
{
|
||||||
var parent = _commits.Find(x => x.SHA == commit.Parents[0]);
|
var parent = _commits.Find(x => x.SHA == commit.Parents[0]);
|
||||||
|
@ -284,6 +296,12 @@ namespace SourceGit.ViewModels
|
||||||
interactiveRebase.IsVisible = current.Head != commit.SHA;
|
interactiveRebase.IsVisible = current.Head != commit.SHA;
|
||||||
interactiveRebase.Click += (o, e) =>
|
interactiveRebase.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
|
if (_repo.WorkingCopyChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var dialog = new Views.InteractiveRebase() { DataContext = new InteractiveRebase(_repo, current, commit) };
|
var dialog = new Views.InteractiveRebase() { DataContext = new InteractiveRebase(_repo, current, commit) };
|
||||||
dialog.ShowDialog(App.GetTopLevel() as Window);
|
dialog.ShowDialog(App.GetTopLevel() as Window);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
|
@ -468,7 +486,7 @@ namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var finish = new MenuItem();
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", current.Name);
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", current.Name);
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.Flow");
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
finish.Click += (o, e) =>
|
finish.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
if (PopupHost.CanCreatePopup())
|
if (PopupHost.CanCreatePopup())
|
||||||
|
@ -527,7 +545,7 @@ namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var finish = new MenuItem();
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.Flow");
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
finish.Click += (o, e) =>
|
finish.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
if (PopupHost.CanCreatePopup())
|
if (PopupHost.CanCreatePopup())
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
using System.Threading.Tasks;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace SourceGit.ViewModels
|
namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
public class LFSFetch : Popup
|
public class LFSFetch : Popup
|
||||||
{
|
{
|
||||||
|
public List<Models.Remote> Remotes => _repo.Remotes;
|
||||||
|
|
||||||
|
public Models.Remote SelectedRemote
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
public LFSFetch(Repository repo)
|
public LFSFetch(Repository repo)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
SelectedRemote = _repo.Remotes[0];
|
||||||
View = new Views.LFSFetch() { DataContext = this };
|
View = new Views.LFSFetch() { DataContext = this };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +26,7 @@ namespace SourceGit.ViewModels
|
||||||
ProgressDescription = $"Fetching LFS objects from remote ...";
|
ProgressDescription = $"Fetching LFS objects from remote ...";
|
||||||
return Task.Run(() =>
|
return Task.Run(() =>
|
||||||
{
|
{
|
||||||
new Commands.LFS(_repo.FullPath).Fetch(SetProgressDescription);
|
new Commands.LFS(_repo.FullPath).Fetch(SelectedRemote.Name, SetProgressDescription);
|
||||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
|
@ -27,14 +27,15 @@ namespace SourceGit.ViewModels
|
||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LFSLocks(string repo)
|
public LFSLocks(string repo, string remote)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
_remote = remote;
|
||||||
Locks = new AvaloniaList<Models.LFSLock>();
|
Locks = new AvaloniaList<Models.LFSLock>();
|
||||||
|
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
var collect = new Commands.LFS(_repo).Locks();
|
var collect = new Commands.LFS(_repo).Locks(_remote);
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
{
|
{
|
||||||
if (collect.Count > 0)
|
if (collect.Count > 0)
|
||||||
|
@ -54,7 +55,7 @@ namespace SourceGit.ViewModels
|
||||||
IsLoading = true;
|
IsLoading = true;
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
var succ = new Commands.LFS(_repo).Unlock(lfsLock.ID, force);
|
var succ = new Commands.LFS(_repo).Unlock(_remote, lfsLock.ID, force);
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
{
|
{
|
||||||
if (succ)
|
if (succ)
|
||||||
|
@ -67,6 +68,7 @@ namespace SourceGit.ViewModels
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _repo = string.Empty;
|
private string _repo = string.Empty;
|
||||||
|
private string _remote = string.Empty;
|
||||||
private bool _isLoading = true;
|
private bool _isLoading = true;
|
||||||
private bool _isEmpty = false;
|
private bool _isEmpty = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
using System.Threading.Tasks;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace SourceGit.ViewModels
|
namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
public class LFSPull : Popup
|
public class LFSPull : Popup
|
||||||
{
|
{
|
||||||
|
public List<Models.Remote> Remotes => _repo.Remotes;
|
||||||
|
|
||||||
|
public Models.Remote SelectedRemote
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
public LFSPull(Repository repo)
|
public LFSPull(Repository repo)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
SelectedRemote = _repo.Remotes[0];
|
||||||
View = new Views.LFSPull() { DataContext = this };
|
View = new Views.LFSPull() { DataContext = this };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +26,7 @@ namespace SourceGit.ViewModels
|
||||||
ProgressDescription = $"Pull LFS objects from remote ...";
|
ProgressDescription = $"Pull LFS objects from remote ...";
|
||||||
return Task.Run(() =>
|
return Task.Run(() =>
|
||||||
{
|
{
|
||||||
new Commands.LFS(_repo.FullPath).Pull(SetProgressDescription);
|
new Commands.LFS(_repo.FullPath).Pull(SelectedRemote.Name, SetProgressDescription);
|
||||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
37
src/ViewModels/LFSPush.cs
Normal file
37
src/ViewModels/LFSPush.cs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SourceGit.ViewModels
|
||||||
|
{
|
||||||
|
public class LFSPush : Popup
|
||||||
|
{
|
||||||
|
public List<Models.Remote> Remotes => _repo.Remotes;
|
||||||
|
|
||||||
|
public Models.Remote SelectedRemote
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LFSPush(Repository repo)
|
||||||
|
{
|
||||||
|
_repo = repo;
|
||||||
|
SelectedRemote = _repo.Remotes[0];
|
||||||
|
View = new Views.LFSPush() { DataContext = this };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> Sure()
|
||||||
|
{
|
||||||
|
_repo.SetWatcherEnabled(false);
|
||||||
|
ProgressDescription = $"Push LFS objects to remote ...";
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
new Commands.LFS(_repo.FullPath).Push(SelectedRemote.Name, SetProgressDescription);
|
||||||
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly Repository _repo = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,9 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
using Avalonia.Collections;
|
using Avalonia.Collections;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Input;
|
||||||
|
using Avalonia.Media;
|
||||||
|
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
|
||||||
|
@ -21,10 +24,7 @@ namespace SourceGit.ViewModels
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (SetProperty(ref _activePage, value))
|
if (SetProperty(ref _activePage, value))
|
||||||
{
|
|
||||||
PopupHost.Active = value;
|
PopupHost.Active = value;
|
||||||
UpdateTabSplitterVisible();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||||
var root = new Commands.QueryRepositoryRootPath(path).Result();
|
var root = new Commands.QueryRepositoryRootPath(path).Result();
|
||||||
if (string.IsNullOrEmpty(root))
|
if (string.IsNullOrEmpty(root))
|
||||||
{
|
{
|
||||||
Pages[0].Notifications.Add(new Models.Notification
|
Pages[0].Notifications.Add(new Notification
|
||||||
{
|
{
|
||||||
IsError = true,
|
IsError = true,
|
||||||
Message = $"Given path: '{path}' is NOT a valid repository!"
|
Message = $"Given path: '{path}' is NOT a valid repository!"
|
||||||
|
@ -66,11 +66,9 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
var lastActiveIdx = Preference.Instance.LastActiveTabIdx;
|
var lastActiveIdx = Preference.Instance.LastActiveTabIdx;
|
||||||
if (lastActiveIdx >= 0 && lastActiveIdx < Pages.Count)
|
if (lastActiveIdx >= 0 && lastActiveIdx < Pages.Count)
|
||||||
{
|
|
||||||
ActivePage = Pages[lastActiveIdx];
|
ActivePage = Pages[lastActiveIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void Quit()
|
public void Quit()
|
||||||
{
|
{
|
||||||
|
@ -124,7 +122,7 @@ namespace SourceGit.ViewModels
|
||||||
ActivePage = Pages[prevIdx];
|
ActivePage = Pages[prevIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CloseTab(object param)
|
public void CloseTab(LauncherPage page)
|
||||||
{
|
{
|
||||||
if (Pages.Count == 1)
|
if (Pages.Count == 1)
|
||||||
{
|
{
|
||||||
|
@ -148,7 +146,6 @@ namespace SourceGit.ViewModels
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LauncherPage page = param as LauncherPage;
|
|
||||||
if (page == null)
|
if (page == null)
|
||||||
page = _activePage;
|
page = _activePage;
|
||||||
|
|
||||||
|
@ -159,13 +156,11 @@ namespace SourceGit.ViewModels
|
||||||
ActivePage = Pages[removeIdx == Pages.Count - 1 ? removeIdx - 1 : removeIdx + 1];
|
ActivePage = Pages[removeIdx == Pages.Count - 1 ? removeIdx - 1 : removeIdx + 1];
|
||||||
CloseRepositoryInTab(page);
|
CloseRepositoryInTab(page);
|
||||||
Pages.RemoveAt(removeIdx);
|
Pages.RemoveAt(removeIdx);
|
||||||
UpdateTabSplitterVisible();
|
|
||||||
}
|
}
|
||||||
else if (removeIdx + 1 == activeIdx)
|
else if (removeIdx + 1 == activeIdx)
|
||||||
{
|
{
|
||||||
CloseRepositoryInTab(page);
|
CloseRepositoryInTab(page);
|
||||||
Pages.RemoveAt(removeIdx);
|
Pages.RemoveAt(removeIdx);
|
||||||
UpdateTabSplitterVisible();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -250,6 +245,108 @@ namespace SourceGit.ViewModels
|
||||||
ActivePage = page;
|
ActivePage = page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DispatchNotification(string pageId, string message, bool isError)
|
||||||
|
{
|
||||||
|
var notification = new Notification() {
|
||||||
|
IsError = isError,
|
||||||
|
Message = message,
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var page in Pages)
|
||||||
|
{
|
||||||
|
var id = page.Node.Id.Replace("\\", "/");
|
||||||
|
if (id == pageId)
|
||||||
|
{
|
||||||
|
page.Notifications.Add(notification);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_activePage != null)
|
||||||
|
_activePage.Notifications.Add(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DismissNotification(Notification notice)
|
||||||
|
{
|
||||||
|
if (notice != null)
|
||||||
|
ActivePage?.Notifications.Remove(notice);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContextMenu CreateContextForPageTab(LauncherPage page)
|
||||||
|
{
|
||||||
|
if (page == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var menu = new ContextMenu();
|
||||||
|
var close = new MenuItem();
|
||||||
|
close.Header = App.Text("PageTabBar.Tab.Close");
|
||||||
|
close.InputGesture = KeyGesture.Parse(OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W");
|
||||||
|
close.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
CloseTab(page);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(close);
|
||||||
|
|
||||||
|
var closeOthers = new MenuItem();
|
||||||
|
closeOthers.Header = App.Text("PageTabBar.Tab.CloseOther");
|
||||||
|
closeOthers.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
CloseOtherTabs();
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(closeOthers);
|
||||||
|
|
||||||
|
var closeRight = new MenuItem();
|
||||||
|
closeRight.Header = App.Text("PageTabBar.Tab.CloseRight");
|
||||||
|
closeRight.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
CloseRightTabs();
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(closeRight);
|
||||||
|
|
||||||
|
if (page.Node.IsRepository)
|
||||||
|
{
|
||||||
|
var bookmark = new MenuItem();
|
||||||
|
bookmark.Header = App.Text("PageTabBar.Tab.Bookmark");
|
||||||
|
bookmark.Icon = App.CreateMenuIcon("Icons.Bookmark");
|
||||||
|
|
||||||
|
for (int i = 0; i < Models.Bookmarks.Supported.Count; i++)
|
||||||
|
{
|
||||||
|
var icon = App.CreateMenuIcon("Icons.Bookmark");
|
||||||
|
icon.Fill = Models.Bookmarks.Brushes[i];
|
||||||
|
icon.Stroke = App.Current.FindResource("Brush.FG1") as Brush;
|
||||||
|
icon.StrokeThickness = i == 0 ? 1.0 : 0;
|
||||||
|
|
||||||
|
var dupIdx = i;
|
||||||
|
var setter = new MenuItem();
|
||||||
|
setter.Header = icon;
|
||||||
|
setter.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
page.Node.Bookmark = dupIdx;
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
bookmark.Items.Add(setter);
|
||||||
|
}
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
menu.Items.Add(bookmark);
|
||||||
|
|
||||||
|
var copyPath = new MenuItem();
|
||||||
|
copyPath.Header = App.Text("PageTabBar.Tab.CopyPath");
|
||||||
|
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||||
|
copyPath.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
page.CopyPath();
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
menu.Items.Add(copyPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
private void CloseRepositoryInTab(LauncherPage page)
|
private void CloseRepositoryInTab(LauncherPage page)
|
||||||
{
|
{
|
||||||
if (page.Data is Repository repo)
|
if (page.Data is Repository repo)
|
||||||
|
@ -261,13 +358,6 @@ namespace SourceGit.ViewModels
|
||||||
page.Data = null;
|
page.Data = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTabSplitterVisible()
|
|
||||||
{
|
|
||||||
var activePageIdx = ActivePage == null ? -1 : Pages.IndexOf(ActivePage);
|
|
||||||
for (int i = 0; i < Pages.Count; i++)
|
|
||||||
Pages[i].IsTabSplitterVisible = (activePageIdx != i && activePageIdx != i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LauncherPage _activePage = null;
|
private LauncherPage _activePage = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,17 +18,11 @@ namespace SourceGit.ViewModels
|
||||||
set => SetProperty(ref _data, value);
|
set => SetProperty(ref _data, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsTabSplitterVisible
|
public AvaloniaList<Notification> Notifications
|
||||||
{
|
|
||||||
get => _isTabSplitterVisible;
|
|
||||||
set => SetProperty(ref _isTabSplitterVisible, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public AvaloniaList<Models.Notification> Notifications
|
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
set;
|
set;
|
||||||
} = new AvaloniaList<Models.Notification>();
|
} = new AvaloniaList<Notification>();
|
||||||
|
|
||||||
public LauncherPage()
|
public LauncherPage()
|
||||||
{
|
{
|
||||||
|
@ -53,14 +47,7 @@ namespace SourceGit.ViewModels
|
||||||
App.CopyText(_node.Id);
|
App.CopyText(_node.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DismissNotification(object param)
|
|
||||||
{
|
|
||||||
if (param is Models.Notification notice)
|
|
||||||
Notifications.Remove(notice);
|
|
||||||
}
|
|
||||||
|
|
||||||
private RepositoryNode _node = null;
|
private RepositoryNode _node = null;
|
||||||
private object _data = null;
|
private object _data = null;
|
||||||
private bool _isTabSplitterVisible = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
namespace SourceGit.Models
|
namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
public class Notification
|
public class Notification
|
||||||
{
|
{
|
||||||
public bool IsError { get; set; } = false;
|
public bool IsError { get; set; } = false;
|
||||||
public string Message { get; set; } = string.Empty;
|
public string Message { get; set; } = string.Empty;
|
||||||
}
|
|
||||||
|
|
||||||
public interface INotificationReceiver
|
public void CopyMessage()
|
||||||
{
|
{
|
||||||
void OnReceiveNotification(string ctx, Notification notice);
|
App.CopyText(Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -194,6 +194,12 @@ namespace SourceGit.ViewModels
|
||||||
set => SetProperty(ref _showHiddenSymbolsInDiffView, value);
|
set => SetProperty(ref _showHiddenSymbolsInDiffView, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int DiffViewVisualLineNumbers
|
||||||
|
{
|
||||||
|
get => _diffViewVisualLineNumbers;
|
||||||
|
set => SetProperty(ref _diffViewVisualLineNumbers, value);
|
||||||
|
}
|
||||||
|
|
||||||
public Models.ChangeViewMode UnstagedChangeViewMode
|
public Models.ChangeViewMode UnstagedChangeViewMode
|
||||||
{
|
{
|
||||||
get => _unstagedChangeViewMode;
|
get => _unstagedChangeViewMode;
|
||||||
|
@ -550,6 +556,7 @@ namespace SourceGit.ViewModels
|
||||||
private bool _useSyntaxHighlighting = false;
|
private bool _useSyntaxHighlighting = false;
|
||||||
private bool _enableDiffViewWordWrap = false;
|
private bool _enableDiffViewWordWrap = false;
|
||||||
private bool _showHiddenSymbolsInDiffView = false;
|
private bool _showHiddenSymbolsInDiffView = false;
|
||||||
|
private int _diffViewVisualLineNumbers = 4;
|
||||||
|
|
||||||
private Models.ChangeViewMode _unstagedChangeViewMode = Models.ChangeViewMode.List;
|
private Models.ChangeViewMode _unstagedChangeViewMode = Models.ChangeViewMode.List;
|
||||||
private Models.ChangeViewMode _stagedChangeViewMode = Models.ChangeViewMode.List;
|
private Models.ChangeViewMode _stagedChangeViewMode = Models.ChangeViewMode.List;
|
||||||
|
|
28
src/ViewModels/PruneWorktrees.cs
Normal file
28
src/ViewModels/PruneWorktrees.cs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SourceGit.ViewModels
|
||||||
|
{
|
||||||
|
public class PruneWorktrees : Popup
|
||||||
|
{
|
||||||
|
public PruneWorktrees(Repository repo)
|
||||||
|
{
|
||||||
|
_repo = repo;
|
||||||
|
View = new Views.PruneWorktrees() { DataContext = this };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> Sure()
|
||||||
|
{
|
||||||
|
_repo.SetWatcherEnabled(false);
|
||||||
|
ProgressDescription = "Prune worktrees ...";
|
||||||
|
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
new Commands.Worktree(_repo.FullPath).Prune(SetProgressDescription);
|
||||||
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Repository _repo = null;
|
||||||
|
}
|
||||||
|
}
|
41
src/ViewModels/RemoveWorktree.cs
Normal file
41
src/ViewModels/RemoveWorktree.cs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SourceGit.ViewModels
|
||||||
|
{
|
||||||
|
public class RemoveWorktree : Popup
|
||||||
|
{
|
||||||
|
public Models.Worktree Target
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
} = null;
|
||||||
|
|
||||||
|
public bool Force
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
} = false;
|
||||||
|
|
||||||
|
public RemoveWorktree(Repository repo, Models.Worktree target)
|
||||||
|
{
|
||||||
|
_repo = repo;
|
||||||
|
Target = target;
|
||||||
|
View = new Views.RemoveWorktree() { DataContext = this };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> Sure()
|
||||||
|
{
|
||||||
|
_repo.SetWatcherEnabled(false);
|
||||||
|
ProgressDescription = "Remove worktrees ...";
|
||||||
|
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
var succ = new Commands.Worktree(_repo.FullPath).Remove(Target.FullPath, Force, SetProgressDescription);
|
||||||
|
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||||
|
return succ;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Repository _repo = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -99,6 +99,7 @@ namespace SourceGit.ViewModels
|
||||||
var builder = BuildBranchTree(_branches, _remotes);
|
var builder = BuildBranchTree(_branches, _remotes);
|
||||||
LocalBranchTrees = builder.Locals;
|
LocalBranchTrees = builder.Locals;
|
||||||
RemoteBranchTrees = builder.Remotes;
|
RemoteBranchTrees = builder.Remotes;
|
||||||
|
VisibleTags = BuildVisibleTags();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,6 +132,13 @@ namespace SourceGit.ViewModels
|
||||||
private set => SetProperty(ref _remoteBranchTrees, value);
|
private set => SetProperty(ref _remoteBranchTrees, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public List<Models.Worktree> Worktrees
|
||||||
|
{
|
||||||
|
get => _worktrees;
|
||||||
|
private set => SetProperty(ref _worktrees, value);
|
||||||
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public List<Models.Tag> Tags
|
public List<Models.Tag> Tags
|
||||||
{
|
{
|
||||||
|
@ -138,6 +146,13 @@ namespace SourceGit.ViewModels
|
||||||
private set => SetProperty(ref _tags, value);
|
private set => SetProperty(ref _tags, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public List<Models.Tag> VisibleTags
|
||||||
|
{
|
||||||
|
get => _visibleTags;
|
||||||
|
private set => SetProperty(ref _visibleTags, value);
|
||||||
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public List<string> Submodules
|
public List<string> Submodules
|
||||||
{
|
{
|
||||||
|
@ -154,7 +169,7 @@ namespace SourceGit.ViewModels
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public int StashesCount
|
public int StashesCount
|
||||||
{
|
{
|
||||||
get => _stashesPage == null ? 0 : _stashesPage.Count;
|
get => _stashesPage == null ? 0 : _stashesPage.Stashes.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
|
@ -219,6 +234,13 @@ namespace SourceGit.ViewModels
|
||||||
set => SetProperty(ref _isSubmoduleGroupExpanded, value);
|
set => SetProperty(ref _isSubmoduleGroupExpanded, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public bool IsWorktreeGroupExpanded
|
||||||
|
{
|
||||||
|
get => _isWorktreeGroupExpanded;
|
||||||
|
set => SetProperty(ref _isWorktreeGroupExpanded, value);
|
||||||
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public InProgressContext InProgressContext
|
public InProgressContext InProgressContext
|
||||||
{
|
{
|
||||||
|
@ -281,6 +303,7 @@ namespace SourceGit.ViewModels
|
||||||
_localBranchTrees.Clear();
|
_localBranchTrees.Clear();
|
||||||
_remoteBranchTrees.Clear();
|
_remoteBranchTrees.Clear();
|
||||||
_tags.Clear();
|
_tags.Clear();
|
||||||
|
_visibleTags.Clear();
|
||||||
_submodules.Clear();
|
_submodules.Clear();
|
||||||
_searchedCommits.Clear();
|
_searchedCommits.Clear();
|
||||||
}
|
}
|
||||||
|
@ -295,6 +318,7 @@ namespace SourceGit.ViewModels
|
||||||
});
|
});
|
||||||
|
|
||||||
Task.Run(RefreshSubmodules);
|
Task.Run(RefreshSubmodules);
|
||||||
|
Task.Run(RefreshWorktrees);
|
||||||
Task.Run(RefreshWorkingCopyChanges);
|
Task.Run(RefreshWorkingCopyChanges);
|
||||||
Task.Run(RefreshStashes);
|
Task.Run(RefreshStashes);
|
||||||
}
|
}
|
||||||
|
@ -590,14 +614,35 @@ namespace SourceGit.ViewModels
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RefreshWorktrees()
|
||||||
|
{
|
||||||
|
var worktrees = new Commands.Worktree(_fullpath).List();
|
||||||
|
var cleaned = new List<Models.Worktree>();
|
||||||
|
|
||||||
|
foreach (var worktree in worktrees)
|
||||||
|
{
|
||||||
|
if (worktree.IsBare || worktree.FullPath.Equals(_fullpath))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cleaned.Add(worktree);
|
||||||
|
}
|
||||||
|
|
||||||
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
|
{
|
||||||
|
Worktrees = cleaned;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void RefreshTags()
|
public void RefreshTags()
|
||||||
{
|
{
|
||||||
var tags = new Commands.QueryTags(FullPath).Result();
|
var tags = new Commands.QueryTags(FullPath).Result();
|
||||||
foreach (var tag in tags)
|
foreach (var tag in tags)
|
||||||
tag.IsFiltered = Filters.Contains(tag.Name);
|
tag.IsFiltered = Filters.Contains(tag.Name);
|
||||||
|
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() =>
|
||||||
{
|
{
|
||||||
Tags = tags;
|
Tags = tags;
|
||||||
|
VisibleTags = BuildVisibleTags();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,10 +701,7 @@ namespace SourceGit.ViewModels
|
||||||
public void RefreshSubmodules()
|
public void RefreshSubmodules()
|
||||||
{
|
{
|
||||||
var submodules = new Commands.QuerySubmodules(FullPath).Result();
|
var submodules = new Commands.QuerySubmodules(FullPath).Result();
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() => Submodules = submodules);
|
||||||
{
|
|
||||||
Submodules = submodules;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RefreshWorkingCopyChanges()
|
public void RefreshWorkingCopyChanges()
|
||||||
|
@ -732,6 +774,16 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
public void CheckoutBranch(Models.Branch branch)
|
public void CheckoutBranch(Models.Branch branch)
|
||||||
{
|
{
|
||||||
|
if (branch.IsLocal)
|
||||||
|
{
|
||||||
|
var worktree = _worktrees.Find(x => x.Branch == branch.FullName);
|
||||||
|
if (worktree != null)
|
||||||
|
{
|
||||||
|
OpenWorktree(worktree);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!PopupHost.CanCreatePopup())
|
if (!PopupHost.CanCreatePopup())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -796,6 +848,57 @@ namespace SourceGit.ViewModels
|
||||||
PopupHost.ShowAndStartPopup(new UpdateSubmodules(this));
|
PopupHost.ShowAndStartPopup(new UpdateSubmodules(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OpenSubmodule(string submodule)
|
||||||
|
{
|
||||||
|
var root = Path.GetFullPath(Path.Combine(_fullpath, submodule));
|
||||||
|
var gitDir = new Commands.QueryGitDir(root).Result();
|
||||||
|
var repo = Preference.AddRepository(root, gitDir);
|
||||||
|
|
||||||
|
var node = new RepositoryNode()
|
||||||
|
{
|
||||||
|
Id = repo.FullPath,
|
||||||
|
Name = Path.GetFileName(repo.FullPath),
|
||||||
|
Bookmark = 0,
|
||||||
|
IsRepository = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
var launcher = App.GetTopLevel().DataContext as Launcher;
|
||||||
|
if (launcher != null)
|
||||||
|
{
|
||||||
|
launcher.OpenRepositoryInTab(node, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddWorktree()
|
||||||
|
{
|
||||||
|
if (PopupHost.CanCreatePopup())
|
||||||
|
PopupHost.ShowPopup(new AddWorktree(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PruneWorktrees()
|
||||||
|
{
|
||||||
|
if (PopupHost.CanCreatePopup())
|
||||||
|
PopupHost.ShowAndStartPopup(new PruneWorktrees(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenWorktree(Models.Worktree worktree)
|
||||||
|
{
|
||||||
|
var gitDir = new Commands.QueryGitDir(worktree.FullPath).Result();
|
||||||
|
var repo = Preference.AddRepository(worktree.FullPath, gitDir);
|
||||||
|
|
||||||
|
var node = new RepositoryNode()
|
||||||
|
{
|
||||||
|
Id = repo.FullPath,
|
||||||
|
Name = Path.GetFileName(repo.FullPath),
|
||||||
|
Bookmark = 0,
|
||||||
|
IsRepository = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
var launcher = App.GetTopLevel().DataContext as Launcher;
|
||||||
|
if (launcher != null)
|
||||||
|
launcher.OpenRepositoryInTab(node, null);
|
||||||
|
}
|
||||||
|
|
||||||
public ContextMenu CreateContextMenuForGitFlow()
|
public ContextMenu CreateContextMenuForGitFlow()
|
||||||
{
|
{
|
||||||
var menu = new ContextMenu();
|
var menu = new ContextMenu();
|
||||||
|
@ -911,6 +1014,24 @@ namespace SourceGit.ViewModels
|
||||||
};
|
};
|
||||||
menu.Items.Add(pull);
|
menu.Items.Add(pull);
|
||||||
|
|
||||||
|
var push = new MenuItem();
|
||||||
|
push.Header = App.Text("GitLFS.Push");
|
||||||
|
push.Icon = App.CreateMenuIcon("Icons.Push");
|
||||||
|
push.IsEnabled = Remotes.Count > 0;
|
||||||
|
push.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
if (PopupHost.CanCreatePopup())
|
||||||
|
{
|
||||||
|
if (Remotes.Count == 1)
|
||||||
|
PopupHost.ShowAndStartPopup(new LFSPush(this));
|
||||||
|
else
|
||||||
|
PopupHost.ShowPopup(new LFSPush(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(push);
|
||||||
|
|
||||||
var prune = new MenuItem();
|
var prune = new MenuItem();
|
||||||
prune.Header = App.Text("GitLFS.Prune");
|
prune.Header = App.Text("GitLFS.Prune");
|
||||||
prune.Icon = App.CreateMenuIcon("Icons.Clean");
|
prune.Icon = App.CreateMenuIcon("Icons.Clean");
|
||||||
|
@ -927,13 +1048,33 @@ namespace SourceGit.ViewModels
|
||||||
var locks = new MenuItem();
|
var locks = new MenuItem();
|
||||||
locks.Header = App.Text("GitLFS.Locks");
|
locks.Header = App.Text("GitLFS.Locks");
|
||||||
locks.Icon = App.CreateMenuIcon("Icons.Lock");
|
locks.Icon = App.CreateMenuIcon("Icons.Lock");
|
||||||
|
locks.IsEnabled = Remotes.Count > 0;
|
||||||
|
if (Remotes.Count == 1)
|
||||||
|
{
|
||||||
locks.Click += (o, e) =>
|
locks.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(_fullpath) };
|
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(_fullpath, Remotes[0].Name) };
|
||||||
dialog.Show(App.GetTopLevel() as Window);
|
dialog.Show(App.GetTopLevel() as Window);
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var remote in Remotes)
|
||||||
|
{
|
||||||
|
var remoteName = remote.Name;
|
||||||
|
var lockRemote = new MenuItem();
|
||||||
|
lockRemote.Header = remoteName;
|
||||||
|
lockRemote.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(_fullpath, remoteName) };
|
||||||
|
dialog.Show(App.GetTopLevel() as Window);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
locks.Items.Add(lockRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
menu.Items.Add(locks);
|
menu.Items.Add(locks);
|
||||||
}
|
}
|
||||||
|
@ -1117,7 +1258,7 @@ namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var finish = new MenuItem();
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.Flow");
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
finish.Click += (o, e) =>
|
finish.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
if (PopupHost.CanCreatePopup())
|
if (PopupHost.CanCreatePopup())
|
||||||
|
@ -1201,9 +1342,8 @@ namespace SourceGit.ViewModels
|
||||||
target.Click += (o, e) =>
|
target.Click += (o, e) =>
|
||||||
{
|
{
|
||||||
if (Commands.Branch.SetUpstream(_fullpath, branch.Name, upstream))
|
if (Commands.Branch.SetUpstream(_fullpath, branch.Name, upstream))
|
||||||
{
|
|
||||||
Task.Run(RefreshBranches);
|
Task.Run(RefreshBranches);
|
||||||
}
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1215,9 +1355,8 @@ namespace SourceGit.ViewModels
|
||||||
unsetUpstream.Click += (_, e) =>
|
unsetUpstream.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
if (Commands.Branch.SetUpstream(_fullpath, branch.Name, string.Empty))
|
if (Commands.Branch.SetUpstream(_fullpath, branch.Name, string.Empty))
|
||||||
{
|
|
||||||
Task.Run(RefreshBranches);
|
Task.Run(RefreshBranches);
|
||||||
}
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
tracking.Items.Add(new MenuItem() { Header = "-" });
|
tracking.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
@ -1538,27 +1677,6 @@ namespace SourceGit.ViewModels
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenSubmodule(string submodule)
|
|
||||||
{
|
|
||||||
var root = Path.GetFullPath(Path.Combine(_fullpath, submodule));
|
|
||||||
var gitDir = new Commands.QueryGitDir(root).Result();
|
|
||||||
var repo = Preference.AddRepository(root, gitDir);
|
|
||||||
|
|
||||||
var node = new RepositoryNode()
|
|
||||||
{
|
|
||||||
Id = repo.FullPath,
|
|
||||||
Name = Path.GetFileName(repo.FullPath),
|
|
||||||
Bookmark = 0,
|
|
||||||
IsRepository = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
var launcher = App.GetTopLevel().DataContext as Launcher;
|
|
||||||
if (launcher != null)
|
|
||||||
{
|
|
||||||
launcher.OpenRepositoryInTab(node, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContextMenu CreateContextMenuForSubmodule(string submodule)
|
public ContextMenu CreateContextMenuForSubmodule(string submodule)
|
||||||
{
|
{
|
||||||
var open = new MenuItem();
|
var open = new MenuItem();
|
||||||
|
@ -1596,6 +1714,68 @@ namespace SourceGit.ViewModels
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ContextMenu CreateContextMenuForWorktree(Models.Worktree worktree)
|
||||||
|
{
|
||||||
|
var menu = new ContextMenu();
|
||||||
|
|
||||||
|
if (worktree.IsLocked)
|
||||||
|
{
|
||||||
|
var unlock = new MenuItem();
|
||||||
|
unlock.Header = App.Text("Worktree.Unlock");
|
||||||
|
unlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
||||||
|
unlock.Click += (o, ev) =>
|
||||||
|
{
|
||||||
|
SetWatcherEnabled(false);
|
||||||
|
var succ = new Commands.Worktree(_fullpath).Unlock(worktree.FullPath);
|
||||||
|
if (succ)
|
||||||
|
worktree.IsLocked = false;
|
||||||
|
SetWatcherEnabled(true);
|
||||||
|
ev.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(unlock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var loc = new MenuItem();
|
||||||
|
loc.Header = App.Text("Worktree.Lock");
|
||||||
|
loc.Icon = App.CreateMenuIcon("Icons.Lock");
|
||||||
|
loc.Click += (o, ev) =>
|
||||||
|
{
|
||||||
|
SetWatcherEnabled(false);
|
||||||
|
var succ = new Commands.Worktree(_fullpath).Lock(worktree.FullPath);
|
||||||
|
if (succ)
|
||||||
|
worktree.IsLocked = true;
|
||||||
|
SetWatcherEnabled(true);
|
||||||
|
ev.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
var remove = new MenuItem();
|
||||||
|
remove.Header = App.Text("Worktree.Remove");
|
||||||
|
remove.Icon = App.CreateMenuIcon("Icons.Clear");
|
||||||
|
remove.Click += (o, ev) =>
|
||||||
|
{
|
||||||
|
if (PopupHost.CanCreatePopup())
|
||||||
|
PopupHost.ShowPopup(new RemoveWorktree(this, worktree));
|
||||||
|
ev.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(remove);
|
||||||
|
|
||||||
|
var copy = new MenuItem();
|
||||||
|
copy.Header = App.Text("Worktree.CopyPath");
|
||||||
|
copy.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||||
|
copy.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
App.CopyText(worktree.FullPath);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
menu.Items.Add(copy);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
private MenuItem CreateMenuItemToCompareBranches(Models.Branch branch)
|
private MenuItem CreateMenuItemToCompareBranches(Models.Branch branch)
|
||||||
{
|
{
|
||||||
if (Branches.Count == 1)
|
if (Branches.Count == 1)
|
||||||
|
@ -1657,6 +1837,25 @@ namespace SourceGit.ViewModels
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Models.Tag> BuildVisibleTags()
|
||||||
|
{
|
||||||
|
var visible = new List<Models.Tag>();
|
||||||
|
if (string.IsNullOrEmpty(_searchBranchFilter))
|
||||||
|
{
|
||||||
|
visible.AddRange(_tags);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var t in _tags)
|
||||||
|
{
|
||||||
|
if (t.Name.Contains(_searchBranchFilter, StringComparison.OrdinalIgnoreCase))
|
||||||
|
visible.Add(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
private string _fullpath = string.Empty;
|
private string _fullpath = string.Empty;
|
||||||
private string _gitDir = string.Empty;
|
private string _gitDir = string.Empty;
|
||||||
|
|
||||||
|
@ -1674,6 +1873,7 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
private bool _isTagGroupExpanded = false;
|
private bool _isTagGroupExpanded = false;
|
||||||
private bool _isSubmoduleGroupExpanded = false;
|
private bool _isSubmoduleGroupExpanded = false;
|
||||||
|
private bool _isWorktreeGroupExpanded = false;
|
||||||
|
|
||||||
private string _searchBranchFilter = string.Empty;
|
private string _searchBranchFilter = string.Empty;
|
||||||
|
|
||||||
|
@ -1681,7 +1881,9 @@ namespace SourceGit.ViewModels
|
||||||
private List<Models.Branch> _branches = new List<Models.Branch>();
|
private List<Models.Branch> _branches = new List<Models.Branch>();
|
||||||
private List<BranchTreeNode> _localBranchTrees = new List<BranchTreeNode>();
|
private List<BranchTreeNode> _localBranchTrees = new List<BranchTreeNode>();
|
||||||
private List<BranchTreeNode> _remoteBranchTrees = new List<BranchTreeNode>();
|
private List<BranchTreeNode> _remoteBranchTrees = new List<BranchTreeNode>();
|
||||||
|
private List<Models.Worktree> _worktrees = new List<Models.Worktree>();
|
||||||
private List<Models.Tag> _tags = new List<Models.Tag>();
|
private List<Models.Tag> _tags = new List<Models.Tag>();
|
||||||
|
private List<Models.Tag> _visibleTags = new List<Models.Tag>();
|
||||||
private List<string> _submodules = new List<string>();
|
private List<string> _submodules = new List<string>();
|
||||||
private bool _includeUntracked = true;
|
private bool _includeUntracked = true;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace SourceGit.ViewModels
|
||||||
public Squash(Repository repo, Models.Commit head, Models.Commit parent)
|
public Squash(Repository repo, Models.Commit head, Models.Commit parent)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
_message = new Commands.QueryCommitFullMessage(_repo.FullPath, parent.SHA).Result();
|
_message = new Commands.QueryCommitFullMessage(_repo.FullPath, head.SHA).Result();
|
||||||
|
|
||||||
Head = head;
|
Head = head;
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
@ -10,21 +11,34 @@ namespace SourceGit.ViewModels
|
||||||
{
|
{
|
||||||
public class StashesPage : ObservableObject
|
public class StashesPage : ObservableObject
|
||||||
{
|
{
|
||||||
public int Count
|
|
||||||
{
|
|
||||||
get => _stashes == null ? 0 : _stashes.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Models.Stash> Stashes
|
public List<Models.Stash> Stashes
|
||||||
{
|
{
|
||||||
get => _stashes;
|
get => _stashes;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (SetProperty(ref _stashes, value))
|
if (SetProperty(ref _stashes, value))
|
||||||
|
RefreshVisible();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Models.Stash> VisibleStashes
|
||||||
{
|
{
|
||||||
|
get => _visibleStashes;
|
||||||
|
private set
|
||||||
|
{
|
||||||
|
if (SetProperty(ref _visibleStashes, value))
|
||||||
SelectedStash = null;
|
SelectedStash = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string SearchFilter
|
||||||
|
{
|
||||||
|
get => _searchFilter;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (SetProperty(ref _searchFilter, value))
|
||||||
|
RefreshVisible();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Models.Stash SelectedStash
|
public Models.Stash SelectedStash
|
||||||
|
@ -43,10 +57,7 @@ namespace SourceGit.ViewModels
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
var changes = new Commands.QueryStashChanges(_repo.FullPath, value.SHA).Result();
|
var changes = new Commands.QueryStashChanges(_repo.FullPath, value.SHA).Result();
|
||||||
Dispatcher.UIThread.Invoke(() =>
|
Dispatcher.UIThread.Invoke(() => Changes = changes);
|
||||||
{
|
|
||||||
Changes = changes;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,11 +70,9 @@ namespace SourceGit.ViewModels
|
||||||
private set
|
private set
|
||||||
{
|
{
|
||||||
if (SetProperty(ref _changes, value))
|
if (SetProperty(ref _changes, value))
|
||||||
{
|
|
||||||
SelectedChange = null;
|
SelectedChange = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public Models.Change SelectedChange
|
public Models.Change SelectedChange
|
||||||
{
|
{
|
||||||
|
@ -73,16 +82,12 @@ namespace SourceGit.ViewModels
|
||||||
if (SetProperty(ref _selectedChange, value))
|
if (SetProperty(ref _selectedChange, value))
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
{
|
|
||||||
DiffContext = null;
|
DiffContext = null;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption($"{_selectedStash.SHA}^", _selectedStash.SHA, value), _diffContext);
|
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption($"{_selectedStash.SHA}^", _selectedStash.SHA, value), _diffContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public DiffContext DiffContext
|
public DiffContext DiffContext
|
||||||
{
|
{
|
||||||
|
@ -148,13 +153,37 @@ namespace SourceGit.ViewModels
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
if (PopupHost.CanCreatePopup())
|
if (PopupHost.CanCreatePopup())
|
||||||
{
|
|
||||||
PopupHost.ShowPopup(new ClearStashes(_repo));
|
PopupHost.ShowPopup(new ClearStashes(_repo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ClearSearchFilter()
|
||||||
|
{
|
||||||
|
SearchFilter = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshVisible()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_searchFilter))
|
||||||
|
{
|
||||||
|
VisibleStashes = _stashes;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var visible = new List<Models.Stash>();
|
||||||
|
foreach (var s in _stashes)
|
||||||
|
{
|
||||||
|
if (s.Message.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
|
||||||
|
visible.Add(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
VisibleStashes = visible;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Repository _repo = null;
|
private Repository _repo = null;
|
||||||
private List<Models.Stash> _stashes = null;
|
private List<Models.Stash> _stashes = new List<Models.Stash>();
|
||||||
|
private List<Models.Stash> _visibleStashes = new List<Models.Stash>();
|
||||||
|
private string _searchFilter = string.Empty;
|
||||||
private Models.Stash _selectedStash = null;
|
private Models.Stash _selectedStash = null;
|
||||||
private List<Models.Change> _changes = null;
|
private List<Models.Change> _changes = null;
|
||||||
private Models.Change _selectedChange = null;
|
private Models.Change _selectedChange = null;
|
||||||
|
|
|
@ -643,27 +643,71 @@ namespace SourceGit.ViewModels
|
||||||
var lfsLock = new MenuItem();
|
var lfsLock = new MenuItem();
|
||||||
lfsLock.Header = App.Text("GitLFS.Locks.Lock");
|
lfsLock.Header = App.Text("GitLFS.Locks.Lock");
|
||||||
lfsLock.Icon = App.CreateMenuIcon("Icons.Lock");
|
lfsLock.Icon = App.CreateMenuIcon("Icons.Lock");
|
||||||
lfsLock.Click += async (_, e) =>
|
lfsLock.IsEnabled = _repo.Remotes.Count > 0;
|
||||||
|
if (_repo.Remotes.Count == 1)
|
||||||
{
|
{
|
||||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(change.Path));
|
lfsLock.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path));
|
||||||
if (succ)
|
if (succ)
|
||||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var remote in _repo.Remotes)
|
||||||
|
{
|
||||||
|
var remoteName = remote.Name;
|
||||||
|
var lockRemote = new MenuItem();
|
||||||
|
lockRemote.Header = remoteName;
|
||||||
|
lockRemote.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path));
|
||||||
|
if (succ)
|
||||||
|
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
lfsLock.Items.Add(lockRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
lfs.Items.Add(lfsLock);
|
lfs.Items.Add(lfsLock);
|
||||||
|
|
||||||
var lfsUnlock = new MenuItem();
|
var lfsUnlock = new MenuItem();
|
||||||
lfsUnlock.Header = App.Text("GitLFS.Locks.Unlock");
|
lfsUnlock.Header = App.Text("GitLFS.Locks.Unlock");
|
||||||
lfsUnlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
lfsUnlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
||||||
lfsUnlock.Click += async (_, e) =>
|
lfsUnlock.IsEnabled = _repo.Remotes.Count > 0;
|
||||||
|
if (_repo.Remotes.Count == 1)
|
||||||
{
|
{
|
||||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(change.Path, false));
|
lfsUnlock.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false));
|
||||||
if (succ)
|
if (succ)
|
||||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var remote in _repo.Remotes)
|
||||||
|
{
|
||||||
|
var remoteName = remote.Name;
|
||||||
|
var unlockRemote = new MenuItem();
|
||||||
|
unlockRemote.Header = remoteName;
|
||||||
|
unlockRemote.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false));
|
||||||
|
if (succ)
|
||||||
|
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
lfsUnlock.Items.Add(unlockRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
lfs.Items.Add(lfsUnlock);
|
lfs.Items.Add(lfsUnlock);
|
||||||
|
|
||||||
menu.Items.Add(lfs);
|
menu.Items.Add(lfs);
|
||||||
|
@ -926,28 +970,71 @@ namespace SourceGit.ViewModels
|
||||||
var lfsLock = new MenuItem();
|
var lfsLock = new MenuItem();
|
||||||
lfsLock.Header = App.Text("GitLFS.Locks.Lock");
|
lfsLock.Header = App.Text("GitLFS.Locks.Lock");
|
||||||
lfsLock.Icon = App.CreateMenuIcon("Icons.Lock");
|
lfsLock.Icon = App.CreateMenuIcon("Icons.Lock");
|
||||||
lfsLock.Click += async (_, e) =>
|
lfsLock.IsEnabled = _repo.Remotes.Count > 0;
|
||||||
|
if (_repo.Remotes.Count == 1)
|
||||||
{
|
{
|
||||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(change.Path));
|
lfsLock.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path));
|
||||||
if (succ)
|
if (succ)
|
||||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
lfs.Items.Add(new MenuItem() { Header = "-" });
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var remote in _repo.Remotes)
|
||||||
|
{
|
||||||
|
var remoteName = remote.Name;
|
||||||
|
var lockRemote = new MenuItem();
|
||||||
|
lockRemote.Header = remoteName;
|
||||||
|
lockRemote.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path));
|
||||||
|
if (succ)
|
||||||
|
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
lfsLock.Items.Add(lockRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
lfs.Items.Add(lfsLock);
|
lfs.Items.Add(lfsLock);
|
||||||
|
|
||||||
var lfsUnlock = new MenuItem();
|
var lfsUnlock = new MenuItem();
|
||||||
lfsUnlock.Header = App.Text("GitLFS.Locks.Unlock");
|
lfsUnlock.Header = App.Text("GitLFS.Locks.Unlock");
|
||||||
lfsUnlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
lfsUnlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
||||||
lfsUnlock.Click += async (_, e) =>
|
lfsUnlock.IsEnabled = _repo.Remotes.Count > 0;
|
||||||
|
if (_repo.Remotes.Count == 1)
|
||||||
{
|
{
|
||||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(change.Path, false));
|
lfsUnlock.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false));
|
||||||
if (succ)
|
if (succ)
|
||||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var remote in _repo.Remotes)
|
||||||
|
{
|
||||||
|
var remoteName = remote.Name;
|
||||||
|
var unlockRemote = new MenuItem();
|
||||||
|
unlockRemote.Header = remoteName;
|
||||||
|
unlockRemote.Click += async (o, e) =>
|
||||||
|
{
|
||||||
|
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false));
|
||||||
|
if (succ)
|
||||||
|
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
lfsUnlock.Items.Add(unlockRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
lfs.Items.Add(lfsUnlock);
|
lfs.Items.Add(lfsUnlock);
|
||||||
|
|
||||||
menu.Items.Add(lfs);
|
menu.Items.Add(lfs);
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Remote.AddTitle}"/>
|
Text="{DynamicResource Text.Remote.AddTitle}"/>
|
||||||
|
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,Auto" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,Auto" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Submodule.Add}"/>
|
Text="{DynamicResource Text.Submodule.Add}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
103
src/Views/AddWorktree.axaml
Normal file
103
src/Views/AddWorktree.axaml
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:m="using:SourceGit.Models"
|
||||||
|
xmlns:v="using:SourceGit.Views"
|
||||||
|
xmlns:c="using:SourceGit.Converters"
|
||||||
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="SourceGit.Views.AddWorktree"
|
||||||
|
x:DataType="vm:AddWorktree">
|
||||||
|
<StackPanel Orientation="Vertical" Margin="8,0">
|
||||||
|
<TextBlock FontSize="18"
|
||||||
|
Classes="bold"
|
||||||
|
Text="{DynamicResource Text.AddWorktree}"/>
|
||||||
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32,Auto,32" ColumnDefinitions="150,*">
|
||||||
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.AddWorktree.Location}"/>
|
||||||
|
<TextBox Grid.Row="0" Grid.Column="1"
|
||||||
|
x:Name="TxtLocation"
|
||||||
|
Height="28"
|
||||||
|
CornerRadius="3"
|
||||||
|
Text="{Binding Path, Mode=TwoWay}"
|
||||||
|
Watermark="{DynamicResource Text.AddWorktree.Location.Placeholder}">
|
||||||
|
<TextBox.InnerRightContent>
|
||||||
|
<Button Classes="icon_button" Width="28" Height="28" Margin="4,0,0,0" Click="SelectLocation">
|
||||||
|
<Path Data="{StaticResource Icons.Folder.Open}" Fill="{DynamicResource Brush.FG1}"/>
|
||||||
|
</Button>
|
||||||
|
</TextBox.InnerRightContent>
|
||||||
|
</TextBox>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.AddWorktree.WhatToCheckout}"/>
|
||||||
|
<StackPanel Grid.Row="1" Grid.Column="1" Height="32" Orientation="Horizontal">
|
||||||
|
<RadioButton Content="{DynamicResource Text.AddWorktree.WhatToCheckout.CreateNew}"
|
||||||
|
GroupName="WhatToCheckout"
|
||||||
|
IsChecked="{Binding CreateNewBranch, Mode=TwoWay}"/>
|
||||||
|
<RadioButton Content="{DynamicResource Text.AddWorktree.WhatToCheckout.Existing}"
|
||||||
|
GroupName="WhatToCheckout"
|
||||||
|
Margin="8,0,0,0"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="2" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.AddWorktree.Name}"/>
|
||||||
|
<TextBox Grid.Row="2" Grid.Column="1"
|
||||||
|
Height="28"
|
||||||
|
CornerRadius="3"
|
||||||
|
Text="{Binding SelectedBranch, Mode=TwoWay}"
|
||||||
|
Watermark="{DynamicResource Text.AddWorktree.Name.Placeholder}"
|
||||||
|
IsEnabled="{Binding CreateNewBranch, Mode=OneWay}"
|
||||||
|
IsVisible="{Binding CreateNewBranch, Mode=OneWay}"/>
|
||||||
|
<ComboBox Grid.Row="2" Grid.Column="1"
|
||||||
|
Height="28" Padding="8,0"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding LocalBranches}"
|
||||||
|
SelectedItem="{Binding SelectedBranch, Mode=TwoWay}"
|
||||||
|
IsEnabled="{Binding !CreateNewBranch, Mode=OneWay}"
|
||||||
|
IsVisible="{Binding !CreateNewBranch, Mode=OneWay}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
|
||||||
|
<Path Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Branch}"/>
|
||||||
|
<TextBlock Text="{Binding}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<Border Grid.Row="3" Grid.Column="0"
|
||||||
|
Height="32"
|
||||||
|
IsVisible="{Binding SetTrackingBranch, Mode=OneWay}">
|
||||||
|
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.AddWorktree.Tracking}"/>
|
||||||
|
</Border>
|
||||||
|
<ComboBox Grid.Row="3" Grid.Column="1"
|
||||||
|
Height="28" Padding="8,0"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding RemoteBranches}"
|
||||||
|
SelectedItem="{Binding SelectedTrackingBranch, Mode=TwoWay}"
|
||||||
|
IsVisible="{Binding SetTrackingBranch, Mode=OneWay}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
|
||||||
|
<Path Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Branch}"/>
|
||||||
|
<TextBlock Text="{Binding}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<CheckBox Grid.Row="4" Grid.Column="1"
|
||||||
|
Content="{DynamicResource Text.AddWorktree.Tracking.Toggle}"
|
||||||
|
IsChecked="{Binding SetTrackingBranch, Mode=TwoWay}"/>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
28
src/Views/AddWorktree.axaml.cs
Normal file
28
src/Views/AddWorktree.axaml.cs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Platform.Storage;
|
||||||
|
|
||||||
|
namespace SourceGit.Views
|
||||||
|
{
|
||||||
|
public partial class AddWorktree : UserControl
|
||||||
|
{
|
||||||
|
public AddWorktree()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void SelectLocation(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var options = new FolderPickerOpenOptions() { AllowMultiple = false };
|
||||||
|
var toplevel = TopLevel.GetTopLevel(this);
|
||||||
|
if (toplevel == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var selected = await toplevel.StorageProvider.OpenFolderPickerAsync(options);
|
||||||
|
if (selected.Count == 1)
|
||||||
|
TxtLocation.Text = selected[0].Path.LocalPath;
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Apply.Title}"/>
|
Text="{DynamicResource Text.Apply.Title}"/>
|
||||||
|
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Archive.Title}"/>
|
Text="{DynamicResource Text.Archive.Title}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -12,15 +12,7 @@
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Checkout.Commit}" />
|
Text="{DynamicResource Text.Checkout.Commit}" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,12,0,16">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,Auto,Auto" ColumnDefinitions="Auto,*">
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Error}" Fill="DarkOrange"/>
|
|
||||||
<TextBlock Margin="4,0,0,0"
|
|
||||||
Text="{DynamicResource Text.Checkout.Commit.Warning}"
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
FontStyle="Italic"/>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<Grid RowDefinitions="32,Auto" ColumnDefinitions="Auto,*" ClipToBounds="True" HorizontalAlignment="Center">
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
@ -44,6 +36,16 @@
|
||||||
GroupName="LocalChanges"
|
GroupName="LocalChanges"
|
||||||
Margin="8,0,0,0" />
|
Margin="8,0,0,0" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
<Grid Grid.Row="2" Grid.Column="1" ColumnDefinitions="Auto,*" Margin="0,6,0,0">
|
||||||
|
<Path Grid.Column="0"
|
||||||
|
Width="14" Height="14"
|
||||||
|
Data="{StaticResource Icons.Error}"
|
||||||
|
Fill="DarkOrange"/>
|
||||||
|
<TextBlock Grid.Column="1" Margin="8,0,0,0"
|
||||||
|
Text="{DynamicResource Text.Checkout.Commit.Warning}"
|
||||||
|
TextWrapping="Wrap"/>
|
||||||
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.CherryPick}"/>
|
Text="{DynamicResource Text.CherryPick}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="100,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:ae="using:AvaloniaEdit"
|
|
||||||
xmlns:c="using:SourceGit.Converters"
|
xmlns:c="using:SourceGit.Converters"
|
||||||
xmlns:vm="using:SourceGit.ViewModels"
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
xmlns:v="using:SourceGit.Views"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="SourceGit.Views.CommitMessageTextBox"
|
x:Class="SourceGit.Views.CommitMessageTextBox"
|
||||||
x:Name="ThisControl">
|
x:Name="ThisControl">
|
||||||
|
@ -12,52 +12,67 @@
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
BorderBrush="{DynamicResource Brush.Border2}"
|
BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
CornerRadius="4">
|
CornerRadius="4">
|
||||||
<Grid RowDefinitions="*,Auto">
|
<Grid RowDefinitions="Auto,1,*">
|
||||||
<Grid Grid.Row="0">
|
<Grid Grid.Row="0" ColumnDefinitions="*,1,Auto">
|
||||||
<Rectangle x:Name="SubjectGuideLine"
|
<v:EnhancedTextBox Grid.Column="0"
|
||||||
Height="1"
|
x:Name="SubjectEditor"
|
||||||
HorizontalAlignment="Stretch"
|
Classes="no_border"
|
||||||
VerticalAlignment="Top"
|
Margin="0"
|
||||||
|
Padding="4"
|
||||||
|
CornerRadius="4,4,0,0"
|
||||||
|
BorderThickness="0"
|
||||||
|
Background="Transparent"
|
||||||
|
AcceptsReturn="False"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||||
|
Text="{Binding #ThisControl.Subject, Mode=TwoWay}"
|
||||||
|
Watermark="{DynamicResource Text.CommitMessageTextBox.SubjectPlaceholder}"
|
||||||
|
PreviewKeyDown="OnSubjectTextBoxPreviewKeyDown"/>
|
||||||
|
|
||||||
|
<Rectangle Grid.Column="1"
|
||||||
|
Width="1"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Stretch"
|
||||||
IsHitTestVisible="False"
|
IsHitTestVisible="False"
|
||||||
Fill="{DynamicResource Brush.Border2}"/>
|
Fill="{DynamicResource Brush.Border2}"/>
|
||||||
|
|
||||||
<ae:TextEditor x:Name="TextEditor"
|
<StackPanel Grid.Column="2"
|
||||||
Foreground="{DynamicResource Brush.FG1}"
|
Margin="8,0"
|
||||||
Background="Transparent"
|
VerticalAlignment="Center"
|
||||||
Padding="2,1"
|
Orientation="Horizontal">
|
||||||
BorderThickness="0"
|
<TextBlock Classes="monospace" Margin="2,0,0,0" FontSize="11" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthGood}}"/>
|
||||||
WordWrap="True"
|
<TextBlock Classes="monospace" Margin="2,0,0,0" FontSize="11" Foreground="DarkGoldenrod" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}"/>
|
||||||
Document="{Binding #ThisControl.Document}"
|
|
||||||
TextChanged="OnTextEditorTextChanged"
|
|
||||||
LayoutUpdated="OnTextEditorLayoutUpdated"/>
|
|
||||||
|
|
||||||
<TextBlock Text="{DynamicResource Text.CommitMessageTextBox.Placeholder}"
|
|
||||||
Foreground="{DynamicResource Brush.FG2}"
|
|
||||||
HorizontalAlignment="Left"
|
|
||||||
VerticalAlignment="Top"
|
|
||||||
Margin="2,1"
|
|
||||||
IsVisible="{Binding #ThisControl.Text, Converter={x:Static StringConverters.IsNullOrEmpty}}"
|
|
||||||
IsHitTestVisible="False"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<Border Grid.Row="1" CornerRadius="0,0,4,4" BorderThickness="0,1,0,0" BorderBrush="{DynamicResource Brush.Border2}" Background="{DynamicResource Brush.Window}" ClipToBounds="True">
|
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
|
||||||
<Border Grid.Column="0" Background="Transparent" Width="16" Height="16" ToolTip.Tip="{DynamicResource Text.CommitMessageTextBox.Tip}">
|
|
||||||
<Path Height="12" Width="12" Margin="4,0,0,0" Data="{DynamicResource Icons.Info}"/>
|
|
||||||
</Border>
|
|
||||||
|
|
||||||
<StackPanel Grid.Column="2" Orientation="Horizontal" Margin="4,2">
|
|
||||||
<TextBlock Text="Subject:" FontSize="10" Foreground="{DynamicResource Brush.FG2}"/>
|
|
||||||
<TextBlock Classes="monospace" Margin="2,0,0,0" FontSize="11" Text="{Binding #ThisControl.SubjectLength}" IsVisible="{Binding #ThisControl.SubjectLength, Converter={x:Static c:IntConverters.IsSubjectLengthGood}}"/>
|
|
||||||
<TextBlock Classes="monospace" Margin="2,0,0,0" FontSize="11" Foreground="DarkGoldenrod" Text="{Binding #ThisControl.SubjectLength}" IsVisible="{Binding #ThisControl.SubjectLength, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}"/>
|
|
||||||
<TextBlock Classes="monospace" FontSize="11" Text="/"/>
|
<TextBlock Classes="monospace" FontSize="11" Text="/"/>
|
||||||
<TextBlock Classes="monospace" FontSize="11" Text="{Binding Source={x:Static vm:Preference.Instance}, Path=SubjectGuideLength}"/>
|
<TextBlock Classes="monospace" FontSize="11" Text="{Binding Source={x:Static vm:Preference.Instance}, Path=SubjectGuideLength}"/>
|
||||||
<Path Width="10" Height="10" Margin="4,0,0,0" Data="{StaticResource Icons.Error}" Fill="DarkGoldenrod" IsVisible="{Binding #ThisControl.SubjectLength, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}"/>
|
<Path Width="10" Height="10" Margin="4,0,0,0" Data="{StaticResource Icons.Error}" Fill="DarkGoldenrod" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}"/>
|
||||||
<TextBlock Margin="8,0,0,0" Text="Total:" FontSize="11" Foreground="{DynamicResource Brush.FG2}"/>
|
|
||||||
<TextBlock Classes="monospace" Margin="2,0,0,0" FontSize="11" Text="{Binding #ThisControl.Text.Length}"/>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
|
||||||
|
<Rectangle Grid.Row="1"
|
||||||
|
Height="1"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsHitTestVisible="False"
|
||||||
|
Fill="{DynamicResource Brush.Border2}"/>
|
||||||
|
|
||||||
|
<v:EnhancedTextBox Grid.Row="2"
|
||||||
|
x:Name="DescriptionEditor"
|
||||||
|
Classes="no_border"
|
||||||
|
Margin="0"
|
||||||
|
Padding="4"
|
||||||
|
CornerRadius="0,0,4,4"
|
||||||
|
BorderThickness="0"
|
||||||
|
Background="Transparent"
|
||||||
|
VerticalContentAlignment="Top"
|
||||||
|
AcceptsReturn="True"
|
||||||
|
AcceptsTab="True"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Auto"
|
||||||
|
Text="{Binding #ThisControl.Description, Mode=TwoWay}"
|
||||||
|
Watermark="{DynamicResource Text.CommitMessageTextBox.MessagePlaceholder}"
|
||||||
|
PreviewKeyDown="OnDescriptionTextBoxPreviewKeyDown"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
|
@ -2,19 +2,63 @@ using System;
|
||||||
|
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Input;
|
||||||
using AvaloniaEdit.Document;
|
using Avalonia.Interactivity;
|
||||||
using AvaloniaEdit.Rendering;
|
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
|
public class EnhancedTextBox : TextBox
|
||||||
|
{
|
||||||
|
public static readonly RoutedEvent<KeyEventArgs> PreviewKeyDownEvent =
|
||||||
|
RoutedEvent.Register<ChangeCollectionView, KeyEventArgs>(nameof(KeyEventArgs), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
|
||||||
|
|
||||||
|
public event EventHandler<KeyEventArgs> PreviewKeyDown
|
||||||
|
{
|
||||||
|
add { AddHandler(PreviewKeyDownEvent, value); }
|
||||||
|
remove { RemoveHandler(PreviewKeyDownEvent, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Type StyleKeyOverride => typeof(TextBox);
|
||||||
|
|
||||||
|
protected override void OnKeyDown(KeyEventArgs e)
|
||||||
|
{
|
||||||
|
var dump = new KeyEventArgs()
|
||||||
|
{
|
||||||
|
RoutedEvent = PreviewKeyDownEvent,
|
||||||
|
Route = RoutingStrategies.Direct,
|
||||||
|
Source = e.Source,
|
||||||
|
Key = e.Key,
|
||||||
|
KeyModifiers = e.KeyModifiers,
|
||||||
|
PhysicalKey = e.PhysicalKey,
|
||||||
|
KeySymbol = e.KeySymbol,
|
||||||
|
};
|
||||||
|
|
||||||
|
RaiseEvent(dump);
|
||||||
|
|
||||||
|
if (dump.Handled)
|
||||||
|
e.Handled = true;
|
||||||
|
else
|
||||||
|
base.OnKeyDown(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public partial class CommitMessageTextBox : UserControl
|
public partial class CommitMessageTextBox : UserControl
|
||||||
{
|
{
|
||||||
|
public enum TextChangeWay
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
FromSource,
|
||||||
|
FromEditor,
|
||||||
|
}
|
||||||
|
|
||||||
public static readonly StyledProperty<string> TextProperty =
|
public static readonly StyledProperty<string> TextProperty =
|
||||||
AvaloniaProperty.Register<CommitMessageTextBox, string>(nameof(Text), string.Empty);
|
AvaloniaProperty.Register<CommitMessageTextBox, string>(nameof(Text), string.Empty);
|
||||||
|
|
||||||
public static readonly StyledProperty<int> SubjectLengthProperty =
|
public static readonly StyledProperty<string> SubjectProperty =
|
||||||
AvaloniaProperty.Register<CommitMessageTextBox, int>(nameof(SubjectLength));
|
AvaloniaProperty.Register<CommitMessageTextBox, string>(nameof(Subject), string.Empty);
|
||||||
|
|
||||||
|
public static readonly StyledProperty<string> DescriptionProperty =
|
||||||
|
AvaloniaProperty.Register<CommitMessageTextBox, string>(nameof(Description), string.Empty);
|
||||||
|
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
|
@ -22,20 +66,20 @@ namespace SourceGit.Views
|
||||||
set => SetValue(TextProperty, value);
|
set => SetValue(TextProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int SubjectLength
|
public string Subject
|
||||||
{
|
{
|
||||||
get => GetValue(SubjectLengthProperty);
|
get => GetValue(SubjectProperty);
|
||||||
set => SetValue(SubjectLengthProperty, value);
|
set => SetValue(SubjectProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextDocument Document
|
public string Description
|
||||||
{
|
{
|
||||||
get;
|
get => GetValue(DescriptionProperty);
|
||||||
|
set => SetValue(DescriptionProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommitMessageTextBox()
|
public CommitMessageTextBox()
|
||||||
{
|
{
|
||||||
Document = new TextDocument(Text);
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,61 +87,51 @@ namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
base.OnPropertyChanged(change);
|
base.OnPropertyChanged(change);
|
||||||
|
|
||||||
if (change.Property == TextProperty && !_isDocumentTextChanging)
|
if (change.Property == TextProperty && _changingWay == TextChangeWay.None)
|
||||||
Document.Text = Text;
|
{
|
||||||
|
_changingWay = TextChangeWay.FromSource;
|
||||||
|
var normalized = Text.ReplaceLineEndings("\n").Trim();
|
||||||
|
var subjectEnd = normalized.IndexOf("\n\n", StringComparison.Ordinal);
|
||||||
|
if (subjectEnd == -1)
|
||||||
|
{
|
||||||
|
SetCurrentValue(SubjectProperty, normalized.ReplaceLineEndings(" "));
|
||||||
|
SetCurrentValue(DescriptionProperty, string.Empty);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
private void OnTextEditorLayoutUpdated(object sender, EventArgs e)
|
|
||||||
{
|
{
|
||||||
var view = TextEditor.TextArea?.TextView;
|
SetCurrentValue(SubjectProperty, normalized.Substring(0, subjectEnd).ReplaceLineEndings(" "));
|
||||||
if (view is { VisualLinesValid: true })
|
SetCurrentValue(DescriptionProperty, normalized.Substring(subjectEnd + 2));
|
||||||
{
|
|
||||||
if (_subjectEndLineNumber == 0)
|
|
||||||
{
|
|
||||||
SubjectGuideLine.Margin = new Thickness(1, view.DefaultLineHeight + 2, 1, 0);
|
|
||||||
SubjectGuideLine.IsVisible = true;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
_changingWay = TextChangeWay.None;
|
||||||
foreach (var line in view.VisualLines)
|
|
||||||
{
|
|
||||||
var lineNumber = line.FirstDocumentLine.LineNumber;
|
|
||||||
if (lineNumber == _subjectEndLineNumber)
|
|
||||||
{
|
|
||||||
var y = line.GetTextLineVisualYPosition(line.TextLines[^1], VisualYPosition.TextBottom) - view.VerticalOffset + 2;
|
|
||||||
SubjectGuideLine.Margin = new Thickness(1, y, 1, 0);
|
|
||||||
SubjectGuideLine.IsVisible = true;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else if ((change.Property == SubjectProperty || change.Property == DescriptionProperty) && _changingWay == TextChangeWay.None)
|
||||||
|
{
|
||||||
|
_changingWay = TextChangeWay.FromEditor;
|
||||||
|
SetCurrentValue(TextProperty, $"{Subject}\n\n{Description}");
|
||||||
|
_changingWay = TextChangeWay.None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SubjectGuideLine.IsVisible = false;
|
private void OnSubjectTextBoxPreviewKeyDown(object sender, KeyEventArgs e)
|
||||||
}
|
|
||||||
|
|
||||||
private void OnTextEditorTextChanged(object sender, EventArgs e)
|
|
||||||
{
|
{
|
||||||
_isDocumentTextChanging = true;
|
if (e.Key == Key.Enter || (e.Key == Key.Right && SubjectEditor.CaretIndex == Subject.Length))
|
||||||
SetCurrentValue(TextProperty, Document.Text);
|
|
||||||
_isDocumentTextChanging = false;
|
|
||||||
|
|
||||||
for (var i = 0; i < Document.LineCount; i++)
|
|
||||||
{
|
{
|
||||||
var line = Document.Lines[i];
|
DescriptionEditor.Focus();
|
||||||
if (line.LineNumber > 1 && line.Length == 0)
|
DescriptionEditor.CaretIndex = 0;
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDescriptionTextBoxPreviewKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
var subject = Text[..line.Offset].ReplaceLineEndings(" ").Trim();
|
if ((e.Key == Key.Back || e.Key == Key.Left) && DescriptionEditor.CaretIndex == 0)
|
||||||
SetCurrentValue(SubjectLengthProperty, subject.Length);
|
{
|
||||||
return;
|
SubjectEditor.Focus();
|
||||||
|
SubjectEditor.CaretIndex = Subject.Length;
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_subjectEndLineNumber = line.LineNumber;
|
private TextChangeWay _changingWay = TextChangeWay.None;
|
||||||
}
|
|
||||||
|
|
||||||
SetCurrentValue(SubjectLengthProperty, Text.ReplaceLineEndings(" ").Trim().Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool _isDocumentTextChanging = false;
|
|
||||||
private int _subjectEndLineNumber = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
Background="{DynamicResource Brush.Badge}"
|
Background="{DynamicResource Brush.Badge}"
|
||||||
IsVisible="{Binding FileModeChange, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
IsVisible="{Binding FileModeChange, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
||||||
ToolTip.Tip="{DynamicResource Text.Diff.FileModeChanged}">
|
ToolTip.Tip="{DynamicResource Text.Diff.FileModeChanged}">
|
||||||
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="4,0" Text="{Binding FileModeChange}"/>
|
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="4,0" Text="{Binding FileModeChange}" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
|
@ -34,11 +34,20 @@
|
||||||
|
|
||||||
<!-- Toolbar Buttons -->
|
<!-- Toolbar Buttons -->
|
||||||
<StackPanel Grid.Column="3" Margin="8,0,0,0" Orientation="Horizontal" VerticalAlignment="Center">
|
<StackPanel Grid.Column="3" Margin="8,0,0,0" Orientation="Horizontal" VerticalAlignment="Center">
|
||||||
<Button Classes="icon_button" Width="32" Command="{Binding IncrUnified}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Incr}">
|
<Button Classes="icon_button"
|
||||||
|
Width="32"
|
||||||
|
Command="{Binding IncrUnified}"
|
||||||
|
IsVisible="{Binding IsTextDiff}"
|
||||||
|
ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Incr}">
|
||||||
<Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Incr}"/>
|
<Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Incr}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Command="{Binding DecrUnified}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Decr}" IsEnabled="{Binding Unified, Converter={x:Static c:IntConverters.IsGreaterThanFour}}">
|
<Button Classes="icon_button"
|
||||||
|
Width="32"
|
||||||
|
Command="{Binding DecrUnified}"
|
||||||
|
IsVisible="{Binding IsTextDiff}"
|
||||||
|
ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Decr}"
|
||||||
|
IsEnabled="{Binding Source={x:Static vm:Preference.Instance}, Path=DiffViewVisualLineNumbers, Converter={x:Static c:IntConverters.IsGreaterThanFour}}">
|
||||||
<Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Decr}"/>
|
<Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Decr}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
@ -101,7 +110,7 @@
|
||||||
<Path Width="64" Height="64" Data="{StaticResource Icons.Binary}" Fill="{DynamicResource Brush.FG2}"/>
|
<Path Width="64" Height="64" Data="{StaticResource Icons.Binary}" Fill="{DynamicResource Brush.FG2}"/>
|
||||||
<Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto,Auto">
|
<Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto,Auto">
|
||||||
<Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
<Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10"/>
|
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="1" Classes="monospace" Text="{Binding OldSize}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/>
|
<TextBlock Grid.Row="0" Grid.Column="1" Classes="monospace" Text="{Binding OldSize}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/>
|
||||||
|
@ -128,7 +137,7 @@
|
||||||
<Path Width="64" Height="64" Data="{StaticResource Icons.LFS}" Fill="{DynamicResource Brush.FG2}"/>
|
<Path Width="64" Height="64" Data="{StaticResource Icons.LFS}" Fill="{DynamicResource Brush.FG2}"/>
|
||||||
<Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto,Auto">
|
<Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto,Auto">
|
||||||
<Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
<Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10"/>
|
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="1" Classes="monospace" Text="{Binding Old.Size}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/>
|
<TextBlock Grid.Row="0" Grid.Column="1" Classes="monospace" Text="{Binding Old.Size}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/>
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
HorizontalAlignment="Left" VerticalAlignment="Center"
|
HorizontalAlignment="Left" VerticalAlignment="Center"
|
||||||
Data="{StaticResource Icons.Stashes}"/>
|
Data="{StaticResource Icons.Stashes}"/>
|
||||||
|
|
||||||
<TextBlock VerticalAlignment="Center" Text="{Binding Stash.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
<TextBlock VerticalAlignment="Center" Classes="monospace" Text="{Binding Stash.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
||||||
<TextBlock VerticalAlignment="Center" Text="{Binding Stash.Message}" Margin="8,0,0,0"/>
|
<TextBlock VerticalAlignment="Center" Text="{Binding Stash.Message}" Margin="8,0,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Fetch.Title}"/>
|
Text="{DynamicResource Text.Fetch.Title}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.GitFlow.StartHotfixTitle}"
|
Text="{DynamicResource Text.GitFlow.StartHotfixTitle}"
|
||||||
IsVisible="{Binding IsHotfix}"/>
|
IsVisible="{Binding IsHotfix}"/>
|
||||||
<Grid Margin="0,16,0,0" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -84,30 +84,33 @@
|
||||||
FontSize="{Binding Source={x:Static vm:Preference.Instance}, Path=DefaultFontSize, Converter={x:Static c:DoubleConverters.Increase}}"
|
FontSize="{Binding Source={x:Static vm:Preference.Instance}, Path=DefaultFontSize, Converter={x:Static c:DoubleConverters.Increase}}"
|
||||||
Margin="0,8"/>
|
Margin="0,8"/>
|
||||||
|
|
||||||
<Grid RowDefinitions="20,20,20,20,20,20,20,20" ColumnDefinitions="150,*">
|
<Grid RowDefinitions="20,20,20,20,20,20,20,20,20" ColumnDefinitions="150,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+F, macOS=⌘+F}"/>
|
<TextBlock Grid.Row="0" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+Shift+H, macOS=⌘+⇧+H}"/>
|
||||||
<TextBlock Grid.Row="0" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.OpenSearchCommits}" />
|
<TextBlock Grid.Row="0" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.GoHome}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="1" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+1, macOS=⌘+1}"/>
|
<TextBlock Grid.Row="1" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+F, macOS=⌘+F}"/>
|
||||||
<TextBlock Grid.Row="1" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewHistories}" />
|
<TextBlock Grid.Row="1" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.OpenSearchCommits}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="2" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+2, macOS=⌘+2}"/>
|
<TextBlock Grid.Row="2" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+1, macOS=⌘+1}"/>
|
||||||
<TextBlock Grid.Row="2" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewChanges}" />
|
<TextBlock Grid.Row="2" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewHistories}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="3" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+3, macOS=⌘+3}"/>
|
<TextBlock Grid.Row="3" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+2, macOS=⌘+2}"/>
|
||||||
<TextBlock Grid.Row="3" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewStashes}" />
|
<TextBlock Grid.Row="3" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewChanges}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="4" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Space, macOS=␣}"/>
|
<TextBlock Grid.Row="4" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+3, macOS=⌘+3}"/>
|
||||||
<TextBlock Grid.Row="4" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.StageOrUnstageSelected}" />
|
<TextBlock Grid.Row="4" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.ViewStashes}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="5" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+Enter, macOS=⌘+Enter}"/>
|
<TextBlock Grid.Row="5" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Space, macOS=␣}"/>
|
||||||
<TextBlock Grid.Row="5" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.Commit}" />
|
<TextBlock Grid.Row="5" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.StageOrUnstageSelected}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="6" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+Shift+Enter, macOS=⌘+⇧+Enter}"/>
|
<TextBlock Grid.Row="6" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+Enter, macOS=⌘+Enter}"/>
|
||||||
<TextBlock Grid.Row="6" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.CommitAndPush}" />
|
<TextBlock Grid.Row="6" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.Commit}" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="7" Grid.Column="0" Classes="monospace bold" Text="F5"/>
|
<TextBlock Grid.Row="7" Grid.Column="0" Classes="monospace bold" Text="{OnPlatform Ctrl+Shift+Enter, macOS=⌘+⇧+Enter}"/>
|
||||||
<TextBlock Grid.Row="7" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.Refresh}" />
|
<TextBlock Grid.Row="7" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.CommitAndPush}" />
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="8" Grid.Column="0" Classes="monospace bold" Text="F5"/>
|
||||||
|
<TextBlock Grid.Row="8" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Repo.Refresh}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TextBlock Text="{DynamicResource Text.Hotkeys.TextEditor}"
|
<TextBlock Text="{DynamicResource Text.Hotkeys.TextEditor}"
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
<Grid RowDefinitions="Auto,*" Margin="16,0" IsVisible="{Binding Old, Converter={x:Static ObjectConverters.IsNotNull}}">
|
<Grid RowDefinitions="Auto,*" Margin="16,0" IsVisible="{Binding Old, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||||
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center">
|
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center">
|
||||||
<Border Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
<Border Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10"/>
|
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<TextBlock Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
<TextBlock Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
<Grid RowDefinitions="Auto,*" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="8,16">
|
<Grid RowDefinitions="Auto,*" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="8,16">
|
||||||
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" HorizontalAlignment="Center">
|
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" HorizontalAlignment="Center">
|
||||||
<Border Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
<Border Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10"/>
|
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<TextBlock Grid.Column="1" Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
||||||
|
@ -114,7 +114,7 @@
|
||||||
<Grid RowDefinitions="Auto,*,Auto" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="8,16,8,0">
|
<Grid RowDefinitions="Auto,*,Auto" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="8,16,8,0">
|
||||||
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" HorizontalAlignment="Center">
|
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" HorizontalAlignment="Center">
|
||||||
<Border Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
<Border Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10"/>
|
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<TextBlock Grid.Column="1" Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{Binding OldImageSize}" Margin="8,0,0,0"/>
|
||||||
|
@ -142,7 +142,7 @@
|
||||||
|
|
||||||
<Grid Grid.Row="2" ColumnDefinitions="100,200,100" Margin="0,12,0,0" HorizontalAlignment="Center">
|
<Grid Grid.Row="2" ColumnDefinitions="100,200,100" Margin="0,12,0,0" HorizontalAlignment="Center">
|
||||||
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,8,0">
|
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,8,0">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.Old}"/>
|
<TextBlock Classes="monospace" Text="OLD"/>
|
||||||
<TextBlock Classes="monospace"
|
<TextBlock Classes="monospace"
|
||||||
Margin="8,0,0,0"
|
Margin="8,0,0,0"
|
||||||
Text="{Binding #ImageBlendSlider.Value, Converter={x:Static c:DoubleConverters.OneMinusToPercentage}}"
|
Text="{Binding #ImageBlendSlider.Value, Converter={x:Static c:DoubleConverters.OneMinusToPercentage}}"
|
||||||
|
@ -169,7 +169,7 @@
|
||||||
</Slider>
|
</Slider>
|
||||||
|
|
||||||
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Top" Margin="8,0,0,0">
|
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Top" Margin="8,0,0,0">
|
||||||
<TextBlock Classes="monospace" Text="{DynamicResource Text.Diff.Binary.New}"/>
|
<TextBlock Classes="monospace" Text="NEW"/>
|
||||||
<TextBlock Classes="monospace"
|
<TextBlock Classes="monospace"
|
||||||
Margin="8,0,0,0"
|
Margin="8,0,0,0"
|
||||||
Text="{Binding #ImageBlendSlider.Value, Converter={x:Static c:DoubleConverters.ToPercentage}}"
|
Text="{Binding #ImageBlendSlider.Value, Converter={x:Static c:DoubleConverters.ToPercentage}}"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.GitFlow.Init}"/>
|
Text="{DynamicResource Text.GitFlow.Init}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,8,32,32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="8,16,0,0" RowDefinitions="32,32,8,32,32,32,32" ColumnDefinitions="Auto,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -5,14 +5,37 @@
|
||||||
xmlns:m="using:SourceGit.Models"
|
xmlns:m="using:SourceGit.Models"
|
||||||
xmlns:vm="using:SourceGit.ViewModels"
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="SourceGit.Views.LFSFetch">
|
x:Class="SourceGit.Views.LFSFetch"
|
||||||
|
x:DataType="vm:LFSFetch">
|
||||||
<StackPanel Orientation="Vertical" Margin="8,0">
|
<StackPanel Orientation="Vertical" Margin="8,0">
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.GitLFS.Fetch.Title}"/>
|
Text="{DynamicResource Text.GitLFS.Fetch.Title}"/>
|
||||||
<TextBlock Text="{DynamicResource Text.GitLFS.Fetch.Tips}"
|
|
||||||
Margin="8,16,8,0"
|
<Grid Margin="0,16,0,0" RowDefinitions="32,Auto" ColumnDefinitions="120,*">
|
||||||
HorizontalAlignment="Center"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Remote}"/>
|
||||||
|
<ComboBox Grid.Row="0" Grid.Column="1"
|
||||||
|
Height="28" Padding="8,0"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding Remotes}"
|
||||||
|
SelectedItem="{Binding SelectedRemote, Mode=TwoWay}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="{x:Type m:Remote}">
|
||||||
|
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
|
||||||
|
<Path Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Remote}"/>
|
||||||
|
<TextBlock Text="{Binding Name}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="1"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Fetch.Tips}"
|
||||||
|
Margin="0,8,0,0"
|
||||||
TextWrapping="Wrap"/>
|
TextWrapping="Wrap"/>
|
||||||
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
|
@ -5,14 +5,37 @@
|
||||||
xmlns:m="using:SourceGit.Models"
|
xmlns:m="using:SourceGit.Models"
|
||||||
xmlns:vm="using:SourceGit.ViewModels"
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="SourceGit.Views.LFSPull">
|
x:Class="SourceGit.Views.LFSPull"
|
||||||
|
x:DataType="vm:LFSPull">
|
||||||
<StackPanel Orientation="Vertical" Margin="8,0">
|
<StackPanel Orientation="Vertical" Margin="8,0">
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.GitLFS.Pull.Title}"/>
|
Text="{DynamicResource Text.GitLFS.Pull.Title}"/>
|
||||||
<TextBlock Text="{DynamicResource Text.GitLFS.Pull.Tips}"
|
|
||||||
Margin="8,16,8,0"
|
<Grid Margin="0,16,0,0" RowDefinitions="32,Auto" ColumnDefinitions="120,*">
|
||||||
HorizontalAlignment="Center"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Remote}"/>
|
||||||
|
<ComboBox Grid.Row="0" Grid.Column="1"
|
||||||
|
Height="28" Padding="8,0"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding Remotes}"
|
||||||
|
SelectedItem="{Binding SelectedRemote, Mode=TwoWay}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="{x:Type m:Remote}">
|
||||||
|
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
|
||||||
|
<Path Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Remote}"/>
|
||||||
|
<TextBlock Text="{Binding Name}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="1"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Pull.Tips}"
|
||||||
|
Margin="0,8,0,0"
|
||||||
TextWrapping="Wrap"/>
|
TextWrapping="Wrap"/>
|
||||||
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
41
src/Views/LFSPush.axaml
Normal file
41
src/Views/LFSPush.axaml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:m="using:SourceGit.Models"
|
||||||
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="SourceGit.Views.LFSPush"
|
||||||
|
x:DataType="vm:LFSPush">
|
||||||
|
<StackPanel Orientation="Vertical" Margin="8,0">
|
||||||
|
<TextBlock FontSize="18"
|
||||||
|
Classes="bold"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Push.Title}"/>
|
||||||
|
|
||||||
|
<Grid Margin="0,16,0,0" RowDefinitions="32,Auto" ColumnDefinitions="120,*">
|
||||||
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Remote}"/>
|
||||||
|
<ComboBox Grid.Row="0" Grid.Column="1"
|
||||||
|
Height="28" Padding="8,0"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding Remotes}"
|
||||||
|
SelectedItem="{Binding SelectedRemote, Mode=TwoWay}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="{x:Type m:Remote}">
|
||||||
|
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
|
||||||
|
<Path Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Remote}"/>
|
||||||
|
<TextBlock Text="{Binding Name}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="1"
|
||||||
|
Text="{DynamicResource Text.GitLFS.Push.Tips}"
|
||||||
|
Margin="0,8,0,0"
|
||||||
|
TextWrapping="Wrap"/>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
12
src/Views/LFSPush.axaml.cs
Normal file
12
src/Views/LFSPush.axaml.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
using Avalonia.Controls;
|
||||||
|
|
||||||
|
namespace SourceGit.Views
|
||||||
|
{
|
||||||
|
public partial class LFSPush : UserControl
|
||||||
|
{
|
||||||
|
public LFSPush()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.GitLFS.AddTrackPattern.Title}"/>
|
Text="{DynamicResource Text.GitLFS.AddTrackPattern.Title}"/>
|
||||||
|
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -10,17 +10,13 @@
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="SourceGit.Views.Launcher"
|
x:Class="SourceGit.Views.Launcher"
|
||||||
x:DataType="vm:Launcher"
|
x:DataType="vm:Launcher"
|
||||||
x:Name="me"
|
|
||||||
Icon="/App.ico"
|
Icon="/App.ico"
|
||||||
Title="SourceGit"
|
Title="SourceGit"
|
||||||
MinWidth="1280" MinHeight="720"
|
MinWidth="1280" MinHeight="720"
|
||||||
Width="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.LauncherWidth, Mode=TwoWay}"
|
|
||||||
Height="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.LauncherHeight, Mode=TwoWay}"
|
|
||||||
WindowState="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.LauncherWindowState, Mode=TwoWay}"
|
|
||||||
WindowStartupLocation="CenterScreen">
|
WindowStartupLocation="CenterScreen">
|
||||||
<Grid>
|
<Grid x:Name="MainLayout">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="{Binding #me.TitleBarHeight}"/>
|
<RowDefinition Height="38"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
@ -40,12 +36,8 @@
|
||||||
<v:CaptionButtonsMacOS VerticalAlignment="Bottom"/>
|
<v:CaptionButtonsMacOS VerticalAlignment="Bottom"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu (Windows/Linux) -->
|
||||||
<Button Grid.Column="0" Classes="icon_button" VerticalAlignment="Bottom" IsVisible="{OnPlatform True, macOS=False}">
|
<Button Grid.Column="0" Classes="icon_button" VerticalAlignment="Bottom" Margin="6,0,2,3" IsVisible="{OnPlatform True, macOS=False}">
|
||||||
<Button.Margin>
|
|
||||||
<OnPlatform Default="4,0,2,3" macOS="4,0,6,3"/>
|
|
||||||
</Button.Margin>
|
|
||||||
|
|
||||||
<Button.Flyout>
|
<Button.Flyout>
|
||||||
<MenuFlyout Placement="BottomEdgeAlignedLeft" VerticalOffset="-8">
|
<MenuFlyout Placement="BottomEdgeAlignedLeft" VerticalOffset="-8">
|
||||||
<MenuItem Header="{DynamicResource Text.Preference}" Command="{x:Static s:App.OpenPreferenceCommand}" InputGesture="Ctrl+Shift+P">
|
<MenuItem Header="{DynamicResource Text.Preference}" Command="{x:Static s:App.OpenPreferenceCommand}" InputGesture="Ctrl+Shift+P">
|
||||||
|
@ -76,159 +68,7 @@
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<!-- Pages Tabs-->
|
<!-- Pages Tabs-->
|
||||||
<Grid x:Name="launcherTabsContainer" Grid.Column="1" Height="30" ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Bottom" SizeChanged="UpdateScrollIndicator">
|
<v:LauncherTabBar Grid.Column="1" Height="30" VerticalAlignment="Bottom"/>
|
||||||
<RepeatButton x:Name="leftScrollIndicator" Grid.Column="0" Classes="icon_button" Width="18" Height="30" Click="ScrollTabsLeft">
|
|
||||||
<Path Width="8" Height="14" Stretch="Fill" Data="{StaticResource Icons.TriangleLeft}"/>
|
|
||||||
</RepeatButton>
|
|
||||||
|
|
||||||
<ScrollViewer Grid.Column="1"
|
|
||||||
x:Name="launcherTabsScroller"
|
|
||||||
HorizontalAlignment="Left"
|
|
||||||
HorizontalScrollBarVisibility="Hidden"
|
|
||||||
VerticalScrollBarVisibility="Disabled"
|
|
||||||
PointerWheelChanged="ScrollTabs"
|
|
||||||
ScrollChanged="OnTabsScrollChanged">
|
|
||||||
<StackPanel x:Name="launcherTabsBar" Orientation="Horizontal" SizeChanged="UpdateScrollIndicator">
|
|
||||||
<ListBox Classes="launcher_page_tabbar"
|
|
||||||
ItemsSource="{Binding Pages}"
|
|
||||||
SelectedItem="{Binding ActivePage, Mode=TwoWay}">
|
|
||||||
<ListBox.ItemsPanel>
|
|
||||||
<ItemsPanelTemplate>
|
|
||||||
<VirtualizingStackPanel Orientation="Horizontal" Height="30"/>
|
|
||||||
</ItemsPanelTemplate>
|
|
||||||
</ListBox.ItemsPanel>
|
|
||||||
|
|
||||||
<ListBox.ItemTemplate>
|
|
||||||
<DataTemplate DataType="{x:Type vm:LauncherPage}">
|
|
||||||
<Border Classes="launcher_pagetab"
|
|
||||||
Height="30"
|
|
||||||
BorderThickness="1,1,1,0"
|
|
||||||
CornerRadius="6,6,0,0"
|
|
||||||
PointerPressed="OnPointerPressedTab"
|
|
||||||
PointerMoved="OnPointerMovedOverTab"
|
|
||||||
PointerReleased="OnPointerReleasedTab"
|
|
||||||
Loaded="SetupDragAndDrop">
|
|
||||||
<Border.ContextMenu>
|
|
||||||
<ContextMenu>
|
|
||||||
<MenuItem Header="{DynamicResource Text.PageTabBar.Tab.Close}"
|
|
||||||
Command="{Binding #me.((vm:Launcher)DataContext).CloseTab}"
|
|
||||||
CommandParameter="{Binding}"
|
|
||||||
InputGesture="{OnPlatform Ctrl+W, macOS=⌘+W}"/>
|
|
||||||
<MenuItem Header="{DynamicResource Text.PageTabBar.Tab.CloseOther}"
|
|
||||||
Command="{Binding #me.((vm:Launcher)DataContext).CloseOtherTabs}"/>
|
|
||||||
<MenuItem Header="{DynamicResource Text.PageTabBar.Tab.CloseRight}"
|
|
||||||
Command="{Binding #me.((vm:Launcher)DataContext).CloseRightTabs}"/>
|
|
||||||
<MenuItem Header="-" IsVisible="{Binding Node.IsRepository}"/>
|
|
||||||
<MenuItem IsVisible="{Binding Node.IsRepository}">
|
|
||||||
<MenuItem.Header>
|
|
||||||
<Grid Height="20" ColumnDefinitions="Auto,*">
|
|
||||||
<TextBlock Grid.Column="0" Text="{DynamicResource Text.PageTabBar.Tab.Bookmark}"/>
|
|
||||||
<ComboBox Grid.Column="1"
|
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
|
||||||
BorderThickness=".5" Margin="8,0,0,0"
|
|
||||||
ItemsSource="{x:Static m:Bookmarks.Supported}"
|
|
||||||
SelectedIndex="{Binding Node.Bookmark, Mode=TwoWay}">
|
|
||||||
<ComboBox.Resources>
|
|
||||||
<Thickness x:Key="ComboBoxPadding">12,2,0,2</Thickness>
|
|
||||||
<Thickness x:Key="ComboBoxEditableTextPadding">11,2,32,2</Thickness>
|
|
||||||
<x:Double x:Key="ComboBoxMinHeight">22</x:Double>
|
|
||||||
</ComboBox.Resources>
|
|
||||||
<ComboBox.ItemTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<Border Height="20" VerticalAlignment="Center">
|
|
||||||
<Path Width="12" Height="12"
|
|
||||||
Fill="{Binding Converter={x:Static c:BookmarkConverters.ToBrush}}"
|
|
||||||
StrokeThickness="{Binding Converter={x:Static c:BookmarkConverters.ToStrokeThickness}}"
|
|
||||||
Stroke="{DynamicResource Brush.FG1}"
|
|
||||||
HorizontalAlignment="Center" VerticalAlignment="Center"
|
|
||||||
Data="{StaticResource Icons.Bookmark}"/>
|
|
||||||
</Border>
|
|
||||||
</DataTemplate>
|
|
||||||
</ComboBox.ItemTemplate>
|
|
||||||
</ComboBox>
|
|
||||||
</Grid>
|
|
||||||
</MenuItem.Header>
|
|
||||||
</MenuItem>
|
|
||||||
<MenuItem Header="-" IsVisible="{Binding Node.IsRepository}"/>
|
|
||||||
<MenuItem Header="{DynamicResource Text.PageTabBar.Tab.CopyPath}" Command="{Binding CopyPath}" IsVisible="{Binding Node.IsRepository}"/>
|
|
||||||
</ContextMenu>
|
|
||||||
</Border.ContextMenu>
|
|
||||||
|
|
||||||
<Grid Width="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Converter={x:Static c:BoolConverters.ToPageTabWidth}}" Height="30" ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
|
|
||||||
<Path Grid.Column="0"
|
|
||||||
Width="12" Height="12" Margin="12,0"
|
|
||||||
Fill="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToBrush}}"
|
|
||||||
StrokeThickness="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToStrokeThickness}}"
|
|
||||||
Stroke="{DynamicResource Brush.FG1}"
|
|
||||||
Data="{StaticResource Icons.Bookmark}"
|
|
||||||
IsVisible="{Binding Node.IsRepository}"
|
|
||||||
IsHitTestVisible="False"/>
|
|
||||||
<Path Grid.Column="0"
|
|
||||||
Width="12" Height="12" Margin="12,0"
|
|
||||||
Fill="{DynamicResource Brush.FG1}"
|
|
||||||
Data="{StaticResource Icons.Repositories}"
|
|
||||||
IsVisible="{Binding !Node.IsRepository}"
|
|
||||||
IsHitTestVisible="False"/>
|
|
||||||
<TextBlock Grid.Column="1"
|
|
||||||
Classes="monospace"
|
|
||||||
FontSize="12"
|
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Center"
|
|
||||||
TextAlignment="Center"
|
|
||||||
Text="{Binding Node.Name}"
|
|
||||||
IsVisible="{Binding Node.IsRepository}"
|
|
||||||
IsHitTestVisible="False"/>
|
|
||||||
<TextBlock Grid.Column="1"
|
|
||||||
Classes="monospace"
|
|
||||||
FontSize="12"
|
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Center"
|
|
||||||
TextAlignment="Center"
|
|
||||||
Text="{DynamicResource Text.PageTabBar.Welcome.Title}"
|
|
||||||
IsVisible="{Binding !Node.IsRepository}"
|
|
||||||
IsHitTestVisible="False"/>
|
|
||||||
<Button Grid.Column="2"
|
|
||||||
Classes="icon_button"
|
|
||||||
Width="16" Height="16" Margin="12,0"
|
|
||||||
Command="{Binding #me.((vm:Launcher)DataContext).CloseTab}"
|
|
||||||
CommandParameter="{Binding}">
|
|
||||||
<ToolTip.Tip>
|
|
||||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
||||||
<TextBlock Text="{DynamicResource Text.PageTabBar.Tab.Close}" VerticalAlignment="Center"/>
|
|
||||||
<TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+W, macOS=⌘+W}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
|
|
||||||
</StackPanel>
|
|
||||||
</ToolTip.Tip>
|
|
||||||
<Path Width="8" Height="8" Data="{StaticResource Icons.Window.Close}"/>
|
|
||||||
</Button>
|
|
||||||
<Rectangle Grid.Column="2"
|
|
||||||
Width=".5" Height="20"
|
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
|
||||||
Fill="{DynamicResource Brush.FG2}"
|
|
||||||
IsVisible="{Binding IsTabSplitterVisible}"/>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListBox.ItemTemplate>
|
|
||||||
</ListBox>
|
|
||||||
|
|
||||||
<Button Classes="icon_button"
|
|
||||||
Width="16" Height="16"
|
|
||||||
Margin="8,0"
|
|
||||||
Command="{Binding AddNewTab}">
|
|
||||||
<ToolTip.Tip>
|
|
||||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
||||||
<TextBlock Text="{DynamicResource Text.PageTabBar.New}" VerticalAlignment="Center"/>
|
|
||||||
<TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+T, macOS=⌘+T}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
|
|
||||||
</StackPanel>
|
|
||||||
</ToolTip.Tip>
|
|
||||||
|
|
||||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Plus}"/>
|
|
||||||
</Button>
|
|
||||||
</StackPanel>
|
|
||||||
</ScrollViewer>
|
|
||||||
|
|
||||||
<RepeatButton x:Name="rightScrollIndicator" Grid.Column="2" Classes="icon_button" Width="18" Height="30" Click="ScrollTabsRight">
|
|
||||||
<Path Width="8" Height="14" Stretch="Fill" Data="{StaticResource Icons.TriangleRight}"/>
|
|
||||||
</RepeatButton>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<!-- Caption Buttons (Windows/Linux)-->
|
<!-- Caption Buttons (Windows/Linux)-->
|
||||||
<Border Grid.Column="2" Margin="32,0,0,0" IsVisible="{OnPlatform True, macOS=False}">
|
<Border Grid.Column="2" Margin="32,0,0,0" IsVisible="{OnPlatform True, macOS=False}">
|
||||||
|
@ -253,7 +93,7 @@
|
||||||
<Grid Grid.Row="1" Margin="0,36,0,0" IsVisible="{Binding ActivePage.Popup, Converter={x:Static ObjectConverters.IsNotNull}}" ClipToBounds="True">
|
<Grid Grid.Row="1" Margin="0,36,0,0" IsVisible="{Binding ActivePage.Popup, Converter={x:Static ObjectConverters.IsNotNull}}" ClipToBounds="True">
|
||||||
<Border Background="Transparent" PointerPressed="OnPopupCancelByClickMask"/>
|
<Border Background="Transparent" PointerPressed="OnPopupCancelByClickMask"/>
|
||||||
|
|
||||||
<Border Width="500" HorizontalAlignment="Center" VerticalAlignment="Top" Effect="drop-shadow(0 0 8 #8F000000)" CornerRadius="0,0,4,4" ClipToBounds="True">
|
<Border Width="500" HorizontalAlignment="Center" VerticalAlignment="Top" Effect="drop-shadow(0 0 8 #8F000000)" CornerRadius="0,0,8,8" ClipToBounds="True">
|
||||||
<ContentControl Content="{Binding ActivePage.Popup}" Background="{DynamicResource Brush.Popup}">
|
<ContentControl Content="{Binding ActivePage.Popup}" Background="{DynamicResource Brush.Popup}">
|
||||||
<ContentControl.DataTemplates>
|
<ContentControl.DataTemplates>
|
||||||
<DataTemplate DataType="vm:Popup">
|
<DataTemplate DataType="vm:Popup">
|
||||||
|
@ -297,11 +137,10 @@
|
||||||
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
|
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
|
||||||
<ItemsControl ItemsSource="{Binding ActivePage.Notifications}">
|
<ItemsControl ItemsSource="{Binding ActivePage.Notifications}">
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate DataType="m:Notification">
|
<DataTemplate DataType="vm:Notification">
|
||||||
<Grid Width="320" Margin="8">
|
<Border Margin="10,6" HorizontalAlignment="Stretch" VerticalAlignment="Top" Effect="drop-shadow(0 0 12 #A0000000)">
|
||||||
<Border Background="{DynamicResource Brush.Window}" BorderBrush="{DynamicResource Brush.Border0}" BorderThickness="1" CornerRadius="4" Effect="drop-shadow(0 0 8 #40000000)"/>
|
<Border Padding="8" CornerRadius="6" Background="{DynamicResource Brush.Popup}">
|
||||||
|
<Grid RowDefinitions="26,Auto,32">
|
||||||
<Grid Margin="8" RowDefinitions="26,Auto,Auto">
|
|
||||||
<StackPanel Grid.Row="0" Margin="8,0,0,0" Orientation="Horizontal" IsVisible="{Binding IsError}">
|
<StackPanel Grid.Row="0" Margin="8,0,0,0" Orientation="Horizontal" IsVisible="{Binding IsError}">
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Error}" Fill="Red"/>
|
<Path Width="14" Height="14" Data="{StaticResource Icons.Error}" Fill="Red"/>
|
||||||
<TextBlock Margin="8,0,0,0" FontWeight="Bold" FontSize="14" Text="{DynamicResource Text.Launcher.Error}"/>
|
<TextBlock Margin="8,0,0,0" FontWeight="Bold" FontSize="14" Text="{DynamicResource Text.Launcher.Error}"/>
|
||||||
|
@ -320,18 +159,22 @@
|
||||||
Margin="8" Padding="0"
|
Margin="8" Padding="0"
|
||||||
VerticalContentAlignment="Top"
|
VerticalContentAlignment="Top"
|
||||||
Text="{Binding Message}"/>
|
Text="{Binding Message}"/>
|
||||||
<Button Grid.Row="2"
|
|
||||||
Classes="flat primary"
|
<StackPanel Grid.Row="2" Margin="0,4,0,0" Orientation="Horizontal" HorizontalAlignment="Right">
|
||||||
Height="30"
|
<Button Classes="flat"
|
||||||
Margin="4,0"
|
Margin="0,0,8,0"
|
||||||
Command="{Binding #me.((vm:Launcher)DataContext).ActivePage.DismissNotification}"
|
Command="{Binding CopyMessage}"
|
||||||
CommandParameter="{Binding}"
|
Content="{DynamicResource Text.CopyMessage}"
|
||||||
|
IsVisible="{Binding IsError}"/>
|
||||||
|
|
||||||
|
<Button Classes="flat primary"
|
||||||
|
Margin="0,0"
|
||||||
Content="{DynamicResource Text.Close}"
|
Content="{DynamicResource Text.Close}"
|
||||||
HorizontalAlignment="Right"
|
Click="OnDismissNotification"/>
|
||||||
HorizontalContentAlignment="Center"
|
</StackPanel>
|
||||||
VerticalContentAlignment="Center"/>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</Border>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
</ItemsControl>
|
</ItemsControl>
|
||||||
|
|
|
@ -7,53 +7,35 @@ using Avalonia.Interactivity;
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
public partial class Launcher : ChromelessWindow, Models.INotificationReceiver
|
public partial class Launcher : ChromelessWindow
|
||||||
{
|
{
|
||||||
public static readonly StyledProperty<GridLength> TitleBarHeightProperty =
|
|
||||||
AvaloniaProperty.Register<Launcher, GridLength>(nameof(TitleBarHeight), new GridLength(38, GridUnitType.Pixel));
|
|
||||||
|
|
||||||
public GridLength TitleBarHeight
|
|
||||||
{
|
|
||||||
get => GetValue(TitleBarHeightProperty);
|
|
||||||
set => SetValue(TitleBarHeightProperty, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Launcher()
|
public Launcher()
|
||||||
{
|
{
|
||||||
DataContext = new ViewModels.Launcher();
|
var layout = ViewModels.Preference.Instance.Layout;
|
||||||
|
WindowState = layout.LauncherWindowState;
|
||||||
|
|
||||||
|
if (WindowState != WindowState.Maximized)
|
||||||
|
{
|
||||||
|
Width = layout.LauncherWidth;
|
||||||
|
Height = layout.LauncherHeight;
|
||||||
|
}
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnReceiveNotification(string ctx, Models.Notification notice)
|
|
||||||
{
|
|
||||||
if (DataContext is ViewModels.Launcher vm)
|
|
||||||
{
|
|
||||||
foreach (var page in vm.Pages)
|
|
||||||
{
|
|
||||||
var pageId = page.Node.Id.Replace("\\", "/");
|
|
||||||
if (pageId == ctx)
|
|
||||||
{
|
|
||||||
page.Notifications.Add(notice);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vm.ActivePage != null)
|
|
||||||
vm.ActivePage.Notifications.Add(notice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
||||||
{
|
{
|
||||||
base.OnPropertyChanged(change);
|
base.OnPropertyChanged(change);
|
||||||
|
|
||||||
if (change.Property == WindowStateProperty)
|
if (change.Property == WindowStateProperty && MainLayout != null)
|
||||||
{
|
{
|
||||||
var state = (WindowState)change.NewValue;
|
var state = (WindowState)change.NewValue;
|
||||||
if (state == WindowState.Maximized)
|
if (state == WindowState.Maximized)
|
||||||
SetCurrentValue(TitleBarHeightProperty, new GridLength(OperatingSystem.IsMacOS() ? 34 : 30));
|
MainLayout.RowDefinitions[0].Height = new GridLength(OperatingSystem.IsMacOS() ? 34 : 30);
|
||||||
else
|
else
|
||||||
SetCurrentValue(TitleBarHeightProperty, new GridLength(38, GridUnitType.Pixel));
|
MainLayout.RowDefinitions[0].Height = new GridLength(38);
|
||||||
|
|
||||||
|
ViewModels.Preference.Instance.Layout.LauncherWindowState = state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,17 +106,17 @@ namespace SourceGit.Views
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (e.Key == Key.H && e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
||||||
|
{
|
||||||
|
repo.IsSearching = false;
|
||||||
|
e.Handled = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (e.Key == Key.Escape)
|
else if (e.Key == Key.Escape)
|
||||||
{
|
{
|
||||||
vm.ActivePage.CancelPopup();
|
vm.ActivePage.CancelPopup();
|
||||||
|
|
||||||
if (vm.ActivePage.Data is ViewModels.Repository repo)
|
|
||||||
{
|
|
||||||
repo.IsSearching = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +135,10 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
protected override void OnClosing(WindowClosingEventArgs e)
|
protected override void OnClosing(WindowClosingEventArgs e)
|
||||||
{
|
{
|
||||||
|
var pref = ViewModels.Preference.Instance;
|
||||||
|
pref.Layout.LauncherWidth = Width;
|
||||||
|
pref.Layout.LauncherHeight = Height;
|
||||||
|
|
||||||
var vm = DataContext as ViewModels.Launcher;
|
var vm = DataContext as ViewModels.Launcher;
|
||||||
vm.Quit();
|
vm.Quit();
|
||||||
|
|
||||||
|
@ -198,137 +184,19 @@ namespace SourceGit.Views
|
||||||
_pressedTitleBar = false;
|
_pressedTitleBar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ScrollTabs(object sender, PointerWheelEventArgs e)
|
|
||||||
{
|
|
||||||
if (!e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
|
||||||
{
|
|
||||||
if (e.Delta.Y < 0)
|
|
||||||
launcherTabsScroller.LineRight();
|
|
||||||
else if (e.Delta.Y > 0)
|
|
||||||
launcherTabsScroller.LineLeft();
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ScrollTabsLeft(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
launcherTabsScroller.LineLeft();
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ScrollTabsRight(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
launcherTabsScroller.LineRight();
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateScrollIndicator(object sender, SizeChangedEventArgs e)
|
|
||||||
{
|
|
||||||
if (launcherTabsBar.Bounds.Width > launcherTabsContainer.Bounds.Width)
|
|
||||||
{
|
|
||||||
leftScrollIndicator.IsVisible = true;
|
|
||||||
rightScrollIndicator.IsVisible = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
leftScrollIndicator.IsVisible = false;
|
|
||||||
rightScrollIndicator.IsVisible = false;
|
|
||||||
}
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnTabsScrollChanged(object sender, ScrollChangedEventArgs e)
|
|
||||||
{
|
|
||||||
if (sender is ScrollViewer scrollViewer)
|
|
||||||
{
|
|
||||||
leftScrollIndicator.IsEnabled = scrollViewer.Offset.X > 0;
|
|
||||||
rightScrollIndicator.IsEnabled = scrollViewer.Offset.X < scrollViewer.Extent.Width - scrollViewer.Viewport.Width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetupDragAndDrop(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
if (sender is Border border)
|
|
||||||
{
|
|
||||||
DragDrop.SetAllowDrop(border, true);
|
|
||||||
border.AddHandler(DragDrop.DropEvent, DropTab);
|
|
||||||
}
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnPointerPressedTab(object sender, PointerPressedEventArgs e)
|
|
||||||
{
|
|
||||||
var border = sender as Border;
|
|
||||||
var point = e.GetCurrentPoint(border);
|
|
||||||
if (point.Properties.IsMiddleButtonPressed)
|
|
||||||
{
|
|
||||||
var vm = DataContext as ViewModels.Launcher;
|
|
||||||
vm.CloseTab(border.DataContext as ViewModels.LauncherPage);
|
|
||||||
e.Handled = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_pressedTab = true;
|
|
||||||
_startDragTab = false;
|
|
||||||
_pressedTabPosition = e.GetPosition(sender as Border);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnPointerReleasedTab(object sender, PointerReleasedEventArgs e)
|
|
||||||
{
|
|
||||||
_pressedTab = false;
|
|
||||||
_startDragTab = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnPointerMovedOverTab(object sender, PointerEventArgs e)
|
|
||||||
{
|
|
||||||
if (_pressedTab && !_startDragTab && sender is Border border)
|
|
||||||
{
|
|
||||||
var delta = e.GetPosition(border) - _pressedTabPosition;
|
|
||||||
var sizeSquired = delta.X * delta.X + delta.Y * delta.Y;
|
|
||||||
if (sizeSquired < 64)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_startDragTab = true;
|
|
||||||
|
|
||||||
var data = new DataObject();
|
|
||||||
data.Set("MovedTab", border.DataContext);
|
|
||||||
DragDrop.DoDragDrop(e, data, DragDropEffects.Move);
|
|
||||||
}
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DropTab(object sender, DragEventArgs e)
|
|
||||||
{
|
|
||||||
if (e.Data.Contains("MovedTab") && sender is Border border)
|
|
||||||
{
|
|
||||||
var to = border.DataContext as ViewModels.LauncherPage;
|
|
||||||
var moved = e.Data.Get("MovedTab") as ViewModels.LauncherPage;
|
|
||||||
if (to != null && moved != null && to != moved && DataContext is ViewModels.Launcher vm)
|
|
||||||
{
|
|
||||||
vm.MoveTab(moved, to);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_pressedTab = false;
|
|
||||||
_startDragTab = false;
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnPopupSure(object sender, RoutedEventArgs e)
|
private void OnPopupSure(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (DataContext is ViewModels.Launcher vm)
|
if (DataContext is ViewModels.Launcher vm)
|
||||||
{
|
|
||||||
vm.ActivePage.ProcessPopup();
|
vm.ActivePage.ProcessPopup();
|
||||||
}
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPopupCancel(object sender, RoutedEventArgs e)
|
private void OnPopupCancel(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (DataContext is ViewModels.Launcher vm)
|
if (DataContext is ViewModels.Launcher vm)
|
||||||
{
|
|
||||||
vm.ActivePage.CancelPopup();
|
vm.ActivePage.CancelPopup();
|
||||||
}
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,9 +205,14 @@ namespace SourceGit.Views
|
||||||
OnPopupCancel(sender, e);
|
OnPopupCancel(sender, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnDismissNotification(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is Button btn && DataContext is ViewModels.Launcher vm)
|
||||||
|
vm.DismissNotification(btn.DataContext as ViewModels.Notification);
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
private bool _pressedTitleBar = false;
|
private bool _pressedTitleBar = false;
|
||||||
private bool _pressedTab = false;
|
|
||||||
private Point _pressedTabPosition = new Point();
|
|
||||||
private bool _startDragTab = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
116
src/Views/LauncherTabBar.axaml
Normal file
116
src/Views/LauncherTabBar.axaml
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
xmlns:m="using:SourceGit.Models"
|
||||||
|
xmlns:c="using:SourceGit.Converters"
|
||||||
|
xmlns:v="using:SourceGit.Views"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="SourceGit.Views.LauncherTabBar"
|
||||||
|
x:DataType="vm:Launcher">
|
||||||
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||||
|
<RepeatButton x:Name="LeftScrollIndicator" Grid.Column="0" Classes="icon_button" Width="18" Height="30" Click="ScrollTabsLeft">
|
||||||
|
<Path Width="8" Height="14" Stretch="Fill" Data="{StaticResource Icons.TriangleLeft}"/>
|
||||||
|
</RepeatButton>
|
||||||
|
|
||||||
|
<ScrollViewer Grid.Column="1"
|
||||||
|
Margin="6,0"
|
||||||
|
x:Name="LauncherTabsScroller"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
HorizontalScrollBarVisibility="Hidden"
|
||||||
|
VerticalScrollBarVisibility="Disabled"
|
||||||
|
PointerWheelChanged="ScrollTabs">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<ListBox x:Name="LauncherTabsList"
|
||||||
|
Classes="launcher_page_tabbar"
|
||||||
|
ItemsSource="{Binding Pages}"
|
||||||
|
SelectionMode="AlwaysSelected"
|
||||||
|
SelectedItem="{Binding ActivePage, Mode=TwoWay}"
|
||||||
|
SelectionChanged="OnTabsSelectionChanged"
|
||||||
|
LayoutUpdated="OnTabsLayoutUpdated">
|
||||||
|
<ListBox.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal" Height="30"/>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</ListBox.ItemsPanel>
|
||||||
|
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate DataType="{x:Type vm:LauncherPage}">
|
||||||
|
<Border Height="30"
|
||||||
|
Background="Transparent"
|
||||||
|
PointerPressed="OnPointerPressedTab"
|
||||||
|
PointerMoved="OnPointerMovedOverTab"
|
||||||
|
PointerReleased="OnPointerReleasedTab"
|
||||||
|
Loaded="SetupDragAndDrop"
|
||||||
|
ContextRequested="OnTabContextRequested">
|
||||||
|
<Grid Width="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Converter={x:Static c:BoolConverters.ToPageTabWidth}}" Height="30" ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
|
||||||
|
<Path Grid.Column="0"
|
||||||
|
Width="12" Height="12" Margin="12,0"
|
||||||
|
Fill="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToBrush}}"
|
||||||
|
StrokeThickness="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToStrokeThickness}}"
|
||||||
|
Stroke="{DynamicResource Brush.FG1}"
|
||||||
|
Data="{StaticResource Icons.Bookmark}"
|
||||||
|
IsVisible="{Binding Node.IsRepository}"
|
||||||
|
IsHitTestVisible="False"/>
|
||||||
|
<Path Grid.Column="0"
|
||||||
|
Width="12" Height="12" Margin="12,0"
|
||||||
|
Fill="{DynamicResource Brush.FG1}"
|
||||||
|
Data="{StaticResource Icons.Repositories}"
|
||||||
|
IsVisible="{Binding !Node.IsRepository}"
|
||||||
|
IsHitTestVisible="False"/>
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Classes="monospace"
|
||||||
|
FontSize="12"
|
||||||
|
HorizontalAlignment="Stretch" VerticalAlignment="Center"
|
||||||
|
TextAlignment="Center"
|
||||||
|
Text="{Binding Node.Name}"
|
||||||
|
IsVisible="{Binding Node.IsRepository}"
|
||||||
|
IsHitTestVisible="False"/>
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Classes="monospace"
|
||||||
|
FontSize="12"
|
||||||
|
HorizontalAlignment="Stretch" VerticalAlignment="Center"
|
||||||
|
TextAlignment="Center"
|
||||||
|
Text="{DynamicResource Text.PageTabBar.Welcome.Title}"
|
||||||
|
IsVisible="{Binding !Node.IsRepository}"
|
||||||
|
IsHitTestVisible="False"/>
|
||||||
|
<Button Grid.Column="2"
|
||||||
|
Classes="icon_button"
|
||||||
|
Width="16" Height="16" Margin="12,0"
|
||||||
|
Click="OnCloseTab">
|
||||||
|
<ToolTip.Tip>
|
||||||
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||||
|
<TextBlock Text="{DynamicResource Text.PageTabBar.Tab.Close}" VerticalAlignment="Center"/>
|
||||||
|
<TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+W, macOS=⌘+W}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
</ToolTip.Tip>
|
||||||
|
<Path Width="8" Height="8" Data="{StaticResource Icons.Window.Close}"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
</ListBox>
|
||||||
|
|
||||||
|
<Button Classes="icon_button"
|
||||||
|
Width="16" Height="16"
|
||||||
|
Margin="8,0"
|
||||||
|
Command="{Binding AddNewTab}">
|
||||||
|
<ToolTip.Tip>
|
||||||
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||||
|
<TextBlock Text="{DynamicResource Text.PageTabBar.New}" VerticalAlignment="Center"/>
|
||||||
|
<TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+T, macOS=⌘+T}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
</ToolTip.Tip>
|
||||||
|
|
||||||
|
<Path Width="12" Height="12" Data="{StaticResource Icons.Plus}"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
|
<RepeatButton x:Name="RightScrollIndicator" Grid.Column="2" Classes="icon_button" Width="18" Height="30" Click="ScrollTabsRight">
|
||||||
|
<Path Width="8" Height="14" Stretch="Fill" Data="{StaticResource Icons.TriangleRight}"/>
|
||||||
|
</RepeatButton>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
248
src/Views/LauncherTabBar.axaml.cs
Normal file
248
src/Views/LauncherTabBar.axaml.cs
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Input;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Media;
|
||||||
|
|
||||||
|
namespace SourceGit.Views
|
||||||
|
{
|
||||||
|
public partial class LauncherTabBar : UserControl
|
||||||
|
{
|
||||||
|
public LauncherTabBar()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Render(DrawingContext context)
|
||||||
|
{
|
||||||
|
base.Render(context);
|
||||||
|
|
||||||
|
if (LauncherTabsList == null || LauncherTabsList.SelectedIndex == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var startX = LauncherTabsScroller.Offset.X;
|
||||||
|
var endX = startX + LauncherTabsScroller.Viewport.Width;
|
||||||
|
var height = LauncherTabsScroller.Viewport.Height;
|
||||||
|
|
||||||
|
var selectedIdx = LauncherTabsList.SelectedIndex;
|
||||||
|
var count = LauncherTabsList.ItemCount;
|
||||||
|
var separatorPen = new Pen(this.FindResource("Brush.FG2") as IBrush, 0.5);
|
||||||
|
var separatorY = (height - 20) * 0.5;
|
||||||
|
for (var i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (i == selectedIdx || i == selectedIdx - 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var container = LauncherTabsList.ContainerFromIndex(i);
|
||||||
|
var containerEndX = container.Bounds.Right;
|
||||||
|
if (containerEndX < startX || containerEndX > endX)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var separatorX = containerEndX - startX + LauncherTabsScroller.Bounds.X;
|
||||||
|
context.DrawLine(separatorPen, new Point(separatorX, separatorY), new Point(separatorX, separatorY + 20));
|
||||||
|
}
|
||||||
|
|
||||||
|
var selected = LauncherTabsList.ContainerFromIndex(selectedIdx);
|
||||||
|
var activeStartX = selected.Bounds.X;
|
||||||
|
var activeEndX = activeStartX + selected.Bounds.Width;
|
||||||
|
if (activeStartX > endX + 5 || activeEndX < startX - 5)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var geo = new StreamGeometry();
|
||||||
|
var angle = Math.PI / 2;
|
||||||
|
var x = 0.0;
|
||||||
|
var y = height + 0.25;
|
||||||
|
using (var ctx = geo.Open())
|
||||||
|
{
|
||||||
|
var drawLeftX = activeStartX - startX + LauncherTabsScroller.Bounds.X;
|
||||||
|
var drawRightX = activeEndX - startX + LauncherTabsScroller.Bounds.X;
|
||||||
|
if (drawLeftX < LauncherTabsScroller.Bounds.X)
|
||||||
|
{
|
||||||
|
x = LauncherTabsScroller.Bounds.X;
|
||||||
|
ctx.BeginFigure(new Point(x, y), true);
|
||||||
|
y = 1;
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
x = drawRightX - 6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = drawLeftX - 5;
|
||||||
|
ctx.BeginFigure(new Point(x, y), true);
|
||||||
|
x = drawLeftX;
|
||||||
|
y -= 5;
|
||||||
|
ctx.ArcTo(new Point(x, y), new Size(5, 5), angle, false, SweepDirection.CounterClockwise);
|
||||||
|
y = 6;
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
x += 6;
|
||||||
|
y = 1;
|
||||||
|
ctx.ArcTo(new Point(x, y), new Size(6, 6), angle, false, SweepDirection.Clockwise);
|
||||||
|
x = drawRightX - 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawRightX < LauncherTabsScroller.Bounds.Right)
|
||||||
|
{
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
x = drawRightX;
|
||||||
|
y = 6;
|
||||||
|
ctx.ArcTo(new Point(x, y), new Size(6, 6), angle, false, SweepDirection.Clockwise);
|
||||||
|
y = height + 0.25 - 5;
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
x += 5;
|
||||||
|
y = height + 0.25;
|
||||||
|
ctx.ArcTo(new Point(x, y), new Size(5, 5), angle, false, SweepDirection.CounterClockwise);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = LauncherTabsScroller.Bounds.Right;
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
y = height + 0.25;
|
||||||
|
ctx.LineTo(new Point(x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var fill = this.FindResource("Brush.ToolBar") as IBrush;
|
||||||
|
var stroke = new Pen(this.FindResource("Brush.Border0") as IBrush, 1);
|
||||||
|
context.DrawGeometry(fill, stroke, geo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScrollTabs(object sender, PointerWheelEventArgs e)
|
||||||
|
{
|
||||||
|
if (!e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
||||||
|
{
|
||||||
|
if (e.Delta.Y < 0)
|
||||||
|
LauncherTabsScroller.LineRight();
|
||||||
|
else if (e.Delta.Y > 0)
|
||||||
|
LauncherTabsScroller.LineLeft();
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScrollTabsLeft(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
LauncherTabsScroller.LineLeft();
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScrollTabsRight(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
LauncherTabsScroller.LineRight();
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTabsLayoutUpdated(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (LauncherTabsScroller.Extent.Width > LauncherTabsScroller.Viewport.Width)
|
||||||
|
{
|
||||||
|
LeftScrollIndicator.IsVisible = true;
|
||||||
|
LeftScrollIndicator.IsEnabled = LauncherTabsScroller.Offset.X > 0;
|
||||||
|
RightScrollIndicator.IsVisible = true;
|
||||||
|
RightScrollIndicator.IsEnabled = LauncherTabsScroller.Offset.X < LauncherTabsScroller.Extent.Width - LauncherTabsScroller.Viewport.Width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LeftScrollIndicator.IsVisible = false;
|
||||||
|
RightScrollIndicator.IsVisible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
InvalidateVisual();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTabsSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
InvalidateVisual();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetupDragAndDrop(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is Border border)
|
||||||
|
{
|
||||||
|
DragDrop.SetAllowDrop(border, true);
|
||||||
|
border.AddHandler(DragDrop.DropEvent, DropTab);
|
||||||
|
}
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPointerPressedTab(object sender, PointerPressedEventArgs e)
|
||||||
|
{
|
||||||
|
var border = sender as Border;
|
||||||
|
var point = e.GetCurrentPoint(border);
|
||||||
|
if (point.Properties.IsMiddleButtonPressed)
|
||||||
|
{
|
||||||
|
var vm = DataContext as ViewModels.Launcher;
|
||||||
|
vm.CloseTab(border.DataContext as ViewModels.LauncherPage);
|
||||||
|
e.Handled = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pressedTab = true;
|
||||||
|
_startDragTab = false;
|
||||||
|
_pressedTabPosition = e.GetPosition(sender as Border);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPointerReleasedTab(object sender, PointerReleasedEventArgs e)
|
||||||
|
{
|
||||||
|
_pressedTab = false;
|
||||||
|
_startDragTab = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPointerMovedOverTab(object sender, PointerEventArgs e)
|
||||||
|
{
|
||||||
|
if (_pressedTab && !_startDragTab && sender is Border border)
|
||||||
|
{
|
||||||
|
var delta = e.GetPosition(border) - _pressedTabPosition;
|
||||||
|
var sizeSquired = delta.X * delta.X + delta.Y * delta.Y;
|
||||||
|
if (sizeSquired < 64)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_startDragTab = true;
|
||||||
|
|
||||||
|
var data = new DataObject();
|
||||||
|
data.Set("MovedTab", border.DataContext);
|
||||||
|
DragDrop.DoDragDrop(e, data, DragDropEffects.Move);
|
||||||
|
}
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DropTab(object sender, DragEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Data.Contains("MovedTab") && sender is Border border)
|
||||||
|
{
|
||||||
|
var to = border.DataContext as ViewModels.LauncherPage;
|
||||||
|
var moved = e.Data.Get("MovedTab") as ViewModels.LauncherPage;
|
||||||
|
if (to != null && moved != null && to != moved && DataContext is ViewModels.Launcher vm)
|
||||||
|
{
|
||||||
|
vm.MoveTab(moved, to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_pressedTab = false;
|
||||||
|
_startDragTab = false;
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTabContextRequested(object sender, ContextRequestedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is Border border && DataContext is ViewModels.Launcher vm)
|
||||||
|
{
|
||||||
|
var menu = vm.CreateContextForPageTab(border.DataContext as ViewModels.LauncherPage);
|
||||||
|
border.OpenContextMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCloseTab(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is Button btn && DataContext is ViewModels.Launcher vm)
|
||||||
|
vm.CloseTab(btn.DataContext as ViewModels.LauncherPage);
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _pressedTab = false;
|
||||||
|
private Point _pressedTabPosition = new Point();
|
||||||
|
private bool _startDragTab = false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,7 +58,7 @@
|
||||||
<TabItem.Header>
|
<TabItem.Header>
|
||||||
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preference.General}"/>
|
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preference.General}"/>
|
||||||
</TabItem.Header>
|
</TabItem.Header>
|
||||||
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32" ColumnDefinitions="Auto,*">
|
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32,32" ColumnDefinitions="Auto,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Preference.General.Locale}"
|
Text="{DynamicResource Text.Preference.General.Locale}"
|
||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
|
@ -87,10 +87,23 @@
|
||||||
</ComboBox>
|
</ComboBox>
|
||||||
|
|
||||||
<TextBlock Grid.Row="2" Grid.Column="0"
|
<TextBlock Grid.Row="2" Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Preference.General.SubjectGuideLength}"
|
Text="{DynamicResource Text.Preference.General.VisibleDiffContextLines}"
|
||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Margin="0,0,16,0"/>
|
Margin="0,0,16,0"/>
|
||||||
<NumericUpDown Grid.Row="2" Grid.Column="1"
|
<NumericUpDown Grid.Row="2" Grid.Column="1"
|
||||||
|
Minimum="4" Maximum="10000" Increment="1"
|
||||||
|
Height="28"
|
||||||
|
Padding="4"
|
||||||
|
ShowButtonSpinner="False"
|
||||||
|
BorderThickness="1" BorderBrush="{DynamicResource Brush.Border1}"
|
||||||
|
CornerRadius="3"
|
||||||
|
Value="{Binding DiffViewVisualLineNumbers, Mode=TwoWay}"/>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="3" Grid.Column="0"
|
||||||
|
Text="{DynamicResource Text.Preference.General.SubjectGuideLength}"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Margin="0,0,16,0"/>
|
||||||
|
<NumericUpDown Grid.Row="3" Grid.Column="1"
|
||||||
Minimum="50" Maximum="1000" Increment="1"
|
Minimum="50" Maximum="1000" Increment="1"
|
||||||
Height="28"
|
Height="28"
|
||||||
Padding="4"
|
Padding="4"
|
||||||
|
@ -99,11 +112,11 @@
|
||||||
CornerRadius="3"
|
CornerRadius="3"
|
||||||
Value="{Binding SubjectGuideLength, Mode=TwoWay}"/>
|
Value="{Binding SubjectGuideLength, Mode=TwoWay}"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="3" Grid.Column="0"
|
<TextBlock Grid.Row="4" Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Preference.General.MaxHistoryCommits}"
|
Text="{DynamicResource Text.Preference.General.MaxHistoryCommits}"
|
||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Margin="0,0,16,0"/>
|
Margin="0,0,16,0"/>
|
||||||
<Grid Grid.Row="3" Grid.Column="1" ColumnDefinitions="*,64">
|
<Grid Grid.Row="4" Grid.Column="1" ColumnDefinitions="*,64">
|
||||||
<Slider Grid.Column="0"
|
<Slider Grid.Column="0"
|
||||||
Minimum="20000" Maximum="100000"
|
Minimum="20000" Maximum="100000"
|
||||||
TickPlacement="BottomRight" TickFrequency="5000"
|
TickPlacement="BottomRight" TickFrequency="5000"
|
||||||
|
@ -127,16 +140,16 @@
|
||||||
Text="{Binding MaxHistoryCommits}"/>
|
Text="{Binding MaxHistoryCommits}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<CheckBox Grid.Row="4" Grid.Column="1"
|
<CheckBox Grid.Row="5" Grid.Column="1"
|
||||||
Content="{DynamicResource Text.Preference.General.RestoreTabs}"
|
Content="{DynamicResource Text.Preference.General.RestoreTabs}"
|
||||||
IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/>
|
IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/>
|
||||||
|
|
||||||
<CheckBox Grid.Row="5" Grid.Column="1"
|
<CheckBox Grid.Row="6" Grid.Column="1"
|
||||||
Height="32"
|
Height="32"
|
||||||
Content="{DynamicResource Text.Preference.General.UseFixedTabWidth}"
|
Content="{DynamicResource Text.Preference.General.UseFixedTabWidth}"
|
||||||
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Mode=TwoWay}"/>
|
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Mode=TwoWay}"/>
|
||||||
|
|
||||||
<CheckBox Grid.Row="6" Grid.Column="1"
|
<CheckBox Grid.Row="7" Grid.Column="1"
|
||||||
Height="32"
|
Height="32"
|
||||||
Content="{DynamicResource Text.Preference.General.Check4UpdatesOnStartup}"
|
Content="{DynamicResource Text.Preference.General.Check4UpdatesOnStartup}"
|
||||||
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=Check4UpdatesOnStartup, Mode=TwoWay}"/>
|
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=Check4UpdatesOnStartup, Mode=TwoWay}"/>
|
||||||
|
|
15
src/Views/PruneWorktrees.axaml
Normal file
15
src/Views/PruneWorktrees.axaml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="SourceGit.Views.PruneWorktrees">
|
||||||
|
<StackPanel Orientation="Vertical" Margin="8,0">
|
||||||
|
<TextBlock FontSize="18"
|
||||||
|
Classes="bold"
|
||||||
|
Text="{DynamicResource Text.PruneWorktrees}"/>
|
||||||
|
<TextBlock Text="{DynamicResource Text.PruneWorktrees.Tip}"
|
||||||
|
Margin="0,16,0,0"
|
||||||
|
HorizontalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
12
src/Views/PruneWorktrees.axaml.cs
Normal file
12
src/Views/PruneWorktrees.axaml.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
using Avalonia.Controls;
|
||||||
|
|
||||||
|
namespace SourceGit.Views
|
||||||
|
{
|
||||||
|
public partial class PruneWorktrees : UserControl
|
||||||
|
{
|
||||||
|
public PruneWorktrees()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,7 +12,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.PushTag}"/>
|
Text="{DynamicResource Text.PushTag}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
34
src/Views/RemoveWorktree.axaml
Normal file
34
src/Views/RemoveWorktree.axaml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:m="using:SourceGit.Models"
|
||||||
|
xmlns:vm="using:SourceGit.ViewModels"
|
||||||
|
xmlns:v="using:SourceGit.Views"
|
||||||
|
xmlns:c="using:SourceGit.Converters"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="SourceGit.Views.RemoveWorktree"
|
||||||
|
x:DataType="vm:RemoveWorktree">
|
||||||
|
<StackPanel Orientation="Vertical" Margin="8,0,0,0">
|
||||||
|
<TextBlock FontSize="18"
|
||||||
|
Classes="bold"
|
||||||
|
Text="{DynamicResource Text.RemoveWorktree}"/>
|
||||||
|
<Grid Margin="8,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
|
||||||
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Margin="8,0"
|
||||||
|
Text="{DynamicResource Text.RemoveWorktree.Target}"/>
|
||||||
|
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,*">
|
||||||
|
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.Worktree}"/>
|
||||||
|
<TextBlock Grid.Column="1" Classes="monospace" Margin="8,0,0,0" TextTrimming="CharacterEllipsis">
|
||||||
|
<Run Text="{Binding Target.FullPath}"/>
|
||||||
|
<Run Text="{Binding Target.Name}" Foreground="{DynamicResource Brush.FG2}"/>
|
||||||
|
</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<CheckBox Grid.Row="1" Grid.Column="1"
|
||||||
|
Content="{DynamicResource Text.RemoveWorktree.Force}"
|
||||||
|
IsChecked="{Binding Force, Mode=TwoWay}"/>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
12
src/Views/RemoveWorktree.axaml.cs
Normal file
12
src/Views/RemoveWorktree.axaml.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
using Avalonia.Controls;
|
||||||
|
|
||||||
|
namespace SourceGit.Views
|
||||||
|
{
|
||||||
|
public partial class RemoveWorktree : UserControl
|
||||||
|
{
|
||||||
|
public RemoveWorktree()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,7 +13,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.RenameBranch}"/>
|
Text="{DynamicResource Text.RenameBranch}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
|
|
@ -25,18 +25,6 @@
|
||||||
<Button Classes="icon_button" Width="32" Click="OpenWithExternalTools" ToolTip.Tip="{DynamicResource Text.Repository.OpenWithExternalTools}">
|
<Button Classes="icon_button" Width="32" Click="OpenWithExternalTools" ToolTip.Tip="{DynamicResource Text.Repository.OpenWithExternalTools}">
|
||||||
<Path Width="13" Height="13" Data="{StaticResource Icons.OpenWith}"/>
|
<Path Width="13" Height="13" Data="{StaticResource Icons.OpenWith}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<ToggleButton Width="32"
|
|
||||||
Background="Transparent"
|
|
||||||
IsChecked="{Binding IsSearching, Mode=TwoWay}">
|
|
||||||
<ToolTip.Tip>
|
|
||||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
||||||
<TextBlock Text="{DynamicResource Text.Repository.Search}" VerticalAlignment="Center"/>
|
|
||||||
<TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+F, macOS=⌘+F}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
|
|
||||||
</StackPanel>
|
|
||||||
</ToolTip.Tip>
|
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Search}"/>
|
|
||||||
</ToggleButton>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
||||||
|
@ -70,7 +58,7 @@
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Margin="8,0,0,0" Click="OpenGitFlowMenu" ToolTip.Tip="{DynamicResource Text.GitFlow}">
|
<Button Classes="icon_button" Width="32" Margin="8,0,0,0" Click="OpenGitFlowMenu" ToolTip.Tip="{DynamicResource Text.GitFlow}">
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Flow}"/>
|
<Path Width="14" Height="14" Data="{StaticResource Icons.GitFlow}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Margin="8,0,0,0" Click="OpenGitLFSMenu" ToolTip.Tip="{DynamicResource Text.GitLFS}">
|
<Button Classes="icon_button" Width="32" Margin="8,0,0,0" Click="OpenGitLFSMenu" ToolTip.Tip="{DynamicResource Text.GitLFS}">
|
||||||
|
@ -79,16 +67,6 @@
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,4,0">
|
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,4,0">
|
||||||
<ToggleButton Classes="layout_direction"
|
|
||||||
Width="32" Height="26"
|
|
||||||
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseTwoColumnsLayoutInHistories, Mode=TwoWay}"
|
|
||||||
IsVisible="{Binding SelectedViewIndex, Converter={x:Static c:IntConverters.IsZero}}"
|
|
||||||
ToolTip.Tip="{DynamicResource Text.Histories.DisplayMode}"/>
|
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Command="{Binding NavigateToCurrentHead}" ToolTip.Tip="{DynamicResource Text.Repository.NavigateToCurrentHead}">
|
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Target}"/>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Command="{Binding Cleanup}" ToolTip.Tip="{DynamicResource Text.Repository.Clean}">
|
<Button Classes="icon_button" Width="32" Command="{Binding Cleanup}" ToolTip.Tip="{DynamicResource Text.Repository.Clean}">
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Clean}"/>
|
<Path Width="14" Height="14" Data="{StaticResource Icons.Clean}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -112,27 +90,83 @@
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<!-- Left Normal Mode -->
|
<!-- Left Panel -->
|
||||||
<Grid Grid.Column="0" Classes="repository_leftpanel" RowDefinitions="28,Auto,5,28,28,Auto,28,*,28,Auto,28,Auto" Margin="0,0,0,4" IsVisible="{Binding !IsSearching}">
|
<Grid Grid.Column="0" Classes="repository_leftpanel" RowDefinitions="Auto,*">
|
||||||
<!-- WorkingCopy -->
|
<!-- Page Switcher for Left Contents (Dashboard or CommitSearch) -->
|
||||||
<TextBlock Grid.Row="0" Classes="group_header_label" Text="{DynamicResource Text.Repository.Workspace}"/>
|
<Grid Grid.Row="0" Height="24" Margin="0,6" HorizontalAlignment="Center" ColumnDefinitions="48,1,48">
|
||||||
<ListBox Grid.Row="1" Classes="page_switcher" Background="Transparent" SelectedIndex="{Binding SelectedViewIndex, Mode=TwoWay}">
|
<Border Grid.Column="0" Grid.ColumnSpan="3"
|
||||||
|
Height="24"
|
||||||
|
BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
|
CornerRadius="12"/>
|
||||||
|
|
||||||
|
<RadioButton Grid.Column="0"
|
||||||
|
Classes="icon_button"
|
||||||
|
Width="48"
|
||||||
|
GroupName="SearchGroup"
|
||||||
|
IsChecked="{Binding !IsSearching, Mode=OneWay}">
|
||||||
|
<Path Width="14" Height="14" Stretch="Fill" HorizontalAlignment="Center" Data="{StaticResource Icons.Home}"/>
|
||||||
|
</RadioButton>
|
||||||
|
|
||||||
|
<Rectangle Grid.Column="1" Width="0.65" HorizontalAlignment="Center" VerticalAlignment="Stretch" Fill="{DynamicResource Brush.Border2}"/>
|
||||||
|
|
||||||
|
<RadioButton Grid.Column="2"
|
||||||
|
Width="48"
|
||||||
|
Classes="icon_button"
|
||||||
|
GroupName="SearchGroup"
|
||||||
|
IsChecked="{Binding IsSearching, Mode=TwoWay}">
|
||||||
|
<Path Width="14" Height="14" Stretch="Fill" HorizontalAlignment="Center" Data="{StaticResource Icons.Search}"/>
|
||||||
|
</RadioButton>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<!-- Dashboard -->
|
||||||
|
<Grid Grid.Row="1" Margin="0,0,0,8" RowDefinitions="Auto,Auto,28,Auto,28,*,28,Auto,28,Auto,28,Auto" IsVisible="{Binding !IsSearching}">
|
||||||
|
<!-- Page Switcher for Right Panel -->
|
||||||
|
<Border Grid.Row="0" Margin="8,0,4,0" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}" CornerRadius="6">
|
||||||
|
<Border CornerRadius="6" ClipToBounds="True">
|
||||||
|
<ListBox Background="Transparent" SelectedIndex="{Binding SelectedViewIndex, Mode=TwoWay}">
|
||||||
|
<ListBox.Styles>
|
||||||
|
<Style Selector="ListBoxItem">
|
||||||
|
<Setter Property="Height" Value="28"/>
|
||||||
|
<Setter Property="Margin" Value="0"/>
|
||||||
|
<Setter Property="Padding" Value="0"/>
|
||||||
|
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||||
|
<Setter Property="BorderBrush" Value="{DynamicResource Brush.Border2}"/>
|
||||||
|
</Style>
|
||||||
|
<Style Selector="ListBoxItem:nth-last-child(1)">
|
||||||
|
<Setter Property="BorderThickness" Value="0"/>
|
||||||
|
</Style>
|
||||||
|
<Style Selector="ListBoxItem:pointerover /template/ ContentPresenter#PART_ContentPresenter, ListBoxItem:selected /template/ ContentPresenter#PART_ContentPresenter">
|
||||||
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
|
</Style>
|
||||||
|
<Style Selector="ListBoxItem:selected Grid.view_mode">
|
||||||
|
<Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}"/>
|
||||||
|
</Style>
|
||||||
|
</ListBox.Styles>
|
||||||
|
|
||||||
<ListBox.ItemsPanel>
|
<ListBox.ItemsPanel>
|
||||||
<ItemsPanelTemplate>
|
<ItemsPanelTemplate>
|
||||||
<StackPanel Orientation="Vertical"/>
|
<StackPanel Orientation="Vertical"/>
|
||||||
</ItemsPanelTemplate>
|
</ItemsPanelTemplate>
|
||||||
</ListBox.ItemsPanel>
|
</ListBox.ItemsPanel>
|
||||||
|
|
||||||
<ListBoxItem Height="28">
|
<ListBoxItem>
|
||||||
<Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*">
|
<Grid Classes="view_mode" ColumnDefinitions="32,*,Auto,Auto">
|
||||||
<Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Histories}"/>
|
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.Histories}"/>
|
||||||
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Histories}"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Histories}"/>
|
||||||
|
<ToggleButton Grid.Column="2"
|
||||||
|
Classes="layout_direction"
|
||||||
|
Width="32" Height="26"
|
||||||
|
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseTwoColumnsLayoutInHistories, Mode=TwoWay}"
|
||||||
|
ToolTip.Tip="{DynamicResource Text.Histories.DisplayMode}"/>
|
||||||
|
<Button Grid.Column="3" Classes="icon_button" Width="32" Command="{Binding NavigateToCurrentHead}" ToolTip.Tip="{DynamicResource Text.Repository.NavigateToCurrentHead}">
|
||||||
|
<Path Width="14" Height="14" Data="{StaticResource Icons.Target}" Fill="{DynamicResource Brush.FG1}"/>
|
||||||
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ListBoxItem>
|
</ListBoxItem>
|
||||||
|
|
||||||
<ListBoxItem Height="28">
|
<ListBoxItem>
|
||||||
<Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*,Auto">
|
<Grid Classes="view_mode" ColumnDefinitions="32,*,Auto">
|
||||||
<Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Send}"/>
|
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.Send}"/>
|
||||||
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.WorkingCopy}"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.WorkingCopy}"/>
|
||||||
<Border Grid.Column="2"
|
<Border Grid.Column="2"
|
||||||
Margin="6,0"
|
Margin="6,0"
|
||||||
|
@ -141,14 +175,14 @@
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Background="{DynamicResource Brush.Badge}"
|
Background="{DynamicResource Brush.Badge}"
|
||||||
IsVisible="{Binding WorkingCopyChangesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
|
IsVisible="{Binding WorkingCopyChangesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
|
||||||
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding WorkingCopyChangesCount}"/>
|
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding WorkingCopyChangesCount}" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ListBoxItem>
|
</ListBoxItem>
|
||||||
|
|
||||||
<ListBoxItem Height="28">
|
<ListBoxItem>
|
||||||
<Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*,Auto">
|
<Grid Classes="view_mode" ColumnDefinitions="32,*,Auto">
|
||||||
<Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Stashes}"/>
|
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.Stashes}"/>
|
||||||
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Stashes}"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Stashes}"/>
|
||||||
<Border Grid.Column="2"
|
<Border Grid.Column="2"
|
||||||
Margin="6,0"
|
Margin="6,0"
|
||||||
|
@ -157,22 +191,22 @@
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Background="{DynamicResource Brush.Badge}"
|
Background="{DynamicResource Brush.Badge}"
|
||||||
IsVisible="{Binding StashesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
|
IsVisible="{Binding StashesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
|
||||||
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding StashesCount}"/>
|
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding StashesCount}" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ListBoxItem>
|
</ListBoxItem>
|
||||||
</ListBox>
|
</ListBox>
|
||||||
|
</Border>
|
||||||
|
</Border>
|
||||||
|
|
||||||
<!-- Filter Branches -->
|
<!-- Filter Branches -->
|
||||||
<Rectangle Grid.Row="2" Height=".65" HorizontalAlignment="Stretch" VerticalAlignment="Center" Fill="{DynamicResource Brush.Border2}"/>
|
<TextBox Grid.Row="1"
|
||||||
<TextBox Grid.Row="3"
|
|
||||||
Margin="4,2,1,0"
|
|
||||||
Height="24"
|
Height="24"
|
||||||
|
Margin="8,6,4,0"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
CornerRadius="3"
|
CornerRadius="4"
|
||||||
BorderBrush="{DynamicResource Brush.Border2}"
|
BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
Background="{DynamicResource Brush.Contents}"
|
Watermark="{DynamicResource Text.Repository.SearchBranchTag}"
|
||||||
Watermark="{DynamicResource Text.Repository.FilterBranchTip}"
|
|
||||||
Text="{Binding SearchBranchFilter, Mode=TwoWay}"
|
Text="{Binding SearchBranchFilter, Mode=TwoWay}"
|
||||||
VerticalContentAlignment="Center">
|
VerticalContentAlignment="Center">
|
||||||
<TextBox.InnerLeftContent>
|
<TextBox.InnerLeftContent>
|
||||||
|
@ -198,11 +232,11 @@
|
||||||
</TextBox>
|
</TextBox>
|
||||||
|
|
||||||
<!-- Local Branches -->
|
<!-- Local Branches -->
|
||||||
<TextBlock Grid.Row="4" Classes="group_header_label" Text="{DynamicResource Text.Repository.LocalBranches}"/>
|
<TextBlock Grid.Row="2" Classes="group_header_label" Text="{DynamicResource Text.Repository.LocalBranches}"/>
|
||||||
<TreeView Grid.Row="5"
|
<TreeView Grid.Row="3"
|
||||||
x:Name="localBranchTree"
|
x:Name="localBranchTree"
|
||||||
MaxHeight="400"
|
MaxHeight="400"
|
||||||
Margin="4,0,2,0"
|
Margin="8,0,4,0"
|
||||||
SelectionMode="Multiple"
|
SelectionMode="Multiple"
|
||||||
ItemsSource="{Binding LocalBranchTrees}"
|
ItemsSource="{Binding LocalBranchTrees}"
|
||||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||||
|
@ -250,7 +284,7 @@
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Name}" Classes="monospace" FontWeight="{Binding IsCurrent, Converter={x:Static c:BoolConverters.BoldIfTrue}}"/>
|
<TextBlock Grid.Column="1" Text="{Binding Name}" Classes="monospace" FontWeight="{Binding IsCurrent, Converter={x:Static c:BoolConverters.BoldIfTrue}}"/>
|
||||||
|
|
||||||
<Border Grid.Column="2" Margin="8,0" Height="18" CornerRadius="9" VerticalAlignment="Center" Background="{DynamicResource Brush.Badge}" IsVisible="{Binding IsUpstreamTrackStatusVisible}">
|
<Border Grid.Column="2" Margin="8,0" Height="18" CornerRadius="9" VerticalAlignment="Center" Background="{DynamicResource Brush.Badge}" IsVisible="{Binding IsUpstreamTrackStatusVisible}">
|
||||||
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding UpstreamTrackStatus}"/>
|
<TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding UpstreamTrackStatus}" Foreground="{DynamicResource Brush.BadgeFG}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<ToggleButton Grid.Column="3"
|
<ToggleButton Grid.Column="3"
|
||||||
|
@ -267,15 +301,15 @@
|
||||||
</TreeView>
|
</TreeView>
|
||||||
|
|
||||||
<!-- Remotes -->
|
<!-- Remotes -->
|
||||||
<Grid Grid.Row="6" ColumnDefinitions="*,Auto">
|
<Grid Grid.Row="4" ColumnDefinitions="*,Auto">
|
||||||
<TextBlock Grid.Column="0" Classes="group_header_label" Text="{DynamicResource Text.Repository.Remotes}"/>
|
<TextBlock Grid.Column="0" Classes="group_header_label" Text="{DynamicResource Text.Repository.Remotes}"/>
|
||||||
<Button Grid.Column="1" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding AddRemote}" ToolTip.Tip="{DynamicResource Text.Repository.Remotes.Add}">
|
<Button Grid.Column="1" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding AddRemote}" ToolTip.Tip="{DynamicResource Text.Repository.Remotes.Add}">
|
||||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Remote.Add}"/>
|
<Path Width="12" Height="12" Data="{StaticResource Icons.Remote.Add}"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
<TreeView Grid.Row="7"
|
<TreeView Grid.Row="5"
|
||||||
x:Name="remoteBranchTree"
|
x:Name="remoteBranchTree"
|
||||||
Margin="4,0,2,0"
|
Margin="8,0,4,0"
|
||||||
SelectionMode="Multiple"
|
SelectionMode="Multiple"
|
||||||
ItemsSource="{Binding RemoteBranchTrees}"
|
ItemsSource="{Binding RemoteBranchTrees}"
|
||||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||||
|
@ -330,21 +364,20 @@
|
||||||
</TreeView>
|
</TreeView>
|
||||||
|
|
||||||
<!-- Tags -->
|
<!-- Tags -->
|
||||||
<ToggleButton Grid.Row="8" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}">
|
<ToggleButton Grid.Row="6" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}">
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||||
<TextBlock Grid.Column="0" Classes="group_header_label" Margin="4,0,0,0" Text="{DynamicResource Text.Repository.Tags}"/>
|
<TextBlock Grid.Column="0" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Tags}"/>
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Tags, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
<TextBlock Grid.Column="1" Text="{Binding Tags, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
||||||
<Button Grid.Column="2" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding CreateNewTag}" ToolTip.Tip="{DynamicResource Text.Repository.Tags.Add}">
|
<Button Grid.Column="2" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding CreateNewTag}" ToolTip.Tip="{DynamicResource Text.Repository.Tags.Add}">
|
||||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Tag.Add}"/>
|
<Path Width="12" Height="12" Data="{StaticResource Icons.Tag.Add}"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ToggleButton>
|
</ToggleButton>
|
||||||
<DataGrid Grid.Row="9"
|
<DataGrid Grid.Row="7"
|
||||||
x:Name="tagsList"
|
x:Name="tagsList"
|
||||||
MaxHeight="200"
|
Margin="8,0,4,0"
|
||||||
Margin="4,0,2,0"
|
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
ItemsSource="{Binding Tags}"
|
ItemsSource="{Binding VisibleTags}"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
CanUserReorderColumns="False"
|
CanUserReorderColumns="False"
|
||||||
CanUserResizeColumns="False"
|
CanUserResizeColumns="False"
|
||||||
|
@ -357,7 +390,8 @@
|
||||||
VerticalScrollBarVisibility="Auto"
|
VerticalScrollBarVisibility="Auto"
|
||||||
IsVisible="{Binding IsTagGroupExpanded, Mode=OneWay}"
|
IsVisible="{Binding IsTagGroupExpanded, Mode=OneWay}"
|
||||||
SelectionChanged="OnTagDataGridSelectionChanged"
|
SelectionChanged="OnTagDataGridSelectionChanged"
|
||||||
ContextRequested="OnTagContextRequested">
|
ContextRequested="OnTagContextRequested"
|
||||||
|
PropertyChanged="OnTagPropertyChanged">
|
||||||
<DataGrid.Styles>
|
<DataGrid.Styles>
|
||||||
<Style Selector="DataGridRow">
|
<Style Selector="DataGridRow">
|
||||||
<Setter Property="CornerRadius" Value="4" />
|
<Setter Property="CornerRadius" Value="4" />
|
||||||
|
@ -389,7 +423,7 @@
|
||||||
<DataGridTemplateColumn Header="ICON">
|
<DataGridTemplateColumn Header="ICON">
|
||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate x:DataType="{x:Type m:Tag}">
|
<DataTemplate x:DataType="{x:Type m:Tag}">
|
||||||
<Path Width="10" Height="10" Margin="16,0,8,0" Data="{StaticResource Icons.Tag}"/>
|
<Path Width="10" Height="10" Margin="8,0" Data="{StaticResource Icons.Tag}"/>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
</DataGridTemplateColumn>
|
</DataGridTemplateColumn>
|
||||||
|
@ -418,9 +452,9 @@
|
||||||
</DataGrid>
|
</DataGrid>
|
||||||
|
|
||||||
<!-- Submodules -->
|
<!-- Submodules -->
|
||||||
<ToggleButton Grid.Row="10" Classes="group_expander" IsChecked="{Binding IsSubmoduleGroupExpanded, Mode=TwoWay}">
|
<ToggleButton Grid.Row="8" Classes="group_expander" IsChecked="{Binding IsSubmoduleGroupExpanded, Mode=TwoWay}">
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
|
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
|
||||||
<TextBlock Grid.Column="0" Classes="group_header_label" Margin="4,0,0,0" Text="{DynamicResource Text.Repository.Submodules}"/>
|
<TextBlock Grid.Column="0" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Submodules}"/>
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Submodules, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
<TextBlock Grid.Column="1" Text="{Binding Submodules, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
||||||
<Button Grid.Column="2"
|
<Button Grid.Column="2"
|
||||||
Classes="icon_button"
|
Classes="icon_button"
|
||||||
|
@ -429,7 +463,7 @@
|
||||||
Command="{Binding UpdateSubmodules}"
|
Command="{Binding UpdateSubmodules}"
|
||||||
IsVisible="{Binding Submodules, Converter={x:Static c:ListConverters.IsNotNullOrEmpty}}"
|
IsVisible="{Binding Submodules, Converter={x:Static c:ListConverters.IsNotNullOrEmpty}}"
|
||||||
ToolTip.Tip="{DynamicResource Text.Repository.Submodules.Update}">
|
ToolTip.Tip="{DynamicResource Text.Repository.Submodules.Update}">
|
||||||
<Path x:Name="iconSubmoduleUpdate" Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
|
<Path Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
|
||||||
</Button>
|
</Button>
|
||||||
<Button Grid.Column="3"
|
<Button Grid.Column="3"
|
||||||
Classes="icon_button"
|
Classes="icon_button"
|
||||||
|
@ -441,9 +475,9 @@
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ToggleButton>
|
</ToggleButton>
|
||||||
<DataGrid Grid.Row="11"
|
<DataGrid Grid.Row="9"
|
||||||
MaxHeight="200"
|
MaxHeight="200"
|
||||||
Margin="4,0,6,0"
|
Margin="8,0,4,0"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
ItemsSource="{Binding Submodules}"
|
ItemsSource="{Binding Submodules}"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
|
@ -481,7 +515,7 @@
|
||||||
<DataGridTemplateColumn Header="ICON">
|
<DataGridTemplateColumn Header="ICON">
|
||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Path Width="10" Height="10" Margin="16,0,8,0" Data="{StaticResource Icons.Submodule}"/>
|
<Path Width="10" Height="10" Margin="8,0" Data="{StaticResource Icons.Submodule}"/>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
</DataGridTemplateColumn>
|
</DataGridTemplateColumn>
|
||||||
|
@ -489,7 +523,99 @@
|
||||||
<DataGridTemplateColumn Width="*" Header="NAME">
|
<DataGridTemplateColumn Width="*" Header="NAME">
|
||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<TextBlock Text="{Binding}" ClipToBounds="True" Classes="monospace"/>
|
<Border Padding="0,0,4,0">
|
||||||
|
<TextBlock Text="{Binding}" ClipToBounds="True" Classes="monospace" TextTrimming="CharacterEllipsis"/>
|
||||||
|
</Border>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
|
||||||
|
<!-- Worktrees -->
|
||||||
|
<ToggleButton Grid.Row="10" Classes="group_expander" IsChecked="{Binding IsWorktreeGroupExpanded, Mode=TwoWay}">
|
||||||
|
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
|
||||||
|
<TextBlock Grid.Column="0" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Worktrees}"/>
|
||||||
|
<TextBlock Grid.Column="1" Text="{Binding Worktrees, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
||||||
|
<Button Grid.Column="2"
|
||||||
|
Classes="icon_button"
|
||||||
|
Width="14"
|
||||||
|
Margin="8,0"
|
||||||
|
Command="{Binding PruneWorktrees}"
|
||||||
|
IsVisible="{Binding Worktrees, Converter={x:Static c:ListConverters.IsNotNullOrEmpty}}"
|
||||||
|
ToolTip.Tip="{DynamicResource Text.Repository.Worktrees.Prune}">
|
||||||
|
<Path x:Name="icon" Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
|
||||||
|
</Button>
|
||||||
|
<Button Grid.Column="3"
|
||||||
|
Classes="icon_button"
|
||||||
|
Width="14"
|
||||||
|
Margin="0,0,8,0"
|
||||||
|
Command="{Binding AddWorktree}"
|
||||||
|
ToolTip.Tip="{DynamicResource Text.Repository.Worktrees.Add}">
|
||||||
|
<Path Width="12" Height="12" Data="{StaticResource Icons.Worktree.Add}"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</ToggleButton>
|
||||||
|
<DataGrid Grid.Row="11"
|
||||||
|
MaxHeight="200"
|
||||||
|
Margin="8,0,4,0"
|
||||||
|
Background="Transparent"
|
||||||
|
ItemsSource="{Binding Worktrees}"
|
||||||
|
SelectionMode="Single"
|
||||||
|
CanUserReorderColumns="False"
|
||||||
|
CanUserResizeColumns="False"
|
||||||
|
CanUserSortColumns="False"
|
||||||
|
IsReadOnly="True"
|
||||||
|
HeadersVisibility="None"
|
||||||
|
Focusable="False"
|
||||||
|
RowHeight="26"
|
||||||
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
|
VerticalScrollBarVisibility="Auto"
|
||||||
|
ContextRequested="OnWorktreeContextRequested"
|
||||||
|
DoubleTapped="OnDoubleTappedWorktree"
|
||||||
|
IsVisible="{Binding IsWorktreeGroupExpanded, Mode=OneWay}">
|
||||||
|
<DataGrid.Styles>
|
||||||
|
<Style Selector="DataGridRow">
|
||||||
|
<Setter Property="CornerRadius" Value="4" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style Selector="DataGridRow /template/ Border#RowBorder">
|
||||||
|
<Setter Property="ClipToBounds" Value="True" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style Selector="DataGridRow:pointerover /template/ Rectangle#BackgroundRectangle">
|
||||||
|
<Setter Property="Fill" Value="{DynamicResource Brush.AccentHovered}" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style Selector="DataGridRow:selected /template/ Rectangle#BackgroundRectangle">
|
||||||
|
<Setter Property="Fill" Value="{DynamicResource Brush.Accent}" />
|
||||||
|
</Style>
|
||||||
|
</DataGrid.Styles>
|
||||||
|
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTemplateColumn Header="ICON">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Path Width="10" Height="10" Margin="8,0,0,0" Data="{StaticResource Icons.Worktree}"/>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Width="*" Header="FullPath">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Classes="monospace" Margin="8,0,0,0" TextTrimming="CharacterEllipsis">
|
||||||
|
<Run Text="{Binding FullPath}"/>
|
||||||
|
<Run Text="{Binding Name}" Foreground="{DynamicResource Brush.FG2}"/>
|
||||||
|
</TextBlock>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Header="FullPath">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Path Width="10" Height="10" Margin="4,0,8,0" Data="{StaticResource Icons.Lock}" Fill="{DynamicResource Brush.FG2}" IsVisible="{Binding IsLocked}"/>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
</DataGridTemplateColumn>
|
</DataGridTemplateColumn>
|
||||||
|
@ -497,12 +623,11 @@
|
||||||
</DataGrid>
|
</DataGrid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- Left Search Mode -->
|
<!-- Commit Search Panel -->
|
||||||
<Grid Grid.Column="0" RowDefinitions="32,32,*" IsVisible="{Binding IsSearching}" PropertyChanged="OnSearchCommitPanelPropertyChanged">
|
<Grid Grid.Row="1" RowDefinitions="Auto,32,*" Margin="8,0,4,8" IsVisible="{Binding IsSearching}" PropertyChanged="OnSearchCommitPanelPropertyChanged">
|
||||||
<!-- Search -->
|
<!-- Search Input Box -->
|
||||||
<TextBox Grid.Row="0"
|
<TextBox Grid.Row="0"
|
||||||
x:Name="txtSearchCommitsBox"
|
x:Name="txtSearchCommitsBox"
|
||||||
Margin="4,2,4,0"
|
|
||||||
Height="24"
|
Height="24"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
BorderBrush="{DynamicResource Brush.Border2}"
|
BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
|
@ -534,7 +659,7 @@
|
||||||
</TextBox.InnerRightContent>
|
</TextBox.InnerRightContent>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
|
|
||||||
<Grid Grid.Row="1" ColumnDefinitions="Auto,*" Margin="4,0">
|
<Grid Grid.Row="1" ColumnDefinitions="Auto,*">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Repository.Search.By}"
|
Text="{DynamicResource Text.Repository.Search.By}"
|
||||||
Foreground="{DynamicResource Brush.FG2}"
|
Foreground="{DynamicResource Brush.FG2}"
|
||||||
|
@ -568,7 +693,6 @@
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
BorderBrush="{DynamicResource Brush.Border2}"
|
BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
Background="{DynamicResource Brush.Contents}"
|
Background="{DynamicResource Brush.Contents}"
|
||||||
Margin="4,0,4,4"
|
|
||||||
CornerRadius="4"
|
CornerRadius="4"
|
||||||
HorizontalScrollBarVisibility="Disabled"
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
VerticalScrollBarVisibility="Auto"
|
VerticalScrollBarVisibility="Auto"
|
||||||
|
@ -605,6 +729,7 @@
|
||||||
Fill="{DynamicResource Brush.FG2}"
|
Fill="{DynamicResource Brush.FG2}"
|
||||||
IsVisible="{Binding SearchedCommits.Count, Converter={x:Static c:IntConverters.IsZero}}"/>
|
IsVisible="{Binding SearchedCommits.Count, Converter={x:Static c:IntConverters.IsZero}}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
<!-- Splitter -->
|
<!-- Splitter -->
|
||||||
<GridSplitter Grid.Column="1"
|
<GridSplitter Grid.Column="1"
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
|
@ -279,6 +280,18 @@ namespace SourceGit.Views
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnTagPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Property == DataGrid.ItemsSourceProperty && DataContext is ViewModels.Repository vm)
|
||||||
|
{
|
||||||
|
if (vm.VisibleTags == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var desiredHeight = tagsList.RowHeight * vm.VisibleTags.Count;
|
||||||
|
tagsList.Height = Math.Min(200, desiredHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnToggleFilter(object sender, RoutedEventArgs e)
|
private void OnToggleFilter(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is ToggleButton toggle)
|
if (sender is ToggleButton toggle)
|
||||||
|
@ -315,6 +328,40 @@ namespace SourceGit.Views
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnDoubleTappedSubmodule(object sender, TappedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
|
||||||
|
{
|
||||||
|
var submodule = datagrid.SelectedItem as string;
|
||||||
|
(DataContext as ViewModels.Repository).OpenSubmodule(submodule);
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnWorktreeContextRequested(object sender, ContextRequestedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
|
||||||
|
{
|
||||||
|
var worktree = datagrid.SelectedItem as Models.Worktree;
|
||||||
|
var menu = repo.CreateContextMenuForWorktree(worktree);
|
||||||
|
datagrid.OpenContextMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDoubleTappedWorktree(object sender, TappedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
|
||||||
|
{
|
||||||
|
var worktree = datagrid.SelectedItem as Models.Worktree;
|
||||||
|
(DataContext as ViewModels.Repository).OpenWorktree(worktree);
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void CollectBranchesFromNode(List<Models.Branch> outs, ViewModels.BranchTreeNode node)
|
private void CollectBranchesFromNode(List<Models.Branch> outs, ViewModels.BranchTreeNode node)
|
||||||
{
|
{
|
||||||
if (node == null || node.IsRemote)
|
if (node == null || node.IsRemote)
|
||||||
|
@ -332,16 +379,5 @@ namespace SourceGit.Views
|
||||||
outs.Add(b);
|
outs.Add(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDoubleTappedSubmodule(object sender, TappedEventArgs e)
|
|
||||||
{
|
|
||||||
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
|
|
||||||
{
|
|
||||||
var submodule = datagrid.SelectedItem as string;
|
|
||||||
(DataContext as ViewModels.Repository).OpenSubmodule(submodule);
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Reset}"/>
|
Text="{DynamicResource Text.Reset}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="150,*">
|
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||||
Margin="0,0,8,0"
|
Margin="0,0,8,0"
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
Text="{DynamicResource Text.Reset.MoveTo}"/>
|
Text="{DynamicResource Text.Reset.MoveTo}"/>
|
||||||
<Grid Grid.Row="1" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
|
<Grid Grid.Row="1" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
|
||||||
<Path Grid.Column="0" Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
<Path Grid.Column="0" Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
||||||
<TextBlock Grid.Column="1" Text="{Binding To.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
<TextBlock Grid.Column="1" Classes="monospace" Text="{Binding To.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
||||||
<TextBlock Grid.Column="2" Text="{Binding To.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
|
<TextBlock Grid.Column="2" Text="{Binding To.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
|
|
@ -12,28 +12,17 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Reword}"/>
|
Text="{DynamicResource Text.Reword}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32,32" ColumnDefinitions="100,*">
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
|
||||||
Margin="0,0,8,0"
|
|
||||||
Text="{DynamicResource Text.Reword.On}"/>
|
|
||||||
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
|
|
||||||
<Path Grid.Column="0" Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Head.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
|
||||||
<TextBlock Grid.Column="2" Text="{Binding Head.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<TextBlock Grid.Row="1" Grid.Column="0"
|
<StackPanel Margin="8,16,8,0" Orientation="Horizontal" HorizontalAlignment="Right">
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
<Path Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
||||||
Margin="0,0,8,0"
|
<TextBlock Classes="monospace" Text="{Binding Head.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
||||||
Text="{DynamicResource Text.Reword.Message}"/>
|
</StackPanel>
|
||||||
<TextBox Grid.Row="1" Grid.RowSpan="3" Grid.Column="1"
|
|
||||||
Margin="0,4,0,0"
|
<v:CommitMessageTextBox Height="120" Margin="8,5,8,0" Text="{Binding Message, Mode=TwoWay}"/>
|
||||||
CornerRadius="2"
|
|
||||||
AcceptsReturn="True"
|
<TextBlock Margin="8"
|
||||||
VerticalContentAlignment="Top"
|
Text="{DynamicResource Text.Reword.Tip}"
|
||||||
Text="{Binding Message, Mode=TwoWay}"
|
TextWrapping="Wrap"
|
||||||
v:AutoFocusBehaviour.IsEnabled="True"/>
|
Foreground="{DynamicResource Brush.FG2}"/>
|
||||||
</Grid>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
|
@ -12,38 +12,38 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Squash}"/>
|
Text="{DynamicResource Text.Squash}"/>
|
||||||
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32,32,32" ColumnDefinitions="100,*">
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
<Grid Margin="0,18,0,0" ColumnDefinitions="Auto,Auto,Auto,Auto,*">
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
<Border Grid.Column="0" Background="{DynamicResource Brush.Accent}" CornerRadius="4">
|
||||||
Margin="0,0,8,0"
|
<TextBlock Text="HEAD" Classes="monospace" Margin="4,0" Foreground="#FFDDDDDD"/>
|
||||||
Text="{DynamicResource Text.Squash.Head}"/>
|
</Border>
|
||||||
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
|
|
||||||
<Path Grid.Column="0" Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
<Path Grid.Column="1"
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Head.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
Width="14" Height="14"
|
||||||
<TextBlock Grid.Column="2" Text="{Binding Head.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
|
Margin="12,0,0,0"
|
||||||
|
Fill="{DynamicResource Brush.FG1}"
|
||||||
|
Data="{StaticResource Icons.Down}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
RenderTransformOrigin="50%,50%"
|
||||||
|
RenderTransform="rotate(270deg)"/>
|
||||||
|
|
||||||
|
<Path Grid.Column="2"
|
||||||
|
Margin="6,6,8,0"
|
||||||
|
Width="14" Height="14"
|
||||||
|
Fill="{DynamicResource Brush.FG1}"
|
||||||
|
Data="{StaticResource Icons.Commit}"/>
|
||||||
|
<TextBlock Grid.Column="3"
|
||||||
|
Classes="monospace"
|
||||||
|
Text="{Binding Parent.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
|
||||||
|
Foreground="DarkOrange"/>
|
||||||
|
<TextBlock Grid.Column="4" Margin="8,0,0,0" Text="{Binding Parent.Subject}" TextTrimming="CharacterEllipsis"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TextBlock Grid.Row="1" Grid.Column="0"
|
<v:CommitMessageTextBox Height="120" Margin="0,4,0,0" Text="{Binding Message, Mode=TwoWay}"/>
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
|
||||||
Margin="0,0,8,0"
|
|
||||||
Text="{DynamicResource Text.Squash.To}"/>
|
|
||||||
<Grid Grid.Row="1" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
|
|
||||||
<Path Grid.Column="0" Margin="0,6,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
|
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Parent.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
|
|
||||||
<TextBlock Grid.Column="2" Text="{Binding Parent.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<TextBlock Grid.Row="2" Grid.Column="0"
|
<TextBlock Margin="0,6,0,0"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
Text="{DynamicResource Text.Reword.Tip}"
|
||||||
Margin="0,0,8,0"
|
TextWrapping="Wrap"
|
||||||
Text="{DynamicResource Text.Squash.Message}"/>
|
Foreground="{DynamicResource Brush.FG2}"/>
|
||||||
<TextBox Grid.Row="2" Grid.RowSpan="3" Grid.Column="1"
|
|
||||||
Margin="0,4,0,0"
|
|
||||||
CornerRadius="2"
|
|
||||||
AcceptsReturn="True"
|
|
||||||
VerticalContentAlignment="Top"
|
|
||||||
Text="{Binding Message, Mode=TwoWay}"
|
|
||||||
v:AutoFocusBehaviour.IsEnabled="True"/>
|
|
||||||
</Grid>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<TextBlock FontSize="18"
|
<TextBlock FontSize="18"
|
||||||
Classes="bold"
|
Classes="bold"
|
||||||
Text="{DynamicResource Text.Stash.Title}"/>
|
Text="{DynamicResource Text.Stash.Title}"/>
|
||||||
<Grid Margin="8,16,0,0" RowDefinitions="32,Auto" ColumnDefinitions="Auto,*">
|
<Grid Margin="8,16,0,0" RowDefinitions="32,Auto" ColumnDefinitions="120,*">
|
||||||
<TextBlock Grid.Column="0" HorizontalAlignment="Right" Margin="8,0" Text="{DynamicResource Text.Stash.Message}"/>
|
<TextBlock Grid.Column="0" HorizontalAlignment="Right" Margin="8,0" Text="{DynamicResource Text.Stash.Message}"/>
|
||||||
<TextBox Grid.Column="1"
|
<TextBox Grid.Column="1"
|
||||||
Height="26"
|
Height="26"
|
||||||
|
|
|
@ -17,10 +17,9 @@
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<!-- Left -->
|
<!-- Left -->
|
||||||
<Grid Grid.Column="0" RowDefinitions="28,*,28,*">
|
<Grid Grid.Column="0" RowDefinitions="28,36,*,28,*">
|
||||||
<!-- Stash Bar -->
|
<!-- Stash Bar -->
|
||||||
<Border Grid.Row="0" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource Brush.Border0}">
|
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,*,Auto">
|
||||||
<Grid ColumnDefinitions="Auto,Auto,Auto,*,Auto">
|
|
||||||
<Path Grid.Column="0" Margin="8,0,0,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG2}" Data="{StaticResource Icons.Stashes}"/>
|
<Path Grid.Column="0" Margin="8,0,0,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG2}" Data="{StaticResource Icons.Stashes}"/>
|
||||||
<TextBlock Grid.Column="1" Text="{DynamicResource Text.Stashes.Stashes}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold" Margin="8,0,0,0"/>
|
<TextBlock Grid.Column="1" Text="{DynamicResource Text.Stashes.Stashes}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold" Margin="8,0,0,0"/>
|
||||||
<TextBlock Grid.Column="2" Text="{Binding Stashes, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
<TextBlock Grid.Column="2" Text="{Binding Stashes, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
|
||||||
|
@ -33,12 +32,44 @@
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Clean}"/>
|
<Path Width="14" Height="14" Data="{StaticResource Icons.Clean}"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<!-- Search Bar -->
|
||||||
|
<Border Grid.Row="1" BorderThickness="0,1" BorderBrush="{DynamicResource Brush.Border0}">
|
||||||
|
<TextBox Grid.Row="1"
|
||||||
|
Height="24"
|
||||||
|
Margin="4,0"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="12"
|
||||||
|
Text="{Binding SearchFilter, Mode=TwoWay}"
|
||||||
|
BorderBrush="{DynamicResource Brush.Border2}"
|
||||||
|
VerticalContentAlignment="Center">
|
||||||
|
<TextBox.InnerLeftContent>
|
||||||
|
<Path Width="14" Height="14"
|
||||||
|
Margin="6,0,0,0"
|
||||||
|
Fill="{DynamicResource Brush.FG2}"
|
||||||
|
Data="{StaticResource Icons.Search}"/>
|
||||||
|
</TextBox.InnerLeftContent>
|
||||||
|
|
||||||
|
<TextBox.InnerRightContent>
|
||||||
|
<Button Classes="icon_button"
|
||||||
|
Width="16"
|
||||||
|
Margin="0,0,6,0"
|
||||||
|
Command="{Binding ClearSearchFilter}"
|
||||||
|
IsVisible="{Binding SearchFilter, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
||||||
|
HorizontalAlignment="Right">
|
||||||
|
<Path Width="14" Height="14"
|
||||||
|
Margin="0,1,0,0"
|
||||||
|
Fill="{DynamicResource Brush.FG1}"
|
||||||
|
Data="{StaticResource Icons.Clear}"/>
|
||||||
|
</Button>
|
||||||
|
</TextBox.InnerRightContent>
|
||||||
|
</TextBox>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- Stash List -->
|
<!-- Stash List -->
|
||||||
<DataGrid Grid.Row="1"
|
<DataGrid Grid.Row="2"
|
||||||
Background="{DynamicResource Brush.Contents}"
|
Background="{DynamicResource Brush.Contents}"
|
||||||
ItemsSource="{Binding Stashes}"
|
ItemsSource="{Binding VisibleStashes}"
|
||||||
SelectedItem="{Binding SelectedStash, Mode=TwoWay}"
|
SelectedItem="{Binding SelectedStash, Mode=TwoWay}"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
CanUserReorderColumns="False"
|
CanUserReorderColumns="False"
|
||||||
|
@ -71,7 +102,7 @@
|
||||||
</DataGrid>
|
</DataGrid>
|
||||||
|
|
||||||
<!-- Changes Bar -->
|
<!-- Changes Bar -->
|
||||||
<Border Grid.Row="2" BorderThickness="0,1" BorderBrush="{DynamicResource Brush.Border0}">
|
<Border Grid.Row="3" BorderThickness="0,1" BorderBrush="{DynamicResource Brush.Border0}">
|
||||||
<Grid ColumnDefinitions="Auto,Auto,*">
|
<Grid ColumnDefinitions="Auto,Auto,*">
|
||||||
<Path Grid.Column="0" Margin="8,0,0,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG2}" Data="{StaticResource Icons.File}"/>
|
<Path Grid.Column="0" Margin="8,0,0,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG2}" Data="{StaticResource Icons.File}"/>
|
||||||
<TextBlock Grid.Column="1" Text="{DynamicResource Text.Stashes.Changes}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold" Margin="8,0,0,0"/>
|
<TextBlock Grid.Column="1" Text="{DynamicResource Text.Stashes.Changes}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold" Margin="8,0,0,0"/>
|
||||||
|
@ -80,7 +111,7 @@
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- View Changes -->
|
<!-- View Changes -->
|
||||||
<DataGrid Grid.Row="3"
|
<DataGrid Grid.Row="4"
|
||||||
Background="{DynamicResource Brush.Contents}"
|
Background="{DynamicResource Brush.Contents}"
|
||||||
ItemsSource="{Binding Changes}"
|
ItemsSource="{Binding Changes}"
|
||||||
SelectedItem="{Binding SelectedChange, Mode=TwoWay}"
|
SelectedItem="{Binding SelectedChange, Mode=TwoWay}"
|
||||||
|
|
|
@ -22,6 +22,15 @@
|
||||||
<Button Classes="icon_button" Width="32" Command="{Binding OpenTerminal}" ToolTip.Tip="{DynamicResource Text.Welcome.OpenTerminal}">
|
<Button Classes="icon_button" Width="32" Command="{Binding OpenTerminal}" ToolTip.Tip="{DynamicResource Text.Welcome.OpenTerminal}">
|
||||||
<Path Width="13" Height="13" Data="{StaticResource Icons.Terminal}"/>
|
<Path Width="13" Height="13" Data="{StaticResource Icons.Terminal}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
<Rectangle Width="1" Height="16"
|
||||||
|
Margin="4,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Fill="{DynamicResource Brush.Border2}"/>
|
||||||
|
|
||||||
|
<Button Classes="icon_button" Width="32" Command="{Binding AddRootNode}" ToolTip.Tip="{DynamicResource Text.Welcome.AddRootFolder}">
|
||||||
|
<Path Width="14" Height="14" Margin="0,2,0,0" Data="{StaticResource Icons.Folder.Add}"/>
|
||||||
|
</Button>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,14 @@
|
||||||
BorderBrush="{DynamicResource Brush.Border0}"/>
|
BorderBrush="{DynamicResource Brush.Border0}"/>
|
||||||
|
|
||||||
<!-- Right -->
|
<!-- Right -->
|
||||||
<Grid Grid.Column="2" Margin="0,4,4,4" RowDefinitions="*,4,128,36">
|
<Grid Grid.Column="2" Margin="0,4,4,4">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="*" MinHeight="400"/>
|
||||||
|
<RowDefinition Height="4"/>
|
||||||
|
<RowDefinition Height="128" MinHeight="100"/>
|
||||||
|
<RowDefinition Height="36"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<!-- Select Change Detail -->
|
<!-- Select Change Detail -->
|
||||||
<Grid Grid.Row="0">
|
<Grid Grid.Row="0">
|
||||||
<Border BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}">
|
<Border BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}">
|
||||||
|
|
Loading…
Reference in a new issue