diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..28bcb4a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/.vs
+/bin
+/obj
diff --git a/AppResource.Designer.cs b/AppResource.Designer.cs
new file mode 100644
index 0000000..4512104
--- /dev/null
+++ b/AppResource.Designer.cs
@@ -0,0 +1,93 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace FizzyLauncher {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class AppResource {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal AppResource() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FizzyLauncher.AppResource", typeof(AppResource).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap folder_32 {
+ get {
+ object obj = ResourceManager.GetObject("folder_32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap toggle_left_ea_16 {
+ get {
+ object obj = ResourceManager.GetObject("toggle_left_ea_16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap toggle_right_ea_16 {
+ get {
+ object obj = ResourceManager.GetObject("toggle_right_ea_16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/AppResource.resx b/AppResource.resx
new file mode 100644
index 0000000..f5bec56
--- /dev/null
+++ b/AppResource.resx
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Resources\folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\toggle-left-ea-16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\toggle-right-ea-16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/FizzyLauncher.csproj b/FizzyLauncher.csproj
new file mode 100644
index 0000000..47ac8db
--- /dev/null
+++ b/FizzyLauncher.csproj
@@ -0,0 +1,85 @@
+
+
+
+ WinExe
+ net5.0-windows
+ true
+ true
+ favicon.ico
+ false
+ fizzylauncher
+ Ray Lam
+ Hi, I'm Ray
+ Fizzy Launcher
+ Ray Lam
+ 0.2.1.055
+ 0.2.1.055
+
+
+
+ bin\Debug\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ AppResource.resx
+
+
+ UserControl
+
+
+ True
+ True
+ UIResource.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ AppResource.Designer.cs
+
+
+ TFolderTextBox.resx
+
+
+ ResXFileCodeGenerator
+ UIResource.Designer.cs
+
+
+
+
\ No newline at end of file
diff --git a/FizzyLauncher.csproj.user b/FizzyLauncher.csproj.user
new file mode 100644
index 0000000..3091f15
--- /dev/null
+++ b/FizzyLauncher.csproj.user
@@ -0,0 +1,68 @@
+
+
+
+ false
+
+
+
+ Form
+
+
+ UserControl
+
+
+ Component
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ Form
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ UserControl
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ UserControl
+
+
+ UserControl
+
+
+
\ No newline at end of file
diff --git a/FizzyLauncher.sln b/FizzyLauncher.sln
new file mode 100644
index 0000000..aafd02f
--- /dev/null
+++ b/FizzyLauncher.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31410.357
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FizzyLauncher", "FizzyLauncher.csproj", "{4833FB27-0817-4720-A54B-180369B0C374}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4833FB27-0817-4720-A54B-180369B0C374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4833FB27-0817-4720-A54B-180369B0C374}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4833FB27-0817-4720-A54B-180369B0C374}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4833FB27-0817-4720-A54B-180369B0C374}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {CB4C1DB0-19FE-4AA0-9621-D66FAC4CF7C5}
+ EndGlobalSection
+EndGlobal
diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs
new file mode 100644
index 0000000..16b56d0
--- /dev/null
+++ b/MainForm.Designer.cs
@@ -0,0 +1,346 @@
+namespace FizzyLauncher
+{
+ partial class MainForm
+ {
+ ///
+ /// 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.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+ this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
+ this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.exitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripSeparator();
+ this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripSeparator();
+ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator();
+ this.exitToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
+ this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.showBigIconsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.enableAnimationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.helpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.viewHelpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator();
+ this.aboutToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
+ this.contextMenuStrip2.SuspendLayout();
+ this.menuStrip1.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // saveFileDialog1
+ //
+ this.saveFileDialog1.Filter = "Session files|*.jsonfig";
+ this.saveFileDialog1.Title = "Choose file to save the session";
+ //
+ // openFileDialog1
+ //
+ this.openFileDialog1.Filter = "Session files|*.jsonfig";
+ this.openFileDialog1.Title = "Choose session file";
+ //
+ // notifyIcon1
+ //
+ this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip2;
+ this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
+ this.notifyIcon1.Text = "notifyIcon1";
+ this.notifyIcon1.Visible = true;
+ this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick);
+ //
+ // contextMenuStrip2
+ //
+ this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.exitToolStripMenuItem1});
+ this.contextMenuStrip2.Name = "contextMenuStrip2";
+ this.contextMenuStrip2.Size = new System.Drawing.Size(94, 26);
+ //
+ // exitToolStripMenuItem1
+ //
+ this.exitToolStripMenuItem1.Name = "exitToolStripMenuItem1";
+ this.exitToolStripMenuItem1.Size = new System.Drawing.Size(93, 22);
+ this.exitToolStripMenuItem1.Text = "E&xit";
+ this.exitToolStripMenuItem1.Click += new System.EventHandler(this.exitToolStripMenuItem1_Click);
+ //
+ // menuStrip1
+ //
+ this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.viewToolStripMenuItem,
+ this.toolsToolStripMenuItem,
+ this.helpToolStripMenuItem1});
+ this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip1.Name = "menuStrip1";
+ this.menuStrip1.Size = new System.Drawing.Size(633, 24);
+ this.menuStrip1.TabIndex = 2;
+ this.menuStrip1.MenuActivate += new System.EventHandler(this.menuStrip1_MenuActivate);
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.newToolStripMenuItem,
+ this.openToolStripMenuItem,
+ this.toolStripMenuItem13,
+ this.closeToolStripMenuItem,
+ this.toolStripMenuItem14,
+ this.saveToolStripMenuItem,
+ this.saveAsToolStripMenuItem,
+ this.toolStripMenuItem15,
+ this.exitToolStripMenuItem2});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.fileToolStripMenuItem.Text = "&File";
+ //
+ // newToolStripMenuItem
+ //
+ this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+ this.newToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
+ this.newToolStripMenuItem.Text = "&New";
+ this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click);
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
+ this.openToolStripMenuItem.Text = "&Open";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+ //
+ // toolStripMenuItem13
+ //
+ this.toolStripMenuItem13.Name = "toolStripMenuItem13";
+ this.toolStripMenuItem13.Size = new System.Drawing.Size(120, 6);
+ //
+ // closeToolStripMenuItem
+ //
+ this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
+ this.closeToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
+ this.closeToolStripMenuItem.Text = "&Close";
+ this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
+ //
+ // toolStripMenuItem14
+ //
+ this.toolStripMenuItem14.Name = "toolStripMenuItem14";
+ this.toolStripMenuItem14.Size = new System.Drawing.Size(120, 6);
+ //
+ // saveToolStripMenuItem
+ //
+ this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+ this.saveToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
+ this.saveToolStripMenuItem.Text = "&Save";
+ this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+ //
+ // saveAsToolStripMenuItem
+ //
+ this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+ this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
+ this.saveAsToolStripMenuItem.Text = "Save &As...";
+ this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+ //
+ // toolStripMenuItem15
+ //
+ this.toolStripMenuItem15.Name = "toolStripMenuItem15";
+ this.toolStripMenuItem15.Size = new System.Drawing.Size(120, 6);
+ //
+ // exitToolStripMenuItem2
+ //
+ this.exitToolStripMenuItem2.Name = "exitToolStripMenuItem2";
+ this.exitToolStripMenuItem2.Size = new System.Drawing.Size(123, 22);
+ this.exitToolStripMenuItem2.Text = "E&xit";
+ this.exitToolStripMenuItem2.Click += new System.EventHandler(this.exitToolStripMenuItem2_Click);
+ //
+ // viewToolStripMenuItem
+ //
+ this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.showBigIconsToolStripMenuItem,
+ this.enableAnimationsToolStripMenuItem,
+ this.alwaysOnTopToolStripMenuItem});
+ this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+ this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+ this.viewToolStripMenuItem.Text = "&View";
+ //
+ // showBigIconsToolStripMenuItem
+ //
+ this.showBigIconsToolStripMenuItem.Name = "showBigIconsToolStripMenuItem";
+ this.showBigIconsToolStripMenuItem.Size = new System.Drawing.Size(173, 22);
+ this.showBigIconsToolStripMenuItem.Text = "Show &Big Icons";
+ this.showBigIconsToolStripMenuItem.Click += new System.EventHandler(this.showBigIconsToolStripMenuItem_Click);
+ //
+ // enableAnimationsToolStripMenuItem
+ //
+ this.enableAnimationsToolStripMenuItem.Name = "enableAnimationsToolStripMenuItem";
+ this.enableAnimationsToolStripMenuItem.Size = new System.Drawing.Size(173, 22);
+ this.enableAnimationsToolStripMenuItem.Text = "Enable &Animations";
+ this.enableAnimationsToolStripMenuItem.Click += new System.EventHandler(this.enableAnimationsToolStripMenuItem_Click);
+ //
+ // alwaysOnTopToolStripMenuItem
+ //
+ this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem";
+ this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(173, 22);
+ this.alwaysOnTopToolStripMenuItem.Text = "Always On &Top";
+ this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click);
+ //
+ // toolsToolStripMenuItem
+ //
+ this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.optionsToolStripMenuItem});
+ this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
+ this.toolsToolStripMenuItem.Size = new System.Drawing.Size(46, 20);
+ this.toolsToolStripMenuItem.Text = "&Tools";
+ //
+ // optionsToolStripMenuItem
+ //
+ this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
+ this.optionsToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
+ this.optionsToolStripMenuItem.Text = "&Options";
+ this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click);
+ //
+ // helpToolStripMenuItem1
+ //
+ this.helpToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.viewHelpToolStripMenuItem1,
+ this.toolStripMenuItem16,
+ this.aboutToolStripMenuItem1});
+ this.helpToolStripMenuItem1.Name = "helpToolStripMenuItem1";
+ this.helpToolStripMenuItem1.Size = new System.Drawing.Size(44, 20);
+ this.helpToolStripMenuItem1.Text = "&Help";
+ //
+ // viewHelpToolStripMenuItem1
+ //
+ this.viewHelpToolStripMenuItem1.Name = "viewHelpToolStripMenuItem1";
+ this.viewHelpToolStripMenuItem1.Size = new System.Drawing.Size(127, 22);
+ this.viewHelpToolStripMenuItem1.Text = "&View Help";
+ this.viewHelpToolStripMenuItem1.Click += new System.EventHandler(this.viewHelpToolStripMenuItem1_Click);
+ //
+ // toolStripMenuItem16
+ //
+ this.toolStripMenuItem16.Name = "toolStripMenuItem16";
+ this.toolStripMenuItem16.Size = new System.Drawing.Size(124, 6);
+ //
+ // aboutToolStripMenuItem1
+ //
+ this.aboutToolStripMenuItem1.Name = "aboutToolStripMenuItem1";
+ this.aboutToolStripMenuItem1.Size = new System.Drawing.Size(127, 22);
+ this.aboutToolStripMenuItem1.Text = "&About";
+ this.aboutToolStripMenuItem1.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click);
+ //
+ // panel1
+ //
+ this.panel1.AutoScroll = true;
+ this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.panel1.BackColor = System.Drawing.Color.Transparent;
+ this.panel1.Controls.Add(this.flowLayoutPanel1);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 24);
+ this.panel1.Margin = new System.Windows.Forms.Padding(0);
+ this.panel1.Name = "panel1";
+ this.panel1.Padding = new System.Windows.Forms.Padding(10, 10, 10, 20);
+ this.panel1.Size = new System.Drawing.Size(633, 376);
+ this.panel1.TabIndex = 3;
+ //
+ // flowLayoutPanel1
+ //
+ this.flowLayoutPanel1.AutoSize = true;
+ this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.flowLayoutPanel1.BackColor = System.Drawing.Color.Transparent;
+ this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
+ this.flowLayoutPanel1.Location = new System.Drawing.Point(10, 10);
+ this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
+ this.flowLayoutPanel1.Name = "flowLayoutPanel1";
+ this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(0, 0, 0, 20);
+ this.flowLayoutPanel1.Size = new System.Drawing.Size(0, 20);
+ this.flowLayoutPanel1.TabIndex = 29;
+ this.flowLayoutPanel1.WrapContents = false;
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250)))));
+ this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.ClientSize = new System.Drawing.Size(633, 400);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.menuStrip1);
+ this.DoubleBuffered = true;
+ this.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MainMenuStrip = this.menuStrip1;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(420, 280);
+ this.Name = "MainForm";
+ this.Text = "Fizzy Launcher";
+ this.contextMenuStrip2.ResumeLayout(false);
+ this.menuStrip1.ResumeLayout(false);
+ this.menuStrip1.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.SaveFileDialog saveFileDialog1;
+ private System.Windows.Forms.OpenFileDialog openFileDialog1;
+ private System.Windows.Forms.NotifyIcon notifyIcon1;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip2;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem1;
+ private System.Windows.Forms.MenuStrip menuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem1;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
+ private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13;
+ private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14;
+ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem showBigIconsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem enableAnimationsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem viewHelpToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16;
+ private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem1;
+ }
+}
+
diff --git a/MainForm.cs b/MainForm.cs
new file mode 100644
index 0000000..bd47082
--- /dev/null
+++ b/MainForm.cs
@@ -0,0 +1,644 @@
+using FizzyLauncher.Models;
+using FizzyLauncher.Text.Json;
+using FizzyLauncher.Windows.Forms;
+using RyzStudio.Windows.Forms;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text.Json;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace FizzyLauncher
+{
+ public partial class MainForm : Form
+ {
+ [DllImport("user32.dll")]
+ protected static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
+
+ [DllImport("user32.dll")]
+ protected static extern bool UnregisterHotKey(IntPtr hWnd, int id);
+
+ //protected const int MOD_ALT = 0x1;
+ //protected const int MOD_CONTROL = 0x2;
+ //protected const int MOD_SHIFT = 0x4;
+ //protected const int MOD_WIN = 0x8;
+ protected const int WM_HOTKEY = 0x312;
+ protected const int WM_QUERYENDSESSION = 0x0011;
+
+ protected OptionsForm optionsForm = null;
+ protected string sessionFilename = null;
+ protected bool isBusy = false;
+ protected bool requestExit = false;
+
+
+ public MainForm() : base()
+ {
+ InitializeComponent();
+
+ notifyIcon1.Text = Application.ProductName;
+
+ this.StartPosition = FormStartPosition.WindowsDefaultBounds;
+ this.Visible = false;
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ ThreadControl.SetVisible(this, false);
+ ThreadControl.SetSize(this, this.MinimumSize);
+ }
+
+ protected async override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+
+ ThreadControl.SetVisible(this, false);
+
+ string jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig");
+ if (File.Exists(jsonfigFilename))
+ {
+ await loadFile(jsonfigFilename);
+ }
+ else
+ {
+ this.CurrentSession = new LauncherSession();
+
+ ThreadControl.SetVisible(this, true);
+ }
+ }
+
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ base.OnClosing(e);
+
+ if (this.CurrentSession == null) this.CurrentSession = new LauncherSession();
+
+ if (this.CurrentSession.HideOnClose && !requestExit)
+ {
+ this.Visible = !this.Visible;
+ e.Cancel = true;
+ return;
+ }
+
+ requestExit = false;
+
+ if (string.IsNullOrWhiteSpace(sessionFilename))
+ {
+ // do nothing
+ }
+ else
+ {
+ if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Prompt)
+ {
+ DialogResult dr = MessageBox.Show("Save existing session?", "Exit", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ if (dr == DialogResult.Yes)
+ {
+ bool rv = saveFile(sessionFilename, false);
+ if (!rv)
+ {
+ e.Cancel = true;
+ }
+ }
+ else if (dr == DialogResult.No)
+ {
+ // do nothing
+ }
+ else if (dr == DialogResult.Cancel)
+ {
+ e.Cancel = true;
+ }
+ }
+ else if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Yes)
+ {
+ saveFile(sessionFilename, false);
+ }
+ }
+
+ if (this.CurrentSession.HotKey != null)
+ {
+ if (this.CurrentSession.HotKey.KeyCode != Keys.None)
+ {
+ // UnregisterHotKey((IntPtr)Handle, 1);
+ }
+ }
+
+ }
+
+ protected override void WndProc(ref Message m)
+ {
+ switch (m.Msg)
+ {
+ case WM_HOTKEY:
+ if (m.WParam.ToInt32() == 1)
+ {
+ this.Visible = !this.Visible;
+ }
+
+ break;
+ case WM_QUERYENDSESSION:
+ requestExit = true;
+ //this.Close();
+ Application.Exit();
+
+ break;
+ default: break;
+
+ }
+
+ base.WndProc(ref m);
+ }
+
+
+ public LauncherSession CurrentSession { get; set; } = null;
+
+
+ protected async Task collapseWindow(int width, int increment = 6)
+ {
+ await Task.Run(() =>
+ {
+ while (this.Width > width)
+ {
+ ThreadControl.SetWidth(this, (this.Width - increment));
+
+ Application.DoEvents();
+ }
+
+ ThreadControl.SetWidth(this, width);
+ });
+ }
+
+ protected async Task expandWindow(int width, int increment = 8)
+ {
+ await Task.Run(() =>
+ {
+ while (this.Width < width)
+ {
+ ThreadControl.SetWidth(this, (this.Width + increment));
+
+ Application.DoEvents();
+ }
+
+ ThreadControl.SetWidth(this, width);
+ });
+ }
+
+ protected void invalidateHotKey()
+ {
+ if (this.InvokeRequired)
+ {
+ this.Invoke(new MethodInvoker(() =>
+ {
+ // UnregisterHotKey((IntPtr)Handle, 1);
+ }));
+ }
+ else
+ {
+ // UnregisterHotKey((IntPtr)Handle, 1);
+ }
+
+ if (this.CurrentSession.HotKey != null)
+ {
+ if (this.CurrentSession.HotKey.KeyCode != Keys.None)
+ {
+ if (this.InvokeRequired)
+ {
+ this.Invoke(new MethodInvoker(() =>
+ {
+ // RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key);
+ }));
+ }
+ else
+ {
+ // RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key);
+ }
+ }
+ }
+ }
+
+
+ protected void newSession()
+ {
+ flowLayoutPanel1.Controls.Clear();
+ flowLayoutPanel1.Controls.Add(new TilePanelLayout(new TileGroupModel()
+ {
+ Title = "New Group",
+ IsExpanded = true,
+ GridSize = new Size(6, 1)
+ }));
+
+ InvalidateWidth(6);
+ }
+
+ protected async Task loadFile(string filename)
+ {
+ await Task.Run(() =>
+ {
+ if (isBusy)
+ {
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(filename))
+ {
+ return;
+ }
+
+ if (!File.Exists(filename))
+ {
+ return;
+ }
+
+ string sourceCode = null;
+
+ try
+ {
+ sessionFilename = filename;
+
+ sourceCode = File.ReadAllText(sessionFilename);
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.Message, "Load session");
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(sourceCode))
+ {
+ return;
+ }
+
+ // load options
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new JsonPointConverter());
+ options.Converters.Add(new JsonSizeConverter());
+
+ this.CurrentSession = JsonSerializer.Deserialize(sourceCode, options);
+ if (this.CurrentSession == null)
+ {
+ this.CurrentSession = new LauncherSession();
+ }
+
+ // load tiles
+ int maxTileWidth = 0;
+ ThreadControl.Clear(flowLayoutPanel1);
+
+ if (this.CurrentSession.Groups != null)
+ {
+ foreach (TileGroupModel item in this.CurrentSession.Groups)
+ {
+ maxTileWidth = Math.Max(maxTileWidth, item.GridSize.Width);
+
+ TilePanelLayout panel = new TilePanelLayout(item);
+
+ ThreadControl.Add(flowLayoutPanel1, panel);
+ }
+ }
+
+ // resize
+ InvalidateSize(maxTileWidth);
+
+ // reposition
+ if (!this.CurrentSession.StartPosition.IsEmpty) ThreadControl.SetLocation(this, this.CurrentSession.StartPosition);
+
+ //
+ ThreadControl.SetTopMost(this, this.CurrentSession.AlwaysOnTop);
+ ThreadControl.SetVisible(this, true);
+ ThreadControl.SetChecked(enableAnimationsToolStripMenuItem, this.CurrentSession.EnableAnimation);
+ ThreadControl.SetChecked(showBigIconsToolStripMenuItem, this.CurrentSession.EnableBigIconInFolder);
+
+ ThreadControl.SetFocus(this);
+
+ // hotkey
+ invalidateHotKey();
+
+ });
+ }
+
+ protected bool saveFile(string filename, bool showNotices = true)
+ {
+ if (isBusy)
+ {
+ return false;
+ }
+
+ if (string.IsNullOrWhiteSpace(filename))
+ {
+ return false;
+ }
+
+ if (flowLayoutPanel1.Controls.Count <= 0)
+ {
+ return true;
+ }
+
+ isBusy = true;
+
+ // update session
+ if (this.CurrentSession == null)
+ {
+ this.CurrentSession = new LauncherSession();
+ }
+
+ this.CurrentSession.DefaultHeight = this.Height;
+ this.CurrentSession.AlwaysOnTop = this.TopMost;
+ this.CurrentSession.StartPosition = this.Location;
+
+ // save
+ this.CurrentSession.Groups = new List();
+ for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++)
+ {
+ if (flowLayoutPanel1.Controls[i].GetType() != typeof(TilePanelLayout))
+ {
+ continue;
+ }
+
+ TilePanelLayout container = flowLayoutPanel1.Controls[i] as TilePanelLayout;
+ this.CurrentSession.Groups.Add(container.Model);
+ }
+
+ try
+ {
+ File.WriteAllText(filename, JsonSerializer.Serialize(this.CurrentSession));
+
+ if (showNotices)
+ {
+ MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.Message, "Save session");
+
+ return false;
+ }
+
+ isBusy = false;
+
+ return true;
+ }
+
+ protected bool saveAsFile()
+ {
+ if (isBusy)
+ {
+ return false;
+ }
+
+ if (saveFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ bool rv = saveFile(saveFileDialog1.FileName);
+ if (rv)
+ {
+ sessionFilename = saveFileDialog1.FileName;
+ }
+
+ return rv;
+ }
+
+ return false;
+ }
+
+
+ protected void InvalidateSize(int columnWidth)
+ {
+ int newWidth = TilePanelLayout.CalcWidth(columnWidth);
+ newWidth += SystemInformation.VerticalScrollBarWidth;
+ newWidth += flowLayoutPanel1.Padding.Horizontal + flowLayoutPanel1.Margin.Horizontal;
+ newWidth += panel1.Left + panel1.Padding.Horizontal + panel1.Margin.Horizontal;
+ newWidth += this.Padding.Horizontal;
+
+ ThreadControl.ClientSize(this, newWidth, this.CurrentSession.DefaultHeight);
+ }
+
+ protected void InvalidateWidth(int columnWidth)
+ {
+ int newWidth = TilePanelLayout.CalcWidth(columnWidth);
+ newWidth += SystemInformation.VerticalScrollBarWidth;
+ newWidth += panel1.Left + panel1.Padding.Horizontal + this.Padding.Horizontal + flowLayoutPanel1.Padding.Horizontal + flowLayoutPanel1.Left;
+
+ ThreadControl.SetClientWidth(this, newWidth);
+ }
+
+
+ #region main menu
+
+ private void newToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(sessionFilename))
+ {
+ newSession();
+ }
+ else
+ {
+ DialogResult dr = MessageBox.Show("Save existing session?", "New session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ if (dr == DialogResult.Yes)
+ {
+ bool rv = saveFile(sessionFilename, false);
+ if (rv)
+ {
+ newSession();
+
+ sessionFilename = null;
+ }
+ }
+ else if (dr == DialogResult.No)
+ {
+ newSession();
+
+ sessionFilename = null;
+ }
+ else if (dr == DialogResult.Cancel)
+ {
+ return;
+ }
+ }
+ }
+
+ private async void openToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(sessionFilename))
+ {
+ if (openFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ await loadFile(openFileDialog1.FileName);
+ }
+ }
+ else
+ {
+ DialogResult dr = MessageBox.Show("Save existing session?", "Open session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ if (dr == DialogResult.Yes)
+ {
+ bool rv = saveFile(sessionFilename, false);
+ if (rv)
+ {
+ if (openFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ await loadFile(openFileDialog1.FileName);
+ }
+ }
+ }
+ else if (dr == DialogResult.No)
+ {
+ if (openFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ await loadFile(openFileDialog1.FileName);
+ }
+ }
+ else if (dr == DialogResult.Cancel)
+ {
+ return;
+ }
+ }
+ }
+
+ private void closeToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(sessionFilename))
+ {
+ flowLayoutPanel1.Controls.Clear();
+ }
+ else
+ {
+ DialogResult dr = MessageBox.Show("Save existing session?", "Close session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ if (dr == DialogResult.Yes)
+ {
+ bool rv = saveFile(sessionFilename, false);
+ if (rv)
+ {
+ flowLayoutPanel1.Controls.Clear();
+
+ sessionFilename = null;
+ }
+ }
+ else if (dr == DialogResult.No)
+ {
+ flowLayoutPanel1.Controls.Clear();
+
+ sessionFilename = null;
+ }
+ else if (dr == DialogResult.Cancel)
+ {
+ return;
+ }
+ }
+ }
+
+ private void saveToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(sessionFilename))
+ {
+ saveAsFile();
+ }
+ else
+ {
+ saveFile(sessionFilename, true);
+ }
+ }
+
+ private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ saveAsFile();
+ }
+
+ private void exitToolStripMenuItem2_Click(object sender, EventArgs e)
+ {
+ requestExit = true;
+
+ this.Close();
+ }
+
+
+ private void showBigIconsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (this.CurrentSession == null)
+ {
+ return;
+ }
+
+ this.CurrentSession.EnableBigIconInFolder = !this.CurrentSession.EnableBigIconInFolder;
+
+ showBigIconsToolStripMenuItem.Checked = this.CurrentSession.EnableBigIconInFolder;
+ }
+
+ private void enableAnimationsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (this.CurrentSession == null)
+ {
+ return;
+ }
+
+ this.CurrentSession.EnableAnimation = !this.CurrentSession.EnableAnimation;
+
+ enableAnimationsToolStripMenuItem.Checked = this.CurrentSession.EnableAnimation;
+ }
+
+ private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ this.TopMost = !this.TopMost;
+ }
+
+
+ private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (optionsForm == null) optionsForm = new OptionsForm(this);
+ optionsForm.ShowDialog();
+
+ invalidateHotKey();
+ }
+
+
+ private void viewHelpToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ System.Diagnostics.Process.Start("https://www.hiimray.co.uk/software-fizzy-launcher");
+ }
+ catch
+ {
+ // do nothing
+ }
+ }
+
+ private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ MessageBox.Show(Application.ProductName + " v" + Application.ProductVersion, "About", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+
+ private void menuStrip1_MenuActivate(object sender, EventArgs e)
+ {
+ alwaysOnTopToolStripMenuItem.Checked = this.TopMost;
+ saveAsToolStripMenuItem.Enabled = !string.IsNullOrWhiteSpace(sessionFilename);
+ }
+
+
+ #endregion
+
+ #region notification icon
+
+ private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Visible = !this.Visible;
+ }
+ }
+
+ private void exitToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ requestExit = true;
+
+ this.Close();
+ }
+
+
+ #endregion
+
+
+ }
+}
\ No newline at end of file
diff --git a/MainForm.resx b/MainForm.resx
new file mode 100644
index 0000000..04386e6
--- /dev/null
+++ b/MainForm.resx
@@ -0,0 +1,670 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 172, 17
+
+
+ 308, 17
+
+
+ 448, 17
+
+
+ 561, 17
+
+
+
+
+ AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
+ IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxc
+ VU5rW1Tna1tU22paU5BsXVVCgEBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAaltTZWtbVPxrW1T/a1tU/2tbVP9rW1T/a1tU7mtbU6VrXFNWbVtbDgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABqWlR/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU+Wta
+ VLprW1Nrb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2tbVJhrW1T/a1tU/2tbVP+NgXz/2NPR/6+mov+Bc23/a1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVc1sXFSAa1xSMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtSUkHa1xUqmtbVP9rW1T/a1tU/5iNiP/6+fn/////////
+ ////////6+no/7+4tf+Sh4L/bV5X/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVOFrXFOZallTTW1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlaWhFqW1TCa1tU/2tbVP9rW1T/o5mV//38
+ /P//////////////////////////////////////9PPy/8jDwP+cko3/c2Nd/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/a1tU/2tbVPVrW1SzalxUXmlaWhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalhYHWtbVNRrW1T/a1tU/2tb
+ VP+1rar/////////////////////////////////////////////////////////////////+vn5/9LN
+ y/+lm5f/eGpj/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVPtrWlS9bFxVb2xdVSEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrWVMra1tU42tb
+ VP9rW1T/bV1W/8S9u///////////////////////////////////////////////////////////////
+ /////////////////////////v7+/97a2f+xqKT/g3Zw/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tb
+ VP5qW1V4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpZ
+ VTxrW1Tua1tU/2tbVP9wYVr/0czK////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////+ro5/+8tbL/j4N+/21d
+ Vv9rW1T/a1tU/2tbVP9rW1TpAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAbFxTUGtbVPZrW1T/a1tU/3VnYP/d2df/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////Tz8v/Iw8D/dmdh/2tbVP9rW1T/blpTJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU+2tbVP9rW1T/emxl/+Th4P//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////m5CL/2tbVP9rW1T/a1tTXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtaVHdrW1T/a1tU/2tbVP+DdnD/7uzs/////////////Pvw//z6
+ 7v/8+u7//Pru//z67v/8+u7//Pru//z67v/9/PT///////////////////////z4+f/79fX/+/X1//v1
+ 9f/79fX/+/X1//v19f/79fX//Pb2////////////////////////////vLWy/2tbVP9rW1T/a1xTmQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDa1tUmGtbVP9rW1T/a1tU/4t/ev/08/L/////////
+ ///cyT7/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/6Nt+////////////4bG1/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/9KKkP//////////////////////3tvZ/2tb
+ VP9rW1T/a1tU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Sra1tU/2tbVP9rW1T/mY6J//r5
+ +f////////////389f/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28Y1////
+ ////////0IWL/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/9+fn/////////
+ /////////Pz8/3BhWv9rW1T/a1tU/nFVVRIAAAAAAAAAAAAAAAAAAAAAaVpaEWtcVMNrW1T/a1tU/2tb
+ VP+kmpb//fz8//////////////////389P/RtwD/0bcA/+TVbP/w56r/8Oeq//Dnqv/w56r/8Oeq/93K
+ Qv/RtwD/28Y1////////////0IWL/8RlbP/TjZL/68zO/+vMzv/rzM7/68zO/+vMzv/dpqr/xGVs/8Rl
+ bP/8+Pn//////////////////////46CfP9rW1T/a1tU/2xbVEkAAAAAAAAAAAAAAABsWFgaa1xU0Wtb
+ VP9rW1T/a1tU/7CopP////////////////////////////389P/RtwD/0bcA/+7lov//////////////
+ /////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////////////////////
+ ///px8n/xGVs/8RlbP/8+Pn//////////////////////7CopP9rW1T/a1tU/2tbVIMAAAAAAAAAAAAA
+ AABqXFTOa1tU/2tbVP9tXlf/xr+9//////////////////////////////////389P/RtwD/0bcA/+7l
+ ov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////
+ ///////////////////px8n/xGVs/8RlbP/8+Pn//////////////////////9LNy/9rW1T/a1tU/2tb
+ VL8AAAAAAAAAAAAAAABrW1Tva1tU/2tbVP/KxML///////////////////////////////////////38
+ 9P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8Rl
+ bP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn///////////////////////Py
+ 8v9sXFX/a1tU/2tbVPRmZmYFAAAAAAAAAABrW1W4a1tU/2tbVP/Oycf/////////////////////////
+ //////////////389P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////
+ ////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn/////////
+ //////////////////+CdG7/a1tU/2tbVP9sXVM0AAAAAAAAAABqWlR/a1tU/2tbVP+tpKD/////////
+ //////////////////////////////389P/RtwD/0bcA/+7lov///////////////////////////+PT
+ Y//RtwD/28Y1////////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8Rl
+ bP/8+Pn///////////////////////////+jmZX/a1tU/2tbVP9rWlNuAAAAAAAAAABtWlNEa1tU/2tb
+ VP+Lfnn///////////////////////////////////////389P/RtwD/0bcA/93JQf/j1Gb/49Rm/+PU
+ Zv/j1Gb/49Rm/9jCJ//RtwD/28Y1////////////0IWL/8RlbP/NfYL/3KOn/9yjp//co6f/3KOn/9yj
+ p//TjJH/xGVs/8RlbP/8+Pn////////////////////////////Fv7z/a1tU/2tbVP9qW1OoAAAAAAAA
+ AABqVVUMa1tU+2tbVP9uXlf/+fn4//////////////////////////////////389P/RtwD/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28c5////////////0IWL/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8Rmbf/9+vr////////////////////////////n5eT/a1tU/2tb
+ VP9rW1TkAAAAAAAAAAAAAAAAa1tUz2tbVP9rW1T/3NjW//////////////////////////////////38
+ 9v/axTP/2sUz/9rFM//axTP/2sUz/9rFM//axTP/2sUz/9rFM//bxzj/8Ois////////////2p2i/9CE
+ if/QhIn/0ISJ/9CEif/QhIn/0ISJ/9CEif/QhIn/0ISJ/+GwtP//////////////////////////////
+ ///+/v7/dWdg/2tbVP9rW1T/alhYHQAAAAAAAAAAa1tUlGtbVP9rW1T/ubKv////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////l4uG/2tbVP9rW1T/a1pUWAAAAAAAAAAAbFtVWmtbVP9rW1T/mI2I////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////uLGt/2tbVP9rW1T/a1tUkgAAAAAAAAAAa1pSH2tb
+ VP9rW1T/dmdh//7+/v////////////////////////////////+rnPH/fGTp/3xk6f98ZOn/fGTp/3xk
+ 6f98ZOn/fGTp/3xk6f9/aOr/ysD2////////////rOH9/zi4+v8ztvr/M7b6/zO2+v8ztvr/M7b6/zO2
+ +v8ztvr/M7b6/33R/P//////////////////////////////////////2tbV/2tbVP9rW1T/a1tVzQAA
+ AAAAAAAAAAAAAGtbVONrW1T/a1tU/+jm5f////////////////////////////r5/v9cPuT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/gGjq////////////Obj6/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/AKT5/wGk+f/3/P//////////////////////////////////+vn5/25f
+ WP9rW1T/a1tU/GpVVQwAAAAAAAAAAGtcVKprW1T/a1tU/8bAvf////////////////////////////j3
+ /v9bPeT/Wz3k/4Vu6/+di+//nYvv/52L7/+di+//nYvv/3Rb6P9bPeT/fWXq////////////Nbf6/wCk
+ +f8nsvr/Zsj7/2bI+/9myPv/Zsj7/2bI+/9Bu/v/AKT5/wCk+f/0+///////////////////////////
+ /////////////4p9eP9rW1T/a1tU/2xdVUIAAAAAAAAAAGtbVHBrW1T/a1tU/6Sblv//////////////
+ //////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////
+ ////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////
+ /////////////////////////////6yjn/9rW1T/a1tU/2pcVH0AAAAAAAAAAGxdUzRrW1T/a1tU/4J0
+ bv////////////////////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI
+ 7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk
+ +f/0+////////////////////////////////////////87Jx/9rW1T/a1tU/2tbVbgAAAAAAAAAAGZm
+ ZgVrW1T0a1tU/2xcVf/z8vL///////////////////////j3/v9bPeT/Wz3k/8O49f//////////////
+ /////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////////////////////
+ //+i3v3/AKT5/wCk+f/0+////////////////////////////////////////8rEwv9rW1T/a1tU/2tb
+ VO8AAAAAAAAAAAAAAABrW1S/a1tU/2tbVP/Szcv///////////////////////j3/v9bPeT/Wz3k/8O4
+ 9f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////
+ //////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////////////xr+9/21e
+ V/9rW1T/a1tU/2pcVM4AAAAAAAAAAAAAAABrWlSFa1tU/2tbVP+xqaX///////////////////////j3
+ /v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk
+ +f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////
+ //+6sq//bFxV/2tbVP9rW1T/a1tT1m9eVR4AAAAAAAAAAAAAAABpXFVLa1tU/2tbVP+Pg37/////////
+ //////////////j3/v9bPeT/Wz3k/6CP7//Ivvb/yL72/8i+9v/Ivvb/yL72/4Vv6/9bPeT/fWXq////
+ ////////Nbf6/wCk+f9CvPv/quH9/6rh/f+q4f3/quH9/6rh/f9sy/z/AKT5/wCk+f/0+///////////
+ /////////f39/6ifmv9rW1T/a1tU/2tbVP9rW1TIZllZFAAAAAAAAAAAAAAAAAAAAABpWloRa1tU/Wtb
+ VP9wYVr//Pv7//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/fWXq////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f/1+//////////////7+vr/nZKO/2tbVP9rW1T/a1tU/2tcVbJmZk0KAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tT1mtbVP9rW1T/4Nzb//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/rJ3x////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/z66+v////////////b19P+Pg37/a1tU/2tbVP9rW1T/a1tTn4BAQAQAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa1pUm2tbVP9rW1T/vbaz//////////////////7+///08v3/9PL9//Ty
+ /f/08v3/9PL9//Ty/f/08v3/9PL9//Ty/f/49/7/////////////////8vr//+75///u+f//7vn//+75
+ ///u+f//7vn//+75///u+f//8Pr/////////////8O/u/4Z5dP9rW1T/a1tU/2tbVP9rXFSIAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbFxUYWtbVP9rW1T/nJGM////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////n5eT/fG5o/2tbVP9rW1T/a1tU/Gta
+ VWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAblpTJWtbVP9rW1T/dmdh/8jD
+ wP/08/L/////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////93Z1/91Z2D/a1tU/2tb
+ VP9rW1T2bFxTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWtb
+ VOlrW1T/a1tU/2tbVP9tXVb/j4N+/7y1sv/q6Of/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////0czK/3Bh
+ Wv9rW1T/a1tU/2tbVO5qWVU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGpbVXhrW1T+a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/g3Zw/7GopP/e2tn//v7+////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///Evbv/bV1W/2tbVP9rW1T/a1tU42tZUysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsXVUhbFxVb2taVL1rW1T7a1tU/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/eGpj/6Wbl//Szcv/+vn5////////////////////////////////////////////////////
+ /////////////7Wtqv9rW1T/a1tU/2tbVP9rW1TUalhYHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpWloRbFpUVWtb
+ U6JrW1Twa1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/cGFa/5KHgv+/uLX/8O/u////////////////////
+ ///////////////////9/f3/p56a/2tbVP9rW1T/a1tU/2pbVcdmWVkUAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABVVVUDallVPGtbVJFrW1Pia1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/bFxV/4l8
+ dv+1ran/4d7d//////////////////v6+v+cko3/a1tU/2tbVP9rW1T/a1tUsXFVVQkAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa1xSMmxcVIBrW1XNa1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/4Fzbf+vpqL/2NPR/42BfP9rW1T/a1tU/2tbVP9rW1SYVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAb15VHmtbU2trWlS6a1tU+WtbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2pa
+ VH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbVtbDmtcU1ZrW1Ola1tU7mtbVP9rW1T/a1tU/2tb
+ VP9rW1T8altTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBABGxd
+ VUJqWlOQa1tU22tbVOdsXFVOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4H///+sEP//AD///6wQ//4AB///rBD/+AAA//+sEP/w
+ AAAP/6wQ/+AAAAH/rBD/wAAAAD+sEP+AAAAAH6wQ/wAAAAAPrBD+AAAAAA+sEPwAAAAAD6wQ+AAAAAAP
+ rBDgAAAAAA+sEMAAAAAAB6wQgAAAAAAHrBAAAAAAAAesEAAAAAAAB6wQAAAAAAADrBAAAAAAAAOsEAAA
+ AAAAA6wQAAAAAAADrBAAAAAAAAOsEIAAAAAAAawQgAAAAAABrBCAAAAAAAGsEIAAAAAAAawQwAAAAAAA
+ rBDAAAAAAACsEMAAAAAAAKwQwAAAAAAArBDAAAAAAACsEOAAAAAAAKwQ4AAAAAAArBDgAAAAAAGsEOAA
+ AAAAA6wQ8AAAAAAHrBDwAAAAAA+sEPAAAAAAP6wQ8AAAAAB/rBDwAAAAAP+sEPgAAAAB/6wQ/AAAAAP/
+ rBD/gAAAB/+sEP/wAAAP/6wQ//8AAB//rBD//+AAf/+sEP///AD//6wQ////gf//rBAoAAAAIAAAAEAA
+ AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU7GtbVcFqW1RzalxVJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVe2tbVP5rW1T/a1tU/2tbVP9rW1T/a1tT1mtcVIhrWVU5gICAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2xbVJVrW1T/bV5X/8K7uf/RzMr/pJqW/3hpY/9rW1T/a1tU/2tb
+ VP9rW1TpalxTnGxcVU5mZk0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Spa1tU/29fWf/Oycf//////////////////v7+/+He
+ 3f+1ran/iXx2/2tbVP9rW1T/a1tU/2tbVPZqW1W7bFxVb2xYWBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYFAQbFxUwGtbVP91ZmD+3trZ////////////////////
+ ////////////////////////6efm/7y0sf+Ogn3/bV1W/2tbVP9rW1T/a1tU/WtbVMZrWlR3ZlVVDwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2tbVNJrW1T/fW9p/+fl5P//////////////
+ ///////////////////////////////////////////////////z8vL/x8G//5uQi/9xYlv/a1tU/2tb
+ VP9rW1SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpdVylrW1Tha1tU/4V4cv/w7u7/////////
+ //////////////////////////////////////////////////////////////////////////////r6
+ +v/Evbv/a1tU/2xbVMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrXVM3a1tU62tbVP+MgHr/9PPy////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////v6+v9vX1n/a1tU+2pVVQwAAAAAAAAAAAAAAAAAAAAAallTTWtbVPVrW1T/mY6K//r5
+ +f///v3/1r8d/9G3AP/RtwD/0bcA/9G3AP/RtwD/07oL//r34//57u//x2xy/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/y3d9///+/v///////////4yAev9rW1T/alpSQQAAAAAAAAAAAAAAAGpaVWBrW1T7a1tU/6mg
+ nP/+/v7///////799//RtwD/2cMr/+PUZv/j1Gb/49Rm/9zIPP/RtwD/9vHM//Pg4v/EZWz/0omP/9yj
+ p//co6f/3KOn/85/hf/EZWz//fr6////////////rqai/2tbVP9sW1V7AAAAAAAAAABrW1R5a1tU/2xc
+ Vf+4sa3//////////////////v33/9G3AP/k1Wz/////////////////7OGW/9G3AP/28cz/8+Di/8Rl
+ bP/nwML/////////////////3aaq/8RlbP/9+vr////////////RzMn/a1tU/2pbVLYAAAAAAAAAAGtb
+ VO5rW1T/w726///////////////////////+/ff/0bcA/+TVbP/////////////////s4Zb/0bcA//bx
+ zP/z4OL/xGVs/+fAwv/////////////////dpqr/xGVs//36+v////////////Lw8P9rW1T/a1tU74CA
+ gAIAAAAAa1tUxWtbVP/Z1dP///////////////////////799//RtwD/5NVs/////////////////+zh
+ lv/RtwD/9vHM//Pg4v/EZWz/58DC/////////////////92mqv/EZWz//fr6/////////////////4By
+ bP9rW1T/aF1RLAAAAABqXFSLa1tU/7iwrf///////////////////////v33/9G3AP/dyUH/7eKZ/+3i
+ mf/t4pn/4dBa/9G3AP/28cz/8+Di/8RlbP/Zm6D/58HE/+fBxP/nwcT/04yR/8RlbP/9+vr/////////
+ ////////opeT/2tbVP9qW1NlAAAAAGtbVVFrW1T/louG///////////////////////+/ff/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcB//n12//z4OL/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/x2xy//79
+ /f/////////////////Dvbr/a1tU/2tbU58AAAAAaF1RFmtbVP90ZV///v7+///////////////////+
+ /f/28cz/9vHM//bxzP/28cz/9vHM//bxzP/49dr///////35+f/z4OL/8+Di//Pg4v/z4OL/8+Di//Pg
+ 4v/47e7//////////////////////+Xi4f9rW1T/altU2gAAAAAAAAAAa1xT3GtbVP/m4+L/////////
+ /////////////+zp/P/e2Pr/3tj6/97Y+v/e2Pr/3tj6/+fj+////////////9ry/v/M7f7/zO3+/8zt
+ /v/M7f7/zO3+/+L1/v///////////////////////v7+/3VmX/9rW1T+aF1RFgAAAABsWlSha1tU/8S+
+ u//////////////////8/P//YkXl/1s95P9bPeT/Wz3k/1s95P9bPeT/XD7k/+jk+//b8v7/AaT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/C6j5//v+////////////////////////lYmE/2tbVP9rWlRPAAAAAGpc
+ VGdrW1T/o5mU//////////////////r5/v9bPeT/hW7r/72x9P+9sfT/vbH0/5WB7v9bPeT/3tj6/8zt
+ /v8ApPn/WsT7/5nb/f+Z2/3/mdv9/0G7+/8ApPn/9/z///////////////////////+2r6v/a1tU/2pb
+ VIkAAAAAaF1RLGtbVP+Acmz/////////////////+vn+/1s95P+gj+//////////////////u6/0/1s9
+ 5P/e2Pr/zO3+/wCk+f+W2v3/////////////////bMv8/wCk+f/3/P///////////////////////9nV
+ 0/9rW1T/a1tUxQAAAACAgIACa1tU72tbVP/y8PD////////////6+f7/Wz3k/6CP7///////////////
+ //+7r/T/Wz3k/97Y+v/M7f7/AKT5/5ba/f////////////////9sy/z/AKT5//f8////////////////
+ ////////w726/2tbVP9rW1TuAAAAAAAAAABqW1S2a1tU/9HMyf////////////r5/v9bPeT/oI/v////
+ /////////////7uv9P9bPeT/3tj6/8zt/v8ApPn/ltr9/////////////////2zL/P8ApPn/9/z/////
+ /////////////7ixrf9sXFX/a1tU/2tbVHkAAAAAAAAAAGpcVH1rW1T/r6ej////////////+vn+/1s9
+ 5P93Xun/nYvv/52L7/+di+//gmvq/1s95P/e2Pr/zO3+/wCk+f88ufr/Zsj7/2bI+/9myPv/K7P6/wCk
+ +f/3/P////////7+/v+upaH/a1tU/2tbVPxqXFRnAAAAAAAAAAAAAAAAa1tUQ2tbVP+NgXz/////////
+ ///6+f7/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/YkXl/+3q/P/M7f7/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/Ha76//3+///7+vr/nZOO/2tbVP9rWlT4altVVAAAAAAAAAAAAAAAAAAAAAB0XV0La1tU+29f
+ Wf/7+vr/////////////////////////////////////////////////////////////////////////
+ ////////////////////////9vX0/5CEfv9rW1T/bFxU72pZVTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABsW1TMa1tU/8S9u//6+vr/////////////////////////////////////////////////////////
+ //////////////////////////////Du7v+FeHL/a1tU/2tbVOFqXVcpAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtbVI9rW1T/a1tU/3FiW/+bkIv/x8G///Py8v//////////////////////////////
+ ///////////////////////////////////n5eT/fW9p/2tbVP9rW1TSaF5VGwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAZlVVD2taVHdrW1TGa1tU/WtbVP9rW1T/bV1W/46Cff+8tLH/6efm////
+ ////////////////////////////////////////3trZ/3ZnYf9rW1T/bFxUwHBgUBAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmWVkUalxUXmtcVKprW1Tya1tU/2tb
+ VP9rW1T/f3Fr/6uinv/Y09H//fz8/////////////////9LNy/9xYVv/a1tU/2paVa9xVVUJAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZm
+ TQpsXFVOalxTnGtbVOlrW1T/a1tU/2tbVP94aWP/pJqW/9HMyv/Cu7n/bV5X/2tbVP9sW1SVVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAgICAAmtZVTlrXFSIa1tT1mtbVP9rW1T/a1tU/2tbVP9rW1T+bFtVewAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalxVJGpbVHNrW1XBa1tU7Gxc
+ VGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g////wA///wAB//4A
+ AD/8AAAH+AAAB/AAAAfgAAADwAAAA4AAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAGAAAAAgAAAAIAA
+ AACAAAAAgAAAAMAAAADAAAABwAAAA8AAAAfgAAAP4AAAH+AAAD/8AAB//4AA///wA////wf/KAAAABgA
+ AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tTa2xcVfBsXFW1bFpVZmZcUhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrWlSFa1tU/4+Dfv+AcWv8a1tU/2tb
+ VP5tXlbMa1xUemxbVS0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAVVVVA2xbVJprW1T/qqCc//7+/v//////6+no/7+4tf+RhoH9bF1W/mtbVP9tXlbia1xTmWpZ
+ U02AVVUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0XV0LbFxVtWxcVf+5sq//////////
+ ////////////////////////8/Hx/8bAvf+Zjor/cGBa/WtbVP9tXVbxaltUo2heVRsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGZZWRRtXFbKbV1W/sjCv///////////////////////////////////////////////
+ ////////+vn5/9LNy/+mnJj/bV1W/WtbVIMAAAAAAAAAAAAAAAAAAAAAaFhYIG1eV9pvYFn808/N////
+ ////////////////////////////////////////////////////////////////////////in55/W1d
+ Vr4AAAAAAAAAAAAAAABoXVEsbV5X53NlXvzd2tj//v78/9S8EP/RtwD/0bcA/9G3AP/RtwD/8Oit/+zN
+ 0P/EZWz/xGVs/8RlbP/EZWz/yG91//79/f//////raSg/2xcVfaAQEAEAAAAAGxcVEBtXVbzfG5n++jm
+ 5f///////v35/9G3AP/v5qf/9vHM//bxzP/Ywij/7eKZ/+fBxP/NfYP/8+Di//Pg4v/rysz/xGVs//77
+ /P//////z8rH/2tbVP9rXFIyAAAAAG1dVe2CdW/98O/u/////////////v35/9G3AP/38tH/////////
+ ///axTL/7eKZ/+fBxP/Qg4n////////////04+T/xGVs//77/P//////8fDv/2tbVP9sW1RtAAAAAG5e
+ Vs+ViYT+/////////////////v35/9G3AP/38tH////////////axTL/7eKZ/+fBxP/Qg4n/////////
+ ///04+T/xGVs//77/P///////////31waftqW1OoAAAAAGxaU5NyY138/v7+/////////////v35/9G3
+ AP/Zwyr/2sUz/9rFM//Tugr/7eOb/+fBxP/Ga3L/0ISJ/9CEif/OfoT/xGVs//78/P///////////6CW
+ kv9tXlflAAAAAGpcU1lrW1T/5ePh//////////////79/+3imf/t4pn/7eKZ/+3imf/t4pr/+/nr//bm
+ 5//nwcT/58HE/+fBxP/nwcT/7M3P/////////////////8K7uf9rW1T/alhYHW9eVR5rW1T/w726////
+ /////////////8rA9v+9sfT/vbH0/72x9P++svT/8vD9/+v4//+a2/3/mdv9/5nb/f+Z2/3/rOH9////
+ /////////////+Th4P9rW1T/bFtVVwAAAABtXlfnopeT/////////////Pv+/1s95P92Xej/fGTp/3xk
+ 6f9hReX/v7P0/5vb/f8KqPn/M7b6/zO2+v8qs/r/AKT5//r9//////////////7+/v9yY1z8a1tUkQAA
+ AABqW1OofXBp+///////////+/r+/1s95P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr/////////
+ ///R7/7/AKT5//n9//////////////////+ViYT+bl5WzwAAAABsW1Rta1tU//Hw7///////+/r+/1s9
+ 5P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr////////////R7/7/AKT5//n9//////////////Dv
+ 7v+CdW/9bV1V7QAAAABsXVM0a1tU/9DLyf//////+/r+/1s95P/GvPb/3tj6/97Y+v91W+j/vbH0/5nb
+ /f8osvr/zO3+/8zt/v+n4P3/AKT5//n9////////6+no/35wavxsXVX1altURgAAAACAQEAEbV1W9q6m
+ ov//////+/r+/1s95P9bPeT/Wz3k/1s95P9bPeT/ysH2/5nb/f8ApPn/AKT5/wCk+f8ApPn/EKr5//z+
+ ///g3dv/dmdh/G1dVuptWFMxAAAAAAAAAAAAAAAAbFxVv4x/ev3/////////////////////////////
+ /////////////////////////////////////////////9jT0f9xYVv8bV5W32pcVSQAAAAAAAAAAAAA
+ AAAAAAAAa1tUg21dVv2mnJj/0s3L//r5+f//////////////////////////////////////////////
+ ////////yMK//21dVv5tXFbKZllZFAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2pbVKNsXFXwa1tU/3Bg
+ Wv2Zjor+xsC9//Px8f////////////////////////////////+5sq//bFxV/2xcVbV0XV0LAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDallVPGtcVIhtXVbba1tU/2tbVP6Ie3X9ta2p/+He
+ 3f///////v7+/66mov9rW1T/bFpUoWZmZgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVLWtcVHpsXVXLa1tU/mtbVP9/cWv7j4N+/2tbVP9rWlSFAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAZlxSGWxaVWZsXFW1bFxV8GtbU2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8H
+ /0H8AP9B+AAPQfAAA0HgAANBwAADQYAAAUEAAAFBAAABQQAAAUEAAAFBAAAAQQAAAEGAAABBgAAAQYAA
+ AEGAAABBgAABQcAAA0HAAAdBwAAPQfAAH0H/AD9B/+D/QSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhW3tvYFn0dWZgsmxbVVdmVVUPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAnFiW5eCdG705OHg/8a/vf+UiYT0cWFa+Xdo
+ YcptXFVsb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAbUlJB3NkXbKMgHr09/b2//////////////////r5
+ +f/Szcv/oJeS9XNlXfZzZV7baVxVJwAAAAAAAAAAbVtbDnNjXciZj4n1+/r6////////////////////
+ ///////////////////+/v7/pJqW+WxdVnYAAAAAamBVGHJkXdmnnpn2/f37/9S8E//axTP/2MIo/+XX
+ cP/eqa3/zX2D/9CEif/IcHf//v39/83Ixf92Z2C8AAAAAHJjXOC5sK36//////7++//bxjb///////Xw
+ yv/k1Gf/3KOn//Pf4P//////0IaL//79/f/w7u7/cWFb8gAAAAF0Zl/i4+Df///////+/vv/2cMr//bx
+ zP/u5aL/5NRn/9yjp//px8n/8+Di/85/hf/+/f3//////3hpYvNuWlMldGReo8K7uf////////79/+PU
+ Zv/j1Gb/49Rm//Dorv/qyMv/3KOn/9yjp//eqKz///7+//////+ajoryalxUXmpaVWCbkYzz//////7+
+ //+ikfD/nYvv/52L7//Lwfb/ruL9/2bI+/9myPv/b8z8//7/////////wbq3/3RlXqJuWlMleGli8///
+ ///8/P//d17p/97Y+v/DuPX/nYvv/2fJ+/+i3v3/zO3+/yuz+v/7/v///////+Pg3/90Zl/iAAAAAXFh
+ W/Lw7u7//Pz//35m6v//////3df5/52L7/9nyfv/yuz+//////82t/r/+/7///////+5sK36cmNc4AAA
+ AAB2Z2G+zsnH//z8//9iReX/fGTp/3Vb6P+jkvD/Z8n7/yiy+v8ztvr/E6v5//v9/v+to5/4c2Nd3m1b
+ UhwAAAAAbF1WdqSalvn+/v7///////////////////////////////////////v6+v+Zj4r2c2ReyW1b
+ Ww4AAAAAAAAAAGlcVSdzZV7bc2Vd9qCXkvXSzcv/+vn5//////////////////f29v+MgHr0c2Rdsm1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAG9eVR5rW1NrdGRexnBhWfiShoHvxr+9/uTh4P+CdG70c2RdmYCA
+ gAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmVVUPbFtVV3VmYLJvYFn0cmFbewAA
+ AAAAAAAAAAAAAAAAAAAAAAAA+D+sQeAHrEHAAaxBgAGsQQABrEEAAKxBAACsQQAArEEAAKxBAACsQQAA
+ rEGAAKxBgAGsQYADrEHgB6xB/B+sQQ==
+
+
+
+ 716, 17
+
+
+
+ AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
+ IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxc
+ VU5rW1Tna1tU22paU5BsXVVCgEBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAaltTZWtbVPxrW1T/a1tU/2tbVP9rW1T/a1tU7mtbU6VrXFNWbVtbDgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABqWlR/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU+Wta
+ VLprW1Nrb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2tbVJhrW1T/a1tU/2tbVP+NgXz/2NPR/6+mov+Bc23/a1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVc1sXFSAa1xSMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtSUkHa1xUqmtbVP9rW1T/a1tU/5iNiP/6+fn/////////
+ ////////6+no/7+4tf+Sh4L/bV5X/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVOFrXFOZallTTW1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlaWhFqW1TCa1tU/2tbVP9rW1T/o5mV//38
+ /P//////////////////////////////////////9PPy/8jDwP+cko3/c2Nd/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/a1tU/2tbVPVrW1SzalxUXmlaWhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalhYHWtbVNRrW1T/a1tU/2tb
+ VP+1rar/////////////////////////////////////////////////////////////////+vn5/9LN
+ y/+lm5f/eGpj/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVPtrWlS9bFxVb2xdVSEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrWVMra1tU42tb
+ VP9rW1T/bV1W/8S9u///////////////////////////////////////////////////////////////
+ /////////////////////////v7+/97a2f+xqKT/g3Zw/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tb
+ VP5qW1V4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpZ
+ VTxrW1Tua1tU/2tbVP9wYVr/0czK////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////+ro5/+8tbL/j4N+/21d
+ Vv9rW1T/a1tU/2tbVP9rW1TpAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAbFxTUGtbVPZrW1T/a1tU/3VnYP/d2df/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////Tz8v/Iw8D/dmdh/2tbVP9rW1T/blpTJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU+2tbVP9rW1T/emxl/+Th4P//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////m5CL/2tbVP9rW1T/a1tTXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtaVHdrW1T/a1tU/2tbVP+DdnD/7uzs/////////////Pvw//z6
+ 7v/8+u7//Pru//z67v/8+u7//Pru//z67v/9/PT///////////////////////z4+f/79fX/+/X1//v1
+ 9f/79fX/+/X1//v19f/79fX//Pb2////////////////////////////vLWy/2tbVP9rW1T/a1xTmQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDa1tUmGtbVP9rW1T/a1tU/4t/ev/08/L/////////
+ ///cyT7/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/6Nt+////////////4bG1/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/9KKkP//////////////////////3tvZ/2tb
+ VP9rW1T/a1tU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Sra1tU/2tbVP9rW1T/mY6J//r5
+ +f////////////389f/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28Y1////
+ ////////0IWL/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/9+fn/////////
+ /////////Pz8/3BhWv9rW1T/a1tU/nFVVRIAAAAAAAAAAAAAAAAAAAAAaVpaEWtcVMNrW1T/a1tU/2tb
+ VP+kmpb//fz8//////////////////389P/RtwD/0bcA/+TVbP/w56r/8Oeq//Dnqv/w56r/8Oeq/93K
+ Qv/RtwD/28Y1////////////0IWL/8RlbP/TjZL/68zO/+vMzv/rzM7/68zO/+vMzv/dpqr/xGVs/8Rl
+ bP/8+Pn//////////////////////46CfP9rW1T/a1tU/2xbVEkAAAAAAAAAAAAAAABsWFgaa1xU0Wtb
+ VP9rW1T/a1tU/7CopP////////////////////////////389P/RtwD/0bcA/+7lov//////////////
+ /////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////////////////////
+ ///px8n/xGVs/8RlbP/8+Pn//////////////////////7CopP9rW1T/a1tU/2tbVIMAAAAAAAAAAAAA
+ AABqXFTOa1tU/2tbVP9tXlf/xr+9//////////////////////////////////389P/RtwD/0bcA/+7l
+ ov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////
+ ///////////////////px8n/xGVs/8RlbP/8+Pn//////////////////////9LNy/9rW1T/a1tU/2tb
+ VL8AAAAAAAAAAAAAAABrW1Tva1tU/2tbVP/KxML///////////////////////////////////////38
+ 9P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8Rl
+ bP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn///////////////////////Py
+ 8v9sXFX/a1tU/2tbVPRmZmYFAAAAAAAAAABrW1W4a1tU/2tbVP/Oycf/////////////////////////
+ //////////////389P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////
+ ////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn/////////
+ //////////////////+CdG7/a1tU/2tbVP9sXVM0AAAAAAAAAABqWlR/a1tU/2tbVP+tpKD/////////
+ //////////////////////////////389P/RtwD/0bcA/+7lov///////////////////////////+PT
+ Y//RtwD/28Y1////////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8Rl
+ bP/8+Pn///////////////////////////+jmZX/a1tU/2tbVP9rWlNuAAAAAAAAAABtWlNEa1tU/2tb
+ VP+Lfnn///////////////////////////////////////389P/RtwD/0bcA/93JQf/j1Gb/49Rm/+PU
+ Zv/j1Gb/49Rm/9jCJ//RtwD/28Y1////////////0IWL/8RlbP/NfYL/3KOn/9yjp//co6f/3KOn/9yj
+ p//TjJH/xGVs/8RlbP/8+Pn////////////////////////////Fv7z/a1tU/2tbVP9qW1OoAAAAAAAA
+ AABqVVUMa1tU+2tbVP9uXlf/+fn4//////////////////////////////////389P/RtwD/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28c5////////////0IWL/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8Rmbf/9+vr////////////////////////////n5eT/a1tU/2tb
+ VP9rW1TkAAAAAAAAAAAAAAAAa1tUz2tbVP9rW1T/3NjW//////////////////////////////////38
+ 9v/axTP/2sUz/9rFM//axTP/2sUz/9rFM//axTP/2sUz/9rFM//bxzj/8Ois////////////2p2i/9CE
+ if/QhIn/0ISJ/9CEif/QhIn/0ISJ/9CEif/QhIn/0ISJ/+GwtP//////////////////////////////
+ ///+/v7/dWdg/2tbVP9rW1T/alhYHQAAAAAAAAAAa1tUlGtbVP9rW1T/ubKv////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////l4uG/2tbVP9rW1T/a1pUWAAAAAAAAAAAbFtVWmtbVP9rW1T/mI2I////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////uLGt/2tbVP9rW1T/a1tUkgAAAAAAAAAAa1pSH2tb
+ VP9rW1T/dmdh//7+/v////////////////////////////////+rnPH/fGTp/3xk6f98ZOn/fGTp/3xk
+ 6f98ZOn/fGTp/3xk6f9/aOr/ysD2////////////rOH9/zi4+v8ztvr/M7b6/zO2+v8ztvr/M7b6/zO2
+ +v8ztvr/M7b6/33R/P//////////////////////////////////////2tbV/2tbVP9rW1T/a1tVzQAA
+ AAAAAAAAAAAAAGtbVONrW1T/a1tU/+jm5f////////////////////////////r5/v9cPuT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/gGjq////////////Obj6/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/AKT5/wGk+f/3/P//////////////////////////////////+vn5/25f
+ WP9rW1T/a1tU/GpVVQwAAAAAAAAAAGtcVKprW1T/a1tU/8bAvf////////////////////////////j3
+ /v9bPeT/Wz3k/4Vu6/+di+//nYvv/52L7/+di+//nYvv/3Rb6P9bPeT/fWXq////////////Nbf6/wCk
+ +f8nsvr/Zsj7/2bI+/9myPv/Zsj7/2bI+/9Bu/v/AKT5/wCk+f/0+///////////////////////////
+ /////////////4p9eP9rW1T/a1tU/2xdVUIAAAAAAAAAAGtbVHBrW1T/a1tU/6Sblv//////////////
+ //////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////
+ ////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////
+ /////////////////////////////6yjn/9rW1T/a1tU/2pcVH0AAAAAAAAAAGxdUzRrW1T/a1tU/4J0
+ bv////////////////////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI
+ 7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk
+ +f/0+////////////////////////////////////////87Jx/9rW1T/a1tU/2tbVbgAAAAAAAAAAGZm
+ ZgVrW1T0a1tU/2xcVf/z8vL///////////////////////j3/v9bPeT/Wz3k/8O49f//////////////
+ /////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////////////////////
+ //+i3v3/AKT5/wCk+f/0+////////////////////////////////////////8rEwv9rW1T/a1tU/2tb
+ VO8AAAAAAAAAAAAAAABrW1S/a1tU/2tbVP/Szcv///////////////////////j3/v9bPeT/Wz3k/8O4
+ 9f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////
+ //////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////////////xr+9/21e
+ V/9rW1T/a1tU/2pcVM4AAAAAAAAAAAAAAABrWlSFa1tU/2tbVP+xqaX///////////////////////j3
+ /v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk
+ +f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////
+ //+6sq//bFxV/2tbVP9rW1T/a1tT1m9eVR4AAAAAAAAAAAAAAABpXFVLa1tU/2tbVP+Pg37/////////
+ //////////////j3/v9bPeT/Wz3k/6CP7//Ivvb/yL72/8i+9v/Ivvb/yL72/4Vv6/9bPeT/fWXq////
+ ////////Nbf6/wCk+f9CvPv/quH9/6rh/f+q4f3/quH9/6rh/f9sy/z/AKT5/wCk+f/0+///////////
+ /////////f39/6ifmv9rW1T/a1tU/2tbVP9rW1TIZllZFAAAAAAAAAAAAAAAAAAAAABpWloRa1tU/Wtb
+ VP9wYVr//Pv7//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/fWXq////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f/1+//////////////7+vr/nZKO/2tbVP9rW1T/a1tU/2tcVbJmZk0KAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tT1mtbVP9rW1T/4Nzb//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/rJ3x////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/z66+v////////////b19P+Pg37/a1tU/2tbVP9rW1T/a1tTn4BAQAQAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa1pUm2tbVP9rW1T/vbaz//////////////////7+///08v3/9PL9//Ty
+ /f/08v3/9PL9//Ty/f/08v3/9PL9//Ty/f/49/7/////////////////8vr//+75///u+f//7vn//+75
+ ///u+f//7vn//+75///u+f//8Pr/////////////8O/u/4Z5dP9rW1T/a1tU/2tbVP9rXFSIAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbFxUYWtbVP9rW1T/nJGM////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////n5eT/fG5o/2tbVP9rW1T/a1tU/Gta
+ VWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAblpTJWtbVP9rW1T/dmdh/8jD
+ wP/08/L/////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////93Z1/91Z2D/a1tU/2tb
+ VP9rW1T2bFxTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWtb
+ VOlrW1T/a1tU/2tbVP9tXVb/j4N+/7y1sv/q6Of/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////0czK/3Bh
+ Wv9rW1T/a1tU/2tbVO5qWVU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGpbVXhrW1T+a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/g3Zw/7GopP/e2tn//v7+////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///Evbv/bV1W/2tbVP9rW1T/a1tU42tZUysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsXVUhbFxVb2taVL1rW1T7a1tU/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/eGpj/6Wbl//Szcv/+vn5////////////////////////////////////////////////////
+ /////////////7Wtqv9rW1T/a1tU/2tbVP9rW1TUalhYHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpWloRbFpUVWtb
+ U6JrW1Twa1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/cGFa/5KHgv+/uLX/8O/u////////////////////
+ ///////////////////9/f3/p56a/2tbVP9rW1T/a1tU/2pbVcdmWVkUAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABVVVUDallVPGtbVJFrW1Pia1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/bFxV/4l8
+ dv+1ran/4d7d//////////////////v6+v+cko3/a1tU/2tbVP9rW1T/a1tUsXFVVQkAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa1xSMmxcVIBrW1XNa1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/4Fzbf+vpqL/2NPR/42BfP9rW1T/a1tU/2tbVP9rW1SYVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAb15VHmtbU2trWlS6a1tU+WtbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2pa
+ VH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbVtbDmtcU1ZrW1Ola1tU7mtbVP9rW1T/a1tU/2tb
+ VP9rW1T8altTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBABGxd
+ VUJqWlOQa1tU22tbVOdsXFVOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4H///+sEP//AD///6wQ//4AB///rBD/+AAA//+sEP/w
+ AAAP/6wQ/+AAAAH/rBD/wAAAAD+sEP+AAAAAH6wQ/wAAAAAPrBD+AAAAAA+sEPwAAAAAD6wQ+AAAAAAP
+ rBDgAAAAAA+sEMAAAAAAB6wQgAAAAAAHrBAAAAAAAAesEAAAAAAAB6wQAAAAAAADrBAAAAAAAAOsEAAA
+ AAAAA6wQAAAAAAADrBAAAAAAAAOsEIAAAAAAAawQgAAAAAABrBCAAAAAAAGsEIAAAAAAAawQwAAAAAAA
+ rBDAAAAAAACsEMAAAAAAAKwQwAAAAAAArBDAAAAAAACsEOAAAAAAAKwQ4AAAAAAArBDgAAAAAAGsEOAA
+ AAAAA6wQ8AAAAAAHrBDwAAAAAA+sEPAAAAAAP6wQ8AAAAAB/rBDwAAAAAP+sEPgAAAAB/6wQ/AAAAAP/
+ rBD/gAAAB/+sEP/wAAAP/6wQ//8AAB//rBD//+AAf/+sEP///AD//6wQ////gf//rBAoAAAAIAAAAEAA
+ AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU7GtbVcFqW1RzalxVJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVe2tbVP5rW1T/a1tU/2tbVP9rW1T/a1tT1mtcVIhrWVU5gICAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2xbVJVrW1T/bV5X/8K7uf/RzMr/pJqW/3hpY/9rW1T/a1tU/2tb
+ VP9rW1TpalxTnGxcVU5mZk0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Spa1tU/29fWf/Oycf//////////////////v7+/+He
+ 3f+1ran/iXx2/2tbVP9rW1T/a1tU/2tbVPZqW1W7bFxVb2xYWBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYFAQbFxUwGtbVP91ZmD+3trZ////////////////////
+ ////////////////////////6efm/7y0sf+Ogn3/bV1W/2tbVP9rW1T/a1tU/WtbVMZrWlR3ZlVVDwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2tbVNJrW1T/fW9p/+fl5P//////////////
+ ///////////////////////////////////////////////////z8vL/x8G//5uQi/9xYlv/a1tU/2tb
+ VP9rW1SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpdVylrW1Tha1tU/4V4cv/w7u7/////////
+ //////////////////////////////////////////////////////////////////////////////r6
+ +v/Evbv/a1tU/2xbVMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrXVM3a1tU62tbVP+MgHr/9PPy////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////v6+v9vX1n/a1tU+2pVVQwAAAAAAAAAAAAAAAAAAAAAallTTWtbVPVrW1T/mY6K//r5
+ +f///v3/1r8d/9G3AP/RtwD/0bcA/9G3AP/RtwD/07oL//r34//57u//x2xy/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/y3d9///+/v///////////4yAev9rW1T/alpSQQAAAAAAAAAAAAAAAGpaVWBrW1T7a1tU/6mg
+ nP/+/v7///////799//RtwD/2cMr/+PUZv/j1Gb/49Rm/9zIPP/RtwD/9vHM//Pg4v/EZWz/0omP/9yj
+ p//co6f/3KOn/85/hf/EZWz//fr6////////////rqai/2tbVP9sW1V7AAAAAAAAAABrW1R5a1tU/2xc
+ Vf+4sa3//////////////////v33/9G3AP/k1Wz/////////////////7OGW/9G3AP/28cz/8+Di/8Rl
+ bP/nwML/////////////////3aaq/8RlbP/9+vr////////////RzMn/a1tU/2pbVLYAAAAAAAAAAGtb
+ VO5rW1T/w726///////////////////////+/ff/0bcA/+TVbP/////////////////s4Zb/0bcA//bx
+ zP/z4OL/xGVs/+fAwv/////////////////dpqr/xGVs//36+v////////////Lw8P9rW1T/a1tU74CA
+ gAIAAAAAa1tUxWtbVP/Z1dP///////////////////////799//RtwD/5NVs/////////////////+zh
+ lv/RtwD/9vHM//Pg4v/EZWz/58DC/////////////////92mqv/EZWz//fr6/////////////////4By
+ bP9rW1T/aF1RLAAAAABqXFSLa1tU/7iwrf///////////////////////v33/9G3AP/dyUH/7eKZ/+3i
+ mf/t4pn/4dBa/9G3AP/28cz/8+Di/8RlbP/Zm6D/58HE/+fBxP/nwcT/04yR/8RlbP/9+vr/////////
+ ////////opeT/2tbVP9qW1NlAAAAAGtbVVFrW1T/louG///////////////////////+/ff/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcB//n12//z4OL/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/x2xy//79
+ /f/////////////////Dvbr/a1tU/2tbU58AAAAAaF1RFmtbVP90ZV///v7+///////////////////+
+ /f/28cz/9vHM//bxzP/28cz/9vHM//bxzP/49dr///////35+f/z4OL/8+Di//Pg4v/z4OL/8+Di//Pg
+ 4v/47e7//////////////////////+Xi4f9rW1T/altU2gAAAAAAAAAAa1xT3GtbVP/m4+L/////////
+ /////////////+zp/P/e2Pr/3tj6/97Y+v/e2Pr/3tj6/+fj+////////////9ry/v/M7f7/zO3+/8zt
+ /v/M7f7/zO3+/+L1/v///////////////////////v7+/3VmX/9rW1T+aF1RFgAAAABsWlSha1tU/8S+
+ u//////////////////8/P//YkXl/1s95P9bPeT/Wz3k/1s95P9bPeT/XD7k/+jk+//b8v7/AaT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/C6j5//v+////////////////////////lYmE/2tbVP9rWlRPAAAAAGpc
+ VGdrW1T/o5mU//////////////////r5/v9bPeT/hW7r/72x9P+9sfT/vbH0/5WB7v9bPeT/3tj6/8zt
+ /v8ApPn/WsT7/5nb/f+Z2/3/mdv9/0G7+/8ApPn/9/z///////////////////////+2r6v/a1tU/2pb
+ VIkAAAAAaF1RLGtbVP+Acmz/////////////////+vn+/1s95P+gj+//////////////////u6/0/1s9
+ 5P/e2Pr/zO3+/wCk+f+W2v3/////////////////bMv8/wCk+f/3/P///////////////////////9nV
+ 0/9rW1T/a1tUxQAAAACAgIACa1tU72tbVP/y8PD////////////6+f7/Wz3k/6CP7///////////////
+ //+7r/T/Wz3k/97Y+v/M7f7/AKT5/5ba/f////////////////9sy/z/AKT5//f8////////////////
+ ////////w726/2tbVP9rW1TuAAAAAAAAAABqW1S2a1tU/9HMyf////////////r5/v9bPeT/oI/v////
+ /////////////7uv9P9bPeT/3tj6/8zt/v8ApPn/ltr9/////////////////2zL/P8ApPn/9/z/////
+ /////////////7ixrf9sXFX/a1tU/2tbVHkAAAAAAAAAAGpcVH1rW1T/r6ej////////////+vn+/1s9
+ 5P93Xun/nYvv/52L7/+di+//gmvq/1s95P/e2Pr/zO3+/wCk+f88ufr/Zsj7/2bI+/9myPv/K7P6/wCk
+ +f/3/P////////7+/v+upaH/a1tU/2tbVPxqXFRnAAAAAAAAAAAAAAAAa1tUQ2tbVP+NgXz/////////
+ ///6+f7/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/YkXl/+3q/P/M7f7/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/Ha76//3+///7+vr/nZOO/2tbVP9rWlT4altVVAAAAAAAAAAAAAAAAAAAAAB0XV0La1tU+29f
+ Wf/7+vr/////////////////////////////////////////////////////////////////////////
+ ////////////////////////9vX0/5CEfv9rW1T/bFxU72pZVTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABsW1TMa1tU/8S9u//6+vr/////////////////////////////////////////////////////////
+ //////////////////////////////Du7v+FeHL/a1tU/2tbVOFqXVcpAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtbVI9rW1T/a1tU/3FiW/+bkIv/x8G///Py8v//////////////////////////////
+ ///////////////////////////////////n5eT/fW9p/2tbVP9rW1TSaF5VGwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAZlVVD2taVHdrW1TGa1tU/WtbVP9rW1T/bV1W/46Cff+8tLH/6efm////
+ ////////////////////////////////////////3trZ/3ZnYf9rW1T/bFxUwHBgUBAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmWVkUalxUXmtcVKprW1Tya1tU/2tb
+ VP9rW1T/f3Fr/6uinv/Y09H//fz8/////////////////9LNy/9xYVv/a1tU/2paVa9xVVUJAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZm
+ TQpsXFVOalxTnGtbVOlrW1T/a1tU/2tbVP94aWP/pJqW/9HMyv/Cu7n/bV5X/2tbVP9sW1SVVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAgICAAmtZVTlrXFSIa1tT1mtbVP9rW1T/a1tU/2tbVP9rW1T+bFtVewAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalxVJGpbVHNrW1XBa1tU7Gxc
+ VGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g////wA///wAB//4A
+ AD/8AAAH+AAAB/AAAAfgAAADwAAAA4AAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAGAAAAAgAAAAIAA
+ AACAAAAAgAAAAMAAAADAAAABwAAAA8AAAAfgAAAP4AAAH+AAAD/8AAB//4AA///wA////wf/KAAAABgA
+ AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tTa2xcVfBsXFW1bFpVZmZcUhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrWlSFa1tU/4+Dfv+AcWv8a1tU/2tb
+ VP5tXlbMa1xUemxbVS0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAVVVVA2xbVJprW1T/qqCc//7+/v//////6+no/7+4tf+RhoH9bF1W/mtbVP9tXlbia1xTmWpZ
+ U02AVVUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0XV0LbFxVtWxcVf+5sq//////////
+ ////////////////////////8/Hx/8bAvf+Zjor/cGBa/WtbVP9tXVbxaltUo2heVRsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGZZWRRtXFbKbV1W/sjCv///////////////////////////////////////////////
+ ////////+vn5/9LNy/+mnJj/bV1W/WtbVIMAAAAAAAAAAAAAAAAAAAAAaFhYIG1eV9pvYFn808/N////
+ ////////////////////////////////////////////////////////////////////////in55/W1d
+ Vr4AAAAAAAAAAAAAAABoXVEsbV5X53NlXvzd2tj//v78/9S8EP/RtwD/0bcA/9G3AP/RtwD/8Oit/+zN
+ 0P/EZWz/xGVs/8RlbP/EZWz/yG91//79/f//////raSg/2xcVfaAQEAEAAAAAGxcVEBtXVbzfG5n++jm
+ 5f///////v35/9G3AP/v5qf/9vHM//bxzP/Ywij/7eKZ/+fBxP/NfYP/8+Di//Pg4v/rysz/xGVs//77
+ /P//////z8rH/2tbVP9rXFIyAAAAAG1dVe2CdW/98O/u/////////////v35/9G3AP/38tH/////////
+ ///axTL/7eKZ/+fBxP/Qg4n////////////04+T/xGVs//77/P//////8fDv/2tbVP9sW1RtAAAAAG5e
+ Vs+ViYT+/////////////////v35/9G3AP/38tH////////////axTL/7eKZ/+fBxP/Qg4n/////////
+ ///04+T/xGVs//77/P///////////31waftqW1OoAAAAAGxaU5NyY138/v7+/////////////v35/9G3
+ AP/Zwyr/2sUz/9rFM//Tugr/7eOb/+fBxP/Ga3L/0ISJ/9CEif/OfoT/xGVs//78/P///////////6CW
+ kv9tXlflAAAAAGpcU1lrW1T/5ePh//////////////79/+3imf/t4pn/7eKZ/+3imf/t4pr/+/nr//bm
+ 5//nwcT/58HE/+fBxP/nwcT/7M3P/////////////////8K7uf9rW1T/alhYHW9eVR5rW1T/w726////
+ /////////////8rA9v+9sfT/vbH0/72x9P++svT/8vD9/+v4//+a2/3/mdv9/5nb/f+Z2/3/rOH9////
+ /////////////+Th4P9rW1T/bFtVVwAAAABtXlfnopeT/////////////Pv+/1s95P92Xej/fGTp/3xk
+ 6f9hReX/v7P0/5vb/f8KqPn/M7b6/zO2+v8qs/r/AKT5//r9//////////////7+/v9yY1z8a1tUkQAA
+ AABqW1OofXBp+///////////+/r+/1s95P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr/////////
+ ///R7/7/AKT5//n9//////////////////+ViYT+bl5WzwAAAABsW1Rta1tU//Hw7///////+/r+/1s9
+ 5P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr////////////R7/7/AKT5//n9//////////////Dv
+ 7v+CdW/9bV1V7QAAAABsXVM0a1tU/9DLyf//////+/r+/1s95P/GvPb/3tj6/97Y+v91W+j/vbH0/5nb
+ /f8osvr/zO3+/8zt/v+n4P3/AKT5//n9////////6+no/35wavxsXVX1altURgAAAACAQEAEbV1W9q6m
+ ov//////+/r+/1s95P9bPeT/Wz3k/1s95P9bPeT/ysH2/5nb/f8ApPn/AKT5/wCk+f8ApPn/EKr5//z+
+ ///g3dv/dmdh/G1dVuptWFMxAAAAAAAAAAAAAAAAbFxVv4x/ev3/////////////////////////////
+ /////////////////////////////////////////////9jT0f9xYVv8bV5W32pcVSQAAAAAAAAAAAAA
+ AAAAAAAAa1tUg21dVv2mnJj/0s3L//r5+f//////////////////////////////////////////////
+ ////////yMK//21dVv5tXFbKZllZFAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2pbVKNsXFXwa1tU/3Bg
+ Wv2Zjor+xsC9//Px8f////////////////////////////////+5sq//bFxV/2xcVbV0XV0LAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDallVPGtcVIhtXVbba1tU/2tbVP6Ie3X9ta2p/+He
+ 3f///////v7+/66mov9rW1T/bFpUoWZmZgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVLWtcVHpsXVXLa1tU/mtbVP9/cWv7j4N+/2tbVP9rWlSFAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAZlxSGWxaVWZsXFW1bFxV8GtbU2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8H
+ /0H8AP9B+AAPQfAAA0HgAANBwAADQYAAAUEAAAFBAAABQQAAAUEAAAFBAAAAQQAAAEGAAABBgAAAQYAA
+ AEGAAABBgAABQcAAA0HAAAdBwAAPQfAAH0H/AD9B/+D/QSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhW3tvYFn0dWZgsmxbVVdmVVUPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAnFiW5eCdG705OHg/8a/vf+UiYT0cWFa+Xdo
+ YcptXFVsb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAbUlJB3NkXbKMgHr09/b2//////////////////r5
+ +f/Szcv/oJeS9XNlXfZzZV7baVxVJwAAAAAAAAAAbVtbDnNjXciZj4n1+/r6////////////////////
+ ///////////////////+/v7/pJqW+WxdVnYAAAAAamBVGHJkXdmnnpn2/f37/9S8E//axTP/2MIo/+XX
+ cP/eqa3/zX2D/9CEif/IcHf//v39/83Ixf92Z2C8AAAAAHJjXOC5sK36//////7++//bxjb///////Xw
+ yv/k1Gf/3KOn//Pf4P//////0IaL//79/f/w7u7/cWFb8gAAAAF0Zl/i4+Df///////+/vv/2cMr//bx
+ zP/u5aL/5NRn/9yjp//px8n/8+Di/85/hf/+/f3//////3hpYvNuWlMldGReo8K7uf////////79/+PU
+ Zv/j1Gb/49Rm//Dorv/qyMv/3KOn/9yjp//eqKz///7+//////+ajoryalxUXmpaVWCbkYzz//////7+
+ //+ikfD/nYvv/52L7//Lwfb/ruL9/2bI+/9myPv/b8z8//7/////////wbq3/3RlXqJuWlMleGli8///
+ ///8/P//d17p/97Y+v/DuPX/nYvv/2fJ+/+i3v3/zO3+/yuz+v/7/v///////+Pg3/90Zl/iAAAAAXFh
+ W/Lw7u7//Pz//35m6v//////3df5/52L7/9nyfv/yuz+//////82t/r/+/7///////+5sK36cmNc4AAA
+ AAB2Z2G+zsnH//z8//9iReX/fGTp/3Vb6P+jkvD/Z8n7/yiy+v8ztvr/E6v5//v9/v+to5/4c2Nd3m1b
+ UhwAAAAAbF1WdqSalvn+/v7///////////////////////////////////////v6+v+Zj4r2c2ReyW1b
+ Ww4AAAAAAAAAAGlcVSdzZV7bc2Vd9qCXkvXSzcv/+vn5//////////////////f29v+MgHr0c2Rdsm1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAG9eVR5rW1NrdGRexnBhWfiShoHvxr+9/uTh4P+CdG70c2RdmYCA
+ gAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmVVUPbFtVV3VmYLJvYFn0cmFbewAA
+ AAAAAAAAAAAAAAAAAAAAAAAA+D+sQeAHrEHAAaxBgAGsQQABrEEAAKxBAACsQQAArEEAAKxBAACsQQAA
+ rEGAAKxBgAGsQYADrEHgB6xB/B+sQQ==
+
+
+
\ No newline at end of file
diff --git a/Models/LauncherSession.cs b/Models/LauncherSession.cs
new file mode 100644
index 0000000..784b2d8
--- /dev/null
+++ b/Models/LauncherSession.cs
@@ -0,0 +1,42 @@
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace FizzyLauncher.Models
+{
+ public class LauncherSession
+ {
+ public class HotKeyOptions
+ {
+ public bool IsCtrl { get; set; } = false;
+ public bool IsAlt { get; set; } = false;
+ public bool IsShift { get; set; } = false;
+ public int Key { get; set; } = (int)System.Windows.Forms.Keys.None;
+
+ public int ModifierCode => ((this.IsAlt ? 1 : 0) + (this.IsCtrl ? 2 : 0) + (this.IsShift ? 4 : 0));
+
+ public System.Windows.Forms.Keys KeyCode => (System.Windows.Forms.Keys)this.Key;
+ }
+
+ public enum AutoSaveOption
+ {
+ Prompt = 0,
+ Yes,
+ No
+ }
+
+ public int DefaultHeight { get; set; } = 280;
+ public HotKeyOptions HotKey { get; set; } = null;
+
+ public bool AlwaysOnTop { get; set; } = false;
+ public bool EnableAnimation { get; set; } = false;
+ public bool EnableBigIconInFolder { get; set; } = false;
+
+ public bool HideOnClose { get; set; } = false;
+ public bool HideOnClick { get; set; } = false;
+ public AutoSaveOption AutoSave { get; set; } = AutoSaveOption.Prompt;
+ public List Groups { get; set; } = new List();
+
+ public Point StartPosition { get; set; } = Point.Empty;
+
+ }
+}
\ No newline at end of file
diff --git a/Models/TileGroupModel.cs b/Models/TileGroupModel.cs
new file mode 100644
index 0000000..cdf04a6
--- /dev/null
+++ b/Models/TileGroupModel.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace FizzyLauncher.Models
+{
+ public class TileGroupModel
+ {
+ public string Title { get; set; }
+ public bool IsExpanded { get; set; } = false;
+ public bool IsExclusive { get; set; } = false;
+ public List Items { get; set; } = new List();
+ public Size GridSize { get; set; } = new Size(0, 0);
+ }
+}
\ No newline at end of file
diff --git a/Models/TileModel.cs b/Models/TileModel.cs
new file mode 100644
index 0000000..72f8411
--- /dev/null
+++ b/Models/TileModel.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace FizzyLauncher.Models
+{
+ public class TileModel
+ {
+ public string Title { get; set; }
+ public string ProcessFilename { get; set; }
+ public string ProcessArgument { get; set; }
+ public string ProcessWorkingDirectory { get; set; }
+ public ProcessWindowStyle ProcessWindowStyle { get; set; } = ProcessWindowStyle.Normal;
+ public bool ProcessAsAdmin { get; set; } = false;
+ public Point Position { get; set; }
+
+ public bool IsGroup { get; set; } = false;
+ public List Items { get; set; } = new List();
+
+ public override string ToString() => this.Title ?? string.Empty;
+
+ public string CleanProcessFilename => (string.IsNullOrWhiteSpace(this.ProcessFilename) ? string.Empty : resolvePath(this.ProcessFilename));
+
+ public string CleanProcessArgument => (string.IsNullOrWhiteSpace(this.ProcessArgument) ? string.Empty : resolvePath(this.ProcessArgument));
+
+ public string CleanProcessWorkingDirectory => (string.IsNullOrWhiteSpace(this.ProcessWorkingDirectory) ? string.Empty : resolvePath(this.ProcessWorkingDirectory));
+
+ protected string resolvePath(string value)
+ {
+ string rv = Environment.ExpandEnvironmentVariables(value);
+
+ rv = resolveFirstPath(rv);
+ rv = resolveLastPath(rv);
+
+ return rv;
+ }
+
+ protected string resolveFirstPath(string value)
+ {
+ const string last = "%FIRST%";
+ if (!value.Contains(last))
+ {
+ return value;
+ }
+
+ string head = value.Substring(0, value.IndexOf(last));
+ string tail = value.Substring(value.IndexOf(last) + last.Length);
+
+ string[] dirList = new string[0];
+
+ try
+ {
+ dirList = System.IO.Directory.GetDirectories(head, "*", System.IO.SearchOption.TopDirectoryOnly);
+ }
+ catch
+ {
+ // do nothing
+ }
+
+ if (dirList.Length <= 0)
+ {
+ return value;
+ }
+
+ return dirList[0] + tail;
+ }
+
+ protected string resolveLastPath(string value)
+ {
+ const string last = "%LAST%";
+ if (!value.Contains(last))
+ {
+ return value;
+ }
+
+ string head = value.Substring(0, value.IndexOf(last));
+ string tail = value.Substring(value.IndexOf(last) + last.Length);
+
+ string[] dirList = new string[0];
+
+ try
+ {
+ dirList = System.IO.Directory.GetDirectories(head, "*", System.IO.SearchOption.TopDirectoryOnly);
+ }
+ catch
+ {
+ // do nothing
+ }
+
+ if (dirList.Length <= 0)
+ {
+ return value;
+ }
+
+ return dirList[(dirList.Length - 1)] + tail;
+ }
+
+ }
+}
diff --git a/OptionsForm.cs b/OptionsForm.cs
new file mode 100644
index 0000000..29aff71
--- /dev/null
+++ b/OptionsForm.cs
@@ -0,0 +1,279 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.ThemedForms;
+using System;
+
+namespace FizzyLauncher
+{
+ public class OptionsForm : TDialogForm
+ {
+ private System.Windows.Forms.Label label1;
+ private TButton button1;
+ private TYesNoPickerBox pickerBox2;
+ private System.Windows.Forms.Label label6;
+ private TYesNoPickerBox pickerBox3;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label8;
+ private TPickerBox pickerBox1;
+ private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1;
+ private TKeyCodeTextBox textBox1;
+
+
+ public OptionsForm(MainForm parent) : base()
+ {
+ InitializeComponent();
+
+ parentForm = parent;
+
+ pickerBox1.ComboBox.Items.Clear();
+ foreach (string item in Enum.GetNames(typeof(LauncherSession.AutoSaveOption)))
+ {
+ pickerBox1.ComboBox.Items.Add(item);
+ }
+
+ if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0;
+
+ }
+
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionsForm));
+ RyzStudio.Windows.ThemedForms.TKeyCodeTextBox.Results results1 = new RyzStudio.Windows.ThemedForms.TKeyCodeTextBox.Results();
+ this.label1 = new System.Windows.Forms.Label();
+ this.button1 = new RyzStudio.Windows.ThemedForms.TButton();
+ this.pickerBox2 = new RyzStudio.Windows.ThemedForms.TYesNoPickerBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.pickerBox3 = new RyzStudio.Windows.ThemedForms.TYesNoPickerBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox();
+ this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.textBox1 = new RyzStudio.Windows.ThemedForms.TKeyCodeTextBox();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label1.Location = new System.Drawing.Point(10, 21);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label1.Size = new System.Drawing.Size(107, 34);
+ this.label1.TabIndex = 153;
+ this.label1.Text = "Show/Hide Hotkey";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // button1
+ //
+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.button1.BackColor = System.Drawing.Color.Transparent;
+ this.button1.DefaultImage = null;
+ this.button1.DownImage = null;
+ this.button1.IsSelected = false;
+ this.button1.LabelText = "&Save";
+ this.button1.Location = new System.Drawing.Point(241, 469);
+ this.button1.Margin = new System.Windows.Forms.Padding(10);
+ this.button1.Name = "button1";
+ this.button1.OverImage = null;
+ this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.button1.Size = new System.Drawing.Size(128, 32);
+ this.button1.TabIndex = 173;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // pickerBox2
+ //
+ this.pickerBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox2.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox2.Location = new System.Drawing.Point(285, 103);
+ this.pickerBox2.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4);
+ this.pickerBox2.Name = "pickerBox2";
+ this.pickerBox2.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox2.Size = new System.Drawing.Size(84, 34);
+ this.pickerBox2.SubmitButton = null;
+ this.pickerBox2.TabIndex = 183;
+ this.pickerBox2.Value = true;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label6.Location = new System.Drawing.Point(10, 103);
+ this.label6.Margin = new System.Windows.Forms.Padding(0);
+ this.label6.Name = "label6";
+ this.label6.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label6.Size = new System.Drawing.Size(83, 34);
+ this.label6.TabIndex = 182;
+ this.label6.Text = "Hide On Close";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // pickerBox3
+ //
+ this.pickerBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox3.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox3.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox3.Location = new System.Drawing.Point(285, 144);
+ this.pickerBox3.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4);
+ this.pickerBox3.Name = "pickerBox3";
+ this.pickerBox3.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox3.Size = new System.Drawing.Size(84, 34);
+ this.pickerBox3.SubmitButton = null;
+ this.pickerBox3.TabIndex = 185;
+ this.pickerBox3.Value = true;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.BackColor = System.Drawing.Color.Transparent;
+ this.label7.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label7.Location = new System.Drawing.Point(10, 144);
+ this.label7.Margin = new System.Windows.Forms.Padding(0);
+ this.label7.Name = "label7";
+ this.label7.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label7.Size = new System.Drawing.Size(95, 34);
+ this.label7.TabIndex = 184;
+ this.label7.Text = "Hide On Execute";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label8.Location = new System.Drawing.Point(10, 62);
+ this.label8.Margin = new System.Windows.Forms.Padding(0);
+ this.label8.Name = "label8";
+ this.label8.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label8.Size = new System.Drawing.Size(60, 34);
+ this.label8.TabIndex = 186;
+ this.label8.Text = "Auto Save";
+ this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // pickerBox1
+ //
+ this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox1.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox1.Location = new System.Drawing.Point(285, 62);
+ this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4);
+ this.pickerBox1.Name = "pickerBox1";
+ this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox1.Size = new System.Drawing.Size(84, 34);
+ this.pickerBox1.SubmitButton = null;
+ this.pickerBox1.TabIndex = 187;
+ //
+ // tHorizontalSeparator1
+ //
+ this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent;
+ this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 437);
+ this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22);
+ this.tHorizontalSeparator1.Name = "tHorizontalSeparator1";
+ this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.tHorizontalSeparator1.Size = new System.Drawing.Size(364, 22);
+ this.tHorizontalSeparator1.TabIndex = 188;
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.BackColor = System.Drawing.Color.Transparent;
+ this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox1.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox1.HighlightImage")));
+ results1.IsAlt = false;
+ results1.IsCtrl = false;
+ results1.IsShift = false;
+ results1.Key = System.Windows.Forms.Keys.None;
+ this.textBox1.KeyCodeResults = results1;
+ this.textBox1.Location = new System.Drawing.Point(192, 20);
+ this.textBox1.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox1.NormalImage")));
+ this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox1.Size = new System.Drawing.Size(177, 35);
+ this.textBox1.SubmitButton = null;
+ this.textBox1.TabIndex = 189;
+ this.textBox1.UseSystemPasswordChar = false;
+ //
+ // OptionsForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(384, 521);
+ this.Controls.Add(this.textBox1);
+ this.Controls.Add(this.tHorizontalSeparator1);
+ this.Controls.Add(this.pickerBox1);
+ this.Controls.Add(this.label8);
+ this.Controls.Add(this.pickerBox3);
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.pickerBox2);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label1);
+ this.MinimumSize = new System.Drawing.Size(400, 560);
+ this.Name = "OptionsForm";
+ this.Text = "Options";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+
+ if (parentForm == null)
+ {
+ return;
+ }
+
+ if (parentForm.CurrentSession == null)
+ {
+ return;
+ }
+
+ // hotkey
+ if (parentForm.CurrentSession.HotKey != null)
+ {
+ textBox1.UpdateKeyCode(parentForm.CurrentSession.HotKey.IsCtrl, parentForm.CurrentSession.HotKey.IsAlt, parentForm.CurrentSession.HotKey.IsShift, parentForm.CurrentSession.HotKey.KeyCode);
+ }
+
+ pickerBox1.ComboBox.SelectedIndex = (int)parentForm.CurrentSession.AutoSave;
+ pickerBox2.Value = parentForm.CurrentSession.HideOnClose;
+ pickerBox3.Value = parentForm.CurrentSession.HideOnClick;
+ }
+
+
+ public MainForm parentForm { get; set; } = null;
+
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ if (parentForm != null)
+ {
+ if (parentForm.CurrentSession == null) parentForm.CurrentSession = new LauncherSession();
+ if (parentForm.CurrentSession.HotKey == null) parentForm.CurrentSession.HotKey = new LauncherSession.HotKeyOptions();
+
+ parentForm.CurrentSession.HotKey.IsCtrl = textBox1.KeyCodeResults.IsCtrl;
+ parentForm.CurrentSession.HotKey.IsAlt = textBox1.KeyCodeResults.IsAlt;
+ parentForm.CurrentSession.HotKey.IsShift = textBox1.KeyCodeResults.IsShift;
+ parentForm.CurrentSession.HotKey.Key = textBox1.KeyCodeResults.KeyCode;
+
+ parentForm.CurrentSession.AutoSave = (LauncherSession.AutoSaveOption)pickerBox1.ComboBox.SelectedIndex;
+ parentForm.CurrentSession.HideOnClose = pickerBox2.Value;
+ parentForm.CurrentSession.HideOnClick = pickerBox3.Value;
+
+ }
+
+ this.Close();
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/OptionsForm.resx b/OptionsForm.resx
new file mode 100644
index 0000000..e3d054b
--- /dev/null
+++ b/OptionsForm.resx
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vQAADr0BR/uQrQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAClSURBVDhP7dI/
+ DgFBGIbxSVTKjcRx3MLqXYCOjkocQcMF3MAZOIKaE5AthOexf2QnbJQKb/JLJvO9XzLFhCgtbHDBveB5
+ DWcfM8ANC0wKnr1LUUsbHXSxxBlJxDtnduy6E04on/Utd0IPOxwxxBT9iHfO7Nh155kV9vmxMXbsVvkv
+ vvIji4f82Bg7tcUxrpih/NyxOeyMUMVPu0WGd39TzuzQDeEB5/ZKvTSyulEAAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vQAADr0BR/uQrQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADTSURBVDhP7ZI7
+ CsJQEEUfWFmK4HLchdpnA9ppp5W4BBtdQNyBC0ilRf6VdVyBwUL03JdXxC/YWThwmDcz94YJjKmH7/uN
+ OI7XaZqekiS5Cr1hpZmTPQemAeILeU4eC/dWr+9kVQRB0MzzvB2GYQfBAsExiqJWHfU0k0ZaeQyNAuxa
+ X1CYLMu6/MOW4kD2YAK9B9TznGYrj12XVZY0drb4ENJI68q/sR4/YoS9K9+GNHdGLmIEJV+cku1xP4Jh
+ Ri7JQ2erDp3mBs7w6jaFZht74MaYGwmLbkeRGexGAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..71f4564
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace FizzyLauncher
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.SetHighDpiMode(HighDpiMode.SystemAware);
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+ }
+}
diff --git a/Resources/UI/arrow_down.png b/Resources/UI/arrow_down.png
new file mode 100644
index 0000000..cccf233
Binary files /dev/null and b/Resources/UI/arrow_down.png differ
diff --git a/Resources/UI/arrow_down2.png b/Resources/UI/arrow_down2.png
new file mode 100644
index 0000000..5b0b115
Binary files /dev/null and b/Resources/UI/arrow_down2.png differ
diff --git a/Resources/UI/arrow_up.png b/Resources/UI/arrow_up.png
new file mode 100644
index 0000000..a08438b
Binary files /dev/null and b/Resources/UI/arrow_up.png differ
diff --git a/Resources/UI/arrow_up2.png b/Resources/UI/arrow_up2.png
new file mode 100644
index 0000000..07c1797
Binary files /dev/null and b/Resources/UI/arrow_up2.png differ
diff --git a/Resources/UI/close.png b/Resources/UI/close.png
new file mode 100644
index 0000000..25fc632
Binary files /dev/null and b/Resources/UI/close.png differ
diff --git a/Resources/UI/close2.png b/Resources/UI/close2.png
new file mode 100644
index 0000000..c02cdf0
Binary files /dev/null and b/Resources/UI/close2.png differ
diff --git a/Resources/UI/edit.png b/Resources/UI/edit.png
new file mode 100644
index 0000000..031e3f6
Binary files /dev/null and b/Resources/UI/edit.png differ
diff --git a/Resources/UI/edit2.png b/Resources/UI/edit2.png
new file mode 100644
index 0000000..b9e93ab
Binary files /dev/null and b/Resources/UI/edit2.png differ
diff --git a/Resources/UI/file.png b/Resources/UI/file.png
new file mode 100644
index 0000000..d0c9e58
Binary files /dev/null and b/Resources/UI/file.png differ
diff --git a/Resources/UI/file2.png b/Resources/UI/file2.png
new file mode 100644
index 0000000..f3e9f6d
Binary files /dev/null and b/Resources/UI/file2.png differ
diff --git a/Resources/UI/folder.png b/Resources/UI/folder.png
new file mode 100644
index 0000000..a97c4e0
Binary files /dev/null and b/Resources/UI/folder.png differ
diff --git a/Resources/UI/folder2.png b/Resources/UI/folder2.png
new file mode 100644
index 0000000..d21178a
Binary files /dev/null and b/Resources/UI/folder2.png differ
diff --git a/Resources/UI/minus.png b/Resources/UI/minus.png
new file mode 100644
index 0000000..6b396d4
Binary files /dev/null and b/Resources/UI/minus.png differ
diff --git a/Resources/UI/minus2.png b/Resources/UI/minus2.png
new file mode 100644
index 0000000..9bb4128
Binary files /dev/null and b/Resources/UI/minus2.png differ
diff --git a/Resources/UI/plus.png b/Resources/UI/plus.png
new file mode 100644
index 0000000..f63ace9
Binary files /dev/null and b/Resources/UI/plus.png differ
diff --git a/Resources/UI/plus2.png b/Resources/UI/plus2.png
new file mode 100644
index 0000000..0c29081
Binary files /dev/null and b/Resources/UI/plus2.png differ
diff --git a/Resources/UI/trash.png b/Resources/UI/trash.png
new file mode 100644
index 0000000..55e6552
Binary files /dev/null and b/Resources/UI/trash.png differ
diff --git a/Resources/UI/trash2.png b/Resources/UI/trash2.png
new file mode 100644
index 0000000..1ae8d43
Binary files /dev/null and b/Resources/UI/trash2.png differ
diff --git a/Resources/folder_32.png b/Resources/folder_32.png
new file mode 100644
index 0000000..832fd3c
Binary files /dev/null and b/Resources/folder_32.png differ
diff --git a/Resources/toggle-left-ea-16.png b/Resources/toggle-left-ea-16.png
new file mode 100644
index 0000000..e7895fd
Binary files /dev/null and b/Resources/toggle-left-ea-16.png differ
diff --git a/Resources/toggle-right-ea-16.png b/Resources/toggle-right-ea-16.png
new file mode 100644
index 0000000..aedd7c2
Binary files /dev/null and b/Resources/toggle-right-ea-16.png differ
diff --git a/RyzStudio/Data/SQLite/SQLiteDatabase.cs b/RyzStudio/Data/SQLite/SQLiteDatabase.cs
new file mode 100644
index 0000000..2ebab58
--- /dev/null
+++ b/RyzStudio/Data/SQLite/SQLiteDatabase.cs
@@ -0,0 +1,444 @@
+using System;
+using System.ComponentModel;
+using System.Data;
+using System.IO;
+
+namespace RyzStudio.Data.SQLite
+{
+ public class SQLiteDatabase
+ {
+ #region static methods
+
+ public static string escapeSQL(string query)
+ {
+ return query.Replace("'", "''").Trim();
+ }
+
+ public static string escapeValue(string text)
+ {
+ return text.Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\r", " \\r").Replace("\n", "\\n");
+ }
+
+ public static string PrepareQuery(string query, params string[] arguments)
+ {
+ string rv = query;
+
+ if (string.IsNullOrEmpty(rv))
+ {
+ return string.Empty;
+ }
+
+ for (int i = 0; i < arguments.Length; i++)
+ {
+ rv = rv.Replace("[^" + (i + 1).ToString() + "]", escapeSQL(arguments[i]));
+ }
+
+ return rv;
+ }
+
+ #endregion
+
+ protected SQLiteWrapper.SQLiteBase database = null;
+ protected string databaseLocation = ":memory:";
+ protected string lastError = "";
+
+ protected string[] requiredTableList = new string[0];
+
+ protected const string tableNameConfig = "ryz_app_xxxx_config";
+
+ #region public properties
+
+ [Browsable(false)]
+ public SQLiteWrapper.SQLiteBase Database
+ {
+ get { return database; }
+ set { database = value; }
+ }
+
+ [Browsable(false)]
+ public string DatabaseLocation
+ {
+ get { return databaseLocation; }
+ set { databaseLocation = value; }
+ }
+
+ [Browsable(false)]
+ public string LastError
+ {
+ get { return lastError; }
+ }
+
+ [Browsable(false)]
+ public int LastInsertID
+ {
+ get
+ {
+ if (database == null)
+ {
+ return 0;
+ }
+
+ DataTable dt = this.DoQuery("SELECT last_insert_rowid() AS ccc;");
+ if (dt == null)
+ {
+ return 0;
+ }
+
+ if (dt.Rows.Count <= 0)
+ {
+ return 0;
+ }
+
+ return int.Parse(dt.Rows[0]["ccc"].ToString());
+ }
+ }
+
+ #endregion
+
+ #region public methods
+
+ public bool Create(bool use_memory = true)
+ {
+ lastError = string.Empty;
+
+ if (string.IsNullOrEmpty(databaseLocation))
+ {
+ return false;
+ }
+
+ try
+ {
+ if (database != null)
+ {
+ database.CloseDatabase();
+ }
+
+ database = new SQLiteWrapper.SQLiteBase(((use_memory) ? ":memory:" : databaseLocation));
+ }
+ catch (Exception exc)
+ {
+ lastError = exc.Message;
+ return false;
+ }
+
+ bool rv = Prepare();
+ if (!rv)
+ {
+ return false;
+ }
+
+ return CheckRequiredTables();
+ }
+
+ public bool Create(string filename, bool override_file = false)
+ {
+ lastError = string.Empty;
+ databaseLocation = filename;
+
+ if (string.IsNullOrEmpty(databaseLocation))
+ {
+ return false;
+ }
+
+ if (File.Exists(databaseLocation) && override_file)
+ {
+ try
+ {
+ File.Delete(databaseLocation);
+ }
+ catch (Exception xc)
+ {
+ lastError = xc.Message;
+ return false;
+ }
+ }
+
+ try
+ {
+ if (database != null)
+ {
+ database.CloseDatabase();
+ }
+
+ database = new SQLiteWrapper.SQLiteBase(databaseLocation);
+ }
+ catch (Exception exc)
+ {
+ lastError = exc.Message;
+ return false;
+ }
+
+ bool rv = CheckRequiredTables();
+ if (!rv)
+ {
+ Prepare();
+ }
+
+ return CheckRequiredTables();
+ }
+
+ public bool Load(string filename)
+ {
+ if (!File.Exists(filename))
+ {
+ return false;
+ }
+
+ lastError = string.Empty;
+ databaseLocation = filename;
+
+ try
+ {
+ if (database != null)
+ {
+ database.CloseDatabase();
+ }
+
+ database = new SQLiteWrapper.SQLiteBase(databaseLocation);
+ }
+ catch (Exception exc)
+ {
+ lastError = exc.Message;
+ return false;
+ }
+
+ return CheckRequiredTables();
+ }
+
+ public void Close()
+ {
+ if (database != null)
+ {
+ database.CloseDatabase();
+ }
+ }
+
+
+ public DataTable DoQuery(string query)
+ {
+ lastError = string.Empty;
+ if (database == null)
+ {
+ return null;
+ }
+
+ try
+ {
+ return database.ExecuteQuery(query);
+ }
+ catch (Exception exc)
+ {
+ lastError = exc.Message;
+ return null;
+ }
+ }
+
+ public DataTable DoQuery(string query, params string[] args)
+ {
+ string sql = SQLiteDatabase.PrepareQuery(query, args);
+
+ return DoQuery(sql);
+ }
+
+ public bool DoNonQuery(string query)
+ {
+ lastError = string.Empty;
+ if (database == null)
+ {
+ return false;
+ }
+
+ try
+ {
+ database.ExecuteNonQuery(query);
+ return true;
+ }
+ catch (Exception exc)
+ {
+ lastError = exc.Message;
+ return false;
+ }
+ }
+
+ public bool DoNonQuery(string query, params string[] args)
+ {
+ string sql = SQLiteDatabase.PrepareQuery(query, args);
+
+ return DoNonQuery(sql);
+ }
+
+ public string DoQuerySingle(string query)
+ {
+ lastError = string.Empty;
+ if (database == null)
+ {
+ return string.Empty;
+ }
+
+ DataTable tbl = DoQuery(query);
+
+ if (tbl == null)
+ {
+ return string.Empty;
+ }
+
+ if (tbl.Columns.Count <= 0)
+ {
+ return string.Empty;
+ }
+
+ if (tbl.Rows.Count <= 0)
+ {
+ return string.Empty;
+ }
+
+ return tbl.Rows[0][0].ToString();
+ }
+
+ public string DoQuerySingle(string query, params string[] args)
+ {
+ string sql = SQLiteDatabase.PrepareQuery(query, args);
+
+ return DoQuerySingle(sql);
+ }
+
+ public int DoQueryCount(string query)
+ {
+ if (database == null)
+ {
+ return -1;
+ }
+
+ DataTable tbl = DoQuery(query);
+
+ if (tbl == null)
+ {
+ return -1;
+ }
+
+ if (tbl.Rows.Count <= 0)
+ {
+ return 0;
+ }
+
+ return tbl.Rows.Count;
+ }
+
+ public int DoQueryCount(string query, params string[] args)
+ {
+ string sql = SQLiteDatabase.PrepareQuery(query, args);
+
+ return DoQueryCount(sql);
+ }
+
+ public bool DoQueryExist(string query)
+ {
+ int rv = DoQueryCount(query);
+
+ return (rv > 0);
+ }
+
+ public bool DoQueryExist(string query, params string[] args)
+ {
+ string sql = SQLiteDatabase.PrepareQuery(query, args);
+
+ return DoQueryExist(sql);
+ }
+
+ public bool HasTable(string table_name)
+ {
+ lastError = string.Empty;
+ if (database == null)
+ {
+ return false;
+ }
+
+ int rv = this.DoQueryCount("SELECT 1 FROM sqlite_master WHERE type='table' AND name='" + escapeSQL(table_name) + "'");
+
+ return (rv > 0);
+ }
+
+ public bool CheckRequiredTables()
+ {
+ bool rv = true;
+ foreach (string tbl in requiredTableList)
+ {
+ if (string.IsNullOrEmpty(tbl))
+ {
+ continue;
+ }
+
+ if (!this.HasTable(tbl))
+ {
+ rv = false;
+ break;
+ }
+ }
+
+ return rv;
+ }
+
+
+ protected bool PrepareConfig()
+ {
+ if (HasTable(tableNameConfig))
+ {
+ return true;
+ }
+
+ bool rv = this.DoNonQuery(@"
+ BEGIN TRANSACTION;
+ CREATE TABLE " + tableNameConfig + @" (cfg_name TEXT, cfg_value TEXT);
+ COMMIT;
+ ");
+
+ return rv;
+ }
+
+ public bool SetConfig(string name, string value)
+ {
+ if (!PrepareConfig())
+ {
+ return false;
+ }
+
+ string sql = string.Empty;
+ int rv = this.DoQueryCount("SELECT 1 FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'");
+ if (rv <= 0)
+ {
+ sql = "INSERT INTO " + tableNameConfig + " (cfg_name, cfg_value) VALUES ('[^1]', '[^2]');";
+ }
+ else
+ {
+ sql = "UPDATE " + tableNameConfig + " SET cfg_value='[^2]' WHERE cfg_name='[^1]';";
+ }
+
+ sql = PrepareQuery(sql, new string[] { name, value });
+
+ return this.DoNonQuery(sql);
+ }
+
+ public string GetConfig(string name, string default_value = "")
+ {
+ if (!PrepareConfig())
+ {
+ return default_value;
+ }
+
+ bool rv = this.DoQueryExist("SELECT 1 FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'");
+ if (!rv)
+ {
+ return default_value;
+ }
+
+ return this.DoQuerySingle("SELECT cfg_value FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'");
+ }
+
+ #endregion
+
+ protected virtual bool Prepare()
+ {
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Drawing/Rectangoid.cs b/RyzStudio/Drawing/Rectangoid.cs
new file mode 100644
index 0000000..59a24d8
--- /dev/null
+++ b/RyzStudio/Drawing/Rectangoid.cs
@@ -0,0 +1,124 @@
+using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace RyzStudio.Drawing
+{
+ public struct Rectangoid
+ {
+ private int X;
+ private int Y;
+ private int Width;
+ private int Height;
+ private int Radius;
+
+ public Rectangoid(Rectangle rect, int radius)
+ {
+ X = rect.X;
+ Y = rect.Y;
+ Width = rect.Width;
+ Height = rect.Height;
+ Radius = radius;
+ }
+
+ public Rectangoid(Rectangle rect, int radius, int borderWidth)
+ {
+ rect.Inflate((-1 * borderWidth), (-1 * borderWidth));
+
+ X = rect.X;
+ Y = rect.Y;
+ Width = rect.Width;
+ Height = rect.Height;
+ Radius = radius;
+ }
+
+ public Rectangoid(int x, int y, int width, int height, int radius)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ Radius = radius;
+ }
+
+ public Rectangoid(int x, int y, int width, int height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ Radius = 0;
+ }
+
+ public Rectangoid(int width, int height, int radius)
+ {
+ X = 0;
+ Y = 0;
+ Width = width;
+ Height = height;
+ Radius = radius;
+ }
+
+ public Rectangoid(int width, int height)
+ {
+ X = 0;
+ Y = 0;
+ Width = width;
+ Height = height;
+ Radius = 0;
+ }
+
+ public Rectangoid(int width)
+ {
+ X = 0;
+ Y = 0;
+ Width = width;
+ Height = width;
+ Radius = 0;
+ }
+
+ public GraphicsPath ToGraphicsPath()
+ {
+ GraphicsPath rv = new GraphicsPath();
+ rv.AddLine(X + this.Radius, Y, X + Width - (this.Radius * 2), Y);
+
+ if (this.Radius > 0)
+ {
+ rv.AddArc(X + Width - (this.Radius * 2), Y, this.Radius * 2, this.Radius * 2, 270, 90);
+ }
+
+ rv.AddLine(X + Width, Y + this.Radius, X + Width, Y + Height - (this.Radius * 2));
+
+ if (this.Radius > 0)
+ {
+ rv.AddArc(X + Width - (this.Radius * 2), Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 0, 90);
+ }
+
+ rv.AddLine(X + Width - (this.Radius * 2), Y + Height, X + this.Radius, Y + Height);
+
+ if (this.Radius > 0)
+ {
+ rv.AddArc(X, Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 90, 90);
+ }
+
+ rv.AddLine(X, Y + Height - (this.Radius * 2), X, Y + this.Radius);
+
+ if (this.Radius > 0)
+ {
+ rv.AddArc(X, Y, this.Radius * 2, this.Radius * 2, 180, 90);
+ }
+
+ rv.CloseFigure();
+
+ return rv;
+ }
+
+ public PointF GetOrigin()
+ {
+ PointF rv = new PointF();
+ rv.X = ((float)Width / 2) + X;
+ rv.Y = ((float)Height / 2) + Y;
+
+ return rv;
+ }
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/IO/FileType.cs b/RyzStudio/IO/FileType.cs
new file mode 100644
index 0000000..3c8b616
--- /dev/null
+++ b/RyzStudio/IO/FileType.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace RyzStudio.IO
+{
+ public class FileType
+ {
+ protected static readonly byte[] BMP = { 66, 77 };
+ protected static readonly byte[] GIF = { 71, 73, 70, 56 };
+ protected static readonly byte[] ICO = { 0, 0, 1, 0 };
+ protected static readonly byte[] JPG = { 255, 216, 255 };
+ protected static readonly byte[] PNG = { 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82 };
+
+ public static bool IsImage(byte[] byteArray)
+ {
+ if (byteArray == null)
+ {
+ return false;
+ }
+
+ if (byteArray.Length <= 0)
+ {
+ return false;
+ }
+
+ if (byteArray.Take(2).SequenceEqual(BMP))
+ {
+ return true;
+ }
+
+ if (byteArray.Take(4).SequenceEqual(GIF))
+ {
+ return true;
+ }
+
+ if (byteArray.Take(4).SequenceEqual(ICO))
+ {
+ return true;
+ }
+
+ if (byteArray.Take(3).SequenceEqual(JPG))
+ {
+ return true;
+ }
+
+ if (byteArray.Take(16).SequenceEqual(PNG))
+ {
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/RyzStudio/IO/SessionFileFormatBase.cs b/RyzStudio/IO/SessionFileFormatBase.cs
new file mode 100644
index 0000000..3ae2887
--- /dev/null
+++ b/RyzStudio/IO/SessionFileFormatBase.cs
@@ -0,0 +1,290 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Windows.Forms;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace RyzStudio.IO
+{
+ public abstract class SessionFileFormatBase
+ {
+ protected string CONST_KEYPASS = "";
+ protected string CONST_PRODUCT = "";
+ protected string CONST_STREAM_FILE_NAME = "";
+
+ protected bool enableErrorReporting = false;
+ protected string lastUsedFileName = "";
+
+ #region public properties
+
+ public string passkey
+ {
+ get { return CONST_KEYPASS; }
+ set { CONST_KEYPASS = value; }
+ }
+
+ /*public string LastFilename
+ {
+ get { return lastUsedFileName; }
+ set { lastUsedFileName = value; }
+ }*/
+
+ #endregion
+
+ #region public methods
+
+/* public bool loadFromRyz()
+ {
+ return loadFromRyz(lastUsedFileName);
+ }*/
+
+ public bool loadFromRyz(string file_name)
+ {
+ lastUsedFileName = file_name;
+ if (!File.Exists(file_name))
+ {
+ return false;
+ }
+
+ bool rv = false;
+
+ try
+ {
+ ZipInputStream zipIn = new ZipInputStream(File.OpenRead(file_name));
+ zipIn.Password = CONST_KEYPASS;
+ ZipEntry theEntry = null;
+
+ while ((theEntry = zipIn.GetNextEntry()) != null)
+ {
+ string streamFileName = Path.GetFileName(theEntry.Name);
+ if (streamFileName.Equals(CONST_STREAM_FILE_NAME))
+ {
+ MemoryStream oxStream = new MemoryStream();
+ StreamWriter streamWriter = new StreamWriter(oxStream);
+ int size = 2048;
+ byte[] data = new byte[size];
+ while (true)
+ {
+ size = zipIn.Read(data, 0, data.Length);
+ if (size <= 0) break;
+ streamWriter.BaseStream.Write(data, 0, size);
+ }
+
+ oxStream.Position = 0;
+
+ StreamReader sr2 = new StreamReader(oxStream, Encoding.UTF8);
+ XmlDocument xDoc = new XmlDocument();
+ xDoc.LoadXml(sr2.ReadToEnd());
+
+ loadFromXmlDocument(ref xDoc);
+ }
+ }
+
+ zipIn.Close();
+
+ rv = true;
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ return rv;
+ }
+
+ public bool loadFromXml()
+ {
+ return loadFromXml(lastUsedFileName);
+ }
+
+ public bool loadFromXml(string file_name)
+ {
+ lastUsedFileName = file_name;
+ if (!File.Exists(file_name))
+ {
+ return false;
+ }
+
+ bool rv = false;
+
+ try
+ {
+ StreamReader sr2 = new StreamReader(file_name, Encoding.UTF8);
+ XmlDocument xDoc = new XmlDocument();
+ xDoc.LoadXml(sr2.ReadToEnd());
+
+ loadFromXmlDocument(ref xDoc);
+ sr2.Close();
+
+ rv = true;
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ return rv;
+ }
+
+/* public bool saveToRyz()
+ {
+ return saveToRyz(lastUsedFileName);
+ }
+*/
+
+ public bool saveToRyz(string file_name)
+ {
+ bool rv = false;
+ lastUsedFileName = file_name;
+ byte[] buffer = new byte[4096];
+
+ try
+ {
+ File.Delete(file_name);
+ FileInfo fileinfo1 = new FileInfo(file_name);
+ if (!Directory.Exists(fileinfo1.DirectoryName))
+ {
+ Directory.CreateDirectory(fileinfo1.DirectoryName);
+ }
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ try
+ {
+ ZipOutputStream zipOutStream1 = new ZipOutputStream(File.Create(file_name));
+ zipOutStream1.SetLevel(9);
+ zipOutStream1.Password = CONST_KEYPASS;
+
+ MemoryStream oxIndexStream = new MemoryStream();
+ XmlTextWriter oxTW = new XmlTextWriter(oxIndexStream, Encoding.UTF8);
+ saveToXmlTextWriter(ref oxTW);
+ oxTW.Flush();
+
+ // write to file
+ zipOutStream1.PutNextEntry(new ZipEntry(CONST_STREAM_FILE_NAME));
+ oxIndexStream.Position = 0;
+ StreamReader sr2 = new StreamReader(oxIndexStream, Encoding.UTF8);
+ int sourceBytes;
+ do
+ {
+ sourceBytes = sr2.BaseStream.Read(buffer, 0, buffer.Length);
+ zipOutStream1.Write(buffer, 0, sourceBytes);
+ }
+ while (sourceBytes > 0);
+
+ sr2.Close();
+ oxTW.Close();
+ zipOutStream1.Finish();
+ zipOutStream1.Close();
+
+ rv = true;
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ return rv;
+ }
+
+ public bool saveToXml()
+ {
+ return saveToXml(lastUsedFileName);
+ }
+
+ public bool saveToXml(string file_name)
+ {
+ bool rv = false;
+
+ lastUsedFileName = file_name;
+ try
+ {
+ File.Delete(file_name);
+ FileInfo fileinfo1 = new FileInfo(file_name);
+ if (!Directory.Exists(fileinfo1.DirectoryName))
+ {
+ Directory.CreateDirectory(fileinfo1.DirectoryName);
+ }
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ try
+ {
+ XmlTextWriter oxTW = new XmlTextWriter(file_name, Encoding.UTF8);
+ saveToXmlTextWriter(ref oxTW);
+ oxTW.Flush();
+ oxTW.Close();
+
+ rv = true;
+ }
+ catch (Exception exc)
+ {
+ if (enableErrorReporting)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ return rv;
+ }
+
+ #endregion
+
+ protected virtual void loadFromXmlDocument(ref XmlDocument xml_doc) { }
+ protected virtual void saveToXmlTextWriter(ref XmlTextWriter writer) { }
+
+ #region public methods (conversions)
+
+ public int[] convIntArrayString(string s1, char c)
+ {
+ string[] sarr = s1.Split(c);
+ int[] iarr = new int[sarr.Length];
+ for (int i = 0; i < sarr.Length; i++)
+ {
+ iarr[i] = Int32.Parse(sarr[i]);
+ }
+
+ return iarr;
+ }
+
+ public string convStringIntArray(int[] r, char s)
+ {
+ string t = null;
+ for (int i = 0; i < r.Length; i++)
+ {
+ if (i != 0)
+ {
+ t += s.ToString();
+ }
+
+ t += r[i].ToString();
+ }
+
+ return t;
+ }
+
+#endregion
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/IO/SharpZipLib.cs b/RyzStudio/IO/SharpZipLib.cs
new file mode 100644
index 0000000..b162124
--- /dev/null
+++ b/RyzStudio/IO/SharpZipLib.cs
@@ -0,0 +1,76 @@
+using System;
+using System.IO;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace RyzStudio.IO
+{
+ public class SharpZipLib
+ {
+ ///
+ /// Is zip file encrypted
+ ///
+ /// Filename
+ /// Is encrypted
+ public static bool IsZipEncrypted(string fn)
+ {
+ bool ret_val = false;
+ try
+ {
+ ZipInputStream zipIn = new ZipInputStream(System.IO.File.OpenRead(fn));
+ ZipEntry theEntry = null;
+ while ((theEntry = zipIn.GetNextEntry()) != null)
+ {
+ if (theEntry.IsCrypted)
+ {
+ ret_val = true;
+ }
+
+ break;
+ }
+
+ zipIn.Close();
+ }
+ catch
+ {
+ // do nothing
+ }
+
+ return ret_val;
+ }
+
+ public static void AddFile(ZipOutputStream zipstream, string filename, string prefixpath = null)
+ {
+ byte[] buffer = new byte[4096];
+
+ string f1 = "";
+ if (prefixpath != null)
+ {
+ f1 = Path.GetDirectoryName(filename).TrimEnd('\\') + "\\";
+ f1 = f1.Replace(prefixpath, "").TrimEnd('\\') + "\\";
+ f1 = f1 + Path.GetFileName(filename);
+ f1 = f1.TrimStart('\\');
+ }
+
+ ZipEntry entry = new ZipEntry(f1);
+ entry.DateTime = DateTime.Now;
+ zipstream.PutNextEntry(entry);
+
+ FileStream fs = File.OpenRead(filename);
+ int sourceBytes;
+ do
+ {
+ sourceBytes = fs.Read(buffer, 0, buffer.Length);
+ zipstream.Write(buffer, 0, sourceBytes);
+ }
+ while (sourceBytes > 0);
+ }
+
+ public static void AddFolder(ZipOutputStream zipstream, string folderpath, string prefixpath = null)
+ {
+ foreach (string fn in Directory.GetFiles(folderpath, "*.*", System.IO.SearchOption.AllDirectories))
+ {
+ AddFile(zipstream, fn, prefixpath);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Net/HttpWeb.cs b/RyzStudio/Net/HttpWeb.cs
new file mode 100644
index 0000000..bafff2e
--- /dev/null
+++ b/RyzStudio/Net/HttpWeb.cs
@@ -0,0 +1,168 @@
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Windows.Forms;
+
+namespace RyzStudio.Net
+{
+ public class HttpWeb
+ {
+ public string defaultUserAgent = "Momozilla/5.0 (" + Environment.OSVersion.Platform.ToString() + " ; " + Environment.OSVersion.VersionString + "; " + Application.CurrentCulture.TwoLetterISOLanguageName + ")";
+ public int defaultTimeout = 6000;
+ public int defaultMaxRedirect = 8;
+ public bool defaultAllowRedirect = true;
+ public CookieContainer defaultCookierContainer = null;
+
+ public HttpWeb()
+ {
+ }
+
+ public HttpWebRequest CreateRequest(string url)
+ {
+ return this.CreateRequest(url, url);
+ }
+
+ public HttpWebRequest CreateRequest(string url, string referrerURL)
+ {
+ if (defaultCookierContainer == null)
+ {
+ defaultCookierContainer = new CookieContainer();
+ }
+
+ HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
+ webRequest.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
+ webRequest.MaximumAutomaticRedirections = defaultMaxRedirect;
+ webRequest.CookieContainer = defaultCookierContainer;
+ webRequest.UserAgent = defaultUserAgent;
+ webRequest.AllowAutoRedirect = defaultAllowRedirect;
+ webRequest.Timeout = defaultTimeout;
+
+ return webRequest;
+ }
+
+ public int GetResponse(out string sourceCode, string url, string referrerURL = "")
+ {
+ HttpWebRequest webRequest = this.CreateRequest(url, referrerURL);
+
+ return GetResponse(out sourceCode, webRequest);
+ }
+
+ public int GetResponse(out string sourceCode, HttpWebRequest webRequest)
+ {
+ sourceCode = string.Empty;
+
+ int rv = 0;
+
+ try
+ {
+ HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
+
+ rv = (int)webResponse.StatusCode;
+
+ StreamReader readContent = new StreamReader(webResponse.GetResponseStream());
+ sourceCode = readContent.ReadToEnd();
+
+ webResponse.Close();
+ webResponse = null;
+ }
+ catch (WebException xc)
+ {
+ if (xc.Response is HttpWebResponse)
+ {
+ HttpWebResponse rs = xc.Response as HttpWebResponse;
+ StreamReader readContent = new StreamReader(rs.GetResponseStream());
+ if (readContent != null)
+ {
+ sourceCode = readContent.ReadToEnd();
+ }
+
+ rv = (int)rs.StatusCode;
+ }
+ else
+ {
+ rv = (int)xc.Status;
+ sourceCode = xc.Message;
+ }
+ }
+ catch (Exception xc)
+ {
+ sourceCode = xc.Message;
+ }
+
+ return rv;
+ }
+
+ public static HttpWebRequest AddBasicAuthentication(HttpWebRequest webRequest, string username, string password)
+ {
+ webRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(string.Concat(username, ":", password)));
+ webRequest.PreAuthenticate = true;
+
+ return webRequest;
+ }
+
+
+ public int GetPOSTResponse(out string sourceCode, HttpWebRequest webRequest, string postData)
+ {
+ sourceCode = "";
+ int rv = 0;
+ byte[] buffer = Encoding.UTF8.GetBytes(postData);
+
+ webRequest.ContentLength = buffer.Length;
+
+ try
+ {
+ Stream dataStream = webRequest.GetRequestStream();
+ dataStream.Write(buffer, 0, buffer.Length);
+ dataStream.Close();
+ }
+ catch (Exception xc)
+ {
+ sourceCode = xc.Message;
+ return rv;
+ }
+
+ return this.GetResponse(out sourceCode, webRequest);
+ }
+
+ public int GetHeader(out WebHeaderCollection headerCollection, string url, string referrerURL = "")
+ {
+ headerCollection = null;
+
+ int rv = 0;
+
+ HttpWebRequest webRequest = this.CreateRequest(url, referrerURL);
+ webRequest.Method = "HEAD";
+
+ try
+ {
+ HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
+ headerCollection = webResponse.Headers;
+
+ rv = (int)webResponse.StatusCode;
+
+ webResponse.Close();
+ webResponse = null;
+ }
+ catch (WebException xc)
+ {
+ if (xc.Response is HttpWebResponse)
+ {
+ HttpWebResponse rs = xc.Response as HttpWebResponse;
+
+ rv = (int)rs.StatusCode;
+ }
+ else
+ {
+ rv = (int)xc.Status;
+ }
+ }
+ catch
+ {
+ // do nothing
+ }
+
+ return rv;
+ }
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/StackLayoutPanel.cs b/RyzStudio/Windows/Forms/StackLayoutPanel.cs
new file mode 100644
index 0000000..8cdeae5
--- /dev/null
+++ b/RyzStudio/Windows/Forms/StackLayoutPanel.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class StackLayoutPanel : FlowLayoutPanel
+ {
+ public StackLayoutPanel() : base()
+ {
+ this.AutoScroll = true;
+ this.FlowDirection = FlowDirection.TopDown;
+ this.WrapContents = false;
+ }
+
+ protected override void OnResize(EventArgs eventargs)
+ {
+ base.OnResize(eventargs);
+
+ //int w = this.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth;
+ int w = this.ClientRectangle.Width - 1;
+
+ foreach (Control item in this.Controls)
+ {
+ if (item.Width != w)
+ {
+ item.Width = w;
+ }
+ }
+ }
+
+ protected override void OnControlAdded(ControlEventArgs e)
+ {
+ base.OnControlAdded(e);
+
+ OnResize(null);
+ }
+
+ protected override void OnControlRemoved(ControlEventArgs e)
+ {
+ base.OnControlRemoved(e);
+
+ OnResize(null);
+ }
+
+ public void AddControl(Control value)
+ {
+ if (this.InvokeRequired)
+ {
+ this.Invoke(new MethodInvoker(() =>
+ {
+ value.Margin = new Padding(0, 3, 0, 3);
+
+ this.Controls.Add(value);
+ }));
+ }
+ else
+ {
+ value.Margin = new Padding(0, 3, 0, 3);
+
+ this.Controls.Add(value);
+ }
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/Forms/TFlatButton.cs b/RyzStudio/Windows/Forms/TFlatButton.cs
new file mode 100644
index 0000000..b50dee0
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TFlatButton.cs
@@ -0,0 +1,115 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class TFlatButton : Label
+ {
+ public class ButtonStyle
+ {
+ public Color BackColour { get; set; } = Color.Transparent;
+ public Color PenColour { get; set; } = Color.Transparent;
+ }
+
+ public enum FlatButtonState
+ {
+ Idle = 0,
+ Hover,
+ Down
+ }
+
+ protected FlatButtonState controlState = FlatButtonState.Idle;
+
+ public TFlatButton() : base()
+ {
+ this.AutoSize = false;
+ this.ImageAlign = ContentAlignment.MiddleCenter;
+ this.TextAlign = ContentAlignment.MiddleCenter;
+
+ // customise
+ this.StyleOver = new ButtonStyle()
+ {
+ BackColour = Color.FromArgb(51, 51, 51),
+ PenColour = Color.White
+ };
+ this.StyleDown = new ButtonStyle()
+ {
+ BackColour = Color.FromArgb(179, 179, 179),
+ PenColour = Color.Black
+ };
+ this.StyleDefault = new ButtonStyle()
+ {
+ BackColour = Color.White,
+ PenColour = Color.Black
+ };
+
+ this.VisualState = FlatButtonState.Idle;
+
+ this.Click += delegate { this.OnClick(null); };
+ this.MouseEnter += delegate { this.VisualState = FlatButtonState.Hover; };
+ this.MouseLeave += delegate { this.VisualState = FlatButtonState.Idle; };
+ this.MouseDown += delegate { this.VisualState = FlatButtonState.Down; };
+ this.MouseUp += delegate { this.VisualState = FlatButtonState.Idle; };
+ }
+
+ protected FlatButtonState VisualState
+ {
+ get { return controlState; }
+ set
+ {
+ switch (value)
+ {
+ case FlatButtonState.Idle:
+ if (this.VisualState == FlatButtonState.Down)
+ {
+ updateButton(StyleOver);
+ }
+ else
+ {
+ updateButton(StyleDefault);
+ }
+
+ break;
+ case FlatButtonState.Hover:
+ updateButton(StyleOver);
+ break;
+ case FlatButtonState.Down:
+ updateButton(StyleDown);
+ break;
+ default:
+ updateButton(StyleDefault);
+ break;
+ }
+
+ controlState = value;
+ }
+ }
+
+ protected void updateButton(ButtonStyle style)
+ {
+ this.ForeColor = style.PenColour;
+ this.BackColor = style.BackColour;
+ }
+
+ protected ButtonStyle StyleOver { get; set; } = new ButtonStyle();
+
+ protected ButtonStyle StyleDown { get; set; } = new ButtonStyle();
+
+ protected ButtonStyle StyleDefault { get; set; } = new ButtonStyle();
+
+ public void PerformClick()
+ {
+ if (this.InvokeRequired)
+ {
+ this.Invoke(new MethodInvoker(() => {
+ this.OnClick(null);
+ }));
+ }
+ else
+ {
+ this.OnClick(null);
+ }
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/Forms/TForm.cs b/RyzStudio/Windows/Forms/TForm.cs
new file mode 100644
index 0000000..58ed7dc
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TForm.cs
@@ -0,0 +1,434 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+//using Resources = AppLauncher.Properties.Resources;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class TForm : Form
+ {
+ //protected readonly Color borderColour = Color.FromArgb(200, 200, 200);
+ //protected readonly int borderWidth = 1;
+
+ //protected readonly int resizeBorderWidth = 4;
+
+ protected readonly Color backColour = Color.FromArgb(250, 250, 250);
+
+ //protected readonly Color titleBackColour = Color.FromArgb(235, 234, 233);
+ //protected readonly Color titleBorderColour = Color.FromArgb(200, 198, 196);
+ //protected readonly Color titleColour = Color.FromArgb(102, 102, 102);
+ //protected readonly int titleBarHeight = 33;
+ //protected readonly bool showTitleBarLine = true;
+ //protected Font titleFont = null;
+ //protected int titleFontTop = 0;
+
+ //protected readonly Size titleBarIconSize = new Size(48, 32);
+ //protected readonly int titleBarIconMargin = 0;
+ //protected readonly int titleBarIconMarginRight = 0;
+
+ //protected Image appIcon = null;
+ //protected const int appIconLeft = 12;
+ //protected const int appIconRight = 6;
+ //protected int appIconTop = 0;
+
+ protected bool isDragging = false;
+ protected Point startPosition = new Point();
+
+ //protected Point startWindowSize = new Point();
+
+ //protected bool enableMinimise { get; set; } = true;
+ //protected bool enableMaximise { get; set; } = true;
+ //protected bool enableClose { get; set; } = true;
+ //protected bool closeOnMinimise { get; set; } = false;
+
+ protected bool isBusy = false;
+
+ private IContainer components;
+
+ public TForm() : base()
+ {
+ InitializeComponent();
+
+ //if (!this.DesignMode)
+ //{
+ // this.FormBorderStyle = FormBorderStyle.None;
+ // this.StartPosition = FormStartPosition.Manual;
+ //}
+
+ this.AutoScaleMode = AutoScaleMode.Font;
+ this.BackColor = backColour;
+ this.FormBorderStyle = FormBorderStyle.Sizable;
+ this.Padding = new Padding(0);
+ this.DoubleBuffered = true;
+
+ this.MouseDown += new MouseEventHandler(form_MouseDown);
+ this.MouseMove += new MouseEventHandler(form_MouseMove);
+ this.MouseUp += new MouseEventHandler(form_MouseUp);
+ this.PreviewKeyDown += new PreviewKeyDownEventHandler(form_PreviewKeyDown);
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.Text = Application.ProductName;
+
+ //initialiseLoadComponent();
+
+ //if (appIcon != null) appIconTop = (int)Math.Floor((decimal)(titleBarHeight - appIcon.Height) / 2) + borderWidth;
+ //titleFont = new Font(this.Font.FontFamily, 10F);
+ //titleFontTop = (int)Math.Floor((decimal)(titleBarHeight - TextRenderer.MeasureText("#", titleFont).Height) / 2) + borderWidth;
+
+ }
+
+ //protected override void OnMouseClick(MouseEventArgs e)
+ //{
+ // base.OnMouseClick(e);
+
+ // bool isLabel = ((e.Location.X >= 0) && (e.Location.X <= this.Width) && (e.Location.Y >= 0) && (e.Location.Y <= titleBarHeight));
+
+ // if (e.Button == MouseButtons.Left)
+ // {
+ // if (isLabel)
+ // {
+ // // do nothing
+ // }
+ // else
+ // {
+ // // do nothing
+ // }
+ // }
+ // else if (e.Button == MouseButtons.Right)
+ // {
+ // if (isLabel)
+ // {
+ // if (this.TitleContextMenuStrip != null)
+ // {
+ // this.TitleContextMenuStrip.Show(this, e.Location);
+ // }
+ // }
+ // else
+ // {
+ // // do nothing
+ // }
+ // }
+ //}
+
+ //protected override void OnPaint(PaintEventArgs e)
+ //{
+ // base.OnPaint(e);
+
+ // Graphics g = e.Graphics;
+ // Rectangle area = new Rectangle(this.DisplayRectangle.X, this.DisplayRectangle.Y, (this.DisplayRectangle.Width - borderWidth), (this.DisplayRectangle.Height - borderWidth));
+
+ // // border
+ // g.DrawRectangle(new Pen(borderColour, borderWidth), area);
+
+ // area.Inflate((-1 * borderWidth), (-1 * borderWidth));
+
+ //g.FillRectangle(new SolidBrush(titleBackColour), area.X, area.Y, (area.Width + area.X), titleBarHeight);
+
+ //if (showTitleBarLine) g.DrawLine(new Pen(titleBorderColour, 1), area.X, titleBarHeight, (area.Width + area.X), titleBarHeight);
+
+ //if (!DesignMode)
+ //{
+ // if (appIcon != null) g.DrawImageUnscaled(appIcon, appIconLeft, appIconTop);
+
+ // int iconPosX = borderWidth + appIconLeft + appIconRight + ((appIcon == null) ? 0 : appIcon.Width);
+ // TextRenderer.DrawText(g, this.Text, titleFont, new Point(iconPosX, titleFontTop), titleColour);
+ //}
+ //}
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ this.Invalidate();
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Color BackColor { get => base.BackColor; set => base.BackColor = backColour; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ [Category("Appearance")]
+ public ContextMenuStrip TitleContextMenuStrip { get; set; } = null;
+
+ //[Browsable(false)]
+ //public Image AppIcon { get; set; } = null;
+
+ //[Browsable(false)]
+ //public bool IsMaximiseEnabled { get; set; } = false;
+
+ //protected Point DefaultLocation
+ //{
+ // get
+ // {
+ // Point newPosition = new Point(Cursor.Position.X, Cursor.Position.Y);
+ // newPosition.X -= (this.Width / 2);
+ // newPosition.Y -= (this.Height / 2);
+
+ // newPosition.X = Math.Max(newPosition.X, Screen.PrimaryScreen.WorkingArea.Left);
+ // newPosition.Y = Math.Max(newPosition.Y, Screen.PrimaryScreen.WorkingArea.Top);
+
+ // return newPosition;
+ // }
+ //}
+
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TForm));
+ this.SuspendLayout();
+ //
+ // AForm
+ //
+ this.Name = "AForm";
+ this.ResumeLayout(false);
+ }
+
+ private void form_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ isDragging = true;
+ startPosition = e.Location;
+ //startWindowSize = new Point(this.Width, this.Height);
+ }
+ }
+
+ private void form_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (isDragging)
+ {
+ int x = (this.Location.X + (e.Location.X - startPosition.X));
+ int y = (this.Location.Y + (e.Location.Y - startPosition.Y));
+
+ //this.Location = validateFormLocation(x, y);
+ this.Location = new Point(x, y);
+ }
+ }
+
+ private void form_MouseUp(object sender, MouseEventArgs e)
+ {
+ isDragging = false;
+ }
+
+ private void form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ if (e.KeyCode == Keys.Escape)
+ {
+ Application.Exit();
+ }
+ }
+
+ //protected virtual void initialiseLoadComponent()
+ //{
+ // if (DesignMode) return;
+
+ // // close
+ // TImageBox closeBox = generateToolbarImageBox();
+ // closeBox.Image = closeBox.ImageNormal = (enableClose) ? Resources.titlebar_close : Resources.titlebar_blank;
+ // closeBox.ImageHover = (enableClose) ? Resources.titlebar_close3 : Resources.titlebar_blank;
+ // closeBox.ImageSelected = Resources.titlebar_close3;
+ // closeBox.MouseClick += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (e.Button == MouseButtons.Left)
+ // {
+ // if (enableClose)
+ // {
+ // this.Close();
+ // }
+ // }
+ // };
+ // closeBox.Left = this.DisplayRectangle.Width - closeBox.Width - (titleBarIconMarginRight + borderWidth);
+
+ // this.Controls.Add(closeBox);
+
+ // // maximise
+ // TImageBox maximiseBox = generateToolbarImageBox();
+ // maximiseBox.Image = maximiseBox.ImageNormal = (enableMaximise) ? Resources.titlebar_maximise : Resources.titlebar_blank;
+ // maximiseBox.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_blank;
+ // maximiseBox.ImageSelected = Resources.titlebar_maximise3;
+ // maximiseBox.MouseClick += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (!(sender is TImageBox)) return;
+
+ // TImageBox imageBox2 = (sender as TImageBox);
+
+ // if (imageBox2 == null) return;
+
+ // if (e.Button == MouseButtons.Left)
+ // {
+ // if (enableMaximise)
+ // {
+ // if (this.WindowState == FormWindowState.Maximized)
+ // {
+ // this.WindowState = FormWindowState.Normal;
+ // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise;
+ // }
+ // else
+ // {
+ // this.WindowState = FormWindowState.Maximized;
+ // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise5;
+ // }
+ // }
+ // }
+ // else if (e.Button == MouseButtons.Right)
+ // {
+ // this.TopMost = !this.TopMost;
+
+ // if (this.TopMost)
+ // {
+ // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise3;
+ // imageBox2.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_maximise3;
+ // }
+ // else
+ // {
+ // imageBox2.Image = imageBox2.ImageNormal = (enableMaximise) ? Resources.titlebar_maximise : Resources.titlebar_blank;
+ // imageBox2.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_blank;
+ // }
+ // }
+ // };
+ // maximiseBox.Left = closeBox.Left - maximiseBox.Width - titleBarIconMargin;
+
+ // this.Controls.Add(maximiseBox);
+
+ // // minimise
+ // TImageBox minimiseBox = generateToolbarImageBox();
+ // minimiseBox.Image = minimiseBox.ImageNormal = (enableMinimise) ? Resources.titlebar_minimise : Resources.titlebar_blank;
+ // minimiseBox.ImageHover = (enableMinimise) ? Resources.titlebar_minimise5 : Resources.titlebar_blank;
+ // //minimiseBox.ImageSelected = null;
+ // minimiseBox.MouseClick += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (!enableMinimise) return;
+ // if (e.Button != MouseButtons.Left) return;
+
+ // if (closeOnMinimise)
+ // {
+ // this.Close();
+ // }
+ // else
+ // {
+ // this.WindowState = FormWindowState.Minimized;
+ // }
+ // };
+ // minimiseBox.Left = maximiseBox.Left - minimiseBox.Width - titleBarIconMargin;
+
+ // this.Controls.Add(minimiseBox);
+
+ // // resize
+ // UserControl uc1 = new UserControl()
+ // {
+ // Anchor = (AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right),
+ // Height = resizeBorderWidth,
+ // Width = this.DisplayRectangle.Width - resizeBorderWidth,
+ // Left = 0,
+ // Top = this.DisplayRectangle.Height - resizeBorderWidth,
+ // BackColor = Color.Transparent,
+ // Cursor = Cursors.SizeNS
+ // };
+ // uc1.MouseDown += form_MouseDown;
+ // uc1.MouseUp += form_MouseUp;
+ // uc1.MouseMove += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (isDragging)
+ // {
+ // this.Size = new Size(startWindowSize.X, e.Y - startPosition.Y + this.Height);
+ // }
+ // };
+ // uc1.BringToFront();
+
+ // this.Controls.Add(uc1);
+
+ // UserControl uc2 = new UserControl()
+ // {
+ // Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom),
+ // Height = this.DisplayRectangle.Height - resizeBorderWidth,
+ // Width = resizeBorderWidth,
+ // Left = this.DisplayRectangle.Width - resizeBorderWidth,
+ // Top = 0,
+ // BackColor = Color.Transparent,
+ // Cursor = Cursors.SizeWE
+ // };
+ // uc2.MouseDown += form_MouseDown;
+ // uc2.MouseUp += form_MouseUp;
+ // uc2.MouseMove += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (isDragging)
+ // {
+ // this.Size = new Size(e.X - startPosition.X + this.Width, startWindowSize.Y);
+ // }
+ // };
+ // uc2.BringToFront();
+
+ // this.Controls.Add(uc2);
+
+ // UserControl uc3 = new UserControl()
+ // {
+ // Anchor = (AnchorStyles.Bottom | AnchorStyles.Right),
+ // Height = resizeBorderWidth,
+ // Width = resizeBorderWidth,
+ // Left = this.DisplayRectangle.Width - resizeBorderWidth,
+ // Top = this.DisplayRectangle.Height - resizeBorderWidth,
+ // BackColor = Color.Transparent,
+ // Cursor = Cursors.SizeNWSE
+ // };
+ // uc3.MouseDown += form_MouseDown;
+ // uc3.MouseUp += form_MouseUp;
+ // uc3.MouseMove += delegate (object sender, MouseEventArgs e)
+ // {
+ // if (isDragging)
+ // {
+ // this.Size = new Size((e.X - startPosition.X + this.Width), (e.Y - startPosition.Y + this.Height));
+ // }
+ // };
+ // uc3.BringToFront();
+
+ // this.Controls.Add(uc3);
+ //}
+
+ //protected TImageBox generateToolbarImageBox()
+ //{
+ // TImageBox imageBox = new TImageBox();
+ // //imageBox.BackColor = Color.Transparent;
+ // imageBox.BackColorHover = imageBox.BackColorSelected = Color.FromArgb(220, 220, 220);
+ // imageBox.BackgroundImageLayout = ImageLayout.Center;
+ // imageBox.ErrorImage = null;
+ // //imageBox.Image = Resources.close;
+ // //imageBox.ImageHover = Resources.close2;
+ // //imageBox.ImageNormal = Resources.close;
+ // imageBox.ImageSelected = null;
+ // imageBox.IsSelected = false;
+ // //closeBox.Location = new System.Drawing.Point(169, 12);
+ // imageBox.Size = titleBarIconSize;
+ // imageBox.SizeMode = PictureBoxSizeMode.CenterImage;
+ // //imageBox.MouseClick += new MouseEventHandler(closeBox_MouseClick);
+ // //imageBox.Left = this.DisplayRectangle.Width - imageBox.Width - 17;
+ // imageBox.Top = (int)Math.Floor((decimal) (titleBarHeight - titleBarIconSize.Height) / 2) + borderWidth;
+ // imageBox.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
+ // imageBox.Padding = new Padding(0);
+
+ // return imageBox;
+ //}
+
+ //private void exitToolStripMenuItem_Click(object sender, EventArgs e) => this.Close();
+
+ //private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
+ //{
+ // if (e.Button == MouseButtons.Left)
+ // {
+ // this.Visible = !this.Visible;
+ // }
+
+ // //notifyIcon1.Visible = !this.Visible;
+ //}
+
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/TForm.resx b/RyzStudio/Windows/Forms/TForm.resx
new file mode 100644
index 0000000..b723165
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TForm.resx
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 17, 17
+
+
+ 130, 17
+
+
+
+
+ AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
+ IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxc
+ VU5rW1Tna1tU22paU5BsXVVCgEBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAaltTZWtbVPxrW1T/a1tU/2tbVP9rW1T/a1tU7mtbU6VrXFNWbVtbDgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABqWlR/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU+Wta
+ VLprW1Nrb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2tbVJhrW1T/a1tU/2tbVP+NgXz/2NPR/6+mov+Bc23/a1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVc1sXFSAa1xSMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtSUkHa1xUqmtbVP9rW1T/a1tU/5iNiP/6+fn/////////
+ ////////6+no/7+4tf+Sh4L/bV5X/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVOFrXFOZallTTW1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlaWhFqW1TCa1tU/2tbVP9rW1T/o5mV//38
+ /P//////////////////////////////////////9PPy/8jDwP+cko3/c2Nd/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/a1tU/2tbVPVrW1SzalxUXmlaWhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalhYHWtbVNRrW1T/a1tU/2tb
+ VP+1rar/////////////////////////////////////////////////////////////////+vn5/9LN
+ y/+lm5f/eGpj/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVPtrWlS9bFxVb2xdVSEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrWVMra1tU42tb
+ VP9rW1T/bV1W/8S9u///////////////////////////////////////////////////////////////
+ /////////////////////////v7+/97a2f+xqKT/g3Zw/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tb
+ VP5qW1V4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpZ
+ VTxrW1Tua1tU/2tbVP9wYVr/0czK////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////+ro5/+8tbL/j4N+/21d
+ Vv9rW1T/a1tU/2tbVP9rW1TpAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAbFxTUGtbVPZrW1T/a1tU/3VnYP/d2df/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////Tz8v/Iw8D/dmdh/2tbVP9rW1T/blpTJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU+2tbVP9rW1T/emxl/+Th4P//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////m5CL/2tbVP9rW1T/a1tTXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtaVHdrW1T/a1tU/2tbVP+DdnD/7uzs/////////////Pvw//z6
+ 7v/8+u7//Pru//z67v/8+u7//Pru//z67v/9/PT///////////////////////z4+f/79fX/+/X1//v1
+ 9f/79fX/+/X1//v19f/79fX//Pb2////////////////////////////vLWy/2tbVP9rW1T/a1xTmQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDa1tUmGtbVP9rW1T/a1tU/4t/ev/08/L/////////
+ ///cyT7/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/6Nt+////////////4bG1/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/9KKkP//////////////////////3tvZ/2tb
+ VP9rW1T/a1tU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Sra1tU/2tbVP9rW1T/mY6J//r5
+ +f////////////389f/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28Y1////
+ ////////0IWL/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/9+fn/////////
+ /////////Pz8/3BhWv9rW1T/a1tU/nFVVRIAAAAAAAAAAAAAAAAAAAAAaVpaEWtcVMNrW1T/a1tU/2tb
+ VP+kmpb//fz8//////////////////389P/RtwD/0bcA/+TVbP/w56r/8Oeq//Dnqv/w56r/8Oeq/93K
+ Qv/RtwD/28Y1////////////0IWL/8RlbP/TjZL/68zO/+vMzv/rzM7/68zO/+vMzv/dpqr/xGVs/8Rl
+ bP/8+Pn//////////////////////46CfP9rW1T/a1tU/2xbVEkAAAAAAAAAAAAAAABsWFgaa1xU0Wtb
+ VP9rW1T/a1tU/7CopP////////////////////////////389P/RtwD/0bcA/+7lov//////////////
+ /////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////////////////////
+ ///px8n/xGVs/8RlbP/8+Pn//////////////////////7CopP9rW1T/a1tU/2tbVIMAAAAAAAAAAAAA
+ AABqXFTOa1tU/2tbVP9tXlf/xr+9//////////////////////////////////389P/RtwD/0bcA/+7l
+ ov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX/////////
+ ///////////////////px8n/xGVs/8RlbP/8+Pn//////////////////////9LNy/9rW1T/a1tU/2tb
+ VL8AAAAAAAAAAAAAAABrW1Tva1tU/2tbVP/KxML///////////////////////////////////////38
+ 9P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8Rl
+ bP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn///////////////////////Py
+ 8v9sXFX/a1tU/2tbVPRmZmYFAAAAAAAAAABrW1W4a1tU/2tbVP/Oycf/////////////////////////
+ //////////////389P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////
+ ////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn/////////
+ //////////////////+CdG7/a1tU/2tbVP9sXVM0AAAAAAAAAABqWlR/a1tU/2tbVP+tpKD/////////
+ //////////////////////////////389P/RtwD/0bcA/+7lov///////////////////////////+PT
+ Y//RtwD/28Y1////////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8Rl
+ bP/8+Pn///////////////////////////+jmZX/a1tU/2tbVP9rWlNuAAAAAAAAAABtWlNEa1tU/2tb
+ VP+Lfnn///////////////////////////////////////389P/RtwD/0bcA/93JQf/j1Gb/49Rm/+PU
+ Zv/j1Gb/49Rm/9jCJ//RtwD/28Y1////////////0IWL/8RlbP/NfYL/3KOn/9yjp//co6f/3KOn/9yj
+ p//TjJH/xGVs/8RlbP/8+Pn////////////////////////////Fv7z/a1tU/2tbVP9qW1OoAAAAAAAA
+ AABqVVUMa1tU+2tbVP9uXlf/+fn4//////////////////////////////////389P/RtwD/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28c5////////////0IWL/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8Rmbf/9+vr////////////////////////////n5eT/a1tU/2tb
+ VP9rW1TkAAAAAAAAAAAAAAAAa1tUz2tbVP9rW1T/3NjW//////////////////////////////////38
+ 9v/axTP/2sUz/9rFM//axTP/2sUz/9rFM//axTP/2sUz/9rFM//bxzj/8Ois////////////2p2i/9CE
+ if/QhIn/0ISJ/9CEif/QhIn/0ISJ/9CEif/QhIn/0ISJ/+GwtP//////////////////////////////
+ ///+/v7/dWdg/2tbVP9rW1T/alhYHQAAAAAAAAAAa1tUlGtbVP9rW1T/ubKv////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////l4uG/2tbVP9rW1T/a1pUWAAAAAAAAAAAbFtVWmtbVP9rW1T/mI2I////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////uLGt/2tbVP9rW1T/a1tUkgAAAAAAAAAAa1pSH2tb
+ VP9rW1T/dmdh//7+/v////////////////////////////////+rnPH/fGTp/3xk6f98ZOn/fGTp/3xk
+ 6f98ZOn/fGTp/3xk6f9/aOr/ysD2////////////rOH9/zi4+v8ztvr/M7b6/zO2+v8ztvr/M7b6/zO2
+ +v8ztvr/M7b6/33R/P//////////////////////////////////////2tbV/2tbVP9rW1T/a1tVzQAA
+ AAAAAAAAAAAAAGtbVONrW1T/a1tU/+jm5f////////////////////////////r5/v9cPuT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/gGjq////////////Obj6/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/AKT5/wGk+f/3/P//////////////////////////////////+vn5/25f
+ WP9rW1T/a1tU/GpVVQwAAAAAAAAAAGtcVKprW1T/a1tU/8bAvf////////////////////////////j3
+ /v9bPeT/Wz3k/4Vu6/+di+//nYvv/52L7/+di+//nYvv/3Rb6P9bPeT/fWXq////////////Nbf6/wCk
+ +f8nsvr/Zsj7/2bI+/9myPv/Zsj7/2bI+/9Bu/v/AKT5/wCk+f/0+///////////////////////////
+ /////////////4p9eP9rW1T/a1tU/2xdVUIAAAAAAAAAAGtbVHBrW1T/a1tU/6Sblv//////////////
+ //////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////
+ ////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////
+ /////////////////////////////6yjn/9rW1T/a1tU/2pcVH0AAAAAAAAAAGxdUzRrW1T/a1tU/4J0
+ bv////////////////////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI
+ 7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk
+ +f/0+////////////////////////////////////////87Jx/9rW1T/a1tU/2tbVbgAAAAAAAAAAGZm
+ ZgVrW1T0a1tU/2xcVf/z8vL///////////////////////j3/v9bPeT/Wz3k/8O49f//////////////
+ /////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////////////////////
+ //+i3v3/AKT5/wCk+f/0+////////////////////////////////////////8rEwv9rW1T/a1tU/2tb
+ VO8AAAAAAAAAAAAAAABrW1S/a1tU/2tbVP/Szcv///////////////////////j3/v9bPeT/Wz3k/8O4
+ 9f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v/////////
+ //////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////////////xr+9/21e
+ V/9rW1T/a1tU/2pcVM4AAAAAAAAAAAAAAABrWlSFa1tU/2tbVP+xqaX///////////////////////j3
+ /v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk
+ +f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////
+ //+6sq//bFxV/2tbVP9rW1T/a1tT1m9eVR4AAAAAAAAAAAAAAABpXFVLa1tU/2tbVP+Pg37/////////
+ //////////////j3/v9bPeT/Wz3k/6CP7//Ivvb/yL72/8i+9v/Ivvb/yL72/4Vv6/9bPeT/fWXq////
+ ////////Nbf6/wCk+f9CvPv/quH9/6rh/f+q4f3/quH9/6rh/f9sy/z/AKT5/wCk+f/0+///////////
+ /////////f39/6ifmv9rW1T/a1tU/2tbVP9rW1TIZllZFAAAAAAAAAAAAAAAAAAAAABpWloRa1tU/Wtb
+ VP9wYVr//Pv7//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/fWXq////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f/1+//////////////7+vr/nZKO/2tbVP9rW1T/a1tU/2tcVbJmZk0KAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tT1mtbVP9rW1T/4Nzb//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9
+ 5P9bPeT/Wz3k/1s95P9bPeT/rJ3x////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/AKT5/z66+v////////////b19P+Pg37/a1tU/2tbVP9rW1T/a1tTn4BAQAQAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa1pUm2tbVP9rW1T/vbaz//////////////////7+///08v3/9PL9//Ty
+ /f/08v3/9PL9//Ty/f/08v3/9PL9//Ty/f/49/7/////////////////8vr//+75///u+f//7vn//+75
+ ///u+f//7vn//+75///u+f//8Pr/////////////8O/u/4Z5dP9rW1T/a1tU/2tbVP9rXFSIAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbFxUYWtbVP9rW1T/nJGM////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////n5eT/fG5o/2tbVP9rW1T/a1tU/Gta
+ VWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAblpTJWtbVP9rW1T/dmdh/8jD
+ wP/08/L/////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////93Z1/91Z2D/a1tU/2tb
+ VP9rW1T2bFxTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWtb
+ VOlrW1T/a1tU/2tbVP9tXVb/j4N+/7y1sv/q6Of/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////0czK/3Bh
+ Wv9rW1T/a1tU/2tbVO5qWVU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGpbVXhrW1T+a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/g3Zw/7GopP/e2tn//v7+////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///Evbv/bV1W/2tbVP9rW1T/a1tU42tZUysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsXVUhbFxVb2taVL1rW1T7a1tU/2tbVP9rW1T/a1tU/2tb
+ VP9rW1T/eGpj/6Wbl//Szcv/+vn5////////////////////////////////////////////////////
+ /////////////7Wtqv9rW1T/a1tU/2tbVP9rW1TUalhYHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpWloRbFpUVWtb
+ U6JrW1Twa1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/cGFa/5KHgv+/uLX/8O/u////////////////////
+ ///////////////////9/f3/p56a/2tbVP9rW1T/a1tU/2pbVcdmWVkUAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABVVVUDallVPGtbVJFrW1Pia1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/bFxV/4l8
+ dv+1ran/4d7d//////////////////v6+v+cko3/a1tU/2tbVP9rW1T/a1tUsXFVVQkAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa1xSMmxcVIBrW1XNa1tU/2tb
+ VP9rW1T/a1tU/2tbVP9rW1T/a1tU/4Fzbf+vpqL/2NPR/42BfP9rW1T/a1tU/2tbVP9rW1SYVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAb15VHmtbU2trWlS6a1tU+WtbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2pa
+ VH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbVtbDmtcU1ZrW1Ola1tU7mtbVP9rW1T/a1tU/2tb
+ VP9rW1T8altTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBABGxd
+ VUJqWlOQa1tU22tbVOdsXFVOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4H///+sEP//AD///6wQ//4AB///rBD/+AAA//+sEP/w
+ AAAP/6wQ/+AAAAH/rBD/wAAAAD+sEP+AAAAAH6wQ/wAAAAAPrBD+AAAAAA+sEPwAAAAAD6wQ+AAAAAAP
+ rBDgAAAAAA+sEMAAAAAAB6wQgAAAAAAHrBAAAAAAAAesEAAAAAAAB6wQAAAAAAADrBAAAAAAAAOsEAAA
+ AAAAA6wQAAAAAAADrBAAAAAAAAOsEIAAAAAAAawQgAAAAAABrBCAAAAAAAGsEIAAAAAAAawQwAAAAAAA
+ rBDAAAAAAACsEMAAAAAAAKwQwAAAAAAArBDAAAAAAACsEOAAAAAAAKwQ4AAAAAAArBDgAAAAAAGsEOAA
+ AAAAA6wQ8AAAAAAHrBDwAAAAAA+sEPAAAAAAP6wQ8AAAAAB/rBDwAAAAAP+sEPgAAAAB/6wQ/AAAAAP/
+ rBD/gAAAB/+sEP/wAAAP/6wQ//8AAB//rBD//+AAf/+sEP///AD//6wQ////gf//rBAoAAAAIAAAAEAA
+ AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABsXFRha1tU7GtbVcFqW1RzalxVJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVe2tbVP5rW1T/a1tU/2tbVP9rW1T/a1tT1mtcVIhrWVU5gICAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2xbVJVrW1T/bV5X/8K7uf/RzMr/pJqW/3hpY/9rW1T/a1tU/2tb
+ VP9rW1TpalxTnGxcVU5mZk0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Spa1tU/29fWf/Oycf//////////////////v7+/+He
+ 3f+1ran/iXx2/2tbVP9rW1T/a1tU/2tbVPZqW1W7bFxVb2xYWBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYFAQbFxUwGtbVP91ZmD+3trZ////////////////////
+ ////////////////////////6efm/7y0sf+Ogn3/bV1W/2tbVP9rW1T/a1tU/WtbVMZrWlR3ZlVVDwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2tbVNJrW1T/fW9p/+fl5P//////////////
+ ///////////////////////////////////////////////////z8vL/x8G//5uQi/9xYlv/a1tU/2tb
+ VP9rW1SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpdVylrW1Tha1tU/4V4cv/w7u7/////////
+ //////////////////////////////////////////////////////////////////////////////r6
+ +v/Evbv/a1tU/2xbVMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrXVM3a1tU62tbVP+MgHr/9PPy////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////v6+v9vX1n/a1tU+2pVVQwAAAAAAAAAAAAAAAAAAAAAallTTWtbVPVrW1T/mY6K//r5
+ +f///v3/1r8d/9G3AP/RtwD/0bcA/9G3AP/RtwD/07oL//r34//57u//x2xy/8RlbP/EZWz/xGVs/8Rl
+ bP/EZWz/y3d9///+/v///////////4yAev9rW1T/alpSQQAAAAAAAAAAAAAAAGpaVWBrW1T7a1tU/6mg
+ nP/+/v7///////799//RtwD/2cMr/+PUZv/j1Gb/49Rm/9zIPP/RtwD/9vHM//Pg4v/EZWz/0omP/9yj
+ p//co6f/3KOn/85/hf/EZWz//fr6////////////rqai/2tbVP9sW1V7AAAAAAAAAABrW1R5a1tU/2xc
+ Vf+4sa3//////////////////v33/9G3AP/k1Wz/////////////////7OGW/9G3AP/28cz/8+Di/8Rl
+ bP/nwML/////////////////3aaq/8RlbP/9+vr////////////RzMn/a1tU/2pbVLYAAAAAAAAAAGtb
+ VO5rW1T/w726///////////////////////+/ff/0bcA/+TVbP/////////////////s4Zb/0bcA//bx
+ zP/z4OL/xGVs/+fAwv/////////////////dpqr/xGVs//36+v////////////Lw8P9rW1T/a1tU74CA
+ gAIAAAAAa1tUxWtbVP/Z1dP///////////////////////799//RtwD/5NVs/////////////////+zh
+ lv/RtwD/9vHM//Pg4v/EZWz/58DC/////////////////92mqv/EZWz//fr6/////////////////4By
+ bP9rW1T/aF1RLAAAAABqXFSLa1tU/7iwrf///////////////////////v33/9G3AP/dyUH/7eKZ/+3i
+ mf/t4pn/4dBa/9G3AP/28cz/8+Di/8RlbP/Zm6D/58HE/+fBxP/nwcT/04yR/8RlbP/9+vr/////////
+ ////////opeT/2tbVP9qW1NlAAAAAGtbVVFrW1T/louG///////////////////////+/ff/0bcA/9G3
+ AP/RtwD/0bcA/9G3AP/RtwD/0bcB//n12//z4OL/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/x2xy//79
+ /f/////////////////Dvbr/a1tU/2tbU58AAAAAaF1RFmtbVP90ZV///v7+///////////////////+
+ /f/28cz/9vHM//bxzP/28cz/9vHM//bxzP/49dr///////35+f/z4OL/8+Di//Pg4v/z4OL/8+Di//Pg
+ 4v/47e7//////////////////////+Xi4f9rW1T/altU2gAAAAAAAAAAa1xT3GtbVP/m4+L/////////
+ /////////////+zp/P/e2Pr/3tj6/97Y+v/e2Pr/3tj6/+fj+////////////9ry/v/M7f7/zO3+/8zt
+ /v/M7f7/zO3+/+L1/v///////////////////////v7+/3VmX/9rW1T+aF1RFgAAAABsWlSha1tU/8S+
+ u//////////////////8/P//YkXl/1s95P9bPeT/Wz3k/1s95P9bPeT/XD7k/+jk+//b8v7/AaT5/wCk
+ +f8ApPn/AKT5/wCk+f8ApPn/C6j5//v+////////////////////////lYmE/2tbVP9rWlRPAAAAAGpc
+ VGdrW1T/o5mU//////////////////r5/v9bPeT/hW7r/72x9P+9sfT/vbH0/5WB7v9bPeT/3tj6/8zt
+ /v8ApPn/WsT7/5nb/f+Z2/3/mdv9/0G7+/8ApPn/9/z///////////////////////+2r6v/a1tU/2pb
+ VIkAAAAAaF1RLGtbVP+Acmz/////////////////+vn+/1s95P+gj+//////////////////u6/0/1s9
+ 5P/e2Pr/zO3+/wCk+f+W2v3/////////////////bMv8/wCk+f/3/P///////////////////////9nV
+ 0/9rW1T/a1tUxQAAAACAgIACa1tU72tbVP/y8PD////////////6+f7/Wz3k/6CP7///////////////
+ //+7r/T/Wz3k/97Y+v/M7f7/AKT5/5ba/f////////////////9sy/z/AKT5//f8////////////////
+ ////////w726/2tbVP9rW1TuAAAAAAAAAABqW1S2a1tU/9HMyf////////////r5/v9bPeT/oI/v////
+ /////////////7uv9P9bPeT/3tj6/8zt/v8ApPn/ltr9/////////////////2zL/P8ApPn/9/z/////
+ /////////////7ixrf9sXFX/a1tU/2tbVHkAAAAAAAAAAGpcVH1rW1T/r6ej////////////+vn+/1s9
+ 5P93Xun/nYvv/52L7/+di+//gmvq/1s95P/e2Pr/zO3+/wCk+f88ufr/Zsj7/2bI+/9myPv/K7P6/wCk
+ +f/3/P////////7+/v+upaH/a1tU/2tbVPxqXFRnAAAAAAAAAAAAAAAAa1tUQ2tbVP+NgXz/////////
+ ///6+f7/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/YkXl/+3q/P/M7f7/AKT5/wCk+f8ApPn/AKT5/wCk
+ +f8ApPn/Ha76//3+///7+vr/nZOO/2tbVP9rWlT4altVVAAAAAAAAAAAAAAAAAAAAAB0XV0La1tU+29f
+ Wf/7+vr/////////////////////////////////////////////////////////////////////////
+ ////////////////////////9vX0/5CEfv9rW1T/bFxU72pZVTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABsW1TMa1tU/8S9u//6+vr/////////////////////////////////////////////////////////
+ //////////////////////////////Du7v+FeHL/a1tU/2tbVOFqXVcpAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtbVI9rW1T/a1tU/3FiW/+bkIv/x8G///Py8v//////////////////////////////
+ ///////////////////////////////////n5eT/fW9p/2tbVP9rW1TSaF5VGwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAZlVVD2taVHdrW1TGa1tU/WtbVP9rW1T/bV1W/46Cff+8tLH/6efm////
+ ////////////////////////////////////////3trZ/3ZnYf9rW1T/bFxUwHBgUBAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmWVkUalxUXmtcVKprW1Tya1tU/2tb
+ VP9rW1T/f3Fr/6uinv/Y09H//fz8/////////////////9LNy/9xYVv/a1tU/2paVa9xVVUJAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZm
+ TQpsXFVOalxTnGtbVOlrW1T/a1tU/2tbVP94aWP/pJqW/9HMyv/Cu7n/bV5X/2tbVP9sW1SVVVVVAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAgICAAmtZVTlrXFSIa1tT1mtbVP9rW1T/a1tU/2tbVP9rW1T+bFtVewAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalxVJGpbVHNrW1XBa1tU7Gxc
+ VGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g////wA///wAB//4A
+ AD/8AAAH+AAAB/AAAAfgAAADwAAAA4AAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAGAAAAAgAAAAIAA
+ AACAAAAAgAAAAMAAAADAAAABwAAAA8AAAAfgAAAP4AAAH+AAAD/8AAB//4AA///wA////wf/KAAAABgA
+ AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa1tTa2xcVfBsXFW1bFpVZmZcUhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrWlSFa1tU/4+Dfv+AcWv8a1tU/2tb
+ VP5tXlbMa1xUemxbVS0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAVVVVA2xbVJprW1T/qqCc//7+/v//////6+no/7+4tf+RhoH9bF1W/mtbVP9tXlbia1xTmWpZ
+ U02AVVUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0XV0LbFxVtWxcVf+5sq//////////
+ ////////////////////////8/Hx/8bAvf+Zjor/cGBa/WtbVP9tXVbxaltUo2heVRsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGZZWRRtXFbKbV1W/sjCv///////////////////////////////////////////////
+ ////////+vn5/9LNy/+mnJj/bV1W/WtbVIMAAAAAAAAAAAAAAAAAAAAAaFhYIG1eV9pvYFn808/N////
+ ////////////////////////////////////////////////////////////////////////in55/W1d
+ Vr4AAAAAAAAAAAAAAABoXVEsbV5X53NlXvzd2tj//v78/9S8EP/RtwD/0bcA/9G3AP/RtwD/8Oit/+zN
+ 0P/EZWz/xGVs/8RlbP/EZWz/yG91//79/f//////raSg/2xcVfaAQEAEAAAAAGxcVEBtXVbzfG5n++jm
+ 5f///////v35/9G3AP/v5qf/9vHM//bxzP/Ywij/7eKZ/+fBxP/NfYP/8+Di//Pg4v/rysz/xGVs//77
+ /P//////z8rH/2tbVP9rXFIyAAAAAG1dVe2CdW/98O/u/////////////v35/9G3AP/38tH/////////
+ ///axTL/7eKZ/+fBxP/Qg4n////////////04+T/xGVs//77/P//////8fDv/2tbVP9sW1RtAAAAAG5e
+ Vs+ViYT+/////////////////v35/9G3AP/38tH////////////axTL/7eKZ/+fBxP/Qg4n/////////
+ ///04+T/xGVs//77/P///////////31waftqW1OoAAAAAGxaU5NyY138/v7+/////////////v35/9G3
+ AP/Zwyr/2sUz/9rFM//Tugr/7eOb/+fBxP/Ga3L/0ISJ/9CEif/OfoT/xGVs//78/P///////////6CW
+ kv9tXlflAAAAAGpcU1lrW1T/5ePh//////////////79/+3imf/t4pn/7eKZ/+3imf/t4pr/+/nr//bm
+ 5//nwcT/58HE/+fBxP/nwcT/7M3P/////////////////8K7uf9rW1T/alhYHW9eVR5rW1T/w726////
+ /////////////8rA9v+9sfT/vbH0/72x9P++svT/8vD9/+v4//+a2/3/mdv9/5nb/f+Z2/3/rOH9////
+ /////////////+Th4P9rW1T/bFtVVwAAAABtXlfnopeT/////////////Pv+/1s95P92Xej/fGTp/3xk
+ 6f9hReX/v7P0/5vb/f8KqPn/M7b6/zO2+v8qs/r/AKT5//r9//////////////7+/v9yY1z8a1tUkQAA
+ AABqW1OofXBp+///////////+/r+/1s95P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr/////////
+ ///R7/7/AKT5//n9//////////////////+ViYT+bl5WzwAAAABsW1Rta1tU//Hw7///////+/r+/1s9
+ 5P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr////////////R7/7/AKT5//n9//////////////Dv
+ 7v+CdW/9bV1V7QAAAABsXVM0a1tU/9DLyf//////+/r+/1s95P/GvPb/3tj6/97Y+v91W+j/vbH0/5nb
+ /f8osvr/zO3+/8zt/v+n4P3/AKT5//n9////////6+no/35wavxsXVX1altURgAAAACAQEAEbV1W9q6m
+ ov//////+/r+/1s95P9bPeT/Wz3k/1s95P9bPeT/ysH2/5nb/f8ApPn/AKT5/wCk+f8ApPn/EKr5//z+
+ ///g3dv/dmdh/G1dVuptWFMxAAAAAAAAAAAAAAAAbFxVv4x/ev3/////////////////////////////
+ /////////////////////////////////////////////9jT0f9xYVv8bV5W32pcVSQAAAAAAAAAAAAA
+ AAAAAAAAa1tUg21dVv2mnJj/0s3L//r5+f//////////////////////////////////////////////
+ ////////yMK//21dVv5tXFbKZllZFAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2pbVKNsXFXwa1tU/3Bg
+ Wv2Zjor+xsC9//Px8f////////////////////////////////+5sq//bFxV/2xcVbV0XV0LAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDallVPGtcVIhtXVbba1tU/2tbVP6Ie3X9ta2p/+He
+ 3f///////v7+/66mov9rW1T/bFpUoWZmZgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbFtVLWtcVHpsXVXLa1tU/mtbVP9/cWv7j4N+/2tbVP9rWlSFAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAZlxSGWxaVWZsXFW1bFxV8GtbU2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8H
+ /0H8AP9B+AAPQfAAA0HgAANBwAADQYAAAUEAAAFBAAABQQAAAUEAAAFBAAAAQQAAAEGAAABBgAAAQYAA
+ AEGAAABBgAABQcAAA0HAAAdBwAAPQfAAH0H/AD9B/+D/QSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhW3tvYFn0dWZgsmxbVVdmVVUPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAnFiW5eCdG705OHg/8a/vf+UiYT0cWFa+Xdo
+ YcptXFVsb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAbUlJB3NkXbKMgHr09/b2//////////////////r5
+ +f/Szcv/oJeS9XNlXfZzZV7baVxVJwAAAAAAAAAAbVtbDnNjXciZj4n1+/r6////////////////////
+ ///////////////////+/v7/pJqW+WxdVnYAAAAAamBVGHJkXdmnnpn2/f37/9S8E//axTP/2MIo/+XX
+ cP/eqa3/zX2D/9CEif/IcHf//v39/83Ixf92Z2C8AAAAAHJjXOC5sK36//////7++//bxjb///////Xw
+ yv/k1Gf/3KOn//Pf4P//////0IaL//79/f/w7u7/cWFb8gAAAAF0Zl/i4+Df///////+/vv/2cMr//bx
+ zP/u5aL/5NRn/9yjp//px8n/8+Di/85/hf/+/f3//////3hpYvNuWlMldGReo8K7uf////////79/+PU
+ Zv/j1Gb/49Rm//Dorv/qyMv/3KOn/9yjp//eqKz///7+//////+ajoryalxUXmpaVWCbkYzz//////7+
+ //+ikfD/nYvv/52L7//Lwfb/ruL9/2bI+/9myPv/b8z8//7/////////wbq3/3RlXqJuWlMleGli8///
+ ///8/P//d17p/97Y+v/DuPX/nYvv/2fJ+/+i3v3/zO3+/yuz+v/7/v///////+Pg3/90Zl/iAAAAAXFh
+ W/Lw7u7//Pz//35m6v//////3df5/52L7/9nyfv/yuz+//////82t/r/+/7///////+5sK36cmNc4AAA
+ AAB2Z2G+zsnH//z8//9iReX/fGTp/3Vb6P+jkvD/Z8n7/yiy+v8ztvr/E6v5//v9/v+to5/4c2Nd3m1b
+ UhwAAAAAbF1WdqSalvn+/v7///////////////////////////////////////v6+v+Zj4r2c2ReyW1b
+ Ww4AAAAAAAAAAGlcVSdzZV7bc2Vd9qCXkvXSzcv/+vn5//////////////////f29v+MgHr0c2Rdsm1J
+ SQcAAAAAAAAAAAAAAAAAAAAAAAAAAG9eVR5rW1NrdGRexnBhWfiShoHvxr+9/uTh4P+CdG70c2RdmYCA
+ gAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmVVUPbFtVV3VmYLJvYFn0cmFbewAA
+ AAAAAAAAAAAAAAAAAAAAAAAA+D+sQeAHrEHAAaxBgAGsQQABrEEAAKxBAACsQQAArEEAAKxBAACsQQAA
+ rEGAAKxBgAGsQYADrEHgB6xB/B+sQQ==
+
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs b/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs
new file mode 100644
index 0000000..1058088
--- /dev/null
+++ b/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs
@@ -0,0 +1,37 @@
+namespace RyzStudio.Windows.Forms
+{
+ partial class THorizontalSeparator
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ }
+
+ #endregion
+ }
+}
diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.cs b/RyzStudio/Windows/Forms/THorizontalSeparator.cs
new file mode 100644
index 0000000..1be87f2
--- /dev/null
+++ b/RyzStudio/Windows/Forms/THorizontalSeparator.cs
@@ -0,0 +1,101 @@
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.Forms
+{
+ public partial class THorizontalSeparator : System.Windows.Forms.UserControl
+ {
+ public THorizontalSeparator()
+ {
+ InitializeComponent();
+
+ this.BackColor = Color.Transparent;
+ this.Margin = new Padding(10, 0, 10, 0);
+ this.MaximumSize = new Size(SystemInformation.VirtualScreen.Width, 22);
+ this.MinimumSize = new Size(0, 22);
+ this.Padding = new Padding(0, 10, 0, 10);
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs e)
+ {
+ base.OnPaintBackground(e);
+
+ Graphics g = e.Graphics;
+
+ g.FillRectangle(new SolidBrush(Color.FromArgb(213, 223, 229)), new Rectangle(this.DisplayRectangle.Left, 11, this.DisplayRectangle.Width, 1));
+ g.FillRectangle(new SolidBrush(Color.FromArgb(249, 251, 253)), new Rectangle(this.DisplayRectangle.Left, 12, this.DisplayRectangle.Width, 1));
+ }
+
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new BorderStyle BorderStyle { get => base.BorderStyle; set => base.BorderStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Font Font { get => base.Font; set => base.Font = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Color BackColor { get => base.BackColor; set => base.BackColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Color ForeColor { get => base.ForeColor; set => base.ForeColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override AutoValidate AutoValidate { get => base.AutoValidate; set => base.AutoValidate = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override ContextMenuStrip ContextMenuStrip { get => base.ContextMenuStrip; set => base.ContextMenuStrip = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get => base.Margin; set => base.Margin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new DockStyle Dock { get => base.Dock; set => base.Dock = value; }
+
+ }
+}
diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.resx b/RyzStudio/Windows/Forms/THorizontalSeparator.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/Forms/THorizontalSeparator.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/TImageBox.cs b/RyzStudio/Windows/Forms/TImageBox.cs
new file mode 100644
index 0000000..09f7bbe
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TImageBox.cs
@@ -0,0 +1,84 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class TImageBox : System.Windows.Forms.PictureBox
+ {
+ public TImageBox() : base()
+ {
+ this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.ErrorImage = null;
+ this.InitialImage = null;
+ this.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ }
+
+ protected override void OnCreateControl()
+ {
+ OnMouseLeave(null);
+
+ base.OnCreateControl();
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Color BackColor { get => base.BackColor; set => base.BackColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Image Image { get => base.Image; set => base.Image = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Color BackColorNormal { get; set; } = Color.Transparent;
+
+ [Category("Appearance"), Browsable(true)]
+ public Color BackColorHover { get; set; } = Color.Transparent;
+
+ [Category("Appearance"), Browsable(true)]
+ public Color BackColorSelected { get; set; } = Color.Transparent;
+
+ [Category("Appearance"), Browsable(true)]
+ public Image ImageNormal { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image ImageHover { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image ImageSelected { get; set; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public Image NormalImage { get => this.ImageNormal; set => this.ImageNormal = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public Image HoverImage { get => this.ImageHover; set => this.ImageHover = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public Image SelectedImage { get => this.ImageSelected; set => this.ImageSelected = value; }
+
+ public bool IsSelected { get; set; } = false;
+
+ protected override void OnMouseEnter(EventArgs e)
+ {
+ this.Image = this.ImageHover;
+ this.BackColor = this.BackColorHover;
+
+ base.OnMouseEnter(e);
+ }
+
+ protected override void OnMouseLeave(EventArgs e)
+ {
+ this.Image = (this.IsSelected ? this.ImageSelected : this.ImageNormal);
+ this.BackColor = (this.IsSelected ? this.BackColorSelected : this.BackColorNormal);
+
+ base.OnMouseLeave(e);
+ }
+
+ protected override void OnLostFocus(EventArgs e)
+ {
+ this.Image = (this.IsSelected ? this.ImageSelected : this.ImageNormal);
+ this.BackColor = (this.IsSelected ? this.BackColorSelected : this.BackColorNormal);
+
+ base.OnLostFocus(e);
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/Forms/TPanelBook.cs b/RyzStudio/Windows/Forms/TPanelBook.cs
new file mode 100644
index 0000000..eae6a0f
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TPanelBook.cs
@@ -0,0 +1,258 @@
+namespace RyzStudio.Windows.Forms
+{
+ using System;
+ using System.Collections;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Windows.Forms;
+
+ [ToolboxItem(true)]
+ public class TPanelBook : UserControl
+ {
+ public class PanelCollection : CollectionBase
+ {
+ protected TPanelBook panelBook = null;
+
+ public PanelCollection(TPanelBook parentPanelBook) : base()
+ {
+ panelBook = parentPanelBook;
+ }
+
+ public TPanelBook Parent => panelBook;
+
+ public Panel this[int index] { get => (Panel)List[index]; set => List[index] = value; }
+
+ public int Add(Panel value) => List.Add(value);
+
+ public void AddRange(Panel[] pages) => Array.ForEach(pages, x => this.Add(x));
+
+ public bool Contains(Panel value) => List.Contains(value);
+
+ public int IndexOf(Panel value) => List.IndexOf(value);
+
+ public void Insert(int index, Panel value) => List.Insert(index, value);
+
+ public void Remove(Panel value) => List.Remove(value);
+
+ protected override void OnInsertComplete(int index, object value)
+ {
+ base.OnInsertComplete(index, value);
+
+ if (panelBook != null)
+ {
+ panelBook.PageIndex = index;
+ }
+ }
+
+ protected override void OnRemoveComplete(int index, object value)
+ {
+ base.OnRemoveComplete(index, value);
+
+ if (panelBook != null)
+ {
+ if (panelBook.PageIndex == index)
+ {
+ if (index < InnerList.Count)
+ {
+ panelBook.PageIndex = index;
+ }
+ else
+ {
+ panelBook.PageIndex = InnerList.Count - 1;
+ }
+ }
+ }
+ }
+
+ }
+
+ private System.ComponentModel.IContainer components = null;
+
+ protected PanelCollection panelCollection = null;
+
+ public TPanelBook()
+ {
+ InitializeComponent();
+
+ panelCollection = new PanelCollection(this);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+
+ base.Dispose(disposing);
+ }
+
+ protected void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public Panel ActivePanel { get; protected set; } = null;
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; }
+
+ [Category("Collection")]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
+ public PanelCollection Pages => panelCollection;
+
+ [Category("Collection")]
+ public int SelectedIndex
+ {
+ get => (panelCollection.Count <= 0) ? -1 : panelCollection.IndexOf(this.ActivePanel);
+ set
+ {
+ if (panelCollection.Count <= 0) return;
+ if (value < 0) return;
+ if (value > (panelCollection.Count - 1)) return;
+ if (value == this.SelectedIndex) return;
+
+ ActivatePage(value);
+ }
+ }
+
+ protected internal int PageIndex
+ {
+ get => panelCollection.IndexOf(this.ActivePanel);
+ set
+ {
+ if (panelCollection.Count <= 0)
+ {
+ ActivatePage(-1);
+ return;
+ }
+
+ if ((value < -1) || (value >= panelCollection.Count))
+ {
+ throw new ArgumentOutOfRangeException("PageIndex", value, "The page index must be between 0 and " + Convert.ToString(panelCollection.Count - 1));
+ }
+
+ ActivatePage(value);
+ }
+ }
+
+ protected internal void ActivatePage(int index)
+ {
+ if ((panelCollection.Count == 0) && (index >= panelCollection.Count) && (index <= 0))
+ {
+ return;
+ }
+
+ Panel p = (Panel)panelCollection[index];
+
+ ActivatePage(p);
+ }
+
+ protected internal void ActivatePage(Panel page)
+ {
+ if (this.ActivePanel != null)
+ {
+ if (this.ActivePanel.InvokeRequired)
+ {
+ this.ActivePanel.Invoke(new MethodInvoker(() => {
+ this.ActivePanel.Visible = false;
+ }));
+ }
+ else
+ {
+ this.ActivePanel.Visible = false;
+ }
+ }
+
+ this.ActivePanel = page;
+ if (this.ActivePanel != null)
+ {
+ this.ActivePanel.Parent = this;
+ if (!this.Contains(this.ActivePanel))
+ {
+ this.Container.Add(this.ActivePanel);
+ }
+
+ if (this.ActivePanel.InvokeRequired)
+ {
+ this.ActivePanel.Invoke(new MethodInvoker(() => {
+ this.ActivePanel.Dock = DockStyle.Fill;
+ this.ActivePanel.Visible = true;
+ this.ActivePanel.BringToFront();
+ }));
+ }
+ else
+ {
+ this.ActivePanel.Dock = DockStyle.Fill;
+ this.ActivePanel.Visible = true;
+ this.ActivePanel.BringToFront();
+ }
+ }
+
+ if (this.ActivePanel != null)
+ {
+ if (this.ActivePanel.InvokeRequired)
+ {
+ this.ActivePanel.Invoke(new MethodInvoker(() => {
+ this.ActivePanel.Invalidate();
+ }));
+ }
+ else
+ {
+ this.ActivePanel.Invalidate();
+ }
+ }
+ else
+ {
+ this.Invalidate();
+ }
+ }
+
+#if DEBUG
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ if (this.DesignMode)
+ {
+ this.Invalidate();
+ }
+ }
+
+#endif
+
+ protected override void DestroyHandle()
+ {
+ base.DestroyHandle();
+
+ foreach (Panel p in panelCollection)
+ {
+ p.Dispose();
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/TUserControl.cs b/RyzStudio/Windows/Forms/TUserControl.cs
new file mode 100644
index 0000000..8a22585
--- /dev/null
+++ b/RyzStudio/Windows/Forms/TUserControl.cs
@@ -0,0 +1,73 @@
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class TUserControl : UserControl
+ {
+
+ public TUserControl() : base()
+ {
+
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new BorderStyle BorderStyle { get => base.BorderStyle; set => base.BorderStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Font Font { get => base.Font; set => base.Font = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Color ForeColor { get => base.ForeColor; set => base.ForeColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override AutoValidate AutoValidate { get => base.AutoValidate; set => base.AutoValidate = value; }
+
+ //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ //public override ContextMenuStrip ContextMenuStrip { get => base.ContextMenuStrip; set => base.ContextMenuStrip = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/Forms/ThreadControl.cs b/RyzStudio/Windows/Forms/ThreadControl.cs
new file mode 100644
index 0000000..49220fb
--- /dev/null
+++ b/RyzStudio/Windows/Forms/ThreadControl.cs
@@ -0,0 +1,571 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.Forms
+{
+ public class ThreadControl
+ {
+ public static void Add(Control control, Control value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Controls.Add(value);
+ }));
+ }
+ else
+ {
+ control.Controls.Add(value);
+ }
+ }
+
+ public static void Add(ListBox control, string value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Items.Add(value);
+ }));
+ }
+ else
+ {
+ control.Items.Add(value);
+ }
+ }
+
+ //public static void Add(FlowLayoutPanel control, Control value)
+ //{
+ // if (control.InvokeRequired)
+ // {
+ // control.Invoke(new MethodInvoker(() => {
+ // control.Controls.Add(value);
+ // }));
+ // }
+ // else
+ // {
+ // control.Controls.Add(value);
+ // }
+ //}
+
+ public static int Add(TreeView control, TreeNode value)
+ {
+ int n = -1;
+
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ n = control.Nodes.Add(value);
+ }));
+ }
+ else
+ {
+ n = control.Nodes.Add(value);
+ }
+
+ return n;
+ }
+
+ public static int Add(TreeNode control, TreeNode value)
+ {
+ int n = -1;
+
+ if (control.TreeView.InvokeRequired)
+ {
+ control.TreeView.Invoke(new MethodInvoker(() => {
+ n = control.Nodes.Add(value);
+ }));
+ }
+ else
+ {
+ n = control.Nodes.Add(value);
+ }
+
+ return n;
+ }
+
+ public static int Add(DataGridView control, object[] value)
+ {
+ int n = -1;
+
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ n = control.Rows.Add(value);
+ }));
+ }
+ else
+ {
+ n = control.Rows.Add(value);
+ }
+
+ return n;
+ }
+
+ public static int Add(DataGridView control, object[] value, object tag)
+ {
+ int n = -1;
+
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ n = control.Rows.Add(value);
+ control.Rows[n].Tag = tag;
+ }));
+ }
+ else
+ {
+ n = control.Rows.Add(value);
+ control.Rows[n].Tag = tag;
+ }
+
+ return n;
+ }
+
+ public static TreeNode Add(TreeView control, string key, string text)
+ {
+ TreeNode rv = null;
+
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ rv = control.Nodes.Add(key, text);
+ }));
+ }
+ else
+ {
+ rv = control.Nodes.Add(key, text);
+ }
+
+ return rv;
+ }
+
+ public static TreeNode Add(TreeNode control, string key, string text)
+ {
+ TreeNode rv = null;
+
+ if (control.TreeView.InvokeRequired)
+ {
+ control.TreeView.Invoke(new MethodInvoker(() => {
+ rv = control.Nodes.Add(key, text);
+ }));
+ }
+ else
+ {
+ rv = control.Nodes.Add(key, text);
+ }
+
+ return rv;
+ }
+
+ public static void AddLine(RichTextBox control, string text)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Text += text + Environment.NewLine;
+ }));
+ }
+ else
+ {
+ control.Text += text + Environment.NewLine;
+ }
+ }
+
+ public static void Clear(ListBox control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Items.Clear();
+ }));
+ }
+ else
+ {
+ control.Items.Clear();
+ }
+ }
+
+ public static void Clear(FlowLayoutPanel control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Controls.Clear();
+ }));
+ }
+ else
+ {
+ control.Controls.Clear();
+ }
+ }
+
+ public static void Clear(TreeView control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Nodes.Clear();
+ }));
+ }
+ else
+ {
+ control.Nodes.Clear();
+ }
+ }
+
+ public static void Clear(Label control) => SetText(control, string.Empty);
+
+ public static void Clear(PictureBox control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Image = null;
+ }));
+ }
+ else
+ {
+ control.Image = null;
+ }
+ }
+
+ public static void Clear(DataGridView control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Rows.Clear();
+ }));
+ }
+ else
+ {
+ control.Rows.Clear();
+ }
+ }
+
+ public static List FindChildControl(Control control) where T : Control
+ {
+ List rs = new List();
+
+ foreach (Control item in control.Controls)
+ {
+ var ctr = item as T;
+ if (ctr == null)
+ {
+ rs.AddRange(FindChildControl(item));
+ }
+ else
+ {
+ rs.Add(ctr);
+ }
+ }
+
+ return rs;
+ }
+
+ public static string GetText(Control control, bool doTrim = true)
+ {
+ string rv = string.Empty;
+
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ rv = (doTrim ? control.Text?.Trim() : control.Text);
+ }));
+ }
+ else
+ {
+ rv = (doTrim ? control.Text?.Trim() : control.Text);
+ }
+
+ return rv;
+ }
+
+ public static void SetChecked(ToolStripMenuItem control, bool value)
+ {
+ if (control.GetCurrentParent().InvokeRequired)
+ {
+ control.GetCurrentParent().Invoke(new MethodInvoker(() =>
+ {
+ control.Checked = value;
+ }));
+ }
+ else
+ {
+ control.Checked = value;
+ }
+ }
+
+ public static void SetEnable(Control control, bool value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Enabled = value;
+ }));
+ }
+ else
+ {
+ control.Enabled = value;
+ }
+ }
+
+ public static void SetFocus(Control control)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Focus();
+ }));
+ }
+ else
+ {
+ control.Focus();
+ }
+ }
+
+ public static int GetValue(NumericUpDown sender)
+ {
+ int rv = 0;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => {
+ rv = (int)sender.Value;
+ }));
+ }
+ else
+ {
+ rv = (int)sender.Value;
+ }
+
+ return rv;
+ }
+
+ public static string GetSelectedValue(ListBox sender)
+ {
+ string rv = string.Empty;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => {
+ rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString();
+ }));
+ }
+ else
+ {
+ rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString();
+ }
+
+ return rv;
+ }
+
+ public static void SetHeight(Control control, int value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Height = value;
+ }));
+ }
+ else
+ {
+ control.Height = value;
+ }
+ }
+
+ public static void SetLocation(Control control, Point value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Location = value;
+ }));
+ }
+ else
+ {
+ control.Location = value;
+ }
+ }
+
+ public static void ClientSize(Control control, int width, int height) => ClientSize(control, new Size(width, height));
+
+ public static void ClientSize(Control control, Size value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.ClientSize = value;
+ }));
+ }
+ else
+ {
+ control.ClientSize = value;
+ }
+ }
+
+ public static void SetSize(Control control, int width, int height) => SetSize(control, new Size(width, height));
+
+ public static void SetSize(Control control, Size value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Size = value;
+ }));
+ }
+ else
+ {
+ control.Size = value;
+ }
+ }
+
+ public static void SetText(Control control, string text)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Text = text;
+ }));
+ }
+ else
+ {
+ control.Text = text;
+ }
+ }
+
+ public static void SetTopMost(Form control, bool value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.TopMost = value;
+ }));
+ }
+ else
+ {
+ control.TopMost = value;
+ }
+ }
+
+ public static void SetValue(Control control, string value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Text = value;
+ }));
+ }
+ else
+ {
+ control.Text = value;
+ }
+ }
+
+ public static void SetValue(PictureBox control, Image value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() =>
+ {
+ control.Image = value;
+ }));
+ }
+ else
+ {
+ control.Image = value;
+ }
+ }
+
+ public static void SetVisible(Control control, bool value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Visible = value;
+ }));
+ }
+ else
+ {
+ control.Visible = value;
+ }
+ }
+
+ public static void SetVisible(Form control, bool value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ if (value)
+ {
+ //control.ShowInTaskbar = value;
+ //control.Opacity = 100;
+ control.Visible = value;
+ }
+ else
+ {
+ control.Visible = value;
+ //control.ShowInTaskbar = value;
+ //control.Opacity = 0;
+ }
+ }));
+ }
+ else
+ {
+ if (value)
+ {
+ //control.ShowInTaskbar = value;
+ //control.Opacity = 100;
+ control.Visible = value;
+ }
+ else
+ {
+ control.Visible = value;
+ //control.ShowInTaskbar = value;
+ //control.Opacity = 0;
+ }
+ }
+ }
+
+ public static void SetWidth(Control control, int value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.Width = value;
+ }));
+ }
+ else
+ {
+ control.Width = value;
+ }
+ }
+
+ public static void SetClientWidth(Control control, int value)
+ {
+ if (control.InvokeRequired)
+ {
+ control.Invoke(new MethodInvoker(() => {
+ control.ClientSize = new Size(value, control.ClientSize.Height);
+ }));
+ }
+ else
+ {
+ control.ClientSize = new Size(value, control.ClientSize.Height);
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs b/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs
new file mode 100644
index 0000000..d39ad3c
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs
@@ -0,0 +1,193 @@
+using RyzStudio.Windows.Forms;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class BorderlessForm
+ {
+ ///
+ /// 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()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BorderlessForm));
+ this.label1 = new System.Windows.Forms.Label();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.area1 = new System.Windows.Forms.Panel();
+ this.pictureBox4 = new RyzStudio.Windows.Forms.TImageBox();
+ this.pictureBox2 = new RyzStudio.Windows.Forms.TImageBox();
+ this.pictureBox1 = new RyzStudio.Windows.Forms.TImageBox();
+ this.pictureBox3 = new RyzStudio.Windows.Forms.TImageBox();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(241)))), ((int)(((byte)(241)))));
+ this.label1.Location = new System.Drawing.Point(1, 1);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(48, 0, 0, 0);
+ this.label1.Size = new System.Drawing.Size(454, 48);
+ this.label1.TabIndex = 148;
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.label1.DoubleClick += new System.EventHandler(this.label1_DoubleClick);
+ this.label1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick);
+ this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
+ this.label1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label1_MouseMove);
+ this.label1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp);
+ //
+ // panel1
+ //
+ this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.panel1.BackColor = System.Drawing.Color.Transparent;
+ this.panel1.Cursor = System.Windows.Forms.Cursors.SizeNWSE;
+ this.panel1.Location = new System.Drawing.Point(594, 674);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(6, 6);
+ this.panel1.TabIndex = 150;
+ this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
+ this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
+ this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp);
+ //
+ // area1
+ //
+ this.area1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.area1.BackColor = System.Drawing.Color.Transparent;
+ this.area1.Cursor = System.Windows.Forms.Cursors.SizeNS;
+ this.area1.Location = new System.Drawing.Point(1, 674);
+ this.area1.Name = "area1";
+ this.area1.Size = new System.Drawing.Size(592, 6);
+ this.area1.TabIndex = 152;
+ this.area1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown);
+ this.area1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove);
+ this.area1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseUp);
+ //
+ // pictureBox4
+ //
+ this.pictureBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pictureBox4.BackColor = System.Drawing.Color.Transparent;
+ this.pictureBox4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.pictureBox4.ErrorImage = null;
+ this.pictureBox4.ImageHover = global::hiim.dply.Properties.Resources.form20_menu2;
+ this.pictureBox4.Image = global::hiim.dply.Properties.Resources.form20_menu;
+ this.pictureBox4.InitialImage = null;
+ this.pictureBox4.Location = new System.Drawing.Point(460, 11);
+ this.pictureBox4.Name = "pictureBox4";
+ this.pictureBox4.NormalImage = global::hiim.dply.Properties.Resources.form20_menu;
+ this.pictureBox4.Size = new System.Drawing.Size(28, 28);
+ this.pictureBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.pictureBox4.TabIndex = 149;
+ this.pictureBox4.TabStop = false;
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pictureBox2.BackColor = System.Drawing.Color.Transparent;
+ this.pictureBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.pictureBox2.ErrorImage = null;
+ this.pictureBox2.ImageHover = global::hiim.dply.Properties.Resources.form20_maximise2;
+ this.pictureBox2.Image = global::hiim.dply.Properties.Resources.form20_maximise;
+ this.pictureBox2.InitialImage = null;
+ this.pictureBox2.Location = new System.Drawing.Point(528, 11);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.NormalImage = global::hiim.dply.Properties.Resources.form20_maximise;
+ this.pictureBox2.Size = new System.Drawing.Size(28, 28);
+ this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.pictureBox2.TabIndex = 147;
+ this.pictureBox2.TabStop = false;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pictureBox1.BackColor = System.Drawing.Color.Transparent;
+ this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.pictureBox1.ErrorImage = null;
+ this.pictureBox1.ImageHover = global::hiim.dply.Properties.Resources.form20_minimise2;
+ this.pictureBox1.Image = global::hiim.dply.Properties.Resources.form20_minimise;
+ this.pictureBox1.InitialImage = null;
+ this.pictureBox1.Location = new System.Drawing.Point(494, 11);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.NormalImage = global::hiim.dply.Properties.Resources.form20_minimise;
+ this.pictureBox1.Size = new System.Drawing.Size(28, 28);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.pictureBox1.TabIndex = 146;
+ this.pictureBox1.TabStop = false;
+ //
+ // pictureBox3
+ //
+ this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pictureBox3.BackColor = System.Drawing.Color.Transparent;
+ this.pictureBox3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.pictureBox3.ErrorImage = null;
+ this.pictureBox3.ImageHover = global::hiim.dply.Properties.Resources.form20_close2;
+ this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image")));
+ this.pictureBox3.InitialImage = null;
+ this.pictureBox3.Location = new System.Drawing.Point(562, 11);
+ this.pictureBox3.Name = "pictureBox3";
+ this.pictureBox3.NormalImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.NormalImage")));
+ this.pictureBox3.Size = new System.Drawing.Size(28, 28);
+ this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.pictureBox3.TabIndex = 145;
+ this.pictureBox3.TabStop = false;
+ //
+ // BorderlessForm
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.ClientSize = new System.Drawing.Size(600, 680);
+ this.Controls.Add(this.area1);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.pictureBox4);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.pictureBox2);
+ this.Controls.Add(this.pictureBox1);
+ this.Controls.Add(this.pictureBox3);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "BorderlessForm";
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ protected internal TImageBox pictureBox2;
+ protected internal TImageBox pictureBox1;
+ protected internal TImageBox pictureBox3;
+ protected internal System.Windows.Forms.Label label1;
+ protected internal TImageBox pictureBox4;
+ protected internal System.Windows.Forms.Panel panel1;
+ protected internal System.Windows.Forms.Panel area1;
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.cs b/RyzStudio/Windows/ThemedForms/BorderlessForm.cs
new file mode 100644
index 0000000..840d970
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.cs
@@ -0,0 +1,409 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ using System;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Drawing.Design;
+ using System.Windows.Forms;
+
+ public partial class BorderlessForm : System.Windows.Forms.Form
+ {
+ protected bool isBusy = false;
+
+ protected Color topFillColour = Color.FromArgb(15, 15, 15);
+ protected int topFillHeight = 48;
+ protected Color bottomFillColour = Color.FromArgb(15, 15, 15);
+ protected int bottomFillMargin = 19;
+ protected int bottomLeftMargin = 20;
+ protected int borderWidth = 1;
+ protected int menuFillWidth = 160;
+ protected Color menuFillColour = Color.FromArgb(179, 179, 179);
+
+ private bool windowDragging = false;
+ private Point windowOffset = new Point();
+ private Point windowSize = new Point();
+
+ public BorderlessForm() : base()
+ {
+ this.InitializeComponent();
+
+ this.BackColor = Color.FromArgb(247, 247, 247);
+ this.FormBorderStyle = FormBorderStyle.None;
+ this.Padding = new Padding(1);
+
+ this.topFillColour = Color.FromArgb(51, 51, 51);
+ this.topFillHeight = 48;
+ this.bottomFillColour = Color.FromArgb(0, 152, 167);
+ this.bottomFillMargin = 6;
+
+ pictureBox1.Click += pictureBox1_Click;
+ pictureBox2.Click += pictureBox2_Click;
+ pictureBox3.Click += pictureBox3_Click;
+ pictureBox4.Click += pictureBox4_Click;
+
+ updatePictureBox2Image();
+ }
+
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ base.OnClosing(e);
+
+ if (this.IsBusy)
+ {
+ e.Cancel = true;
+ }
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+
+ Graphics g = e.Graphics;
+
+ Rectangle areaTop = new Rectangle(this.DisplayRectangle.Left, this.Padding.Top, this.DisplayRectangle.Width, topFillHeight);
+ Rectangle areaBottom = new Rectangle(this.DisplayRectangle.Left, (this.DisplayRectangle.Height - bottomFillMargin + this.Padding.Top), this.DisplayRectangle.Width, bottomFillMargin);
+ Rectangle areaBorder = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - borderWidth, this.ClientRectangle.Height - borderWidth);
+
+ Rectangle areaMenu = new Rectangle(this.DisplayRectangle.Left, this.DisplayRectangle.Top + topFillHeight, menuFillWidth, (this.DisplayRectangle.Height - bottomFillMargin - topFillHeight));
+
+ // draw header
+ if (topFillHeight > 0)
+ {
+ g.FillRectangle(new SolidBrush(topFillColour), areaTop);
+ }
+
+ // fill menu
+ g.FillRectangle(new SolidBrush(menuFillColour), areaMenu);
+
+ // draw footer
+ if (bottomFillMargin > 0)
+ {
+ g.FillRectangle(new SolidBrush(bottomFillColour), areaBottom);
+ }
+
+ // draw logo
+ if (this.TitleLogo != null)
+ {
+ g.DrawImageUnscaled(this.TitleLogo, this.Padding.Left, this.Padding.Top);
+ }
+
+ if (this.Banner != null)
+ {
+ g.DrawImageUnscaled(this.Banner, this.Padding.Left + bottomLeftMargin, (this.DisplayRectangle.Height - this.Banner.Height - bottomFillMargin + this.Padding.Top), (this.DisplayRectangle.Width - (this.Padding.Left + this.Padding.Right)), this.Banner.Height);
+ }
+
+ g.DrawRectangle(new Pen(Color.Black, borderWidth), areaBorder);
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ updatePictureBox2Image();
+
+ this.Invalidate();
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Color BackColor { get => base.BackColor; set => base.BackColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public string Description
+ {
+ get
+ {
+ return label1.Text?.Replace("\n", "\\n");
+ }
+ set
+ {
+ label1.Text = value?.Replace("\\n", "\n");
+ }
+ }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image TitleLogo { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image Banner { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public bool ShowMenuButton { get => pictureBox4.Visible; set => pictureBox4.Visible = value; }
+
+ protected virtual bool IsBusy { get => isBusy; set => isBusy = value; }
+
+ private void pictureBox4_Click(object sender, System.EventArgs e)
+ {
+ //this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void pictureBox1_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void pictureBox2_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ if (this.WindowState == FormWindowState.Maximized)
+ {
+ this.WindowState = FormWindowState.Normal;
+ pictureBox2.NormalImage = Resources.form20_maximise;
+ pictureBox2.HighlightImage = Resources.form20_maximise2;
+ }
+ else
+ {
+ this.WindowState = FormWindowState.Maximized;
+ pictureBox2.NormalImage = Resources.form20_restore;
+ pictureBox2.HighlightImage = Resources.form20_restore2;
+ }
+ }
+
+ private void pictureBox3_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ this.Close();
+ }
+
+ public void SetValue(Label sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Text = value; }));
+ }
+ else
+ {
+ sender.Text = value;
+ }
+ }
+
+ public void SetValue(GroupBox sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Text = value; }));
+ }
+ else
+ {
+ sender.Text = value;
+ }
+ }
+
+ public void AddValue(ListBox sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Items.Add(value); }));
+ }
+ else
+ {
+ sender.Items.Add(value);
+ }
+ }
+
+ public void AddControl(FlowLayoutPanel sender, Control value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() =>
+ {
+ sender.Controls.Add(value);
+ }));
+ }
+ else
+ {
+ sender.Controls.Add(value);
+ }
+ }
+
+ public void ClearValues(ListBox sender)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Items.Clear(); }));
+ }
+ else
+ {
+ sender.Items.Clear();
+ }
+ }
+
+ public string GetValue(ListBox sender)
+ {
+ string rv = string.Empty;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); }));
+ }
+ else
+ {
+ rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString();
+ }
+
+ return rv;
+ }
+
+ public string GetValue(TextBox sender)
+ {
+ string rv = string.Empty;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = sender.Text.Trim(); }));
+ }
+ else
+ {
+ rv = sender.Text.Trim();
+ }
+
+ return rv;
+ }
+
+ public int GetValue(NumericUpDown sender)
+ {
+ int rv = 0;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = (int)sender.Value; }));
+ }
+ else
+ {
+ rv = (int)sender.Value;
+ }
+
+ return rv;
+ }
+
+ protected void updatePictureBox2Image()
+ {
+ if (this.WindowState == FormWindowState.Maximized)
+ {
+ pictureBox2.NormalImage = Resources.form20_restore;
+ pictureBox2.HighlightImage = Resources.form20_restore2;
+ }
+ else
+ {
+ pictureBox2.NormalImage = Resources.form20_maximise;
+ pictureBox2.HighlightImage = Resources.form20_maximise2;
+ }
+ }
+
+ private void label1_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ }
+
+ private void label1_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+ }
+
+ private void label1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ Point currentScreenPos = PointToScreen(e.Location);
+ Location = new Point(currentScreenPos.X - windowOffset.X, currentScreenPos.Y - windowOffset.Y);
+ }
+ }
+
+ private void label1_DoubleClick(object sender, EventArgs e) => pictureBox2_Click(sender, e);
+
+ private void label1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Middle)
+ {
+ this.TopMost = !this.TopMost;
+ }
+ }
+
+ private void panel1_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ windowSize = new Point(this.Width, this.Height);
+ }
+
+ private void panel1_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+ }
+
+ private void panel1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ this.Size = new Size(e.X - windowOffset.X + this.Width, e.Y - windowOffset.Y + this.Height);
+ }
+ }
+
+ private void panel2_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ windowSize = new Point(this.Width, this.Height);
+ }
+
+ private void panel2_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+ }
+
+ private void panel2_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ this.Size = new Size(windowSize.X, e.Y - windowOffset.Y + this.Height);
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.resx b/RyzStudio/Windows/ThemedForms/BorderlessForm.resx
new file mode 100644
index 0000000..db173e1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.resx
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ xAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADnSURBVDhP1ZVB
+ DoIwEEW7whNo9Cri/QCv5Y4YEoTWxK71Gvqn+W2AgEkbNvxkYPgzfWkpKcpau9NaX/u+/yC+iSFjK3Ay
+ RdhcU0qUChc3s67rzipRGJ8T+JYHR2ctWYGzXSC8Gzbs3rbtgZaSXDyp0QoKnJBMBK8WH5vVCUhCcvbX
+ bAuivwxsmmaP2TxYfyE3zJ/Ij2wLYu3/OxQoah4kYedgIt8TDTTGnFgeyfcsAodLxn205Dlo4IRkInjr
+ bgq8dT+bWG0L6A/WnLVo4b1eyHDHV8WHNaJwvwAkJeI9KMSGjC201tkP+AimzgF8cMEAAAAASUVORK5C
+ YII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ xAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADnSURBVDhP1ZVB
+ DoIwEEW7whNo9Cri/QCv5Y4YEoTWxK71Gvqn+W2AgEkbNvxkYPgzfWkpKcpau9NaX/u+/yC+iSFjK3Ay
+ RdhcU0qUChc3s67rzipRGJ8T+JYHR2ctWYGzXSC8Gzbs3rbtgZaSXDyp0QoKnJBMBK8WH5vVCUhCcvbX
+ bAuivwxsmmaP2TxYfyE3zJ/Ij2wLYu3/OxQoah4kYedgIt8TDTTGnFgeyfcsAodLxn205Dlo4IRkInjr
+ bgq8dT+bWG0L6A/WnLVo4b1eyHDHV8WHNaJwvwAkJeI9KMSGjC201tkP+AimzgF8cMEAAAAASUVORK5C
+ YII=
+
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs
new file mode 100644
index 0000000..75f86a0
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs
@@ -0,0 +1,191 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class BorderlessToolForm
+ {
+ ///
+ /// 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.lblDescription = new System.Windows.Forms.Label();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.imgbxMenu = new RyzStudio.Windows.Forms.ImageBox();
+ this.imgbxMaximise = new RyzStudio.Windows.Forms.ImageBox();
+ this.imgbxMinimise = new RyzStudio.Windows.Forms.ImageBox();
+ this.imgbxClose = new RyzStudio.Windows.Forms.ImageBox();
+ this.area1 = new System.Windows.Forms.Panel();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMenu)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMaximise)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMinimise)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxClose)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lblDescription
+ //
+ this.lblDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblDescription.BackColor = System.Drawing.Color.Transparent;
+ this.lblDescription.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblDescription.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(241)))), ((int)(((byte)(241)))));
+ this.lblDescription.Location = new System.Drawing.Point(1, 1);
+ this.lblDescription.Name = "lblDescription";
+ this.lblDescription.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0);
+ this.lblDescription.Size = new System.Drawing.Size(194, 30);
+ this.lblDescription.TabIndex = 148;
+ this.lblDescription.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.lblDescription.DoubleClick += new System.EventHandler(this.label1_DoubleClick);
+ this.lblDescription.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick);
+ this.lblDescription.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
+ this.lblDescription.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label1_MouseMove);
+ this.lblDescription.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp);
+ //
+ // panel1
+ //
+ this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.panel1.BackColor = System.Drawing.Color.Transparent;
+ this.panel1.Cursor = System.Windows.Forms.Cursors.SizeNWSE;
+ this.panel1.Location = new System.Drawing.Point(335, 595);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(5, 5);
+ this.panel1.TabIndex = 150;
+ this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
+ this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
+ this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp);
+ //
+ // imgbxMenu
+ //
+ this.imgbxMenu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.imgbxMenu.BackColor = System.Drawing.Color.Transparent;
+ this.imgbxMenu.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imgbxMenu.ErrorImage = null;
+ this.imgbxMenu.HighlightImage = global::AppLauncher.Properties.Resources.form16_menu2;
+ this.imgbxMenu.Image = global::AppLauncher.Properties.Resources.form16_menu;
+ this.imgbxMenu.InitialImage = null;
+ this.imgbxMenu.Location = new System.Drawing.Point(224, 4);
+ this.imgbxMenu.Name = "imgbxMenu";
+ this.imgbxMenu.NormalImage = global::AppLauncher.Properties.Resources.form16_menu;
+ this.imgbxMenu.Size = new System.Drawing.Size(24, 24);
+ this.imgbxMenu.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imgbxMenu.TabIndex = 149;
+ this.imgbxMenu.TabStop = false;
+ //
+ // imgbxMaximise
+ //
+ this.imgbxMaximise.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.imgbxMaximise.BackColor = System.Drawing.Color.Transparent;
+ this.imgbxMaximise.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imgbxMaximise.ErrorImage = null;
+ this.imgbxMaximise.HighlightImage = global::AppLauncher.Properties.Resources.form16_maximise2;
+ this.imgbxMaximise.Image = global::AppLauncher.Properties.Resources.form16_maximise;
+ this.imgbxMaximise.InitialImage = null;
+ this.imgbxMaximise.Location = new System.Drawing.Point(280, 4);
+ this.imgbxMaximise.Name = "imgbxMaximise";
+ this.imgbxMaximise.NormalImage = global::AppLauncher.Properties.Resources.form16_maximise;
+ this.imgbxMaximise.Size = new System.Drawing.Size(24, 24);
+ this.imgbxMaximise.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imgbxMaximise.TabIndex = 147;
+ this.imgbxMaximise.TabStop = false;
+ //
+ // imgbxMinimise
+ //
+ this.imgbxMinimise.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.imgbxMinimise.BackColor = System.Drawing.Color.Transparent;
+ this.imgbxMinimise.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imgbxMinimise.ErrorImage = null;
+ this.imgbxMinimise.HighlightImage = global::AppLauncher.Properties.Resources.form16_minimise2;
+ this.imgbxMinimise.Image = global::AppLauncher.Properties.Resources.form16_minimise;
+ this.imgbxMinimise.InitialImage = null;
+ this.imgbxMinimise.Location = new System.Drawing.Point(252, 4);
+ this.imgbxMinimise.Name = "imgbxMinimise";
+ this.imgbxMinimise.NormalImage = global::AppLauncher.Properties.Resources.form16_minimise;
+ this.imgbxMinimise.Size = new System.Drawing.Size(24, 24);
+ this.imgbxMinimise.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imgbxMinimise.TabIndex = 146;
+ this.imgbxMinimise.TabStop = false;
+ //
+ // imgbxClose
+ //
+ this.imgbxClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.imgbxClose.BackColor = System.Drawing.Color.Transparent;
+ this.imgbxClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imgbxClose.ErrorImage = null;
+ this.imgbxClose.HighlightImage = global::AppLauncher.Properties.Resources.form16_close2;
+ this.imgbxClose.Image = global::AppLauncher.Properties.Resources.form16_close;
+ this.imgbxClose.InitialImage = null;
+ this.imgbxClose.Location = new System.Drawing.Point(308, 4);
+ this.imgbxClose.Name = "imgbxClose";
+ this.imgbxClose.NormalImage = global::AppLauncher.Properties.Resources.form16_close;
+ this.imgbxClose.Size = new System.Drawing.Size(24, 24);
+ this.imgbxClose.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imgbxClose.TabIndex = 145;
+ this.imgbxClose.TabStop = false;
+ //
+ // area1
+ //
+ this.area1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.area1.BackColor = System.Drawing.Color.Transparent;
+ this.area1.Cursor = System.Windows.Forms.Cursors.SizeNS;
+ this.area1.Location = new System.Drawing.Point(0, 595);
+ this.area1.Name = "area1";
+ this.area1.Size = new System.Drawing.Size(334, 5);
+ this.area1.TabIndex = 151;
+ this.area1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown);
+ this.area1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove);
+ this.area1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseUp);
+ //
+ // BorderlessToolForm
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.ClientSize = new System.Drawing.Size(340, 600);
+ this.Controls.Add(this.area1);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.imgbxMenu);
+ this.Controls.Add(this.lblDescription);
+ this.Controls.Add(this.imgbxMaximise);
+ this.Controls.Add(this.imgbxMinimise);
+ this.Controls.Add(this.imgbxClose);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.MinimumSize = new System.Drawing.Size(40, 0);
+ this.Name = "BorderlessToolForm";
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMenu)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMaximise)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxMinimise)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imgbxClose)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ protected internal Forms.ImageBox imgbxMaximise;
+ protected internal Forms.ImageBox imgbxMinimise;
+ protected internal Forms.ImageBox imgbxClose;
+ protected internal System.Windows.Forms.Label lblDescription;
+ protected internal Forms.ImageBox imgbxMenu;
+ protected internal System.Windows.Forms.Panel panel1;
+ protected internal System.Windows.Forms.Panel area1;
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs
new file mode 100644
index 0000000..3c17b0b
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs
@@ -0,0 +1,394 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ using System;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Drawing.Design;
+ using System.Windows.Forms;
+ using Resources = AppLauncher.Properties.Resources;
+
+ public partial class BorderlessToolForm : System.Windows.Forms.Form
+ {
+ protected bool isBusy = false;
+
+ protected Color topFillColour = Color.FromArgb(15, 15, 15);
+ protected int topFillHeight = 32;
+ protected int borderWidth = 1;
+
+ private bool windowDragging = false;
+ private Point windowOffset = new Point();
+ private Point windowSize = new Point();
+
+ public BorderlessToolForm() : base()
+ {
+ this.InitializeComponent();
+
+ this.BackColor = Color.FromArgb(246, 246, 246);
+ this.Padding = new Padding(1);
+
+ this.topFillColour = Color.FromArgb(51, 51, 51);
+ this.topFillHeight = 32;
+
+ this.BackColor = Color.FromArgb(179, 179, 179);
+ this.FormBorderStyle = FormBorderStyle.None;
+
+ imgbxMinimise.Click += pictureBox1_Click;
+ imgbxMaximise.Click += pictureBox2_Click;
+ imgbxClose.Click += pictureBox3_Click;
+ imgbxMenu.Click += pictureBox4_Click;
+
+ updatePictureBox2Image();
+ }
+
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ base.OnClosing(e);
+
+ if (this.IsBusy)
+ {
+ e.Cancel = true;
+ }
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+
+ Graphics g = e.Graphics;
+
+ Rectangle areaTop = new Rectangle(this.DisplayRectangle.Left, this.Padding.Top, this.DisplayRectangle.Width, topFillHeight);
+ Rectangle areaBorder = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - borderWidth, this.ClientRectangle.Height - borderWidth);
+
+ // draw header
+ if (topFillHeight > 0)
+ {
+ g.FillRectangle(new SolidBrush(topFillColour), areaTop);
+ }
+
+ // draw logo
+ //if (this.TitleLogo != null)
+ //{
+ // g.DrawImageUnscaled(this.TitleLogo, this.Padding.Left, this.Padding.Top);
+ //}
+
+ g.DrawRectangle(new Pen(Color.Black, borderWidth), areaBorder);
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ updatePictureBox2Image();
+
+ this.Invalidate();
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Color BackColor { get => base.BackColor; set => base.BackColor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public string Description
+ {
+ get
+ {
+ return lblDescription.Text?.Replace("\n", "\\n");
+ }
+ set
+ {
+ lblDescription.Text = value?.Replace("\\n", "\n");
+ }
+ }
+
+ //[Category("Appearance"), Browsable(true)]
+ //public Image TitleLogo { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image Banner { get; set; }
+
+ [Category("Appearance"), Browsable(true)]
+ public bool ShowMenuButton { get => imgbxMenu.Visible; set => imgbxMenu.Visible = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public bool ShowMinimiseButton { get => imgbxMinimise.Visible; set => imgbxMinimise.Visible = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public bool ShowMaximiseButton { get => imgbxMaximise.Visible; set => imgbxMaximise.Visible = value; }
+
+ protected virtual bool IsBusy { get => isBusy; set => isBusy = value; }
+
+ private void pictureBox4_Click(object sender, System.EventArgs e)
+ {
+ //this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void pictureBox1_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void pictureBox2_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ if (this.WindowState == FormWindowState.Maximized)
+ {
+ this.WindowState = FormWindowState.Normal;
+ imgbxMaximise.NormalImage = Resources.form16_maximise;
+ imgbxMaximise.HighlightImage = Resources.form16_maximise2;
+ }
+ else
+ {
+ this.WindowState = FormWindowState.Maximized;
+ imgbxMaximise.NormalImage = Resources.form16_restore;
+ imgbxMaximise.HighlightImage = Resources.form16_restore2;
+ }
+ }
+
+ private void pictureBox3_Click(object sender, System.EventArgs e)
+ {
+ MouseEventArgs mouseEvent = (MouseEventArgs)e;
+ if (mouseEvent != null)
+ {
+ if (mouseEvent.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ this.Close();
+ }
+
+ public void SetValue(Label sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Text = value; }));
+ }
+ else
+ {
+ sender.Text = value;
+ }
+ }
+
+ public void SetValue(GroupBox sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Text = value; }));
+ }
+ else
+ {
+ sender.Text = value;
+ }
+ }
+
+ public void AddValue(ListBox sender, string value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Items.Add(value); }));
+ }
+ else
+ {
+ sender.Items.Add(value);
+ }
+ }
+
+ public void AddControl(FlowLayoutPanel sender, Control value)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() =>
+ {
+ sender.Controls.Add(value);
+ }));
+ }
+ else
+ {
+ sender.Controls.Add(value);
+ }
+ }
+
+ public void ClearValues(ListBox sender)
+ {
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { sender.Items.Clear(); }));
+ }
+ else
+ {
+ sender.Items.Clear();
+ }
+ }
+
+ public string GetValue(ListBox sender)
+ {
+ string rv = string.Empty;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); }));
+ }
+ else
+ {
+ rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString();
+ }
+
+ return rv;
+ }
+
+ public string GetValue(TTextBox sender)
+ {
+ string rv = string.Empty;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = sender.Text.Trim(); }));
+ }
+ else
+ {
+ rv = sender.Text.Trim();
+ }
+
+ return rv;
+ }
+
+ public int GetValue(NumericUpDown sender)
+ {
+ int rv = 0;
+
+ if (sender.InvokeRequired)
+ {
+ sender.Invoke(new MethodInvoker(() => { rv = (int)sender.Value; }));
+ }
+ else
+ {
+ rv = (int)sender.Value;
+ }
+
+ return rv;
+ }
+
+ protected void updatePictureBox2Image()
+ {
+ if (this.WindowState == FormWindowState.Maximized)
+ {
+ imgbxMaximise.NormalImage = Resources.form16_restore;
+ imgbxMaximise.HighlightImage = Resources.form16_restore2;
+ }
+ else
+ {
+ imgbxMaximise.NormalImage = Resources.form16_maximise;
+ imgbxMaximise.HighlightImage = Resources.form16_maximise2;
+ }
+ }
+
+ private void label1_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ }
+
+ private void label1_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+ }
+
+ private void label1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ Point currentScreenPos = PointToScreen(e.Location);
+ Location = new Point(currentScreenPos.X - windowOffset.X, currentScreenPos.Y - windowOffset.Y);
+ }
+ }
+
+ private void label1_DoubleClick(object sender, EventArgs e) => pictureBox2_Click(sender, e);
+
+ private void label1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Middle)
+ {
+ this.TopMost = !this.TopMost;
+ }
+ }
+
+ private void panel1_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ windowSize = new Point(this.Width, this.Height);
+ }
+
+ private void panel1_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+ }
+
+ private void panel1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ this.Size = new Size(e.X - windowOffset.X + this.Width, e.Y - windowOffset.Y + this.Height);
+ }
+ }
+
+ private void panel2_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ windowDragging = true;
+ windowOffset = e.Location;
+ windowSize = new Point(this.Width, this.Height);
+ }
+
+ private void panel2_MouseUp(object sender, MouseEventArgs e)
+ {
+ windowDragging = false;
+
+ }
+
+ private void panel2_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (windowDragging)
+ {
+ this.Size = new Size(windowSize.X, e.Y - windowOffset.Y + this.Height);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx
new file mode 100644
index 0000000..8c98a25
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs
new file mode 100644
index 0000000..255f98c
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs
@@ -0,0 +1,98 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ using RyzStudio.Drawing;
+ using System;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Windows.Forms;
+
+ public partial class TPickerBox : RyzStudio.Windows.ThemedForms.TUserControl
+ {
+ protected readonly Padding textboxPadding = new Padding(6, 2, 4, 2);
+
+ public TPickerBox() : base()
+ {
+ InitializeComponent();
+
+ this.Font = new Font(this.Font, FontStyle.Regular);
+ this.Margin = new Padding(10, 4, 10, 4);
+
+ comboBox1.Font = this.Font;
+ comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBox1.PreviewKeyDown += textBox_PreviewKeyDown;
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Height = comboBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom);
+ }
+
+ protected override void OnGotFocus(EventArgs e)
+ {
+ base.OnGotFocus(e);
+
+ comboBox1.Focus();
+ }
+
+ protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ switch (e.KeyCode)
+ {
+ case Keys.Enter:
+ if (this.SubmitButton != null)
+ {
+ this.SubmitButton.PerformClick();
+ }
+
+ break;
+ case Keys.Escape:
+ close();
+ break;
+ default: break;
+ }
+ }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public System.Windows.Forms.ComboBox ComboBox { get => comboBox1; set => comboBox1 = value; }
+
+ //[Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ //[Category("Appearance")]
+ //public new string Text
+ //{
+ // get => textBox1.Text;
+ // set
+ // {
+ // textBox1.Text = value;
+ // textBox1.SelectionStart = textBox1.Text.Length;
+ // }
+ //}
+
+ //[Browsable(true)]
+ //[Category("Appearance")]
+ //public ComboBox.ObjectCollection Items { get => comboBox1.Items; set => comboBox1.Items = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public TButton SubmitButton { get; set; } = null;
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get => base.Margin; set => base.Margin = value; }
+
+ protected override void updateBackground(Graphics g, ThemeStyle style)
+ {
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom));
+
+ Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
+ g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
+ g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs
new file mode 100644
index 0000000..760329f
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs
@@ -0,0 +1,59 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TPickerBox
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.comboBox1 = new System.Windows.Forms.ComboBox();
+ this.SuspendLayout();
+ //
+ // comboBox1
+ //
+ this.comboBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.comboBox1.FormattingEnabled = true;
+ this.comboBox1.Location = new System.Drawing.Point(4, 4);
+ this.comboBox1.Name = "comboBox1";
+ this.comboBox1.Size = new System.Drawing.Size(121, 21);
+ this.comboBox1.TabIndex = 0;
+ //
+ // PickerBox
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.Controls.Add(this.comboBox1);
+ this.Name = "PickerBox";
+ this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.Size = new System.Drawing.Size(128, 32);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ComboBox comboBox1;
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs
new file mode 100644
index 0000000..89225ee
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs
@@ -0,0 +1,17 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ public class TYesNoPickerBox : TPickerBox
+ {
+
+ public TYesNoPickerBox() : base()
+ {
+ this.ComboBox.Items.Clear();
+
+ this.ComboBox.Items.AddRange(new string[] { "No", "Yes" });
+ if (this.ComboBox.Items.Count > 0) this.ComboBox.SelectedIndex = 0;
+ }
+
+ public bool Value { get => (this.ComboBox.SelectedIndex == 1); set =>this.ComboBox.SelectedIndex = (value ? 1 : 0); }
+
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TButton.cs b/RyzStudio/Windows/ThemedForms/TButton.cs
new file mode 100644
index 0000000..b6e4d93
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TButton.cs
@@ -0,0 +1,170 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ using System;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Windows.Forms;
+
+ public partial class TButton : RyzStudio.Windows.ThemedForms.TUserControl
+ {
+ public class ButtonStyle
+ {
+ public Color BackColour { get; set; } = Color.Transparent;
+ public Color PenColour { get; set; } = Color.Transparent;
+ public Image ForeImage { get; set; } = null;
+ }
+
+ public enum ButtonState
+ {
+ Idle = 0,
+ Hover,
+ Down
+ }
+
+ protected ButtonState controlState = ButtonState.Idle;
+ protected bool isSelected = false;
+
+ public TButton() : base()
+ {
+ InitializeComponent();
+
+ this.Margin = new Padding(10);
+
+ this.StyleDefault = new ButtonStyle()
+ {
+ BackColour = Color.White,
+ PenColour = Color.Black,
+ ForeImage = this.DefaultImage
+ };
+ this.StyleDown = new ButtonStyle()
+ {
+ BackColour = Color.FromArgb(0, 183, 209),
+ PenColour = Color.Black,
+ ForeImage = this.DownImage
+ };
+ this.StyleOver = new ButtonStyle()
+ {
+ BackColour = Color.FromArgb(108, 101, 196),
+ PenColour = Color.White,
+ ForeImage = this.OverImage
+ };
+ this.StyleSelected = new ButtonStyle()
+ {
+ BackColour = Color.FromArgb(51, 51, 51),
+ PenColour = Color.White,
+ ForeImage = this.OverImage
+ };
+
+ label1.ImageAlign = ContentAlignment.MiddleCenter;
+ label1.Click += delegate { this.OnClick(null); };
+ label1.MouseEnter += delegate { this.VisualState = ButtonState.Hover; };
+ label1.MouseLeave += delegate { this.VisualState = ButtonState.Idle; };
+ label1.MouseDown += delegate { this.VisualState = ButtonState.Down; };
+ label1.MouseUp += delegate { this.VisualState = ButtonState.Idle; };
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.VisualState = ButtonState.Idle;
+ }
+
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get => base.Margin; set => base.Margin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+
+ protected ButtonState VisualState
+ {
+ get { return controlState; }
+ set
+ {
+ switch (value)
+ {
+ case ButtonState.Idle:
+ if (this.VisualState == ButtonState.Down)
+ {
+ updateButton(StyleOver);
+ }
+ else
+ {
+ if (this.IsSelected)
+ {
+ updateButton(StyleSelected);
+ }
+ else
+ {
+ updateButton(StyleDefault);
+ }
+ }
+
+ break;
+ case ButtonState.Hover:
+ updateButton(StyleOver);
+ break;
+ case ButtonState.Down:
+ updateButton(StyleDown);
+ break;
+ default:
+ if (this.IsSelected)
+ {
+ updateButton(StyleSelected);
+ }
+ else
+ {
+ updateButton(StyleDefault);
+ }
+
+ break;
+ }
+
+ controlState = value;
+ }
+ }
+
+ protected void updateButton(ButtonStyle style)
+ {
+ label1.ForeColor = style.PenColour;
+ label1.BackColor = style.BackColour;
+ label1.Image = style.ForeImage;
+ }
+
+ [Browsable(true)]
+ [Category("Appearance")]
+ public string LabelText { get => label1.Text; set => label1.Text = value; }
+
+ [Browsable(true)]
+ [Category("Appearance")]
+ public Image OverImage { get; set; } = null;
+
+ [Browsable(true)]
+ [Category("Appearance")]
+ public Image DownImage { get; set; } = null;
+
+ [Browsable(true)]
+ [Category("Appearance")]
+ public Image DefaultImage { get; set; } = null;
+
+ public bool IsSelected
+ {
+ get => isSelected;
+ set
+ {
+ isSelected = value;
+
+ this.VisualState = this.VisualState;
+ }
+ }
+
+ protected ButtonStyle StyleOver { get; set; } = new ButtonStyle();
+ protected ButtonStyle StyleDown { get; set; } = new ButtonStyle();
+ protected ButtonStyle StyleDefault { get; set; } = new ButtonStyle();
+ protected ButtonStyle StyleSelected { get; set; } = new ButtonStyle();
+
+ public void PerformClick() => this.OnClick(null);
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TButton.designer.cs b/RyzStudio/Windows/ThemedForms/TButton.designer.cs
new file mode 100644
index 0000000..5bf79d6
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TButton.designer.cs
@@ -0,0 +1,61 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TButton
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.label1.Location = new System.Drawing.Point(4, 4);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(121, 25);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "label1";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // Button
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.label1);
+ this.Name = "Button";
+ this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.Size = new System.Drawing.Size(128, 32);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TButton.resx b/RyzStudio/Windows/ThemedForms/TButton.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TButton.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs b/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs
new file mode 100644
index 0000000..0133a0e
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs
@@ -0,0 +1,47 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TDialogForm
+ {
+ ///
+ /// 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.SuspendLayout();
+ //
+ // TDialogForm
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(249)))), ((int)(((byte)(250)))));
+ this.ClientSize = new System.Drawing.Size(340, 600);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.MinimumSize = new System.Drawing.Size(40, 0);
+ this.Name = "TDialogForm";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.cs b/RyzStudio/Windows/ThemedForms/TDialogForm.cs
new file mode 100644
index 0000000..05dc0e4
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TDialogForm.cs
@@ -0,0 +1,117 @@
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public partial class TDialogForm : Form
+ {
+ public TDialogForm()
+ {
+ this.InitializeComponent();
+
+ this.BackColor = Color.FromArgb(254, 254, 254);
+ this.FormBorderStyle = FormBorderStyle.Sizable;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Padding = new Padding(5, 10, 5, 10);
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = FormStartPosition.CenterParent;
+ this.TopMost = true;
+ this.SizeGripStyle = SizeGripStyle.Hide;
+ this.AutoScaleMode = AutoScaleMode.Font;
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Color BackColor { get => base.BackColor; set => base.BackColor = value; }
+
+ [Browsable(false)]
+ public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; }
+
+ [Browsable(false)]
+ public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; }
+
+ //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ //public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; }
+
+ //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ //public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool ShowIcon { get => base.ShowIcon; set => base.ShowIcon = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool ShowInTaskbar { get => base.ShowInTaskbar; set => base.ShowInTaskbar = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormStartPosition StartPosition { get => base.StartPosition; set => base.StartPosition = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool TopMost { get => base.TopMost; set => base.TopMost = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool RightToLeftLayout { get => base.RightToLeftLayout; set => base.RightToLeftLayout = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool MinimizeBox { get => base.MinimizeBox; set => base.MinimizeBox = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool MaximizeBox { get => base.MaximizeBox; set => base.MaximizeBox = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool ControlBox { get => base.ControlBox; set => base.ControlBox = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool HelpButton { get => base.HelpButton; set => base.HelpButton = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new MenuStrip MainMenuStrip { get => base.MainMenuStrip; set => base.MainMenuStrip = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new SizeGripStyle SizeGripStyle { get => base.SizeGripStyle; set => base.SizeGripStyle = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new AutoScaleMode AutoScaleMode { get => base.AutoScaleMode; set => base.AutoScaleMode = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Point AutoScrollOffset { get => base.AutoScrollOffset; set => base.AutoScrollOffset = value; }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new FormWindowState WindowState { get => base.WindowState; set => base.WindowState = value; }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.resx b/RyzStudio/Windows/ThemedForms/TDialogForm.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TDialogForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TListBox.cs b/RyzStudio/Windows/ThemedForms/TListBox.cs
new file mode 100644
index 0000000..2ddc41b
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TListBox.cs
@@ -0,0 +1,233 @@
+using RyzStudio.Drawing;
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using UIResource = FizzyLauncher.UIResource;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public partial class TListBox : RyzStudio.Windows.ThemedForms.TUserControl
+ {
+ protected readonly Padding textboxPadding = new Padding(6, 2, 4, 2);
+
+ public TListBox() : base()
+ {
+ InitializeComponent();
+
+ this.Font = new Font(this.Font, FontStyle.Regular);
+ this.Margin = new Padding(10, 4, 10, 4);
+
+ listBox1.Font = this.Font;
+ listBox1.BorderStyle = BorderStyle.None;
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ //int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ //this.Height = comboBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom);
+ }
+
+ protected override void OnGotFocus(EventArgs e)
+ {
+ base.OnGotFocus(e);
+
+ listBox1.Focus();
+ }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public System.Windows.Forms.ListBox ListBox { get => listBox1; set => listBox1 = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public TButton SubmitButton { get; set; } = null;
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get => base.Margin; set => base.Margin = value; }
+
+ [Category("Action")]
+ [Browsable(true)]
+ public event EventHandler OnAdd;
+
+ [Category("Action")]
+ [Browsable(true)]
+ public event EventHandler OnEdit;
+
+ protected override void updateBackground(Graphics g, ThemeStyle style)
+ {
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom));
+
+ Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
+ g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
+ g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
+ }
+
+ ///
+ /// Add
+ ///
+ ///
+ ///
+ private void imageBox1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ this.OnAdd?.Invoke(sender, e);
+ }
+
+ ///
+ /// Edit
+ ///
+ ///
+ ///
+ private void imageBox5_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ this.OnEdit?.Invoke(sender, e);
+ }
+
+ ///
+ /// Remove
+ ///
+ ///
+ ///
+ private void imageBox2_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+
+ if (listBox1.SelectedIndex < 0)
+ {
+ return;
+ }
+
+ int pos = listBox1.SelectedIndex;
+
+ listBox1.Items.RemoveAt(pos);
+
+ if (pos > (listBox1.Items.Count - 1))
+ {
+ pos = (listBox1.Items.Count - 1);
+ }
+
+ listBox1.SelectedIndex = pos;
+ }
+
+ ///
+ /// Move up
+ ///
+ ///
+ ///
+ private void imageBox3_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e != null)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ if (listBox1.SelectedIndex <= 0)
+ {
+ return;
+ }
+
+ if (listBox1.SelectedItem == null)
+ {
+ return;
+ }
+
+ object item = listBox1.SelectedItem;
+ int pos = listBox1.SelectedIndex;
+
+ listBox1.Items.RemoveAt(pos);
+ listBox1.Items.Insert((pos - 1), item);
+
+ listBox1.SelectedIndex = (pos - 1);
+ }
+
+ ///
+ /// Move down
+ ///
+ ///
+ ///
+ private void imageBox4_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e != null)
+ {
+ if (e.Button != MouseButtons.Left)
+ {
+ return;
+ }
+ }
+
+ if (listBox1.SelectedIndex >= (listBox1.Items.Count - 1))
+ {
+ return;
+ }
+
+ if (listBox1.SelectedItem == null)
+ {
+ return;
+ }
+
+ object item = listBox1.SelectedItem;
+ int pos = listBox1.SelectedIndex;
+
+ listBox1.Items.RemoveAt(pos);
+ listBox1.Items.Insert((pos + 1), item);
+
+ listBox1.SelectedIndex = (pos + 1);
+ }
+
+ private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) => imageBox5_MouseClick(sender, e);
+
+ private void listBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ switch (e.KeyCode)
+ {
+ case Keys.Enter:
+ if (this.SubmitButton != null)
+ {
+ this.SubmitButton.PerformClick();
+ }
+
+ break;
+ case Keys.Escape:
+ close();
+ break;
+ case Keys.Up:
+ if (e.Alt)
+ {
+ imageBox3_MouseClick(sender, null);
+ }
+
+ break;
+ case Keys.Down:
+ if (e.Alt)
+ {
+ imageBox4_MouseClick(sender, null);
+ }
+
+ break;
+ default: break;
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TListBox.designer.cs b/RyzStudio/Windows/ThemedForms/TListBox.designer.cs
new file mode 100644
index 0000000..469e7b0
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TListBox.designer.cs
@@ -0,0 +1,182 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TListBox
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.listBox1 = new System.Windows.Forms.ListBox();
+ this.imageBox5 = new RyzStudio.Windows.Forms.TImageBox();
+ this.imageBox4 = new RyzStudio.Windows.Forms.TImageBox();
+ this.imageBox3 = new RyzStudio.Windows.Forms.TImageBox();
+ this.imageBox2 = new RyzStudio.Windows.Forms.TImageBox();
+ this.imageBox1 = new RyzStudio.Windows.Forms.TImageBox();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox5)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox4)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // listBox1
+ //
+ this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listBox1.FormattingEnabled = true;
+ this.listBox1.Location = new System.Drawing.Point(4, 4);
+ this.listBox1.Name = "listBox1";
+ this.listBox1.Size = new System.Drawing.Size(121, 82);
+ this.listBox1.TabIndex = 0;
+ this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick);
+ this.listBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.listBox1_PreviewKeyDown);
+ //
+ // imageBox5
+ //
+ this.imageBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.imageBox5.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox5.ErrorImage = null;
+ this.imageBox5.ImageHover = global::FizzyLauncher.UIResource.edit2;
+ this.imageBox5.Image = global::FizzyLauncher.UIResource.edit;
+ this.imageBox5.InitialImage = null;
+ this.imageBox5.Location = new System.Drawing.Point(52, 94);
+ this.imageBox5.Name = "imageBox5";
+ this.imageBox5.ImageNormal = global::FizzyLauncher.UIResource.edit;
+ this.imageBox5.Size = new System.Drawing.Size(18, 25);
+ this.imageBox5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox5.TabIndex = 6;
+ this.imageBox5.TabStop = false;
+ this.imageBox5.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox5_MouseClick);
+ this.imageBox5.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox5_MouseClick);
+ //
+ // imageBox4
+ //
+ this.imageBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.imageBox4.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox4.ErrorImage = null;
+ this.imageBox4.ImageHover = global::FizzyLauncher.UIResource.arrow_down2;
+ this.imageBox4.Image = global::FizzyLauncher.UIResource.arrow_down;
+ this.imageBox4.InitialImage = null;
+ this.imageBox4.Location = new System.Drawing.Point(100, 94);
+ this.imageBox4.Name = "imageBox4";
+ this.imageBox4.ImageNormal = global::FizzyLauncher.UIResource.arrow_down;
+ this.imageBox4.Size = new System.Drawing.Size(18, 25);
+ this.imageBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox4.TabIndex = 5;
+ this.imageBox4.TabStop = false;
+ this.imageBox4.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox4_MouseClick);
+ this.imageBox4.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox4_MouseClick);
+ //
+ // imageBox3
+ //
+ this.imageBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.imageBox3.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox3.ErrorImage = null;
+ this.imageBox3.ImageHover = global::FizzyLauncher.UIResource.arrow_up2;
+ this.imageBox3.Image = global::FizzyLauncher.UIResource.arrow_up;
+ this.imageBox3.InitialImage = null;
+ this.imageBox3.Location = new System.Drawing.Point(76, 94);
+ this.imageBox3.Name = "imageBox3";
+ this.imageBox3.ImageNormal = global::FizzyLauncher.UIResource.arrow_up;
+ this.imageBox3.Size = new System.Drawing.Size(18, 25);
+ this.imageBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox3.TabIndex = 4;
+ this.imageBox3.TabStop = false;
+ this.imageBox3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox3_MouseClick);
+ this.imageBox3.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox3_MouseClick);
+ //
+ // imageBox2
+ //
+ this.imageBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.imageBox2.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox2.ErrorImage = null;
+ this.imageBox2.ImageHover = global::FizzyLauncher.UIResource.minus2;
+ this.imageBox2.Image = global::FizzyLauncher.UIResource.minus;
+ this.imageBox2.InitialImage = null;
+ this.imageBox2.Location = new System.Drawing.Point(28, 94);
+ this.imageBox2.Name = "imageBox2";
+ this.imageBox2.ImageNormal = global::FizzyLauncher.UIResource.minus;
+ this.imageBox2.Size = new System.Drawing.Size(18, 25);
+ this.imageBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox2.TabIndex = 3;
+ this.imageBox2.TabStop = false;
+ this.imageBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox2_MouseClick);
+ this.imageBox2.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox2_MouseClick);
+ //
+ // imageBox1
+ //
+ this.imageBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.imageBox1.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox1.ErrorImage = null;
+ this.imageBox1.ImageHover = global::FizzyLauncher.UIResource.plus2;
+ this.imageBox1.Image = global::FizzyLauncher.UIResource.plus;
+ this.imageBox1.InitialImage = null;
+ this.imageBox1.Location = new System.Drawing.Point(4, 94);
+ this.imageBox1.Name = "imageBox1";
+ this.imageBox1.ImageNormal = global::FizzyLauncher.UIResource.plus;
+ this.imageBox1.Size = new System.Drawing.Size(18, 25);
+ this.imageBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox1.TabIndex = 2;
+ this.imageBox1.TabStop = false;
+ this.imageBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox1_MouseClick);
+ this.imageBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox1_MouseClick);
+ //
+ // TListBox
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.Controls.Add(this.imageBox5);
+ this.Controls.Add(this.imageBox4);
+ this.Controls.Add(this.imageBox3);
+ this.Controls.Add(this.imageBox2);
+ this.Controls.Add(this.imageBox1);
+ this.Controls.Add(this.listBox1);
+ this.Name = "TListBox";
+ this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.Size = new System.Drawing.Size(128, 120);
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox5)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox4)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ListBox listBox1;
+ private Forms.TImageBox imageBox1;
+ private Forms.TImageBox imageBox2;
+ private Forms.TImageBox imageBox3;
+ private Forms.TImageBox imageBox4;
+ private Forms.TImageBox imageBox5;
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TListBox.resx b/RyzStudio/Windows/ThemedForms/TListBox.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TListBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TUserControl.cs b/RyzStudio/Windows/ThemedForms/TUserControl.cs
new file mode 100644
index 0000000..56bea24
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TUserControl.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using RyzStudio.Drawing;
+using System.ComponentModel;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public partial class TUserControl : System.Windows.Forms.UserControl
+ {
+ public class ThemeStyle
+ {
+ public int BorderWidth;
+ public int BorderRadius;
+ public int BorderPadding;
+ public Color BorderColour;
+ public Color BackColour;
+ public Color ForeColour;
+
+ public ThemeStyle(int borderWidth, int borderRadius, int borderPadding, Color borderColour, Color backColour)
+ {
+ this.BorderWidth = borderWidth;
+ this.BorderRadius = borderRadius;
+ this.BorderPadding = borderPadding;
+ this.BorderColour = borderColour;
+ this.BackColour = backColour;
+ this.ForeColour = Color.Black;
+ }
+
+ public ThemeStyle(int borderWidth, int borderRadius, int borderPadding, Color borderColour, Color backColour, Color foreColour)
+ {
+ this.BorderWidth = borderWidth;
+ this.BorderRadius = borderRadius;
+ this.BorderPadding = borderPadding;
+ this.BorderColour = borderColour;
+ this.BackColour = backColour;
+ this.ForeColour = foreColour;
+ }
+ }
+
+ protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(212, 212, 212), Color.White);
+
+ public TUserControl()
+ {
+ InitializeComponent();
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.BackColor = Color.Transparent;
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs e)
+ {
+ base.OnPaintBackground(e);
+
+ Graphics g = e.Graphics;
+ //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
+ //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
+ //g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
+ //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
+
+ updateBackground(g, styleActive);
+ }
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Padding { get => base.Padding; set => base.Padding = value; }
+
+ protected virtual void updateBackground(Graphics g, ThemeStyle style)
+ {
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Padding = new Padding(b, b, (b - 1), (b - 1));
+
+ Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
+ g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
+ g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
+ }
+
+ protected virtual void close()
+ {
+ if (this.Parent == null)
+ {
+ return;
+ }
+
+ if (this.Parent is Form)
+ {
+ (this.Parent as Form).Close();
+ return;
+ }
+
+ if (this.Parent.GetType().IsSubclassOf(typeof(System.Windows.Forms.Form)))
+ {
+ System.Windows.Forms.Form parentForm = (System.Windows.Forms.Form)this.Parent;
+ if (parentForm != null)
+ {
+ parentForm.Close();
+ }
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs b/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs
new file mode 100644
index 0000000..6f57544
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs
@@ -0,0 +1,37 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TUserControl
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ }
+
+ #endregion
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs
new file mode 100644
index 0000000..dbe7d77
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs
@@ -0,0 +1,127 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ using RyzStudio.Drawing;
+ using System;
+ using System.ComponentModel;
+ using System.Drawing;
+ using System.Windows.Forms;
+
+ public partial class TButtonTextBox : RyzStudio.Windows.ThemedForms.TUserControl
+ {
+ protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6);
+
+ public TButtonTextBox() : base()
+ {
+ InitializeComponent();
+
+ //this.Margin = new Padding(10, 6, 10, 6);
+ this.Margin = new Padding(10, 3, 3, 3);
+ this.Font = new Font(this.Font, FontStyle.Regular);
+
+ textBox1.Font = this.Font;
+ textBox1.Left = this.Margin.Left;
+ textBox1.PreviewKeyDown += textBox_PreviewKeyDown;
+
+ imageBox1.Click += imageBox1_Click;
+
+ OnResize(null);
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Height = textBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom);
+
+ imageBox1.Width = 18;
+ imageBox1.Height = textBox1.Height + textboxPadding.Top + textboxPadding.Bottom;
+ imageBox1.Left = this.Width - (this.Margin.Right + b + imageBox1.Width);
+
+ textBox1.Left = this.Margin.Left;
+ textBox1.Width = imageBox1.Left - textBox1.Left - 3;
+ textBox1.Top = (int)Math.Ceiling(decimal.Divide((this.Height - textBox1.Height), 2));
+ }
+
+ protected override void OnGotFocus(EventArgs e)
+ {
+ base.OnGotFocus(e);
+
+ textBox1.Focus();
+ }
+
+ protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ switch (e.KeyCode)
+ {
+ case Keys.Enter:
+ if (this.SubmitButton != null)
+ {
+ this.SubmitButton.PerformClick();
+ }
+
+ break;
+ case Keys.Escape:
+ close();
+ break;
+ default: break;
+ }
+ }
+
+ protected virtual void imageBox1_Click(object sender, EventArgs e) => OnButtonClick?.Invoke(sender, e);
+
+ [Category("Action")]
+ [Browsable(true)]
+ public event EventHandler OnButtonClick;
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public Forms.TImageBox InnerImageBox { get => imageBox1; set => imageBox1 = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image NormalImage { get => imageBox1.ImageNormal; set => imageBox1.ImageNormal = value; }
+
+ [Category("Appearance"), Browsable(true)]
+ public Image HighlightImage { get => imageBox1.ImageHover; set => imageBox1.ImageHover = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public new string Text
+ {
+ get => textBox1.Text;
+ set
+ {
+ textBox1.Text = value;
+ textBox1.SelectionStart = textBox1.Text.Length;
+ }
+ }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public TButton SubmitButton { get; set; } = null;
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get => base.Margin; set => base.Margin = value; }
+
+ protected override void updateBackground(Graphics g, ThemeStyle style)
+ {
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom));
+
+ Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
+ g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
+ g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs
new file mode 100644
index 0000000..6a37b71
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs
@@ -0,0 +1,81 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TButtonTextBox
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.imageBox1 = new RyzStudio.Windows.Forms.TImageBox();
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.BackColor = System.Drawing.SystemColors.Window;
+ this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.textBox1.HideSelection = false;
+ this.textBox1.Location = new System.Drawing.Point(7, 7);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(68, 13);
+ this.textBox1.TabIndex = 0;
+ //
+ // imageBox1
+ //
+ this.imageBox1.BackColor = System.Drawing.Color.Transparent;
+ this.imageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageBox1.ErrorImage = null;
+ this.imageBox1.ImageHover = null;
+ this.imageBox1.Image = null;
+ this.imageBox1.InitialImage = null;
+ this.imageBox1.Location = new System.Drawing.Point(107, 4);
+ this.imageBox1.Name = "imageBox1";
+ this.imageBox1.ImageNormal = null;
+ this.imageBox1.Size = new System.Drawing.Size(18, 25);
+ this.imageBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.imageBox1.TabIndex = 1;
+ this.imageBox1.TabStop = false;
+ //
+ // TextBox2
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.Controls.Add(this.imageBox1);
+ this.Controls.Add(this.textBox1);
+ this.Name = "TextBox2";
+ this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.Size = new System.Drawing.Size(128, 32);
+ ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox textBox1;
+ private Forms.TImageBox imageBox1;
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs
new file mode 100644
index 0000000..341b480
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs
@@ -0,0 +1,42 @@
+using System;
+using System.IO;
+using System.Windows.Forms;
+using UIResources = FizzyLauncher.UIResource;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public class TFolderTextBox : TButtonTextBox
+ {
+ public TFolderTextBox() : base()
+ {
+ this.NormalImage = UIResources.folder;
+ this.HighlightImage = UIResources.folder2;
+ this.Text = string.Empty;
+ }
+
+ public FolderBrowserDialog FolderDialog { get; set; } = null;
+
+ protected override void imageBox1_Click(object sender, EventArgs e)
+ {
+ if (this.FolderDialog == null)
+ {
+ this.FolderDialog = new FolderBrowserDialog();
+ this.FolderDialog.Description = "Choose a directory";
+ }
+
+ if (!string.IsNullOrWhiteSpace(this.Text))
+ {
+ if (Directory.Exists(this.Text))
+ {
+ this.FolderDialog.SelectedPath = this.Text;
+ }
+ }
+
+ if (this.FolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ {
+ this.Text = this.FolderDialog.SelectedPath;
+ }
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs
new file mode 100644
index 0000000..08e9f2f
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Text;
+using System.Windows.Forms;
+using UIResources = FizzyLauncher.UIResource;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public class TKeyCodeTextBox : TButtonTextBox
+ {
+ public class Results
+ {
+ public bool IsCtrl { get; set; } = false;
+ public bool IsAlt { get; set; } = false;
+ public bool IsShift { get; set; } = false;
+ public Keys Key { get; set; } = Keys.None;
+
+ public int ModifierCode => ((this.IsAlt ? 1 : 0) + (this.IsCtrl ? 2 : 0) + (this.IsShift ? 4 : 0));
+
+ public int KeyCode => (int)this.Key;
+
+ public string DisplayText
+ {
+ get
+ {
+ StringBuilder sb = new StringBuilder();
+
+ if (this.IsCtrl) sb.Append("Ctrl+");
+ if (this.IsShift) sb.Append("Shift+");
+ if (this.IsAlt) sb.Append("Alt+");
+
+ sb.Append(this.Key.ToString());
+
+ return sb.ToString();
+ }
+ }
+
+ public void Clear()
+ {
+ this.IsCtrl = false;
+ this.IsAlt = false;
+ this.IsShift = false;
+ this.Key = Keys.None;
+ }
+ }
+
+
+ public Results KeyCodeResults { get; set; } = new Results();
+
+
+ public TKeyCodeTextBox() : base()
+ {
+ this.NormalImage = UIResources.trash;
+ this.HighlightImage = UIResources.trash2;
+ this.Text = string.Empty;
+
+ this.InnerTextBox.ReadOnly = true;
+ this.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown;
+ }
+
+ private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ if (e.KeyCode == Keys.ControlKey) return;
+ if (e.KeyCode == Keys.ShiftKey) return;
+ if (e.KeyCode == Keys.Menu) return;
+
+ this.KeyCodeResults.IsCtrl = e.Control;
+ this.KeyCodeResults.IsAlt = e.Alt;
+ this.KeyCodeResults.IsShift = e.Shift;
+ this.KeyCodeResults.Key = e.KeyCode;
+
+ this.Text = this.KeyCodeResults.DisplayText;
+ }
+
+ protected override void imageBox1_Click(object sender, EventArgs e)
+ {
+ this.KeyCodeResults.Clear();
+
+ this.Text = this.KeyCodeResults.DisplayText;
+ }
+
+ public void UpdateKeyCode(bool isCtrl, bool isAlt, bool isShift, Keys key)
+ {
+ this.KeyCodeResults.IsCtrl = isCtrl;
+ this.KeyCodeResults.IsAlt = isAlt;
+ this.KeyCodeResults.IsShift = isShift;
+ this.KeyCodeResults.Key = key;
+
+ this.Text = this.KeyCodeResults.DisplayText;
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs
new file mode 100644
index 0000000..0fb3daa
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs
@@ -0,0 +1,43 @@
+using System;
+using System.IO;
+using System.Windows.Forms;
+using UIResources = FizzyLauncher.UIResource;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public class TOpenFileTextBox : TButtonTextBox
+ {
+ public TOpenFileTextBox() : base()
+ {
+ this.NormalImage = UIResources.file;
+ this.HighlightImage = UIResources.file2;
+ this.Text = string.Empty;
+ }
+
+ public OpenFileDialog FileDialog { get; set; } = null;
+
+ protected override void imageBox1_Click(object sender, EventArgs e)
+ {
+ if (this.FileDialog == null)
+ {
+ this.FileDialog = new OpenFileDialog();
+ this.FileDialog.Title = "Choose a file";
+ this.FileDialog.Filter = "All files|*";
+ }
+
+ if (!string.IsNullOrWhiteSpace(this.Text))
+ {
+ if (File.Exists(this.Text))
+ {
+ this.FileDialog.InitialDirectory = Path.GetDirectoryName(this.Text);
+ }
+ }
+
+ if (this.FileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ {
+ this.Text = this.FileDialog.FileName;
+ }
+ }
+
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs
new file mode 100644
index 0000000..be72ccd
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs
@@ -0,0 +1,100 @@
+using RyzStudio.Drawing;
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace RyzStudio.Windows.ThemedForms
+{
+ public partial class TTextBox : RyzStudio.Windows.ThemedForms.TUserControl
+ {
+ protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6);
+
+
+ public TTextBox() : base()
+ {
+ InitializeComponent();
+
+ this.Margin = new Padding(10, 6, 10, 6);
+ this.Font = new Font(this.Font, FontStyle.Regular);
+
+ textBox1.Font = this.Font;
+ textBox1.PreviewKeyDown += textBox_PreviewKeyDown;
+ }
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Height = textBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom);
+
+ this.Invalidate();
+ }
+
+ protected override void OnGotFocus(EventArgs e)
+ {
+ base.OnGotFocus(e);
+
+ textBox1.Focus();
+ }
+
+ protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+ {
+ switch (e.KeyCode)
+ {
+ case Keys.Enter:
+ if (this.SubmitButton != null)
+ {
+ this.SubmitButton.PerformClick();
+ }
+
+ break;
+ case Keys.Escape:
+ close();
+ break;
+ default: break;
+ }
+ }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public new string Text
+ {
+ get => textBox1.Text;
+ set
+ {
+ textBox1.Text = value;
+ textBox1.SelectionStart = textBox1.Text.Length;
+ }
+ }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; }
+
+ [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
+ [Category("Appearance")]
+ public TButton SubmitButton { get; set; } = null;
+
+ [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
+ public new Padding Margin { get { return base.Margin; } set { base.Margin = value; } }
+
+ protected override void updateBackground(Graphics g, ThemeStyle style)
+ {
+ int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;
+
+ this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom));
+
+ Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
+ g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
+ g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs
new file mode 100644
index 0000000..752557d
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs
@@ -0,0 +1,60 @@
+namespace RyzStudio.Windows.ThemedForms
+{
+ partial class TTextBox
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.textBox1.HideSelection = false;
+ this.textBox1.Location = new System.Drawing.Point(4, 4);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(121, 13);
+ this.textBox1.TabIndex = 0;
+ //
+ // TextBox
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.Controls.Add(this.textBox1);
+ this.Name = "TextBox";
+ this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.Size = new System.Drawing.Size(128, 32);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox textBox1;
+ }
+}
diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/Text/Json/JsonPointConverter.cs b/Text/Json/JsonPointConverter.cs
new file mode 100644
index 0000000..e787cdc
--- /dev/null
+++ b/Text/Json/JsonPointConverter.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Drawing;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace FizzyLauncher.Text.Json
+{
+ public class JsonPointConverter : JsonConverter
+ {
+ public override Point Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ Point rs = new Point(0, 0);
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ string[] parts = reader.GetString().Split(',');
+ if (parts.Length != 2)
+ {
+ return rs;
+ }
+
+ int x = 0;
+ int y = 0;
+
+ if (!int.TryParse(parts[0].Trim(), out x)) x = 0;
+ if (!int.TryParse(parts[1].Trim(), out y)) y = 0;
+
+ return new Point(x, y);
+ }
+
+ return rs;
+ }
+
+ public override void Write(Utf8JsonWriter writer, Point value, JsonSerializerOptions options)
+ {
+ writer.WriteStringValue(string.Format("{0}, {1}", value.X.ToString(), value.Y.ToString()));
+ }
+
+ }
+}
diff --git a/Text/Json/JsonSizeConverter.cs b/Text/Json/JsonSizeConverter.cs
new file mode 100644
index 0000000..eb763fa
--- /dev/null
+++ b/Text/Json/JsonSizeConverter.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Drawing;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace FizzyLauncher.Text.Json
+{
+ public class JsonSizeConverter : JsonConverter
+ {
+ public override Size Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ Size rs = new Size(0, 0);
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ string[] parts = reader.GetString().Split(',');
+ if (parts.Length != 2)
+ {
+ return rs;
+ }
+
+ int w = 0;
+ int h = 0;
+
+ if (!int.TryParse(parts[0].Trim(), out w)) w = 0;
+ if (!int.TryParse(parts[1].Trim(), out h)) h = 0;
+
+ return new Size(w, h);
+ }
+
+ return rs;
+ }
+
+ public override void Write(Utf8JsonWriter writer, Size value, JsonSerializerOptions options)
+ {
+ writer.WriteStringValue(string.Format("{0}, {1}", value.Width.ToString(), value.Height.ToString()));
+ }
+
+ }
+}
diff --git a/UIResource.Designer.cs b/UIResource.Designer.cs
new file mode 100644
index 0000000..0f0a495
--- /dev/null
+++ b/UIResource.Designer.cs
@@ -0,0 +1,243 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace FizzyLauncher {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class UIResource {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal UIResource() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FizzyLauncher.UIResource", typeof(UIResource).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrow_down {
+ get {
+ object obj = ResourceManager.GetObject("arrow_down", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrow_down2 {
+ get {
+ object obj = ResourceManager.GetObject("arrow_down2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrow_up {
+ get {
+ object obj = ResourceManager.GetObject("arrow_up", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrow_up2 {
+ get {
+ object obj = ResourceManager.GetObject("arrow_up2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap close {
+ get {
+ object obj = ResourceManager.GetObject("close", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap close2 {
+ get {
+ object obj = ResourceManager.GetObject("close2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap edit {
+ get {
+ object obj = ResourceManager.GetObject("edit", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap edit2 {
+ get {
+ object obj = ResourceManager.GetObject("edit2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap file {
+ get {
+ object obj = ResourceManager.GetObject("file", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap file2 {
+ get {
+ object obj = ResourceManager.GetObject("file2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap folder {
+ get {
+ object obj = ResourceManager.GetObject("folder", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap folder2 {
+ get {
+ object obj = ResourceManager.GetObject("folder2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap minus {
+ get {
+ object obj = ResourceManager.GetObject("minus", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap minus2 {
+ get {
+ object obj = ResourceManager.GetObject("minus2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap plus {
+ get {
+ object obj = ResourceManager.GetObject("plus", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap plus2 {
+ get {
+ object obj = ResourceManager.GetObject("plus2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap trash {
+ get {
+ object obj = ResourceManager.GetObject("trash", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap trash2 {
+ get {
+ object obj = ResourceManager.GetObject("trash2", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/UIResource.resx b/UIResource.resx
new file mode 100644
index 0000000..96b7c2a
--- /dev/null
+++ b/UIResource.resx
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Resources\UI\arrow_down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\arrow_down2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\arrow_up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\arrow_up2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\close2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\edit2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\file2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\folder2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\minus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\minus2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\plus2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\trash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Resources\UI\trash2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Windows/Forms/EditGroupForm.cs b/Windows/Forms/EditGroupForm.cs
new file mode 100644
index 0000000..c3108d9
--- /dev/null
+++ b/Windows/Forms/EditGroupForm.cs
@@ -0,0 +1,177 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.ThemedForms;
+using System;
+
+namespace FizzyLauncher.Windows.Forms
+{
+ public class EditGroupForm : TDialogForm
+ {
+ public static void ShowDialog(TilePanelLayout control)
+ {
+ EditGroupForm form = new EditGroupForm();
+ form.TilePanelLayout = control;
+ form.ShowDialog();
+ }
+
+
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private TButton button1;
+ private TPickerBox pickerBox1;
+ private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2;
+ private TTextBox textBox1;
+
+
+ public EditGroupForm() : base()
+ {
+ InitializeComponent();
+
+ pickerBox1.ComboBox.Items.Clear();
+ pickerBox1.ComboBox.Items.AddRange(new string[] { "No", "Yes" });
+ if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0;
+ }
+
+ private void InitializeComponent()
+ {
+ this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.button1 = new RyzStudio.Windows.ThemedForms.TButton();
+ this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox();
+ this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.BackColor = System.Drawing.Color.Transparent;
+ this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox1.Location = new System.Drawing.Point(192, 20);
+ this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox1.Size = new System.Drawing.Size(177, 35);
+ this.textBox1.SubmitButton = null;
+ this.textBox1.TabIndex = 152;
+ this.textBox1.UseSystemPasswordChar = false;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label2.Location = new System.Drawing.Point(10, 62);
+ this.label2.Name = "label2";
+ this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label2.Size = new System.Drawing.Size(119, 34);
+ this.label2.TabIndex = 155;
+ this.label2.Text = "Show Only Expanded";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label1.Location = new System.Drawing.Point(10, 21);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label1.Size = new System.Drawing.Size(29, 34);
+ this.label1.TabIndex = 153;
+ this.label1.Text = "Title";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // button1
+ //
+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.button1.BackColor = System.Drawing.Color.Transparent;
+ this.button1.DefaultImage = null;
+ this.button1.DownImage = null;
+ this.button1.IsSelected = false;
+ this.button1.LabelText = "&OK";
+ this.button1.Location = new System.Drawing.Point(241, 469);
+ this.button1.Margin = new System.Windows.Forms.Padding(10);
+ this.button1.Name = "button1";
+ this.button1.OverImage = null;
+ this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.button1.Size = new System.Drawing.Size(128, 32);
+ this.button1.TabIndex = 173;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // pickerBox1
+ //
+ this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox1.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox1.Location = new System.Drawing.Point(285, 62);
+ this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.pickerBox1.Name = "pickerBox1";
+ this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox1.Size = new System.Drawing.Size(84, 34);
+ this.pickerBox1.SubmitButton = null;
+ this.pickerBox1.TabIndex = 174;
+ //
+ // horizontalSeparator2
+ //
+ this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent;
+ this.horizontalSeparator2.Location = new System.Drawing.Point(10, 437);
+ this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22);
+ this.horizontalSeparator2.Name = "horizontalSeparator2";
+ this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22);
+ this.horizontalSeparator2.TabIndex = 182;
+ //
+ // EditGroupForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.ClientSize = new System.Drawing.Size(384, 521);
+ this.Controls.Add(this.horizontalSeparator2);
+ this.Controls.Add(this.pickerBox1);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.textBox1);
+ this.MinimumSize = new System.Drawing.Size(400, 560);
+ this.Name = "EditGroupForm";
+ this.Text = "Edit Group";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+
+ if (this.TilePanelLayout != null)
+ {
+ textBox1.Text = this.TilePanelLayout.Model.Title;
+ pickerBox1.ComboBox.SelectedIndex = (this.TilePanelLayout.Model.IsExclusive ? 1 : 0);
+ }
+ }
+
+
+ public TilePanelLayout TilePanelLayout { get; set; } = null;
+
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ TileGroupModel model = this.TilePanelLayout.Model;
+ model.Title = textBox1.Text?.Trim();
+ model.IsExclusive = (pickerBox1.ComboBox.SelectedIndex == 1);
+
+ this.TilePanelLayout.UpdateModel(model);
+
+ this.Close();
+ }
+
+ }
+}
diff --git a/Windows/Forms/EditGroupForm.resx b/Windows/Forms/EditGroupForm.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Windows/Forms/EditGroupForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/Windows/Forms/EditTileFolderForm.cs b/Windows/Forms/EditTileFolderForm.cs
new file mode 100644
index 0000000..a16b75e
--- /dev/null
+++ b/Windows/Forms/EditTileFolderForm.cs
@@ -0,0 +1,384 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.ThemedForms;
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace FizzyLauncher.Windows.Forms
+{
+ public class EditTileFolderForm : TDialogForm
+ {
+ public static void ShowAddDialog(TilePanelLayout control, Point coord)
+ {
+ EditTileFolderForm form = new EditTileFolderForm(DialogModeType.Add);
+ form.TilePanelLayout = control;
+ form.AimCoord = coord;
+ form.ShowDialog();
+ }
+
+ public static void ShowEditDialog(TilePanel control)
+ {
+ EditTileFolderForm form = new EditTileFolderForm(DialogModeType.Edit);
+ form.TilePanel = control;
+ form.ShowDialog();
+ }
+
+
+ private System.Windows.Forms.Label label1;
+ private TButton button1;
+ private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2;
+ private TTextBox textBox1;
+ private TListBox listBox1;
+ private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1;
+ private System.Windows.Forms.Label label2;
+
+
+ public enum DialogModeType
+ {
+ Add = 0,
+ Edit
+ }
+
+
+ protected DialogModeType dialogMode = DialogModeType.Add;
+
+
+ public EditTileFolderForm(DialogModeType dialogMode) : base()
+ {
+ InitializeComponent();
+
+ this.DialogMode = dialogMode;
+ }
+
+ private void InitializeComponent()
+ {
+ this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.button1 = new RyzStudio.Windows.ThemedForms.TButton();
+ this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.listBox1 = new RyzStudio.Windows.ThemedForms.TListBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.BackColor = System.Drawing.Color.Transparent;
+ this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox1.Location = new System.Drawing.Point(192, 20);
+ this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox1.Size = new System.Drawing.Size(177, 35);
+ this.textBox1.SubmitButton = null;
+ this.textBox1.TabIndex = 152;
+ this.textBox1.UseSystemPasswordChar = false;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label1.Location = new System.Drawing.Point(10, 21);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label1.Size = new System.Drawing.Size(29, 34);
+ this.label1.TabIndex = 153;
+ this.label1.Text = "Title";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // button1
+ //
+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.button1.BackColor = System.Drawing.Color.Transparent;
+ this.button1.DefaultImage = null;
+ this.button1.DownImage = null;
+ this.button1.IsSelected = false;
+ this.button1.LabelText = "&OK";
+ this.button1.Location = new System.Drawing.Point(241, 469);
+ this.button1.Margin = new System.Windows.Forms.Padding(10);
+ this.button1.Name = "button1";
+ this.button1.OverImage = null;
+ this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.button1.Size = new System.Drawing.Size(128, 32);
+ this.button1.TabIndex = 173;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // horizontalSeparator2
+ //
+ this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent;
+ this.horizontalSeparator2.Location = new System.Drawing.Point(10, 61);
+ this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22);
+ this.horizontalSeparator2.Name = "horizontalSeparator2";
+ this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22);
+ this.horizontalSeparator2.TabIndex = 177;
+ //
+ // listBox1
+ //
+ this.listBox1.AllowDrop = true;
+ this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listBox1.BackColor = System.Drawing.Color.Transparent;
+ this.listBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.listBox1.Location = new System.Drawing.Point(109, 87);
+ this.listBox1.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4);
+ this.listBox1.Name = "listBox1";
+ this.listBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.listBox1.Size = new System.Drawing.Size(260, 346);
+ this.listBox1.SubmitButton = null;
+ this.listBox1.TabIndex = 180;
+ this.listBox1.OnAdd += new System.EventHandler(this.listBox1_OnAdd);
+ this.listBox1.OnEdit += new System.EventHandler(this.listBox1_OnEdit);
+ this.listBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.listBox1_DragDrop);
+ this.listBox1.DragOver += new System.Windows.Forms.DragEventHandler(this.listBox1_DragOver);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label2.Location = new System.Drawing.Point(8, 87);
+ this.label2.Name = "label2";
+ this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label2.Size = new System.Drawing.Size(25, 34);
+ this.label2.TabIndex = 181;
+ this.label2.Text = "List";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // tHorizontalSeparator1
+ //
+ this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent;
+ this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 437);
+ this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22);
+ this.tHorizontalSeparator1.Name = "tHorizontalSeparator1";
+ this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.tHorizontalSeparator1.Size = new System.Drawing.Size(364, 22);
+ this.tHorizontalSeparator1.TabIndex = 182;
+ //
+ // AddTileFolderForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.ClientSize = new System.Drawing.Size(384, 521);
+ this.Controls.Add(this.tHorizontalSeparator1);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.listBox1);
+ this.Controls.Add(this.horizontalSeparator2);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.textBox1);
+ this.MinimumSize = new System.Drawing.Size(400, 560);
+ this.Name = "AddTileFolderForm";
+ this.Text = "Add List Tile";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+
+ if (this.DialogMode == DialogModeType.Edit)
+ {
+ listBox1.ListBox.Items.Clear();
+
+ if (this.TilePanel == null) return;
+ if (this.TilePanel.ModelInfo == null) return;
+
+ textBox1.Text = this.TilePanel.ModelInfo.Title;
+
+ if (this.TilePanel.ModelInfo.Items != null)
+ {
+ foreach (TileModel item in this.TilePanel.ModelInfo.Items)
+ {
+ if (item.IsGroup)
+ {
+ continue;
+ }
+
+ listBox1.ListBox.Items.Add(item);
+ }
+ }
+ }
+ }
+
+
+ public TilePanelLayout TilePanelLayout { get; set; } = null;
+
+ public TilePanel TilePanel { get; set; } = null;
+
+ public Point AimCoord { get; set; } = new Point(-1, -1);
+
+ public DialogModeType DialogMode
+ {
+ get => dialogMode;
+ set
+ {
+ dialogMode = value;
+
+ switch (dialogMode)
+ {
+ case DialogModeType.Add:
+ this.Text = "Add Tile List";
+ break;
+ case DialogModeType.Edit:
+ this.Text = "Edit Tile List";
+ break;
+ default: break;
+ }
+ }
+ }
+
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ TileModel model = new TileModel()
+ {
+ Title = textBox1.Text?.Trim(),
+ IsGroup = true
+ };
+
+ switch (this.DialogMode)
+ {
+ case DialogModeType.Add:
+ if (!this.AimCoord.Equals(new Point(-1, -1)))
+ {
+ model.Position = this.AimCoord;
+ }
+
+ model.Items = new System.Collections.Generic.List();
+
+ foreach (TileModel item in listBox1.ListBox.Items.OfType())
+ {
+ if (item.IsGroup)
+ {
+ continue;
+ }
+
+ model.Items.Add(item);
+ }
+
+ this.TilePanelLayout.AddTile(model);
+
+ break;
+ case DialogModeType.Edit:
+ model.Items = new System.Collections.Generic.List();
+
+ foreach (TileModel item in listBox1.ListBox.Items.OfType())
+ {
+ if (item.IsGroup)
+ {
+ continue;
+ }
+
+ model.Items.Add(item);
+ }
+
+ this.TilePanel.LoadInfo(model);
+
+ break;
+ default: break;
+ }
+
+ this.Close();
+ }
+
+ private void listBox1_OnAdd(object sender, EventArgs e) => EditTileForm.ShowAddDialog(listBox1);
+
+ private void listBox1_OnEdit(object sender, EventArgs e)
+ {
+ if (listBox1.ListBox.Items.Count <= 0)
+ {
+ return;
+ }
+
+ EditTileForm.ShowEditDialog(listBox1);
+ }
+
+ private void listBox1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop))
+ {
+ e.Effect = DragDropEffects.Link;
+ }
+ else
+ {
+ e.Effect = DragDropEffects.None;
+ }
+ }
+
+ private void listBox1_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
+ if (fileList == null)
+ {
+ return;
+ }
+
+ if (fileList.Length <= 0)
+ {
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(fileList[0]))
+ {
+ return;
+ }
+
+ TileModel model = new TileModel()
+ {
+ ProcessFilename = fileList[0],
+ Title = Path.GetFileName(fileList[0])
+ };
+
+ // exe
+ if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase))
+ {
+ if (File.Exists(fileList[0]))
+ {
+ try
+ {
+ FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]);
+ if (fvi != null)
+ {
+ model.Title = fvi.ProductName;
+ }
+ }
+ catch
+ {
+ // do nothing
+ }
+ }
+
+
+ if (string.IsNullOrWhiteSpace(model.Title))
+ {
+ model.Title = Path.GetFileNameWithoutExtension(fileList[0]);
+ }
+ }
+
+ listBox1.ListBox.Items.Add(model);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Windows/Forms/EditTileFolderForm.resx b/Windows/Forms/EditTileFolderForm.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Windows/Forms/EditTileFolderForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/Windows/Forms/EditTileForm.cs b/Windows/Forms/EditTileForm.cs
new file mode 100644
index 0000000..4c962c7
--- /dev/null
+++ b/Windows/Forms/EditTileForm.cs
@@ -0,0 +1,483 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.ThemedForms;
+using System;
+using System.Drawing;
+
+namespace FizzyLauncher.Windows.Forms
+{
+ public class EditTileForm : TDialogForm
+ {
+ public static void ShowAddDialog(TilePanelLayout control, Point coord)
+ {
+ EditTileForm form = new EditTileForm(DialogModeType.Add);
+ form.TilePanelLayout = control;
+ form.AimCoord = coord;
+ form.ShowDialog();
+ }
+
+ public static void ShowAddDialog(TListBox control)
+ {
+ EditTileForm form = new EditTileForm(DialogModeType.Add);
+ form.ListBox = control;
+ form.ShowDialog();
+ }
+
+ public static void ShowEditDialog(TilePanel control)
+ {
+ EditTileForm form = new EditTileForm(DialogModeType.Edit);
+ form.TilePanel = control;
+ form.ShowDialog();
+ }
+
+ public static void ShowEditDialog(TListBox control)
+ {
+ EditTileForm form = new EditTileForm(DialogModeType.Edit);
+ form.ListBox = control;
+ form.ShowDialog();
+ }
+
+
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private TOpenFileTextBox textBox2;
+ private TTextBox textBox3;
+ private TFolderTextBox textBox4;
+ private TButton button1;
+ private TPickerBox pickerBox1;
+ private TPickerBox pickerBox2;
+ private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator1;
+ private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2;
+ private TTextBox textBox1;
+
+
+ public enum DialogModeType
+ {
+ Add = 0,
+ Edit
+ }
+
+
+ protected DialogModeType dialogMode = DialogModeType.Add;
+
+
+ public EditTileForm(DialogModeType dialogMode) : base()
+ {
+ InitializeComponent();
+
+ this.DialogMode = dialogMode;
+
+ pickerBox1.ComboBox.Items.Clear();
+ pickerBox1.ComboBox.Items.AddRange(new string[] { "Normal", "Hidden", "Minimized", "Maximized" });
+ if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0;
+
+ pickerBox2.ComboBox.Items.Clear();
+ pickerBox2.ComboBox.Items.AddRange(new string[] { "No", "Yes" });
+ if (pickerBox2.ComboBox.Items.Count > 0) pickerBox2.ComboBox.SelectedIndex = 0;
+ }
+
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditTileForm));
+ this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.textBox2 = new RyzStudio.Windows.ThemedForms.TOpenFileTextBox();
+ this.textBox3 = new RyzStudio.Windows.ThemedForms.TTextBox();
+ this.textBox4 = new RyzStudio.Windows.ThemedForms.TFolderTextBox();
+ this.button1 = new RyzStudio.Windows.ThemedForms.TButton();
+ this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox();
+ this.pickerBox2 = new RyzStudio.Windows.ThemedForms.TPickerBox();
+ this.horizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.BackColor = System.Drawing.Color.Transparent;
+ this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox1.Location = new System.Drawing.Point(192, 20);
+ this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox1.Size = new System.Drawing.Size(177, 35);
+ this.textBox1.SubmitButton = null;
+ this.textBox1.TabIndex = 152;
+ this.textBox1.UseSystemPasswordChar = false;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label6.Location = new System.Drawing.Point(10, 250);
+ this.label6.Name = "label6";
+ this.label6.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label6.Size = new System.Drawing.Size(83, 34);
+ this.label6.TabIndex = 163;
+ this.label6.Text = "Run As Admin";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.BackColor = System.Drawing.Color.Transparent;
+ this.label7.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label7.Location = new System.Drawing.Point(10, 209);
+ this.label7.Name = "label7";
+ this.label7.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label7.Size = new System.Drawing.Size(79, 34);
+ this.label7.TabIndex = 161;
+ this.label7.Text = "Window Style";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label4.Location = new System.Drawing.Point(10, 144);
+ this.label4.Name = "label4";
+ this.label4.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label4.Size = new System.Drawing.Size(103, 34);
+ this.label4.TabIndex = 159;
+ this.label4.Text = "Working Directory";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label3.Location = new System.Drawing.Point(10, 103);
+ this.label3.Name = "label3";
+ this.label3.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label3.Size = new System.Drawing.Size(61, 34);
+ this.label3.TabIndex = 157;
+ this.label3.Text = "Argument";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label2.Location = new System.Drawing.Point(10, 62);
+ this.label2.Name = "label2";
+ this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label2.Size = new System.Drawing.Size(55, 34);
+ this.label2.TabIndex = 155;
+ this.label2.Text = "Filename";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.label1.Location = new System.Drawing.Point(10, 21);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10);
+ this.label1.Size = new System.Drawing.Size(29, 34);
+ this.label1.TabIndex = 153;
+ this.label1.Text = "Title";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // textBox2
+ //
+ this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox2.BackColor = System.Drawing.Color.Transparent;
+ this.textBox2.FileDialog = null;
+ this.textBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox2.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox2.HighlightImage")));
+ this.textBox2.Location = new System.Drawing.Point(192, 61);
+ this.textBox2.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox2.NormalImage")));
+ this.textBox2.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox2.Size = new System.Drawing.Size(177, 35);
+ this.textBox2.SubmitButton = null;
+ this.textBox2.TabIndex = 170;
+ this.textBox2.UseSystemPasswordChar = false;
+ //
+ // textBox3
+ //
+ this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox3.BackColor = System.Drawing.Color.Transparent;
+ this.textBox3.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox3.Location = new System.Drawing.Point(192, 102);
+ this.textBox3.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.textBox3.Name = "textBox3";
+ this.textBox3.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox3.Size = new System.Drawing.Size(177, 35);
+ this.textBox3.SubmitButton = null;
+ this.textBox3.TabIndex = 171;
+ this.textBox3.UseSystemPasswordChar = false;
+ //
+ // textBox4
+ //
+ this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox4.BackColor = System.Drawing.Color.Transparent;
+ this.textBox4.FolderDialog = null;
+ this.textBox4.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.textBox4.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox4.HighlightImage")));
+ this.textBox4.Location = new System.Drawing.Point(192, 143);
+ this.textBox4.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3);
+ this.textBox4.Name = "textBox4";
+ this.textBox4.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox4.NormalImage")));
+ this.textBox4.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9);
+ this.textBox4.Size = new System.Drawing.Size(177, 35);
+ this.textBox4.SubmitButton = null;
+ this.textBox4.TabIndex = 172;
+ this.textBox4.UseSystemPasswordChar = false;
+ //
+ // button1
+ //
+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.button1.BackColor = System.Drawing.Color.Transparent;
+ this.button1.DefaultImage = null;
+ this.button1.DownImage = null;
+ this.button1.IsSelected = false;
+ this.button1.LabelText = "&OK";
+ this.button1.Location = new System.Drawing.Point(241, 469);
+ this.button1.Margin = new System.Windows.Forms.Padding(10);
+ this.button1.Name = "button1";
+ this.button1.OverImage = null;
+ this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3);
+ this.button1.Size = new System.Drawing.Size(128, 32);
+ this.button1.TabIndex = 173;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // pickerBox1
+ //
+ this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox1.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox1.Location = new System.Drawing.Point(241, 209);
+ this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.pickerBox1.Name = "pickerBox1";
+ this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox1.Size = new System.Drawing.Size(128, 34);
+ this.pickerBox1.SubmitButton = null;
+ this.pickerBox1.TabIndex = 174;
+ //
+ // pickerBox2
+ //
+ this.pickerBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.pickerBox2.BackColor = System.Drawing.Color.Transparent;
+ this.pickerBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.pickerBox2.Location = new System.Drawing.Point(285, 250);
+ this.pickerBox2.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6);
+ this.pickerBox2.Name = "pickerBox2";
+ this.pickerBox2.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5);
+ this.pickerBox2.Size = new System.Drawing.Size(84, 34);
+ this.pickerBox2.SubmitButton = null;
+ this.pickerBox2.TabIndex = 175;
+ //
+ // horizontalSeparator1
+ //
+ this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.horizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator1.BackColor = System.Drawing.Color.Transparent;
+ this.horizontalSeparator1.Location = new System.Drawing.Point(10, 181);
+ this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.horizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22);
+ this.horizontalSeparator1.Name = "horizontalSeparator1";
+ this.horizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.horizontalSeparator1.Size = new System.Drawing.Size(364, 22);
+ this.horizontalSeparator1.TabIndex = 176;
+ //
+ // horizontalSeparator2
+ //
+ this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0);
+ this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent;
+ this.horizontalSeparator2.Location = new System.Drawing.Point(10, 437);
+ this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0);
+ this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2);
+ this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22);
+ this.horizontalSeparator2.Name = "horizontalSeparator2";
+ this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);
+ this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22);
+ this.horizontalSeparator2.TabIndex = 177;
+ //
+ // AddTileForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.ClientSize = new System.Drawing.Size(384, 521);
+ this.Controls.Add(this.horizontalSeparator2);
+ this.Controls.Add(this.horizontalSeparator1);
+ this.Controls.Add(this.pickerBox2);
+ this.Controls.Add(this.pickerBox1);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.textBox4);
+ this.Controls.Add(this.textBox3);
+ this.Controls.Add(this.textBox2);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.textBox1);
+ this.MinimumSize = new System.Drawing.Size(400, 560);
+ this.Name = "AddTileForm";
+ this.Text = "Add Tile";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+
+ if (this.DialogMode == DialogModeType.Edit)
+ {
+ if (this.TilePanel != null)
+ {
+ updateModel(this.TilePanel.ModelInfo);
+ }
+ else if (this.ListBox != null)
+ {
+ if (this.ListBox.ListBox.SelectedItem != null)
+ {
+ TileModel model = (this.ListBox.ListBox.SelectedItem as TileModel);
+ if (model != null)
+ {
+ updateModel(model);
+ }
+ }
+ }
+ }
+ }
+
+
+ public TilePanelLayout TilePanelLayout { get; set; } = null;
+
+ public TilePanel TilePanel { get; set; } = null;
+
+ public TListBox ListBox { get; set; } = null;
+
+ public Point AimCoord { get; set; } = new Point(-1, -1);
+
+ public DialogModeType DialogMode
+ {
+ get => dialogMode;
+ set
+ {
+ dialogMode = value;
+
+ switch (dialogMode)
+ {
+ case DialogModeType.Add:
+ this.Text = "Add Tile";
+ break;
+ case DialogModeType.Edit:
+ this.Text = "Edit Tile";
+ break;
+ default: break;
+ }
+ }
+ }
+
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ TileModel model = buildModel();
+
+ switch (this.DialogMode)
+ {
+ case DialogModeType.Add:
+ if (this.TilePanelLayout != null)
+ {
+ this.TilePanelLayout.AddTile(model);
+ }
+ else if (this.ListBox != null)
+ {
+ int n = this.ListBox.ListBox.Items.Add(model);
+ this.ListBox.ListBox.SelectedIndex = n;
+ }
+
+ break;
+ case DialogModeType.Edit:
+ if (this.TilePanel != null)
+ {
+ this.TilePanel.LoadInfo(model);
+ }
+ else if (this.ListBox != null)
+ {
+ int n = this.ListBox.ListBox.SelectedIndex;
+ if (n >= 0)
+ {
+ this.ListBox.ListBox.Items.RemoveAt(n);
+ this.ListBox.ListBox.Items.Insert(n, model);
+ this.ListBox.ListBox.SelectedIndex = n;
+ }
+ }
+
+ break;
+ default: break;
+ }
+
+ this.Close();
+ }
+
+ protected TileModel buildModel()
+ {
+ TileModel rs = new TileModel()
+ {
+ Title = textBox1.Text?.Trim(),
+ ProcessFilename = textBox2.Text?.Trim(),
+ ProcessArgument = textBox3.Text?.Trim(),
+ ProcessWorkingDirectory = textBox4.Text?.Trim(),
+ ProcessWindowStyle = (System.Diagnostics.ProcessWindowStyle)pickerBox1.ComboBox.SelectedIndex,
+ ProcessAsAdmin = (pickerBox2.ComboBox.SelectedIndex == 1)
+ };
+
+ if (this.DialogMode == DialogModeType.Add)
+ {
+ if (!this.AimCoord.Equals(new Point(-1, -1)))
+ {
+ rs.Position = this.AimCoord;
+ }
+ }
+
+ return rs;
+ }
+
+ protected void updateModel(TileModel model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+
+ textBox1.Text = model.Title;
+ textBox2.Text = model.ProcessFilename;
+ textBox3.Text = model.ProcessArgument;
+ textBox4.Text = model.ProcessWorkingDirectory;
+ pickerBox1.ComboBox.SelectedIndex = (int)model.ProcessWindowStyle;
+ pickerBox2.ComboBox.SelectedIndex = (model.ProcessAsAdmin ? 1 : 0);
+ }
+
+ }
+}
diff --git a/Windows/Forms/EditTileForm.resx b/Windows/Forms/EditTileForm.resx
new file mode 100644
index 0000000..0fa2bef
--- /dev/null
+++ b/Windows/Forms/EditTileForm.resx
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vwAADr8BOAVTJAAAAK9JREFUOE/t0zsKwkAURuGp1BWJK3EhIrgAV+EOLLWwtRQLwQdiIbbiIkwynj+O
+ IVwnyhR2XvjyInNIkXHee8f0cEQBPbDOaKEarSvXhsAJO4wirlB4jipiA3phoIvIrLFChhnKiA3o8Ckw
+ RR93LNBODVwwwRL62kNKYIxNzQ1FSsDOEHk08HrYJMw/8KtA06/cCef6KJDZgDbTFrHNZO3x9idqOyui
+ m2+07bvPgHcPXOhtG3D6cUIAAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vwAADr8BOAVTJAAAAMZJREFUOE/tk7sNwjAQQF3BRohJGAQhMQBTsAElFLSUiAKJTxIXhBZlCILNuyRG
+ iXEQKeg46fmsO/slhU9Za5XWehiXYcD6JElygZ6qhdwTioVDGo4wDXDjsohXdYkvMDTHVa8R9Hb0tpCz
+ XzqJL5Df/CRYRFE0Yn8nr9M07XcSwBXmXN6QDfncRTCjt6+Rgfla4Adfn3D+ERS4Yht/wY8FxVN2xTac
+ gLP5qyYLAhmmA4SGyeeEoPkSq3EWydsoB4gRDEqBVU/p15ajstHKCgAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wQAADsEBuJFr7QAAAJtJREFUOE/t0zEKwkAQheEpvILHSLySlTeJ6AnEzpPYi0ERPIKWKtZKNv9LNS5x
+ E6xS+OCDJew8tsgYmeCECsGZo1dKXLBwtnghQ2fe0JDPGHecsW6xwgwjNM8tdIgyxQ0qij2gORV9LejK
+ Bk8dfi3QjGY/C0IISS7/gkEVtP3KfbKEZm0PLZM++IVK0d0rdrAcR8TrnKK7BzPLa7Wb+WX/Nb8PAAAA
+ AElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wQAADsEBuJFr7QAAALZJREFUOE/tkzEKwjAYRjt4BY9hvZKTN1HsCYqbJzGzKBGb9gY6qjgrxvdJK7ZS
+ Gpwc/ODBnzTvg0AT5Xk+hB3cwVc456ZRSIqi2MAeafbGEq5Zlg3KY+1Bvkkql89Ya/vsnUCZN8FJYWyM
+ 6ekKnsWkdF9hb8S3I6ioyRnkpa0FXcFbwOXrAjlyawXe+06q/At+qoDh41cOCU4iV8OaQY8pUVEgOnuA
+ VcSzjRm2UHvOHeisdc7FDwDnJKIbLgP9AAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/Windows/Forms/TilePanel.Designer.cs b/Windows/Forms/TilePanel.Designer.cs
new file mode 100644
index 0000000..6334cd0
--- /dev/null
+++ b/Windows/Forms/TilePanel.Designer.cs
@@ -0,0 +1,82 @@
+namespace FizzyLauncher.Windows.Forms
+{
+ partial class TilePanel
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+ this.contextMenuStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.editToolStripMenuItem,
+ this.removeToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(118, 48);
+ //
+ // editToolStripMenuItem
+ //
+ this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+ this.editToolStripMenuItem.Size = new System.Drawing.Size(117, 22);
+ this.editToolStripMenuItem.Text = "&Edit";
+ this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click);
+ //
+ // removeToolStripMenuItem
+ //
+ this.removeToolStripMenuItem.Name = "removeToolStripMenuItem";
+ this.removeToolStripMenuItem.Size = new System.Drawing.Size(117, 22);
+ this.removeToolStripMenuItem.Text = "&Remove";
+ this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click);
+ //
+ // TTilePanel
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(234)))), ((int)(((byte)(234)))));
+ this.Margin = new System.Windows.Forms.Padding(4, 3, 0, 0);
+ this.MaximumSize = new System.Drawing.Size(82, 81);
+ this.MinimumSize = new System.Drawing.Size(82, 81);
+ this.Name = "TTilePanel";
+ this.Size = new System.Drawing.Size(82, 81);
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem;
+ private System.Windows.Forms.ToolTip toolTip1;
+ }
+}
diff --git a/Windows/Forms/TilePanel.cs b/Windows/Forms/TilePanel.cs
new file mode 100644
index 0000000..237b67d
--- /dev/null
+++ b/Windows/Forms/TilePanel.cs
@@ -0,0 +1,491 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.Forms;
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Windows.Forms;
+using AppResource = FizzyLauncher.AppResource;
+
+namespace FizzyLauncher.Windows.Forms
+{
+ public partial class TilePanel : TUserControl
+ {
+ protected bool isDragging = false;
+ protected Point startPosition = new Point();
+
+ protected int imageLeft = 0;
+ protected int imageTop = 11;
+ protected int labelMargin = 3;
+ protected int labelTop = 47;
+ protected Rectangle labelRectangle = new Rectangle();
+
+ protected string title = "";
+ protected Image icon = null;
+ protected ContextMenuStrip groupContextMenu = null;
+ protected TileModel modelInfo = new TileModel();
+
+
+ public TilePanel() : base()
+ {
+ InitializeComponent();
+
+ this.AllowDrop = true;
+ this.AutoSize = false;
+ this.BackColor = Color.FromArgb(250, 250, 250);
+ this.ContextMenuStrip = contextMenuStrip1;
+ this.DoubleBuffered = true;
+ this.Font = new Font(this.Font.FontFamily, 8.25F);
+ this.ForeColor = Color.FromArgb(99, 105, 119);
+ this.Size = new Size(70, 70);
+ this.MaximumSize = this.MinimumSize = this.Size;
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.AllowDrop = true;
+ this.AutoSize = false;
+ this.BackColor = Color.FromArgb(250, 250, 250);
+ this.ContextMenuStrip = contextMenuStrip1;
+ this.DoubleBuffered = true;
+ this.Font = new Font(this.Font.FontFamily, 8.25F);
+ this.Size = new Size(70, 70);
+ this.MaximumSize = this.MinimumSize = this.Size;
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+
+ Graphics g = e.Graphics;
+
+
+ if (this.Image != null)
+ {
+ g.DrawImage(this.Image, new Point(imageLeft, imageTop));
+ }
+
+ if (!string.IsNullOrWhiteSpace(this.Title))
+ {
+ TextRenderer.DrawText(e.Graphics, this.Title, this.Font, labelRectangle, this.ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.NoPadding | TextFormatFlags.EndEllipsis);
+ }
+
+ g.DrawRectangle(new Pen(Color.FromArgb(204, 206, 218), 1), new Rectangle(this.DisplayRectangle.X, this.DisplayRectangle.Y, (this.DisplayRectangle.Width - 1), (this.DisplayRectangle.Height - 1)));
+
+ }
+
+ [Category("Tile"), Browsable(true)]
+ public Image Image
+ {
+ get => icon;
+ protected set
+ {
+ icon = value;
+
+ if (icon == null)
+ {
+ imageLeft = 0;
+ }
+ else
+ {
+ imageLeft = (this.Width - icon.Width) / 2;
+ }
+ }
+ }
+
+ [Category("Tile"), Browsable(true)]
+ public string Title
+ {
+ get => title;
+ protected set
+ {
+ title = value;
+
+ labelRectangle = new Rectangle(labelMargin, labelTop, (this.Width - (labelMargin * 2)), (this.Height - labelTop - 1));
+ }
+ }
+
+
+ [Browsable(false)]
+ public TileModel ModelInfo => modelInfo;
+
+ public TilePanelLayout PanelContainer
+ {
+ get
+ {
+ if (this.Parent == null)
+ {
+ return null;
+ }
+
+ if (this.Parent.GetType() != typeof(TilePanelLayout))
+ {
+ return null;
+ }
+
+ return (TilePanelLayout)this.Parent;
+ }
+ }
+
+ protected override void OnDragDrop(DragEventArgs e)
+ {
+ string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
+
+ if (this.ModelInfo.IsGroup)
+ {
+ this.DropFileList(fileList);
+
+ invalidateGroupMenu(this.ModelInfo);
+ }
+ else
+ {
+ if (this.PanelContainer != null)
+ {
+ this.PanelContainer.DropFileList(fileList);
+ }
+ }
+ }
+
+ protected override void OnDragOver(DragEventArgs e)
+ {
+ base.OnDragDrop(e);
+
+ e.Effect = (e.Data.GetDataPresent(DataFormats.FileDrop)) ? DragDropEffects.Link : DragDropEffects.None;
+ }
+
+ protected override void OnMouseUp(MouseEventArgs e)
+ {
+ base.OnMouseUp(e);
+
+ isDragging = false;
+ }
+
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ base.OnMouseDown(e);
+
+ TilePanelLayout container = this.PanelContainer;
+ if (container == null)
+ {
+ return;
+ }
+
+ this.BringToFront();
+
+ if (((e.Button == MouseButtons.Left) && (Control.ModifierKeys == Keys.Control)) || (e.Button == MouseButtons.Right))
+ {
+ isDragging = true;
+ startPosition = e.Location;
+ }
+ }
+
+ protected override void OnMouseClick(MouseEventArgs e)
+ {
+ base.OnMouseClick(e);
+
+ if (Control.ModifierKeys == Keys.Control) return;
+ if (this.ModelInfo == null) return;
+
+ if (e.Button == MouseButtons.Left)
+ {
+ if (this.ModelInfo.IsGroup)
+ {
+ if (groupContextMenu != null)
+ {
+ invalidateGroupMenuSize();
+
+ groupContextMenu.Show(this, e.Location);
+ }
+ }
+ else
+ {
+ OnMouseDoubleClick(e);
+ }
+ }
+ }
+
+ protected override void OnMouseDoubleClick(MouseEventArgs e)
+ {
+ base.OnMouseDoubleClick(e);
+
+ if (Control.ModifierKeys == Keys.Control) return;
+
+ if (e.Button == MouseButtons.Left)
+ {
+ execute(this.ModelInfo);
+ }
+ }
+
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ base.OnMouseMove(e);
+
+ if (isDragging)
+ {
+ TilePanelLayout layoutPanel = this.PanelContainer;
+ if (layoutPanel == null)
+ {
+ return;
+ }
+
+ int x = (this.Location.X + (e.Location.X - startPosition.X));
+ int y = (this.Location.Y + (e.Location.Y - startPosition.Y));
+
+ layoutPanel.MoveTile(this, x, y);
+ }
+ }
+
+
+ public void DropFileList(string[] fileList)
+ {
+ if (fileList == null)
+ {
+ return;
+ }
+
+ if (fileList.Length <= 0)
+ {
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(fileList[0]))
+ {
+ return;
+ }
+
+ TileModel model = new TileModel()
+ {
+ ProcessFilename = fileList[0],
+ Title = Path.GetFileName(fileList[0])
+ };
+
+ // exe
+ if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase))
+ {
+ if (File.Exists(fileList[0]))
+ {
+ try
+ {
+ FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]);
+ if (fvi != null)
+ {
+ model.Title = fvi.ProductName;
+ }
+ }
+ catch
+ {
+ // do nothing
+ }
+ }
+
+ if (string.IsNullOrWhiteSpace(model.Title))
+ {
+ model.Title = Path.GetFileNameWithoutExtension(fileList[0]);
+ }
+ }
+
+ this.ModelInfo.Items.Add(model);
+ }
+
+ public void LoadInfo(TileModel model)
+ {
+ this.modelInfo = model;
+
+ this.Image = null;
+ this.Title = model.Title;
+
+ if (this.modelInfo.IsGroup)
+ {
+ this.Image = AppResource.folder_32;
+
+ invalidateGroupMenu(this.modelInfo);
+ }
+ else
+ {
+ this.Image = getIcon(model);
+ }
+
+ toolTip1.SetToolTip(this, this.Title);
+ }
+
+ private void editToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (this.ModelInfo.IsGroup)
+ {
+ EditTileFolderForm.ShowEditDialog(this);
+ }
+ else
+ {
+ EditTileForm.ShowEditDialog(this);
+ }
+ }
+
+ private void removeToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (this.PanelContainer == null)
+ {
+ return;
+ }
+
+ this.PanelContainer.Remove(this);
+ }
+
+ protected void execute(TileModel model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+
+ if (model.IsGroup)
+ {
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(model.CleanProcessFilename))
+ {
+ return;
+ }
+
+ if (!File.Exists(model.CleanProcessFilename))
+ {
+ return;
+ }
+
+ ProcessStartInfo p = new ProcessStartInfo();
+ p.FileName = model.CleanProcessFilename;
+ p.WindowStyle = model.ProcessWindowStyle;
+ if (!string.IsNullOrWhiteSpace(model.CleanProcessArgument)) p.Arguments = model.CleanProcessArgument;
+ if (!string.IsNullOrWhiteSpace(model.CleanProcessWorkingDirectory)) p.WorkingDirectory = model.CleanProcessWorkingDirectory;
+ if (model.ProcessAsAdmin) p.Verb = "runas";
+
+ MainForm parentForm = findMainForm();
+ if (parentForm != null)
+ {
+ if (parentForm.CurrentSession != null)
+ {
+ if (parentForm.CurrentSession.HideOnClick)
+ {
+ parentForm.Visible = false;
+ }
+ }
+ }
+
+ try
+ {
+ Process.Start(p);
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.Message);
+ }
+ }
+
+ protected Image getIcon(TileModel model)
+ {
+ if (!File.Exists(model.CleanProcessFilename))
+ {
+ return null;
+ }
+
+ try
+ {
+ return Icon.ExtractAssociatedIcon(model.CleanProcessFilename)?.ToBitmap();
+ }
+ catch
+ {
+ // do nothing
+ }
+
+ return null;
+ }
+
+ protected void invalidateGroupMenu(TileModel model)
+ {
+ if (groupContextMenu == null)
+ {
+ groupContextMenu = new ContextMenuStrip();
+ }
+
+ groupContextMenu.Items.Clear();
+
+ if (model.Items == null)
+ {
+ return;
+ }
+
+ foreach (TileModel item in model.Items)
+ {
+ ToolStripItem toolItem = groupContextMenu.Items.Add(item.Title);
+ toolItem.Image = getIcon(item);
+ toolItem.Tag = item;
+ toolItem.Click += toolItem_Click;
+ }
+ }
+
+ protected void invalidateGroupMenuSize()
+ {
+ if (this.PanelContainer != null)
+ {
+ if (this.PanelContainer.MainForm != null)
+ {
+ if (this.PanelContainer.MainForm.CurrentSession != null)
+ {
+ if (this.PanelContainer.MainForm.CurrentSession.EnableBigIconInFolder)
+ {
+ groupContextMenu.ImageScalingSize = new Size(24, 24);
+ return;
+ }
+ }
+ }
+ }
+
+ groupContextMenu.ImageScalingSize = new Size(16, 16);
+ }
+
+ protected MainForm findMainForm()
+ {
+ Control item = this;
+
+ while (true)
+ {
+ item = item.Parent;
+ if (item == null)
+ {
+ return null;
+ }
+
+ if (item.GetType() == typeof(MainForm))
+ {
+ return (item as MainForm);
+ }
+ }
+ }
+
+ private void toolItem_Click(object sender, EventArgs e)
+ {
+ if (sender.GetType() != typeof(ToolStripMenuItem))
+ {
+ return;
+ }
+
+ ToolStripMenuItem item = (sender as ToolStripMenuItem);
+ if (item.Tag == null)
+ {
+ return;
+ }
+
+ if (item.Tag.GetType() != typeof(TileModel))
+ {
+ return;
+ }
+
+ TileModel model = (item.Tag as TileModel);
+ execute(model);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Windows/Forms/TilePanel.resx b/Windows/Forms/TilePanel.resx
new file mode 100644
index 0000000..60ff723
--- /dev/null
+++ b/Windows/Forms/TilePanel.resx
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 17, 17
+
+
+ 172, 17
+
+
\ No newline at end of file
diff --git a/Windows/Forms/TilePanelLayout.Designer.cs b/Windows/Forms/TilePanelLayout.Designer.cs
new file mode 100644
index 0000000..9da7f33
--- /dev/null
+++ b/Windows/Forms/TilePanelLayout.Designer.cs
@@ -0,0 +1,222 @@
+namespace FizzyLauncher.Windows.Forms
+{
+ partial class TilePanelLayout
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.addToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.removeRowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
+ this.topToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.upToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.downToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.bottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
+ this.label1 = new System.Windows.Forms.Label();
+ this.contextMenuStrip1.SuspendLayout();
+ this.contextMenuStrip2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.addToolStripMenuItem,
+ this.addListToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70);
+ //
+ // addToolStripMenuItem
+ //
+ this.addToolStripMenuItem.Name = "addToolStripMenuItem";
+ this.addToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.addToolStripMenuItem.Text = "&Add Tile";
+ this.addToolStripMenuItem.Click += new System.EventHandler(this.addTileMenuItem_Click);
+ //
+ // addListToolStripMenuItem
+ //
+ this.addListToolStripMenuItem.Name = "addListToolStripMenuItem";
+ this.addListToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.addListToolStripMenuItem.Text = "Add &Folder";
+ this.addListToolStripMenuItem.Click += new System.EventHandler(this.addListTileMenuItem_Click);
+ //
+ // contextMenuStrip2
+ //
+ this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripMenuItem2,
+ this.toolStripMenuItem5,
+ this.toolStripMenuItem1,
+ this.removeRowToolStripMenuItem,
+ this.toolStripSeparator2,
+ this.toolStripMenuItem4,
+ this.toolStripSeparator1,
+ this.toolStripMenuItem3});
+ this.contextMenuStrip2.Name = "contextMenuStrip1";
+ this.contextMenuStrip2.Size = new System.Drawing.Size(144, 148);
+ //
+ // toolStripMenuItem2
+ //
+ this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+ this.toolStripMenuItem2.Size = new System.Drawing.Size(143, 22);
+ this.toolStripMenuItem2.Text = "&Add Group";
+ this.toolStripMenuItem2.Click += new System.EventHandler(this.addGroupMenuItem_Click);
+ //
+ // toolStripMenuItem5
+ //
+ this.toolStripMenuItem5.Name = "toolStripMenuItem5";
+ this.toolStripMenuItem5.Size = new System.Drawing.Size(143, 22);
+ this.toolStripMenuItem5.Text = "Add &Row";
+ this.toolStripMenuItem5.Click += new System.EventHandler(this.addRowMenuItem_Click);
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(143, 22);
+ this.toolStripMenuItem1.Text = "&Edit";
+ this.toolStripMenuItem1.Click += new System.EventHandler(this.editGroupMenuItem_Click);
+ //
+ // removeRowToolStripMenuItem
+ //
+ this.removeRowToolStripMenuItem.Name = "removeRowToolStripMenuItem";
+ this.removeRowToolStripMenuItem.Size = new System.Drawing.Size(143, 22);
+ this.removeRowToolStripMenuItem.Text = "Remo&ve Row";
+ this.removeRowToolStripMenuItem.Click += new System.EventHandler(this.removeRowToolStripMenuItem_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(140, 6);
+ //
+ // toolStripMenuItem4
+ //
+ this.toolStripMenuItem4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.topToolStripMenuItem,
+ this.upToolStripMenuItem,
+ this.downToolStripMenuItem,
+ this.bottomToolStripMenuItem});
+ this.toolStripMenuItem4.Name = "toolStripMenuItem4";
+ this.toolStripMenuItem4.Size = new System.Drawing.Size(143, 22);
+ this.toolStripMenuItem4.Text = "&Move";
+ //
+ // topToolStripMenuItem
+ //
+ this.topToolStripMenuItem.Name = "topToolStripMenuItem";
+ this.topToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+ this.topToolStripMenuItem.Text = "&Top";
+ this.topToolStripMenuItem.Click += new System.EventHandler(this.moveTopMenuItem_Click);
+ //
+ // upToolStripMenuItem
+ //
+ this.upToolStripMenuItem.Name = "upToolStripMenuItem";
+ this.upToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+ this.upToolStripMenuItem.Text = "&Up";
+ this.upToolStripMenuItem.Click += new System.EventHandler(this.moveUpMenuItem_Click);
+ //
+ // downToolStripMenuItem
+ //
+ this.downToolStripMenuItem.Name = "downToolStripMenuItem";
+ this.downToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+ this.downToolStripMenuItem.Text = "&Down";
+ this.downToolStripMenuItem.Click += new System.EventHandler(this.moveDownMenuItem_Click);
+ //
+ // bottomToolStripMenuItem
+ //
+ this.bottomToolStripMenuItem.Name = "bottomToolStripMenuItem";
+ this.bottomToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+ this.bottomToolStripMenuItem.Text = "&Bottom";
+ this.bottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomMenuItem_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(140, 6);
+ //
+ // toolStripMenuItem3
+ //
+ this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+ this.toolStripMenuItem3.Size = new System.Drawing.Size(143, 22);
+ this.toolStripMenuItem3.Text = "&Remove";
+ this.toolStripMenuItem3.Click += new System.EventHandler(this.removeGroupMenuItem3_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(99)))), ((int)(((byte)(105)))), ((int)(((byte)(119)))));
+ this.label1.Image = global::FizzyLauncher.AppResource.toggle_left_ea_16;
+ this.label1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.label1.Location = new System.Drawing.Point(227, 72);
+ this.label1.Margin = new System.Windows.Forms.Padding(0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(0, 13);
+ this.label1.TabIndex = 2;
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.label1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick);
+ this.label1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick);
+ //
+ // TTilePanelLayout
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.label1);
+ this.Name = "TTilePanelLayout";
+ this.Size = new System.Drawing.Size(370, 150);
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.contextMenuStrip2.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem addToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addListToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip2;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;
+ private System.Windows.Forms.ToolStripMenuItem topToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem upToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem downToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem bottomToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
+ private System.Windows.Forms.ToolStripMenuItem removeRowToolStripMenuItem;
+ private System.Windows.Forms.Label label1;
+ }
+}
diff --git a/Windows/Forms/TilePanelLayout.cs b/Windows/Forms/TilePanelLayout.cs
new file mode 100644
index 0000000..a975ba2
--- /dev/null
+++ b/Windows/Forms/TilePanelLayout.cs
@@ -0,0 +1,849 @@
+using FizzyLauncher.Models;
+using RyzStudio.Windows.Forms;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using AppResource = FizzyLauncher.AppResource;
+
+namespace FizzyLauncher.Windows.Forms
+{
+ public partial class TilePanelLayout : TUserControl
+ {
+ public static int CalcWidth(int tileCount) => (tileCount * tileSize) + ((tileCount - 1) * margin);
+
+
+ public class Item
+ {
+ public TilePanel Tile { get; set; }
+ public Point Coord { get; set; } = new Point(0, 0);
+ }
+
+
+ protected const int tileSize = 70;
+ protected const int margin = 3;
+ protected const int labelHeight = 20;
+ protected const int collapseIncrement = 6;
+ protected const int expandIncrement = 8;
+
+ protected TileGroupModel groupModel = null;
+ protected List- items = new List
- ();
+
+ protected int collapseHeight = 0;
+ protected int expandedHeight = 0;
+
+ protected bool isAnimating = false;
+ protected bool isChecked = true;
+ protected Point lastMousePosition = new Point();
+ protected Point gridSize = new Point();
+
+
+ public TilePanelLayout(TileGroupModel model) : base()
+ {
+ InitializeComponent();
+
+ this.AllowDrop = true;
+ this.BackColor = Color.Transparent;
+
+ this.LoadModel(model);
+
+ label1.Location = new Point(0, 4);
+ label1.Margin = new Padding(0);
+ label1.Padding = new Padding(0);
+ }
+
+ protected override void OnDragDrop(DragEventArgs e)
+ {
+ string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
+
+ this.DropFileList(fileList);
+ }
+
+ protected override void OnDragOver(DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop))
+ {
+ e.Effect = DragDropEffects.Link;
+ }
+ else
+ {
+ e.Effect = DragDropEffects.None;
+ }
+ }
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.Margin = new Padding(0);
+ this.Padding = new Padding(0, 0, 0, 10);
+ }
+
+ protected override async void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+
+ await this.InvalidateContainer();
+ }
+
+ protected override void OnMouseClick(MouseEventArgs e)
+ {
+ base.OnMouseClick(e);
+
+ lastMousePosition = e.Location;
+
+ bool isLabel = ((e.Location.X >= 0) && (e.Location.X <= this.Width) && (e.Location.Y >= 0) && (e.Location.Y <= 20));
+
+ if (e.Button == MouseButtons.Left)
+ {
+ // do nothing
+ }
+ else if (e.Button == MouseButtons.Right)
+ {
+ if (isLabel)
+ {
+ contextMenuStrip2.Show(this, e.Location);
+ }
+ else
+ {
+ contextMenuStrip1.Show(this, e.Location);
+ }
+ }
+ }
+
+ protected override void OnMouseDoubleClick(MouseEventArgs e) => base.OnMouseClick(e);
+
+ public Point GridSize
+ {
+ get => gridSize;
+ }
+
+ public bool EnableAnimation
+ {
+ get
+ {
+ MainForm mainForm = this.MainForm;
+ if (mainForm == null)
+ {
+ return false;
+ }
+
+ if (mainForm.CurrentSession == null)
+ {
+ return false;
+ }
+
+ return mainForm.CurrentSession.EnableAnimation;
+ }
+ }
+
+ public int CollapseHeight => labelHeight + collapseHeight;
+
+ public int ExpandedHeight => expandedHeight + this.Padding.Bottom;
+
+ public void DropFileList(string[] fileList)
+ {
+ if (fileList == null)
+ {
+ return;
+ }
+
+ if (fileList.Length <= 0)
+ {
+ return;
+ }
+
+ if (string.IsNullOrWhiteSpace(fileList[0]))
+ {
+ return;
+ }
+
+ TileModel model = new TileModel()
+ {
+ ProcessFilename = fileList[0],
+ Title = Path.GetFileName(fileList[0])
+ };
+
+ // exe
+ if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase))
+ {
+ if (File.Exists(fileList[0]))
+ {
+ try
+ {
+ FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]);
+ if (fvi != null)
+ {
+ model.Title = fvi.ProductName;
+ }
+ }
+ catch
+ {
+ // do nothing
+ }
+ }
+
+ if (string.IsNullOrWhiteSpace(model.Title))
+ {
+ model.Title = Path.GetFileNameWithoutExtension(fileList[0]);
+ }
+ }
+
+ this.AddTile(model);
+ }
+
+ public TileGroupModel Model
+ {
+ get
+ {
+ TileGroupModel rs = new TileGroupModel()
+ {
+ Title = groupModel.Title,
+ GridSize = new Size(this.GridSize.X, this.GridSize.Y),
+ IsExpanded = isChecked,
+ IsExclusive = groupModel.IsExclusive,
+ Items = this.Tiles
+ };
+
+ return rs;
+ }
+ }
+
+ public FlowLayoutPanel FlowLayoutPanel
+ {
+ get
+ {
+ Control parentControl = this.Parent;
+ while (true)
+ {
+ if (parentControl == null)
+ {
+ return null;
+ }
+
+ if (parentControl.GetType() == typeof(FlowLayoutPanel))
+ {
+ return parentControl as FlowLayoutPanel;
+ }
+
+ parentControl = parentControl.Parent;
+ }
+ }
+ }
+
+ public MainForm MainForm
+ {
+ get
+ {
+ Control parentControl = this.FlowLayoutPanel;
+ while (true)
+ {
+ if (parentControl == null)
+ {
+ return null;
+ }
+
+ if (parentControl.GetType() == typeof(MainForm))
+ {
+ return parentControl as MainForm;
+ }
+
+ parentControl = parentControl.Parent;
+ }
+ }
+ }
+
+ public List Tiles
+ {
+ get
+ {
+ List rs = new List();
+ foreach (Item item in items)
+ {
+ TileModel model = item.Tile.ModelInfo;
+ model.Position = item.Coord;
+
+ rs.Add(model);
+ }
+
+ return rs;
+ }
+ }
+
+ public int TileSize => (tileSize + margin);
+
+ public void AddTile(TileModel tile)
+ {
+ Point gridSize = this.GridSize;
+
+ if (items.Count >= (gridSize.X * gridSize.Y))
+ {
+ this.SetGridSize(gridSize.X, (gridSize.Y + 1));
+ }
+
+ Point? newCoord = tile.Position;
+ if ((newCoord == null) || hasTile(tile.Position))
+ {
+ newCoord = findLastFreeCoord();
+ }
+
+ if (newCoord == null)
+ {
+ return;
+ }
+
+ tile.Position = newCoord.Value;
+
+ TilePanel panel = new TilePanel();
+ panel.LoadInfo(tile);
+ panel.Location = convertCoordToLocation(tile.Position);
+
+ items.Add(new Item()
+ {
+ Tile = panel,
+ Coord = tile.Position
+ });
+
+ this.Controls.Add(panel);
+ }
+
+ public void Clear()
+ {
+ this.Controls.Clear();
+ }
+
+ public async Task Collapse()
+ {
+ await Task.Run(() =>
+ {
+ if (isAnimating) return;
+
+ isAnimating = true;
+ isChecked = false;
+
+ if (this.EnableAnimation)
+ {
+ while (this.Height > this.CollapseHeight)
+ {
+ ThreadControl.SetHeight(this, (this.Height - collapseIncrement));
+
+ Thread.Sleep(10);
+ }
+ }
+
+ ThreadControl.SetHeight(this, this.CollapseHeight);
+
+ isAnimating = false;
+
+ this.Invalidate(this.DisplayRectangle, false);
+ });
+ }
+
+ public async Task Expand()
+ {
+ await Task.Run(() =>
+ {
+ if (isAnimating) return;
+
+ isAnimating = true;
+ isChecked = true;
+
+ if (this.EnableAnimation)
+ {
+ while (this.Height < this.ExpandedHeight)
+ {
+ ThreadControl.SetHeight(this, (this.Height + expandIncrement));
+ Thread.Sleep(10);
+ }
+ }
+
+ ThreadControl.SetHeight(this, this.ExpandedHeight);
+
+ isAnimating = false;
+
+ this.Invalidate(this.DisplayRectangle, false);
+ });
+ }
+
+ public Point GetTilePosition(int posX, int posY)
+ {
+ int x = (int)Math.Round(decimal.Divide(posX, this.TileSize));
+ int y = (int)Math.Round(decimal.Divide((posY - labelHeight), this.TileSize));
+
+ if (x < 0) x = 0;
+ if (y < 0) y = 0;
+
+ return new Point((x * this.TileSize), ((y * this.TileSize) + labelHeight));
+ }
+
+ public async Task InvalidateContainer()
+ {
+ if (isAnimating)
+ {
+ return;
+ }
+
+ if (isChecked)
+ {
+ await this.Expand();
+ }
+ else
+ {
+ await this.Collapse();
+ }
+ }
+
+ public void AddGroup()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.Add(new TilePanelLayout(new TileGroupModel()
+ {
+ Title = "New Group",
+ GridSize = new Size(8, 1)
+ }));
+ }
+
+ public void AddRow() => this.SetGridSize(gridSize.X, (gridSize.Y + 1));
+
+ public void EditGroup() => EditGroupForm.ShowDialog(this);
+
+ public void LoadModel(TileGroupModel model)
+ {
+ groupModel = model;
+
+ isChecked = groupModel.IsExpanded;
+
+ label1.Text = " " + groupModel?.Title;
+ label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16);
+
+ this.SetGridSize(groupModel.GridSize.Width, groupModel.GridSize.Height);
+ this.LoadTiles(model.Items);
+ this.SetGridSize(groupModel.GridSize.Width, groupModel.GridSize.Height);
+
+ this.Invalidate();
+ }
+
+ public void UpdateModel(TileGroupModel model)
+ {
+ groupModel = model;
+ isChecked = groupModel.IsExpanded;
+
+ label1.Text = " " + groupModel?.Title;
+
+ this.Invalidate();
+ }
+
+ public void LoadTiles(List tiles)
+ {
+ if (tiles == null)
+ {
+ return;
+ }
+
+ if (tiles.Count() <= 0)
+ {
+ return;
+ }
+
+ foreach (TileModel item in tiles)
+ {
+ // resolve final grid position
+ Point? confirmedPosition = resolveCoord(item.Position);
+ if (confirmedPosition == null)
+ {
+ continue;
+ }
+
+ // place control
+ TilePanel panel = new TilePanel();
+ panel.LoadInfo(item);
+ panel.Location = convertCoordToLocation(confirmedPosition.Value);
+
+ items.Add(new Item()
+ {
+ Tile = panel,
+ Coord = confirmedPosition.Value
+ });
+
+ this.Controls.Add(panel);
+ }
+ }
+
+ public void MoveTile(TilePanel panel, int posX, int posY)
+ {
+ Item item = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault();
+ if (item == null)
+ {
+ return;
+ }
+
+ Point newPosition = convertLocationToCoord_Nearest(posX, posY);
+ if (!isTileInBounds(newPosition))
+ {
+ return;
+ }
+
+ if (hasTile(newPosition))
+ {
+ Item swapItem = items.Where(x => x.Coord.Equals(newPosition)).FirstOrDefault();
+ if (swapItem != null)
+ {
+ swapItem.Coord = item.Coord;
+ swapItem.Tile.Location = convertCoordToLocation(item.Coord);
+ }
+
+ item.Coord = newPosition;
+ panel.Location = convertCoordToLocation(newPosition);
+ }
+ else
+ {
+ item.Coord = newPosition;
+ panel.Location = convertCoordToLocation(newPosition);
+ }
+ }
+
+ public void MoveTop()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.SetChildIndex(this, 0);
+ }
+
+ public void MoveUp()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ int pos = this.FlowLayoutPanel.Controls.GetChildIndex(this);
+ if (pos <= 0)
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.SetChildIndex(this, (pos - 1));
+ }
+
+ public void MoveDown()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ int pos = this.FlowLayoutPanel.Controls.GetChildIndex(this);
+ if (pos >= (this.FlowLayoutPanel.Controls.Count - 1))
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.SetChildIndex(this, (pos + 1));
+ }
+
+ public void MoveBottom()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.SetChildIndex(this, (this.FlowLayoutPanel.Controls.Count - 1));
+ }
+
+ public void Remove()
+ {
+ if (this.FlowLayoutPanel == null)
+ {
+ return;
+ }
+
+ this.FlowLayoutPanel.Controls.Remove(this);
+ }
+
+ public void Remove(TilePanel panel)
+ {
+ Item m = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault();
+ if (m != null)
+ {
+ items.Remove(m);
+ }
+
+ this.Controls.Remove(panel);
+ }
+
+ public void SetGridSize(int width, int height)
+ {
+ gridSize = new Point(width, height);
+
+ groupModel.GridSize = new Size(groupModel.GridSize.Width, height);
+
+ expandedHeight = (this.TileSize * height) + labelHeight;
+
+ int w = CalcWidth(gridSize.X);
+
+ this.Size = new Size(w, (isChecked ? this.ExpandedHeight : this.CollapseHeight));
+ }
+
+ protected Point convertCoordToLocation(Point position) => new Point((position.X * this.TileSize), ((position.Y * this.TileSize) + labelHeight));
+
+ protected Point convertLocationToCoord(int posX, int posY)
+ {
+ int x = (int)Math.Ceiling(decimal.Divide(posX, this.TileSize));
+ int y = (int)Math.Ceiling(decimal.Divide((posY - labelHeight), this.TileSize));
+
+ x--;
+ y--;
+
+ if (x < 0) x = 0;
+ if (y < 0) y = 0;
+
+ return new Point(x, y);
+ }
+
+ protected Point convertLocationToCoord_Nearest(int posX, int posY)
+ {
+ int x = (int)Math.Round(decimal.Divide(posX, this.TileSize));
+ int y = (int)Math.Round(decimal.Divide((posY - labelHeight), this.TileSize));
+
+ if (x < 0) x = 0;
+ if (y < 0) y = 0;
+
+ return new Point(x, y);
+ }
+
+ protected Point? findFirstFreeCoord()
+ {
+ Point gridSize = this.GridSize;
+
+ for (int y = 0; y < gridSize.Y; y++)
+ {
+ for (int x = 0; x < gridSize.X; x++)
+ {
+ if (hasTile(new Point(x, y)))
+ {
+ continue;
+ }
+
+ return new Point(x, y);
+ }
+ }
+
+ return null;
+ }
+
+ protected Point? findLastFreeCoord()
+ {
+ Point gridSize = this.GridSize;
+
+ // none available
+ if (items.Count >= (gridSize.X * gridSize.Y))
+ {
+ return null;
+ }
+
+ if (items.Count <= 0)
+ {
+ return findFirstFreeCoord();
+ }
+
+ // only one available
+ if (items.Count >= ((gridSize.X * gridSize.Y) - 1))
+ {
+ return findFirstFreeCoord();
+ }
+
+ Point? rv = null;
+
+ for (int y = (gridSize.Y - 1); y >= 0; y--)
+ {
+ for (int x = (gridSize.X - 1); x >= 0; x--)
+ {
+ if (hasTile(new Point(x, y)))
+ {
+ if (rv.HasValue)
+ {
+ return rv;
+ }
+ }
+ else
+ {
+ rv = new Point(x, y);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ protected bool hasTile(Point position)
+ {
+ if (items == null)
+ {
+ return false;
+ }
+
+ if (items.Count <= 0)
+ {
+ return false;
+ }
+
+ return (items.Count(x => x.Coord.Equals(position)) > 0);
+ }
+
+ protected bool isTileInBounds(Point position)
+ {
+ Point gridSize = this.GridSize;
+
+ if (position.X >= gridSize.X)
+ {
+ return false;
+ }
+
+ if (position.Y >= gridSize.Y)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ protected Point? resolveCoord(Point coord)
+ {
+ if (!isTileInBounds(coord))
+ {
+ return null;
+ }
+
+ if (!hasTile(coord))
+ {
+ return coord;
+ }
+
+ return resolveNextCoord(coord);
+ }
+
+ protected Point? resolveNextCoord(Point coord)
+ {
+ Point gridSize = this.GridSize;
+ Point newCoord = coord;
+
+ while (true)
+ {
+ newCoord.X++;
+
+ if (newCoord.X >= gridSize.X)
+ {
+ newCoord.Y++;
+ newCoord.X = 0;
+ }
+
+ if (!isTileInBounds(newCoord))
+ {
+ return null;
+ }
+
+ if (hasTile(newCoord))
+ {
+ continue;
+ }
+
+ return newCoord;
+ }
+ }
+
+ private void addTileMenuItem_Click(object sender, EventArgs e)
+ {
+ Point coord = convertLocationToCoord(lastMousePosition.X, lastMousePosition.Y);
+
+ EditTileForm.ShowAddDialog(this, coord);
+ }
+
+ private void addListTileMenuItem_Click(object sender, EventArgs e)
+ {
+ Point coord = convertLocationToCoord(lastMousePosition.X, lastMousePosition.Y);
+
+ EditTileFolderForm.ShowAddDialog(this, coord);
+ }
+
+ private void addGroupMenuItem_Click(object sender, EventArgs e) => this.AddGroup();
+
+ private void addRowMenuItem_Click(object sender, EventArgs e) => this.AddRow();
+
+ private void editGroupMenuItem_Click(object sender, EventArgs e) => this.EditGroup();
+
+ private void moveTopMenuItem_Click(object sender, EventArgs e) => this.MoveTop();
+
+ private void moveUpMenuItem_Click(object sender, EventArgs e) => this.MoveUp();
+
+ private void moveDownMenuItem_Click(object sender, EventArgs e) => this.MoveDown();
+
+ private void moveBottomMenuItem_Click(object sender, EventArgs e) => this.MoveBottom();
+
+ private void removeGroupMenuItem3_Click(object sender, EventArgs e) => this.Remove();
+
+ private void removeRowToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ bool rs = items.Exists(x => x.Coord.Y.Equals(gridSize.Y - 1));
+ if (!rs)
+ {
+ this.SetGridSize(gridSize.X, (gridSize.Y - 1));
+ }
+ }
+
+ private async void label1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (isAnimating) return;
+
+ if (e.Button == MouseButtons.Left)
+ {
+ isChecked = !isChecked;
+
+ label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16);
+
+ this.Invalidate();
+
+ await this.InvalidateContainer();
+
+ // exclusivity
+ if (isChecked)
+ {
+ if (this.Model.IsExclusive)
+ {
+ if (this.FlowLayoutPanel != null)
+ {
+ foreach (TilePanelLayout item in this.FlowLayoutPanel.Controls.OfType())
+ {
+ if (item.Equals(this))
+ {
+ continue;
+ }
+
+ await item.Collapse();
+ }
+ }
+ }
+ }
+
+ label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16);
+ }
+ else if (e.Button == MouseButtons.Right)
+ {
+ contextMenuStrip2.Show(this, e.Location);
+ }
+ }
+
+ }
+}
diff --git a/Windows/Forms/TilePanelLayout.resx b/Windows/Forms/TilePanelLayout.resx
new file mode 100644
index 0000000..8baf68f
--- /dev/null
+++ b/Windows/Forms/TilePanelLayout.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 17, 17
+
+
+ 172, 17
+
+
\ No newline at end of file
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..5d60ade
Binary files /dev/null and b/favicon.ico differ