161 lines
5.6 KiB
C#
161 lines
5.6 KiB
C#
using ModpackUpdater.Apps.Manager.Api.Model;
|
|
using ModpackUpdater.Apps.Manager.Api.Plugins.Features;
|
|
using ModpackUpdater.Apps.Manager.Api.Plugins.Params;
|
|
using ModpackUpdater.Apps.Manager.LangRes;
|
|
using ModpackUpdater.Apps.Manager.Settings;
|
|
using Pilz.Plugins.Advanced;
|
|
using Pilz.Plugins.Advanced.UI.Telerik;
|
|
using Pilz.UI.Symbols;
|
|
using Telerik.WinControls;
|
|
using Telerik.WinControls.UI;
|
|
|
|
namespace ModpackUpdater.Apps.Manager;
|
|
|
|
public partial class Form1 : RadForm, IMainApi
|
|
{
|
|
private IWorkspace? workspace;
|
|
|
|
public IWorkspace? Workspace => workspace;
|
|
|
|
private record RecentFileItemTag(WorkspaceConfig Config, WorkspaceFeature Feature);
|
|
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
|
|
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);
|
|
|
|
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<WorkspaceSettings>();
|
|
|
|
radMenuItem_RecentWorkspaces.Items.Clear();
|
|
|
|
foreach (var config in settings.Workspaces.ToArray())
|
|
{
|
|
if (PluginFeatureController.Instance.Features.Get(FeatureTypes.Workspace).OfType<WorkspaceFeature>().FirstOrDefault(n => n.Identifier == config.ProviderId) is not WorkspaceFeature feature)
|
|
{
|
|
settings.Workspaces.Remove(config);
|
|
continue;
|
|
}
|
|
|
|
var item = new RadMenuItem
|
|
{
|
|
Text = config.DisplayText,
|
|
Tag = new RecentFileItemTag(config, feature),
|
|
SvgImage = feature.Icon as RadSvgImage,
|
|
};
|
|
|
|
item.Click += RadMenuItem_OpenRecentWorkspace_Click;
|
|
|
|
radMenuItem_RecentWorkspaces.Items.Add(item);
|
|
}
|
|
|
|
if (radMenuItem_RecentWorkspaces.Items.Any())
|
|
radMenuItem_RecentWorkspaces.Visibility = ElementVisibility.Visible;
|
|
else
|
|
radMenuItem_RecentWorkspaces.Visibility = ElementVisibility.Collapsed;
|
|
}
|
|
|
|
private void AddToRecentFiles(IWorkspace workspace)
|
|
{
|
|
var settings = Program.Settings.Get<WorkspaceSettings>();
|
|
|
|
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);
|
|
|
|
radWaitingBar_Updates.StartWaiting();
|
|
|
|
if (!await workspace.Load())
|
|
{
|
|
radWaitingBar_Updates.StopWaiting();
|
|
return;
|
|
}
|
|
|
|
Invoke(LoadWorkspace);
|
|
}
|
|
|
|
private void LoadWorkspace()
|
|
{
|
|
if (workspace?.Config is null || workspace.InstallInfos is null || workspace.UpdateInfos is null)
|
|
return;
|
|
|
|
radWaitingBar_Updates.StartWaiting();
|
|
Text = workspace.Config.DisplayText;
|
|
radTreeView_Updates.BeginUpdate();
|
|
radTreeView_Updates.Nodes.Clear();
|
|
|
|
radTreeView_Updates.Nodes.Add(new RadTreeNode
|
|
{
|
|
Text = string.Format(GeneralLangRes.Node_Install, workspace.InstallInfos.Version.ToString()),
|
|
Tag = workspace.InstallInfos,
|
|
});
|
|
|
|
foreach (var update in workspace.UpdateInfos.Updates)
|
|
{
|
|
radTreeView_Updates.Nodes.Add(new RadTreeNode
|
|
{
|
|
Text = string.Format(GeneralLangRes.Node_Update, update.Version.ToString()),
|
|
Tag = update,
|
|
});
|
|
}
|
|
|
|
radTreeView_Updates.EndUpdate();
|
|
radWaitingBar_Updates.StopWaiting();
|
|
}
|
|
|
|
private void LoadActionSet()
|
|
{
|
|
// ...
|
|
}
|
|
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
{
|
|
LoadRecentWorkspaces();
|
|
}
|
|
|
|
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 RecentFileItemTag tag && tag.Feature.CreateFromConfig(tag.Config) is IWorkspace workspace)
|
|
await LoadNewWorkspace(workspace);
|
|
}
|
|
|
|
private void RadMenuItem_ToolsItem_Click(object? sender, EventArgs e)
|
|
{
|
|
if (sender is RadMenuItem item && item.Tag is PluginFunction func)
|
|
func.Execute(new MainApiParameters(this));
|
|
}
|
|
}
|