Port EditHotkeyScreen to C

This commit is contained in:
UnknownShadow200 2018-04-08 09:18:38 +10:00
parent 25790d86ca
commit ad75bf435e
18 changed files with 361 additions and 116 deletions

View File

@ -11,16 +11,15 @@ namespace ClassicalSharp.Gui.Screens {
} }
public override void Init() { public override void Init() {
textFont = new Font(game.FontName, 40);
base.Init(); base.Init();
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 40);
ContextRecreated(); ContextRecreated();
} }
protected override void ContextRecreated() { protected override void ContextRecreated() {
string score = game.Chat.Status1.Text; string score = game.Chat.Status1.Text;
widgets = new Widget[] { widgets = new Widget[] {
TextWidget.Create(game, "Game over!", regularFont) TextWidget.Create(game, "Game over!", textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -150), .SetLocation(Anchor.Centre, Anchor.Centre, 0, -150),
TextWidget.Create(game, score, titleFont) TextWidget.Create(game, score, titleFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -75), .SetLocation(Anchor.Centre, Anchor.Centre, 0, -75),

View File

@ -51,8 +51,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
game.Keyboard.KeyRepeat = true; game.Keyboard.KeyRepeat = true;
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
ContextRecreated(); ContextRecreated();
} }
@ -63,18 +61,18 @@ namespace ClassicalSharp.Gui.Screens {
bool existed = origHotkey.BaseKey != Key.Unknown; bool existed = origHotkey.BaseKey != Key.Unknown;
InputWidget input; InputWidget input;
input = MenuInputWidget.Create(game, 500, 30, curHotkey.Text, regularFont, new StringValidator()) input = MenuInputWidget.Create(game, 500, 30, curHotkey.Text, textFont, new StringValidator())
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -35); .SetLocation(Anchor.Centre, Anchor.Centre, 0, -35);
input.ShowCaret = true; input.ShowCaret = true;
widgets = new Widget[] { widgets = new Widget[] {
Make(0, -150, "Key: " + curHotkey.BaseKey, 300, titleFont, BaseKeyClick), Make(0, -150, "Key: " + curHotkey.BaseKey, BaseKeyClick),
Make(0, -100, "Modifiers:" + flags, 300, titleFont, ModifiersClick), Make(0, -100, "Modifiers:" + flags, ModifiersClick),
input, input,
Make(-100, 10, "Input stays open: " + staysOpen, 300, titleFont, LeaveOpenClick), Make(-100, 10, "Input stays open: " + staysOpen, LeaveOpenClick),
Make(0, 80, existed ? "Save changes" : "Add hotkey", 300, titleFont, SaveChangesClick), Make(0, 80, existed ? "Save changes" : "Add hotkey", SaveChangesClick),
Make(0, 130, existed ? "Remove hotkey" : "Cancel", 300, titleFont, RemoveHotkeyClick), Make(0, 130, existed ? "Remove hotkey" : "Cancel", RemoveHotkeyClick),
MakeBack(false, titleFont, SwitchPause), MakeBack(false, titleFont, SwitchPause),
}; };
} }
@ -85,8 +83,8 @@ namespace ClassicalSharp.Gui.Screens {
base.Dispose(); base.Dispose();
} }
ButtonWidget Make(int x, int y, string text, int width, Font font, ClickHandler onClick) { ButtonWidget Make(int x, int y, string text, ClickHandler onClick) {
return ButtonWidget.Create(game, width, text, font, onClick) return ButtonWidget.Create(game, 300, text, titleFont, onClick)
.SetLocation(Anchor.Centre, Anchor.Centre, x, y); .SetLocation(Anchor.Centre, Anchor.Centre, x, y);
} }

View File

@ -30,8 +30,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
game.Keyboard.KeyRepeat = true; game.Keyboard.KeyRepeat = true;
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
ContextRecreated(); ContextRecreated();
} }
@ -44,7 +42,7 @@ namespace ClassicalSharp.Gui.Screens {
MakeLabel(-150, -80, "Width:"), MakeLabel(-150, -40, "Height:"), MakeLabel(-150, -80, "Width:"), MakeLabel(-150, -40, "Height:"),
MakeLabel(-150, 0, "Length:"), MakeLabel(-140, 40, "Seed:"), MakeLabel(-150, 0, "Length:"), MakeLabel(-140, 40, "Seed:"),
TextWidget.Create(game, "Generate new level", regularFont) TextWidget.Create(game, "Generate new level", textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -130), .SetLocation(Anchor.Centre, Anchor.Centre, 0, -130),
ButtonWidget.Create(game, 200, "Flatgrass", titleFont, GenFlatgrassClick) ButtonWidget.Create(game, 200, "Flatgrass", titleFont, GenFlatgrassClick)
@ -58,7 +56,7 @@ namespace ClassicalSharp.Gui.Screens {
InputWidget MakeInput(int y, bool seed, string value) { InputWidget MakeInput(int y, bool seed, string value) {
MenuInputValidator validator = seed ? new SeedValidator() : new IntegerValidator(1, 8192); MenuInputValidator validator = seed ? new SeedValidator() : new IntegerValidator(1, 8192);
InputWidget input = MenuInputWidget.Create(game, 200, 30, value, InputWidget input = MenuInputWidget.Create(game, 200, 30, value,
regularFont, validator) textFont, validator)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, y); .SetLocation(Anchor.Centre, Anchor.Centre, 0, y);
input.Active = false; input.Active = false;
@ -67,7 +65,7 @@ namespace ClassicalSharp.Gui.Screens {
} }
TextWidget MakeLabel(int x, int y, string text) { TextWidget MakeLabel(int x, int y, string text) {
TextWidget label = TextWidget.Create(game, text, regularFont) TextWidget label = TextWidget.Create(game, text, textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, x, y); .SetLocation(Anchor.Centre, Anchor.Centre, x, y);
label.XOffset = -110 - label.Width / 2; label.XOffset = -110 - label.Width / 2;
@ -135,23 +133,23 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
ContextRecreated(); ContextRecreated();
} }
protected override void ContextRecreated() { protected override void ContextRecreated() {
widgets = new Widget[] { widgets = new Widget[] {
ButtonWidget.Create(game, 400, "Small", titleFont, GenSmallClick) Make(-100, "Small", GenSmallClick),
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -100), Make( -50, "Normal", GenMediumClick),
ButtonWidget.Create(game, 400, "Normal", titleFont, GenMediumClick) Make( 0, "Huge", GenHugeClick),
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -50),
ButtonWidget.Create(game, 400, "Huge", titleFont, GenHugeClick)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 0),
MakeBack(false, titleFont, SwitchPause), MakeBack(false, titleFont, SwitchPause),
}; };
} }
ButtonWidget Make(int y, string text, ClickHandler onClick) {
return ButtonWidget.Create(game, 400, text, titleFont, onClick)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, y);
}
void GenSmallClick(Game game, Widget widget) { DoGen(128); } void GenSmallClick(Game game, Widget widget) { DoGen(128); }
void GenMediumClick(Game game, Widget widget) { DoGen(256); } void GenMediumClick(Game game, Widget widget) { DoGen(256); }
void GenHugeClick(Game game, Widget widget) { DoGen(512); } void GenHugeClick(Game game, Widget widget) { DoGen(512); }

View File

@ -20,12 +20,10 @@ namespace ClassicalSharp.Gui.Screens {
protected ClickHandler leftPage, rightPage; protected ClickHandler leftPage, rightPage;
public override void Init() { public override void Init() {
titleFont = new Font(game.FontName, 16, FontStyle.Bold); base.Init();
regularFont = new Font(game.FontName, 16); if (keyNames == null) {
base.Init();
if (keyNames == null)
keyNames = Enum.GetNames(typeof(Key)); keyNames = Enum.GetNames(typeof(Key));
}
} }
protected void MakeWidgets(int y, int arrowsY) { protected void MakeWidgets(int y, int arrowsY) {

View File

@ -163,7 +163,7 @@ namespace ClassicalSharp.Gui.Screens {
widgets = new Widget[binds.Length + 5]; widgets = new Widget[binds.Length + 5];
MakeWidgets(-40, 10); MakeWidgets(-40, 10);
widgets[index++] = TextWidget.Create(game, "&eRight click to remove the key binding", regularFont) widgets[index++] = TextWidget.Create(game, "&eRight click to remove the key binding", textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 100); .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100);
} }
} }

View File

@ -35,8 +35,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
game.Keyboard.KeyRepeat = true; game.Keyboard.KeyRepeat = true;
} }
@ -143,7 +141,7 @@ namespace ClassicalSharp.Gui.Screens {
const int extHelpY = 100; const int extHelpY = 100;
void MakeExtendedHelp(string[] desc) { void MakeExtendedHelp(string[] desc) {
extendedHelp = new TextGroupWidget(game, desc.Length, regularFont, null) extendedHelp = new TextGroupWidget(game, desc.Length, textFont, null)
.SetLocation(Anchor.Min, Anchor.Min, 0, 0); .SetLocation(Anchor.Min, Anchor.Min, 0, 0);
extendedHelp.Init(); extendedHelp.Init();
for (int i = 0; i < desc.Length; i++) for (int i = 0; i < desc.Length; i++)
@ -185,7 +183,7 @@ namespace ClassicalSharp.Gui.Screens {
activeButton = button; activeButton = button;
InputClosed(); InputClosed();
input = MenuInputWidget.Create(game, 400, 30, button.GetValue(game), regularFont, validator) input = MenuInputWidget.Create(game, 400, 30, button.GetValue(game), textFont, validator)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 110); .SetLocation(Anchor.Centre, Anchor.Centre, 0, 110);
input.ShowCaret = true; input.ShowCaret = true;

View File

@ -11,7 +11,7 @@ namespace ClassicalSharp.Gui.Screens {
HandlesAllInput = true; HandlesAllInput = true;
} }
protected Widget[] widgets; protected Widget[] widgets;
protected Font titleFont, regularFont; protected Font titleFont, textFont;
protected int IndexOfWidget(Widget w) { protected int IndexOfWidget(Widget w) {
for (int i = 0; i < widgets.Length; i++) { for (int i = 0; i < widgets.Length; i++) {
@ -28,6 +28,9 @@ namespace ClassicalSharp.Gui.Screens {
} }
public override void Init() { public override void Init() {
if (titleFont == null) titleFont = new Font(game.FontName, 16, FontStyle.Bold);
if (textFont == null) textFont = new Font(game.FontName, 16);
game.Graphics.ContextLost += ContextLost; game.Graphics.ContextLost += ContextLost;
game.Graphics.ContextRecreated += ContextRecreated; game.Graphics.ContextRecreated += ContextRecreated;
} }
@ -35,7 +38,7 @@ namespace ClassicalSharp.Gui.Screens {
public override void Dispose() { public override void Dispose() {
ContextLost(); ContextLost();
if (titleFont != null) titleFont.Dispose(); if (titleFont != null) titleFont.Dispose();
if (regularFont != null) regularFont.Dispose(); if (textFont != null) textFont.Dispose();
game.Graphics.ContextLost -= ContextLost; game.Graphics.ContextLost -= ContextLost;
game.Graphics.ContextRecreated -= ContextRecreated; game.Graphics.ContextRecreated -= ContextRecreated;

View File

@ -40,7 +40,7 @@ namespace ClassicalSharp.Gui.Screens {
MakeOpt(1, -100, "Use CPE", onClick, GetCPE, SetCPE), MakeOpt(1, -100, "Use CPE", onClick, GetCPE, SetCPE),
MakeOpt(1, -50, "Use server textures", onClick, GetTexs, SetTexs), MakeOpt(1, -50, "Use server textures", onClick, GetTexs, SetTexs),
TextWidget.Create(game, "&eButtons on the right require restarting game", regularFont) TextWidget.Create(game, "&eButtons on the right require restarting game", textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 100), .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100),
MakeBack(false, titleFont, SwitchBack), MakeBack(false, titleFont, SwitchBack),
null, null, null, null,

View File

@ -15,8 +15,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
game.Events.HackPermissionsChanged += CheckHacksAllowed; game.Events.HackPermissionsChanged += CheckHacksAllowed;
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
ContextRecreated(); ContextRecreated();
} }
@ -51,7 +49,7 @@ namespace ClassicalSharp.Gui.Screens {
void MakeDesc() { void MakeDesc() {
string text = descriptions[selectedI]; string text = descriptions[selectedI];
widgets[widgets.Length - 1] = TextWidget.Create(game, text, regularFont) widgets[widgets.Length - 1] = TextWidget.Create(game, text, textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 100); .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100);
} }

View File

@ -12,7 +12,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
game.Events.HackPermissionsChanged += CheckHacksAllowed; game.Events.HackPermissionsChanged += CheckHacksAllowed;
ContextRecreated(); ContextRecreated();
} }

View File

@ -49,8 +49,6 @@ namespace ClassicalSharp.Gui.Screens {
public override void Init() { public override void Init() {
base.Init(); base.Init();
game.Keyboard.KeyRepeat = true; game.Keyboard.KeyRepeat = true;
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
ContextRecreated(); ContextRecreated();
} }
@ -60,7 +58,7 @@ namespace ClassicalSharp.Gui.Screens {
} }
protected override void ContextRecreated() { protected override void ContextRecreated() {
input = MenuInputWidget.Create(game, 500, 30, "", regularFont, new PathValidator()) input = MenuInputWidget.Create(game, 500, 30, "", textFont, new PathValidator())
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -30); .SetLocation(Anchor.Centre, Anchor.Centre, 0, -30);
input.ShowCaret = true; input.ShowCaret = true;
@ -69,7 +67,7 @@ namespace ClassicalSharp.Gui.Screens {
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 20), .SetLocation(Anchor.Centre, Anchor.Centre, 0, 20),
ButtonWidget.Create(game, 200, "Save schematic", titleFont, SaveSchematic) ButtonWidget.Create(game, 200, "Save schematic", titleFont, SaveSchematic)
.SetLocation(Anchor.Centre, Anchor.Centre, -150, 120), .SetLocation(Anchor.Centre, Anchor.Centre, -150, 120),
TextWidget.Create(game, "&eCan be imported into MCEdit", regularFont) TextWidget.Create(game, "&eCan be imported into MCEdit", textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 110, 120), .SetLocation(Anchor.Centre, Anchor.Centre, 110, 120),
MakeBack(false, titleFont, SwitchPause), MakeBack(false, titleFont, SwitchPause),
input, input,
@ -143,7 +141,7 @@ namespace ClassicalSharp.Gui.Screens {
void MakeDescWidget(string text) { void MakeDescWidget(string text) {
DisposeDescWidget(); DisposeDescWidget();
desc = TextWidget.Create(game, text, regularFont) desc = TextWidget.Create(game, text, textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 65); .SetLocation(Anchor.Centre, Anchor.Centre, 0, 65);
} }

View File

@ -16,10 +16,7 @@ namespace ClassicalSharp.Gui.Screens {
public Overlay(Game game) : base(game) { } public Overlay(Game game) : base(game) { }
public override void Init() { public override void Init() {
base.Init(); base.Init();
titleFont = new Font(game.FontName, 16, FontStyle.Bold);
regularFont = new Font(game.FontName, 16);
if (game.Graphics.LostContext) return; if (game.Graphics.LostContext) return;
MakeButtons(); MakeButtons();
RedrawText(); RedrawText();
@ -73,7 +70,7 @@ namespace ClassicalSharp.Gui.Screens {
for (int i = 1; i < 4; i++) { for (int i = 1; i < 4; i++) {
if (lines[i] == null) continue; if (lines[i] == null) continue;
labels[i] = TextWidget.Create(game, lines[i], regularFont) labels[i] = TextWidget.Create(game, lines[i], textFont)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -70 + 20 * i); .SetLocation(Anchor.Centre, Anchor.Centre, 0, -70 + 20 * i);
labels[i].Colour = new FastColour(224, 224, 224); labels[i].Colour = new FastColour(224, 224, 224);
} }

View File

@ -17,12 +17,11 @@ namespace ClassicalSharp.Gui.Screens {
int dynamicVb; int dynamicVb;
public override void Init() { public override void Init() {
textFont = new Font(game.FontName, 8);
base.Init(); base.Init();
if (vertices == null) { if (vertices == null) {
vertices = new VertexP3fT2fC4b[verticesCount]; vertices = new VertexP3fT2fC4b[verticesCount];
} }
regularFont.Dispose();
regularFont = new Font(game.FontName, 8);
ContextRecreated(); ContextRecreated();
} }
@ -55,7 +54,7 @@ namespace ClassicalSharp.Gui.Screens {
base.ContextRecreated(); base.ContextRecreated();
dynamicVb = game.Graphics.CreateDynamicVb(VertexFormat.P3fT2fC4b, verticesCount); dynamicVb = game.Graphics.CreateDynamicVb(VertexFormat.P3fT2fC4b, verticesCount);
idAtlas = new TextAtlas(game, 16); idAtlas = new TextAtlas(game, 16);
idAtlas.Pack("0123456789", regularFont, "f"); idAtlas.Pack("0123456789", textFont, "f");
UpdateTileSize(); UpdateTileSize();
} }

View File

@ -77,14 +77,14 @@ namespace ClassicalSharp.Renderers {
float x2 = x + 1, y2 = y + height, z2 = z + 1; float x2 = x + 1, y2 = y + height, z2 = z + 1;
v.X = x1; v.Y = y1; v.Z = z1; v.U = 0; v.V = v1; vertices[vCount++] = v; v.X = x1; v.Y = y1; v.Z = z1; v.U = 0; v.V = v1; vertices[vCount++] = v;
v.Y = y2; v.V = v2; vertices[vCount++] = v; v.Y = y2; v.V = v2; vertices[vCount++] = v;
v.X = x2; v.Z = z2; v.U = 1; vertices[vCount++] = v; v.X = x2; v.Z = z2; v.U = 1; vertices[vCount++] = v;
v.Y = y1; v.V = v1; vertices[vCount++] = v; v.Y = y1; v.V = v1; vertices[vCount++] = v;
v.Z = z1; vertices[vCount++] = v; v.Z = z1; vertices[vCount++] = v;
v.Y = y2; v.V = v2; vertices[vCount++] = v; v.Y = y2; v.V = v2; vertices[vCount++] = v;
v.X = x1; v.Z = z2; v.U = 0; vertices[vCount++] = v; v.X = x1; v.Z = z2; v.U = 0; vertices[vCount++] = v;
v.Y = y1; v.V = v1; vertices[vCount++] = v; v.Y = y1; v.V = v1; vertices[vCount++] = v;
} }
if (particles && (rainAcc >= 0.25 || moved)) { if (particles && (rainAcc >= 0.25 || moved)) {
rainAcc = 0; rainAcc = 0;

View File

@ -263,7 +263,7 @@ bool Hotkeys_IsHotkey(Key key, STRING_TRANSIENT String* text, bool* moreInput) {
UInt8 flags = 0; UInt8 flags = 0;
if (Key_IsControlPressed()) flags |= HOTKEYS_FLAG_CTRL; if (Key_IsControlPressed()) flags |= HOTKEYS_FLAG_CTRL;
if (Key_IsShiftPressed()) flags |= HOTKEYS_FLAG_SHIFT; if (Key_IsShiftPressed()) flags |= HOTKEYS_FLAG_SHIFT;
if (Key_IsAltPressed()) flags |= HOTKEYS_FLAT_ALT; if (Key_IsAltPressed()) flags |= HOTKEYS_FLAG_ALT;
String_Clear(text); String_Clear(text);
*moreInput = false; *moreInput = false;

View File

@ -129,7 +129,7 @@ HotkeyData HotkeysList[HOTKEYS_MAX_COUNT];
StringsBuffer HotkeysText; StringsBuffer HotkeysText;
#define HOTKEYS_FLAG_CTRL 1 #define HOTKEYS_FLAG_CTRL 1
#define HOTKEYS_FLAG_SHIFT 2 #define HOTKEYS_FLAG_SHIFT 2
#define HOTKEYS_FLAT_ALT 4 #define HOTKEYS_FLAG_ALT 4
void Hotkeys_Add(Key baseKey, UInt8 flags, STRING_PURE String* text, bool more); void Hotkeys_Add(Key baseKey, UInt8 flags, STRING_PURE String* text, bool more);
bool Hotkeys_Remove(Key baseKey, UInt8 flags); bool Hotkeys_Remove(Key baseKey, UInt8 flags);

View File

@ -39,7 +39,7 @@ typedef void (*Menu_ContextRecreated)(GuiElement* elem);
Screen_Layout \ Screen_Layout \
Widget** WidgetsPtr; \ Widget** WidgetsPtr; \
Int32 WidgetsCount; \ Int32 WidgetsCount; \
FontDesc TitleFont, RegularFont; \ FontDesc TitleFont, TextFont; \
Menu_ContextRecreated ContextRecreated; Menu_ContextRecreated ContextRecreated;
typedef struct MenuScreen_ { MenuScreen_Layout } MenuScreen; typedef struct MenuScreen_ { MenuScreen_Layout } MenuScreen;
@ -58,6 +58,23 @@ typedef struct OptionsGroupScreen_ {
Int32 SelectedI; Int32 SelectedI;
} OptionsGroupScreen; } OptionsGroupScreen;
typedef struct DeathScreen_ {
MenuScreen_Layout
Widget* Widgets[4];
TextWidget Title, Score;
ButtonWidget Gen, Load;
} DeathScreen;
typedef struct EditHotkeyScreen_ {
MenuScreen_Layout
HotkeyData CurHotkey, OrigHotkey;
Int32 SelectedI;
bool SupressNextPress;
MenuInputWidget Input;
ButtonWidget Buttons[6];
Widget* Widgets[7];
} EditHotkeyScreen;
void Menu_FreeWidgets(Widget** widgets, Int32 widgetsCount) { void Menu_FreeWidgets(Widget** widgets, Int32 widgetsCount) {
if (widgets == NULL) return; if (widgets == NULL) return;
@ -338,7 +355,7 @@ bool MenuScreen_HandlesMouseMove(GuiElement* elem, Int32 x, Int32 y) {
MenuScreen* screen = (MenuScreen*)elem; MenuScreen* screen = (MenuScreen*)elem;
return Menu_HandleMouseMove(screen->WidgetsPtr, screen->WidgetsCount, x, y) >= 0; return Menu_HandleMouseMove(screen->WidgetsPtr, screen->WidgetsCount, x, y) >= 0;
} }
bool MenuScreen_HandlesMouseMove(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { return true; } bool MenuScreen_HandlesMouseUp(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { return true; }
bool MenuScreen_HandlesMouseScroll(GuiElement* elem, Real32 delta) { return true; } bool MenuScreen_HandlesMouseScroll(GuiElement* elem, Real32 delta) { return true; }
bool MenuScreen_HandlesKeyDown(GuiElement* elem, Key key) { bool MenuScreen_HandlesKeyDown(GuiElement* elem, Key key) {
@ -360,6 +377,14 @@ void MenuScreen_ContextRecreated(void* obj) {
void MenuScreen_Init(GuiElement* elem) { void MenuScreen_Init(GuiElement* elem) {
MenuScreen* screen = (MenuScreen*)elem; MenuScreen* screen = (MenuScreen*)elem;
if (screen->TitleFont.Handle == NULL) {
Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD);
}
if (screen->TextFont.Handle == NULL) {
Platform_MakeFont(&screen->TextFont, &Game_FontName, 16, FONT_STYLE_NORMAL);
}
Event_RegisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost); Event_RegisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost);
Event_RegisterVoid(&GfxEvents_ContextRecreated, screen, MenuScreen_ContextRecreated); Event_RegisterVoid(&GfxEvents_ContextRecreated, screen, MenuScreen_ContextRecreated);
} }
@ -379,8 +404,8 @@ void MenuScreen_Free(GuiElement* elem) {
if (screen->TitleFont.Handle != NULL) { if (screen->TitleFont.Handle != NULL) {
Platform_FreeFont(&screen->TitleFont); Platform_FreeFont(&screen->TitleFont);
} }
if (screen->RegularFont.Handle != NULL) { if (screen->TextFont.Handle != NULL) {
Platform_FreeFont(&screen->RegularFont); Platform_FreeFont(&screen->TextFont);
} }
Event_UnregisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost); Event_UnregisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost);
@ -401,7 +426,7 @@ void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count,
screen->VTABLE->HandlesKeyUp = MenuScreen_HandlesKeyUp; screen->VTABLE->HandlesKeyUp = MenuScreen_HandlesKeyUp;
screen->VTABLE->HandlesKeyPress = MenuScreen_HandlesKeyPress; screen->VTABLE->HandlesKeyPress = MenuScreen_HandlesKeyPress;
screen->VTABLE->HandlesMouseDown = MenuScreen_HandlesMouseDown; screen->VTABLE->HandlesMouseDown = MenuScreen_HandlesMouseDown;
screen->VTABLE->HandlesMouseUp = MenuScreen_HandlesMouseMove; screen->VTABLE->HandlesMouseUp = MenuScreen_HandlesMouseUp;
screen->VTABLE->HandlesMouseMove = MenuScreen_HandlesMouseMove; screen->VTABLE->HandlesMouseMove = MenuScreen_HandlesMouseMove;
screen->VTABLE->HandlesMouseScroll = MenuScreen_HandlesMouseScroll; screen->VTABLE->HandlesMouseScroll = MenuScreen_HandlesMouseScroll;
@ -422,16 +447,20 @@ void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count,
*#########################################################################################################################*/ *#########################################################################################################################*/
GuiElementVTABLE PauseScreen_VTABLE; GuiElementVTABLE PauseScreen_VTABLE;
PauseScreen PauseScreen_Instance; PauseScreen PauseScreen_Instance;
void PauseScreen_Make(PauseScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { void PauseScreen_Make(PauseScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) {
String text = String_FromRaw(title, UInt16_MaxValue);
ButtonWidget* btn = &screen->Buttons[i]; ButtonWidget* btn = &screen->Buttons[i];
screen->Widgets[i] = (Widget*)btn;
String text = String_FromReadonly(title);
ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick); ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick);
Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y);
} }
void PauseScreen_MakeClassic(PauseScreen* screen, Int32 i, Int32 y, const UInt8* title, Widget_LeftClick onClick) { void PauseScreen_MakeClassic(PauseScreen* screen, Int32 i, Int32 y, const UInt8* title, Widget_LeftClick onClick) {
String text = String_FromRaw(title, UInt16_MaxValue);
ButtonWidget* btn = &screen->Buttons[i]; ButtonWidget* btn = &screen->Buttons[i];
screen->Widgets[i] = (Widget*)btn;
String text = String_FromReadonly(title);
ButtonWidget_Create(btn, &text, 400, &screen->TitleFont, onClick); ButtonWidget_Create(btn, &text, 400, &screen->TitleFont, onClick);
Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y);
} }
@ -445,7 +474,7 @@ void PauseScreen_Hotkeys(GuiElement* a, GuiElement* b) { Gui_SetNewScre
void PauseScreen_NostalgiaOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NostalgiaScreen_MakeInstance()); } void PauseScreen_NostalgiaOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NostalgiaScreen_MakeInstance()); }
void PauseScreen_Game(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NULL); } void PauseScreen_Game(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NULL); }
void PauseScreen_ClassicOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicOptionsScreen_MakeInstance()); } void PauseScreen_ClassicOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicOptionsScreen_MakeInstance()); }
void PauseScreen_QuitGame(GuiElement* a, GuiElement* b) { Window_Close(); } void PauseScreen_Quit(GuiElement* a, GuiElement* b) { Window_Close(); }
void PauseScreen_CheckHacksAllowed(void* obj) { void PauseScreen_CheckHacksAllowed(void* obj) {
if (Game_UseClassicOptions) return; if (Game_UseClassicOptions) return;
@ -455,10 +484,6 @@ void PauseScreen_CheckHacksAllowed(void* obj) {
void PauseScreen_ContextRecreated(void* obj) { void PauseScreen_ContextRecreated(void* obj) {
PauseScreen* screen = (PauseScreen*)obj; PauseScreen* screen = (PauseScreen*)obj;
Int32 i;
for (i = 0; i < Array_Elems(screen->Buttons); i++) {
screen->Widgets[i] = &screen->Buttons[i];
}
FontDesc* font = &screen->TitleFont; FontDesc* font = &screen->TitleFont;
if (Game_UseClassicOptions) { if (Game_UseClassicOptions) {
@ -469,7 +494,8 @@ void PauseScreen_ContextRecreated(void* obj) {
PauseScreen_MakeClassic(screen, 4, 150, "Nostalgia options...", PauseScreen_NostalgiaOptions); PauseScreen_MakeClassic(screen, 4, 150, "Nostalgia options...", PauseScreen_NostalgiaOptions);
String back = String_FromConst("Back to game"); String back = String_FromConst("Back to game");
Menu_MakeBack(&screen->Buttons[5], 400, &back, 25, font, PauseScreen_QuitGame); screen->Widgets[5] = (Widget*)(&screen->Buttons[5]);
Menu_MakeBack(&screen->Buttons[5], 400, &back, 25, font, PauseScreen_Game);
/* Disable nostalgia options in classic mode*/ /* Disable nostalgia options in classic mode*/
if (Game_ClassicMode) { screen->Widgets[4] = NULL; } if (Game_ClassicMode) { screen->Widgets[4] = NULL; }
@ -484,9 +510,12 @@ void PauseScreen_ContextRecreated(void* obj) {
PauseScreen_Make(screen, 5, -1, 50, "Hotkeys...", PauseScreen_Hotkeys); PauseScreen_Make(screen, 5, -1, 50, "Hotkeys...", PauseScreen_Hotkeys);
String quitMsg = String_FromConst("Quit game"); String quitMsg = String_FromConst("Quit game");
ButtonWidget_Create(&screen->Buttons[6], &quitMsg, 120, font, PauseScreen_QuitGame); screen->Widgets[6] = (Widget*)(&screen->Buttons[6]);
Widget_SetLocation((Widget*)(&screen->Buttons[6]), ANCHOR_MAX, ANCHOR_MAX, 5, 5); ButtonWidget_Create(&screen->Buttons[6], &quitMsg, 120, font, PauseScreen_Quit);
Menu_MakeDefaultBack(&screen->Buttons[7], true, font, PauseScreen_QuitGame); Widget_SetLocation(screen->Widgets[6], ANCHOR_MAX, ANCHOR_MAX, 5, 5);
screen->Widgets[7] = (Widget*)(&screen->Buttons[7]);
Menu_MakeDefaultBack(&screen->Buttons[7], true, font, PauseScreen_Game);
} }
if (!ServerConnection_IsSinglePlayer) { if (!ServerConnection_IsSinglePlayer) {
@ -499,7 +528,6 @@ void PauseScreen_ContextRecreated(void* obj) {
void PauseScreen_Init(GuiElement* elem) { void PauseScreen_Init(GuiElement* elem) {
PauseScreen* screen = (PauseScreen*)elem; PauseScreen* screen = (PauseScreen*)elem;
MenuScreen_Init(elem); MenuScreen_Init(elem);
Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD);
Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, PauseScreen_CheckHacksAllowed); Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, PauseScreen_CheckHacksAllowed);
screen->ContextRecreated(elem); screen->ContextRecreated(elem);
} }
@ -518,7 +546,7 @@ Screen* PauseScreen_MakeInstance(void) {
screen->VTABLE->Init = PauseScreen_Init; screen->VTABLE->Init = PauseScreen_Init;
screen->VTABLE->Free = PauseScreen_Free; screen->VTABLE->Free = PauseScreen_Free;
return screen; return (Screen*)screen;
} }
@ -542,17 +570,19 @@ void OptionsGroupScreen_CheckHacksAllowed(void* obj) {
screen->Buttons[5].Disabled = !LocalPlayer_Instance.Hacks.CanAnyHacks; /* env settings */ screen->Buttons[5].Disabled = !LocalPlayer_Instance.Hacks.CanAnyHacks; /* env settings */
} }
void OptionsGroupScreen_Make(OptionsGroupScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { void OptionsGroupScreen_Make(OptionsGroupScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) {
String text = String_FromRaw(title, UInt16_MaxValue);
ButtonWidget* btn = &screen->Buttons[i]; ButtonWidget* btn = &screen->Buttons[i];
screen->Widgets[i] = (Widget*)btn;
String text = String_FromReadonly(title);
ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick); ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick);
Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y);
} }
void OptionsGroupScreen_MakeDesc(OptionsGroupScreen* screen) { void OptionsGroupScreen_MakeDesc(OptionsGroupScreen* screen) {
String text = String_FromRaw(optsGroup_descs[screen->SelectedI], UInt16_MaxValue); screen->Widgets[8] = (Widget*)(&screen->Desc);
screen->Widgets[8] = &screen->Desc; String text = String_FromReadonly(optsGroup_descs[screen->SelectedI]);
TextWidget_Create(&screen->Desc, &text, &screen->RegularFont); TextWidget_Create(&screen->Desc, &text, &screen->TextFont);
Widget_SetLocation((Widget*)(&screen->Desc), ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); Widget_SetLocation((Widget*)(&screen->Desc), ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100);
} }
@ -566,11 +596,6 @@ void OptionsGroupScreen_Nostalgia(GuiElement* a, GuiElement* b) { Gui_SetNewScre
void OptionsGroupScreen_ContextRecreated(void* obj) { void OptionsGroupScreen_ContextRecreated(void* obj) {
OptionsGroupScreen* screen = (OptionsGroupScreen*)obj; OptionsGroupScreen* screen = (OptionsGroupScreen*)obj;
Int32 i;
for (i = 0; i < Array_Elems(screen->Buttons); i++) {
screen->Widgets[i] = &screen->Buttons[i];
}
screen->Widgets[8] = NULL; /* Description text widget placeholder */
OptionsGroupScreen_Make(screen, 0, -1, -100, "Misc options...", OptionsGroupScreen_Misc); OptionsGroupScreen_Make(screen, 0, -1, -100, "Misc options...", OptionsGroupScreen_Misc);
OptionsGroupScreen_Make(screen, 1, -1, -50, "Gui options...", OptionsGroupScreen_Gui); OptionsGroupScreen_Make(screen, 1, -1, -50, "Gui options...", OptionsGroupScreen_Gui);
@ -579,7 +604,10 @@ void OptionsGroupScreen_ContextRecreated(void* obj) {
OptionsGroupScreen_Make(screen, 4, 1, -50, "Hacks settings...", OptionsGroupScreen_Hacks); OptionsGroupScreen_Make(screen, 4, 1, -50, "Hacks settings...", OptionsGroupScreen_Hacks);
OptionsGroupScreen_Make(screen, 5, 1, 0, "Env settings...", OptionsGroupScreen_Env); OptionsGroupScreen_Make(screen, 5, 1, 0, "Env settings...", OptionsGroupScreen_Env);
OptionsGroupScreen_Make(screen, 6, 1, 50, "Nostalgia options...", OptionsGroupScreen_Nostalgia); OptionsGroupScreen_Make(screen, 6, 1, 50, "Nostalgia options...", OptionsGroupScreen_Nostalgia);
Menu_MakeDefaultBack(&screen->Buttons[7], false, &screen->TitleFont, Menu_SwitchPause);
screen->Widgets[7] = (Widget*)(&screen->Buttons[7]);
Menu_MakeDefaultBack(&screen->Buttons[7], false, &screen->TitleFont, Menu_SwitchPause);
screen->Widgets[8] = NULL; /* Description text widget placeholder */
if (screen->SelectedI >= 0) { OptionsGroupScreen_MakeDesc(screen); } if (screen->SelectedI >= 0) { OptionsGroupScreen_MakeDesc(screen); }
OptionsGroupScreen_CheckHacksAllowed(obj); OptionsGroupScreen_CheckHacksAllowed(obj);
@ -588,8 +616,6 @@ void OptionsGroupScreen_ContextRecreated(void* obj) {
void OptionsGroupScreen_Init(GuiElement* elem) { void OptionsGroupScreen_Init(GuiElement* elem) {
OptionsGroupScreen* screen = (OptionsGroupScreen*)elem; OptionsGroupScreen* screen = (OptionsGroupScreen*)elem;
MenuScreen_Init(elem); MenuScreen_Init(elem);
Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD);
Platform_MakeFont(&screen->RegularFont, &Game_FontName, 16, FONT_STYLE_NORMAL);
Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, OptionsGroupScreen_CheckHacksAllowed); Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, OptionsGroupScreen_CheckHacksAllowed);
screen->ContextRecreated(elem); screen->ContextRecreated(elem);
} }
@ -623,36 +649,271 @@ Screen* OptionsGroupScreen_MakeInstance(void) {
screen->VTABLE->HandlesMouseMove = OptionsGroupScreen_HandlesMouseMove; screen->VTABLE->HandlesMouseMove = OptionsGroupScreen_HandlesMouseMove;
screen->SelectedI = -1; screen->SelectedI = -1;
return screen; return (Screen*)screen;
} }
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------DeathScreen--------------------------------------------------------* *------------------------------------------------------DeathScreen--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
GuiElementVTABLE DeathScreen_VTABLE;
void DeathScreen_Gen(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(GenLevelScreen_MakeInstance()); } DeathScreen DeathScreen_Instance;
void DeathScreen_Gen(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(GenLevelScreen_MakeInstance()); }
void DeathScreen_Load(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(LoadLevelScreen_MakeInstance()); } void DeathScreen_Load(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(LoadLevelScreen_MakeInstance()); }
void DeathScreen_Init(GuiElement* elem) { void DeathScreen_Init(GuiElement* elem) {
base.Init(); DeathScreen* screen = (DeathScreen*)elem;
titleFont = new Font(game.FontName, 16, FontStyle.Bold); Platform_MakeFont(&screen->TextFont, &Game_FontName, 40, FONT_STYLE_NORMAL);
regularFont = new Font(game.FontName, 40); MenuScreen_Init(elem);
ContextRecreated(); screen->ContextRecreated(elem);
} }
public override bool HandlesKeyDown(Key key) { return true; } bool DeathScreen_HandlesKeyDown(GuiElement* elem, Key key) { return true; }
void DeathScreen_ContextRecreated(void* obj) { void DeathScreen_ContextRecreated(void* obj) {
string score = game.Chat.Status1.Text; DeathScreen* screen = (DeathScreen*)obj;
widgets = new Widget[]{
TextWidget.Create(game, "Game over!", regularFont) String title = String_FromConst("Game over!");
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -150), screen->Widgets[0] = (Widget*)(&screen->Title);
TextWidget.Create(game, score, titleFont) TextWidget_Create(&screen->Title, &title, &screen->TextFont);
.SetLocation(Anchor.Centre, Anchor.Centre, 0, -75), Widget_SetLocation(screen->Widgets[0], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -150);
ButtonWidget.Create(game, 400, "Generate new level...", titleFont, GenLevelClick)
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 25), String score = String_FromRawArray(Chat_Status[1].Buffer);
ButtonWidget.Create(game, 400, "Load level...", titleFont, LoadLevelClick) screen->Widgets[1] = (Widget*)(&screen->Score);
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 75), TextWidget_Create(&screen->Score, &score, &screen->TitleFont);
}; Widget_SetLocation(screen->Widgets[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -75);
String gen = String_FromConst("Generate new level...")
screen->Widgets[2] = (Widget*)(&screen->Gen);
ButtonWidget_Create(&screen->Gen, &gen, 400, &screen->TitleFont, DeathScreen_Gen);
Widget_SetLocation(screen->Widgets[2], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 25);
String load = String_FromConst("Load level...");
screen->Widgets[3] = (Widget*)(&screen->Load);
ButtonWidget_Create(&screen->Load, &load, 400, &screen->TitleFont, DeathScreen_Load);
Widget_SetLocation(screen->Widgets[3], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 75);
}
Screen* DeathScreen_MakeInstance(void) {
DeathScreen* screen = &DeathScreen_Instance;
MenuScreen_MakeInstance((MenuScreen*)screen, screen->Widgets, Array_Elems(screen->Widgets), DeathScreen_ContextRecreated);
DeathScreen_VTABLE = *screen->VTABLE;
screen->VTABLE = &DeathScreen_VTABLE;
screen->VTABLE->Init = DeathScreen_Init;
screen->VTABLE->HandlesKeyDown = DeathScreen_HandlesKeyDown;
return (Screen*)screen;
}
/*########################################################################################################################*
*----------------------------------------------------EditHotkeyScreen-----------------------------------------------------*
*#########################################################################################################################*/
GuiElementVTABLE EditHotkeyScreen_VTABLE;
EditHotkeyScreen EditHotkeyScreen_Instance;
void EditHotkeyScreen_Make(EditHotkeyScreen* screen, Int32 i, Int32 x, Int32 y, STRING_PURE String* text, Widget_LeftClick onClick) {
ButtonWidget* btn = &screen->Buttons[i];
screen->Widgets[i] = (Widget*)btn;
ButtonWidget_Create(btn, text, 300, &screen->TitleFont, onClick);
Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y);
}
void EditHotkeyScreen_MakeFlags(UInt8 flags, STRING_TRANSIENT String* str) {
if (flags == 0) String_AppendConst(str, " None");
if (flags & HOTKEYS_FLAG_CTRL) String_AppendConst(str, " Ctrl");
if (flags & HOTKEYS_FLAG_SHIFT) String_AppendConst(str, " Shift");
if (flags & HOTKEYS_FLAG_ALT) String_AppendConst(str, " Alt");
}
void EditHotkeyScreen_MakeBaseKey(EditHotkeyScreen* screen, Widget_LeftClick onClick) {
UInt8 textBuffer[String_BufferSize(STRING_SIZE)];
String text = String_InitAndClearArray(textBuffer);
String_AppendConst(&text, "Key: ");
String_AppendConst(&text, Key_Names[screen->CurHotkey.BaseKey]);
EditHotkeyScreen_Make(screen, 0, 0, -150, &text, onClick);
}
void EditHotkeyScreen_MakeModifiers(EditHotkeyScreen* screen, Widget_LeftClick onClick) {
UInt8 textBuffer[String_BufferSize(STRING_SIZE)];
String text = String_InitAndClearArray(textBuffer);
String_AppendConst(&text, "Modifiers:");
EditHotkeyScreen_MakeFlags(screen->CurHotkey.Flags, &text);
EditHotkeyScreen_Make(screen, 1, 0, -100, &text, onClick);
}
void EditHotkeyScreen_MakeLeaveOpen(EditHotkeyScreen* screen, Widget_LeftClick onClick) {
UInt8 textBuffer[String_BufferSize(STRING_SIZE)];
String text = String_InitAndClearArray(textBuffer);
String_AppendConst(&text, "Input stays open: ");
String_AppendConst(&text, screen->CurHotkey.StaysOpen ? "ON" : "OFF");
EditHotkeyScreen_Make(screen, 2, -100, 10, &text, onClick);
}
void EditHotkeyScreen_LeaveOpen(GuiElement* elem, GuiElement* widget) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
/* Reset 'waiting for key..' state of two other buttons */
if (screen->SelectedI == 0) {
EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey);
screen->SupressNextPress = false;
} else if (screen->SelectedI == 1) {
EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers);
screen->SupressNextPress = false;
}
screen->SelectedI = -1;
screen->CurHotkey.StaysOpen = !screen->CurHotkey.StaysOpen;
EditHotkeyScreen_MakeLeaveOpen(screen, EditHotkeyScreen_LeaveOpen);
}
void EditHotkeyScreen_SaveChanges(GuiElement* elem, GuiElement* widget) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
HotkeyData hotkey = screen->OrigHotkey;
if (hotkey.BaseKey != Key_Unknown) {
Hotkeys_Remove(hotkey.BaseKey, hotkey.Flags);
Hotkeys_UserRemovedHotkey(hotkey.BaseKey, hotkey.Flags);
}
hotkey = screen->CurHotkey;
if (hotkey.BaseKey != Key_Unknown) {
String text = screen->Input.Base.Text;
Hotkeys_Add(hotkey.BaseKey, hotkey.Flags, &text, hotkey.StaysOpen);
Hotkeys_UserAddedHotkey(hotkey.BaseKey, hotkey.Flags, hotkey.StaysOpen, &text);
}
Gui_SetNewScreen(HotkeyListScreen_MakeInstance());
}
void EditHotkeyScreen_RemoveHotkey(GuiElement* elem, GuiElement* widget) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
HotkeyData hotkey = screen->OrigHotkey;
if (hotkey.BaseKey != Key_Unknown) {
Hotkeys_Remove(hotkey.BaseKey, hotkey.Flags);
Hotkeys_UserRemovedHotkey(hotkey.BaseKey, hotkey.Flags);
}
Gui_SetNewScreen(HotkeyListScreen_MakeInstance());
}
void EditHotkeyScreen_BaseKey(GuiElement* elem, GuiElement* widget) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
screen->SelectedI = 0;
screen->SupressNextPress = true;
String msg = String_FromConst("Key: press a key..");
ButtonWidget_SetText(&screen->Buttons[0], &msg);
}
void EditHotkeyScreen_Modifiers(GuiElement* elem, GuiElement* widget) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
screen->SelectedI = 1;
screen->SupressNextPress = true;
String msg = String_FromConst("Modifiers: press a key..");
ButtonWidget_SetText(&screen->Buttons[1], &msg);
}
void EditHotkeyScreen_Init(GuiElement* elem) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)screen;
MenuScreen_Init(elem);
Key_KeyRepeat = true;
screen->ContextRecreated(elem);
}
void EditHotkeyScreen_Render(GuiElement* elem, Real64 delta) {
MenuScreen_Render(elem, delta);
Int32 cX = Game_Width / 2, cY = Game_Height / 2;
PackedCol grey = PACKEDCOL_CONST(150, 150, 150, 255);
GfxCommon_Draw2DFlat(cX - 250, cY - 65, 500, 2, grey);
GfxCommon_Draw2DFlat(cX - 250, cY + 45, 500, 2, grey);
}
void EditHotkeyScreen_Free(GuiElement* elem) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)elem;
Key_KeyRepeat = false;
screen->SelectedI = -1;
MenuScreen_Free(elem);
}
bool EditHotkeyScreen_HandlesKeyPress(GuiElement* elem, UInt8 key) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)screen;
if (screen->SupressNextPress) {
screen->SupressNextPress = false;
return true;
}
return Elem_HandlesKeyPress(&screen->Input.Base, key);
}
bool EditHotkeyScreen_HandlesKeyDown(GuiElement* elem, Key key) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)screen;
if (screen->SelectedI >= 0) {
if (screen->SelectedI == 0) {
screen->CurHotkey.BaseKey = key;
EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey);
} else if (screen->SelectedI == 1) {
if (key == Key_ControlLeft || key == Key_ControlRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_CTRL;
else if (key == Key_ShiftLeft || key == Key_ShiftRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_SHIFT;
else if (key == Key_AltLeft || key == Key_AltRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_ALT;
else screen->CurHotkey.Flags = 0;
EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers);
}
screen->SupressNextPress = true;
screen->SelectedI = -1;
return true;
}
return Elem_HandlesKeyDown(&screen->Input.Base, key) || MenuScreen_HandlesKeyDown(elem, key);
}
bool EditHotkeyScreen_HandlesKeyUp(GuiElement* elem, Key key) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)screen;
return Elem_HandlesKeyUp(&screen->Input.Base, key);
}
void EditHotkeyScreen_ContextRecreated(void* obj) {
EditHotkeyScreen* screen = (EditHotkeyScreen*)obj;
MenuInputValidator validator = MenuInputValidator_String();
String text = String_MakeNull();
bool existed = screen->OrigHotkey.BaseKey != Key_Unknown;
if (existed) {
text = StringsBuffer_UNSAFE_Get(&HotkeysText, screen->OrigHotkey.TextIndex);
}
EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey);
EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers);
EditHotkeyScreen_MakeLeaveOpen(screen, EditHotkeyScreen_LeaveOpen);
String addText = String_FromReadonly(existed ? "Save changes" : "Add hotkey");
EditHotkeyScreen_Make(screen, 3, 0, 80, &addText, EditHotkeyScreen_SaveChanges);
String remText = String_FromReadonly(existed ? "Remove hotkey" : "Cancel");
EditHotkeyScreen_Make(screen, 4, 0, 130, &remText, EditHotkeyScreen_RemoveHotkey);
screen->Widgets[5] = (Widget*)(&screen->Buttons[5]);
Menu_MakeDefaultBack(&screen->Buttons[5], false, &screen->TitleFont, Menu_SwitchPause);
screen->Widgets[6] = (Widget*)(&screen->Input);
MenuInputWidget_Create(&screen->Input, 500, 30, &text, &screen->TextFont, &validator);
Widget_SetLocation(screen->Widgets[6], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35);
screen->Input.Base.ShowCaret = true;
}
Screen* EditHotkeyScreen_MakeInstance(HotkeyData original) {
EditHotkeyScreen* screen = &EditHotkeyScreen_Instance;
MenuScreen_MakeInstance((MenuScreen*)screen, screen->Widgets, Array_Elems(screen->Widgets), DeathScreen_ContextRecreated);
EditHotkeyScreen_VTABLE = *screen->VTABLE;
screen->VTABLE = &EditHotkeyScreen_VTABLE;
screen->VTABLE->Init = EditHotkeyScreen_Init;
screen->VTABLE->Render = EditHotkeyScreen_Render;
screen->VTABLE->Free = EditHotkeyScreen_Free;
screen->VTABLE->HandlesKeyPress = EditHotkeyScreen_HandlesKeyPress;
screen->VTABLE->HandlesKeyDown = EditHotkeyScreen_HandlesKeyDown;
screen->VTABLE->HandlesKeyUp = EditHotkeyScreen_HandlesKeyUp;
screen->SelectedI = -1;
screen->OrigHotkey = original;
screen->CurHotkey = original;
return (Screen*)screen;
} }

View File

@ -506,8 +506,7 @@ bool Gfx_WarnIfNecessary(void) {
Chat_AddRaw(tmp3, "&cIt is likely you need to install video card drivers."); Chat_AddRaw(tmp3, "&cIt is likely you need to install video card drivers.");
} }
UInt8* rendererRaw = glGetString(GL_RENDERER); String renderer = String_FromReadonly(glGetString(GL_RENDERER));
String renderer = String_FromRaw(rendererRaw, UInt16_MaxValue);
String intel = String_FromConst("Intel"); String intel = String_FromConst("Intel");
if (!String_ContainsString(&renderer, &intel)) return false; if (!String_ContainsString(&renderer, &intel)) return false;