mirror of
https://git.alee14.me/shiftos-archive/ShiftOS_TheReturn.git
synced 2025-01-22 18:02:16 +00:00
text input stuff
This commit is contained in:
parent
68362b4c6f
commit
be6cd3a0c0
4 changed files with 141 additions and 24 deletions
|
@ -156,7 +156,42 @@ namespace ShiftOS.Frontend.Desktop
|
|||
{
|
||||
if (Shiftorium.UpgradeInstalled("wm_titlebar"))
|
||||
{
|
||||
if(MouseY < LoadedSkin.TitlebarHeight)
|
||||
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;
|
||||
|
|
|
@ -4,6 +4,7 @@ using System.Drawing;
|
|||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Xna.Framework;
|
||||
using ShiftOS.Frontend.GraphicsSubsystem;
|
||||
using static ShiftOS.Engine.SkinEngine;
|
||||
|
||||
|
@ -14,6 +15,7 @@ namespace ShiftOS.Frontend.GUI
|
|||
private string _label = "Type here!";
|
||||
private string _text = "";
|
||||
private int _index = 0;
|
||||
private Font _font = new Font("Tahoma", 9f);
|
||||
|
||||
protected override void OnKeyEvent(KeyEvent e)
|
||||
{
|
||||
|
@ -21,25 +23,66 @@ namespace ShiftOS.Frontend.GUI
|
|||
{
|
||||
if (_index > 0)
|
||||
_index--;
|
||||
|
||||
}
|
||||
if (e.Key == Microsoft.Xna.Framework.Input.Keys.Right)
|
||||
if (_index < _text.Length)
|
||||
_index++;
|
||||
if (e.KeyChar != '\0')
|
||||
_text.Insert(_index, e.KeyChar.ToString());
|
||||
if (e.KeyChar != '\0') {
|
||||
_text = _text.Insert(_index, e.KeyChar.ToString());
|
||||
_index++;
|
||||
}
|
||||
CalculateVisibleText();
|
||||
Invalidate();
|
||||
base.OnKeyEvent(e);
|
||||
}
|
||||
|
||||
protected override void OnLayout()
|
||||
private int textInputOffset = 0;
|
||||
private int maxCanFit = 5;
|
||||
string visibleText = "";
|
||||
float caretPos = 2f;
|
||||
|
||||
protected void CalculateVisibleText()
|
||||
{
|
||||
base.OnLayout();
|
||||
visibleText = "";
|
||||
caretPos = -1f;
|
||||
using (var gfx = Graphics.FromImage(new Bitmap(1, 1)))
|
||||
{
|
||||
for (int i = textInputOffset; i < _text.Length; i++)
|
||||
{
|
||||
visibleText += _text[i];
|
||||
var measure = gfx.MeasureString(visibleText, _font);
|
||||
if (measure.Width > Width)
|
||||
{
|
||||
maxCanFit = visibleText.Length;
|
||||
if(_index < textInputOffset)
|
||||
{
|
||||
textInputOffset = MathHelper.Clamp(_index - (maxCanFit / 2), 0, _text.Length - 1);
|
||||
|
||||
}
|
||||
if(_index > textInputOffset + maxCanFit)
|
||||
{
|
||||
textInputOffset = MathHelper.Clamp(_index + (maxCanFit / 2), 0, _text.Length - 1) - maxCanFit;
|
||||
}
|
||||
break;
|
||||
}
|
||||
Height = (int)measure.Height + 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int _textOffset = 0;
|
||||
|
||||
|
||||
protected override void OnPaint(Graphics gfx)
|
||||
{
|
||||
gfx.Clear(LoadedSkin.ControlColor);
|
||||
gfx.DrawString(visibleText, _font, new SolidBrush(LoadedSkin.ControlTextColor), 2, 2);
|
||||
if (IsFocusedControl)
|
||||
{
|
||||
//Draw caret.
|
||||
gfx.FillRectangle(new SolidBrush(LoadedSkin.ControlTextColor), new RectangleF(caretPos, 2, 2, Height - 4));
|
||||
}
|
||||
gfx.DrawRectangle(new Pen(new SolidBrush(LoadedSkin.ControlTextColor), 1), new Rectangle(0, 0, Width - 1, Height - 1));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace ShiftOS.Frontend.GraphicsSubsystem
|
|||
|
||||
public static void DrawControls(GraphicsDevice graphics, SpriteBatch batch)
|
||||
{
|
||||
foreach (var ctrl in topLevels)
|
||||
foreach (var ctrl in topLevels.ToArray())
|
||||
{
|
||||
using(var bmp = new System.Drawing.Bitmap(ctrl.Width, ctrl.Height))
|
||||
{
|
||||
|
|
|
@ -65,24 +65,63 @@ namespace ShiftOS.Frontend
|
|||
//Let's give it a try.
|
||||
Engine.Infobox.Show("Welcome to ShiftOS!", "This is a test infobox. Clicking OK will dismiss it.");
|
||||
|
||||
//Let's set up the Main Menu UI.
|
||||
//Let's initiate the engine just for a ha.
|
||||
|
||||
var justthes = new GUI.PictureBox();
|
||||
justthes.AutoSize = true;
|
||||
justthes.ImageLayout = GUI.ImageLayout.Stretch;
|
||||
justthes.Image = Properties.Resources.justthes;
|
||||
justthes.X = 15;
|
||||
justthes.Y = 15;
|
||||
justthes.Opacity = 0.5;
|
||||
UIManager.AddTopLevel(justthes);
|
||||
//We'll create a few UI elements when the save system loads
|
||||
SaveSystem.GameReady += () =>
|
||||
{
|
||||
var headerLabel = new GUI.TextControl();
|
||||
headerLabel.Font = SkinEngine.LoadedSkin.HeaderFont;
|
||||
headerLabel.AutoSize = true;
|
||||
headerLabel.Text = "ShiftOS engine startup stats";
|
||||
headerLabel.X = 30;
|
||||
headerLabel.Y = 30;
|
||||
UIManager.AddTopLevel(headerLabel);
|
||||
|
||||
_titleLabel = new GUI.TextControl();
|
||||
_titleLabel.Text = " - main menu - ";
|
||||
_titleLabel.AutoSize = true;
|
||||
_titleLabel.X = justthes.X;
|
||||
_titleLabel.Y = justthes.Y + justthes.Height + 15;
|
||||
_titleLabel.Font = SkinEngine.LoadedSkin.HeaderFont;
|
||||
UIManager.AddTopLevel(_titleLabel);
|
||||
var statslabel = new GUI.TextControl();
|
||||
statslabel.AutoSize = true;
|
||||
statslabel.X = 30;
|
||||
statslabel.Y = headerLabel.Y + headerLabel.Height + 30;
|
||||
UIManager.AddTopLevel(statslabel);
|
||||
statslabel.Text = $@"Save System
|
||||
=======================
|
||||
|
||||
System name: {SaveSystem.CurrentSave.SystemName}
|
||||
Users: {SaveSystem.CurrentSave.Users.Count}
|
||||
|
||||
Current user: {SaveSystem.CurrentUser.Username}
|
||||
|
||||
Sandbox mode: {SaveSystem.IsSandbox}
|
||||
Installed upgrades: {SaveSystem.CurrentSave.CountUpgrades()} - may be inaccurate if in sandbox mode
|
||||
Available upgrades: {Shiftorium.GetAvailable().Count()}
|
||||
Total upgrades: {Shiftorium.GetDefaults().Count()}
|
||||
|
||||
ShiftFS
|
||||
============================
|
||||
|
||||
Mounted file systems: {Objects.ShiftFS.Utils.Mounts.Count}
|
||||
|
||||
Reflection Manager
|
||||
=====================
|
||||
|
||||
Reflection manager found {ReflectMan.Types.Count()} Common Language Runtime types that ShiftOS can reflect over.
|
||||
|
||||
|
||||
";
|
||||
statslabel.Layout();
|
||||
};
|
||||
|
||||
//We'll use sandbox mode
|
||||
SaveSystem.IsSandbox = true;
|
||||
|
||||
SaveSystem.Begin();
|
||||
|
||||
var textinput = new GUI.TextInput();
|
||||
textinput.Width = 250;
|
||||
textinput.Height = 20;
|
||||
textinput.X = 0;
|
||||
textinput.Y = 0;
|
||||
UIManager.AddTopLevel(textinput);
|
||||
|
||||
base.Initialize();
|
||||
|
||||
|
|
Loading…
Reference in a new issue