ClassiCube/ClassicalSharp/2D/Widgets/Menu/MenuInputWidget.cs
2016-11-27 14:50:45 +11:00

103 lines
3.1 KiB
C#

// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using System;
using System.Drawing;
using OpenTK.Input;
#if ANDROID
using Android.Graphics;
#endif
namespace ClassicalSharp.Gui.Widgets {
public sealed class MenuInputWidget : InputWidget {
public MenuInputWidget(Game game, Font font) : base(game, font) { }
public static MenuInputWidget Create(Game game, int width, int height, string text,
Font font, MenuInputValidator validator) {
MenuInputWidget input = new MenuInputWidget(game, font);
input.MinWidth = width;
input.MinHeight = height;
input.Validator = validator;
input.Init();
input.Append(text);
return input;
}
static FastColour backCol = new FastColour(30, 30, 30, 200);
public int MinWidth, MinHeight;
public MenuInputValidator Validator;
public override int MaxLines { get { return 1; } }
public override string Prefix { get { return null; } }
public override int Padding { get { return 3; } }
public override int MaxCharsPerLine { get { return Utils.StringLength; } }
public override void Render(double delta) {
gfx.Texturing = false;
gfx.Draw2DQuad(X, Y, Width, Height, backCol);
gfx.Texturing = true;
inputTex.Render(gfx);
RenderCaret(delta);
}
public override void RemakeTexture() {
DrawTextArgs args = new DrawTextArgs(lines[0], font, false);
Size size = game.Drawer2D.MeasureChatSize(ref args);
caretAccumulator = 0;
// Ensure we don't have 0 text height
if (size.Height == 0) {
args.Text = Validator.Range;
size.Height = game.Drawer2D.MeasureChatSize(ref args).Height;
args.Text = lines[0];
} else {
args.SkipPartsCheck = true;
}
Width = Math.Max(size.Width, MinWidth);
Height = Math.Max(size.Height, MinHeight);
Size adjSize = size; adjSize.Width = Width;
using (Bitmap bmp = IDrawer2D.CreatePow2Bitmap(adjSize))
using (IDrawer2D drawer = game.Drawer2D)
{
drawer.SetBitmap(bmp);
drawer.DrawChatText(ref args, Padding, 0);
args.Text = Validator.Range;
args.SkipPartsCheck = false;
Size hintSize = drawer.MeasureChatSize(ref args);
args.SkipPartsCheck = true;
int hintX = adjSize.Width - hintSize.Width;
if (size.Width + 3 < hintX)
drawer.DrawChatText(ref args, hintX, 0);
inputTex = drawer.Make2DTexture(bmp, adjSize, 0, 0);
}
CalculatePosition();
inputTex.X1 = X; inputTex.Y1 = Y;
if (size.Height < MinHeight)
inputTex.Y1 += MinHeight / 2 - size.Height / 2;
}
static bool IsInvalidChar(char c) {
// Make sure we're in the printable text range from 0x20 to 0x7E
return c < ' ' || c == '&' || c > '~';
// TODO: Uncomment this for full unicode support for save level screen
}
protected override bool AllowedChar(char c) {
if (IsInvalidChar(c)) return false;
if (!Validator.IsValidChar(c)) return false;
if (Text.Length == MaxCharsPerLine) return false;
// See if the new string is in valid format
AppendChar(c);
bool valid = Validator.IsValidString(Text.ToString());
DeleteChar();
return valid;
}
}
}