Port PauseScreen to C, fix clicking on input in SaveLevelScreen not moving caret to cursor

This commit is contained in:
UnknownShadow200 2018-04-04 14:45:31 +10:00
parent 13877fff15
commit 24845e2ca4
7 changed files with 153 additions and 58 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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();

View File

@ -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));

View File

@ -9,6 +9,7 @@
#include "ExtMath.h"
#include "Event.h"
#include "Entity.h"
#include "IModel.h"
BlockID held_block;
Entity held_entity;

View File

@ -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;
}

View File

@ -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