mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-11 23:27:24 -04:00
103 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
} |