mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-14 18:15:28 -04:00
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:
parent
4889fc6ec0
commit
c0595f7fb6
@ -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;
|
||||||
|
@ -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 = {
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user