From 5fd074a9b602b22509c00ad888c718c140437359 Mon Sep 17 00:00:00 2001 From: leo Date: Sat, 19 Apr 2025 11:14:19 +0800 Subject: [PATCH] refactor: use view locator instead of creating views manually in viewmodels (#1213) Signed-off-by: leo --- src/ViewModels/AddRemote.cs | 1 - src/ViewModels/AddSubmodule.cs | 1 - src/ViewModels/AddWorktree.cs | 2 -- src/ViewModels/Apply.cs | 1 - src/ViewModels/ApplyStash.cs | 1 - src/ViewModels/Archive.cs | 3 -- src/ViewModels/Checkout.cs | 1 - src/ViewModels/CheckoutCommit.cs | 1 - src/ViewModels/CherryPick.cs | 2 -- src/ViewModels/Cleanup.cs | 1 - src/ViewModels/ClearStashes.cs | 1 - src/ViewModels/Clone.cs | 2 -- src/ViewModels/CreateBranch.cs | 5 +-- src/ViewModels/CreateGroup.cs | 1 - src/ViewModels/CreateTag.cs | 2 -- src/ViewModels/DeleteBranch.cs | 2 -- src/ViewModels/DeleteMultipleBranches.cs | 1 - src/ViewModels/DeleteRemote.cs | 1 - src/ViewModels/DeleteRepositoryNode.cs | 10 ++---- src/ViewModels/DeleteSubmodule.cs | 2 -- src/ViewModels/DeleteTag.cs | 1 - src/ViewModels/Discard.cs | 4 --- src/ViewModels/DropStash.cs | 3 +- src/ViewModels/EditRemote.cs | 2 -- src/ViewModels/EditRepositoryNode.cs | 2 -- src/ViewModels/ExecuteCustomAction.cs | 6 +--- src/ViewModels/FastForwardWithoutCheckout.cs | 3 -- src/ViewModels/Fetch.cs | 2 -- src/ViewModels/FetchInto.cs | 3 -- src/ViewModels/GitFlowFinish.cs | 5 +-- src/ViewModels/GitFlowStart.cs | 2 -- src/ViewModels/Init.cs | 6 ++-- src/ViewModels/InitGitFlow.cs | 2 -- src/ViewModels/LFSFetch.cs | 1 - src/ViewModels/LFSPrune.cs | 1 - src/ViewModels/LFSPull.cs | 1 - src/ViewModels/LFSPush.cs | 1 - src/ViewModels/LFSTrackCustomPattern.cs | 1 - src/ViewModels/Merge.cs | 5 +-- src/ViewModels/MergeMultiple.cs | 3 -- src/ViewModels/MoveRepositoryNode.cs | 4 --- src/ViewModels/Popup.cs | 6 ---- src/ViewModels/PruneRemote.cs | 2 -- src/ViewModels/PruneWorktrees.cs | 3 +- src/ViewModels/Pull.cs | 4 +-- src/ViewModels/Push.cs | 2 -- src/ViewModels/PushTag.cs | 2 -- src/ViewModels/Rebase.cs | 2 -- src/ViewModels/RemoveWorktree.cs | 6 ++-- src/ViewModels/RenameBranch.cs | 1 - src/ViewModels/Reset.cs | 3 -- src/ViewModels/Revert.cs | 2 -- src/ViewModels/Reword.cs | 5 +-- src/ViewModels/ScanRepositories.cs | 3 -- src/ViewModels/SetUpstream.cs | 5 +-- src/ViewModels/Squash.cs | 7 ++--- src/ViewModels/StashChanges.cs | 2 -- src/ViewModels/UpdateSubmodules.cs | 4 +-- src/Views/LauncherPage.axaml | 2 +- src/Views/LauncherPage.axaml.cs | 32 ++++++++++++++++++++ 60 files changed, 52 insertions(+), 140 deletions(-) diff --git a/src/ViewModels/AddRemote.cs b/src/ViewModels/AddRemote.cs index 3372208f..37bbc43a 100644 --- a/src/ViewModels/AddRemote.cs +++ b/src/ViewModels/AddRemote.cs @@ -47,7 +47,6 @@ namespace SourceGit.ViewModels public AddRemote(Repository repo) { _repo = repo; - View = new Views.AddRemote() { DataContext = this }; } public static ValidationResult ValidateRemoteName(string name, ValidationContext ctx) diff --git a/src/ViewModels/AddSubmodule.cs b/src/ViewModels/AddSubmodule.cs index e9bdedd3..cf1bd8a3 100644 --- a/src/ViewModels/AddSubmodule.cs +++ b/src/ViewModels/AddSubmodule.cs @@ -31,7 +31,6 @@ namespace SourceGit.ViewModels public AddSubmodule(Repository repo) { _repo = repo; - View = new Views.AddSubmodule() { DataContext = this }; } public static ValidationResult ValidateURL(string url, ValidationContext ctx) diff --git a/src/ViewModels/AddWorktree.cs b/src/ViewModels/AddWorktree.cs index 27039f49..a089a391 100644 --- a/src/ViewModels/AddWorktree.cs +++ b/src/ViewModels/AddWorktree.cs @@ -78,8 +78,6 @@ namespace SourceGit.ViewModels SelectedTrackingBranch = RemoteBranches[0]; else SelectedTrackingBranch = string.Empty; - - View = new Views.AddWorktree() { DataContext = this }; } public static ValidationResult ValidateWorktreePath(string path, ValidationContext ctx) diff --git a/src/ViewModels/Apply.cs b/src/ViewModels/Apply.cs index 81af8754..c7f3c185 100644 --- a/src/ViewModels/Apply.cs +++ b/src/ViewModels/Apply.cs @@ -31,7 +31,6 @@ namespace SourceGit.ViewModels _repo = repo; SelectedWhiteSpaceMode = Models.ApplyWhiteSpaceMode.Supported[0]; - View = new Views.Apply() { DataContext = this }; } public static ValidationResult ValidatePatchFile(string file, ValidationContext _) diff --git a/src/ViewModels/ApplyStash.cs b/src/ViewModels/ApplyStash.cs index a3bb8ae2..e7cd64e9 100644 --- a/src/ViewModels/ApplyStash.cs +++ b/src/ViewModels/ApplyStash.cs @@ -26,7 +26,6 @@ namespace SourceGit.ViewModels { _repo = repo; Stash = stash; - View = new Views.ApplyStash() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Archive.cs b/src/ViewModels/Archive.cs index 653a9499..7ce0d968 100644 --- a/src/ViewModels/Archive.cs +++ b/src/ViewModels/Archive.cs @@ -25,7 +25,6 @@ namespace SourceGit.ViewModels _revision = branch.Head; _saveFile = $"archive-{Path.GetFileName(branch.Name)}.zip"; BasedOn = branch; - View = new Views.Archive() { DataContext = this }; } public Archive(Repository repo, Models.Commit commit) @@ -34,7 +33,6 @@ namespace SourceGit.ViewModels _revision = commit.SHA; _saveFile = $"archive-{commit.SHA.Substring(0, 10)}.zip"; BasedOn = commit; - View = new Views.Archive() { DataContext = this }; } public Archive(Repository repo, Models.Tag tag) @@ -43,7 +41,6 @@ namespace SourceGit.ViewModels _revision = tag.SHA; _saveFile = $"archive-{Path.GetFileName(tag.Name)}.zip"; BasedOn = tag; - View = new Views.Archive() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Checkout.cs b/src/ViewModels/Checkout.cs index dc2f4678..5a51e2d1 100644 --- a/src/ViewModels/Checkout.cs +++ b/src/ViewModels/Checkout.cs @@ -20,7 +20,6 @@ namespace SourceGit.ViewModels _repo = repo; Branch = branch; DiscardLocalChanges = false; - View = new Views.Checkout() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/CheckoutCommit.cs b/src/ViewModels/CheckoutCommit.cs index 8d6f50ac..7bd6976d 100644 --- a/src/ViewModels/CheckoutCommit.cs +++ b/src/ViewModels/CheckoutCommit.cs @@ -20,7 +20,6 @@ namespace SourceGit.ViewModels _repo = repo; Commit = commit; DiscardLocalChanges = false; - View = new Views.CheckoutCommit() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/CherryPick.cs b/src/ViewModels/CherryPick.cs index dc172489..bcbd14e6 100644 --- a/src/ViewModels/CherryPick.cs +++ b/src/ViewModels/CherryPick.cs @@ -50,7 +50,6 @@ namespace SourceGit.ViewModels MainlineForMergeCommit = 0; AppendSourceToMessage = true; AutoCommit = true; - View = new Views.CherryPick() { DataContext = this }; } public CherryPick(Repository repo, Models.Commit merge, List parents) @@ -62,7 +61,6 @@ namespace SourceGit.ViewModels MainlineForMergeCommit = 0; AppendSourceToMessage = true; AutoCommit = true; - View = new Views.CherryPick() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Cleanup.cs b/src/ViewModels/Cleanup.cs index e7c9b73d..1fc39cb5 100644 --- a/src/ViewModels/Cleanup.cs +++ b/src/ViewModels/Cleanup.cs @@ -7,7 +7,6 @@ namespace SourceGit.ViewModels public Cleanup(Repository repo) { _repo = repo; - View = new Views.Cleanup() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/ClearStashes.cs b/src/ViewModels/ClearStashes.cs index bd4ca3ff..d71bab31 100644 --- a/src/ViewModels/ClearStashes.cs +++ b/src/ViewModels/ClearStashes.cs @@ -7,7 +7,6 @@ namespace SourceGit.ViewModels public ClearStashes(Repository repo) { _repo = repo; - View = new Views.ClearStashes() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Clone.cs b/src/ViewModels/Clone.cs index 7dc8abe8..ee5da69e 100644 --- a/src/ViewModels/Clone.cs +++ b/src/ViewModels/Clone.cs @@ -68,8 +68,6 @@ namespace SourceGit.ViewModels if (string.IsNullOrEmpty(ParentFolder)) _parentFolder = Preferences.Instance.GitDefaultCloneDir; - View = new Views.Clone() { DataContext = this }; - Task.Run(async () => { try diff --git a/src/ViewModels/CreateBranch.cs b/src/ViewModels/CreateBranch.cs index d2f6d767..d51a709d 100644 --- a/src/ViewModels/CreateBranch.cs +++ b/src/ViewModels/CreateBranch.cs @@ -48,7 +48,6 @@ namespace SourceGit.ViewModels BasedOn = branch; DiscardLocalChanges = false; - View = new Views.CreateBranch() { DataContext = this }; } public CreateBranch(Repository repo, Models.Commit commit) @@ -58,7 +57,6 @@ namespace SourceGit.ViewModels BasedOn = commit; DiscardLocalChanges = false; - View = new Views.CreateBranch() { DataContext = this }; } public CreateBranch(Repository repo, Models.Tag tag) @@ -68,7 +66,6 @@ namespace SourceGit.ViewModels BasedOn = tag; DiscardLocalChanges = false; - View = new Views.CreateBranch() { DataContext = this }; } public static ValidationResult ValidateBranchName(string name, ValidationContext ctx) @@ -97,7 +94,7 @@ namespace SourceGit.ViewModels return Task.Run(() => { - var succ = false; + bool succ; if (CheckoutAfterCreated && !_repo.IsBare) { var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result(); diff --git a/src/ViewModels/CreateGroup.cs b/src/ViewModels/CreateGroup.cs index 9d680a2c..fb0218f0 100644 --- a/src/ViewModels/CreateGroup.cs +++ b/src/ViewModels/CreateGroup.cs @@ -16,7 +16,6 @@ namespace SourceGit.ViewModels public CreateGroup(RepositoryNode parent) { _parent = parent; - View = new Views.CreateGroup() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/CreateTag.cs b/src/ViewModels/CreateTag.cs index ec6f07ab..091a95a0 100644 --- a/src/ViewModels/CreateTag.cs +++ b/src/ViewModels/CreateTag.cs @@ -52,7 +52,6 @@ namespace SourceGit.ViewModels BasedOn = branch; SignTag = new Commands.Config(repo.FullPath).Get("tag.gpgsign").Equals("true", StringComparison.OrdinalIgnoreCase); - View = new Views.CreateTag() { DataContext = this }; } public CreateTag(Repository repo, Models.Commit commit) @@ -62,7 +61,6 @@ namespace SourceGit.ViewModels BasedOn = commit; SignTag = new Commands.Config(repo.FullPath).Get("tag.gpgsign").Equals("true", StringComparison.OrdinalIgnoreCase); - View = new Views.CreateTag() { DataContext = this }; } public static ValidationResult ValidateTagName(string name, ValidationContext ctx) diff --git a/src/ViewModels/DeleteBranch.cs b/src/ViewModels/DeleteBranch.cs index 7115923e..d7cd8c16 100644 --- a/src/ViewModels/DeleteBranch.cs +++ b/src/ViewModels/DeleteBranch.cs @@ -39,8 +39,6 @@ namespace SourceGit.ViewModels if (TrackingRemoteBranch != null) DeleteTrackingRemoteTip = new Views.NameHighlightedTextBlock("DeleteBranch.WithTrackingRemote", TrackingRemoteBranch.FriendlyName); } - - View = new Views.DeleteBranch() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/DeleteMultipleBranches.cs b/src/ViewModels/DeleteMultipleBranches.cs index 9a59db5d..b40ff223 100644 --- a/src/ViewModels/DeleteMultipleBranches.cs +++ b/src/ViewModels/DeleteMultipleBranches.cs @@ -15,7 +15,6 @@ namespace SourceGit.ViewModels _repo = repo; _isLocal = isLocal; Targets = branches; - View = new Views.DeleteMultipleBranches() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/DeleteRemote.cs b/src/ViewModels/DeleteRemote.cs index cad34574..faf7c8a9 100644 --- a/src/ViewModels/DeleteRemote.cs +++ b/src/ViewModels/DeleteRemote.cs @@ -14,7 +14,6 @@ namespace SourceGit.ViewModels { _repo = repo; Remote = remote; - View = new Views.DeleteRemote() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/DeleteRepositoryNode.cs b/src/ViewModels/DeleteRepositoryNode.cs index de8d6e1d..38e03d9f 100644 --- a/src/ViewModels/DeleteRepositoryNode.cs +++ b/src/ViewModels/DeleteRepositoryNode.cs @@ -6,23 +6,19 @@ namespace SourceGit.ViewModels { public RepositoryNode Node { - get => _node; - set => SetProperty(ref _node, value); + get; } public DeleteRepositoryNode(RepositoryNode node) { - _node = node; - View = new Views.DeleteRepositoryNode() { DataContext = this }; + Node = node; } public override Task Sure() { - Preferences.Instance.RemoveNode(_node, true); + Preferences.Instance.RemoveNode(Node, true); Welcome.Instance.Refresh(); return null; } - - private RepositoryNode _node = null; } } diff --git a/src/ViewModels/DeleteSubmodule.cs b/src/ViewModels/DeleteSubmodule.cs index c21cde3b..239c7d31 100644 --- a/src/ViewModels/DeleteSubmodule.cs +++ b/src/ViewModels/DeleteSubmodule.cs @@ -4,7 +4,6 @@ namespace SourceGit.ViewModels { public class DeleteSubmodule : Popup { - public string Submodule { get; @@ -15,7 +14,6 @@ namespace SourceGit.ViewModels { _repo = repo; Submodule = submodule; - View = new Views.DeleteSubmodule() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/DeleteTag.cs b/src/ViewModels/DeleteTag.cs index 419c081f..f7de6341 100644 --- a/src/ViewModels/DeleteTag.cs +++ b/src/ViewModels/DeleteTag.cs @@ -20,7 +20,6 @@ namespace SourceGit.ViewModels { _repo = repo; Target = tag; - View = new Views.DeleteTag() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Discard.cs b/src/ViewModels/Discard.cs index e007f815..7619635c 100644 --- a/src/ViewModels/Discard.cs +++ b/src/ViewModels/Discard.cs @@ -40,9 +40,7 @@ namespace SourceGit.ViewModels public Discard(Repository repo) { _repo = repo; - Mode = new DiscardAllMode(); - View = new Views.Discard { DataContext = this }; } public Discard(Repository repo, List changes) @@ -56,8 +54,6 @@ namespace SourceGit.ViewModels Mode = new DiscardSingleFile() { Path = _changes[0].Path }; else Mode = new DiscardMultipleFiles() { Count = _changes.Count }; - - View = new Views.Discard() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/DropStash.cs b/src/ViewModels/DropStash.cs index 9b72e827..545da010 100644 --- a/src/ViewModels/DropStash.cs +++ b/src/ViewModels/DropStash.cs @@ -4,13 +4,12 @@ namespace SourceGit.ViewModels { public class DropStash : Popup { - public Models.Stash Stash { get; private set; } + public Models.Stash Stash { get; } public DropStash(Repository repo, Models.Stash stash) { _repo = repo; Stash = stash; - View = new Views.DropStash() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/EditRemote.cs b/src/ViewModels/EditRemote.cs index 2c63c51a..763c8ce1 100644 --- a/src/ViewModels/EditRemote.cs +++ b/src/ViewModels/EditRemote.cs @@ -56,8 +56,6 @@ namespace SourceGit.ViewModels { SSHKey = new Commands.Config(repo.FullPath).Get($"remote.{remote.Name}.sshkey"); } - - View = new Views.EditRemote() { DataContext = this }; } public static ValidationResult ValidateRemoteName(string name, ValidationContext ctx) diff --git a/src/ViewModels/EditRepositoryNode.cs b/src/ViewModels/EditRepositoryNode.cs index db0e099c..599b7f63 100644 --- a/src/ViewModels/EditRepositoryNode.cs +++ b/src/ViewModels/EditRepositoryNode.cs @@ -37,8 +37,6 @@ namespace SourceGit.ViewModels _name = node.Name; _isRepository = node.IsRepository; _bookmark = node.Bookmark; - - View = new Views.EditRepositoryNode() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/ExecuteCustomAction.cs b/src/ViewModels/ExecuteCustomAction.cs index dfc00c9b..52729e56 100644 --- a/src/ViewModels/ExecuteCustomAction.cs +++ b/src/ViewModels/ExecuteCustomAction.cs @@ -8,7 +8,6 @@ namespace SourceGit.ViewModels public Models.CustomAction CustomAction { get; - private set; } public ExecuteCustomAction(Repository repo, Models.CustomAction action) @@ -16,7 +15,6 @@ namespace SourceGit.ViewModels _repo = repo; _args = action.Arguments.Replace("${REPO}", GetWorkdir()); CustomAction = action; - View = new Views.ExecuteCustomAction() { DataContext = this }; } public ExecuteCustomAction(Repository repo, Models.CustomAction action, Models.Branch branch) @@ -24,7 +22,6 @@ namespace SourceGit.ViewModels _repo = repo; _args = action.Arguments.Replace("${REPO}", GetWorkdir()).Replace("${BRANCH}", branch.FriendlyName); CustomAction = action; - View = new Views.ExecuteCustomAction() { DataContext = this }; } public ExecuteCustomAction(Repository repo, Models.CustomAction action, Models.Commit commit) @@ -32,7 +29,6 @@ namespace SourceGit.ViewModels _repo = repo; _args = action.Arguments.Replace("${REPO}", GetWorkdir()).Replace("${SHA}", commit.SHA); CustomAction = action; - View = new Views.ExecuteCustomAction() { DataContext = this }; } public override Task Sure() @@ -58,6 +54,6 @@ namespace SourceGit.ViewModels } private readonly Repository _repo = null; - private string _args = string.Empty; + private readonly string _args; } } diff --git a/src/ViewModels/FastForwardWithoutCheckout.cs b/src/ViewModels/FastForwardWithoutCheckout.cs index 5b55a9e3..53d69816 100644 --- a/src/ViewModels/FastForwardWithoutCheckout.cs +++ b/src/ViewModels/FastForwardWithoutCheckout.cs @@ -7,13 +7,11 @@ namespace SourceGit.ViewModels public Models.Branch Local { get; - private set; } public Models.Branch To { get; - private set; } public FastForwardWithoutCheckout(Repository repo, Models.Branch local, Models.Branch upstream) @@ -21,7 +19,6 @@ namespace SourceGit.ViewModels _repo = repo; Local = local; To = upstream; - View = new Views.FastForwardWithoutCheckout() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Fetch.cs b/src/ViewModels/Fetch.cs index 437570cf..fc92be81 100644 --- a/src/ViewModels/Fetch.cs +++ b/src/ViewModels/Fetch.cs @@ -55,8 +55,6 @@ namespace SourceGit.ViewModels { SelectedRemote = _repo.Remotes[0]; } - - View = new Views.Fetch() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/FetchInto.cs b/src/ViewModels/FetchInto.cs index f3cdacdc..eee87979 100644 --- a/src/ViewModels/FetchInto.cs +++ b/src/ViewModels/FetchInto.cs @@ -7,13 +7,11 @@ namespace SourceGit.ViewModels public Models.Branch Local { get; - private set; } public Models.Branch Upstream { get; - private set; } public FetchInto(Repository repo, Models.Branch local, Models.Branch upstream) @@ -21,7 +19,6 @@ namespace SourceGit.ViewModels _repo = repo; Local = local; Upstream = upstream; - View = new Views.FetchInto() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/GitFlowFinish.cs b/src/ViewModels/GitFlowFinish.cs index f1de8298..efc28db1 100644 --- a/src/ViewModels/GitFlowFinish.cs +++ b/src/ViewModels/GitFlowFinish.cs @@ -7,8 +7,7 @@ namespace SourceGit.ViewModels public Models.Branch Branch { get; - set; - } = null; + } public bool IsFeature => _type == "feature"; public bool IsRelease => _type == "release"; @@ -25,9 +24,7 @@ namespace SourceGit.ViewModels _repo = repo; _type = type; _prefix = prefix; - Branch = branch; - View = new Views.GitFlowFinish() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/GitFlowStart.cs b/src/ViewModels/GitFlowStart.cs index fafbecad..8e44984a 100644 --- a/src/ViewModels/GitFlowStart.cs +++ b/src/ViewModels/GitFlowStart.cs @@ -28,8 +28,6 @@ namespace SourceGit.ViewModels _repo = repo; _type = type; _prefix = Commands.GitFlow.GetPrefix(repo.FullPath, type); - - View = new Views.GitFlowStart() { DataContext = this }; } public static ValidationResult ValidateBranchName(string name, ValidationContext ctx) diff --git a/src/ViewModels/Init.cs b/src/ViewModels/Init.cs index 3365d485..b47ba663 100644 --- a/src/ViewModels/Init.cs +++ b/src/ViewModels/Init.cs @@ -21,9 +21,7 @@ namespace SourceGit.ViewModels _pageId = pageId; _targetPath = path; _parentNode = parent; - Reason = string.IsNullOrEmpty(reason) ? "Invalid repository detected!" : reason; - View = new Views.Init() { DataContext = this }; } public override Task Sure() @@ -51,8 +49,8 @@ namespace SourceGit.ViewModels }); } - private string _pageId = null; + private readonly string _pageId = null; private string _targetPath = null; - private RepositoryNode _parentNode = null; + private readonly RepositoryNode _parentNode = null; } } diff --git a/src/ViewModels/InitGitFlow.cs b/src/ViewModels/InitGitFlow.cs index 8e8b6342..1672ef8e 100644 --- a/src/ViewModels/InitGitFlow.cs +++ b/src/ViewModels/InitGitFlow.cs @@ -78,8 +78,6 @@ namespace SourceGit.ViewModels _master = localBranches[0]; else _master = "master"; - - View = new Views.InitGitFlow() { DataContext = this }; } public static ValidationResult ValidateBaseBranch(string _, ValidationContext ctx) diff --git a/src/ViewModels/LFSFetch.cs b/src/ViewModels/LFSFetch.cs index 7491fa3e..43ca88fb 100644 --- a/src/ViewModels/LFSFetch.cs +++ b/src/ViewModels/LFSFetch.cs @@ -17,7 +17,6 @@ namespace SourceGit.ViewModels { _repo = repo; SelectedRemote = _repo.Remotes[0]; - View = new Views.LFSFetch() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/LFSPrune.cs b/src/ViewModels/LFSPrune.cs index 87d80cfb..9a6bd8a7 100644 --- a/src/ViewModels/LFSPrune.cs +++ b/src/ViewModels/LFSPrune.cs @@ -7,7 +7,6 @@ namespace SourceGit.ViewModels public LFSPrune(Repository repo) { _repo = repo; - View = new Views.LFSPrune() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/LFSPull.cs b/src/ViewModels/LFSPull.cs index dcf7b82a..8bac8bbb 100644 --- a/src/ViewModels/LFSPull.cs +++ b/src/ViewModels/LFSPull.cs @@ -17,7 +17,6 @@ namespace SourceGit.ViewModels { _repo = repo; SelectedRemote = _repo.Remotes[0]; - View = new Views.LFSPull() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/LFSPush.cs b/src/ViewModels/LFSPush.cs index 929d79b8..0013ee29 100644 --- a/src/ViewModels/LFSPush.cs +++ b/src/ViewModels/LFSPush.cs @@ -17,7 +17,6 @@ namespace SourceGit.ViewModels { _repo = repo; SelectedRemote = _repo.Remotes[0]; - View = new Views.LFSPush() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/LFSTrackCustomPattern.cs b/src/ViewModels/LFSTrackCustomPattern.cs index c601fc79..b69733e8 100644 --- a/src/ViewModels/LFSTrackCustomPattern.cs +++ b/src/ViewModels/LFSTrackCustomPattern.cs @@ -21,7 +21,6 @@ namespace SourceGit.ViewModels public LFSTrackCustomPattern(Repository repo) { _repo = repo; - View = new Views.LFSTrackCustomPattern() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Merge.cs b/src/ViewModels/Merge.cs index 08684601..d3d83836 100644 --- a/src/ViewModels/Merge.cs +++ b/src/ViewModels/Merge.cs @@ -29,7 +29,6 @@ namespace SourceGit.ViewModels Source = source; Into = into; Mode = forceFastForward ? Models.MergeMode.Supported[1] : AutoSelectMergeMode(); - View = new Views.Merge() { DataContext = this }; } public Merge(Repository repo, Models.Commit source, string into) @@ -40,7 +39,6 @@ namespace SourceGit.ViewModels Source = source; Into = into; Mode = AutoSelectMergeMode(); - View = new Views.Merge() { DataContext = this }; } public Merge(Repository repo, Models.Tag source, string into) @@ -51,7 +49,6 @@ namespace SourceGit.ViewModels Source = source; Into = into; Mode = AutoSelectMergeMode(); - View = new Views.Merge() { DataContext = this }; } public override Task Sure() @@ -99,6 +96,6 @@ namespace SourceGit.ViewModels } private readonly Repository _repo = null; - private readonly string _sourceName = string.Empty; + private readonly string _sourceName; } } diff --git a/src/ViewModels/MergeMultiple.cs b/src/ViewModels/MergeMultiple.cs index cdcbfd08..d9a3bd55 100644 --- a/src/ViewModels/MergeMultiple.cs +++ b/src/ViewModels/MergeMultiple.cs @@ -8,7 +8,6 @@ namespace SourceGit.ViewModels public List Targets { get; - private set; } = []; public bool AutoCommit @@ -29,7 +28,6 @@ namespace SourceGit.ViewModels Targets.AddRange(commits); AutoCommit = true; Strategy = Models.MergeStrategy.ForMultiple[0]; - View = new Views.MergeMultiple() { DataContext = this }; } public MergeMultiple(Repository repo, List branches) @@ -38,7 +36,6 @@ namespace SourceGit.ViewModels Targets.AddRange(branches); AutoCommit = true; Strategy = Models.MergeStrategy.ForMultiple[0]; - View = new Views.MergeMultiple() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/MoveRepositoryNode.cs b/src/ViewModels/MoveRepositoryNode.cs index 3f74d5a7..51f2e974 100644 --- a/src/ViewModels/MoveRepositoryNode.cs +++ b/src/ViewModels/MoveRepositoryNode.cs @@ -9,13 +9,11 @@ namespace SourceGit.ViewModels public RepositoryNode Target { get; - private set; } = null; public List Rows { get; - private set; } = []; public RepositoryNode Selected @@ -34,8 +32,6 @@ namespace SourceGit.ViewModels Id = Guid.NewGuid().ToString() }); MakeRows(Preferences.Instance.RepositoryNodes, 1); - - View = new Views.MoveRepositoryNode() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Popup.cs b/src/ViewModels/Popup.cs index 90fa48c7..ec1e007c 100644 --- a/src/ViewModels/Popup.cs +++ b/src/ViewModels/Popup.cs @@ -10,12 +10,6 @@ namespace SourceGit.ViewModels { public class Popup : ObservableValidator { - public object View - { - get; - set; - } - public bool InProgress { get => _inProgress; diff --git a/src/ViewModels/PruneRemote.cs b/src/ViewModels/PruneRemote.cs index cd826250..007bcab8 100644 --- a/src/ViewModels/PruneRemote.cs +++ b/src/ViewModels/PruneRemote.cs @@ -7,14 +7,12 @@ namespace SourceGit.ViewModels public Models.Remote Remote { get; - private set; } public PruneRemote(Repository repo, Models.Remote remote) { _repo = repo; Remote = remote; - View = new Views.PruneRemote() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/PruneWorktrees.cs b/src/ViewModels/PruneWorktrees.cs index 8540e3c2..3cb884dc 100644 --- a/src/ViewModels/PruneWorktrees.cs +++ b/src/ViewModels/PruneWorktrees.cs @@ -7,7 +7,6 @@ namespace SourceGit.ViewModels public PruneWorktrees(Repository repo) { _repo = repo; - View = new Views.PruneWorktrees() { DataContext = this }; } public override Task Sure() @@ -27,6 +26,6 @@ namespace SourceGit.ViewModels }); } - private Repository _repo = null; + private readonly Repository _repo = null; } } diff --git a/src/ViewModels/Pull.cs b/src/ViewModels/Pull.cs index 6c40e80f..e13dad96 100644 --- a/src/ViewModels/Pull.cs +++ b/src/ViewModels/Pull.cs @@ -42,7 +42,7 @@ namespace SourceGit.ViewModels { get; set; - } + } = false; public bool UseRebase { @@ -110,8 +110,6 @@ namespace SourceGit.ViewModels PostRemoteSelected(); HasSpecifiedRemoteBranch = false; } - - View = new Views.Pull() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Push.cs b/src/ViewModels/Push.cs index 57604958..5bbb9858 100644 --- a/src/ViewModels/Push.cs +++ b/src/ViewModels/Push.cs @@ -148,8 +148,6 @@ namespace SourceGit.ViewModels // Auto select preferred remote branch. AutoSelectBranchByRemote(); - - View = new Views.Push() { DataContext = this }; } public override bool CanStartDirectly() diff --git a/src/ViewModels/PushTag.cs b/src/ViewModels/PushTag.cs index 129de3e9..8cdf9767 100644 --- a/src/ViewModels/PushTag.cs +++ b/src/ViewModels/PushTag.cs @@ -8,7 +8,6 @@ namespace SourceGit.ViewModels public Models.Tag Target { get; - private set; } public List Remotes @@ -33,7 +32,6 @@ namespace SourceGit.ViewModels _repo = repo; Target = target; SelectedRemote = _repo.Remotes[0]; - View = new Views.PushTag() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Rebase.cs b/src/ViewModels/Rebase.cs index c6bee413..ece92013 100644 --- a/src/ViewModels/Rebase.cs +++ b/src/ViewModels/Rebase.cs @@ -29,7 +29,6 @@ namespace SourceGit.ViewModels Current = current; On = on; AutoStash = true; - View = new Views.Rebase() { DataContext = this }; } public Rebase(Repository repo, Models.Branch current, Models.Commit on) @@ -39,7 +38,6 @@ namespace SourceGit.ViewModels Current = current; On = on; AutoStash = true; - View = new Views.Rebase() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/RemoveWorktree.cs b/src/ViewModels/RemoveWorktree.cs index 1de8360a..d5de8533 100644 --- a/src/ViewModels/RemoveWorktree.cs +++ b/src/ViewModels/RemoveWorktree.cs @@ -7,8 +7,7 @@ namespace SourceGit.ViewModels public Models.Worktree Target { get; - private set; - } = null; + } public bool Force { @@ -20,7 +19,6 @@ namespace SourceGit.ViewModels { _repo = repo; Target = target; - View = new Views.RemoveWorktree() { DataContext = this }; } public override Task Sure() @@ -40,6 +38,6 @@ namespace SourceGit.ViewModels }); } - private Repository _repo = null; + private readonly Repository _repo = null; } } diff --git a/src/ViewModels/RenameBranch.cs b/src/ViewModels/RenameBranch.cs index 9c7c8742..d730c83e 100644 --- a/src/ViewModels/RenameBranch.cs +++ b/src/ViewModels/RenameBranch.cs @@ -25,7 +25,6 @@ namespace SourceGit.ViewModels _repo = repo; _name = target.Name; Target = target; - View = new Views.RenameBranch() { DataContext = this }; } public static ValidationResult ValidateBranchName(string name, ValidationContext ctx) diff --git a/src/ViewModels/Reset.cs b/src/ViewModels/Reset.cs index aecd7441..d3377a99 100644 --- a/src/ViewModels/Reset.cs +++ b/src/ViewModels/Reset.cs @@ -7,13 +7,11 @@ namespace SourceGit.ViewModels public Models.Branch Current { get; - private set; } public Models.Commit To { get; - private set; } public Models.ResetMode SelectedMode @@ -28,7 +26,6 @@ namespace SourceGit.ViewModels Current = current; To = to; SelectedMode = Models.ResetMode.Supported[1]; - View = new Views.Reset() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Revert.cs b/src/ViewModels/Revert.cs index 2c88e093..8334c444 100644 --- a/src/ViewModels/Revert.cs +++ b/src/ViewModels/Revert.cs @@ -7,7 +7,6 @@ namespace SourceGit.ViewModels public Models.Commit Target { get; - private set; } public bool AutoCommit @@ -21,7 +20,6 @@ namespace SourceGit.ViewModels _repo = repo; Target = target; AutoCommit = true; - View = new Views.Revert() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/Reword.cs b/src/ViewModels/Reword.cs index 7a9477aa..82fa3169 100644 --- a/src/ViewModels/Reword.cs +++ b/src/ViewModels/Reword.cs @@ -9,7 +9,6 @@ namespace SourceGit.ViewModels public Models.Commit Head { get; - private set; } [Required(ErrorMessage = "Commit message is required!!!")] @@ -24,9 +23,7 @@ namespace SourceGit.ViewModels _repo = repo; _oldMessage = new Commands.QueryCommitFullMessage(_repo.FullPath, head.SHA).Result(); _message = _oldMessage; - Head = head; - View = new Views.Reword() { DataContext = this }; } public override Task Sure() @@ -50,7 +47,7 @@ namespace SourceGit.ViewModels } private readonly Repository _repo; + private readonly string _oldMessage; private string _message; - private string _oldMessage; } } diff --git a/src/ViewModels/ScanRepositories.cs b/src/ViewModels/ScanRepositories.cs index b2997947..322c2cda 100644 --- a/src/ViewModels/ScanRepositories.cs +++ b/src/ViewModels/ScanRepositories.cs @@ -13,15 +13,12 @@ namespace SourceGit.ViewModels public string RootDir { get; - private set; } public ScanRepositories(string rootDir) { GetManagedRepositories(Preferences.Instance.RepositoryNodes, _managed); - RootDir = rootDir; - View = new Views.ScanRepositories() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/SetUpstream.cs b/src/ViewModels/SetUpstream.cs index efdf0377..a51586e6 100644 --- a/src/ViewModels/SetUpstream.cs +++ b/src/ViewModels/SetUpstream.cs @@ -8,7 +8,6 @@ namespace SourceGit.ViewModels public Models.Branch Local { get; - private set; } public List RemoteBranches @@ -49,8 +48,6 @@ namespace SourceGit.ViewModels if (upstream != null) SelectedRemoteBranch = upstream; } - - View = new Views.SetUpstream() { DataContext = this }; } public override Task Sure() @@ -75,7 +72,7 @@ namespace SourceGit.ViewModels }); } - private Repository _repo; + private readonly Repository _repo; private bool _unset = false; } } diff --git a/src/ViewModels/Squash.cs b/src/ViewModels/Squash.cs index 14a2ad2d..fa9d98e1 100644 --- a/src/ViewModels/Squash.cs +++ b/src/ViewModels/Squash.cs @@ -7,7 +7,7 @@ namespace SourceGit.ViewModels { public Models.Commit Target { - get => _target; + get; } [Required(ErrorMessage = "Commit message is required!!!")] @@ -20,10 +20,8 @@ namespace SourceGit.ViewModels public Squash(Repository repo, Models.Commit target, string shaToGetPreferMessage) { _repo = repo; - _target = target; _message = new Commands.QueryCommitFullMessage(_repo.FullPath, shaToGetPreferMessage).Result(); - - View = new Views.Squash() { DataContext = this }; + Target = target; } public override Task Sure() @@ -66,7 +64,6 @@ namespace SourceGit.ViewModels } private readonly Repository _repo; - private Models.Commit _target; private string _message; } } diff --git a/src/ViewModels/StashChanges.cs b/src/ViewModels/StashChanges.cs index 29ca5717..0b4fa7db 100644 --- a/src/ViewModels/StashChanges.cs +++ b/src/ViewModels/StashChanges.cs @@ -47,8 +47,6 @@ namespace SourceGit.ViewModels _repo = repo; _changes = changes; HasSelectedFiles = hasSelectedFiles; - - View = new Views.StashChanges() { DataContext = this }; } public override Task Sure() diff --git a/src/ViewModels/UpdateSubmodules.cs b/src/ViewModels/UpdateSubmodules.cs index f75cdb9d..c2f23133 100644 --- a/src/ViewModels/UpdateSubmodules.cs +++ b/src/ViewModels/UpdateSubmodules.cs @@ -8,8 +8,7 @@ namespace SourceGit.ViewModels public List Submodules { get; - private set; - } = new List(); + } = []; public string SelectedSubmodule { @@ -49,7 +48,6 @@ namespace SourceGit.ViewModels Submodules.Add(submodule.Path); SelectedSubmodule = Submodules.Count > 0 ? Submodules[0] : string.Empty; - View = new Views.UpdateSubmodules() { DataContext = this }; } public override Task Sure() diff --git a/src/Views/LauncherPage.axaml b/src/Views/LauncherPage.axaml index 46fb97f6..36ca39f0 100644 --- a/src/Views/LauncherPage.axaml +++ b/src/Views/LauncherPage.axaml @@ -67,7 +67,7 @@ diff --git a/src/Views/LauncherPage.axaml.cs b/src/Views/LauncherPage.axaml.cs index 3fa8269e..4ae6f545 100644 --- a/src/Views/LauncherPage.axaml.cs +++ b/src/Views/LauncherPage.axaml.cs @@ -1,4 +1,6 @@ +using System; using Avalonia.Controls; +using Avalonia.Controls.Presenters; using Avalonia.Input; using Avalonia.Interactivity; @@ -48,5 +50,35 @@ namespace SourceGit.Views e.Handled = true; } + + private void OnPopupDataContextChanged(object sender, EventArgs e) + { + if (sender is ContentPresenter presenter) + { + if (presenter.DataContext == null || presenter.DataContext is not ViewModels.Popup) + { + presenter.Content = null; + return; + } + + var dataTypeName = presenter.DataContext.GetType().FullName; + if (string.IsNullOrEmpty(dataTypeName)) + { + presenter.Content = null; + return; + } + + var viewTypeName = dataTypeName.Replace("ViewModels", "Views"); + var viewType = Type.GetType(viewTypeName); + if (viewType == null) + { + presenter.Content = null; + return; + } + + var view = Activator.CreateInstance(viewType); + presenter.Content = view; + } + } } }