mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-12-08 14:38:39 -05:00
223 lines
7.1 KiB
C#
223 lines
7.1 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using ClassicalSharp;
|
|
using OpenTK.Input;
|
|
|
|
namespace Launcher {
|
|
|
|
public abstract class LauncherScreen {
|
|
protected internal LauncherWindow game;
|
|
protected internal IDrawer2D drawer;
|
|
|
|
public bool Dirty;
|
|
protected int widgetIndex;
|
|
protected bool mouseMoved = false;
|
|
static bool supressMove = true;
|
|
|
|
public LauncherScreen( LauncherWindow game ) {
|
|
this.game = game;
|
|
drawer = game.Drawer;
|
|
}
|
|
|
|
public abstract void Init();
|
|
|
|
/// <summary> Function that is repeatedly called multiple times every second. </summary>
|
|
public abstract void Tick();
|
|
|
|
public abstract void Resize();
|
|
|
|
/// <summary> Cleans up all native resources held by this screen. </summary>
|
|
public abstract void Dispose();
|
|
|
|
protected LauncherWidget selectedWidget;
|
|
protected LauncherWidget[] widgets;
|
|
protected virtual void MouseMove( object sender, MouseMoveEventArgs e ) {
|
|
if( supressMove ) {
|
|
supressMove = false;
|
|
return;
|
|
}
|
|
mouseMoved = true;
|
|
for( int i = 0; i < widgets.Length; i++ ) {
|
|
LauncherWidget widget = widgets[i];
|
|
if( widget == null ) continue;
|
|
if( e.X >= widget.X && e.Y >= widget.Y &&
|
|
e.X < widget.X + widget.Width && e.Y < widget.Y + widget.Height ) {
|
|
if( selectedWidget == widget ) return;
|
|
|
|
if( selectedWidget != null )
|
|
UnselectWidget( selectedWidget );
|
|
SelectWidget( widget );
|
|
selectedWidget = widget;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if( selectedWidget == null ) return;
|
|
UnselectWidget( selectedWidget );
|
|
selectedWidget = null;
|
|
}
|
|
|
|
protected Font buttonFont;
|
|
|
|
/// <summary> Called when the user has moved their mouse away from a previously selected widget. </summary>
|
|
protected virtual void UnselectWidget( LauncherWidget widget ) {
|
|
LauncherButtonWidget button = widget as LauncherButtonWidget;
|
|
if( button != null ) {
|
|
button.Active = false;
|
|
button.RedrawBackground();
|
|
using( drawer ) {
|
|
drawer.SetBitmap( game.Framebuffer );
|
|
button.Redraw( drawer );
|
|
}
|
|
Dirty = true;
|
|
}
|
|
}
|
|
|
|
/// <summary> Called when user has moved their mouse over a given widget. </summary>
|
|
protected virtual void SelectWidget( LauncherWidget widget ) {
|
|
LauncherButtonWidget button = widget as LauncherButtonWidget;
|
|
if( button != null ) {
|
|
button.Active = true;
|
|
button.RedrawBackground();
|
|
using( drawer ) {
|
|
drawer.SetBitmap( game.Framebuffer );
|
|
button.Redraw( drawer );
|
|
}
|
|
Dirty = true;
|
|
}
|
|
}
|
|
|
|
protected void RedrawAllButtonBackgrounds() {
|
|
int buttons = 0;
|
|
for( int i = 0; i < widgets.Length; i++ ) {
|
|
if( widgets[i] == null || !(widgets[i] is LauncherButtonWidget) ) continue;
|
|
buttons++;
|
|
}
|
|
if( buttons == 0 ) return;
|
|
|
|
using( FastBitmap dst = new FastBitmap( game.Framebuffer, true ) ) {
|
|
for( int i = 0; i < widgets.Length; i++ ) {
|
|
if( widgets[i] == null ) continue;
|
|
LauncherButtonWidget button = widgets[i] as LauncherButtonWidget;
|
|
if( button != null )
|
|
button.RedrawBackground( dst );
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void RedrawAll() {
|
|
for( int i = 0; i < widgets.Length; i++ ) {
|
|
if( widgets[i] == null ) continue;
|
|
widgets[i].Redraw( drawer );
|
|
}
|
|
}
|
|
|
|
protected LauncherWidget lastClicked;
|
|
protected void MouseButtonDown( object sender, MouseButtonEventArgs e ) {
|
|
if( e.Button != MouseButton.Left ) return;
|
|
|
|
if( lastClicked != null && lastClicked != selectedWidget )
|
|
WidgetUnclicked( lastClicked );
|
|
if( selectedWidget != null && selectedWidget.OnClick != null )
|
|
selectedWidget.OnClick( e.X, e.Y );
|
|
lastClicked = selectedWidget;
|
|
}
|
|
|
|
protected virtual void WidgetUnclicked( LauncherWidget widget ) {
|
|
}
|
|
|
|
protected bool tabDown = false;
|
|
MouseMoveEventArgs moveArgs = new MouseMoveEventArgs();
|
|
MouseButtonEventArgs pressArgs = new MouseButtonEventArgs();
|
|
protected void HandleTab() {
|
|
if( tabDown ) return;
|
|
tabDown = true;
|
|
int index = lastClicked == null ? -1 :
|
|
Array.IndexOf<LauncherWidget>( widgets, lastClicked );
|
|
int dir = (game.Window.Keyboard[Key.ShiftLeft]
|
|
|| game.Window.Keyboard[Key.ShiftRight]) ? -1 : 1;
|
|
index += dir;
|
|
Utils.Clamp( ref index, 0, widgets.Length - 1);
|
|
|
|
for( int j = 0; j < widgets.Length * 2; j++ ) {
|
|
int i = (j * dir + index) % widgets.Length;
|
|
if( i < 0 ) i += widgets.Length;
|
|
|
|
if( widgets[i] is LauncherInputWidget || widgets[i] is LauncherButtonWidget ) {
|
|
LauncherWidget widget = widgets[i];
|
|
moveArgs.X = widget.X + widget.Width / 2;
|
|
moveArgs.Y = widget.Y + widget.Height / 2;
|
|
|
|
pressArgs.Button = MouseButton.Left;
|
|
pressArgs.IsPressed = true;
|
|
pressArgs.X = moveArgs.X;
|
|
pressArgs.Y = moveArgs.Y;
|
|
|
|
MouseMove( null, moveArgs );
|
|
Point p = game.Window.PointToScreen( Point.Empty );
|
|
p.Offset( moveArgs.X, moveArgs.Y );
|
|
game.Window.DesktopCursorPos = p;
|
|
lastClicked = widget;
|
|
|
|
if( widgets[i] is LauncherInputWidget ) {
|
|
MouseButtonDown( null, pressArgs );
|
|
((LauncherInputWidget)widgets[i]).CaretPos = -1;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void MakeButtonAt( string text, int width, int height, Font font,
|
|
Anchor verAnchor, int x, int y, Action<int, int> onClick ) {
|
|
MakeButtonAt( text, width, height, font, Anchor.Centre, verAnchor, x, y, onClick );
|
|
}
|
|
|
|
protected void MakeButtonAt( string text, int width, int height, Font font, Anchor horAnchor,
|
|
Anchor verAnchor, int x, int y, Action<int, int> onClick ) {
|
|
LauncherButtonWidget widget;
|
|
if( widgets[widgetIndex] != null ) {
|
|
widget = (LauncherButtonWidget)widgets[widgetIndex];
|
|
} else {
|
|
widget = new LauncherButtonWidget( game );
|
|
widget.Text = text;
|
|
widget.OnClick = onClick;
|
|
widgets[widgetIndex] = widget;
|
|
}
|
|
|
|
widget.Active = false;
|
|
widget.SetDrawData( drawer, text, font, horAnchor, verAnchor, width, height, x, y );
|
|
widgetIndex++;
|
|
}
|
|
|
|
protected void MakeLabelAt( string text, Font font, Anchor horAnchor, Anchor verAnchor, int x, int y ) {
|
|
LauncherLabelWidget widget;
|
|
if( widgets[widgetIndex] != null ) {
|
|
widget = (LauncherLabelWidget)widgets[widgetIndex];
|
|
} else {
|
|
widget = new LauncherLabelWidget( game, text );
|
|
widgets[widgetIndex] = widget;
|
|
}
|
|
|
|
widget.SetDrawData( drawer, text, font, horAnchor, verAnchor, x, y );
|
|
widgetIndex++;
|
|
}
|
|
|
|
protected void MakeBooleanAt( Anchor horAnchor, Anchor verAnchor, Font font, bool initValue,
|
|
int width, int height, int x, int y, Action<int, int> onClick ) {
|
|
LauncherBooleanWidget widget;
|
|
if( widgets[widgetIndex] != null ) {
|
|
widget = (LauncherBooleanWidget)widgets[widgetIndex];
|
|
} else {
|
|
widget = new LauncherBooleanWidget( game, font, width, height );
|
|
widget.Value = initValue;
|
|
widget.OnClick = onClick;
|
|
widgets[widgetIndex] = widget;
|
|
}
|
|
|
|
widget.SetDrawData( drawer, horAnchor, verAnchor, x, y );
|
|
widgetIndex++;
|
|
}
|
|
}
|
|
}
|