ClassiCube/ClassicalSharp/2D/Widgets/Menu/MenuInputWidget.cs

103 lines
3.2 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;
}
}
}