mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-19 12:35:52 -04:00
Port PauseScreen to C, fix clicking on input in SaveLevelScreen not moving caret to cursor
This commit is contained in:
parent
13877fff15
commit
24845e2ca4
@ -10,17 +10,8 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
public OptionsGroupScreen(Game game) : base(game) {
|
||||
}
|
||||
|
||||
TextWidget descWidget;
|
||||
int selectedI = -1;
|
||||
|
||||
public override void Render(double delta) {
|
||||
RenderMenuBounds();
|
||||
game.Graphics.Texturing = true;
|
||||
RenderWidgets(widgets, delta);
|
||||
if (descWidget != null) descWidget.Render(delta);
|
||||
game.Graphics.Texturing = false;
|
||||
}
|
||||
|
||||
public override void Init() {
|
||||
base.Init();
|
||||
game.Events.HackPermissionsChanged += CheckHacksAllowed;
|
||||
@ -37,8 +28,9 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
Make(-1, 50, "Controls...", SwitchControls),
|
||||
Make( 1, -50, "Hacks settings...", SwitchHacksOptions),
|
||||
Make( 1, 0, "Env settings...", SwitchEnvOptions),
|
||||
Make( 1, 50, "Nostalgia options...", SwitchNostalgiaOptions),
|
||||
Make( 1, 50, "Nostalgia options...", SwitchNostalgiaOptions),
|
||||
MakeBack(false, titleFont, SwitchPause),
|
||||
null, // description text widget placeholder
|
||||
};
|
||||
|
||||
if (selectedI >= 0) {
|
||||
@ -56,20 +48,18 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
static void SwitchNostalgiaOptions(Game g, Widget w) { g.Gui.SetNewScreen(new NostalgiaScreen(g)); }
|
||||
|
||||
void CheckHacksAllowed(object sender, EventArgs e) {
|
||||
if (game.UseClassicOptions) return;
|
||||
widgets[5].Disabled = !game.LocalPlayer.Hacks.CanAnyHacks; // env settings
|
||||
}
|
||||
|
||||
void MakeDescWidget(string text) {
|
||||
descWidget = TextWidget.Create(game, text, regularFont)
|
||||
widgets[widgets.Length - 1] = TextWidget.Create(game, text, regularFont)
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, 0, 100);
|
||||
}
|
||||
|
||||
ButtonWidget Make(int dir, int y, string text, ClickHandler onClick) {
|
||||
return ButtonWidget.Create(game, 300, text, titleFont, onClick)
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, dir * 160, y);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override bool HandlesKeyDown(Key key) {
|
||||
if (key == Key.Escape) {
|
||||
@ -84,21 +74,12 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
if (i >= descriptions.Length) return true;
|
||||
|
||||
selectedI = i;
|
||||
if (descWidget != null) descWidget.Dispose();
|
||||
Widget desc = widgets[widgets.Length - 1];
|
||||
if (desc != null) desc.Dispose();
|
||||
MakeDescWidget(descriptions[i]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void OnResize(int width, int height) {
|
||||
if (descWidget != null) descWidget.Reposition();
|
||||
base.OnResize(width, height);
|
||||
}
|
||||
|
||||
protected override void ContextLost() {
|
||||
base.ContextLost();
|
||||
if (descWidget != null) descWidget.Dispose();
|
||||
}
|
||||
|
||||
public override void Dispose() {
|
||||
base.Dispose();
|
||||
game.Events.HackPermissionsChanged -= CheckHacksAllowed;
|
||||
|
@ -53,13 +53,12 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
|
||||
void MakeClassic() {
|
||||
widgets = new Widget[] {
|
||||
MakeClassic(0, -100, "Options...", SwitchClassicOptions),
|
||||
MakeClassic(0, -50, "Generate new level...", SwitchClassicGenLevel),
|
||||
MakeClassic(0, 0, "Load level...", SwitchLoadLevel),
|
||||
MakeClassic(0, 50, "Save level...", SwitchSaveLevel),
|
||||
MakeClassic(-100, "Options...", SwitchClassicOptions),
|
||||
MakeClassic( -50, "Generate new level...", SwitchClassicGenLevel),
|
||||
MakeClassic( 0, "Load level...", SwitchLoadLevel),
|
||||
MakeClassic( 50, "Save level...", SwitchSaveLevel),
|
||||
|
||||
game.ClassicMode ? null :
|
||||
MakeClassic(0, 150, "Nostalgia options...", SwitchNostalgiaOptions),
|
||||
game.ClassicMode ? null : MakeClassic(150, "Nostalgia options...", SwitchNostalgiaOptions),
|
||||
MakeBack(400, "Back to game", 25, titleFont, SwitchGame),
|
||||
};
|
||||
}
|
||||
@ -85,9 +84,9 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, dir * 160, y);
|
||||
}
|
||||
|
||||
ButtonWidget MakeClassic(int x, int y, string text, ClickHandler onClick) {
|
||||
ButtonWidget MakeClassic(int y, string text, ClickHandler onClick) {
|
||||
return ButtonWidget.Create(game, 400, text, titleFont, onClick)
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, x, y);
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, 0, y);
|
||||
}
|
||||
|
||||
public override bool HandlesKeyDown(Key key) {
|
||||
|
@ -21,7 +21,6 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
RenderMenuBounds();
|
||||
game.Graphics.Texturing = true;
|
||||
RenderWidgets(widgets, delta);
|
||||
input.Render(delta);
|
||||
if (desc != null) desc.Render(delta);
|
||||
game.Graphics.Texturing = false;
|
||||
|
||||
@ -75,18 +74,13 @@ namespace ClassicalSharp.Gui.Screens {
|
||||
ButtonWidget.Create(game, 200, "Save schematic", titleFont, SaveSchematic)
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, -150, 120),
|
||||
TextWidget.Create(game, "&eCan be imported into MCEdit", regularFont)
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, 110, 120),
|
||||
null,
|
||||
.SetLocation(Anchor.Centre, Anchor.Centre, 110, 120),
|
||||
MakeBack(false, titleFont, SwitchPause),
|
||||
input,
|
||||
null, // description widget placeholder
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public override void OnResize(int width, int height) {
|
||||
input.Reposition();
|
||||
base.OnResize(width, height);
|
||||
}
|
||||
|
||||
public override void Dispose() {
|
||||
game.Keyboard.KeyRepeat = false;
|
||||
base.Dispose();
|
||||
|
@ -47,6 +47,13 @@ typedef struct Builder1DPart_ {
|
||||
The first ATLAS1D_MAX_ATLASES_COUNT parts are for normal parts, remainder are for translucent parts. */
|
||||
Builder1DPart Builder_Parts[ATLAS1D_MAX_ATLASES_COUNT * 2];
|
||||
|
||||
Int32 Builder1DPart_VerticesCount(Builder1DPart* part) {
|
||||
Int32 count = part->sCount;
|
||||
Int32 i;
|
||||
for (i = 0; i < FACE_COUNT; i++) { count += part->fCount[i]; }
|
||||
return count;
|
||||
}
|
||||
|
||||
void Builder1DPart_Prepare(Builder1DPart* part) {
|
||||
part->sOffset = 0;
|
||||
part->sAdvance = (part->sCount / 4);
|
||||
@ -81,13 +88,6 @@ void Builder1DPart_Reset(Builder1DPart* part) {
|
||||
}
|
||||
}
|
||||
|
||||
Int32 Builder1DPart_VerticesCount(Builder1DPart* part) {
|
||||
Int32 count = part->sCount;
|
||||
Int32 i;
|
||||
for (i = 0; i < FACE_COUNT; i++) { count += part->fCount[i]; }
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
void Builder_AddSpriteVertices(BlockID block) {
|
||||
Int32 i = Atlas1D_Index(Block_GetTexLoc(block, FACE_XMIN));
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "ExtMath.h"
|
||||
#include "Event.h"
|
||||
#include "Entity.h"
|
||||
#include "IModel.h"
|
||||
|
||||
BlockID held_block;
|
||||
Entity held_entity;
|
||||
|
@ -97,7 +97,7 @@ void Menu_SwitchPause(GuiElement* screenElem, GuiElement* widget) {
|
||||
|
||||
void Menu_RenderBounds(void) {
|
||||
/* These were sourced by taking a screenshot of vanilla
|
||||
Then using paint to extract the colour components
|
||||
Then using paInt32 to extract the colour components
|
||||
Then using wolfram alpha to solve the glblendfunc equation */
|
||||
PackedCol topCol = PACKEDCOL_CONST(24, 24, 24, 105);
|
||||
PackedCol bottomCol = PACKEDCOL_CONST(51, 51, 98, 162);
|
||||
@ -142,7 +142,7 @@ Int32 Menu_HandleMouseMove(Widget** widgets, Int32 count, Int32 x, Int32 y) {
|
||||
|
||||
GuiElementVTABLE ListScreen_VTABLE;
|
||||
ListScreen ListScreen_Instance;
|
||||
String ListScreen_Get(ListScreen* screen, UInt32 index) {
|
||||
STRING_REF String ListScreen_UNSAFE_Get(ListScreen* screen, UInt32 index) {
|
||||
if (index < screen->Entries.Count) {
|
||||
return StringsBuffer_UNSAFE_Get(&screen->Entries, index);
|
||||
} else {
|
||||
@ -172,9 +172,9 @@ void ListScreen_SetCurrentIndex(ListScreen* screen, Int32 index) {
|
||||
if (index >= screen->Entries.Count) index -= FILES_SCREEN_ITEMS;
|
||||
if (index < 0) index = 0;
|
||||
|
||||
UInt32 i;
|
||||
Int32 i;
|
||||
for (i = 0; i < FILES_SCREEN_ITEMS; i++) {
|
||||
String str = ListScreen_Get(screen, index + i);
|
||||
String str = ListScreen_UNSAFE_Get(screen, index + i);
|
||||
ButtonWidget_SetText(&screen->Buttons[i], &str);
|
||||
}
|
||||
|
||||
@ -209,7 +209,7 @@ void ListScreen_ContextRecreated(void* obj) {
|
||||
|
||||
UInt32 i;
|
||||
for (i = 0; i < FILES_SCREEN_ITEMS; i++) {
|
||||
String str = ListScreen_Get(screen, i);
|
||||
String str = ListScreen_UNSAFE_Get(screen, i);
|
||||
ListScreen_MakeText(screen, i, 0, 50 * (Int32)i - 100, &str);
|
||||
}
|
||||
|
||||
@ -368,7 +368,6 @@ void MenuScreen_OnResize(GuiElement* elem) {
|
||||
}
|
||||
|
||||
void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count, Menu_ContextRecreated contextRecreated) {
|
||||
ListScreen* screen = &ListScreen_Instance;
|
||||
Platform_MemSet(screen, 0, sizeof(MenuScreen));
|
||||
screen->VTABLE = &MenuScreen_VTABLE;
|
||||
Screen_Reset((Screen*)screen);
|
||||
@ -390,4 +389,118 @@ void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count,
|
||||
screen->WidgetsPtr = widgets;
|
||||
screen->WidgetsCount = count;
|
||||
screen->ContextRecreated = contextRecreated;
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct PauseScreen_ {
|
||||
MenuScreen Base;
|
||||
Widget* Widgets[8];
|
||||
ButtonWidget Buttons[8];
|
||||
} PauseScreen;
|
||||
|
||||
GuiElementVTABLE PauseScreen_VTABLE;
|
||||
PauseScreen PauseScreen_Instance;
|
||||
|
||||
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_Create(btn, &text, 300, &screen->Base.TitleFont, onClick);
|
||||
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) {
|
||||
String text = String_FromRaw(title, UInt16_MaxValue);
|
||||
ButtonWidget* btn = &screen->Buttons[i];
|
||||
ButtonWidget_Create(btn, &text, 400, &screen->Base.TitleFont, onClick);
|
||||
Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y);
|
||||
}
|
||||
|
||||
void PauseScreen_GenLevel(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(GenLevelScree_MakeInstance()); }
|
||||
void PauseScreen_ClassicGenLevel(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicGenLevelScreen_MakeInstance()); }
|
||||
void PauseScreen_LoadLevel(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(LoadLevelScreen_MakeInstance()); }
|
||||
void PauseScreen_SaveLevel(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(SaveLevelScreen_MakeInstance()); }
|
||||
void PauseScreen_TexPack(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(TexturePackScreen_MakeInstance()); }
|
||||
void PauseScreen_Hotkeys(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(HotkeyListScreen_MakeInstance()); }
|
||||
void PauseScreen_NostalgiaOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NostalgiaScreen_MakeInstance()); }
|
||||
void PauseScreen_Game(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NULL); }
|
||||
void PauseScreen_ClassicOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicOptionsScreen_MakeInstance()); }
|
||||
void PauseScreen_QuitGame(GuiElement* a, GuiElement* b) { Window_Close(); }
|
||||
|
||||
void PauseScreen_CheckHacksAllowed(void* obj) {
|
||||
if (Game_UseClassicOptions) return;
|
||||
PauseScreen* screen = (PauseScreen*)obj;
|
||||
screen->Buttons[4].Disabled = LocalPlayer_Instance.Hacks.CanAnyHacks; /* select texture pack */
|
||||
}
|
||||
|
||||
void PauseScreen_ContextRecreated(void* 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->Base.TitleFont;
|
||||
|
||||
if (Game_UseClassicOptions) {
|
||||
PauseScreen_MakeClassic(screen, 0, -100, "Options...", PauseScreen_ClassicOptions);
|
||||
PauseScreen_MakeClassic(screen, 1, -50, "Generate new level...", PauseScreen_ClassicGenLevel);
|
||||
PauseScreen_MakeClassic(screen, 2, 0, "Load level...", PauseScreen_LoadLevel);
|
||||
PauseScreen_MakeClassic(screen, 3, 50, "Save level...", PauseScreen_SaveLevel);
|
||||
PauseScreen_MakeClassic(screen, 4, 150, "Nostalgia options...", PauseScreen_NostalgiaOptions);
|
||||
|
||||
String back = String_FromConst("Back to game");
|
||||
Menu_MakeBack(&screen->Buttons[5], 400, &back, 25, font, PauseScreen_QuitGame);
|
||||
|
||||
/* Disable nostalgia options in classic mode*/
|
||||
if (Game_ClassicMode) { screen->Widgets[4] = NULL; }
|
||||
screen->Widgets[6] = NULL;
|
||||
screen->Widgets[7] = NULL;
|
||||
} else {
|
||||
PauseScreen_Make(screen, 0, -1, -50, "Options...", Menu_SwitchOptions);
|
||||
PauseScreen_Make(screen, 1, 1, -50, "Generate new level...", PauseScreen_GenLevel);
|
||||
PauseScreen_Make(screen, 2, 1, 0, "Load level...", PauseScreen_LoadLevel);
|
||||
PauseScreen_Make(screen, 3, 1, 50, "Save level...", PauseScreen_SaveLevel);
|
||||
PauseScreen_Make(screen, 4, -1, 0, "Change texture pack...", PauseScreen_TexPack);
|
||||
PauseScreen_Make(screen, 5, -1, 50, "Hotkeys...", PauseScreen_Hotkeys);
|
||||
|
||||
String quitMsg = String_FromConst("Quit game");
|
||||
ButtonWidget_Create(&screen->Buttons[6], &quitMsg, 120, font, PauseScreen_QuitGame);
|
||||
Widget_SetLocation((Widget*)(&screen->Buttons[6]), ANCHOR_MAX, ANCHOR_MAX, 5, 5);
|
||||
Menu_MakeDefaultBack(&screen->Buttons[7], true, font, PauseScreen_QuitGame);
|
||||
}
|
||||
|
||||
if (!ServerConnection_IsSinglePlayer) {
|
||||
screen->Buttons[1].Disabled = true;
|
||||
screen->Buttons[2].Disabled = true;
|
||||
}
|
||||
PauseScreen_CheckHacksAllowed(obj);
|
||||
}
|
||||
|
||||
void PauseScreen_Init(GuiElement* elem) {
|
||||
PauseScreen* screen = (PauseScreen*)elem;
|
||||
MenuScreen_Init(elem);
|
||||
Platform_MakeFont(&screen->Base.TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD);
|
||||
Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, PauseScreen_CheckHacksAllowed);
|
||||
PauseScreen_ContextRecreated(screen);
|
||||
}
|
||||
|
||||
void PauseScreen_Free(GuiElement* elem) {
|
||||
PauseScreen* screen = (PauseScreen*)elem;
|
||||
MenuScreen_Free(elem);
|
||||
Event_UnregisterVoid(&UserEvents_HackPermissionsChanged, screen, PauseScreen_CheckHacksAllowed);
|
||||
}
|
||||
|
||||
bool PauseScreen_HandlesKeyDown(GuiElement* elem, Key key) {
|
||||
if (key == Key_Escape) { Gui_SetNewScreen(NULL); }
|
||||
return key < Key_F1 || key > Key_F35;
|
||||
}
|
||||
|
||||
Screen* PauseScreen_MakeInstance(void) {
|
||||
PauseScreen* screen = &PauseScreen_Instance;
|
||||
MenuScreen_MakeInstance(&screen->Base, screen->Widgets, Array_Elems(screen->Buttons), PauseScreen_ContextRecreated);
|
||||
PauseScreen_VTABLE = *screen->Base.VTABLE;
|
||||
screen->Base.VTABLE = &PauseScreen_VTABLE;
|
||||
|
||||
screen->Base.VTABLE->Init = PauseScreen_Init;
|
||||
screen->Base.VTABLE->Free = PauseScreen_Free;
|
||||
screen->Base.VTABLE->HandlesKeyDown = PauseScreen_HandlesKeyDown;
|
||||
return screen;
|
||||
}
|
||||
|
@ -1,12 +1,19 @@
|
||||
#ifndef CC_MENUS_H
|
||||
#define CC_MENUS_H
|
||||
#include "Gui.h"
|
||||
#include "String.h"
|
||||
|
||||
/* Contains all 2D menu screen implementations.
|
||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||
*/
|
||||
|
||||
Screen* OptionsGroupScreen_MakeInstance(void);
|
||||
Screen* PauseScreen_MakeInstance(void);
|
||||
Screen* OptionsGroupScreen_MakeInstance(void);
|
||||
Screen* GenLevelScree_MakeInstance(void);
|
||||
Screen* ClassicGenLevelScreen_MakeInstance(void);
|
||||
Screen* LoadLevelScreen_MakeInstance(void);
|
||||
Screen* SaveLevelScreen_MakeInstance(void);
|
||||
Screen* TexturePackScreen_MakeInstance(void);
|
||||
Screen* HotkeyListScreen_MakeInstance(void);
|
||||
Screen* NostalgiaScreen_MakeInstance(void);
|
||||
Screen* ClassicOptionsScreen_MakeInstance(void);
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user