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 RunningBorders = new List(); 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 + _hostedwindow.Width + LoadedSkin.RightBorderWidth; Height = LoadedSkin.BottomBorderWidth + _hostedwindow.Height + LoadedSkin.TitlebarHeight; } } 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; Width = _hostedwindow.X + _hostedwindow.Width + LoadedSkin.RightBorderWidth; Height = _hostedwindow.Y + _hostedwindow.Height + LoadedSkin.BottomBorderWidth; } 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("titleleft"); var rightimage = GetImage("titleright"); //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); var img = GetImage("closebutton"); if (img == null) { gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); } else { var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); gfx.DrawImage(resized, closebuttonright); } } //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)); var img = GetImage("maximizebutton"); if (img == null) { gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); } else { var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); gfx.DrawImage(resized, closebuttonright); } } //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); var img = GetImage("minimizebutton"); if (img == null) { gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); } else { var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); gfx.DrawImage(resized, closebuttonright); } } } 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 var bottomlimg = GetImage("bottomlborder"); if (bottomlimg == null) { gfx.FillRectangle(new SolidBrush(borderbleftcolor), new Rectangle(0, bottomlocy, leftborderwidth, bottomborderwidth)); } else { bottomlimg = ResizeImage(bottomlimg, leftborderwidth, bottomborderwidth); gfx.DrawImage(bottomlimg, 0, bottomlocy); } //BOTTOM RIGHT var bottomrimg = GetImage("bottomrborder"); if (bottomrimg == null) { gfx.FillRectangle(new SolidBrush(borderbrightcolor), new Rectangle(brightlocx, bottomlocy, rightborderwidth, bottomborderwidth)); } else { bottomrimg = ResizeImage(bottomrimg, rightborderwidth, bottomborderwidth); gfx.DrawImage(bottomrimg, brightlocx, bottomlocy); } //BOTTOM var bottomimg = GetImage("bottomborder"); if (bottomimg == null) gfx.FillRectangle(new SolidBrush(borderbottomcolor), new Rectangle(bottomlocx, bottomlocy, bottomwidth, bottomborderwidth)); else { bottomimg = ResizeImage(bottomimg, bottomwidth, bottomborderwidth); gfx.DrawImage(bottomimg, bottomlocx, bottomlocy); } //LEFT var leftimg = GetImage("leftborder"); if (leftimg == null) gfx.FillRectangle(new SolidBrush(borderleftcolor), new Rectangle(0, titleheight, leftborderwidth, Height - titleheight - bottomborderwidth)); else { leftimg = ResizeImage(leftimg, leftborderwidth, Height - bottomborderwidth - titleheight); gfx.DrawImage(leftimg, 0, titleheight); } //RIGHT var rightimg = GetImage("rightborder"); if (rightimg == null) { gfx.FillRectangle(new SolidBrush(borderrightcolor), new Rectangle(brightlocx, titleheight, rightborderwidth, Height - titleheight - bottomborderwidth)); } else { rightimg = ResizeImage(rightimg, rightborderwidth, Height - titleheight - bottomborderwidth); gfx.DrawImage(rightimg, brightlocx, titleheight); } } //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. } } }