mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-24 18:13:15 -05:00
308 lines
No EOL
9.3 KiB
C#
308 lines
No EOL
9.3 KiB
C#
// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
|
|
using System;
|
|
using System.Drawing;
|
|
using ClassicalSharp.Hotkeys;
|
|
using OpenTK.Input;
|
|
|
|
namespace ClassicalSharp.Gui {
|
|
|
|
// TODO: Hotkey added event for CPE
|
|
public sealed class HotkeyScreen : MenuScreen {
|
|
|
|
HotkeyList hotkeys;
|
|
public HotkeyScreen( Game game ) : base( game ) {
|
|
hotkeys = game.InputHandler.Hotkeys;
|
|
}
|
|
|
|
Font arrowFont, textFont;
|
|
public override void Render( double delta ) {
|
|
RenderMenuBounds();
|
|
graphicsApi.Texturing = true;
|
|
RenderMenuWidgets( delta );
|
|
|
|
if( currentAction != null ) {
|
|
currentAction.Render( delta );
|
|
currentMoreInputLabel.Render( delta );
|
|
}
|
|
graphicsApi.Texturing = false;
|
|
}
|
|
|
|
public override bool HandlesMouseMove( int mouseX, int mouseY ) {
|
|
return HandleMouseMove( widgets, mouseX, mouseY );
|
|
}
|
|
|
|
public override bool HandlesMouseClick( int mouseX, int mouseY, MouseButton button ) {
|
|
return HandleMouseClick( widgets, mouseX, mouseY, button );
|
|
}
|
|
|
|
bool supressNextPress;
|
|
const int numButtons = 5;
|
|
public override bool HandlesKeyPress( char key ) {
|
|
if( supressNextPress ) {
|
|
supressNextPress = false;
|
|
return true;
|
|
}
|
|
|
|
return currentAction == null ? false :
|
|
currentAction.HandlesKeyPress( key );
|
|
}
|
|
|
|
public override bool HandlesKeyDown( Key key ) {
|
|
if( key == Key.Escape ) {
|
|
game.SetNewScreen( null );
|
|
return true;
|
|
} else if( focusWidget != null ) {
|
|
FocusKeyDown( key );
|
|
return true;
|
|
}
|
|
|
|
if( key == Key.Left ) {
|
|
PageClick( false );
|
|
return true;
|
|
} else if( key == Key.Right ) {
|
|
PageClick( true );
|
|
return true;
|
|
}
|
|
return currentAction == null ? false :
|
|
currentAction.HandlesKeyDown( key );
|
|
}
|
|
|
|
public override bool HandlesKeyUp( Key key ) {
|
|
return currentAction == null ? false :
|
|
currentAction.HandlesKeyUp( key );
|
|
}
|
|
|
|
public override void Init() {
|
|
game.Keyboard.KeyRepeat = true;
|
|
base.Init();
|
|
regularFont = new Font( game.FontName, 16, FontStyle.Regular );
|
|
arrowFont = new Font( game.FontName, 18, FontStyle.Bold );
|
|
textFont = new Font( game.FontName, 14, FontStyle.Bold );
|
|
|
|
widgets = new [] {
|
|
MakeHotkey( 0, -160, 0 ),
|
|
MakeHotkey( 0, -120, 1 ),
|
|
MakeHotkey( 0, -80, 2 ),
|
|
MakeHotkey( 0, -40, 3 ),
|
|
MakeHotkey( 0, 0, 4 ),
|
|
Make( -160, -80, "<", 40, 40, arrowFont, (g, w) => PageClick( false ) ),
|
|
Make( 160, -80, ">", 40, 40, arrowFont, (g, w) => PageClick( true ) ),
|
|
|
|
MakeBack( false, titleFont,
|
|
(g, w) => g.SetNewScreen( new PauseScreen( g ) ) ),
|
|
null, // current key
|
|
null, // current modifiers
|
|
null, // leave open current
|
|
null, // save current
|
|
null, // remove current
|
|
null,
|
|
};
|
|
}
|
|
|
|
public override void OnResize( int oldWidth, int oldHeight, int width, int height ) {
|
|
if( currentAction != null ) {
|
|
currentAction.OnResize( oldWidth, oldHeight, width, height );
|
|
currentMoreInputLabel.OnResize( oldWidth, oldHeight, width, height );
|
|
}
|
|
base.OnResize( oldWidth, oldHeight, width, height );
|
|
}
|
|
|
|
public override void Dispose() {
|
|
game.Keyboard.KeyRepeat = false;
|
|
DisposeEditingWidgets();
|
|
|
|
arrowFont.Dispose();
|
|
textFont.Dispose();
|
|
base.Dispose();
|
|
}
|
|
|
|
ButtonWidget Make( int x, int y, string text, int width, int height,
|
|
Font font, Action<Game, Widget> onClick ) {
|
|
return ButtonWidget.Create( game, x, y, width, height, text,
|
|
Anchor.Centre, Anchor.Centre, font, LeftOnly( onClick ) );
|
|
}
|
|
|
|
ButtonWidget MakeHotkey( int x, int y, int index ) {
|
|
string text = Get( index + currentIndex );
|
|
ButtonWidget button = ButtonWidget.Create(
|
|
game, x, y, 240, 30, text, Anchor.Centre, Anchor.Centre,
|
|
textFont, TextButtonClick );
|
|
|
|
button.Metadata = default( Hotkey );
|
|
if( text != "-----" )
|
|
button.Metadata = hotkeys.Hotkeys[index + currentIndex];
|
|
return button;
|
|
}
|
|
|
|
string Get( int index ) {
|
|
if( index >= hotkeys.Hotkeys.Count ) return "-----";
|
|
|
|
Hotkey hKey = hotkeys.Hotkeys[index];
|
|
return hKey.BaseKey + " | " + MakeFlagsString( hKey.Flags );
|
|
}
|
|
|
|
void Set( int index ) {
|
|
string text = Get( index + currentIndex );
|
|
Widget widget = widgets[index];
|
|
SetButton( widget, text );
|
|
|
|
widget.Metadata = default( Hotkey );
|
|
if( text != "-----" )
|
|
widget.Metadata = hotkeys.Hotkeys[index + currentIndex];
|
|
}
|
|
|
|
string MakeFlagsString( byte flags ) {
|
|
if( flags == 0 ) return "None";
|
|
|
|
return ((flags & 1) == 0 ? " " : "Ctrl ") +
|
|
((flags & 2) == 0 ? " " : "Shift ") +
|
|
((flags & 4) == 0 ? " " : "Alt ");
|
|
}
|
|
|
|
int currentIndex;
|
|
void PageClick( bool forward ) {
|
|
currentIndex += forward ? numButtons : -numButtons;
|
|
if( currentIndex >= hotkeys.Hotkeys.Count + numButtons )
|
|
currentIndex -= numButtons;
|
|
if( currentIndex < 0 ) currentIndex = 0;
|
|
|
|
LostFocus();
|
|
for( int i = 0; i < numButtons; i++ )
|
|
Set( i );
|
|
}
|
|
|
|
void TextButtonClick( Game game, Widget widget, MouseButton mouseBtn ) {
|
|
if( mouseBtn != MouseButton.Left ) return;
|
|
LostFocus();
|
|
ButtonWidget button = (ButtonWidget)widget;
|
|
|
|
curHotkey = (Hotkey)button.Metadata;
|
|
origHotkey = curHotkey;
|
|
CreateEditingWidgets();
|
|
}
|
|
|
|
#region Modifying hotkeys
|
|
|
|
Hotkey curHotkey, origHotkey;
|
|
MenuInputWidget currentAction;
|
|
TextWidget currentMoreInputLabel;
|
|
Widget focusWidget;
|
|
|
|
void CreateEditingWidgets() {
|
|
DisposeEditingWidgets();
|
|
|
|
widgets[8] = Make( -140, 55, "Key: " + curHotkey.BaseKey,
|
|
250, 35, textFont, BaseKeyClick );
|
|
widgets[9] = Make( 140, 55, "Modifiers: " + MakeFlagsString( curHotkey.Flags ),
|
|
250, 35, textFont, ModifiersClick );
|
|
widgets[10] = Make( -10, 120, curHotkey.MoreInput ? "yes" : "no",
|
|
50, 25, textFont, LeaveOpenClick );
|
|
widgets[11] = Make( -120, 160, "Save changes",
|
|
180, 35, textFont, SaveChangesClick );
|
|
widgets[12] = Make( 120, 160, "Remove hotkey",
|
|
180, 35, textFont, RemoveHotkeyClick );
|
|
|
|
currentAction = MenuInputWidget.Create(
|
|
game, 0, 90, 600, 30, "", Anchor.Centre, Anchor.Centre,
|
|
regularFont, titleFont, new StringValidator( 64 ) );
|
|
currentMoreInputLabel = TextWidget.Create(
|
|
game, -170, 120, "Keep input bar open:",
|
|
Anchor.Centre, Anchor.Centre, textFont );
|
|
|
|
if( curHotkey.Text == null ) curHotkey.Text = "";
|
|
currentAction.SetText( curHotkey.Text );
|
|
}
|
|
|
|
void DisposeEditingWidgets() {
|
|
if( currentAction != null ) {
|
|
currentAction.Dispose();
|
|
currentAction = null;
|
|
}
|
|
|
|
for( int i = 8; i < widgets.Length - 1; i++ ) {
|
|
if( widgets[i] != null ) {
|
|
widgets[i].Dispose();
|
|
widgets[i] = null;
|
|
}
|
|
}
|
|
focusWidget = null;
|
|
}
|
|
|
|
void LeaveOpenClick( Game game, Widget widget ) {
|
|
LostFocus();
|
|
curHotkey.MoreInput = !curHotkey.MoreInput;
|
|
SetButton( widgets[10], curHotkey.MoreInput ? "yes" : "no" );
|
|
}
|
|
|
|
void SaveChangesClick( Game game, Widget widget ) {
|
|
if( curHotkey.BaseKey != Key.Unknown ) {
|
|
hotkeys.AddHotkey( curHotkey.BaseKey, curHotkey.Flags,
|
|
currentAction.GetText(), curHotkey.MoreInput );
|
|
hotkeys.UserAddedHotkey( curHotkey.BaseKey, curHotkey.Flags,
|
|
curHotkey.MoreInput, currentAction.GetText() );
|
|
}
|
|
|
|
for( int i = 0; i < numButtons; i++ )
|
|
Set( i );
|
|
DisposeEditingWidgets();
|
|
}
|
|
|
|
void RemoveHotkeyClick( Game game, Widget widget ) {
|
|
if( origHotkey.BaseKey != Key.Unknown ) {
|
|
hotkeys.RemoveHotkey( origHotkey.BaseKey, origHotkey.Flags );
|
|
hotkeys.UserRemovedHotkey( origHotkey.BaseKey, origHotkey.Flags );
|
|
}
|
|
|
|
for( int i = 0; i < numButtons; i++ )
|
|
Set( i );
|
|
DisposeEditingWidgets();
|
|
}
|
|
|
|
void BaseKeyClick( Game game, Widget widget ) {
|
|
focusWidget = widgets[8];
|
|
SetButton( widgets[8], "Key: press a key.." );
|
|
supressNextPress = true;
|
|
}
|
|
|
|
void ModifiersClick( Game game, Widget widget ) {
|
|
focusWidget = widgets[9];
|
|
SetButton( widgets[9], "Modifiers: press a key.." );
|
|
supressNextPress = true;
|
|
}
|
|
|
|
void FocusKeyDown( Key key ) {
|
|
if( focusWidget == widgets[8] ) {
|
|
curHotkey.BaseKey = key;
|
|
SetButton( widgets[8], "Key: " + curHotkey.BaseKey );
|
|
supressNextPress = true;
|
|
} else if( focusWidget == widgets[9] ) {
|
|
if( key == Key.ControlLeft || key == Key.ControlRight ) curHotkey.Flags |= 1;
|
|
else if( key == Key.ShiftLeft || key == Key.ShiftRight ) curHotkey.Flags |= 2;
|
|
else if( key == Key.AltLeft || key == Key.AltRight ) curHotkey.Flags |= 4;
|
|
else curHotkey.Flags = 0;
|
|
|
|
SetButton( widgets[9], "Modifiers: " + MakeFlagsString( curHotkey.Flags ) );
|
|
supressNextPress = true;
|
|
}
|
|
focusWidget = null;
|
|
}
|
|
|
|
void LostFocus() {
|
|
if( focusWidget == null ) return;
|
|
|
|
if( focusWidget == widgets[8] ) {
|
|
SetButton( widgets[8], "Key: " + curHotkey.BaseKey );
|
|
} else if( focusWidget == widgets[9] ) {
|
|
SetButton( widgets[9], "Modifiers: " + MakeFlagsString( curHotkey.Flags ) );
|
|
}
|
|
focusWidget = null;
|
|
supressNextPress = false;
|
|
}
|
|
|
|
void SetButton( Widget widget, string text ) {
|
|
((ButtonWidget)widget).SetText( text );
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |