From 5e678db07715105270bc80ea2902373533a1589b Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 6 Sep 2024 16:55:04 +0200 Subject: [PATCH] some work for loading a workspace --- .../Api/Model/WorkspaceConfig.cs | 3 +- .../Api/Plugins/Features/WorkspaceFeature.cs | 12 ++- .../GitLabRepo/GitLabRepoWorkspace.cs | 1 + .../GitLabRepo/GitLabRepoWorkspaceConfig.cs | 9 +++ .../GitLabRepo/GitLabRepoWorkspaceFeature.cs | 11 ++- ModpackUpdater.Apps.Manager/Form1.Designer.cs | 14 +++- ModpackUpdater.Apps.Manager/Form1.cs | 78 +++++++++++++++++-- 7 files changed, 114 insertions(+), 14 deletions(-) diff --git a/ModpackUpdater.Apps.Manager/Api/Model/WorkspaceConfig.cs b/ModpackUpdater.Apps.Manager/Api/Model/WorkspaceConfig.cs index fb82c9c..f40d468 100644 --- a/ModpackUpdater.Apps.Manager/Api/Model/WorkspaceConfig.cs +++ b/ModpackUpdater.Apps.Manager/Api/Model/WorkspaceConfig.cs @@ -1,6 +1,7 @@ namespace ModpackUpdater.Apps.Manager.Api.Model; -public class WorkspaceConfig +public abstract class WorkspaceConfig { public string ProviderId { get; internal set; } = "origin.unknown"; + public abstract string DisplayText { get; } } diff --git a/ModpackUpdater.Apps.Manager/Api/Plugins/Features/WorkspaceFeature.cs b/ModpackUpdater.Apps.Manager/Api/Plugins/Features/WorkspaceFeature.cs index e84c36a..cb9d33f 100644 --- a/ModpackUpdater.Apps.Manager/Api/Plugins/Features/WorkspaceFeature.cs +++ b/ModpackUpdater.Apps.Manager/Api/Plugins/Features/WorkspaceFeature.cs @@ -10,7 +10,7 @@ public abstract class WorkspaceFeature(string identifier, string name) : PluginF return workspace?.Config == null || workspace.Config.ProviderId == Identifier; } - public virtual bool Configure(ref IWorkspace workspace) + public virtual bool Configure(ref IWorkspace? workspace) { OnConfigure(ref workspace); @@ -22,5 +22,13 @@ public abstract class WorkspaceFeature(string identifier, string name) : PluginF return true; } - protected abstract bool OnConfigure(ref IWorkspace workspace); + public virtual IWorkspace CreateFromSettings(WorkspaceConfig config) + { + OnCreate(out var workspace, config); + return workspace; + } + + protected abstract void OnCreate(out IWorkspace workspace, WorkspaceConfig config); + + protected abstract bool OnConfigure(ref IWorkspace? workspace); } diff --git a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspace.cs b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspace.cs index e3c8642..4d8578d 100644 --- a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspace.cs +++ b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspace.cs @@ -21,6 +21,7 @@ internal class GitLabRepoWorkspace(GitLabRepoWorkspaceConfig config) : IWorkspac { InstallInfos = InstallInfos.Parse(await GetContent(ConfigX.FileLocationInstallJson)); UpdateInfos = UpdateInfos.Parse(await GetContent(ConfigX.FileLocationUpdateJson)); + ConfigX.InstanceUrl = (await Gitlab.Projects.GetByIdAsync((int)ConfigX.RepoId, new())).NameWithNamespace; return InstallInfos != null && UpdateInfos != null; } diff --git a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceConfig.cs b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceConfig.cs index c2d0e4d..8ac8cdd 100644 --- a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceConfig.cs +++ b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceConfig.cs @@ -5,10 +5,19 @@ namespace ModpackUpdater.Apps.Manager.Features.Workspaces.GitLabRepo; internal class GitLabRepoWorkspaceConfig : WorkspaceConfig { + public override string DisplayText => $"{RepoName ?? "?"} at {RepoBranche} on {InstanceUrl}"; + + public string? RepoName { get; set; } + public string InstanceUrl { get; set; } = "https://gitlab.com"; + public string? ApiToken { get; set; } + public long RepoId { get; set; } = -1L; + public string RepoBranche { get; set; } = "master"; + public string FileLocationInstallJson { get; set; } = "install.json"; + public string FileLocationUpdateJson { get; set; } = "update.json"; } diff --git a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceFeature.cs b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceFeature.cs index ffc25af..e6cde5d 100644 --- a/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceFeature.cs +++ b/ModpackUpdater.Apps.Manager/Features/Workspaces/GitLabRepo/GitLabRepoWorkspaceFeature.cs @@ -17,7 +17,7 @@ internal class GitLabRepoWorkspaceFeature : WorkspaceFeature, IPluginFeatureProv Icon = AppGlobals.Symbols.GetSvgImage(AppSymbols.gitlab, SymbolSize.Small); } - protected override bool OnConfigure(ref IWorkspace workspace) + protected override bool OnConfigure(ref IWorkspace? workspace) { var settings = workspace?.Config as GitLabRepoWorkspaceConfig ?? new(); @@ -25,6 +25,15 @@ internal class GitLabRepoWorkspaceFeature : WorkspaceFeature, IPluginFeatureProv return false; workspace = new GitLabRepoWorkspace(settings); + return true; } + + protected override void OnCreate(out IWorkspace workspace, WorkspaceConfig config) + { + if (config is not GitLabRepoWorkspaceConfig gitlabConfig) + throw new NotImplementedException($"Only configs of type {typeof(GitLabRepoWorkspaceConfig).Name} are allowed."); + + workspace = new GitLabRepoWorkspace(gitlabConfig); + } } diff --git a/ModpackUpdater.Apps.Manager/Form1.Designer.cs b/ModpackUpdater.Apps.Manager/Form1.Designer.cs index 05c4de0..b843f56 100644 --- a/ModpackUpdater.Apps.Manager/Form1.Designer.cs +++ b/ModpackUpdater.Apps.Manager/Form1.Designer.cs @@ -28,7 +28,7 @@ partial class Form1 /// private void InitializeComponent() { - var tableViewDefinition2 = new Telerik.WinControls.UI.TableViewDefinition(); + var tableViewDefinition1 = new Telerik.WinControls.UI.TableViewDefinition(); radSplitContainer1 = new Telerik.WinControls.UI.RadSplitContainer(); splitPanel1 = new Telerik.WinControls.UI.SplitPanel(); tableLayoutPanel2 = new TableLayoutPanel(); @@ -43,6 +43,7 @@ partial class Form1 radMenuItem_RecentWorkspaces = new Telerik.WinControls.UI.RadMenuItem(); radMenuItem_Tools = new Telerik.WinControls.UI.RadMenuItem(); radMenu1 = new Telerik.WinControls.UI.RadMenu(); + radMenuItem_SaveWorkspace = new Telerik.WinControls.UI.RadMenuItem(); ((System.ComponentModel.ISupportInitialize)radSplitContainer1).BeginInit(); radSplitContainer1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitPanel1).BeginInit(); @@ -147,14 +148,14 @@ partial class Form1 // // // - radGridView_Actions.MasterTemplate.ViewDefinition = tableViewDefinition2; + radGridView_Actions.MasterTemplate.ViewDefinition = tableViewDefinition1; radGridView_Actions.Name = "radGridView_Actions"; radGridView_Actions.Size = new Size(544, 416); radGridView_Actions.TabIndex = 0; // // radMenuItem_Workspace // - radMenuItem_Workspace.Items.AddRange(new Telerik.WinControls.RadItem[] { radMenuItem_WorkspacePreferences, radMenuSeparatorItem1, radMenuItem_OpenNewWorkspace, radMenuItem_RecentWorkspaces }); + radMenuItem_Workspace.Items.AddRange(new Telerik.WinControls.RadItem[] { radMenuItem_WorkspacePreferences, radMenuItem_SaveWorkspace, radMenuSeparatorItem1, radMenuItem_OpenNewWorkspace, radMenuItem_RecentWorkspaces }); radMenuItem_Workspace.Name = "radMenuItem_Workspace"; radMenuItem_Workspace.Text = "Workspace"; // @@ -192,6 +193,11 @@ partial class Form1 radMenu1.Size = new Size(800, 28); radMenu1.TabIndex = 1; // + // radMenuItem_SaveWorkspace + // + radMenuItem_SaveWorkspace.Name = "radMenuItem_SaveWorkspace"; + radMenuItem_SaveWorkspace.Text = "Save"; + // // Form1 // AutoScaleBaseSize = new Size(7, 15); @@ -203,6 +209,7 @@ partial class Form1 Name = "Form1"; StartPosition = FormStartPosition.CenterScreen; Text = "Minecraft Modpack Updates Manager"; + Load += Form1_Load; ((System.ComponentModel.ISupportInitialize)radSplitContainer1).EndInit(); radSplitContainer1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)splitPanel1).EndInit(); @@ -236,4 +243,5 @@ partial class Form1 private Telerik.WinControls.UI.RadMenuSeparatorItem radMenuSeparatorItem1; private Telerik.WinControls.UI.RadMenuItem radMenuItem_OpenNewWorkspace; private Telerik.WinControls.UI.RadMenuItem radMenuItem_RecentWorkspaces; + private Telerik.WinControls.UI.RadMenuItem radMenuItem_SaveWorkspace; } diff --git a/ModpackUpdater.Apps.Manager/Form1.cs b/ModpackUpdater.Apps.Manager/Form1.cs index 9c1894f..601e21f 100644 --- a/ModpackUpdater.Apps.Manager/Form1.cs +++ b/ModpackUpdater.Apps.Manager/Form1.cs @@ -1,5 +1,7 @@ using ModpackUpdater.Apps.Manager.Api.Model; +using ModpackUpdater.Apps.Manager.Api.Plugins.Features; using ModpackUpdater.Apps.Manager.Api.Plugins.Params; +using ModpackUpdater.Apps.Manager.Settings; using Pilz.Plugins.Advanced; using Pilz.Plugins.Advanced.UI.Telerik; using Pilz.UI.Symbols; @@ -9,7 +11,9 @@ namespace ModpackUpdater.Apps.Manager; public partial class Form1 : RadForm, IMainApi { - public IWorkspace? Workspace { get; set; } + private IWorkspace? workspace; + + public IWorkspace? Workspace => workspace; public Form1() { @@ -17,17 +21,68 @@ public partial class Form1 : RadForm, IMainApi radMenuItem_Workspace.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.workspace, SymbolSize.Small); radMenuItem_WorkspacePreferences.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.settings, SymbolSize.Small); + radMenuItem_SaveWorkspace.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.save, SymbolSize.Small); radMenuItem_OpenNewWorkspace.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.new_window, SymbolSize.Small); radMenuItem_RecentWorkspaces.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.time_machine, SymbolSize.Small); radMenuItem_Tools.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.tools, SymbolSize.Small); - PluginFeatureController.Instance.Functions.Get(FeatureTypes.Workspace).InsertItemsTo(radMenuItem_OpenNewWorkspace.Items, customClickHandler: RadMenuItem_OpenNewWorkspace_Click); + radMenuItem_SaveWorkspace.Shortcuts.Add(new(Keys.Control, Keys.S)); + + PluginFeatureController.Instance.Features.Get(FeatureTypes.Workspace).InsertItemsTo(radMenuItem_OpenNewWorkspace.Items, customClickHandler: RadMenuItem_OpenNewWorkspace_Click); PluginFeatureController.Instance.Functions.Get(FeatureTypes.Tools).InsertItemsTo(radMenuItem_OpenNewWorkspace.Items, customClickHandler: RadMenuItem_ToolsItem_Click); } private void LoadRecentWorkspaces() { - // ... + var settings = Program.Settings.Get(); + + radMenuItem_RecentWorkspaces.Items.Clear(); + + foreach (var config in settings.Workspaces) + { + var item = new RadMenuItem + { + Text = config.DisplayText, + Tag = config, + }; + + item.Click += RadMenuItem_OpenRecentWorkspace_Click; + + radMenuItem_RecentWorkspaces.Items.Add(item); + } + + if (radMenuItem_RecentWorkspaces.Items.Any()) + radMenuItem_RecentWorkspaces.Visibility = Telerik.WinControls.ElementVisibility.Visible; + else + radMenuItem_RecentWorkspaces.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; + } + + private void AddToRecentFiles(IWorkspace workspace) + { + var settings = Program.Settings.Get(); + + settings.Workspaces.Remove(workspace.Config); + settings.Workspaces.Insert(0, workspace.Config); + + while (settings.Workspaces.Count > 20) + settings.Workspaces.RemoveAt(20); + } + + private async Task LoadNewWorkspace(IWorkspace? workspace) + { + if (workspace is null) + return; + + if (workspace != this.workspace) + this.workspace = workspace; + + AddToRecentFiles(workspace); + Invoke(LoadRecentWorkspaces); + + if (!await workspace.Load()) + return; + + Invoke(LoadWorkspace); } private void LoadWorkspace() @@ -40,14 +95,23 @@ public partial class Form1 : RadForm, IMainApi // ... } - private void RadMenuItem_OpenNewWorkspace_Click(object? sender, EventArgs e) + private void Form1_Load(object sender, EventArgs e) { - // ... + LoadRecentWorkspaces(); } - private void RadMenuItem_OpenRecentWorkspace_Click(object? sender, EventArgs e) + private async void RadMenuItem_OpenNewWorkspace_Click(object? sender, EventArgs e) { - // ... + if (sender is RadMenuItem item && item.Tag is WorkspaceFeature feature && feature.Configure(ref workspace)) + await LoadNewWorkspace(workspace); + } + + private async void RadMenuItem_OpenRecentWorkspace_Click(object? sender, EventArgs e) + { + if (sender is RadMenuItem item && item.Tag is WorkspaceConfig config + && PluginFeatureController.Instance.Features.Get(FeatureTypes.Workspace).OfType().FirstOrDefault(n => n.Identifier == config.ProviderId) is WorkspaceFeature feature + && feature.CreateFromSettings(config) is IWorkspace workspace) + await LoadNewWorkspace(workspace); } private void RadMenuItem_ToolsItem_Click(object? sender, EventArgs e)