From 50971ea04e7ad7a7ae9dcbbe911b7b8bcf5dd7d3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 4 Feb 2017 13:21:38 -0500 Subject: [PATCH] Implement maximizing and minimizing Fixes #24 and makes panel buttons useful. --- ShiftOS.WinForms/Applications/Terminal.cs | 9 ++- ShiftOS.WinForms/Resources/Shiftorium.txt | 6 ++ ShiftOS.WinForms/WindowBorder.cs | 46 ++++++++--- ShiftOS.WinForms/WinformsDesktop.cs | 93 ++++++++++++++++++----- ShiftOS_TheReturn/Desktop.cs | 16 ++++ 5 files changed, 139 insertions(+), 31 deletions(-) diff --git a/ShiftOS.WinForms/Applications/Terminal.cs b/ShiftOS.WinForms/Applications/Terminal.cs index 7b55ec2..54a89d7 100644 --- a/ShiftOS.WinForms/Applications/Terminal.cs +++ b/ShiftOS.WinForms/Applications/Terminal.cs @@ -134,10 +134,13 @@ namespace ShiftOS.WinForms.Applications TerminalBackend.PrefixEnabled = true; TerminalBackend.InStory = false; Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ "); - if (SaveSystem.CurrentSave.StoryPosition == 6) + if (Shiftorium.UpgradeInstalled("wm_free_placement")) { - Infobox.Show("Welcome to ShiftOS.", "Welcome to the ShiftOS multi-user domain. Your goal is to upgrade your system as much as possible, and gain as much wealth as possible. The first step is to get a feel for the environment. Go forth and explore, young Shifter."); - SaveSystem.CurrentSave.StoryPosition++; + this.ParentForm.Width = 640; + this.ParentForm.Height = 480; + this.ParentForm.Left = (Screen.PrimaryScreen.Bounds.Width - 640) / 2; + this.ParentForm.Top = (Screen.PrimaryScreen.Bounds.Height - 480) / 2; + } })); } diff --git a/ShiftOS.WinForms/Resources/Shiftorium.txt b/ShiftOS.WinForms/Resources/Shiftorium.txt index 7d4d7b7..1aff2db 100644 --- a/ShiftOS.WinForms/Resources/Shiftorium.txt +++ b/ShiftOS.WinForms/Resources/Shiftorium.txt @@ -217,6 +217,12 @@ Name: "Minimize Command", Cost: 1250, Description: "Use the win.mini{id} command to minimize/restore windows.", + Dependencies: "useful_panel_buttons" + }, + { + Name: "Useful Panel Buttons", + Cost: 250, + Description: "Minimize and restore windows by clicking their Panel Button!", Dependencies: "desktop" }, { diff --git a/ShiftOS.WinForms/WindowBorder.cs b/ShiftOS.WinForms/WindowBorder.cs index bb9b478..46dd76a 100644 --- a/ShiftOS.WinForms/WindowBorder.cs +++ b/ShiftOS.WinForms/WindowBorder.cs @@ -354,21 +354,49 @@ namespace ShiftOS.WinForms /// E. private void pnlmaximize_Click(object sender, EventArgs e) { - TerminalBackend.InvokeCommand($"win.max{{id:{this.ParentForm.GetHashCode()}}}"); + if (maximized == false) + Desktop.MaximizeWindow(this); + else + Desktop.RestoreWindow(this); + maximized = !maximized; } - /// - /// Pnlminimizes the click. - /// - /// The click. - /// Sender. - /// E. + bool minimized = false; + bool maximized = false; + + public bool IsMinimized + { + get + { + return minimized; + } + } + + public bool IsMaximized + { + get + { + return maximized; + } + } + + + /// + /// Pnlminimizes the click. + /// + /// The click. + /// Sender. + /// E. private void pnlminimize_Click(object sender, EventArgs e) { - TerminalBackend.InvokeCommand($"win.mini{{id:{this.ParentForm.GetHashCode()}}}"); + if (minimized == false) + Desktop.MinimizeWindow(this); + else + Desktop.RestoreWindow(this); + minimized = !minimized; } - + /// /// The W m NCLBUTTONDOW. /// diff --git a/ShiftOS.WinForms/WinformsDesktop.cs b/ShiftOS.WinForms/WinformsDesktop.cs index 9490850..c45feee 100644 --- a/ShiftOS.WinForms/WinformsDesktop.cs +++ b/ShiftOS.WinForms/WinformsDesktop.cs @@ -35,6 +35,7 @@ using ShiftOS.Engine; using static ShiftOS.Engine.SkinEngine; using ShiftOS.WinForms.Tools; using ShiftOS.WinForms.Applications; +using Newtonsoft.Json; /// /// Winforms desktop. @@ -125,6 +126,26 @@ namespace ShiftOS.WinForms { if (form.Visible == true) { + EventHandler onClick = (o, a) => + { + if(form == focused) + { + if (form.IsMinimized) + { + RestoreWindow(form); + } + else + { + MinimizeWindow(form); + } + } + else + { + form.BringToFront(); + focused = form; + } + }; + var pnlbtn = new Panel(); pnlbtn.Margin = new Padding(2, LoadedSkin.PanelButtonFromTop, 0, 0); pnlbtn.BackColor = LoadedSkin.PanelButtonColor; @@ -151,6 +172,12 @@ namespace ShiftOS.WinForms this.panelbuttonholder.Controls.Add(pnlbtn); pnlbtn.Show(); pnlbtntext.Show(); + + if (Shiftorium.UpgradeInstalled("useful_panel_buttons")) + { + pnlbtn.Click += onClick; + pnlbtntext.Click += onClick; + } } } } @@ -342,6 +369,11 @@ namespace ShiftOS.WinForms public void ShowWindow(IWindowBorder border) { var brdr = border as Form; + focused = border; + brdr.GotFocus += (o, a) => + { + focused = border; + }; brdr.FormBorderStyle = FormBorderStyle.None; brdr.Show(); brdr.TopMost = true; @@ -354,17 +386,26 @@ namespace ShiftOS.WinForms /// Border. public void KillWindow(IWindowBorder border) { - throw new NotImplementedException(); + border.Close(); } - /// - /// Minimizes the window. - /// - /// The window. - /// Brdr. + private IWindowBorder focused = null; + + + /// + /// Minimizes the window. + /// + /// Brdr. public void MinimizeWindow(IWindowBorder brdr) { - throw new NotImplementedException(); + var loc = (brdr as WindowBorder).Location; + var sz = (brdr as WindowBorder).Size; + (brdr as WindowBorder).Tag = JsonConvert.SerializeObject(new + { + Size = sz, + Location = loc + }); + (brdr as WindowBorder).Location = new Point(this.GetSize().Width * 2, this.GetSize().Height * 2); } /// @@ -374,24 +415,38 @@ namespace ShiftOS.WinForms /// Brdr. public void MaximizeWindow(IWindowBorder brdr) { - throw new NotImplementedException(); + int startY = (LoadedSkin.DesktopPanelPosition == 1) ? 0 : LoadedSkin.DesktopPanelHeight; + int h = this.GetSize().Height - LoadedSkin.DesktopPanelHeight; + var loc = (brdr as WindowBorder).Location; + var sz = (brdr as WindowBorder).Size; + (brdr as WindowBorder).Tag = JsonConvert.SerializeObject(new + { + Size = sz, + Location = loc + }); + (brdr as WindowBorder).Location = new Point(0, startY); + (brdr as WindowBorder).Size = new Size(this.GetSize().Width, h); + } - /// - /// Restores the window. - /// - /// The window. - /// Brdr. + /// + /// Restores the window. + /// + /// The window. + /// Brdr. public void RestoreWindow(IWindowBorder brdr) { - throw new NotImplementedException(); + dynamic tag = JsonConvert.DeserializeObject((brdr as WindowBorder).Tag.ToString()); + (brdr as WindowBorder).Location = tag.Location; + (brdr as WindowBorder).Size = tag.Size; + } - /// - /// Invokes the on worker thread. - /// - /// The on worker thread. - /// Act. + /// + /// Invokes the on worker thread. + /// + /// The on worker thread. + /// Act. public void InvokeOnWorkerThread(Action act) { this.Invoke(act); diff --git a/ShiftOS_TheReturn/Desktop.cs b/ShiftOS_TheReturn/Desktop.cs index 3f9a88c..712f05d 100644 --- a/ShiftOS_TheReturn/Desktop.cs +++ b/ShiftOS_TheReturn/Desktop.cs @@ -99,6 +99,22 @@ namespace ShiftOS.Engine _desktop = desk; } + public static void MinimizeWindow(IWindowBorder brdr) + { + _desktop.MinimizeWindow(brdr); + } + + public static void MaximizeWindow(IWindowBorder brdr) + { + _desktop.MaximizeWindow(brdr); + } + + public static void RestoreWindow(IWindowBorder brdr) + { + _desktop.RestoreWindow(brdr); + } + + public static void InvokeOnWorkerThread(Action act) { _desktop.InvokeOnWorkerThread(act);