aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.Frontend
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS.Frontend')
-rw-r--r--ShiftOS.Frontend/Desktop/Desktop.cs149
-rw-r--r--ShiftOS.Frontend/GUI/Control.cs13
-rw-r--r--ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs33
-rw-r--r--ShiftOS.Frontend/ShiftOS.cs27
4 files changed, 195 insertions, 27 deletions
diff --git a/ShiftOS.Frontend/Desktop/Desktop.cs b/ShiftOS.Frontend/Desktop/Desktop.cs
index ffb41e8..bec7016 100644
--- a/ShiftOS.Frontend/Desktop/Desktop.cs
+++ b/ShiftOS.Frontend/Desktop/Desktop.cs
@@ -6,11 +6,22 @@ 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 Desktop : GUI.Control, IDesktop
{
+ public Desktop()
+ {
+ SaveSystem.GameReady += () =>
+ {
+ Show();
+ SetupDesktop();
+ };
+ }
+
public string DesktopName
{
get
@@ -21,12 +32,12 @@ namespace ShiftOS.Frontend.Desktop
public void Close()
{
- throw new NotImplementedException();
+ UIManager.StopHandling(this);
}
public Size GetSize()
{
- return new Size(Width, Height);
+ return UIManager.Viewport;
}
public void HideAppLauncher()
@@ -57,10 +68,22 @@ namespace ShiftOS.Frontend.Desktop
public void PopulateAppLauncher(LauncherItem[] items)
{
+ Invalidate();
}
public void PopulatePanelButtons()
{
+ PanelButtons.Clear();
+ foreach(var win in AppearanceManager.OpenForms)
+ {
+ var border = win as WindowBorder;
+ var pbtn = new PanelButtonData();
+ pbtn.Title = border.Text;
+ pbtn.Window = border;
+ PanelButtons.Add(pbtn);
+ }
+
+ Invalidate();
}
public void PushNotification(string app, string title, string message)
@@ -73,14 +96,136 @@ namespace ShiftOS.Frontend.Desktop
public void SetupDesktop()
{
+ Invalidate();
}
public void Show()
{
+ UIManager.AddTopLevel(this);
+ Visible = true;
+ Invalidate();
}
public void ShowWindow(IWindowBorder border)
{
}
+
+ protected override void OnLayout()
+ {
+ SendToBack();
+ X = 0;
+ Y = 0;
+ Width = GetSize().Width;
+ Height = GetSize().Height;
+ Invalidate();
+ }
+
+ private List<PanelButtonData> PanelButtons = new List<PanelButtonData>();
+
+ protected override void OnPaint(GraphicsContext gfx)
+ {
+ //Let's get data for the desktop panel.
+
+ //We need the width and the height and the position.
+
+ int dp_height = LoadedSkin.DesktopPanelHeight;
+ int dp_position = (LoadedSkin.DesktopPanelPosition == 0) ? 0 : Height - dp_height;
+ int dp_width = Width;
+
+ //Alright, now we need to know if we should draw using a texture or a color
+ if (UIManager.SkinTextures.ContainsKey("desktoppanel"))
+ {
+ //Draw with the texture
+ gfx.DrawRectangle(0, dp_position, dp_width, dp_height, UIManager.SkinTextures["desktoppanel"]);
+ }
+ else
+ {
+ //draw with a color
+ var color = LoadedSkin.DesktopPanelColor.ToMonoColor();
+ gfx.DrawRectangle(0, dp_position, dp_width, dp_height, color);
+ }
+
+ //Alright, now App Launcher.
+ var al_left = LoadedSkin.AppLauncherFromLeft;
+ var holderSize = LoadedSkin.AppLauncherHolderSize;
+ if (UIManager.SkinTextures.ContainsKey("applauncher"))
+ {
+ gfx.DrawRectangle(al_left.X, dp_position + al_left.Y, holderSize.Width, holderSize.Height, UIManager.SkinTextures["applauncher"]);
+ }
+
+ //Panel clock.
+
+ var panelClockRight = LoadedSkin.DesktopPanelClockFromRight;
+ var panelClockTextColor = LoadedSkin.DesktopPanelClockColor.ToMonoColor();
+
+ var dateTimeString = DateTime.Now.TimeOfDay.ToString();
+
+ var measure = gfx.MeasureString(dateTimeString, LoadedSkin.DesktopPanelClockFont);
+
+ int panelclockleft = Width - (int)measure.X;
+ int panelclockwidth = Width - panelclockleft;
+
+ if (UIManager.SkinTextures.ContainsKey("panelclockbg"))
+ {
+ //draw the background using panelclock texture
+ gfx.DrawRectangle(panelclockleft, dp_position, panelclockwidth, dp_height, UIManager.SkinTextures["panelclockbg"]);
+ }
+ else
+ {
+ //draw using the bg color
+ var pcBGColor = LoadedSkin.DesktopPanelClockBackgroundColor.ToMonoColor();
+ gfx.DrawRectangle(panelclockleft, dp_position, panelclockwidth, dp_height, pcBGColor);
+ }
+
+ int text_left = (panelclockwidth - (int)measure.X) / 2;
+ int text_top = (dp_height - (int)measure.Y) / 2;
+
+ //draw string
+ gfx.DrawString(dateTimeString, panelclockleft + text_left, dp_position + text_top, panelClockTextColor, LoadedSkin.DesktopPanelClockFont);
+
+ int initialGap = LoadedSkin.PanelButtonHolderFromLeft;
+ int offset = initialGap;
+
+ foreach(var pbtn in PanelButtons)
+ {
+ offset += LoadedSkin.PanelButtonFromLeft.X;
+
+ int pbtnfromtop = LoadedSkin.PanelButtonFromTop;
+ int pbtnwidth = LoadedSkin.PanelButtonSize.Width;
+ int pbtnheight = LoadedSkin.PanelButtonSize.Height;
+
+ //Draw panel button background...
+ if (UIManager.SkinTextures.ContainsKey("panelbutton"))
+ {
+ gfx.DrawRectangle(offset, dp_position + pbtnfromtop, pbtnwidth, pbtnheight, UIManager.SkinTextures["panelbutton"]);
+ }
+ else
+ {
+ gfx.DrawRectangle(offset, dp_position + pbtnfromtop, pbtnwidth, pbtnheight, LoadedSkin.PanelButtonColor.ToMonoColor());
+ }
+
+ //now we draw the text
+
+ gfx.DrawString(pbtn.Title, offset + 2, dp_position + pbtnfromtop + 2, LoadedSkin.PanelButtonTextColor.ToMonoColor(), LoadedSkin.PanelButtonFont);
+
+ offset += LoadedSkin.PanelButtonSize.Width;
+ }
+
+
+ }
+ }
+
+ public class PanelButtonData
+ {
+ public string Title { get; set; }
+ public WindowBorder Window { get; set; }
+
+ public bool IsActive
+ {
+ get
+ {
+ return Window.IsFocusedControl || Window.ContainsFocusedControl;
+ }
+ }
}
}
diff --git a/ShiftOS.Frontend/GUI/Control.cs b/ShiftOS.Frontend/GUI/Control.cs
index b502a71..012b2ee 100644
--- a/ShiftOS.Frontend/GUI/Control.cs
+++ b/ShiftOS.Frontend/GUI/Control.cs
@@ -367,6 +367,19 @@ namespace ShiftOS.Frontend.GUI
gfx.Clear(Engine.SkinEngine.LoadedSkin.ControlColor.ToMonoColor());
}
+ public void SendToBack()
+ {
+ if(_parent != null)
+ {
+ _parent._children.Remove(this);
+ _parent._children.Insert(0, this);
+ }
+ else
+ {
+ UIManager.SendToBack(this);
+ }
+ }
+
public void InvalidateTopLevel()
{
var parent = this;
diff --git a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs
index 12738a8..ac8c6f2 100644
--- a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs
+++ b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs
@@ -49,12 +49,23 @@ namespace ShiftOS.Frontend.GraphicsSubsystem
if (ctrl.Visible == true)
{
int hc = ctrl.GetHashCode();
+ if (!TextureCaches.ContainsKey(hc))
+ {
+ ctrl.Invalidate();
+ continue;
+ }
var _target = TextureCaches[hc];
batch.Draw(_target, new Rectangle(ctrl.X, ctrl.Y, ctrl.Width, ctrl.Height), Color.White);
}
}
}
+ public static void SendToBack(Control ctrl)
+ {
+ topLevels.Remove(ctrl);
+ topLevels.Insert(0, ctrl);
+ }
+
public static void DrawControlsToTargets(GraphicsDevice graphics, SpriteBatch batch, int width, int height)
{
foreach (var ctrl in topLevels.ToArray().Where(x=>x.Visible==true))
@@ -80,9 +91,10 @@ namespace ShiftOS.Frontend.GraphicsSubsystem
{
graphics.SetRenderTarget(_target);
graphics.DepthStencilState = new DepthStencilState() { DepthBufferEnable = true };
- batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend,
+ batch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied,
SamplerState.LinearClamp, DepthStencilState.Default,
RasterizerState.CullNone);
+ graphics.Clear(Color.Transparent);
var gfxContext = new GraphicsContext(graphics, batch, 0, 0, _target.Width, _target.Height);
ctrl.Paint(gfxContext);
@@ -169,24 +181,9 @@ namespace ShiftOS.Frontend.GraphicsSubsystem
if (SkinEngine.LoadedSkin == null)
SkinEngine.Init();
graphics.Clear(SkinEngine.LoadedSkin.DesktopColor.ToMonoColor());
- var desktopbg = SkinEngine.GetImage("desktopbackground");
- if(desktopbg != null)
+ if (SkinTextures.ContainsKey("desktopbackground"))
{
- var bmp = (System.Drawing.Bitmap)SkinEngine.GetImage("desktopbackground");
- GUI.Control.ResizeImage(bmp, width, height);
- var _lock = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
- var rgb = new byte[Math.Abs(_lock.Stride) * _lock.Height];
- Marshal.Copy(_lock.Scan0, rgb, 0, rgb.Length);
- bmp.UnlockBits(_lock);
- bmp.Dispose();
- if(DesktopBackground == null)
- {
- DesktopBackground = new Texture2D(graphics, width, height);
- }
-
- DesktopBackground.SetData<byte>(rgb);
-
- batch.Draw(DesktopBackground, new Rectangle(0, 0, width, height), Color.White);
+ batch.Draw(SkinTextures["desktopbackground"], new Rectangle(0, 0, Viewport.Width, Viewport.Height), Color.White);
}
}
diff --git a/ShiftOS.Frontend/ShiftOS.cs b/ShiftOS.Frontend/ShiftOS.cs
index e02333d..df61b91 100644
--- a/ShiftOS.Frontend/ShiftOS.cs
+++ b/ShiftOS.Frontend/ShiftOS.cs
@@ -19,6 +19,8 @@ namespace ShiftOS.Frontend
GraphicsDeviceManager GraphicsDevice;
SpriteBatch spriteBatch;
+ private bool DisplayDebugInfo = false;
+
public ShiftOS()
{
GraphicsDevice = new GraphicsDeviceManager(this);
@@ -186,8 +188,16 @@ namespace ShiftOS.Frontend
var alt = keystate.IsKeyDown(Keys.LeftAlt) || keystate.IsKeyDown(Keys.RightAlt);
var control = keystate.IsKeyDown(Keys.LeftControl) || keystate.IsKeyDown(Keys.RightControl);
- var e = new KeyEvent(control, alt, shift, lastKey);
- UIManager.ProcessKeyEvent(e);
+ if (control && lastKey == Keys.D)
+ {
+ DisplayDebugInfo = !DisplayDebugInfo;
+
+ }
+ else
+ {
+ var e = new KeyEvent(control, alt, shift, lastKey);
+ UIManager.ProcessKeyEvent(e);
+ }
}
}
kb_elapsedms += gameTime.ElapsedGameTime.TotalMilliseconds;
@@ -213,7 +223,9 @@ namespace ShiftOS.Frontend
{
UIManager.DrawControlsToTargets(GraphicsDevice.GraphicsDevice, spriteBatch, 0, 0);
- this.spriteBatch.Begin();
+ spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied,
+ SamplerState.LinearClamp, DepthStencilState.Default,
+ RasterizerState.CullNone);
//Draw the desktop BG.
UIManager.DrawBackgroundLayer(GraphicsDevice.GraphicsDevice, spriteBatch, 640, 480);
@@ -226,11 +238,12 @@ namespace ShiftOS.Frontend
var mousepos = Mouse.GetState(this.Window).Position;
spriteBatch.Draw(MouseTexture, new Rectangle(mousepos.X, mousepos.Y, MouseTexture.Width, MouseTexture.Height), Color.White);
+ if (DisplayDebugInfo)
+ {
+ var gfxContext = new GraphicsContext(GraphicsDevice.GraphicsDevice, spriteBatch, 0, 0, GraphicsDevice.PreferredBackBufferWidth, GraphicsDevice.PreferredBackBufferHeight);
- var gfxContext = new GraphicsContext(GraphicsDevice.GraphicsDevice, spriteBatch, 0,0, GraphicsDevice.PreferredBackBufferWidth, GraphicsDevice.PreferredBackBufferHeight);
-
- gfxContext.DrawString("ShiftOS 1.0 Beta 4\r\nCopyright (c) 2017 Michael VanOverbeek, Rylan Arbour, RogueAI\r\nThis is an unstable build.\r\nFPS: " + (1 / gameTime.ElapsedGameTime.TotalSeconds).ToString(), 0, 0, Color.White, new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Bold));
-
+ gfxContext.DrawString("ShiftOS 1.0 Beta 4\r\nCopyright (c) 2017 Michael VanOverbeek, Rylan Arbour, RogueAI\r\nThis is an unstable build.\r\nFPS: " + (1 / gameTime.ElapsedGameTime.TotalSeconds).ToString(), 0, 0, Color.White, new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Bold));
+ }
spriteBatch.End();
base.Draw(gameTime);