mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-21 04:04:59 +00:00
style: add .editorconfig for code formatting. see issu #25
This commit is contained in:
parent
a8eeea4f78
commit
18aaa0a143
225 changed files with 7781 additions and 3911 deletions
|
@ -1,57 +1,72 @@
|
|||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Platform.Storage;
|
||||
using Avalonia.Threading;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.ViewModels {
|
||||
public class ConflictContext {
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Platform.Storage;
|
||||
using Avalonia.Threading;
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
public class ConflictContext
|
||||
{
|
||||
public Models.Change Change { get; set; }
|
||||
}
|
||||
|
||||
public class WorkingCopy : ObservableObject {
|
||||
public bool IsStaging {
|
||||
public class WorkingCopy : ObservableObject
|
||||
{
|
||||
public bool IsStaging
|
||||
{
|
||||
get => _isStaging;
|
||||
private set => SetProperty(ref _isStaging, value);
|
||||
}
|
||||
|
||||
public bool IsUnstaging {
|
||||
public bool IsUnstaging
|
||||
{
|
||||
get => _isUnstaging;
|
||||
private set => SetProperty(ref _isUnstaging, value);
|
||||
}
|
||||
|
||||
public bool IsCommitting {
|
||||
get => _isCommitting;
|
||||
public bool IsCommitting
|
||||
{
|
||||
get => _isCommitting;
|
||||
private set => SetProperty(ref _isCommitting, value);
|
||||
}
|
||||
|
||||
public bool UseAmend {
|
||||
public bool UseAmend
|
||||
{
|
||||
get => _useAmend;
|
||||
set => SetProperty(ref _useAmend, value);
|
||||
}
|
||||
|
||||
public List<Models.Change> Unstaged {
|
||||
public List<Models.Change> Unstaged
|
||||
{
|
||||
get => _unstaged;
|
||||
private set => SetProperty(ref _unstaged, value);
|
||||
}
|
||||
|
||||
public List<Models.Change> Staged {
|
||||
public List<Models.Change> Staged
|
||||
{
|
||||
get => _staged;
|
||||
private set => SetProperty(ref _staged, value);
|
||||
}
|
||||
|
||||
public int Count {
|
||||
public int Count
|
||||
{
|
||||
get => _count;
|
||||
}
|
||||
|
||||
public Models.Change SelectedUnstagedChange {
|
||||
public Models.Change SelectedUnstagedChange
|
||||
{
|
||||
get => _selectedUnstagedChange;
|
||||
set {
|
||||
if (SetProperty(ref _selectedUnstagedChange, value) && value != null) {
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedUnstagedChange, value) && value != null)
|
||||
{
|
||||
SelectedStagedChange = null;
|
||||
SelectedStagedTreeNode = null;
|
||||
SetDetail(value, true);
|
||||
|
@ -59,10 +74,13 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public Models.Change SelectedStagedChange {
|
||||
public Models.Change SelectedStagedChange
|
||||
{
|
||||
get => _selectedStagedChange;
|
||||
set {
|
||||
if (SetProperty(ref _selectedStagedChange, value) && value != null) {
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedStagedChange, value) && value != null)
|
||||
{
|
||||
SelectedUnstagedChange = null;
|
||||
SelectedUnstagedTreeNode = null;
|
||||
SetDetail(value, false);
|
||||
|
@ -70,28 +88,37 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public List<FileTreeNode> UnstagedTree {
|
||||
get => _unstagedTree;
|
||||
public List<FileTreeNode> UnstagedTree
|
||||
{
|
||||
get => _unstagedTree;
|
||||
private set => SetProperty(ref _unstagedTree, value);
|
||||
}
|
||||
|
||||
public List<FileTreeNode> StagedTree {
|
||||
public List<FileTreeNode> StagedTree
|
||||
{
|
||||
get => _stagedTree;
|
||||
private set => SetProperty(ref _stagedTree, value);
|
||||
}
|
||||
|
||||
public FileTreeNode SelectedUnstagedTreeNode {
|
||||
public FileTreeNode SelectedUnstagedTreeNode
|
||||
{
|
||||
get => _selectedUnstagedTreeNode;
|
||||
set {
|
||||
if (SetProperty(ref _selectedUnstagedTreeNode, value)) {
|
||||
if (value == null) {
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedUnstagedTreeNode, value))
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
SelectedUnstagedChange = null;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedUnstagedChange = value.Backend as Models.Change;
|
||||
SelectedStagedTreeNode = null;
|
||||
SelectedStagedChange = null;
|
||||
|
||||
if (value.IsFolder) {
|
||||
if (value.IsFolder)
|
||||
{
|
||||
SetDetail(null, true);
|
||||
}
|
||||
}
|
||||
|
@ -99,18 +126,25 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public FileTreeNode SelectedStagedTreeNode {
|
||||
public FileTreeNode SelectedStagedTreeNode
|
||||
{
|
||||
get => _selectedStagedTreeNode;
|
||||
set {
|
||||
if (SetProperty(ref _selectedStagedTreeNode, value)) {
|
||||
if (value == null) {
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedStagedTreeNode, value))
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
SelectedStagedChange = null;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedStagedChange = value.Backend as Models.Change;
|
||||
SelectedUnstagedTreeNode = null;
|
||||
SelectedUnstagedChange = null;
|
||||
|
||||
if (value.IsFolder) {
|
||||
if (value.IsFolder)
|
||||
{
|
||||
SetDetail(null, false);
|
||||
}
|
||||
}
|
||||
|
@ -118,21 +152,25 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public object DetailContext {
|
||||
public object DetailContext
|
||||
{
|
||||
get => _detailContext;
|
||||
private set => SetProperty(ref _detailContext, value);
|
||||
}
|
||||
|
||||
public string CommitMessage {
|
||||
public string CommitMessage
|
||||
{
|
||||
get => _commitMessage;
|
||||
set => SetProperty(ref _commitMessage, value);
|
||||
}
|
||||
|
||||
public WorkingCopy(Repository repo) {
|
||||
public WorkingCopy(Repository repo)
|
||||
{
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public void Cleanup() {
|
||||
public void Cleanup()
|
||||
{
|
||||
_repo = null;
|
||||
if (_unstaged != null) _unstaged.Clear();
|
||||
if (_staged != null) _staged.Clear();
|
||||
|
@ -146,36 +184,45 @@ namespace SourceGit.ViewModels {
|
|||
_commitMessage = string.Empty;
|
||||
}
|
||||
|
||||
public bool SetData(List<Models.Change> changes) {
|
||||
public bool SetData(List<Models.Change> changes)
|
||||
{
|
||||
var unstaged = new List<Models.Change>();
|
||||
var staged = new List<Models.Change>();
|
||||
|
||||
|
||||
var viewFile = string.Empty;
|
||||
var lastSelectedIsUnstaged = false;
|
||||
if (_selectedUnstagedChange != null) {
|
||||
if (_selectedUnstagedChange != null)
|
||||
{
|
||||
viewFile = _selectedUnstagedChange.Path;
|
||||
lastSelectedIsUnstaged = true;
|
||||
} else if (_selectedStagedChange != null) {
|
||||
}
|
||||
else if (_selectedStagedChange != null)
|
||||
{
|
||||
viewFile = _selectedStagedChange.Path;
|
||||
}
|
||||
|
||||
var viewChange = null as Models.Change;
|
||||
var hasConflict = false;
|
||||
foreach (var c in changes) {
|
||||
foreach (var c in changes)
|
||||
{
|
||||
if (c.Index == Models.ChangeState.Modified
|
||||
|| c.Index == Models.ChangeState.Added
|
||||
|| c.Index == Models.ChangeState.Deleted
|
||||
|| c.Index == Models.ChangeState.Renamed) {
|
||||
|| c.Index == Models.ChangeState.Renamed)
|
||||
{
|
||||
staged.Add(c);
|
||||
if (!lastSelectedIsUnstaged && c.Path == viewFile) {
|
||||
if (!lastSelectedIsUnstaged && c.Path == viewFile)
|
||||
{
|
||||
viewChange = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (c.WorkTree != Models.ChangeState.None) {
|
||||
if (c.WorkTree != Models.ChangeState.None)
|
||||
{
|
||||
unstaged.Add(c);
|
||||
hasConflict |= c.IsConflit;
|
||||
if (lastSelectedIsUnstaged && c.Path == viewFile) {
|
||||
if (lastSelectedIsUnstaged && c.Path == viewFile)
|
||||
{
|
||||
viewChange = c;
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +232,8 @@ namespace SourceGit.ViewModels {
|
|||
|
||||
var unstagedTree = FileTreeNode.Build(unstaged);
|
||||
var stagedTree = FileTreeNode.Build(staged);
|
||||
Dispatcher.UIThread.Invoke(() => {
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
_isLoadingData = true;
|
||||
Unstaged = unstaged;
|
||||
Staged = staged;
|
||||
|
@ -194,20 +242,26 @@ namespace SourceGit.ViewModels {
|
|||
_isLoadingData = false;
|
||||
|
||||
// Restore last selection states.
|
||||
if (viewChange != null) {
|
||||
if (viewChange != null)
|
||||
{
|
||||
var scrollOffset = Vector.Zero;
|
||||
if (_detailContext is DiffContext old) scrollOffset = old.SyncScrollOffset;
|
||||
|
||||
if (lastSelectedIsUnstaged) {
|
||||
if (lastSelectedIsUnstaged)
|
||||
{
|
||||
SelectedUnstagedChange = viewChange;
|
||||
SelectedUnstagedTreeNode = FileTreeNode.SelectByPath(_unstagedTree, viewFile);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedStagedChange = viewChange;
|
||||
SelectedStagedTreeNode = FileTreeNode.SelectByPath(_stagedTree, viewFile);
|
||||
}
|
||||
|
||||
if (_detailContext is DiffContext cur) cur.SyncScrollOffset = scrollOffset;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedUnstagedChange = null;
|
||||
SelectedUnstagedTreeNode = null;
|
||||
SelectedStagedChange = null;
|
||||
|
@ -219,28 +273,39 @@ namespace SourceGit.ViewModels {
|
|||
return hasConflict;
|
||||
}
|
||||
|
||||
public void SetDetail(Models.Change change, bool isUnstaged) {
|
||||
public void SetDetail(Models.Change change, bool isUnstaged)
|
||||
{
|
||||
if (_isLoadingData) return;
|
||||
|
||||
if (change == null) {
|
||||
if (change == null)
|
||||
{
|
||||
DetailContext = null;
|
||||
} else if (change.IsConflit) {
|
||||
}
|
||||
else if (change.IsConflit)
|
||||
{
|
||||
DetailContext = new ConflictContext() { Change = change };
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
DetailContext = new DiffContext(_repo.FullPath, new Models.DiffOption(change, isUnstaged));
|
||||
}
|
||||
}
|
||||
|
||||
public async void StageChanges(List<Models.Change> changes) {
|
||||
public async void StageChanges(List<Models.Change> changes)
|
||||
{
|
||||
if (_unstaged.Count == 0 || changes.Count == 0) return;
|
||||
|
||||
SetDetail(null, true);
|
||||
IsStaging = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
if (changes.Count == _unstaged.Count) {
|
||||
if (changes.Count == _unstaged.Count)
|
||||
{
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath).Exec());
|
||||
} else {
|
||||
for (int i = 0; i < changes.Count; i += 10) {
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < changes.Count; i += 10)
|
||||
{
|
||||
var count = Math.Min(10, changes.Count - i);
|
||||
var step = changes.GetRange(i, count);
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, step).Exec());
|
||||
|
@ -251,16 +316,21 @@ namespace SourceGit.ViewModels {
|
|||
IsStaging = false;
|
||||
}
|
||||
|
||||
public async void UnstageChanges(List<Models.Change> changes) {
|
||||
public async void UnstageChanges(List<Models.Change> changes)
|
||||
{
|
||||
if (_staged.Count == 0 || changes.Count == 0) return;
|
||||
|
||||
SetDetail(null, false);
|
||||
IsUnstaging = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
if (changes.Count == _staged.Count) {
|
||||
if (changes.Count == _staged.Count)
|
||||
{
|
||||
await Task.Run(() => new Commands.Reset(_repo.FullPath).Exec());
|
||||
} else {
|
||||
for (int i = 0; i < changes.Count; i += 10) {
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < changes.Count; i += 10)
|
||||
{
|
||||
var count = Math.Min(10, changes.Count - i);
|
||||
var step = changes.GetRange(i, count);
|
||||
await Task.Run(() => new Commands.Reset(_repo.FullPath, step).Exec());
|
||||
|
@ -271,29 +341,43 @@ namespace SourceGit.ViewModels {
|
|||
IsUnstaging = false;
|
||||
}
|
||||
|
||||
public void Discard(List<Models.Change> changes, bool isUnstaged) {
|
||||
if (PopupHost.CanCreatePopup()) {
|
||||
if (isUnstaged) {
|
||||
if (changes.Count == _unstaged.Count && _staged.Count == 0) {
|
||||
public void Discard(List<Models.Change> changes, bool isUnstaged)
|
||||
{
|
||||
if (PopupHost.CanCreatePopup())
|
||||
{
|
||||
if (isUnstaged)
|
||||
{
|
||||
if (changes.Count == _unstaged.Count && _staged.Count == 0)
|
||||
{
|
||||
PopupHost.ShowPopup(new Discard(_repo));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
PopupHost.ShowPopup(new Discard(_repo, changes, true));
|
||||
}
|
||||
} else {
|
||||
if (changes.Count == _staged.Count && _unstaged.Count == 0) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (changes.Count == _staged.Count && _unstaged.Count == 0)
|
||||
{
|
||||
PopupHost.ShowPopup(new Discard(_repo));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
PopupHost.ShowPopup(new Discard(_repo, changes, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async void UseTheirs() {
|
||||
if (_detailContext is ConflictContext ctx) {
|
||||
public async void UseTheirs()
|
||||
{
|
||||
if (_detailContext is ConflictContext ctx)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).File(ctx.Change.Path, true));
|
||||
if (succ) {
|
||||
if (succ)
|
||||
{
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, [ctx.Change]).Exec());
|
||||
}
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
|
@ -301,11 +385,14 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public async void UseMine() {
|
||||
if (_detailContext is ConflictContext ctx) {
|
||||
public async void UseMine()
|
||||
{
|
||||
if (_detailContext is ConflictContext ctx)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).File(ctx.Change.Path, false));
|
||||
if (succ) {
|
||||
if (succ)
|
||||
{
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, [ctx.Change]).Exec());
|
||||
}
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
|
@ -313,13 +400,16 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public async void UseExternalMergeTool() {
|
||||
if (_detailContext is ConflictContext ctx) {
|
||||
public async void UseExternalMergeTool()
|
||||
{
|
||||
if (_detailContext is ConflictContext ctx)
|
||||
{
|
||||
var type = Preference.Instance.ExternalMergeToolType;
|
||||
var exec = Preference.Instance.ExternalMergeToolPath;
|
||||
|
||||
var tool = Models.ExternalMergeTools.Supported.Find(x => x.Type == type);
|
||||
if (tool == null) {
|
||||
if (tool == null)
|
||||
{
|
||||
App.RaiseException(_repo.FullPath, "Invalid merge tool in preference setting!");
|
||||
return;
|
||||
}
|
||||
|
@ -332,18 +422,22 @@ namespace SourceGit.ViewModels {
|
|||
}
|
||||
}
|
||||
|
||||
public async void DoCommit(bool autoPush) {
|
||||
if (!PopupHost.CanCreatePopup()) {
|
||||
public async void DoCommit(bool autoPush)
|
||||
{
|
||||
if (!PopupHost.CanCreatePopup())
|
||||
{
|
||||
App.RaiseException(_repo.FullPath, "Repository has unfinished job! Please wait!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_staged.Count == 0) {
|
||||
if (_staged.Count == 0)
|
||||
{
|
||||
App.RaiseException(_repo.FullPath, "No files added to commit!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_commitMessage)) {
|
||||
if (string.IsNullOrWhiteSpace(_commitMessage))
|
||||
{
|
||||
App.RaiseException(_repo.FullPath, "Commit without message is NOT allowed!");
|
||||
return;
|
||||
}
|
||||
|
@ -354,11 +448,13 @@ namespace SourceGit.ViewModels {
|
|||
IsCommitting = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
var succ = await Task.Run(() => new Commands.Commit(_repo.FullPath, _commitMessage, _useAmend).Exec());
|
||||
if (succ) {
|
||||
if (succ)
|
||||
{
|
||||
CommitMessage = string.Empty;
|
||||
UseAmend = false;
|
||||
|
||||
if (autoPush) {
|
||||
if (autoPush)
|
||||
{
|
||||
PopupHost.ShowAndStartPopup(new Push(_repo, null));
|
||||
}
|
||||
}
|
||||
|
@ -367,11 +463,13 @@ namespace SourceGit.ViewModels {
|
|||
IsCommitting = false;
|
||||
}
|
||||
|
||||
public ContextMenu CreateContextMenuForUnstagedChanges(List<Models.Change> changes) {
|
||||
public ContextMenu CreateContextMenuForUnstagedChanges(List<Models.Change> changes)
|
||||
{
|
||||
if (changes.Count == 0) return null;
|
||||
|
||||
var menu = new ContextMenu();
|
||||
if (changes.Count == 1) {
|
||||
if (changes.Count == 1)
|
||||
{
|
||||
var change = changes[0];
|
||||
var path = Path.GetFullPath(Path.Combine(_repo.FullPath, change.Path));
|
||||
|
||||
|
@ -379,16 +477,18 @@ namespace SourceGit.ViewModels {
|
|||
explore.Header = App.Text("RevealFile");
|
||||
explore.Icon = App.CreateMenuIcon("Icons.Folder.Open");
|
||||
explore.IsEnabled = File.Exists(path) || Directory.Exists(path);
|
||||
explore.Click += (_, e) => {
|
||||
explore.Click += (_, e) =>
|
||||
{
|
||||
Native.OS.OpenInFileManager(path, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
|
||||
var openWith = new MenuItem();
|
||||
openWith.Header = App.Text("OpenWith");
|
||||
openWith.Icon = App.CreateMenuIcon("Icons.OpenWith");
|
||||
openWith.IsEnabled = File.Exists(path);
|
||||
openWith.Click += (_, e) => {
|
||||
openWith.Click += (_, e) =>
|
||||
{
|
||||
Native.OS.OpenWithDefaultEditor(path);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -396,7 +496,8 @@ namespace SourceGit.ViewModels {
|
|||
var stage = new MenuItem();
|
||||
stage.Header = App.Text("FileCM.Stage");
|
||||
stage.Icon = App.CreateMenuIcon("Icons.File.Add");
|
||||
stage.Click += (_, e) => {
|
||||
stage.Click += (_, e) =>
|
||||
{
|
||||
StageChanges(changes);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -404,7 +505,8 @@ namespace SourceGit.ViewModels {
|
|||
var discard = new MenuItem();
|
||||
discard.Header = App.Text("FileCM.Discard");
|
||||
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||
discard.Click += (_, e) => {
|
||||
discard.Click += (_, e) =>
|
||||
{
|
||||
Discard(changes, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -412,8 +514,10 @@ namespace SourceGit.ViewModels {
|
|||
var stash = new MenuItem();
|
||||
stash.Header = App.Text("FileCM.Stash");
|
||||
stash.Icon = App.CreateMenuIcon("Icons.Stashes");
|
||||
stash.Click += (_, e) => {
|
||||
if (PopupHost.CanCreatePopup()) {
|
||||
stash.Click += (_, e) =>
|
||||
{
|
||||
if (PopupHost.CanCreatePopup())
|
||||
{
|
||||
PopupHost.ShowPopup(new StashChanges(_repo, changes, false));
|
||||
}
|
||||
e.Handled = true;
|
||||
|
@ -422,7 +526,8 @@ namespace SourceGit.ViewModels {
|
|||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (_, e) => {
|
||||
patch.Click += async (_, e) =>
|
||||
{
|
||||
var topLevel = App.GetTopLevel();
|
||||
if (topLevel == null) return;
|
||||
|
||||
|
@ -432,7 +537,8 @@ namespace SourceGit.ViewModels {
|
|||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
var storageFile = await topLevel.StorageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null) {
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.Exec(_repo.FullPath, changes, true, storageFile.Path.LocalPath));
|
||||
if (succ) App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
@ -443,7 +549,8 @@ namespace SourceGit.ViewModels {
|
|||
var history = new MenuItem();
|
||||
history.Header = App.Text("FileHistory");
|
||||
history.Icon = App.CreateMenuIcon("Icons.Histories");
|
||||
history.Click += (_, e) => {
|
||||
history.Click += (_, e) =>
|
||||
{
|
||||
var window = new Views.FileHistories() { DataContext = new FileHistories(_repo.FullPath, change.Path) };
|
||||
window.Show();
|
||||
e.Handled = true;
|
||||
|
@ -453,7 +560,8 @@ namespace SourceGit.ViewModels {
|
|||
assumeUnchanged.Header = App.Text("FileCM.AssumeUnchanged");
|
||||
assumeUnchanged.Icon = App.CreateMenuIcon("Icons.File.Ignore");
|
||||
assumeUnchanged.IsEnabled = change.WorkTree != Models.ChangeState.Untracked;
|
||||
assumeUnchanged.Click += (_, e) => {
|
||||
assumeUnchanged.Click += (_, e) =>
|
||||
{
|
||||
new Commands.AssumeUnchanged(_repo.FullPath).Add(change.Path);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -461,7 +569,8 @@ namespace SourceGit.ViewModels {
|
|||
var copy = new MenuItem();
|
||||
copy.Header = App.Text("CopyPath");
|
||||
copy.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copy.Click += (_, e) => {
|
||||
copy.Click += (_, e) =>
|
||||
{
|
||||
App.CopyText(change.Path);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -478,11 +587,14 @@ namespace SourceGit.ViewModels {
|
|||
menu.Items.Add(assumeUnchanged);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(copy);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var stage = new MenuItem();
|
||||
stage.Header = App.Text("FileCM.StageMulti", changes.Count);
|
||||
stage.Icon = App.CreateMenuIcon("Icons.File.Add");
|
||||
stage.Click += (_, e) => {
|
||||
stage.Click += (_, e) =>
|
||||
{
|
||||
StageChanges(changes);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -490,7 +602,8 @@ namespace SourceGit.ViewModels {
|
|||
var discard = new MenuItem();
|
||||
discard.Header = App.Text("FileCM.DiscardMulti", changes.Count);
|
||||
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||
discard.Click += (_, e) => {
|
||||
discard.Click += (_, e) =>
|
||||
{
|
||||
Discard(changes, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -498,8 +611,10 @@ namespace SourceGit.ViewModels {
|
|||
var stash = new MenuItem();
|
||||
stash.Header = App.Text("FileCM.StashMulti", changes.Count);
|
||||
stash.Icon = App.CreateMenuIcon("Icons.Stashes");
|
||||
stash.Click += (_, e) => {
|
||||
if (PopupHost.CanCreatePopup()) {
|
||||
stash.Click += (_, e) =>
|
||||
{
|
||||
if (PopupHost.CanCreatePopup())
|
||||
{
|
||||
PopupHost.ShowPopup(new StashChanges(_repo, changes, false));
|
||||
}
|
||||
e.Handled = true;
|
||||
|
@ -508,7 +623,8 @@ namespace SourceGit.ViewModels {
|
|||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (o, e) => {
|
||||
patch.Click += async (o, e) =>
|
||||
{
|
||||
var topLevel = App.GetTopLevel();
|
||||
if (topLevel == null) return;
|
||||
|
||||
|
@ -516,9 +632,10 @@ namespace SourceGit.ViewModels {
|
|||
options.Title = App.Text("FileCM.SaveAsPatch");
|
||||
options.DefaultExtension = ".patch";
|
||||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
|
||||
var storageFile = await topLevel.StorageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null) {
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.Exec(_repo.FullPath, changes, true, storageFile.Path.LocalPath));
|
||||
if (succ) App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
@ -530,16 +647,18 @@ namespace SourceGit.ViewModels {
|
|||
menu.Items.Add(discard);
|
||||
menu.Items.Add(stash);
|
||||
menu.Items.Add(patch);
|
||||
}
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
public ContextMenu CreateContextMenuForStagedChanges(List<Models.Change> changes) {
|
||||
public ContextMenu CreateContextMenuForStagedChanges(List<Models.Change> changes)
|
||||
{
|
||||
if (changes.Count == 0) return null;
|
||||
|
||||
var menu = new ContextMenu();
|
||||
if (changes.Count == 1) {
|
||||
if (changes.Count == 1)
|
||||
{
|
||||
var change = changes[0];
|
||||
var path = Path.GetFullPath(Path.Combine(_repo.FullPath, change.Path));
|
||||
|
||||
|
@ -547,7 +666,8 @@ namespace SourceGit.ViewModels {
|
|||
explore.IsEnabled = File.Exists(path) || Directory.Exists(path);
|
||||
explore.Header = App.Text("RevealFile");
|
||||
explore.Icon = App.CreateMenuIcon("Icons.Folder.Open");
|
||||
explore.Click += (o, e) => {
|
||||
explore.Click += (o, e) =>
|
||||
{
|
||||
Native.OS.OpenInFileManager(path, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -556,7 +676,8 @@ namespace SourceGit.ViewModels {
|
|||
openWith.Header = App.Text("OpenWith");
|
||||
openWith.Icon = App.CreateMenuIcon("Icons.OpenWith");
|
||||
openWith.IsEnabled = File.Exists(path);
|
||||
openWith.Click += (_, e) => {
|
||||
openWith.Click += (_, e) =>
|
||||
{
|
||||
Native.OS.OpenWithDefaultEditor(path);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -564,7 +685,8 @@ namespace SourceGit.ViewModels {
|
|||
var unstage = new MenuItem();
|
||||
unstage.Header = App.Text("FileCM.Unstage");
|
||||
unstage.Icon = App.CreateMenuIcon("Icons.File.Remove");
|
||||
unstage.Click += (o, e) => {
|
||||
unstage.Click += (o, e) =>
|
||||
{
|
||||
UnstageChanges(changes);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -572,7 +694,8 @@ namespace SourceGit.ViewModels {
|
|||
var discard = new MenuItem();
|
||||
discard.Header = App.Text("FileCM.Discard");
|
||||
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||
discard.Click += (_, e) => {
|
||||
discard.Click += (_, e) =>
|
||||
{
|
||||
Discard(changes, false);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -580,8 +703,10 @@ namespace SourceGit.ViewModels {
|
|||
var stash = new MenuItem();
|
||||
stash.Header = App.Text("FileCM.Stash");
|
||||
stash.Icon = App.CreateMenuIcon("Icons.Stashes");
|
||||
stash.Click += (_, e) => {
|
||||
if (PopupHost.CanCreatePopup()) {
|
||||
stash.Click += (_, e) =>
|
||||
{
|
||||
if (PopupHost.CanCreatePopup())
|
||||
{
|
||||
PopupHost.ShowPopup(new StashChanges(_repo, changes, false));
|
||||
}
|
||||
e.Handled = true;
|
||||
|
@ -590,7 +715,8 @@ namespace SourceGit.ViewModels {
|
|||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (o, e) => {
|
||||
patch.Click += async (o, e) =>
|
||||
{
|
||||
var topLevel = App.GetTopLevel();
|
||||
if (topLevel == null) return;
|
||||
|
||||
|
@ -600,7 +726,8 @@ namespace SourceGit.ViewModels {
|
|||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
var storageFile = await topLevel.StorageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null) {
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.Exec(_repo.FullPath, changes, false, storageFile.Path.LocalPath));
|
||||
if (succ) App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
@ -611,7 +738,8 @@ namespace SourceGit.ViewModels {
|
|||
var copyPath = new MenuItem();
|
||||
copyPath.Header = App.Text("CopyPath");
|
||||
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyPath.Click += (o, e) => {
|
||||
copyPath.Click += (o, e) =>
|
||||
{
|
||||
App.CopyText(change.Path);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -625,11 +753,14 @@ namespace SourceGit.ViewModels {
|
|||
menu.Items.Add(patch);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(copyPath);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var unstage = new MenuItem();
|
||||
unstage.Header = App.Text("FileCM.UnstageMulti", changes.Count);
|
||||
unstage.Icon = App.CreateMenuIcon("Icons.File.Remove");
|
||||
unstage.Click += (o, e) => {
|
||||
unstage.Click += (o, e) =>
|
||||
{
|
||||
UnstageChanges(changes);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -637,7 +768,8 @@ namespace SourceGit.ViewModels {
|
|||
var discard = new MenuItem();
|
||||
discard.Header = App.Text("FileCM.DiscardMulti", changes.Count);
|
||||
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||
discard.Click += (_, e) => {
|
||||
discard.Click += (_, e) =>
|
||||
{
|
||||
Discard(changes, false);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -645,8 +777,10 @@ namespace SourceGit.ViewModels {
|
|||
var stash = new MenuItem();
|
||||
stash.Header = App.Text("FileCM.StashMulti", changes.Count);
|
||||
stash.Icon = App.CreateMenuIcon("Icons.Stashes");
|
||||
stash.Click += (_, e) => {
|
||||
if (PopupHost.CanCreatePopup()) {
|
||||
stash.Click += (_, e) =>
|
||||
{
|
||||
if (PopupHost.CanCreatePopup())
|
||||
{
|
||||
PopupHost.ShowPopup(new StashChanges(_repo, changes, false));
|
||||
}
|
||||
e.Handled = true;
|
||||
|
@ -655,7 +789,8 @@ namespace SourceGit.ViewModels {
|
|||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (_, e) => {
|
||||
patch.Click += async (_, e) =>
|
||||
{
|
||||
var topLevel = App.GetTopLevel();
|
||||
if (topLevel == null) return;
|
||||
|
||||
|
@ -665,7 +800,8 @@ namespace SourceGit.ViewModels {
|
|||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
var storageFile = await topLevel.StorageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null) {
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.Exec(_repo.FullPath, changes, false, storageFile.Path.LocalPath));
|
||||
if (succ) App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
@ -682,9 +818,11 @@ namespace SourceGit.ViewModels {
|
|||
return menu;
|
||||
}
|
||||
|
||||
public ContextMenu CreateContextMenuForCommitMessages() {
|
||||
public ContextMenu CreateContextMenuForCommitMessages()
|
||||
{
|
||||
var menu = new ContextMenu();
|
||||
if (_repo.CommitMessages.Count == 0) {
|
||||
if (_repo.CommitMessages.Count == 0)
|
||||
{
|
||||
var empty = new MenuItem();
|
||||
empty.Header = App.Text("WorkingCopy.NoCommitHistories");
|
||||
empty.IsEnabled = false;
|
||||
|
@ -698,12 +836,14 @@ namespace SourceGit.ViewModels {
|
|||
menu.Items.Add(tip);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
foreach (var message in _repo.CommitMessages) {
|
||||
foreach (var message in _repo.CommitMessages)
|
||||
{
|
||||
var dump = message;
|
||||
|
||||
var item = new MenuItem();
|
||||
item.Header = dump;
|
||||
item.Click += (o, e) => {
|
||||
item.Click += (o, e) =>
|
||||
{
|
||||
CommitMessage = dump;
|
||||
e.Handled = true;
|
||||
};
|
||||
|
@ -714,16 +854,21 @@ namespace SourceGit.ViewModels {
|
|||
return menu;
|
||||
}
|
||||
|
||||
private void PushCommitMessage() {
|
||||
private void PushCommitMessage()
|
||||
{
|
||||
var existIdx = _repo.CommitMessages.IndexOf(CommitMessage);
|
||||
if (existIdx == 0) {
|
||||
if (existIdx == 0)
|
||||
{
|
||||
return;
|
||||
} else if (existIdx > 0) {
|
||||
}
|
||||
else if (existIdx > 0)
|
||||
{
|
||||
_repo.CommitMessages.Move(existIdx, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_repo.CommitMessages.Count > 9) {
|
||||
if (_repo.CommitMessages.Count > 9)
|
||||
{
|
||||
_repo.CommitMessages.RemoveRange(9, _repo.CommitMessages.Count - 9);
|
||||
}
|
||||
|
||||
|
@ -748,4 +893,4 @@ namespace SourceGit.ViewModels {
|
|||
private object _detailContext = null;
|
||||
private string _commitMessage = string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue