diff options
Diffstat (limited to 'ShiftOS.Frontend/Desktop')
| -rw-r--r-- | ShiftOS.Frontend/Desktop/Desktop.cs | 85 | ||||
| -rw-r--r-- | ShiftOS.Frontend/Desktop/WindowManager.cs | 383 |
2 files changed, 468 insertions, 0 deletions
diff --git a/ShiftOS.Frontend/Desktop/Desktop.cs b/ShiftOS.Frontend/Desktop/Desktop.cs new file mode 100644 index 0000000..5bcf3a9 --- /dev/null +++ b/ShiftOS.Frontend/Desktop/Desktop.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ShiftOS.Engine; + +namespace ShiftOS.Frontend.Desktop +{ + public class Desktop : GUI.Control, IDesktop + { + public string DesktopName + { + get + { + return "ShiftOS MonoGame Desktop"; + } + } + + public void Close() + { + throw new NotImplementedException(); + } + + public Size GetSize() + { + return new Size(Width, Height); + } + + public void HideAppLauncher() + { + + } + + public void InvokeOnWorkerThread(Action act) + { + act?.Invoke(); + } + + public void KillWindow(IWindowBorder border) + { + } + + public void MaximizeWindow(IWindowBorder brdr) + { + } + + public void MinimizeWindow(IWindowBorder brdr) + { + } + + public void OpenAppLauncher(Point loc) + { + } + + public void PopulateAppLauncher(LauncherItem[] items) + { + } + + public void PopulatePanelButtons() + { + } + + public void PushNotification(string app, string title, string message) + { + } + + public void RestoreWindow(IWindowBorder brdr) + { + } + + public void SetupDesktop() + { + } + + public void Show() + { + } + + public void ShowWindow(IWindowBorder border) + { + } + } +} diff --git a/ShiftOS.Frontend/Desktop/WindowManager.cs b/ShiftOS.Frontend/Desktop/WindowManager.cs new file mode 100644 index 0000000..5efb30e --- /dev/null +++ b/ShiftOS.Frontend/Desktop/WindowManager.cs @@ -0,0 +1,383 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ShiftOS.Engine; +using ShiftOS.Frontend.GraphicsSubsystem; +using static ShiftOS.Engine.SkinEngine; + +namespace ShiftOS.Frontend.Desktop +{ + public class WindowManager : Engine.WindowManager + { + public override void Close(IShiftOSWindow win) + { + var brdr = RunningBorders.FirstOrDefault(x => x.ParentWindow == win); + if (brdr != null) + { + brdr.Close(); + win = null; + } + } + + private List<WindowBorder> RunningBorders = new List<WindowBorder>(); + + public override void InvokeAction(Action act) + { + act?.Invoke(); + } + + public override void Maximize(IWindowBorder border) + { + throw new NotImplementedException(); + } + + public override void Minimize(IWindowBorder border) + { + throw new NotImplementedException(); + } + + public override void SetTitle(IShiftOSWindow win, string title) + { + var brdr = RunningBorders.FirstOrDefault(x => x.ParentWindow == win); + if (brdr != null) + brdr.Text = title; + } + + public override void SetupDialog(IShiftOSWindow win) + { + var wb = new WindowBorder(); + wb.Width = (win as GUI.Control).Width + LoadedSkin.LeftBorderWidth + LoadedSkin.RightBorderWidth; + wb.Height = (win as GUI.Control).Height + LoadedSkin.TitlebarHeight + LoadedSkin.BottomBorderWidth; + wb.ParentWindow = win; + wb.IsDialog = true; + UIManager.AddTopLevel(wb); + RunningBorders.Add(wb); + win.OnLoad(); + win.OnUpgrade(); + win.OnSkinLoad(); + } + + public override void SetupWindow(IShiftOSWindow win) + { + if (!Shiftorium.UpgradeAttributesUnlocked(win.GetType())) + { + Console.WriteLine("Application not found on system."); + return; + } + var wb = new WindowBorder(); + wb.Width = (win as GUI.Control).Width + LoadedSkin.LeftBorderWidth + LoadedSkin.RightBorderWidth; + wb.Height = (win as GUI.Control).Height + LoadedSkin.TitlebarHeight + LoadedSkin.BottomBorderWidth; + wb.ParentWindow = win; + wb.IsDialog = true; + UIManager.AddTopLevel(wb); + AppearanceManager.OpenForms.Add(wb); + RunningBorders.Add(wb); + win.OnLoad(); + win.OnUpgrade(); + win.OnSkinLoad(); + + } + } + + public class WindowBorder : GUI.Control, IWindowBorder + { + private string _text = "ShiftOS window"; + private GUI.Control _hostedwindow = null; + + public WindowBorder() + { + X = 720; + Y = 480; + } + + public IShiftOSWindow ParentWindow + { + get + { + return (IShiftOSWindow)_hostedwindow; + } + + set + { + _hostedwindow = (GUI.Control)value; + ClearControls(); + AddControl(_hostedwindow); + Width = (LoadedSkin.LeftBorderWidth*2) + _hostedwindow.Width + LoadedSkin.RightBorderWidth; + Height = LoadedSkin.BottomBorderWidth + _hostedwindow.Height + (LoadedSkin.TitlebarHeight*2); + + } + } + + public bool IsDialog { get; set; } + + public string Text + { + get + { + return _text; + } + + set + { + _text = value; + } + } + + public void Close() + { + Visible = false; + UIManager.StopHandling(this); + } + + private int lastmousex, lastmousey = 0; + + protected override void OnLayout() + { + if (moving) + { + var screenpoint = PointToScreen(MouseX, MouseY); + this.X = lastmousex + screenpoint.X; + this.Y = lastmousey + screenpoint.Y; + } + int titlebarheight = Shiftorium.UpgradeInstalled("wm_titlebar") ? LoadedSkin.TitlebarHeight : 0; + int borderleft = Shiftorium.UpgradeInstalled("window_borders") ? LoadedSkin.LeftBorderWidth : 0; + int borderright = Shiftorium.UpgradeInstalled("window_borders") ? LoadedSkin.RightBorderWidth : 0; + int borderbottom = Shiftorium.UpgradeInstalled("window_borders") ? LoadedSkin.BottomBorderWidth : 0; + _hostedwindow.X = borderleft; + _hostedwindow.Y = titlebarheight; + } + + private bool moving = false; + + public override void MouseStateChanged() + { + if (Shiftorium.UpgradeInstalled("wm_titlebar")) + { + if (Shiftorium.UpgradeInstalled("close_button")) + { + var closebuttonsize = LoadedSkin.CloseButtonSize; + var closebuttonloc = LoadedSkin.CloseButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonloc = new Point(Width - closebuttonsize.Width - closebuttonloc.X, closebuttonloc.Y); + if(MouseX > closebuttonloc.X && MouseY > closebuttonloc.Y && MouseX < closebuttonloc.X + closebuttonsize.Width && MouseY < closebuttonloc.Y + closebuttonsize.Height) + { + Close(); + } + } + if (Shiftorium.UpgradeInstalled("minimize_button")) + { + var closebuttonsize = LoadedSkin.MinimizeButtonSize; + var closebuttonloc = LoadedSkin.MinimizeButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonloc = new Point(Width - closebuttonsize.Width - closebuttonloc.X, closebuttonloc.Y); + if (MouseX > closebuttonloc.X && MouseY > closebuttonloc.Y && MouseX < closebuttonloc.X + closebuttonsize.Width && MouseY < closebuttonloc.Y + closebuttonsize.Height) + { + if (IsFocusedControl || ContainsFocusedControl) + UIManager.FocusedControl = null; + Visible = false; + } + } + if (Shiftorium.UpgradeInstalled("maximize_button")) + { + var closebuttonsize = LoadedSkin.MaximizeButtonSize; + var closebuttonloc = LoadedSkin.MaximizeButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonloc = new Point(Width - closebuttonsize.Width - closebuttonloc.X, closebuttonloc.Y); + if (MouseX > closebuttonloc.X && MouseY > closebuttonloc.Y && MouseX < closebuttonloc.X + closebuttonsize.Width && MouseY < closebuttonloc.Y + closebuttonsize.Height) + { + AppearanceManager.Maximize(this); + } + } + if (MouseY < LoadedSkin.TitlebarHeight) + { + var screenpoint = PointToScreen(MouseX, MouseY); + lastmousex = this.X - screenpoint.X; + lastmousey = this.Y - screenpoint.Y; + + moving = MouseLeftDown; + CaptureMouse = moving; + } + } + } + + protected override void OnPaint(Graphics gfx) + { + int titleheight = LoadedSkin.TitlebarHeight; + int leftborderwidth = LoadedSkin.LeftBorderWidth; + int rightborderwidth = LoadedSkin.RightBorderWidth; + int bottomborderwidth = LoadedSkin.BottomBorderWidth; + + if (Shiftorium.UpgradeInstalled("wm_titlebar")) + { + var titlebarcolor = LoadedSkin.TitleBackgroundColor; + var titlefont = LoadedSkin.TitleFont; + var titletextcolor = LoadedSkin.TitleTextColor; + var titletextleft = LoadedSkin.TitleTextLeft; + bool titletextcentered = LoadedSkin.TitleTextCentered; + + var titlebarbg = GetImage("titlebar"); + var titlebarlayout = GetImageLayout("titlebar"); + + var drawcorners = LoadedSkin.ShowTitleCorners; + int titlebarleft = 0; + int titlebarwidth = Width; + if (drawcorners) + { + //set titleleft to the first corner width + titlebarleft = LoadedSkin.TitleLeftCornerWidth; + titlebarwidth -= titlebarleft; + titlebarwidth -= LoadedSkin.TitleRightCornerWidth; + + //Let's get the left and right images. + var leftimage = GetImage("titlebarleft"); + var rightimage = GetImage("titlebarright"); + //and the colors + var leftcolor = LoadedSkin.TitleLeftCornerBackground; + var rightcolor = LoadedSkin.TitleRightCornerBackground; + //and the layouts... + var leftlayout = GetImageLayout("titlebarleft"); + var rightlayout = GetImageLayout("titlebarright"); + //and the widths + var leftwidth = LoadedSkin.TitleLeftCornerWidth; + var rightwidth = LoadedSkin.TitleRightCornerWidth; + + //draw left corner + if(leftimage != null) + { + var resized = ResizeImage(leftimage, leftwidth, titleheight); + gfx.DrawImage(resized, 0, 0); + } + else + { + gfx.FillRectangle(new SolidBrush(leftcolor), new Rectangle(0, 0, leftwidth, titleheight)); + } + + //draw right corner + if (rightimage != null) + { + var resized = ResizeImage(rightimage, rightwidth, titleheight); + gfx.DrawImage(resized, titlebarleft+titlebarwidth, 0); + } + else + { + gfx.FillRectangle(new SolidBrush(rightcolor), new Rectangle(titlebarleft+titlebarwidth, 0, rightwidth, titleheight)); + } + } + + if (titlebarbg == null) + { + //draw the title bg + gfx.FillRectangle(new SolidBrush(titlebarcolor), new Rectangle(titlebarleft, 0, titlebarwidth, titleheight)); + + + } + else + { + var resized = ResizeImage(titlebarbg, titlebarwidth, titleheight); + gfx.DrawImage(resized, titlebarleft, 0); + } + //Now we draw the title text. + var textMeasure = gfx.MeasureString(_text, titlefont); + PointF textloc; + if (titletextcentered) + textloc = new PointF((titlebarwidth - textMeasure.Width) / 2, + titletextleft.Y); + else + textloc = new PointF(titlebarleft + titletextleft.X, titletextleft.Y); + + gfx.DrawString(_text, titlefont, new SolidBrush(titletextcolor), textloc); + + var tbuttonpos = LoadedSkin.TitleButtonPosition; + + //Draw close button + if(Shiftorium.UpgradeInstalled("close_button")) + { + var closebuttoncolor = LoadedSkin.CloseButtonColor; + var closebuttonsize = LoadedSkin.CloseButtonSize; + var closebuttonright = LoadedSkin.CloseButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonright = new Point(Width - closebuttonsize.Width - closebuttonright.X, closebuttonright.Y); + + gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + + } + //Draw maximize button + if (Shiftorium.UpgradeInstalled("maximize_button")) + { + var closebuttoncolor = LoadedSkin.MaximizeButtonColor; + var closebuttonsize = LoadedSkin.MaximizeButtonSize; + var closebuttonright = LoadedSkin.MaximizeButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonright = new Point(Width - closebuttonsize.Width - closebuttonright.X, closebuttonright.Y); + + gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + + } + //Draw minimize button + if (Shiftorium.UpgradeInstalled("minimize_button")) + { + var closebuttoncolor = LoadedSkin.MinimizeButtonColor; + var closebuttonsize = LoadedSkin.MinimizeButtonSize; + var closebuttonright = LoadedSkin.MinimizeButtonFromSide; + if (LoadedSkin.TitleButtonPosition == 0) + closebuttonright = new Point(Width - closebuttonsize.Width - closebuttonright.X, closebuttonright.Y); + + gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + + } + } + else + { + //Set the titleheight to 0. + titleheight = 0; + + } + + if (Shiftorium.UpgradeInstalled("window_borders")) + { + //Some variables we'll need... + int bottomlocy = Height - LoadedSkin.BottomBorderWidth; + int bottomlocx = leftborderwidth; + int bottomwidth = Width - bottomlocx - rightborderwidth; + int brightlocx = Width - rightborderwidth; + + var borderleftcolor = (ContainsFocusedControl || IsFocusedControl) ? LoadedSkin.BorderLeftBackground : LoadedSkin.BorderInactiveLeftBackground; + var borderrightcolor = (ContainsFocusedControl || IsFocusedControl) ? LoadedSkin.BorderRightBackground : LoadedSkin.BorderInactiveRightBackground; + var borderbottomcolor = (ContainsFocusedControl || IsFocusedControl) ? LoadedSkin.BorderBottomBackground : LoadedSkin.BorderInactiveBottomBackground; + var borderbleftcolor = (ContainsFocusedControl || IsFocusedControl) ? LoadedSkin.BorderBottomLeftBackground : LoadedSkin.BorderInactiveBottomLeftBackground; + var borderbrightcolor = (ContainsFocusedControl || IsFocusedControl) ? LoadedSkin.BorderBottomRightBackground : LoadedSkin.BorderInactiveBottomRightBackground; + + + //draw border corners + //BOTTOM LEFT + gfx.FillRectangle(new SolidBrush(borderbleftcolor), new Rectangle(0, bottomlocy, leftborderwidth, bottomborderwidth)); + + + //BOTTOM RIGHT + gfx.FillRectangle(new SolidBrush(borderbrightcolor), new Rectangle(brightlocx, bottomlocy, rightborderwidth, bottomborderwidth)); + + //BOTTOM + gfx.FillRectangle(new SolidBrush(borderbottomcolor), new Rectangle(bottomlocx, bottomlocy, bottomwidth, bottomborderwidth)); + + //LEFT + gfx.FillRectangle(new SolidBrush(borderleftcolor), new Rectangle(0, titleheight, leftborderwidth, Height - titleheight - bottomborderwidth)); + + //RIGHT + gfx.FillRectangle(new SolidBrush(borderrightcolor), new Rectangle(brightlocx, titleheight, rightborderwidth, Height - titleheight - bottomborderwidth)); + + + } + + //So here's what we're gonna do now. + //Now that we have a titlebar and window borders... + //We're going to composite the hosted window + //and draw it to the remaining area. + + //Painting of the canvas is done by the Paint() method. + } + + } +} |
