diff --git a/ClassicalSharp/2D/Screens/Menu/ListScreen.cs b/ClassicalSharp/2D/Screens/Menu/ListScreen.cs index c7f2c5f5f..eb6c657ad 100644 --- a/ClassicalSharp/2D/Screens/Menu/ListScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/ListScreen.cs @@ -21,6 +21,7 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { font = new Font(game.FontName, 16, FontStyle.Bold); + Keyboard.KeyRepeat = true; ContextRecreated(); game.Graphics.ContextLost += ContextLost; game.Graphics.ContextRecreated += ContextRecreated; @@ -35,6 +36,7 @@ namespace ClassicalSharp.Gui.Screens { public override void Dispose() { font.Dispose(); + Keyboard.KeyRepeat = false; ContextLost(); game.Graphics.ContextLost -= ContextLost; game.Graphics.ContextRecreated -= ContextRecreated; @@ -53,8 +55,10 @@ namespace ClassicalSharp.Gui.Screens { MakeBack(false, font, SwitchPause), TextWidget.Create(game, titleText, font) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -155), + TextWidget.Create(game, "", font) + .SetLocation(Anchor.Centre, Anchor.Max, 0, 75), }; - UpdateArrows(); + UpdatePage(); } void MoveBackwards(Game g, Widget w) { PageClick(false); } @@ -93,20 +97,24 @@ namespace ClassicalSharp.Gui.Screens { for (int i = 0; i < items; i++) { UpdateText((ButtonWidget)widgets[i], Get(currentIndex + i)); } - UpdateArrows(); + UpdatePage(); } protected virtual void UpdateText(ButtonWidget widget, string text) { widget.SetText(text); } - void UpdateArrows() { - widgets[5].Disabled = false; - widgets[6].Disabled = false; - if (currentIndex < items) - widgets[5].Disabled = true; - if (currentIndex >= entries.Length - items) - widgets[6].Disabled = true; + void UpdatePage() { + int start = items, end = entries.Length - items; + widgets[5].Disabled = currentIndex < start; + widgets[6].Disabled = currentIndex >= end; + if (game.ClassicMode) return; + + TextWidget page = (TextWidget)widgets[9]; + int num = (currentIndex / items) + 1; + int pages = Utils.CeilDiv(entries.Length, items); + if (pages == 0) pages = 1; + page.SetText("&7Page " + num + " of " + pages); } public override bool HandlesKeyDown(Key key) { diff --git a/src/Client/Menus.c b/src/Client/Menus.c index 7ebfe56ab..1b7340ebe 100644 --- a/src/Client/Menus.c +++ b/src/Client/Menus.c @@ -40,8 +40,8 @@ struct ListScreen { Widget_LeftClick EntryClick; String TitleText; struct ButtonWidget Buttons[LIST_SCREEN_BUTTONS]; - struct TextWidget Title; - struct Widget* Widgets[LIST_SCREEN_BUTTONS + 1]; + struct TextWidget Title, Page; + struct Widget* Widgets[LIST_SCREEN_BUTTONS + 2]; StringsBuffer Entries; /* NOTE: this is the last member so we can avoid memsetting it to 0 */ }; @@ -327,10 +327,20 @@ static void ListScreen_Make(struct ListScreen* screen, Int32 i, Int32 x, STRING_ Widget_SetLocation((struct Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, x, 0); } -static void ListScreen_UpdateArrows(struct ListScreen* screen) { +static void ListScreen_UpdatePage(struct ListScreen* screen) { Int32 start = LIST_SCREEN_ITEMS, end = screen->Entries.Count - LIST_SCREEN_ITEMS; screen->Buttons[5].Disabled = screen->CurrentIndex < start; screen->Buttons[6].Disabled = screen->CurrentIndex >= end; + if (Game_ClassicMode) return; + + UInt8 pageBuffer[String_BufferSize(STRING_SIZE)]; + String page = String_InitAndClearArray(pageBuffer); + Int32 num = (screen->CurrentIndex / LIST_SCREEN_ITEMS) + 1; + Int32 pages = Math_CeilDiv(screen->Entries.Count, LIST_SCREEN_ITEMS); + if (pages == 0) pages = 1; + + String_Format2(&page, "&7Page %i of %i", &num, &pages); + TextWidget_SetText(&screen->Page, &page); } static void ListScreen_SetCurrentIndex(struct ListScreen* screen, Int32 index) { @@ -344,7 +354,7 @@ static void ListScreen_SetCurrentIndex(struct ListScreen* screen, Int32 index) { } screen->CurrentIndex = index; - ListScreen_UpdateArrows(screen); + ListScreen_UpdatePage(screen); } static void ListScreen_PageClick(struct ListScreen* screen, bool forward) { @@ -379,11 +389,17 @@ static void ListScreen_ContextRecreated(void* obj) { Menu_MakeDefaultBack(&screen->Buttons[7], false, &screen->Font, Menu_SwitchPause); screen->Widgets[7] = (struct Widget*)(&screen->Buttons[7]); - ListScreen_UpdateArrows(screen); TextWidget_Create(&screen->Title, &screen->TitleText, &screen->Font); Widget_SetLocation((struct Widget*)(&screen->Title), ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); screen->Widgets[8] = (struct Widget*)(&screen->Title); + + String text = String_MakeNull(); + TextWidget_Create(&screen->Page, &text, &screen->Font); + Widget_SetLocation((struct Widget*)(&screen->Page), ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); + screen->Widgets[9] = (struct Widget*)(&screen->Page); + + ListScreen_UpdatePage(screen); } static void ListScreen_QuickSort(Int32 left, Int32 right) { @@ -412,6 +428,7 @@ static String ListScreen_UNSAFE_GetCur(struct ListScreen* screen, struct GuiElem static void ListScreen_Init(struct GuiElem* elem) { struct ListScreen* screen = (struct ListScreen*)elem; Platform_FontMake(&screen->Font, &Game_FontName, 16, FONT_STYLE_BOLD); + Key_KeyRepeat = true; screen->WheelAcc = 0.0f; ListScreen_ContextRecreated(screen); Event_RegisterVoid(&GfxEvents_ContextLost, screen, ListScreen_ContextLost); @@ -429,6 +446,7 @@ static void ListScreen_Render(struct GuiElem* elem, Real64 delta) { static void ListScreen_Free(struct GuiElem* elem) { struct ListScreen* screen = (struct ListScreen*)elem; Platform_FontFree(&screen->Font); + Key_KeyRepeat = false; ListScreen_ContextLost(screen); Event_UnregisterVoid(&GfxEvents_ContextLost, screen, ListScreen_ContextLost); Event_UnregisterVoid(&GfxEvents_ContextRecreated, screen, ListScreen_ContextRecreated);