mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-11 15:17:38 -04:00
103 lines
3.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |