diff --git a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.0.png b/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.0.png deleted file mode 100644 index daec758..0000000 Binary files a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.0.png and /dev/null differ diff --git a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.1.png b/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.1.png deleted file mode 100644 index 13080f9..0000000 Binary files a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.1.png and /dev/null differ diff --git a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.2.png b/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.2.png deleted file mode 100644 index 1f9e1e6..0000000 Binary files a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.2.png and /dev/null differ diff --git a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.3.png b/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.3.png deleted file mode 100644 index 6f06c09..0000000 Binary files a/ZXBSInstaller.Log/InstallerResources/zxbasic.scr.3.png and /dev/null differ diff --git a/ZXBSInstaller.Log/ZXBSInstaller.Log.csproj b/ZXBSInstaller.Log/ZXBSInstaller.Log.csproj index 7cf15fe..d01edc3 100644 --- a/ZXBSInstaller.Log/ZXBSInstaller.Log.csproj +++ b/ZXBSInstaller.Log/ZXBSInstaller.Log.csproj @@ -11,21 +11,9 @@ - - PreserveNewest - PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest diff --git a/ZXBSInstaller/Controls/ConfigControl.axaml b/ZXBSInstaller/Controls/ConfigControl.axaml deleted file mode 100644 index f400dbf..0000000 --- a/ZXBSInstaller/Controls/ConfigControl.axaml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + diff --git a/ZXBSInstaller/Controls/MainControl.axaml.cs b/ZXBSInstaller/Controls/MainControl.axaml.cs index 3db3eff..405c564 100644 --- a/ZXBSInstaller/Controls/MainControl.axaml.cs +++ b/ZXBSInstaller/Controls/MainControl.axaml.cs @@ -3,13 +3,17 @@ using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using Avalonia.Threading; +using Avalonia.VisualTree; using MsBox.Avalonia; using MsBox.Avalonia.Dto; using MsBox.Avalonia.Enums; using System; using System.Collections.Generic; using System.Data; +using System.Linq; +using System.Security.Cryptography; using System.Threading; +using ZXBSInstaller.Controls; using ZXBSInstaller.Log; using ZXBSInstaller.Log.Neg; @@ -17,15 +21,17 @@ namespace ZXBSInstaller.Controls; public partial class MainControl : UserControl { - private ExternalTool[] tools = null; - private List toolsControls = null; + private List toolItemControls = new List(); + public MainControl() { InitializeComponent(); this.Loaded += MainControl_Loaded; - this.lstTools.SelectionChanged += LstTools_SelectionChanged; + txtBasePath.TextChanged += TxtBasePath_TextChanged; + chkOnlyStableVersions.IsCheckedChanged += ChkOnlyStableVersions_IsCheckedChanged; + chkSetZXBSOptions.IsCheckedChanged += ChkSetZXBSOptions_IsCheckedChanged; } private void MainControl_Loaded(object? sender, RoutedEventArgs e) @@ -37,14 +43,15 @@ private void MainControl_Loaded(object? sender, RoutedEventArgs e) private void Initialize() { ServiceLayer.Initialize(ShowStatusPanel, UpdateStatus, HideStatusPanel, GetExternalTools, ShowMessage); - if (ServiceLayer.GeneralConfig == null) - { - ShowConfig(); - } - else + + Dispatcher.UIThread.Post(() => { - GetExternalTools(); - } + txtBasePath.Text = ServiceLayer.GeneralConfig.BasePath; + chkOnlyStableVersions.IsChecked = ServiceLayer.GeneralConfig.OnlyStableVersions; + chkSetZXBSOptions.IsChecked = ServiceLayer.GeneralConfig.SetZXBSConfig; + }); + + GetExternalTools(); } @@ -71,12 +78,15 @@ private void GetExternalTools() { Dispatcher.UIThread.Post(() => { + mainVersions.IsVisible = false; + mainTools.IsVisible = true; + txtStatus.Text = "Working..."; progressBar.Value = 0; pnlStatus.IsVisible = true; }); - tools = ServiceLayer.GetExternalTools(); + var tools = ServiceLayer.GetExternalTools(); Dispatcher.UIThread.Post(() => { @@ -96,26 +106,77 @@ private void GetExternalTools() } else { - ShowData(tools); + ShowData(); } }); } - private void ShowData(ExternalTool[] tools) + private void ShowData() { - toolsControls = new List(); + toolItemControls.Clear(); + var tools = ServiceLayer.ExternalTools; - lstTools.Items.Clear(); + pnlTools.Children.Clear(); foreach (var tool in tools) { - var control = new ToolsListItemControl(); - control.ExternalTool = tool; - control.Refresh(); - toolsControls.Add(control); - lstTools.Items.Add(control); + var control = new ToolItemControl(tool, Command_Received); + toolItemControls.Add(control); + pnlTools.Children.Add(control); + } + UpdateSummary(); + } + + + private void Command_Received(string id, string command) + { + switch (command) + { + case "REFRESH": + GetExternalTools(); + break; + case "CHECKED": + UpdateSummary(); + break; + case "VERSIONS": + ShowVersions(id); + break; } - lstTools.SelectedIndex = 0; + } + + + private void UpdateSummary() + { + Dispatcher.UIThread.Post(() => + { + pnlSummary.Children.Clear(); + bool allUpToDate = true; + foreach (var tool in toolItemControls) + { + if (tool.IsSelected) + { + var tb = new TextBlock(); + tb.TextWrapping = Avalonia.Media.TextWrapping.Wrap; + if (tool.ExternalTool.InstalledVersion == null) + { + tb.Text = $"- Install:\r\n\t{tool.ExternalTool.Name}\r\n\tPath: {tool.ExternalTool.LocalPath}\r\n"; + } + else + { + tb.Text = $"- Update:\r\n\t{tool.ExternalTool.Name}\r\n\tPath: {tool.ExternalTool.LocalPath}\r\n"; + } + pnlSummary.Children.Add(tb); + allUpToDate = false; + } + } + if (allUpToDate) + { + var tb = new TextBlock(); + tb.TextWrapping = Avalonia.Media.TextWrapping.Wrap; + tb.Text = "All tools are up to date."; + pnlSummary.Children.Add(tb); + } + }); } @@ -159,56 +220,107 @@ private void UpdateStatus(string message, int progress) }); } - - private void LstTools_SelectionChanged(object? sender, SelectionChangedEventArgs e) + private void btnSelectPath_Click(object? sender, RoutedEventArgs e) { - if (lstTools.SelectedItems == null || lstTools.SelectedItems.Count == 0) + var dlg = new OpenFolderDialog() { - return; - } - - var ctrl = lstTools.SelectedItems[0] as ToolsListItemControl; - if (ctrl == null) + Title = "Select tools base path" + }; + dlg.Directory = txtBasePath.Text; + var wnd = this.GetVisualRoot() as Window; + dlg.ShowAsync(wnd).ContinueWith((t) => { - return; - } + if (!string.IsNullOrEmpty(t.Result)) + { + Dispatcher.UIThread.Post(() => + { + txtBasePath.Text = t.Result; + }); + } + }); + } + + + private void btnInstall_Click(object? sender, RoutedEventArgs e) + { + new Thread(ServiceLayer.DownloadAndInstallTools).Start(); + } + + + private void ChkSetZXBSOptions_IsCheckedChanged(object? sender, RoutedEventArgs e) + { + ServiceLayer.GeneralConfig.SetZXBSConfig = chkSetZXBSOptions.IsChecked == true; + ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); + } - var tool = new ToolItemControl(); - tool.ExternalTool = ctrl.ExternalTool; - tool.LocalVersion = ctrl.LocalVersion; - tool.Refresh(); - pnlWorking.Children.Clear(); - pnlWorking.Children.Add(tool); + private void ChkOnlyStableVersions_IsCheckedChanged(object? sender, RoutedEventArgs e) + { + ServiceLayer.GeneralConfig.OnlyStableVersions = chkOnlyStableVersions.IsChecked == true; + ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); } - private void btnConfig_Click(object? sender, RoutedEventArgs e) + + private void TxtBasePath_TextChanged(object? sender, TextChangedEventArgs e) { - ShowConfig(); + ServiceLayer.GeneralConfig.BasePath = txtBasePath.Text; + ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); } - private void ShowConfig() + private void ShowVersions(string id) { Dispatcher.UIThread.Post(() => { - pnlModalContainer.Children.Clear(); - pnlModalOverlay.IsVisible = true; - var dlgConfig = new ConfigControl(); - dlgConfig.Show(ShowConfig_Closed); - pnlModalContainer.Children.Add(dlgConfig); + mainTools.IsVisible = false; + mainVersions.IsVisible = true; + pnlVersions.Children.Clear(); + var tool = ServiceLayer.ExternalTools.FirstOrDefault(d => d.Id == id); + + { + var btn = new Button() + { + Content = "Close", + HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Right, + Margin = new Thickness(10) + }; + btn.Click += Versions_Close; + pnlVersions.Children.Add(btn); + } + + var versionControlHeader = new VersionControl(null, null,Command_Received); + pnlVersions.Children.Add(versionControlHeader); + foreach (var version in tool.Versions) + { + if (ServiceLayer.GeneralConfig.OnlyStableVersions && version.BetaNumber > 0) + { + continue; + } + var versionControl = new VersionControl(tool, version, Command_Received); + pnlVersions.Children.Add(versionControl); + } + + { + var btn = new Button() + { + Content = "Close", + HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Right, + Margin = new Thickness(10) + }; + btn.Click += Versions_Close; + pnlVersions.Children.Add(btn); + } + }); } - private void ShowConfig_Closed(bool saved) + private void Versions_Close(object? sender, RoutedEventArgs e) { - pnlModalOverlay.IsVisible = false; - pnlModalContainer.Children.Clear(); - - if (saved) + Dispatcher.UIThread.Post(() => { - new Thread(GetExternalTools).Start(); - } + mainTools.IsVisible = true; + mainVersions.IsVisible = false; + }); } } \ No newline at end of file diff --git a/ZXBSInstaller/Controls/ScreenShotControl.axaml b/ZXBSInstaller/Controls/ScreenShotControl.axaml deleted file mode 100644 index de6cff8..0000000 --- a/ZXBSInstaller/Controls/ScreenShotControl.axaml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/ZXBSInstaller/Controls/ScreenShotControl.axaml.cs b/ZXBSInstaller/Controls/ScreenShotControl.axaml.cs deleted file mode 100644 index 4478314..0000000 --- a/ZXBSInstaller/Controls/ScreenShotControl.axaml.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Avalonia.Media.Imaging; -using System.IO; - -namespace ZXBSInstaller.Controls; - -public partial class ScreenShotControl : UserControl -{ - public ScreenShotControl(string fileName) - { - InitializeComponent(); - - using var stream = File.OpenRead(fileName); - imgScreenShot.Source = new Bitmap(stream); - } -} \ No newline at end of file diff --git a/ZXBSInstaller/Controls/ToolItemControl.axaml b/ZXBSInstaller/Controls/ToolItemControl.axaml index e63336a..e7ca840 100644 --- a/ZXBSInstaller/Controls/ToolItemControl.axaml +++ b/ZXBSInstaller/Controls/ToolItemControl.axaml @@ -2,70 +2,23 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="ZXBSInstaller.Controls.ToolItemControl"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/ZXBSInstaller/Controls/ToolItemControl.axaml.cs b/ZXBSInstaller/Controls/ToolItemControl.axaml.cs index 80c0452..ea281da 100644 --- a/ZXBSInstaller/Controls/ToolItemControl.axaml.cs +++ b/ZXBSInstaller/Controls/ToolItemControl.axaml.cs @@ -2,275 +2,75 @@ using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Media; -using Avalonia.Media.Imaging; -using Avalonia.Threading; -using Avalonia.VisualTree; using System; -using System.IO; -using System.Linq; -using System.Threading; -using ZXBSInstaller.Log; using ZXBSInstaller.Log.Neg; namespace ZXBSInstaller.Controls; public partial class ToolItemControl : UserControl { - public ExternalTool ExternalTool { get; set; } - public ExternalTools_Version LocalVersion = null; + public ExternalTool ExternalTool = null; + public bool IsSelected = false; - private ExternalTools_Version AvailableVersion = null; - private ExternalTools_Version LatestVersion = null; - private ExternalTools_Version LatestStableVersion = null; + public static SolidColorBrush colorRed = new SolidColorBrush(Colors.Red); + public static SolidColorBrush colorGreen = new SolidColorBrush(Colors.LightGreen); - public ToolItemControl() - { - InitializeComponent(); - } + private static Action Command = null; - public void Refresh() + public ToolItemControl(ExternalTool tool, Action callBackCommand) { - Dispatcher.UIThread.Post(() => - { - if (ExternalTool == null) - { - return; - } + InitializeComponent(); - ShowImage($"InstallerResources/{ExternalTool.Id}.png", imgIcon); + ExternalTool = tool; + Command = callBackCommand; - txtName.Text = ExternalTool.Name; - txtDescription.Text = ExternalTool.Description; - txtAuthor.Text = $"Author: {ExternalTool.Author}"; - txtLicense.Text = $"License: {ExternalTool.LicenseType}"; + UITools.ShowImage($"InstallerResources/{ExternalTool.Id}.png", imgIcon); + txtName.Text = tool.Name; + txtDescription.Text = tool.Description; + txtPath.Text = "Path: " + tool.LocalPath; - string localPath = ""; - if (ServiceLayer.GeneralConfig.ExternalTools_Paths != null) - { - var tp = ServiceLayer.GeneralConfig.ExternalTools_Paths.FirstOrDefault(d => d.Id == ExternalTool.Id); - if (tp != null) - { - localPath = tp.LocalPath; - } - } - if (string.IsNullOrEmpty(localPath)) - { - localPath = Path.Combine(ServiceLayer.GeneralConfig.BasePath, ExternalTool.Id); - ServiceLayer.GeneralConfig.ExternalTools_Paths.Add( - new ExternalTools_Path() - { - Id = ExternalTool.Id, - LocalPath = localPath - }); - ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); - } - txtPath.Text = $"Path: {localPath}"; + IsSelected = tool.UpdateNeeded; + tool.IsSelected = IsSelected; + chkSelect.IsChecked = IsSelected; - var versions = ExternalTool.Versions.OrderByDescending(d => d.VersionNumber); - LatestVersion = versions.FirstOrDefault(d => d.OperatingSystem == ServiceLayer.CurrentOperatingSystem); - LatestStableVersion = versions.FirstOrDefault(d => d.BetaNumber == 0 && d.OperatingSystem == ServiceLayer.CurrentOperatingSystem); - if (LatestVersion == null) + if (tool.InstalledVersion == null) + { + txtActual.Text = $"Installed version: None"; + txtActual.Foreground = colorRed; + } + else + { + txtActual.Text = $"Installed version: {tool.InstalledVersion.Version}"; + if (tool.UpdateNeeded) { - txtVersion.Text = "ERROR"; - txtLatestVersion.Text = "ERROR"; - txtLatestStableVersion.Text = "ERROR"; + txtActual.Foreground = colorRed; } else { - if (ServiceLayer.GeneralConfig.OnlyStableVersions) - { - txtVersion.Text = LatestStableVersion == null ? - $"Version: {LatestVersion.Version}" : - $"Version: {LatestStableVersion.Version}"; - AvailableVersion = LatestStableVersion ?? LatestVersion; - } - else - { - AvailableVersion = LatestVersion ?? LatestStableVersion; - } - - txtLatestVersion.Text = $"Latest available version: {LatestVersion.Version}"; - txtLatestStableVersion.Text = LatestStableVersion == null ? - "Latest stable version: No stable versions found" : - $"Latest stable version: {LatestStableVersion.Version}"; - } - - ShowScreenShots(); - ShowLocalVersion(); - ShowVersions(); - - btnLicense.IsEnabled = !string.IsNullOrEmpty(ExternalTool.LicenceUrl); - }); - } - - - private void ShowScreenShots() - { - try - { - var path = Path.Combine(Directory.GetCurrentDirectory(), "InstallerResources"); - var sc = $"{ExternalTool.Id}.scr.*"; - var files = Directory.GetFiles(path, sc).OrderBy(d => d); - foreach (var file in files) - { - var ctrl = new ScreenShotControl(file); - pnlScreenShhots.Children.Add(ctrl); + txtActual.Foreground = colorGreen; } } - catch (Exception ex) - { - } - } - - - private void ShowImage(string fileName, Image imgControl) - { - try - { - using var stream = File.OpenRead(fileName); - imgControl.Source = new Bitmap(stream); - } - catch (Exception ex) - { - } - } - - private void ShowLocalVersion() - { - if (LocalVersion == null) + if (tool.LatestVersion == null) { - LocalVersion = ServiceLayer.GetToolVersion(ExternalTool.Id); - } - - txtChecking.IsVisible = false; - txtUpToDate.IsVisible = false; - txtRecomended.IsVisible = false; - btnUpdate.IsEnabled = false; - - if (LocalVersion == null) - { - txtVersion.Text = "ERROR"; - txtVersion.Foreground = new SolidColorBrush(Colors.Red); - txtLocalVersion.Text = "Local installed version: Not detected"; - } - else - { - txtVersion.Text = LocalVersion.Version; - txtLocalVersion.Text = $"Local installed version: {LocalVersion.Version}"; - } - - if (LocalVersion == null) - { - txtLocalVersion.Foreground = new SolidColorBrush(Colors.Red); - txtRecomended.Text = "Download recomended"; - txtRecomended.IsVisible = true; - btnUpdate.IsEnabled = true; - btnUpdate.Background = new SolidColorBrush(Colors.LightGreen); - btnUpdate.Foreground = new SolidColorBrush(Colors.Black); - } - else if (AvailableVersion == null) - { - txtLatestVersion.Foreground = new SolidColorBrush(Colors.Red); - txtLatestStableVersion.Foreground = new SolidColorBrush(Colors.Red); - txtRecomended.Text = "No download available"; - txtRecomended.IsVisible = true; - } - else if (LocalVersion.VersionNumber >= AvailableVersion.VersionNumber) - { - txtLocalVersion.Foreground = new SolidColorBrush(Colors.LightGreen); - txtUpToDate.Text = $"Up to date"; - txtUpToDate.IsVisible = true; + txtLatest.Text = $"Latest version: Unknow"; } else { - txtLocalVersion.Foreground = new SolidColorBrush(Colors.Red); - txtRecomended.Text = "Download recomended"; - txtRecomended.IsVisible = true; - btnUpdate.IsEnabled = true; - btnUpdate.Background = new SolidColorBrush(Colors.LightGreen); - btnUpdate.Foreground = new SolidColorBrush(Colors.Black); - } - } - - - private void ShowVersions() - { - pnlVersions.Children.Clear(); - var header = new VersionControl(null,null); - pnlVersions.Children.Add(header); - var versions = ExternalTool.Versions.OrderByDescending(d => d.VersionNumber).ThenBy(d => d.OperatingSystem); - foreach (var version in versions) - { - var ctrl = new VersionControl(ExternalTool, version); - pnlVersions.Children.Add(ctrl); + txtLatest.Text = $"Latest version: {tool.LatestVersion.Version}"; } } - - private void btnLicense_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + private void chkSelect_IsCheckedChanged(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { - ServiceLayer.OpenUrlInBrowser(ExternalTool.LicenceUrl); + IsSelected = chkSelect.IsChecked == true; + ExternalTool.IsSelected = IsSelected; + Command(ExternalTool.Id, "CHECKED"); } - - private void btnVisit_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + private void btnAllVersions_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { - ServiceLayer.OpenUrlInBrowser(ExternalTool.SiteUrl); - } - - private void btnUpdate_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - new Thread(() => - { - ServiceLayer.DownloadAndInstallTool(ExternalTool, AvailableVersion); - }).Start(); - } - - private void btnViewVersions_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - pnlVersions.IsVisible = !pnlVersions.IsVisible; - if (pnlVersions.IsVisible) - { - btnViewVersions.Content = "Hide all versions"; - } - else - { - btnViewVersions.Content = "Show all versions"; - } - } - - private void btnSetPath_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - var dlg = new OpenFolderDialog() - { - Title = "Select tools base path" - }; - var wnd = this.GetVisualRoot() as Window; - dlg.ShowAsync(wnd).ContinueWith((t) => - { - if (!string.IsNullOrEmpty(t.Result)) - { - Dispatcher.UIThread.Post(() => - { - txtPath.Text = $"Path: {t.Result}"; - var tool = ServiceLayer.GeneralConfig.ExternalTools_Paths.FirstOrDefault(d => d.Id == ExternalTool.Id); - if (tool != null) - { - tool.LocalPath = t.Result; - } - else - { - ServiceLayer.GeneralConfig.ExternalTools_Paths.Add(new ExternalTools_Path() - { - Id = ExternalTool.Id, - LocalPath = t.Result - }); - ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); - } - }); - } - }); + Command(ExternalTool.Id, "VERSIONS"); } } \ No newline at end of file diff --git a/ZXBSInstaller/Controls/ToolsListItemControl.axaml b/ZXBSInstaller/Controls/ToolsListItemControl.axaml deleted file mode 100644 index 6b7703d..0000000 --- a/ZXBSInstaller/Controls/ToolsListItemControl.axaml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - diff --git a/ZXBSInstaller/Controls/ToolsListItemControl.axaml.cs b/ZXBSInstaller/Controls/ToolsListItemControl.axaml.cs deleted file mode 100644 index 432b7fb..0000000 --- a/ZXBSInstaller/Controls/ToolsListItemControl.axaml.cs +++ /dev/null @@ -1,107 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Avalonia.Media; -using Avalonia.Media.Imaging; -using Avalonia.Threading; -using System.IO; -using System.Linq; -using System.Threading; -using ZXBSInstaller.Log; -using ZXBSInstaller.Log.Neg; - -namespace ZXBSInstaller; - -public partial class ToolsListItemControl : UserControl -{ - public ExternalTool ExternalTool { get; set; } - public ExternalTools_Version LocalVersion = null; - - private ExternalTools_Version AvailableVersion = null; - private ExternalTools_Version LatestVersion = null; - private ExternalTools_Version LatestStableVersion = null; - - - public ToolsListItemControl() - { - InitializeComponent(); - } - - - public void Refresh() - { - Dispatcher.UIThread.Post(() => - { - if (ExternalTool == null) - { - return; - } - - try - { - using var stream = File.OpenRead($"InstallerResources/{ExternalTool.Id}.png"); - imgIcon.Source = new Bitmap(stream); - } - catch { } - txtName.Text = ExternalTool.Name; - - var versions = ExternalTool.Versions.OrderByDescending(d => d.VersionNumber); - LatestVersion = versions.FirstOrDefault(d => d.OperatingSystem == ServiceLayer.CurrentOperatingSystem); - LatestStableVersion = versions.FirstOrDefault(d => d.BetaNumber == 0 && d.OperatingSystem == ServiceLayer.CurrentOperatingSystem); - if (ServiceLayer.GeneralConfig.OnlyStableVersions) - { - AvailableVersion = LatestStableVersion == null ? - LatestVersion : - LatestStableVersion; - } - else - { - AvailableVersion = LatestVersion; - } - - if (AvailableVersion == null) - { - txtVersion.Text = "ERROR"; - txtVersion.Foreground = new SolidColorBrush(Colors.Red); - return; - } - else - { - txtVersion.Text = AvailableVersion.Version; - txtVersion.Foreground = new SolidColorBrush(Colors.Yellow); - } - new Thread(GetLocalVersion).Start(); - }); - } - - - private void GetLocalVersion() - { - LocalVersion = ServiceLayer.GetToolVersion(ExternalTool.Id); - - Dispatcher.UIThread.Post(() => - { - if (LocalVersion == null) - { - txtVersion.Text = $"v{AvailableVersion.Version} - Update"; - txtVersion.Foreground = new SolidColorBrush(Avalonia.Media.Colors.Red); - } - else if (AvailableVersion == null) - { - txtVersion.Text = "ERROR"; - txtVersion.Foreground = new SolidColorBrush(Avalonia.Media.Colors.Red); - } - else if (LocalVersion.VersionNumber >= LatestVersion.VersionNumber) - { - txtVersion.Text = $"v{LocalVersion.Version} - OK"; - txtVersion.Foreground = new SolidColorBrush(Avalonia.Media.Colors.LightGreen); - } - else - { - txtVersion.Text = $"v{LocalVersion.Version} - Update"; - txtVersion.Foreground = new SolidColorBrush(Avalonia.Media.Colors.Red); - } - }); - } - -} \ No newline at end of file diff --git a/ZXBSInstaller/Controls/VersionControl.axaml.cs b/ZXBSInstaller/Controls/VersionControl.axaml.cs index b3e068d..cc392b0 100644 --- a/ZXBSInstaller/Controls/VersionControl.axaml.cs +++ b/ZXBSInstaller/Controls/VersionControl.axaml.cs @@ -2,6 +2,7 @@ using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Media; +using System; using System.Runtime.InteropServices; using System.Threading; using ZXBSInstaller.Log; @@ -16,18 +17,22 @@ public partial class VersionControl : UserControl private bool IsPair = false; - public static bool IsPairGlobal = false; - public static SolidColorBrush ColorPair= new SolidColorBrush(Color.FromRgb(20, 20, 20)); - public static SolidColorBrush ColorNormal= new SolidColorBrush(Colors.Black); - public static SolidColorBrush ColorHover = new SolidColorBrush(Colors.DarkBlue); - public static SolidColorBrush ColorGreen = new SolidColorBrush(Colors.LightGreen); + private static bool IsPairGlobal = false; + private static SolidColorBrush ColorPair= new SolidColorBrush(Color.FromRgb(20, 20, 20)); + private static SolidColorBrush ColorNormal= new SolidColorBrush(Colors.Black); + private static SolidColorBrush ColorHover = new SolidColorBrush(Colors.DarkBlue); + private static SolidColorBrush ColorGreen = new SolidColorBrush(Colors.LightGreen); + private static Action Command = null; - public VersionControl(ExternalTool tool, ExternalTools_Version toolVersion) + + public VersionControl(ExternalTool tool, ExternalTools_Version toolVersion, Action callBackCommand) { InitializeComponent(); Tool= tool; ToolVersion = toolVersion; + Command = callBackCommand; + if (tool == null) { pnlHeader.IsVisible = true; @@ -62,7 +67,8 @@ private void btnDownload_Click(object? sender, Avalonia.Interactivity.RoutedEven { new Thread(() => { - ServiceLayer.DownloadAndInstallTool(Tool, ToolVersion); + ServiceLayer.DownloadAndInstallTool(Tool, ToolVersion); + Command(Tool.Id, "REFRESH"); }).Start(); } diff --git a/ZXBSInstaller/Controls2/MainControl.axaml b/ZXBSInstaller/Controls2/MainControl.axaml deleted file mode 100644 index 24b7057..0000000 --- a/ZXBSInstaller/Controls2/MainControl.axaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ZXBSInstaller/Controls2/MainControl.axaml.cs b/ZXBSInstaller/Controls2/MainControl.axaml.cs deleted file mode 100644 index a3b64ff..0000000 --- a/ZXBSInstaller/Controls2/MainControl.axaml.cs +++ /dev/null @@ -1,246 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; -using Avalonia.Threading; -using Avalonia.VisualTree; -using MsBox.Avalonia; -using MsBox.Avalonia.Dto; -using MsBox.Avalonia.Enums; -using System.Collections.Generic; -using System.Data; -using System.Security.Cryptography; -using System.Threading; -using ZXBSInstaller.Controls; -using ZXBSInstaller.Log; -using ZXBSInstaller.Log.Neg; - -namespace ZXBSInstaller.Controls2; - -public partial class MainControl : UserControl -{ - private List toolItemControls = new List(); - - - public MainControl() - { - InitializeComponent(); - - this.Loaded += MainControl_Loaded; - txtBasePath.TextChanged += TxtBasePath_TextChanged; - chkOnlyStableVersions.IsCheckedChanged += ChkOnlyStableVersions_IsCheckedChanged; - chkSetZXBSOptions.IsCheckedChanged += ChkSetZXBSOptions_IsCheckedChanged; - } - - private void MainControl_Loaded(object? sender, RoutedEventArgs e) - { - new Thread(Initialize).Start(); - } - - - private void Initialize() - { - ServiceLayer.Initialize(ShowStatusPanel, UpdateStatus, HideStatusPanel, GetExternalTools, ShowMessage); - - Dispatcher.UIThread.Post(() => - { - txtBasePath.Text = ServiceLayer.GeneralConfig.BasePath; - chkOnlyStableVersions.IsChecked = ServiceLayer.GeneralConfig.OnlyStableVersions; - chkSetZXBSOptions.IsChecked = ServiceLayer.GeneralConfig.SetZXBSConfig; - }); - - GetExternalTools(); - } - - - private void ShowMessage(string message) - { - Dispatcher.UIThread.Post(() => - { - pnlStatus.IsVisible = false; - var box = MessageBoxManager.GetMessageBoxStandard(new MessageBoxStandardParams - { - ButtonDefinitions = ButtonEnum.Ok, - ContentTitle = "ZX Basic Studio Installer", - ContentMessage = message, - Icon = MsBox.Avalonia.Enums.Icon.Info, - WindowIcon = ((Window)this.VisualRoot).Icon, - WindowStartupLocation = WindowStartupLocation.CenterOwner - }); - box.ShowAsPopupAsync(this); - }); - } - - - private void GetExternalTools() - { - Dispatcher.UIThread.Post(() => - { - txtStatus.Text = "Working..."; - progressBar.Value = 0; - pnlStatus.IsVisible = true; - }); - - var tools = ServiceLayer.GetExternalTools(); - - Dispatcher.UIThread.Post(() => - { - pnlStatus.IsVisible = false; - if (tools == null) - { - var box = MessageBoxManager.GetMessageBoxStandard(new MessageBoxStandardParams - { - ButtonDefinitions = ButtonEnum.Ok, - ContentTitle = "ERROR", - ContentMessage = "Error retrieving the list of tools. Please check your internet connection.", - Icon = MsBox.Avalonia.Enums.Icon.Error, - WindowIcon = ((Window)this.VisualRoot).Icon, - WindowStartupLocation = WindowStartupLocation.CenterOwner - }); - box.ShowAsPopupAsync(this); - } - else - { - ShowData(); - } - }); - } - - - private void ShowData() - { - toolItemControls.Clear(); - var tools = ServiceLayer.ExternalTools; - - pnlTools.Children.Clear(); - foreach (var tool in tools) - { - var control = new ToolItemControl(tool, UpdateSummary); - toolItemControls.Add(control); - pnlTools.Children.Add(control); - } - UpdateSummary(); - } - - - private void UpdateSummary() - { - pnlSummary.Children.Clear(); - bool allUpToDate = true; - foreach (var tool in toolItemControls) - { - if (tool.IsSelected) - { - var tb = new TextBlock(); - tb.TextWrapping = Avalonia.Media.TextWrapping.Wrap; - if (tool.ExternalTool.InstalledVersion == null) - { - tb.Text = $"- Install:\r\n\t{tool.ExternalTool.Name}\r\n\tPath: {tool.ExternalTool.LocalPath}\r\n"; - } - else - { - tb.Text = $"- Update:\r\n\t{tool.ExternalTool.Name}\r\n\tPath: {tool.ExternalTool.LocalPath}\r\n"; - } - pnlSummary.Children.Add(tb); - allUpToDate = false; - } - } - if (allUpToDate) - { - var tb = new TextBlock(); - tb.TextWrapping = Avalonia.Media.TextWrapping.Wrap; - tb.Text = "All tools are up to date."; - pnlSummary.Children.Add(tb); - } - } - - - private void ShowStatusPanel(string message) - { - Dispatcher.UIThread.Post(() => - { - txtStatus.Text = message; - progressBar.Value = 0; - pnlStatus.IsVisible = true; - }); - } - - - private void HideStatusPanel() - { - Dispatcher.UIThread.Post(() => - { - pnlStatus.IsVisible = false; - }); - } - - - /// - /// Update status panel - /// - /// Message to display or empty if you don't want to change it - /// Progress value (0-100) - private void UpdateStatus(string message, int progress) - { - Dispatcher.UIThread.Post(() => - { - if (!string.IsNullOrEmpty(message)) - { - txtStatus.Text = message; - } - if (progress >= 0 && progress <= 100) - { - progressBar.Value = progress; - } - }); - } - - private void btnSelectPath_Click(object? sender, RoutedEventArgs e) - { - var dlg = new OpenFolderDialog() - { - Title = "Select tools base path" - }; - dlg.Directory = txtBasePath.Text; - var wnd = this.GetVisualRoot() as Window; - dlg.ShowAsync(wnd).ContinueWith((t) => - { - if (!string.IsNullOrEmpty(t.Result)) - { - Dispatcher.UIThread.Post(() => - { - txtBasePath.Text = t.Result; - }); - } - }); - } - - - private void btnInstall_Click(object? sender, RoutedEventArgs e) - { - new Thread(ServiceLayer.DownloadAndInstallTools).Start(); - } - - - private void ChkSetZXBSOptions_IsCheckedChanged(object? sender, RoutedEventArgs e) - { - ServiceLayer.GeneralConfig.SetZXBSConfig = chkSetZXBSOptions.IsChecked == true; - ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); - } - - - private void ChkOnlyStableVersions_IsCheckedChanged(object? sender, RoutedEventArgs e) - { - ServiceLayer.GeneralConfig.OnlyStableVersions = chkOnlyStableVersions.IsChecked == true; - ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); - } - - - private void TxtBasePath_TextChanged(object? sender, TextChangedEventArgs e) - { - ServiceLayer.GeneralConfig.BasePath = txtBasePath.Text; - ServiceLayer.SaveConfig(ServiceLayer.GeneralConfig); - } - - -} \ No newline at end of file diff --git a/ZXBSInstaller/Controls2/ToolItemControl.axaml b/ZXBSInstaller/Controls2/ToolItemControl.axaml deleted file mode 100644 index 890fb67..0000000 --- a/ZXBSInstaller/Controls2/ToolItemControl.axaml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Name - Description - - - - Path - Installed version: - Latest version: - - - - - - diff --git a/ZXBSInstaller/Controls2/ToolItemControl.axaml.cs b/ZXBSInstaller/Controls2/ToolItemControl.axaml.cs deleted file mode 100644 index ffa34f3..0000000 --- a/ZXBSInstaller/Controls2/ToolItemControl.axaml.cs +++ /dev/null @@ -1,71 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Avalonia.Media; -using System; -using ZXBSInstaller.Log.Neg; - -namespace ZXBSInstaller.Controls2; - -public partial class ToolItemControl : UserControl -{ - public ExternalTool ExternalTool = null; - public bool IsSelected = false; - - public static SolidColorBrush colorRed = new SolidColorBrush(Colors.Red); - public static SolidColorBrush colorGreen = new SolidColorBrush(Colors.LightGreen); - - private static Action Checked_Changed = null; - - - public ToolItemControl(ExternalTool tool, Action callBackChecked_Changed) - { - InitializeComponent(); - - ExternalTool = tool; - Checked_Changed = callBackChecked_Changed; - - UITools.ShowImage($"InstallerResources/{ExternalTool.Id}.png", imgIcon); - txtName.Text = tool.Name; - txtDescription.Text = tool.Description; - txtPath.Text = "Path: " + tool.LocalPath; - - IsSelected = tool.UpdateNeeded; - tool.IsSelected = IsSelected; - chkSelect.IsChecked = IsSelected; - - if (tool.InstalledVersion == null) - { - txtActual.Text = $"Installed version: None"; - txtActual.Foreground = colorRed; - } - else - { - txtActual.Text = $"Installed version: {tool.InstalledVersion.Version}"; - if (tool.UpdateNeeded) - { - txtActual.Foreground = colorRed; - } - else - { - txtActual.Foreground = colorGreen; - } - } - - if (tool.LatestVersion == null) - { - txtLatest.Text = $"Latest version: Unknow"; - } - else - { - txtLatest.Text = $"Latest version: {tool.LatestVersion.Version}"; - } - } - - private void chkSelect_IsCheckedChanged(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - IsSelected = chkSelect.IsChecked == true; - ExternalTool.IsSelected = IsSelected; - Checked_Changed?.Invoke(); - } -} \ No newline at end of file diff --git a/ZXBSInstaller/MainWindow.axaml.cs b/ZXBSInstaller/MainWindow.axaml.cs index dd491a1..867ac60 100644 --- a/ZXBSInstaller/MainWindow.axaml.cs +++ b/ZXBSInstaller/MainWindow.axaml.cs @@ -29,7 +29,7 @@ public MainWindow() Title = $"ZX Basic Studio Installer - v{version.Version}"; } - var ctrl = new Controls2.MainControl(); + var ctrl = new Controls.MainControl(); pnlMain.Children.Add(ctrl); } diff --git a/ZXBSInstaller/ZXBSInstaller.csproj b/ZXBSInstaller/ZXBSInstaller.csproj index dee1fa9..df1fe4c 100644 --- a/ZXBSInstaller/ZXBSInstaller.csproj +++ b/ZXBSInstaller/ZXBSInstaller.csproj @@ -6,7 +6,7 @@ app.manifest true zxbs.ico - 0.0.1.5 + 0.0.1.6 @@ -31,16 +31,4 @@ - - - - ScreenShotControl.axaml - - - ToolsListItemControl.axaml - - - VersionControl.axaml - - diff --git a/ZXBStudio/Program.cs b/ZXBStudio/Program.cs index 1242805..d573734 100644 --- a/ZXBStudio/Program.cs +++ b/ZXBStudio/Program.cs @@ -8,8 +8,29 @@ namespace ZXBasicStudio { internal class Program { - public static string Version = ""; - public static string VersionDate = ""; + public static string Version + { + get + { + if(string.IsNullOrEmpty(_Version)) + { + SetVerion(); + } + return _Version; + } + } + private static string _Version = ""; + + public static string VersionDate { get + { + if (string.IsNullOrEmpty(_VersionDate)) + { + SetVerion(); + } + return _VersionDate; + } + } + public static string _VersionDate = ""; // Initialization code. Don't use any Avalonia, third-party APIs or any @@ -37,18 +58,18 @@ public static void SetVerion() { var assembly = System.Reflection.Assembly.GetEntryAssembly(); var version = assembly.GetName().Version; - Version = $"{version.Major}.{version.Minor}.{version.Build}"; + _Version = $"{version.Major}.{version.Minor}.{version.Build}"; if (version.Revision != 0) { - Version = $"{Version} - beta {version.Revision}"; + _Version = $"{Version} - beta {version.Revision}"; } var buildDate = System.IO.File.GetLastWriteTime(assembly.Location); - VersionDate = buildDate.ToString("yyyy.MM.dd"); + _VersionDate = buildDate.ToString("yyyy.MM.dd"); } catch { - Version = "Unknown version"; - VersionDate = "Unknown date"; + _Version = ""; + _VersionDate = ""; } } diff --git a/ZXBStudio/ZXBasicStudio.csproj b/ZXBStudio/ZXBasicStudio.csproj index 1443fa1..6311d3a 100644 --- a/ZXBStudio/ZXBasicStudio.csproj +++ b/ZXBStudio/ZXBasicStudio.csproj @@ -13,7 +13,7 @@ ZX Basic Studio False - 1.6.0.5 + 1.7.0.0 diff --git a/ZXBasicStudio.sln b/ZXBasicStudio.sln index 7caeed8..b701940 100644 --- a/ZXBasicStudio.sln +++ b/ZXBasicStudio.sln @@ -17,9 +17,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rom128Reconstructor", "Rom1 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsBox.Avalonia", "MsBox.Avalonia\MsBox.Avalonia.csproj", "{1AC800DC-80F6-45C2-AF8A-861C31FB544D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZXBasicStudioSite", "ZXBasicStudioSite\ZXBasicStudioSite.csproj", "{2493E207-2E56-48AB-8064-0E7A805F7A62}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Elementos de la solución", "Elementos de la solución", "{C949A587-5005-4308-BCFD-85831B080589}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{C949A587-5005-4308-BCFD-85831B080589}" ProjectSection(SolutionItems) = preProject LICENSE.txt = LICENSE.txt README.md = README.md @@ -38,6 +36,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZXBSInstaller", "ZXBSInstal EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZXBSInstaller.Log", "ZXBSInstaller.Log\ZXBSInstaller.Log.csproj", "{A31A06FF-7FAD-4D57-A281-8034BA761669}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IDE", "IDE", "{E148229E-C8ED-4DD7-9768-9641E279DD32}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installer", "Installer", "{1613C3B0-B7D2-4FE5-A96A-A568C370DE84}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Emulator", "Emulator", "{6AB4C5D0-AB60-49F0-A349-E46971736749}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -102,14 +106,6 @@ Global {1AC800DC-80F6-45C2-AF8A-861C31FB544D}.Release|Any CPU.Build.0 = Release|Any CPU {1AC800DC-80F6-45C2-AF8A-861C31FB544D}.Release|x64.ActiveCfg = Release|Any CPU {1AC800DC-80F6-45C2-AF8A-861C31FB544D}.Release|x64.Build.0 = Release|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Debug|x64.ActiveCfg = Debug|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Debug|x64.Build.0 = Debug|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|Any CPU.Build.0 = Release|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|x64.ActiveCfg = Release|Any CPU - {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|x64.Build.0 = Release|Any CPU {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -146,6 +142,18 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F65553BC-B86F-4125-B5BA-EBBCC223100B} = {E148229E-C8ED-4DD7-9768-9641E279DD32} + {726F8E04-840F-4F15-935D-429D81AC0311} = {E148229E-C8ED-4DD7-9768-9641E279DD32} + {F91A239A-F9AB-42A3-AECD-9AB844A5B908} = {6AB4C5D0-AB60-49F0-A349-E46971736749} + {98F26A78-7E51-49D1-8B09-7A85F2B28D29} = {E148229E-C8ED-4DD7-9768-9641E279DD32} + {3EFA2E44-4D1E-4212-B6BB-9F34CD228772} = {6AB4C5D0-AB60-49F0-A349-E46971736749} + {8B15A1B8-5C8A-4F81-A50B-834687EEE040} = {6AB4C5D0-AB60-49F0-A349-E46971736749} + {1AC800DC-80F6-45C2-AF8A-861C31FB544D} = {E148229E-C8ED-4DD7-9768-9641E279DD32} + {D99C36AE-072A-4885-9585-CFD78FC6763E} = {6AB4C5D0-AB60-49F0-A349-E46971736749} + {67768F7F-169A-420F-9C50-335FB9885EC1} = {1613C3B0-B7D2-4FE5-A96A-A568C370DE84} + {A31A06FF-7FAD-4D57-A281-8034BA761669} = {1613C3B0-B7D2-4FE5-A96A-A568C370DE84} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {58A8B264-A797-4839-A806-C8FEEFD4F80E} EndGlobalSection