diff --git a/CreamInstaller/Components/CustomForm.cs b/CreamInstaller/Components/CustomForm.cs index f1f8034..0d7e264 100644 --- a/CreamInstaller/Components/CustomForm.cs +++ b/CreamInstaller/Components/CustomForm.cs @@ -1,22 +1,55 @@ -using System.Drawing; +using System; +using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace CreamInstaller.Components; internal class CustomForm : Form { - internal CustomForm() : base() => Icon = Properties.Resources.Icon; - - internal CustomForm(IWin32Window owner) : this() + internal CustomForm() : base() { - Owner = (owner as Form) ?? ActiveForm; + Icon = Properties.Resources.Icon; KeyPreview = true; KeyPress += OnKeyPress; ResizeRedraw = true; } + internal CustomForm(IWin32Window owner) : this() + { + if (owner is Form form) + { + Owner = form; + InheritLocation(form); + SizeChanged += (s, e) => InheritLocation(form); + form.Activated += OnActivation; + FormClosing += (s, e) => form.Activated -= OnActivation; + } + } + + internal void OnActivation(object sender, EventArgs args) => Activate(); + + public static readonly IntPtr HWND_NOTOPMOST = new(-2); + public static readonly IntPtr HWND_TOPMOST = new(-1); + public const short SWP_NOACTIVATE = 0x0010; + public const short SWP_SHOWWINDOW = 0x0040; + public const short SWP_NOMOVE = 0x0002; + public const short SWP_NOSIZE = 0x0001; + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] + internal static extern void SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); + + internal void BringToFrontWithoutActivation() + { + bool topMost = TopMost; + SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); + if (!topMost) + SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); + } + protected override CreateParams CreateParams // Double buffering for all controls { get @@ -29,6 +62,8 @@ internal class CustomForm : Form internal void InheritLocation(Form fromForm) { + if (fromForm is null) + return; int X = fromForm.Location.X + fromForm.Size.Width / 2 - Size.Width / 2; int Y = fromForm.Location.Y + fromForm.Size.Height / 2 - Size.Height / 2; Location = new(X, Y); diff --git a/CreamInstaller/CreamInstaller.csproj b/CreamInstaller/CreamInstaller.csproj index 06d5da1..32fa378 100644 --- a/CreamInstaller/CreamInstaller.csproj +++ b/CreamInstaller/CreamInstaller.csproj @@ -5,7 +5,7 @@ True Resources\ini.ico true - 4.1.3.1 + 4.1.4.0 Resources\ini.ico LICENSE 2021, pointfeev (https://github.com/pointfeev) diff --git a/CreamInstaller/Forms/DebugForm.Designer.cs b/CreamInstaller/Forms/DebugForm.Designer.cs new file mode 100644 index 0000000..0830960 --- /dev/null +++ b/CreamInstaller/Forms/DebugForm.Designer.cs @@ -0,0 +1,69 @@ +namespace CreamInstaller; + +partial class DebugForm +{ + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.debugTextBox = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // debugTextBox + // + this.debugTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.debugTextBox.Location = new System.Drawing.Point(10, 10); + this.debugTextBox.Name = "debugTextBox"; + this.debugTextBox.ReadOnly = true; + this.debugTextBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedBoth; + this.debugTextBox.Size = new System.Drawing.Size(544, 321); + this.debugTextBox.TabIndex = 0; + this.debugTextBox.TabStop = false; + this.debugTextBox.Text = ""; + // + // DebugForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(564, 341); + this.ControlBox = false; + this.Controls.Add(this.debugTextBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "DebugForm"; + this.Padding = new System.Windows.Forms.Padding(10); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "Debug"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RichTextBox debugTextBox; +} \ No newline at end of file diff --git a/CreamInstaller/Forms/DebugForm.cs b/CreamInstaller/Forms/DebugForm.cs new file mode 100644 index 0000000..1a607b0 --- /dev/null +++ b/CreamInstaller/Forms/DebugForm.cs @@ -0,0 +1,84 @@ +using CreamInstaller.Components; +using CreamInstaller.Utility; + +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace CreamInstaller; + +internal partial class DebugForm : CustomForm +{ + internal static DebugForm current; + internal static DebugForm Current + { + get + { + if (current is not null && (current.Disposing || current.IsDisposed)) + current = null; + return current ??= new(); + } + set => current = value; + } + + internal DebugForm() + { + InitializeComponent(); + debugTextBox.BackColor = LogTextBox.Background; + } + + protected override void WndProc(ref Message message) // make form immovable by user + { + if (message.Msg == 0x0112) // WM_SYSCOMMAND + { + int command = message.WParam.ToInt32() & 0xFFF0; + if (command == 0xF010) // SC_MOVE + return; + } + base.WndProc(ref message); + } + + private Form attachedForm; + + internal void Attach(Form form) + { + if (attachedForm is not null) + { + attachedForm.Activated -= OnChange; + attachedForm.LocationChanged -= OnChange; + attachedForm.SizeChanged -= OnChange; + } + attachedForm = form; + attachedForm.Activated += OnChange; + attachedForm.LocationChanged += OnChange; + attachedForm.SizeChanged += OnChange; + UpdateAttachment(); + } + + internal void OnChange(object sender, EventArgs args) => UpdateAttachment(); + + internal void UpdateAttachment() + { + if (attachedForm is null) + return; + Size = new(Size.Width, attachedForm.Size.Height); + Location = new(attachedForm.Right, attachedForm.Top); + Show(); + BringToFrontWithoutActivation(); + } + + internal void Log(string text) => Log(text, LogTextBox.Error); + + internal void Log(string text, Color color) + { + if (!debugTextBox.Disposing && !debugTextBox.IsDisposed) + { + debugTextBox.Invoke(() => + { + if (debugTextBox.Text.Length > 0) + debugTextBox.AppendText(Environment.NewLine, color, scroll: true); + debugTextBox.AppendText(text, color, scroll: true); + }); + } + } +} diff --git a/CreamInstaller/Forms/DebugForm.resx b/CreamInstaller/Forms/DebugForm.resx new file mode 100644 index 0000000..8d05001 --- /dev/null +++ b/CreamInstaller/Forms/DebugForm.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/CreamInstaller/Forms/DialogForm.Designer.cs b/CreamInstaller/Forms/DialogForm.Designer.cs index 27bdff0..f1e76d3 100644 --- a/CreamInstaller/Forms/DialogForm.Designer.cs +++ b/CreamInstaller/Forms/DialogForm.Designer.cs @@ -125,6 +125,7 @@ namespace CreamInstaller this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "DialogForm"; + this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "DialogForm"; ((System.ComponentModel.ISupportInitialize)(this.icon)).EndInit(); diff --git a/CreamInstaller/Forms/DialogForm.cs b/CreamInstaller/Forms/DialogForm.cs index 503b412..fe5136f 100644 --- a/CreamInstaller/Forms/DialogForm.cs +++ b/CreamInstaller/Forms/DialogForm.cs @@ -8,7 +8,11 @@ namespace CreamInstaller; internal partial class DialogForm : CustomForm { - internal DialogForm(IWin32Window owner) : base(owner) => InitializeComponent(); + internal DialogForm(IWin32Window owner) : base(owner) + { + InitializeComponent(); + TopLevel = true; + } internal DialogResult Show(Icon descriptionIcon, string descriptionText, string acceptButtonText = "OK", string cancelButtonText = null, string customFormText = null, Icon customFormIcon = null) { diff --git a/CreamInstaller/Forms/InstallForm.Designer.cs b/CreamInstaller/Forms/InstallForm.Designer.cs index e0cde81..79b43ca 100644 --- a/CreamInstaller/Forms/InstallForm.Designer.cs +++ b/CreamInstaller/Forms/InstallForm.Designer.cs @@ -136,7 +136,7 @@ namespace CreamInstaller this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "InstallForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Text = "InstallForm"; this.Load += new System.EventHandler(this.OnLoad); this.ResumeLayout(false); diff --git a/CreamInstaller/Forms/InstallForm.cs b/CreamInstaller/Forms/InstallForm.cs index caf8c0a..a6c0887 100644 --- a/CreamInstaller/Forms/InstallForm.cs +++ b/CreamInstaller/Forms/InstallForm.cs @@ -9,7 +9,6 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using System.Windows.Forms; using static CreamInstaller.Paradox.ParadoxLauncher; using static CreamInstaller.Resources.Resources; @@ -21,11 +20,11 @@ internal partial class InstallForm : CustomForm internal bool Reselecting; internal readonly bool Uninstalling; - internal InstallForm(IWin32Window owner, bool uninstall = false) : base(owner) + internal InstallForm(bool uninstall = false) : base() { InitializeComponent(); Text = Program.ApplicationName; - logTextBox.BackColor = InstallationLog.Background; + logTextBox.BackColor = LogTextBox.Background; Uninstalling = uninstall; } @@ -62,46 +61,51 @@ internal partial class InstallForm : CustomForm UpdateProgress(0); if (selection.Id == "PL") { - UpdateUser($"Repairing Paradox Launcher . . . ", InstallationLog.Operation); + UpdateUser($"Repairing Paradox Launcher . . . ", LogTextBox.Operation); _ = await Repair(this, selection); } - UpdateUser($"Checking directories for {selection.Name} . . . ", InstallationLog.Operation); + UpdateUser($"Checking directories for {selection.Name} . . . ", LogTextBox.Operation); IEnumerable invalidDirectories = (await selection.RootDirectory.GetExecutables()) - .Where(d => !selection.ExecutableDirectories.Any(s => d.path.Contains(s.directory))) - .Select(d => Path.GetDirectoryName(d.path)); + ?.Where(d => !selection.ExecutableDirectories.Any(s => d.path.Contains(s.directory))) + ?.Select(d => Path.GetDirectoryName(d.path)); if (!selection.ExecutableDirectories.Any(s => s.directory == selection.RootDirectory)) - invalidDirectories = invalidDirectories.Append(selection.RootDirectory); - invalidDirectories = invalidDirectories.Distinct(); - foreach (string directory in invalidDirectories) - { - directory.GetKoaloaderComponents(out List proxies, out string config); - if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader)) - || Koaloader.AutoLoadDlls.Any(pair => File.Exists(directory + @"\" + pair.dll)) - || File.Exists(config)) - { - UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in incorrect directory \"{directory}\" . . . ", InstallationLog.Operation); - await Koaloader.Uninstall(directory, this); - } - Thread.Sleep(0); - } - if (Uninstalling || !selection.Koaloader) - { - foreach ((string directory, BinaryType binaryType) in selection.ExecutableDirectories) + invalidDirectories = invalidDirectories?.Append(selection.RootDirectory); + invalidDirectories = invalidDirectories?.Distinct(); + if (invalidDirectories is not null) + foreach (string directory in invalidDirectories) { + if (Program.Canceled) throw new CustomMessageException("The operation was canceled."); directory.GetKoaloaderComponents(out List proxies, out string config); if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader)) || Koaloader.AutoLoadDlls.Any(pair => File.Exists(directory + @"\" + pair.dll)) || File.Exists(config)) { - UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in incorrect directory \"{directory}\" . . . ", LogTextBox.Operation); await Koaloader.Uninstall(directory, this); } + Thread.Sleep(1); + } + if (Uninstalling || !selection.Koaloader) + { + foreach ((string directory, BinaryType binaryType) in selection.ExecutableDirectories) + { + if (Program.Canceled) throw new CustomMessageException("The operation was canceled."); + directory.GetKoaloaderComponents(out List proxies, out string config); + if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader)) + || Koaloader.AutoLoadDlls.Any(pair => File.Exists(directory + @"\" + pair.dll)) + || File.Exists(config)) + { + UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); + await Koaloader.Uninstall(directory, this); + } + Thread.Sleep(1); } } bool uninstallProxy = Uninstalling || selection.Koaloader; int count = selection.DllDirectories.Count, cur = 0; foreach (string directory in selection.DllDirectories) { + if (Program.Canceled) throw new CustomMessageException("The operation was canceled."); if (selection.Platform is Platform.Steam or Platform.Paradox && (selection.SelectedDlc.Any(d => d.Value.type is DlcType.Steam or DlcType.SteamHidden) || selection.ExtraSelectedDlc.Any(item => item.dlc.Any(dlc => dlc.Value.type is DlcType.Steam or DlcType.SteamHidden)))) @@ -112,7 +116,7 @@ internal partial class InstallForm : CustomForm || !selection.Koaloader && (File.Exists(config) || File.Exists(cache)))) { UpdateUser($"{(uninstallProxy ? "Uninstalling" : "Installing")} SmokeAPI" + - $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); if (uninstallProxy) await SmokeAPI.Uninstall(directory, this); else @@ -129,7 +133,7 @@ internal partial class InstallForm : CustomForm || !selection.Koaloader && File.Exists(config))) { UpdateUser($"{(uninstallProxy ? "Uninstalling" : "Installing")} ScreamAPI" + - $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); if (uninstallProxy) await ScreamAPI.Uninstall(directory, this); else @@ -144,7 +148,7 @@ internal partial class InstallForm : CustomForm || !selection.Koaloader && File.Exists(config))) { UpdateUser($"{(uninstallProxy ? "Uninstalling" : "Installing")} Uplay R1 Unlocker" + - $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); if (uninstallProxy) await UplayR1.Uninstall(directory, this); else @@ -156,7 +160,7 @@ internal partial class InstallForm : CustomForm || !selection.Koaloader && File.Exists(config))) { UpdateUser($"{(uninstallProxy ? "Uninstalling" : "Installing")} Uplay R2 Unlocker" + - $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + $" {(uninstallProxy ? "from" : "for")} " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); if (uninstallProxy) await UplayR2.Uninstall(directory, this); else @@ -164,13 +168,16 @@ internal partial class InstallForm : CustomForm } } UpdateProgress(++cur / count * 100); + Thread.Sleep(1); } if (selection.Koaloader && !Uninstalling) { foreach ((string directory, BinaryType binaryType) in selection.ExecutableDirectories) { - UpdateUser("Installing Koaloader to " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + if (Program.Canceled) throw new CustomMessageException("The operation was canceled."); + UpdateUser("Installing Koaloader to " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); await Koaloader.Install(directory, binaryType, selection, this); + Thread.Sleep(1); } } UpdateProgress(100); @@ -189,13 +196,13 @@ internal partial class InstallForm : CustomForm try { await OperateFor(selection); - UpdateUser($"Operation succeeded for {selection.Name}.", InstallationLog.Success); + UpdateUser($"Operation succeeded for {selection.Name}.", LogTextBox.Success); selection.Enabled = false; DisabledSelections.Add(selection); } catch (Exception exception) { - UpdateUser($"Operation failed for {selection.Name}: " + exception, InstallationLog.Error); + UpdateUser($"Operation failed for {selection.Name}: " + exception, LogTextBox.Error); } ++CompleteOperationsCount; } @@ -224,11 +231,11 @@ internal partial class InstallForm : CustomForm try { await Operate(); - UpdateUser($"DLC unlocker(s) successfully {(Uninstalling ? "uninstalled" : "installed and generated")} for " + ProgramCount + " program(s).", InstallationLog.Success); + UpdateUser($"DLC unlocker(s) successfully {(Uninstalling ? "uninstalled" : "installed and generated")} for " + ProgramCount + " program(s).", LogTextBox.Success); } catch (Exception exception) { - UpdateUser($"DLC unlocker {(Uninstalling ? "uninstallation" : "installation and/or generation")} failed: " + exception, InstallationLog.Error); + UpdateUser($"DLC unlocker {(Uninstalling ? "uninstallation" : "installation and/or generation")} failed: " + exception, LogTextBox.Error); retryButton.Enabled = true; } userProgressBar.Value = userProgressBar.Maximum; diff --git a/CreamInstaller/Forms/MainForm.cs b/CreamInstaller/Forms/MainForm.cs index 29c419f..07f181b 100644 --- a/CreamInstaller/Forms/MainForm.cs +++ b/CreamInstaller/Forms/MainForm.cs @@ -37,10 +37,16 @@ internal partial class MainForm : CustomForm cancellationTokenSource.Dispose(); cancellationTokenSource = null; } +#pragma warning disable CA2000 // Dispose objects before losing scope + SelectForm form = new(); +#pragma warning restore CA2000 // Dispose objects before losing scope + form.InheritLocation(this); + form.FormClosing += (s, e) => Close(); + form.Show(); Hide(); - using SelectForm form = new(this); - _ = form.ShowDialog(); - Close(); +#if DEBUG + DebugForm.Current.Attach(form); +#endif } private UpdateManager updateManager; @@ -56,8 +62,10 @@ internal partial class MainForm : CustomForm progressLabel.Text = "Checking for updates . . ."; changelogTreeView.Visible = false; changelogTreeView.Location = new(progressLabel.Location.X, progressLabel.Location.Y + progressLabel.Size.Height + 13); - Invalidate(); - + Refresh(); +#if DEBUG + DebugForm.Current.Attach(this); +#endif GithubPackageResolver resolver = new("pointfeev", "CreamInstaller", "CreamInstaller.zip"); ZipPackageExtractor extractor = new(); updateManager = new(AssemblyMetadata.FromAssembly(Program.EntryAssembly, Program.CurrentProcessFilePath), resolver, extractor); @@ -72,16 +80,17 @@ internal partial class MainForm : CustomForm if (checkForUpdatesResult.CanUpdate) { #endif - latestVersion = checkForUpdatesResult.LastVersion; - versions = checkForUpdatesResult.Versions; + latestVersion = checkForUpdatesResult.LastVersion; + versions = checkForUpdatesResult.Versions; #if !DEBUG } #endif } #if DEBUG + catch (TaskCanceledException) { } catch (Exception e) { - e.HandleException(form: this, caption: "Debug exception", acceptButtonText: "OK", cancelButtonText: null); + DebugForm.Current.Log($"Exception while checking for updates: {e.GetType()} ({e.Message})", LogTextBox.Warning); } #else catch { } @@ -124,10 +133,12 @@ internal partial class MainForm : CustomForm HtmlNodeCollection nodes = await HttpClientManager.GetDocumentNodes( $"https://github.com/pointfeev/CreamInstaller/releases/tag/v{version}", "//div[@data-test-selector='body-content']/ul/li"); - if (nodes is null) changelogTreeView.Nodes.Remove(root); - else foreach (HtmlNode node in nodes) + if (nodes is null) + changelogTreeView.Nodes.Remove(root); + else + foreach (HtmlNode node in nodes) { - Program.Invoke(changelogTreeView, delegate + changelogTreeView.Invoke(delegate { TreeNode change = new() { @@ -181,7 +192,7 @@ internal partial class MainForm : CustomForm updateButton.Click -= OnUpdate; updateButton.Click += new(OnUpdateCancel); changelogTreeView.Location = new(progressBar.Location.X, progressBar.Location.Y + progressBar.Size.Height + 6); - Invalidate(); + Refresh(); Progress progress = new(); progress.ProgressChanged += new(delegate (object sender, double _progress) @@ -197,9 +208,10 @@ internal partial class MainForm : CustomForm await updateManager.PrepareUpdateAsync(latestVersion, progress, cancellationTokenSource.Token); } #if DEBUG + catch (TaskCanceledException) { } catch (Exception ex) { - ex.HandleException(form: this, caption: "Debug exception", acceptButtonText: "OK", cancelButtonText: null); + DebugForm.Current.Log($"Exception while preparing update: {ex.GetType()} ({ex.Message})", LogTextBox.Warning); } #else catch { } diff --git a/CreamInstaller/Forms/SelectDialogForm.Designer.cs b/CreamInstaller/Forms/SelectDialogForm.Designer.cs index 84c7228..84c9c7c 100644 --- a/CreamInstaller/Forms/SelectDialogForm.Designer.cs +++ b/CreamInstaller/Forms/SelectDialogForm.Designer.cs @@ -185,7 +185,8 @@ namespace CreamInstaller this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "SelectDialogForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Text = "SelectDialogForm"; this.groupBox.ResumeLayout(false); this.groupBox.PerformLayout(); diff --git a/CreamInstaller/Forms/SelectDialogForm.cs b/CreamInstaller/Forms/SelectDialogForm.cs index 295c1cb..66e6e65 100644 --- a/CreamInstaller/Forms/SelectDialogForm.cs +++ b/CreamInstaller/Forms/SelectDialogForm.cs @@ -12,7 +12,11 @@ namespace CreamInstaller; internal partial class SelectDialogForm : CustomForm { - internal SelectDialogForm(IWin32Window owner) : base(owner) => InitializeComponent(); + internal SelectDialogForm(IWin32Window owner) : base(owner) + { + InitializeComponent(); + TopLevel = true; + } private readonly List<(Platform platform, string id, string name)> selected = new(); internal List<(Platform platform, string id, string name)> QueryUser(string groupBoxText, List<(Platform platform, string id, string name, bool alreadySelected)> choices) diff --git a/CreamInstaller/Forms/SelectForm.Designer.cs b/CreamInstaller/Forms/SelectForm.Designer.cs index 7069ab8..f6ade5a 100644 --- a/CreamInstaller/Forms/SelectForm.Designer.cs +++ b/CreamInstaller/Forms/SelectForm.Designer.cs @@ -321,7 +321,7 @@ namespace CreamInstaller this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "SelectForm"; - this.StartPosition = FormStartPosition.CenterParent; + this.StartPosition = FormStartPosition.Manual; this.Text = "SelectForm"; this.Load += this.OnLoad; this.programsGroupBox.ResumeLayout(false); diff --git a/CreamInstaller/Forms/SelectForm.cs b/CreamInstaller/Forms/SelectForm.cs index f11d876..5a7ee10 100644 --- a/CreamInstaller/Forms/SelectForm.cs +++ b/CreamInstaller/Forms/SelectForm.cs @@ -27,7 +27,7 @@ namespace CreamInstaller; internal partial class SelectForm : CustomForm { - internal SelectForm(IWin32Window owner) : base(owner) + internal SelectForm() : base() { InitializeComponent(); Text = Program.ApplicationName; @@ -43,7 +43,7 @@ internal partial class SelectForm : CustomForm private void AddToRemainingGames(string gameName) { if (Program.Canceled) return; - Program.Invoke(progressLabelGames, delegate + progressLabelGames.Invoke(delegate { if (Program.Canceled) return; if (!RemainingGames.Contains(gameName)) @@ -54,7 +54,7 @@ internal partial class SelectForm : CustomForm private void RemoveFromRemainingGames(string gameName) { if (Program.Canceled) return; - Program.Invoke(progressLabelGames, delegate + progressLabelGames.Invoke(delegate { if (Program.Canceled) return; RemainingGames.Remove(gameName); @@ -67,7 +67,7 @@ internal partial class SelectForm : CustomForm private void AddToRemainingDLCs(string dlcId) { if (Program.Canceled) return; - Program.Invoke(progressLabelDLCs, delegate + progressLabelDLCs.Invoke(delegate { if (Program.Canceled) return; if (!RemainingDLCs.Contains(dlcId)) @@ -78,7 +78,7 @@ internal partial class SelectForm : CustomForm private void RemoveFromRemainingDLCs(string dlcId) { if (Program.Canceled) return; - Program.Invoke(progressLabelDLCs, delegate + progressLabelDLCs.Invoke(delegate { if (Program.Canceled) return; RemainingDLCs.Remove(dlcId); @@ -128,8 +128,8 @@ internal partial class SelectForm : CustomForm programNode.Name = selection.Id; programNode.Text = selection.Name; programNode.Checked = selection.Enabled; - programNode.Remove(); - _ = selectionTreeView.Nodes.Add(programNode); + if (programNode.TreeView is null) + _ = selectionTreeView.Nodes.Add(programNode); } } int steamGamesToCheck; @@ -244,7 +244,7 @@ internal partial class SelectForm : CustomForm selection.WebsiteUrl = appData?.website; if (Program.Canceled) return; - Program.Invoke(selectionTreeView, delegate + selectionTreeView.Invoke(delegate { if (Program.Canceled) return; TreeNode programNode = treeNodes.Find(s => s.Tag is Platform.Steam && s.Name == appId) ?? new(); @@ -252,8 +252,8 @@ internal partial class SelectForm : CustomForm programNode.Name = appId; programNode.Text = appData?.name ?? name; programNode.Checked = selection.Enabled; - programNode.Remove(); - _ = selectionTreeView.Nodes.Add(programNode); + if (programNode.TreeView is null) + _ = selectionTreeView.Nodes.Add(programNode); foreach (KeyValuePair pair in dlc) { if (Program.Canceled || programNode is null) return; @@ -266,8 +266,8 @@ internal partial class SelectForm : CustomForm dlcNode.Name = appId; dlcNode.Text = dlcApp.name; dlcNode.Checked = selection.SelectedDlc.ContainsKey(appId); - dlcNode.Remove(); - _ = programNode.Nodes.Add(dlcNode); + if (dlcNode.Parent is null) + _ = programNode.Nodes.Add(dlcNode); } }); if (Program.Canceled) return; @@ -344,7 +344,7 @@ internal partial class SelectForm : CustomForm } if (Program.Canceled) return; - Program.Invoke(selectionTreeView, delegate + selectionTreeView.Invoke(delegate { if (Program.Canceled) return; TreeNode programNode = treeNodes.Find(s => s.Tag is Platform.Epic && s.Name == @namespace) ?? new(); @@ -352,15 +352,15 @@ internal partial class SelectForm : CustomForm programNode.Name = @namespace; programNode.Text = name; programNode.Checked = selection.Enabled; - programNode.Remove(); - _ = selectionTreeView.Nodes.Add(programNode); + if (programNode.TreeView is null) + _ = selectionTreeView.Nodes.Add(programNode); /*TreeNode catalogItemsNode = treeNodes.Find(s => s.Tag is Platform.Epic && s.Name == @namespace + "_catalogItems") ?? new(); catalogItemsNode.Tag = selection.Platform; catalogItemsNode.Name = @namespace + "_catalogItems"; catalogItemsNode.Text = "Catalog Items"; catalogItemsNode.Checked = selection.SelectedDlc.Any(pair => pair.Value.type == DlcType.CatalogItem); - catalogItemsNode.Remove(); - programNode.Nodes.Add(catalogItemsNode);*/ + if (catalogItemsNode.Parent is null) + programNode.Nodes.Add(catalogItemsNode);*/ if (entitlements.Any()) { /*TreeNode entitlementsNode = treeNodes.Find(s => s.Tag is Platform.Epic && s.Name == @namespace + "_entitlements") ?? new(); @@ -368,8 +368,8 @@ internal partial class SelectForm : CustomForm entitlementsNode.Name = @namespace + "_entitlements"; entitlementsNode.Text = "Entitlements"; entitlementsNode.Checked = selection.SelectedDlc.Any(pair => pair.Value.type == DlcType.Entitlement); - entitlementsNode.Remove(); - programNode.Nodes.Add(entitlementsNode);*/ + if (entitlementsNode.Parent is null) + programNode.Nodes.Add(entitlementsNode);*/ foreach (KeyValuePair pair in entitlements) { if (programNode is null/* || entitlementsNode is null*/) return; @@ -382,8 +382,8 @@ internal partial class SelectForm : CustomForm dlcNode.Name = dlcId; dlcNode.Text = dlcApp.name; dlcNode.Checked = selection.SelectedDlc.ContainsKey(dlcId); - dlcNode.Remove(); - _ = programNode.Nodes.Add(dlcNode); //entitlementsNode.Nodes.Add(dlcNode); + if (dlcNode.Parent is null) + _ = programNode.Nodes.Add(dlcNode); //entitlementsNode.Nodes.Add(dlcNode); } } }); @@ -423,7 +423,7 @@ internal partial class SelectForm : CustomForm selection.Platform = Platform.Ubisoft; selection.IconUrl = IconGrabber.GetDomainFaviconUrl("store.ubi.com"); - Program.Invoke(selectionTreeView, delegate + selectionTreeView.Invoke(delegate { if (Program.Canceled) return; TreeNode programNode = treeNodes.Find(s => s.Tag is Platform.Ubisoft && s.Name == gameId) ?? new(); @@ -431,8 +431,8 @@ internal partial class SelectForm : CustomForm programNode.Name = gameId; programNode.Text = name; programNode.Checked = selection.Enabled; - programNode.Remove(); - _ = selectionTreeView.Nodes.Add(programNode); + if (programNode.TreeView is null) + _ = selectionTreeView.Nodes.Add(programNode); }); if (Program.Canceled) return; RemoveFromRemainingGames(name); @@ -524,14 +524,15 @@ internal partial class SelectForm : CustomForm setup = false; progressLabel.Text = "Gathering and caching your applicable games and their DLCs . . . "; ProgramSelection.ValidateAll(ProgramsToScan); - TreeNodes.ForEach(node => + /*TreeNodes.ForEach(node => { if (node.Tag is not Platform platform || node.Name is not string platformId || ProgramSelection.FromPlatformId(platform, platformId) is null && ProgramSelection.GetDlcFromPlatformId(platform, platformId) is null) node.Remove(); - }); + });*/ + TreeNodes.ForEach(node => node.Remove()); // nodes cause lots of lag during rescan for now await GetApplicablePrograms(iProgress); await SteamCMD.Cleanup(); } @@ -835,15 +836,28 @@ internal partial class SelectForm : CustomForm if (!Program.IsProgramRunningDialog(this, selection)) return; if (!uninstall && ParadoxLauncher.DlcDialog(this)) return; Hide(); - using InstallForm installForm = new(this, uninstall); - _ = installForm.ShowDialog(); - if (installForm.Reselecting) +#pragma warning disable CA2000 // Dispose objects before losing scope + InstallForm form = new(uninstall); +#pragma warning restore CA2000 // Dispose objects before losing scope + form.InheritLocation(this); + form.FormClosing += (s, e) => { - InheritLocation(installForm); - Show(); - OnLoad(); - } - else Close(); + if (form.Reselecting) + { + InheritLocation(form); + Show(); +#if DEBUG + DebugForm.Current.Attach(this); +#endif + OnLoad(); + } + else Close(); + }; + form.Show(); + Hide(); +#if DEBUG + DebugForm.Current.Attach(form); +#endif } } diff --git a/CreamInstaller/Paradox/ParadoxLauncher.cs b/CreamInstaller/Paradox/ParadoxLauncher.cs index b71e122..b3fbcfa 100644 --- a/CreamInstaller/Paradox/ParadoxLauncher.cs +++ b/CreamInstaller/Paradox/ParadoxLauncher.cs @@ -120,14 +120,14 @@ internal static class ParadoxLauncher { steamOriginalSdk32.Write(api32); if (installForm is not null) - installForm.UpdateUser("Corrected Steamworks: " + api32, InstallationLog.Action); + installForm.UpdateUser("Corrected Steamworks: " + api32, LogTextBox.Action); neededRepair = true; } if (steamOriginalSdk64 is not null && api64.IsResourceFile(ResourceIdentifier.Steamworks64)) { steamOriginalSdk64.Write(api64); if (installForm is not null) - installForm.UpdateUser("Corrected Steamworks: " + api64, InstallationLog.Action); + installForm.UpdateUser("Corrected Steamworks: " + api64, LogTextBox.Action); neededRepair = true; } if (!selection.Koaloader && smokeConfig) @@ -138,14 +138,14 @@ internal static class ParadoxLauncher { epicOriginalSdk32.Write(api32); if (installForm is not null) - installForm.UpdateUser("Corrected Epic Online Services: " + api32, InstallationLog.Action); + installForm.UpdateUser("Corrected Epic Online Services: " + api32, LogTextBox.Action); neededRepair = true; } if (epicOriginalSdk64 is not null && api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64)) { epicOriginalSdk64.Write(api64); if (installForm is not null) - installForm.UpdateUser("Corrected Epic Online Services: " + api64, InstallationLog.Action); + installForm.UpdateUser("Corrected Epic Online Services: " + api64, LogTextBox.Action); neededRepair = true; } if (!selection.Koaloader && screamConfig) @@ -154,7 +154,7 @@ internal static class ParadoxLauncher if (neededRepair) { if (installForm is not null) - installForm.UpdateUser("Paradox Launcher successfully repaired!", InstallationLog.Success); + installForm.UpdateUser("Paradox Launcher successfully repaired!", LogTextBox.Success); else _ = dialogForm.Show(form.Icon, "Paradox Launcher successfully repaired!", "OK", customFormText: "Paradox Launcher"); return RepairResult.Success; @@ -162,7 +162,7 @@ internal static class ParadoxLauncher else { if (installForm is not null) - installForm.UpdateUser("Paradox Launcher did not need to be repaired.", InstallationLog.Success); + installForm.UpdateUser("Paradox Launcher did not need to be repaired.", LogTextBox.Success); else _ = dialogForm.Show(SystemIcons.Information, "Paradox Launcher does not need to be repaired.", "OK", customFormText: "Paradox Launcher"); return RepairResult.Unnecessary; diff --git a/CreamInstaller/Program.cs b/CreamInstaller/Program.cs index 6e517f0..3bcefde 100644 --- a/CreamInstaller/Program.cs +++ b/CreamInstaller/Program.cs @@ -74,6 +74,9 @@ internal static class Program { HttpClientManager.Setup(); using MainForm form = new(); +#if DEBUG + DebugForm.Current.Attach(form); +#endif Application.Run(form); } catch (Exception e) @@ -86,8 +89,6 @@ internal static class Program mutex.Close(); } - internal static void Invoke(this Control control, MethodInvoker methodInvoker) => control.Invoke(methodInvoker); - internal static bool Canceled; internal static async void Cleanup(bool cancel = true) { diff --git a/CreamInstaller/Resources/Koaloader.cs b/CreamInstaller/Resources/Koaloader.cs index 3b8aa7e..611a332 100644 --- a/CreamInstaller/Resources/Koaloader.cs +++ b/CreamInstaller/Resources/Koaloader.cs @@ -68,7 +68,7 @@ internal static class Koaloader if (targets.Any() || modules.Any()) { if (installForm is not null) - installForm.UpdateUser("Generating Koaloader configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + installForm.UpdateUser("Generating Koaloader configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); File.Create(config).Close(); StreamWriter writer = new(config, true, Encoding.UTF8); WriteConfig(writer, targets, modules, installForm); @@ -79,7 +79,7 @@ internal static class Koaloader { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } } @@ -98,7 +98,7 @@ internal static class Koaloader string path = pair.Value; writer.WriteLine($" \"{path}\"{(pair.Equals(lastTarget) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added target to Koaloader.json with path {path}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added target to Koaloader.json with path {path}", LogTextBox.Action, info: false); } writer.WriteLine(" ]"); } @@ -116,7 +116,7 @@ internal static class Koaloader writer.WriteLine($" \"required\": true"); writer.WriteLine(" }" + (pair.Equals(lastModule) ? "" : ",")); if (installForm is not null) - installForm.UpdateUser($"Added module to Koaloader.json with path {path}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added module to Koaloader.json with path {path}", LogTextBox.Action, info: false); } writer.WriteLine(" ]"); } @@ -132,7 +132,7 @@ internal static class Koaloader { File.Delete(proxyPath); if (installForm is not null) - installForm.UpdateUser($"Deleted Koaloader: {Path.GetFileName(proxyPath)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Koaloader: {Path.GetFileName(proxyPath)}", LogTextBox.Action, info: false); } foreach ((string unlocker, string path) in AutoLoadDlls .Select(pair => (pair.unlocker, path: directory + @"\" + pair.dll)) @@ -140,13 +140,13 @@ internal static class Koaloader { File.Delete(path); if (installForm is not null) - installForm.UpdateUser($"Deleted {unlocker}: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted {unlocker}: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(config)) { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } await SmokeAPI.Uninstall(directory, installForm, deleteConfig); await ScreamAPI.Uninstall(directory, installForm, deleteConfig); @@ -162,13 +162,13 @@ internal static class Koaloader { File.Delete(_path); if (installForm is not null) - installForm.UpdateUser($"Deleted Koaloader: {Path.GetFileName(_path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Koaloader: {Path.GetFileName(_path)}", LogTextBox.Action, info: false); } if (File.Exists(path) && !path.IsResourceFile(ResourceIdentifier.Koaloader)) throw new CustomMessageException("A non-Koaloader DLL named " + selection.KoaloaderProxy + ".dll already exists in this directory!"); path.WriteProxy(selection.KoaloaderProxy, binaryType); if (installForm is not null) - installForm.UpdateUser($"Wrote {(binaryType == BinaryType.BIT32 ? "32-bit" : "64-bit")} Koaloader: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote {(binaryType == BinaryType.BIT32 ? "32-bit" : "64-bit")} Koaloader: {Path.GetFileName(path)}", LogTextBox.Action, info: false); bool bit32 = false, bit64 = false; foreach (string executable in Directory.EnumerateFiles(directory, "*.exe")) if (executable.TryGetFileBinaryType(out BinaryType binaryType)) @@ -187,14 +187,14 @@ internal static class Koaloader path = directory + @"\SmokeAPI32.dll"; "SmokeAPI.steam_api.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } if (bit64) { path = directory + @"\SmokeAPI64.dll"; "SmokeAPI.steam_api64.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } SmokeAPI.CheckConfig(directory, selection, installForm); } @@ -205,14 +205,14 @@ internal static class Koaloader path = directory + @"\ScreamAPI32.dll"; "ScreamAPI.EOSSDK-Win32-Shipping.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } if (bit64) { path = directory + @"\ScreamAPI64.dll"; "ScreamAPI.EOSSDK-Win64-Shipping.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } ScreamAPI.CheckConfig(directory, selection, installForm); } @@ -223,14 +223,14 @@ internal static class Koaloader path = directory + @"\UplayR1Unlocker32.dll"; "UplayR1.uplay_r1_loader.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } if (bit64) { path = directory + @"\UplayR1Unlocker64.dll"; "UplayR1.uplay_r1_loader64.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } UplayR1.CheckConfig(directory, selection, installForm); if (bit32) @@ -238,14 +238,14 @@ internal static class Koaloader path = directory + @"\UplayR2Unlocker32.dll"; "UplayR2.upc_r2_loader.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } if (bit64) { path = directory + @"\UplayR2Unlocker64.dll"; "UplayR2.upc_r2_loader64.dll".Write(path); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false); } UplayR2.CheckConfig(directory, selection, installForm); } diff --git a/CreamInstaller/Resources/Resources.cs b/CreamInstaller/Resources/Resources.cs index 0c5197c..81ca600 100644 --- a/CreamInstaller/Resources/Resources.cs +++ b/CreamInstaller/Resources/Resources.cs @@ -78,36 +78,35 @@ internal static class Resources internal static bool TryGetFileBinaryType(this string path, out BinaryType binaryType) => GetBinaryType(path, out binaryType); internal static async Task> GetExecutableDirectories(this string rootDirectory, bool filterCommon = false, Func validFunc = null) => - await Task.Run(async () => (await rootDirectory.GetExecutables(filterCommon: filterCommon, validFunc: validFunc) ?? await rootDirectory.GetExecutables()).Select(e => + await Task.Run(async () => (await rootDirectory.GetExecutables(filterCommon: filterCommon, validFunc: validFunc) ?? await rootDirectory.GetExecutables())?.Select(e => { e.path = Path.GetDirectoryName(e.path); return e; - }).DistinctBy(e => e.path).ToList()); + })?.DistinctBy(e => e.path).ToList()); internal static async Task> GetExecutables(this string rootDirectory, bool filterCommon = false, Func validFunc = null) => await Task.Run(() => { List<(string path, BinaryType binaryType)> executables = new(); if (Program.Canceled || !Directory.Exists(rootDirectory)) return null; - List files = new(Directory.EnumerateFiles(rootDirectory, "*.exe", new EnumerationOptions() { RecurseSubdirectories = true })); - foreach (string path in files) + foreach (string path in Directory.EnumerateFiles(rootDirectory, "*.exe", new EnumerationOptions() { RecurseSubdirectories = true })) { if (Program.Canceled) return null; - Thread.Sleep(0); if (!executables.Any(e => e.path == path) && (!filterCommon || !rootDirectory.IsCommonIncorrectExecutable(path)) && (validFunc is null || validFunc(path)) && path.TryGetFileBinaryType(out BinaryType binaryType) && binaryType is BinaryType.BIT64) executables.Add((path, binaryType)); + Thread.Sleep(1); } - foreach (string path in files) + foreach (string path in Directory.EnumerateFiles(rootDirectory, "*.exe", new EnumerationOptions() { RecurseSubdirectories = true })) { if (Program.Canceled) return null; - Thread.Sleep(0); if (!executables.Any(e => e.path == path) && (!filterCommon || !rootDirectory.IsCommonIncorrectExecutable(path)) && (validFunc is null || validFunc(path)) && path.TryGetFileBinaryType(out BinaryType binaryType) && binaryType is BinaryType.BIT32) executables.Add((path, binaryType)); + Thread.Sleep(1); } return !executables.Any() ? null : executables; }); @@ -115,7 +114,7 @@ internal static class Resources internal static bool IsCommonIncorrectExecutable(this string rootDirectory, string path) { string subPath = path[rootDirectory.Length..].ToUpperInvariant().BeautifyPath(); - return subPath.Contains("SETUP") || subPath.Contains("REDIST") + return subPath.Contains("SETUP") || subPath.Contains("REDIST") //|| subPath.Contains("SUPPORT") || subPath.Contains("CRASH") && (subPath.Contains("PAD") || subPath.Contains("REPORT")); } @@ -123,52 +122,55 @@ internal static class Resources { List dllDirectories = new(); if (Program.Canceled || !Directory.Exists(gameDirectory)) return null; - foreach (string subDirectory in new List(Directory.EnumerateDirectories(gameDirectory, "*", new EnumerationOptions() { RecurseSubdirectories = true })) { gameDirectory }) + foreach (string directory in Directory.EnumerateDirectories(gameDirectory, "*", new EnumerationOptions() { RecurseSubdirectories = true }).Append(gameDirectory)) { if (Program.Canceled) return null; - Thread.Sleep(0); - if (platform is Platform.Steam or Platform.Paradox) + string subDirectory = directory.BeautifyPath(); + if (!dllDirectories.Contains(subDirectory)) { - subDirectory.GetSmokeApiComponents(out string api, out string api_o, out string api64, out string api64_o, out string config, out string cache); - if (File.Exists(api) - || File.Exists(api_o) - || File.Exists(api64) - || File.Exists(api64_o) - || File.Exists(config) - || File.Exists(cache)) - dllDirectories.Add(subDirectory.BeautifyPath()); - } - if (platform is Platform.Epic or Platform.Paradox) - { - subDirectory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); - if (File.Exists(api32) - || File.Exists(api32_o) - || File.Exists(api64) - || File.Exists(api64_o) - || File.Exists(config)) - dllDirectories.Add(subDirectory.BeautifyPath()); - } - if (platform is Platform.Ubisoft) - { - subDirectory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); - if (File.Exists(api32) - || File.Exists(api32_o) - || File.Exists(api64) - || File.Exists(api64_o) - || File.Exists(config)) - dllDirectories.Add(subDirectory.BeautifyPath()); - subDirectory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); - if (File.Exists(old_api32) - || File.Exists(old_api64) - || File.Exists(api32) - || File.Exists(api32_o) - || File.Exists(api64) - || File.Exists(api64_o) - || File.Exists(config)) - dllDirectories.Add(subDirectory.BeautifyPath()); + if (platform is Platform.Steam or Platform.Paradox) + { + subDirectory.GetSmokeApiComponents(out string api, out string api_o, out string api64, out string api64_o, out string config, out string cache); + if (File.Exists(api) + || File.Exists(api_o) + || File.Exists(api64) + || File.Exists(api64_o) + || File.Exists(config) + || File.Exists(cache)) + dllDirectories.Add(subDirectory); + } + if (platform is Platform.Epic or Platform.Paradox) + { + subDirectory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); + if (File.Exists(api32) + || File.Exists(api32_o) + || File.Exists(api64) + || File.Exists(api64_o) + || File.Exists(config)) + dllDirectories.Add(subDirectory); + } + if (platform is Platform.Ubisoft) + { + subDirectory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); + if (File.Exists(api32) + || File.Exists(api32_o) + || File.Exists(api64) + || File.Exists(api64_o) + || File.Exists(config)) + dllDirectories.Add(subDirectory); + subDirectory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); + if (File.Exists(old_api32) + || File.Exists(old_api64) + || File.Exists(api32) + || File.Exists(api32_o) + || File.Exists(api64) + || File.Exists(api64_o) + || File.Exists(config)) + dllDirectories.Add(subDirectory); + } } } - return !dllDirectories.Any() ? null : new List(dllDirectories.Distinct()); + return !dllDirectories.Any() ? null : dllDirectories; }); internal static void GetCreamApiComponents( diff --git a/CreamInstaller/Resources/ScreamAPI.cs b/CreamInstaller/Resources/ScreamAPI.cs index 886f82f..5e567fc 100644 --- a/CreamInstaller/Resources/ScreamAPI.cs +++ b/CreamInstaller/Resources/ScreamAPI.cs @@ -37,7 +37,7 @@ internal static class ScreamAPI if (overrideCatalogItems.Any() || entitlements.Any()) { if (installForm is not null) - installForm.UpdateUser("Generating ScreamAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + installForm.UpdateUser("Generating ScreamAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); File.Create(config).Close(); StreamWriter writer = new(config, true, Encoding.UTF8); WriteConfig(writer, @@ -51,7 +51,7 @@ internal static class ScreamAPI { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } } @@ -74,7 +74,7 @@ internal static class ScreamAPI (_, string name, _) = pair.Value; writer.WriteLine($" \"{id}\"{(pair.Equals(lastOverrideCatalogItem) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added override catalog item to ScreamAPI.json with id {id} ({name})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added override catalog item to ScreamAPI.json with id {id} ({name})", LogTextBox.Action, info: false); } writer.WriteLine(" ]"); } @@ -94,7 +94,7 @@ internal static class ScreamAPI (_, string name, _) = pair.Value; writer.WriteLine($" \"{id}\"{(pair.Equals(lastEntitlement) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added entitlement to ScreamAPI.json with id {id} ({name})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added entitlement to ScreamAPI.json with id {id} ({name})", LogTextBox.Action, info: false); } writer.WriteLine(" ]"); } @@ -113,11 +113,11 @@ internal static class ScreamAPI { File.Delete(api32); if (installForm is not null) - installForm.UpdateUser($"Deleted ScreamAPI: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted ScreamAPI: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } File.Move(api32_o, api32); if (installForm is not null) - installForm.UpdateUser($"Restored Epic Online Services: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Epic Online Services: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { @@ -125,17 +125,17 @@ internal static class ScreamAPI { File.Delete(api64); if (installForm is not null) - installForm.UpdateUser($"Deleted ScreamAPI: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted ScreamAPI: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } File.Move(api64_o, api64); if (installForm is not null) - installForm.UpdateUser($"Restored Epic Online Services: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Epic Online Services: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(config)) { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } }); @@ -146,25 +146,25 @@ internal static class ScreamAPI { File.Move(api32, api32_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Epic Online Services: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Epic Online Services: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", LogTextBox.Action, info: false); } if (File.Exists(api32_o)) { "ScreamAPI.EOSSDK-Win32-Shipping.dll".Write(api32); if (installForm is not null) - installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64) && !File.Exists(api64_o)) { File.Move(api64, api64_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Epic Online Services: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Epic Online Services: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { "ScreamAPI.EOSSDK-Win64-Shipping.dll".Write(api64); if (installForm is not null) - installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (generateConfig) CheckConfig(directory, selection, installForm); diff --git a/CreamInstaller/Resources/SmokeAPI.cs b/CreamInstaller/Resources/SmokeAPI.cs index eb58af7..970f964 100644 --- a/CreamInstaller/Resources/SmokeAPI.cs +++ b/CreamInstaller/Resources/SmokeAPI.cs @@ -43,7 +43,7 @@ internal static class SmokeAPI if (overrideDlc.Any() || injectDlc.Any()) { if (installForm is not null) - installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); File.Create(config).Close(); StreamWriter writer = new(config, true, Encoding.UTF8); WriteConfig(writer, @@ -57,7 +57,7 @@ internal static class SmokeAPI { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } } @@ -78,7 +78,7 @@ internal static class SmokeAPI (_, string dlcName, _) = pair.Value; writer.WriteLine($" {dlcId}{(pair.Equals(lastOverrideDlc) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added override DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added override DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", LogTextBox.Action, info: false); } writer.WriteLine(" ],"); } @@ -94,7 +94,7 @@ internal static class SmokeAPI (_, string dlcName, _) = pair.Value; writer.WriteLine($" {dlcId}{(pair.Equals(lastInjectDlc) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added inject DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added inject DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", LogTextBox.Action, info: false); } writer.WriteLine(" ],"); } @@ -114,11 +114,11 @@ internal static class SmokeAPI { File.Delete(api32); if (installForm is not null) - installForm.UpdateUser($"Deleted SmokeAPI: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted SmokeAPI: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } File.Move(api32_o, api32); if (installForm is not null) - installForm.UpdateUser($"Restored Steamworks: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Steamworks: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { @@ -126,23 +126,23 @@ internal static class SmokeAPI { File.Delete(api64); if (installForm is not null) - installForm.UpdateUser($"Deleted SmokeAPI: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted SmokeAPI: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } File.Move(api64_o, api64); if (installForm is not null) - installForm.UpdateUser($"Restored Steamworks: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Steamworks: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(config)) { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(cache)) { File.Delete(cache); if (installForm is not null) - installForm.UpdateUser($"Deleted cache: {Path.GetFileName(cache)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted cache: {Path.GetFileName(cache)}", LogTextBox.Action, info: false); } }); @@ -153,32 +153,32 @@ internal static class SmokeAPI { File.Delete(oldConfig); if (installForm is not null) - installForm.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", LogTextBox.Action, info: false); } directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config, out _); if (File.Exists(api32) && !File.Exists(api32_o)) { File.Move(api32, api32_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Steamworks: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Steamworks: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", LogTextBox.Action, info: false); } if (File.Exists(api32_o)) { "SmokeAPI.steam_api.dll".Write(api32); if (installForm is not null) - installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64) && !File.Exists(api64_o)) { File.Move(api64, api64_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Steamworks: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Steamworks: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { "SmokeAPI.steam_api64.dll".Write(api64); if (installForm is not null) - installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (generateConfig) CheckConfig(directory, selection, installForm); diff --git a/CreamInstaller/Resources/UplayR1.cs b/CreamInstaller/Resources/UplayR1.cs index 35bbf8c..f0546b3 100644 --- a/CreamInstaller/Resources/UplayR1.cs +++ b/CreamInstaller/Resources/UplayR1.cs @@ -34,7 +34,7 @@ internal static class UplayR1 if (blacklistDlc.Any()) { if (installForm is not null) - installForm.UpdateUser("Generating Uplay R1 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + installForm.UpdateUser("Generating Uplay R1 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); File.Create(config).Close(); StreamWriter writer = new(config, true, Encoding.UTF8); WriteConfig(writer, new(blacklistDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm); @@ -45,7 +45,7 @@ internal static class UplayR1 { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } } @@ -65,7 +65,7 @@ internal static class UplayR1 (_, string dlcName, _) = pair.Value; writer.WriteLine($" {dlcId}{(pair.Equals(lastBlacklistDlc) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added blacklist DLC to UplayR1Unlocker.jsonc with appid {dlcId} ({dlcName})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added blacklist DLC to UplayR1Unlocker.jsonc with appid {dlcId} ({dlcName})", LogTextBox.Action, info: false); } writer.WriteLine(" ],"); } @@ -83,11 +83,11 @@ internal static class UplayR1 { File.Delete(api32); if (installForm is not null) - installForm.UpdateUser($"Deleted Uplay R1 Unlocker: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Uplay R1 Unlocker: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } File.Move(api32_o, api32); if (installForm is not null) - installForm.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { @@ -95,17 +95,17 @@ internal static class UplayR1 { File.Delete(api64); if (installForm is not null) - installForm.UpdateUser($"Deleted Uplay R1 Unlocker: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Uplay R1 Unlocker: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } File.Move(api64_o, api64); if (installForm is not null) - installForm.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(config)) { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } }); @@ -116,25 +116,25 @@ internal static class UplayR1 { File.Move(api32, api32_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Uplay R1: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Uplay R1: {Path.GetFileName(api32)} -> {Path.GetFileName(api32_o)}", LogTextBox.Action, info: false); } if (File.Exists(api32_o)) { "UplayR1.uplay_r1_loader.dll".Write(api32); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(api32)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(api32)}", LogTextBox.Action, info: false); } if (File.Exists(api64) && !File.Exists(api64_o)) { File.Move(api64, api64_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Uplay R1: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Uplay R1: {Path.GetFileName(api64)} -> {Path.GetFileName(api64_o)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { "UplayR1.uplay_r1_loader64.dll".Write(api64); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(api64)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(api64)}", LogTextBox.Action, info: false); } if (generateConfig) CheckConfig(directory, selection, installForm); diff --git a/CreamInstaller/Resources/UplayR2.cs b/CreamInstaller/Resources/UplayR2.cs index f9028c4..cb104bd 100644 --- a/CreamInstaller/Resources/UplayR2.cs +++ b/CreamInstaller/Resources/UplayR2.cs @@ -36,7 +36,7 @@ internal static class UplayR2 if (blacklistDlc.Any()) { if (installForm is not null) - installForm.UpdateUser("Generating Uplay R2 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", InstallationLog.Operation); + installForm.UpdateUser("Generating Uplay R2 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); File.Create(config).Close(); StreamWriter writer = new(config, true, Encoding.UTF8); WriteConfig(writer, new(blacklistDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm); @@ -47,7 +47,7 @@ internal static class UplayR2 { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } } @@ -69,7 +69,7 @@ internal static class UplayR2 (_, string dlcName, _) = pair.Value; writer.WriteLine($" {dlcId}{(pair.Equals(lastBlacklistDlc) ? "" : ",")}"); if (installForm is not null) - installForm.UpdateUser($"Added blacklist DLC to UplayR2Unlocker.jsonc with appid {dlcId} ({dlcName})", InstallationLog.Action, info: false); + installForm.UpdateUser($"Added blacklist DLC to UplayR2Unlocker.jsonc with appid {dlcId} ({dlcName})", LogTextBox.Action, info: false); } writer.WriteLine(" ],"); } @@ -88,11 +88,11 @@ internal static class UplayR2 { File.Delete(api); if (installForm is not null) - installForm.UpdateUser($"Deleted Uplay R2 Unlocker: {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Uplay R2 Unlocker: {Path.GetFileName(api)}", LogTextBox.Action, info: false); } File.Move(api32_o, api); if (installForm is not null) - installForm.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api32_o)} -> {Path.GetFileName(api)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { @@ -101,17 +101,17 @@ internal static class UplayR2 { File.Delete(api); if (installForm is not null) - installForm.UpdateUser($"Deleted Uplay R2 Unlocker: {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted Uplay R2 Unlocker: {Path.GetFileName(api)}", LogTextBox.Action, info: false); } File.Move(api64_o, api); if (installForm is not null) - installForm.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api)}", LogTextBox.Action, info: false); } if (deleteConfig && File.Exists(config)) { File.Delete(config); if (installForm is not null) - installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, info: false); } }); @@ -123,26 +123,26 @@ internal static class UplayR2 { File.Move(api, api32_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Uplay R2: {Path.GetFileName(api)} -> {Path.GetFileName(api32_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Uplay R2: {Path.GetFileName(api)} -> {Path.GetFileName(api32_o)}", LogTextBox.Action, info: false); } if (File.Exists(api32_o)) { "UplayR2.upc_r2_loader.dll".Write(api); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(api)}", LogTextBox.Action, info: false); } api = File.Exists(old_api64) ? old_api64 : api64; if (File.Exists(api) && !File.Exists(api64_o)) { File.Move(api, api64_o); if (installForm is not null) - installForm.UpdateUser($"Renamed Uplay R2: {Path.GetFileName(api)} -> {Path.GetFileName(api64_o)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Renamed Uplay R2: {Path.GetFileName(api)} -> {Path.GetFileName(api64_o)}", LogTextBox.Action, info: false); } if (File.Exists(api64_o)) { "UplayR2.upc_r2_loader64.dll".Write(api); if (installForm is not null) - installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(api)}", InstallationLog.Action, info: false); + installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(api)}", LogTextBox.Action, info: false); } if (generateConfig) CheckConfig(directory, selection, installForm); diff --git a/CreamInstaller/Steam/SteamStore.cs b/CreamInstaller/Steam/SteamStore.cs index c465a15..fe35298 100644 --- a/CreamInstaller/Steam/SteamStore.cs +++ b/CreamInstaller/Steam/SteamStore.cs @@ -10,8 +10,6 @@ using System.Threading.Tasks; #if DEBUG using System; -using System.Drawing; -using System.Windows.Forms; #endif namespace CreamInstaller.Steam; @@ -54,11 +52,7 @@ internal static class SteamStore if (!appDetails.success) { #if DEBUG - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Query unsuccessful for appid: " + appId + $"\nisDlc: {isDlc}\ndata is null: {data is null}\n\n" + app.Value.ToString()); - }); + DebugForm.Current.Log($"Query unsuccessful for appid {appId}{(isDlc ? " (DLC)" : "")}: {app.Value.ToString(Formatting.None)}", LogTextBox.Warning); #endif if (data is null) return null; @@ -73,11 +67,7 @@ internal static class SteamStore #if DEBUG (Exception e) { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Unsuccessful serialization of query for appid " + appId + ":\n\n" + e.ToString()); - }); + DebugForm.Current.Log($"Unsuccessful serialization of query for appid {appId}{(isDlc ? " (DLC)" : "")}: {e.GetType()} ({e.Message})"); } #else { } @@ -85,36 +75,18 @@ internal static class SteamStore return data; } #if DEBUG - else - { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Response data null for appid: " + appId + "\n\n" + app.Value.ToString()); - }); - } + else DebugForm.Current.Log($"Response data null for appid {appId}{(isDlc ? " (DLC)" : "")}: {app.Value.ToString(Formatting.None)}"); #endif } #if DEBUG - else - { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Response details null for appid: " + appId + "\n\n" + app.Value.ToString()); - }); - } + else DebugForm.Current.Log($"Response details null for appid {appId}{(isDlc ? " (DLC)" : "")}: {app.Value.ToString(Formatting.None)}"); #endif } catch #if DEBUG (Exception e) { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Unsuccessful deserialization of query for appid " + appId + ":\n\n" + e.ToString()); - }); + DebugForm.Current.Log($"Unsuccessful deserialization of query for appid {appId}{(isDlc ? " (DLC)" : "")}: {e.GetType()} ({e.Message})"); } #else { } @@ -122,25 +94,11 @@ internal static class SteamStore } } #if DEBUG - else - { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Response deserialization null for appid: " + appId); - }); - } + else DebugForm.Current.Log("Response deserialization null for appid " + appId); #endif } #if DEBUG - else - { - Form.ActiveForm.Invoke(() => - { - using DialogForm dialogForm = new(Form.ActiveForm); - dialogForm.Show(SystemIcons.Error, "Response null for appid: " + appId); - }); - } + else DebugForm.Current.Log("Response null for appid " + appId, LogTextBox.Warning); #endif } if (cachedExists) diff --git a/CreamInstaller/Utility/InstallationLog.cs b/CreamInstaller/Utility/LogTextBox.cs similarity index 53% rename from CreamInstaller/Utility/InstallationLog.cs rename to CreamInstaller/Utility/LogTextBox.cs index 767b948..46a10e7 100644 --- a/CreamInstaller/Utility/InstallationLog.cs +++ b/CreamInstaller/Utility/LogTextBox.cs @@ -3,7 +3,7 @@ using System.Windows.Forms; namespace CreamInstaller.Utility; -internal static class InstallationLog +internal static class LogTextBox { internal static readonly Color Background = Color.DarkSlateGray; internal static readonly Color Operation = Color.LightGray; @@ -13,12 +13,15 @@ internal static class InstallationLog internal static readonly Color Warning = Color.Yellow; internal static readonly Color Error = Color.DarkOrange; - internal static void AppendText(this RichTextBox logTextBox, string text, Color color) + internal static void AppendText(this RichTextBox textBox, string text, Color color, bool scroll = false) { - logTextBox.SelectionStart = logTextBox.TextLength; - logTextBox.SelectionLength = 0; - logTextBox.SelectionColor = color; - logTextBox.AppendText(text); - logTextBox.SelectionColor = logTextBox.ForeColor; + textBox.SelectionStart = textBox.TextLength; + textBox.SelectionLength = 0; + textBox.SelectionColor = color; + if (scroll) textBox.ScrollToCaret(); + textBox.AppendText(text); + if (scroll) textBox.ScrollToCaret(); + textBox.SelectionColor = textBox.ForeColor; + textBox.Invalidate(); } }