Simplify player list widget related code

To be consistent with other widgets, player list widget doesn't hook into events anymore.
This commit is contained in:
UnknownShadow200 2019-09-28 17:19:33 +10:00
parent 4889fc6ec0
commit c0595f7fb6
3 changed files with 51 additions and 45 deletions

View File

@ -30,7 +30,7 @@ struct HUDScreen {
/* player list state */ /* player list state */
struct PlayerListWidget playerList; struct PlayerListWidget playerList;
struct FontDesc playerFont; struct FontDesc playerFont;
bool showingList, wasShowingList; bool showingList;
/* chat state */ /* chat state */
float chatAcc; float chatAcc;
bool suppressNextPress; bool suppressNextPress;
@ -940,6 +940,21 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) {
} }
} }
static void HUDScreen_TabEntryAdded(void* screen, int id) {
struct HUDScreen* s = (struct HUDScreen*)screen;
if (s->showingList) PlayerListWidget_Add(&s->playerList, id);
}
static void HUDScreen_TabEntryChanged(void* screen, int id) {
struct HUDScreen* s = (struct HUDScreen*)screen;
if (s->showingList) PlayerListWidget_Update(&s->playerList, id);
}
static void HUDScreen_TabEntryRemoved(void* screen, int id) {
struct HUDScreen* s = (struct HUDScreen*)screen;
if (s->showingList) PlayerListWidget_Remove(&s->playerList, id);
}
static void HUDScreen_ContextLost(void* screen) { static void HUDScreen_ContextLost(void* screen) {
struct HUDScreen* s = (struct HUDScreen*)screen; struct HUDScreen* s = (struct HUDScreen*)screen;
Font_Free(&s->playerFont); Font_Free(&s->playerFont);
@ -953,14 +968,11 @@ static void HUDScreen_ContextLost(void* screen) {
Elem_TryFree(&s->clientStatus); Elem_TryFree(&s->clientStatus);
Elem_TryFree(&s->announcement); Elem_TryFree(&s->announcement);
s->wasShowingList = s->showingList; if (s->showingList) Elem_Free(&s->playerList);
if (s->showingList) { Elem_TryFree(&s->playerList); }
s->showingList = false;
} }
static void HUDScreen_RemakePlayerList(struct HUDScreen* s) { static void HUDScreen_RemakePlayerList(struct HUDScreen* s) {
bool extended = Server.SupportsExtPlayerList && !Gui_ClassicTabList; bool extended = Server.SupportsExtPlayerList && !Gui_ClassicTabList;
if (!s->wasShowingList) return;
PlayerListWidget_Create(&s->playerList, &s->playerFont, !extended); PlayerListWidget_Create(&s->playerList, &s->playerFont, !extended);
s->showingList = true; s->showingList = true;
@ -977,7 +989,7 @@ static void HUDScreen_ContextRecreated(void* screen) {
HUDScreen_Redraw(s); HUDScreen_Redraw(s);
Widget_Reposition(&s->hotbar); Widget_Reposition(&s->hotbar);
HUDScreen_ChatUpdateLayout(s); HUDScreen_ChatUpdateLayout(s);
HUDScreen_RemakePlayerList(s); if (s->showingList) HUDScreen_RemakePlayerList(s);
} }
static void HUDScreen_OnResize(void* screen) { static void HUDScreen_OnResize(void* screen) {
@ -986,7 +998,7 @@ static void HUDScreen_OnResize(void* screen) {
if (HUDScreen_ChatUpdateFont(s)) HUDScreen_Redraw(s); if (HUDScreen_ChatUpdateFont(s)) HUDScreen_Redraw(s);
HUDScreen_ChatUpdateLayout(s); HUDScreen_ChatUpdateLayout(s);
if (s->showingList) { Widget_Reposition(&s->playerList); } if (s->showingList) Widget_Reposition(&s->playerList);
} }
static bool HUDScreen_KeyPress(void* screen, char keyChar) { static bool HUDScreen_KeyPress(void* screen, char keyChar) {
@ -1011,7 +1023,6 @@ static bool HUDScreen_KeyDown(void* screen, Key key) {
if (key == playerListKey && handlesList) { if (key == playerListKey && handlesList) {
if (!s->showingList && !Server.IsSinglePlayer) { if (!s->showingList && !Server.IsSinglePlayer) {
s->wasShowingList = true;
HUDScreen_RemakePlayerList(s); HUDScreen_RemakePlayerList(s);
} }
return true; return true;
@ -1054,9 +1065,8 @@ static bool HUDScreen_KeyDown(void* screen, Key key) {
static bool HUDScreen_KeyUp(void* screen, Key key) { static bool HUDScreen_KeyUp(void* screen, Key key) {
struct HUDScreen* s = (struct HUDScreen*)screen; struct HUDScreen* s = (struct HUDScreen*)screen;
if (key == KeyBinds[KEYBIND_PLAYER_LIST] && s->showingList) { if (key == KeyBinds[KEYBIND_PLAYER_LIST] && s->showingList) {
s->showingList = false; s->showingList = false;
s->wasShowingList = false; Elem_Free(&s->playerList);
Elem_TryFree(&s->playerList);
return true; return true;
} }
@ -1095,7 +1105,7 @@ static bool HUDScreen_PointerDown(void* screen, int id, int x, int y) {
/* TODO: Move to PlayerListWidget */ /* TODO: Move to PlayerListWidget */
if (s->showingList) { if (s->showingList) {
String_InitArray(text, textBuffer); String_InitArray(text, textBuffer);
PlayerListWidget_GetNameUnder(&s->playerList, x, y, &text); PlayerListWidget_GetNameAt(&s->playerList, x, y, &text);
if (text.length) { if (text.length) {
String_Append(&text, ' '); String_Append(&text, ' ');
@ -1134,12 +1144,14 @@ static bool HUDScreen_PointerDown(void* screen, int id, int x, int y) {
static void HUDScreen_Init(void* screen) { static void HUDScreen_Init(void* screen) {
struct HUDScreen* s = (struct HUDScreen*)screen; struct HUDScreen* s = (struct HUDScreen*)screen;
s->wasShowingList = false;
HotbarWidget_Create(&s->hotbar); HotbarWidget_Create(&s->hotbar);
HUDScreen_ChatInit(s); HUDScreen_ChatInit(s);
Event_RegisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived); Event_RegisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived);
Event_RegisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); Event_RegisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged);
Event_RegisterInt(&TabListEvents.Added, s, HUDScreen_TabEntryAdded);
Event_RegisterInt(&TabListEvents.Changed, s, HUDScreen_TabEntryChanged);
Event_RegisterInt(&TabListEvents.Removed, s, HUDScreen_TabEntryRemoved);
} }
static void HUDScreen_Render(void* screen, double delta) { static void HUDScreen_Render(void* screen, double delta) {
@ -1172,8 +1184,8 @@ static void HUDScreen_Render(void* screen, double delta) {
Elem_Render(&s->playerList, delta); Elem_Render(&s->playerList, delta);
/* NOTE: Should usually be caught by KeyUp, but just in case. */ /* NOTE: Should usually be caught by KeyUp, but just in case. */
if (!KeyBind_IsPressed(KEYBIND_PLAYER_LIST)) { if (!KeyBind_IsPressed(KEYBIND_PLAYER_LIST)) {
Elem_TryFree(&s->playerList);
s->showingList = false; s->showingList = false;
Elem_Free(&s->playerList);
} }
} }
Gfx_SetTexturing(false); Gfx_SetTexturing(false);
@ -1181,8 +1193,13 @@ static void HUDScreen_Render(void* screen, double delta) {
static void HUDScreen_Free(void* screen) { static void HUDScreen_Free(void* screen) {
struct HUDScreen* s = (struct HUDScreen*)screen; struct HUDScreen* s = (struct HUDScreen*)screen;
s->showingList = false;
Event_UnregisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived); Event_UnregisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived);
Event_UnregisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); Event_UnregisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged);
Event_UnregisterInt(&TabListEvents.Added, s, HUDScreen_TabEntryAdded);
Event_UnregisterInt(&TabListEvents.Changed, s, HUDScreen_TabEntryChanged);
Event_UnregisterInt(&TabListEvents.Removed, s, HUDScreen_TabEntryRemoved);
} }
static const struct ScreenVTABLE HUDScreen_VTABLE = { static const struct ScreenVTABLE HUDScreen_VTABLE = {
@ -1192,8 +1209,7 @@ static const struct ScreenVTABLE HUDScreen_VTABLE = {
HUDScreen_OnResize, HUDScreen_ContextLost, HUDScreen_ContextRecreated HUDScreen_OnResize, HUDScreen_ContextLost, HUDScreen_ContextRecreated
}; };
void HUDScreen_Show(void) { void HUDScreen_Show(void) {
struct HUDScreen* s = &HUDScreen_Instance; struct HUDScreen* s = &HUDScreen_Instance;
s->wasShowingList = false;
s->lastDownloadStatus = Int32_MinValue; s->lastDownloadStatus = Int32_MinValue;
s->VTABLE = &HUDScreen_VTABLE; s->VTABLE = &HUDScreen_VTABLE;

View File

@ -1750,27 +1750,20 @@ static void PlayerListWidget_DrawName(struct Texture* tex, struct PlayerListWidg
Drawer2D_ReducePadding_Tex(tex, w->font->size, 3); Drawer2D_ReducePadding_Tex(tex, w->font->size, 3);
} }
static int PlayerListWidget_HighlightedName(struct PlayerListWidget* w, int x, int y) { void PlayerListWidget_GetNameAt(struct PlayerListWidget* w, int x, int y, String* name) {
struct Texture tex; struct Texture tex;
String player;
int i; int i;
if (!w->active) return -1;
for (i = 0; i < w->namesCount; i++) { for (i = 0; i < w->namesCount; i++) {
if (!w->textures[i].ID || w->ids[i] == GROUP_NAME_ID) continue; if (!w->textures[i].ID || w->ids[i] == GROUP_NAME_ID) continue;
tex = w->textures[i]; tex = w->textures[i];
if (Gui_Contains(tex.X, tex.Y, tex.Width, tex.Height, x, y)) return i; if (!Gui_Contains(tex.X, tex.Y, tex.Width, tex.Height, x, y)) continue;
player = TabList_UNSAFE_GetPlayer(w->ids[i]);
String_AppendString(name, &player);
return;
} }
return -1;
}
void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, int x, int y, String* name) {
String player;
int i = PlayerListWidget_HighlightedName(w, x, y);
if (i == -1) return;
player = TabList_UNSAFE_GetPlayer(w->ids[i]);
String_AppendString(name, &player);
} }
static int PlayerListWidget_GetColumnWidth(struct PlayerListWidget* w, int column) { static int PlayerListWidget_GetColumnWidth(struct PlayerListWidget* w, int column) {
@ -1980,14 +1973,12 @@ static void PlayerListWidget_SortAndReposition(struct PlayerListWidget* w) {
Widget_Reposition(w); Widget_Reposition(w);
} }
static void PlayerListWidget_TabEntryAdded(void* widget, int id) { void PlayerListWidget_Add(struct PlayerListWidget* w, int id) {
struct PlayerListWidget* w = (struct PlayerListWidget*)widget;
PlayerListWidget_AddName(w, id, -1); PlayerListWidget_AddName(w, id, -1);
PlayerListWidget_SortAndReposition(w); PlayerListWidget_SortAndReposition(w);
} }
static void PlayerListWidget_TabEntryChanged(void* widget, int id) { void PlayerListWidget_Update(struct PlayerListWidget* w, int id) {
struct PlayerListWidget* w = (struct PlayerListWidget*)widget;
struct Texture tex; struct Texture tex;
int i; int i;
@ -2002,8 +1993,7 @@ static void PlayerListWidget_TabEntryChanged(void* widget, int id) {
} }
} }
static void PlayerListWidget_TabEntryRemoved(void* widget, int id) { void PlayerListWidget_Remove(struct PlayerListWidget* w, int id) {
struct PlayerListWidget* w = (struct PlayerListWidget*)widget;
int i; int i;
for (i = 0; i < w->namesCount; i++) { for (i = 0; i < w->namesCount; i++) {
if (w->ids[i] != id) continue; if (w->ids[i] != id) continue;
@ -2026,10 +2016,6 @@ static void PlayerListWidget_Init(void* widget) {
TextWidget_Make(&w->title, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0); TextWidget_Make(&w->title, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0);
TextWidget_SetConst(&w->title, "Connected players:", w->font); TextWidget_SetConst(&w->title, "Connected players:", w->font);
PlayerListWidget_SortAndReposition(w); PlayerListWidget_SortAndReposition(w);
Event_RegisterInt(&TabListEvents.Added, w, PlayerListWidget_TabEntryAdded);
Event_RegisterInt(&TabListEvents.Changed, w, PlayerListWidget_TabEntryChanged);
Event_RegisterInt(&TabListEvents.Removed, w, PlayerListWidget_TabEntryRemoved);
} }
static void PlayerListWidget_Render(void* widget, double delta) { static void PlayerListWidget_Render(void* widget, double delta) {
@ -2071,9 +2057,6 @@ static void PlayerListWidget_Free(void* widget) {
} }
Elem_TryFree(&w->title); Elem_TryFree(&w->title);
Event_UnregisterInt(&TabListEvents.Added, w, PlayerListWidget_TabEntryAdded);
Event_UnregisterInt(&TabListEvents.Changed, w, PlayerListWidget_TabEntryChanged);
Event_UnregisterInt(&TabListEvents.Removed, w, PlayerListWidget_TabEntryRemoved);
} }
static const struct WidgetVTABLE PlayerListWidget_VTABLE = { static const struct WidgetVTABLE PlayerListWidget_VTABLE = {

View File

@ -246,7 +246,14 @@ struct PlayerListWidget {
struct Texture textures[TABLIST_MAX_NAMES * 2]; struct Texture textures[TABLIST_MAX_NAMES * 2];
}; };
CC_NOINLINE void PlayerListWidget_Create(struct PlayerListWidget* w, struct FontDesc* font, bool classic); CC_NOINLINE void PlayerListWidget_Create(struct PlayerListWidget* w, struct FontDesc* font, bool classic);
CC_NOINLINE void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, int mouseX, int mouseY, String* name); /* Gets the name of the entry that contains the given coordinates. */
void PlayerListWidget_GetNameAt(struct PlayerListWidget* w, int x, int y, String* name);
/* Adds a new entry to this widget. */
void PlayerListWidget_Add(struct PlayerListWidget* w, int id);
/* Updates an existing entry in the given widget. */
void PlayerListWidget_Update(struct PlayerListWidget* w, int id);
/* Removes the given entry from the given widget. */
void PlayerListWidget_Remove(struct PlayerListWidget* w, int id);
typedef void (*SpecialInputAppendFunc)(void* userData, char c); typedef void (*SpecialInputAppendFunc)(void* userData, char c);