Implement queue management UI and app upload for eto
This commit is contained in:
parent
531a1c1e34
commit
2fe4fa4592
|
@ -1,6 +1,9 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
|
using UpToolEto.Forms;
|
||||||
using UpToolLib.DataStructures;
|
using UpToolLib.DataStructures;
|
||||||
using UpToolLib.v2;
|
using UpToolLib.v2;
|
||||||
using UpToolLib.v2.TaskQueue;
|
using UpToolLib.v2.TaskQueue;
|
||||||
|
@ -9,9 +12,12 @@ namespace UpToolEto.Controls
|
||||||
{
|
{
|
||||||
public class AppControls : StackLayout
|
public class AppControls : StackLayout
|
||||||
{
|
{
|
||||||
|
private readonly IList<AppTask> _tasks;
|
||||||
private readonly List<AppControlButton> _buttons;
|
private readonly List<AppControlButton> _buttons;
|
||||||
public AppControls(TaskFactory factory, IList<AppTask> tasks)
|
private readonly Button _applyButton;
|
||||||
|
public AppControls(TaskFactory factory, IList<AppTask> tasks, IExternalFunctionality platform, Action update)
|
||||||
{
|
{
|
||||||
|
_tasks = tasks;
|
||||||
_buttons = new List<AppControlButton>
|
_buttons = new List<AppControlButton>
|
||||||
{
|
{
|
||||||
new AppControlButton<InstallTask>("Install", factory.CreateInstall, tasks, ReloadState,
|
new AppControlButton<InstallTask>("Install", factory.CreateInstall, tasks, ReloadState,
|
||||||
|
@ -21,7 +27,37 @@ namespace UpToolEto.Controls
|
||||||
new AppControlButton<RemoveTask>("Remove", factory.CreateRemove, tasks, ReloadState,
|
new AppControlButton<RemoveTask>("Remove", factory.CreateRemove, tasks, ReloadState,
|
||||||
app => app.Status.Contains(Status.Installed))
|
app => app.Status.Contains(Status.Installed))
|
||||||
};
|
};
|
||||||
|
_applyButton = new Button((_, _) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
QueueOverview overview = new(tasks);
|
||||||
|
overview.ShowModal();
|
||||||
|
if (!overview.Cancelled)
|
||||||
|
{
|
||||||
|
foreach (AppTask task in overview.TasksResulting)
|
||||||
|
{
|
||||||
|
task.Run();
|
||||||
|
_tasks.RemoveAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
platform.OkDialog("Failed to complete queue:\r\n" + e);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ReloadState();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
{
|
||||||
|
Text = "Apply",
|
||||||
|
Enabled = false
|
||||||
|
};
|
||||||
foreach (AppControlButton button in _buttons) Items.Add(button);
|
foreach (AppControlButton button in _buttons) Items.Add(button);
|
||||||
|
Items.Add(new StackLayoutItem(_applyButton, HorizontalAlignment.Right));
|
||||||
if (Main.DebugColors)
|
if (Main.DebugColors)
|
||||||
BackgroundColor = Colors.Yellow;
|
BackgroundColor = Colors.Yellow;
|
||||||
Orientation = Orientation.Horizontal;
|
Orientation = Orientation.Horizontal;
|
||||||
|
@ -29,20 +65,19 @@ namespace UpToolEto.Controls
|
||||||
|
|
||||||
public void SetApp(App app)
|
public void SetApp(App app)
|
||||||
{
|
{
|
||||||
Visible = true;
|
|
||||||
foreach (AppControlButton button in _buttons) button.SetApp(app);
|
foreach (AppControlButton button in _buttons) button.SetApp(app);
|
||||||
ReloadState();
|
ReloadState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
Visible = false;
|
|
||||||
foreach (AppControlButton button in _buttons) button.Clear();
|
foreach (AppControlButton button in _buttons) button.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReloadState()
|
private void ReloadState()
|
||||||
{
|
{
|
||||||
foreach (AppControlButton button in _buttons) button.ReloadState();
|
foreach (AppControlButton button in _buttons) button.ReloadState();
|
||||||
|
_applyButton.Enabled = _tasks.Any();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
|
using UpToolEto.Forms;
|
||||||
using UpToolLib.v1.Tool;
|
using UpToolLib.v1.Tool;
|
||||||
using UpToolLib.v2;
|
using UpToolLib.v2;
|
||||||
|
using UpToolLib.v2.TaskQueue;
|
||||||
|
|
||||||
namespace UpToolEto.Controls
|
namespace UpToolEto.Controls
|
||||||
{
|
{
|
||||||
|
@ -14,7 +17,7 @@ namespace UpToolEto.Controls
|
||||||
private readonly StackLayout _layout;
|
private readonly StackLayout _layout;
|
||||||
private readonly AppListSearchProvider _searchProvider;
|
private readonly AppListSearchProvider _searchProvider;
|
||||||
|
|
||||||
public AppList(AppExtras extras, Action<Guid, App> itemClickEvent, bool online)
|
public AppList(AppExtras extras, Action<Guid, App> itemClickEvent, bool online, TaskFactory factory, IList<AppTask> tasks)
|
||||||
{
|
{
|
||||||
_extras = extras;
|
_extras = extras;
|
||||||
_itemClickEvent = itemClickEvent;
|
_itemClickEvent = itemClickEvent;
|
||||||
|
|
|
@ -3,7 +3,6 @@ using Eto.Forms;
|
||||||
using UpToolLib.DataStructures;
|
using UpToolLib.DataStructures;
|
||||||
using UpToolLib.v2;
|
using UpToolLib.v2;
|
||||||
|
|
||||||
//TODO implement
|
|
||||||
namespace UpToolEto.Controls
|
namespace UpToolEto.Controls
|
||||||
{
|
{
|
||||||
public class AppListSearchProvider : StackLayout
|
public class AppListSearchProvider : StackLayout
|
||||||
|
@ -11,6 +10,7 @@ namespace UpToolEto.Controls
|
||||||
private readonly bool _online;
|
private readonly bool _online;
|
||||||
private readonly TextBox _search;
|
private readonly TextBox _search;
|
||||||
private readonly EnumDropDown<Status> _state;
|
private readonly EnumDropDown<Status> _state;
|
||||||
|
|
||||||
public AppListSearchProvider(bool online, Action refresh)
|
public AppListSearchProvider(bool online, Action refresh)
|
||||||
{
|
{
|
||||||
_online = online;
|
_online = online;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
|
@ -14,12 +15,26 @@ namespace UpToolEto.Controls
|
||||||
private readonly Label _appDescriptionLabel;
|
private readonly Label _appDescriptionLabel;
|
||||||
private readonly AppControls _appControls;
|
private readonly AppControls _appControls;
|
||||||
private App _app;
|
private App _app;
|
||||||
public AppPanel(TaskFactory factory, AppExtras extras, IList<AppTask> tasks)
|
public AppPanel(TaskFactory factory, AppExtras extras, IList<AppTask> tasks, IExternalFunctionality platform, Action updateAppList)
|
||||||
{
|
{
|
||||||
_appDescriptionLabel = new Label();
|
_appDescriptionLabel = new Label();
|
||||||
_appNameLabel = new Button((_, _) => extras.RunApp(_app));
|
_appNameLabel = new Button((_, _) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
extras.RunApp(_app);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
platform.OkDialog("Failed to start\r\n" + e);
|
||||||
|
}
|
||||||
|
});
|
||||||
_appNameLabel.Font = new Font(_appNameLabel.Font.Family, _appNameLabel.Font.Size * 2);
|
_appNameLabel.Font = new Font(_appNameLabel.Font.Family, _appNameLabel.Font.Size * 2);
|
||||||
_appControls = new AppControls(factory, tasks);
|
_appControls = new AppControls(factory, tasks, platform, () =>
|
||||||
|
{
|
||||||
|
updateAppList();
|
||||||
|
SetApp(_app);
|
||||||
|
});
|
||||||
Content = new StackLayout
|
Content = new StackLayout
|
||||||
{
|
{
|
||||||
Items =
|
Items =
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
using UpToolEto.Forms;
|
using UpToolEto.Forms;
|
||||||
using UpToolLib.DataStructures;
|
using UpToolLib.DataStructures;
|
||||||
using UpToolLib.v2;
|
using UpToolLib.v2;
|
||||||
|
using UpToolLib.v2.TaskQueue;
|
||||||
|
|
||||||
namespace UpToolEto.Controls
|
namespace UpToolEto.Controls
|
||||||
{
|
{
|
||||||
public class UTMenuBar : MenuBar
|
public class UTMenuBar : MenuBar
|
||||||
{
|
{
|
||||||
public UTMenuBar(MainForm mainForm, RepoManagement repoManagement, AppList appList, IExternalFunctionality platform)
|
public UTMenuBar(MainForm mainForm, RepoManagement repoManagement, TaskFactory factory, IList<AppTask> tasks, AppList appList, IExternalFunctionality platform)
|
||||||
{
|
{
|
||||||
Command reloadRepos = new() {MenuText = "Reload", ToolBarText = "Reload"};
|
Command reloadRepos = new() {MenuText = "Reload", ToolBarText = "Reload"};
|
||||||
reloadRepos.Executed += (_, _) =>
|
reloadRepos.Executed += (_, _) =>
|
||||||
|
@ -20,8 +23,23 @@ namespace UpToolEto.Controls
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Command openSettings = new() {MenuText = "Sources", ToolBarText = "Sources"};
|
Command editSources = new() {MenuText = "Sources", ToolBarText = "Sources"};
|
||||||
openSettings.Executed += (_, _) => new RepoForm(repoManagement).Show();
|
editSources.Executed += (_, _) => new RepoForm(repoManagement).ShowModal();
|
||||||
|
|
||||||
|
Command addPackage = new() {MenuText = "Add Package", ToolBarText = "Add Package"};
|
||||||
|
addPackage.Executed += (_, _) =>
|
||||||
|
{
|
||||||
|
OpenFileDialog dialog = new() {MultiSelect = false, CheckFileExists = true, Filters = { new FileFilter("App package", ".zip")}};
|
||||||
|
if (dialog.ShowDialog(mainForm) == DialogResult.Ok)
|
||||||
|
{
|
||||||
|
if (!tasks.Any(s => s is UploadTask t && t.ZipFile == dialog.FileName))
|
||||||
|
{
|
||||||
|
StringDialog sd = new("Package name") {Text = "New package"};
|
||||||
|
sd.ShowModal();
|
||||||
|
tasks.Add(factory.CreateUpload(dialog.FileName, sd.Text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Command quitCommand = new() {MenuText = "Quit", Shortcut = Application.Instance.CommonModifier | Keys.Q};
|
Command quitCommand = new() {MenuText = "Quit", Shortcut = Application.Instance.CommonModifier | Keys.Q};
|
||||||
quitCommand.Executed += (_, _) => Application.Instance.Quit();
|
quitCommand.Executed += (_, _) => Application.Instance.Quit();
|
||||||
|
@ -34,7 +52,8 @@ namespace UpToolEto.Controls
|
||||||
Text = "&File", Items =
|
Text = "&File", Items =
|
||||||
{
|
{
|
||||||
reloadRepos,
|
reloadRepos,
|
||||||
openSettings
|
editSources,
|
||||||
|
addPackage
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// File submenu
|
// File submenu
|
||||||
|
|
|
@ -7,7 +7,7 @@ using UpToolLib.DataStructures;
|
||||||
|
|
||||||
namespace UpToolEto.Forms
|
namespace UpToolEto.Forms
|
||||||
{
|
{
|
||||||
public class DownloadDialog : Form
|
public class DownloadDialog : Dialog
|
||||||
{
|
{
|
||||||
private readonly Uri _url;
|
private readonly Uri _url;
|
||||||
private readonly Application _application;
|
private readonly Application _application;
|
||||||
|
@ -47,12 +47,11 @@ namespace UpToolEto.Forms
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
WebClient client = new();
|
WebClient client = new();
|
||||||
client.DownloadProgressChanged += (_, args) =>
|
client.DownloadProgressChanged += (_, args) => _application.Invoke(() =>
|
||||||
{
|
{
|
||||||
_platform.Log($"{args.BytesReceived}/{args.TotalBytesToReceive}");
|
_bar.Value = args.ProgressPercentage;
|
||||||
_application.Invoke(() => _bar.Value = args.ProgressPercentage);
|
|
||||||
_application.RunIteration();
|
_application.RunIteration();
|
||||||
};
|
});
|
||||||
client.DownloadDataCompleted += (_, args) =>
|
client.DownloadDataCompleted += (_, args) =>
|
||||||
{
|
{
|
||||||
CurrentState = State.Success;
|
CurrentState = State.Success;
|
||||||
|
|
|
@ -6,8 +6,6 @@ using UpToolLib;
|
||||||
using UpToolLib.DataStructures;
|
using UpToolLib.DataStructures;
|
||||||
using UpToolLib.v2.TaskQueue;
|
using UpToolLib.v2.TaskQueue;
|
||||||
|
|
||||||
//TODO implement tasks queue UI and add control to execute queue, also needs to clear AppPanel and reload AppList
|
|
||||||
//TODO add control_upload
|
|
||||||
namespace UpToolEto.Forms
|
namespace UpToolEto.Forms
|
||||||
{
|
{
|
||||||
public partial class MainForm : Form
|
public partial class MainForm : Form
|
||||||
|
@ -19,8 +17,8 @@ namespace UpToolEto.Forms
|
||||||
_tasks = new List<AppTask>();
|
_tasks = new List<AppTask>();
|
||||||
Title = "UpTool2";
|
Title = "UpTool2";
|
||||||
MinimumSize = new Size(600, 100);
|
MinimumSize = new Size(600, 100);
|
||||||
AppList appList = new(lib.V1.AppExtras, (_, app) => _appPanel.SetApp(app), online);
|
AppList appList = new(lib.V1.AppExtras, (_, app) => _appPanel.SetApp(app), online, lib.V2.TaskFactory, _tasks);
|
||||||
_appPanel = new AppPanel(lib.V2.TaskFactory, lib.V1.AppExtras, _tasks);
|
_appPanel = new AppPanel(lib.V2.TaskFactory, lib.V1.AppExtras, _tasks, platform, appList.Update);
|
||||||
|
|
||||||
Content = new StackLayout
|
Content = new StackLayout
|
||||||
{
|
{
|
||||||
|
@ -32,7 +30,7 @@ namespace UpToolEto.Forms
|
||||||
},
|
},
|
||||||
Orientation = Orientation.Horizontal
|
Orientation = Orientation.Horizontal
|
||||||
};
|
};
|
||||||
Menu = new UTMenuBar(this, lib.V2.RepoManagement, appList, platform);
|
Menu = new UTMenuBar(this, lib.V2.RepoManagement, lib.V2.TaskFactory, _tasks, appList, platform);
|
||||||
Shown += (_, _) => init.Close();
|
Shown += (_, _) => init.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Eto.Forms;
|
||||||
|
using UpToolLib.v2.TaskQueue;
|
||||||
|
|
||||||
|
namespace UpToolEto.Forms
|
||||||
|
{
|
||||||
|
public class QueueOverview : Dialog
|
||||||
|
{
|
||||||
|
private readonly IList<AppTask> _tasks;
|
||||||
|
public bool Cancelled;
|
||||||
|
CheckBoxList cbl;
|
||||||
|
public List<AppTask> TasksResulting => cbl.SelectedValues.Select(s => (AppTask) s).ToList();
|
||||||
|
|
||||||
|
public QueueOverview(IList<AppTask> tasks)
|
||||||
|
{
|
||||||
|
_tasks = tasks;
|
||||||
|
StackLayout layout = new();
|
||||||
|
layout.Items.Add(new StackLayoutItem(new StackLayout()
|
||||||
|
{
|
||||||
|
Items =
|
||||||
|
{
|
||||||
|
new StackLayoutItem(new Button((_, _) =>
|
||||||
|
{
|
||||||
|
Cancelled = true;
|
||||||
|
Close();
|
||||||
|
})
|
||||||
|
{
|
||||||
|
Text = "Cancel"
|
||||||
|
}, HorizontalAlignment.Stretch),
|
||||||
|
new StackLayoutItem(new Button((_, _) =>
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
})
|
||||||
|
{
|
||||||
|
Text = "OK"
|
||||||
|
}, HorizontalAlignment.Stretch)
|
||||||
|
},
|
||||||
|
Orientation = Orientation.Horizontal
|
||||||
|
}, HorizontalAlignment.Stretch));
|
||||||
|
cbl = new CheckBoxList {DataStore = tasks, SelectedValues = tasks};
|
||||||
|
layout.Items.Add(cbl);
|
||||||
|
Content = layout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ using UpToolLib.v2;
|
||||||
|
|
||||||
namespace UpToolEto.Forms
|
namespace UpToolEto.Forms
|
||||||
{
|
{
|
||||||
public class RepoForm : Form
|
public class RepoForm : Dialog
|
||||||
{
|
{
|
||||||
private readonly RepoManagement _management;
|
private readonly RepoManagement _management;
|
||||||
private List<Repo> _repos = new();
|
private List<Repo> _repos = new();
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
using Eto.Forms;
|
||||||
|
|
||||||
|
namespace UpToolEto.Forms
|
||||||
|
{
|
||||||
|
public class StringDialog : Dialog
|
||||||
|
{
|
||||||
|
private readonly TextBox _tb;
|
||||||
|
public string Text
|
||||||
|
{
|
||||||
|
get => _tb.Text;
|
||||||
|
set => _tb.Text = value;
|
||||||
|
}
|
||||||
|
public StringDialog(string title)
|
||||||
|
{
|
||||||
|
_tb = new TextBox();
|
||||||
|
Content = _tb;
|
||||||
|
Title = title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@ namespace UpToolEto
|
||||||
public Tuple<bool, byte[]> Download(Uri link)
|
public Tuple<bool, byte[]> Download(Uri link)
|
||||||
{
|
{
|
||||||
DownloadDialog dlg = new(link, _application, this);
|
DownloadDialog dlg = new(link, _application, this);
|
||||||
_application.AsyncInvoke(() => dlg.Show());
|
_application.AsyncInvoke(() => dlg.ShowModal());
|
||||||
dlg.StartDownload();
|
dlg.StartDownload();
|
||||||
Log("Downloading " + link);
|
Log("Downloading " + link);
|
||||||
while (dlg.CurrentState == DownloadDialog.State.Downloading) Thread.Sleep(20);
|
while (dlg.CurrentState == DownloadDialog.State.Downloading) Thread.Sleep(20);
|
||||||
|
|
Reference in New Issue