From 1027fdc361a59b78225772007851f439b7d275e0 Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 10 Apr 2023 15:09:32 -0700 Subject: [PATCH] WIP: lobby browser --- src/pc/djui/djui_lobby_entry.c | 81 ++++++++++++++++++++++++++++++++++ src/pc/djui/djui_lobby_entry.h | 8 ++++ src/pc/djui/djui_panel_join.c | 28 +++++++++--- 3 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 src/pc/djui/djui_lobby_entry.c create mode 100644 src/pc/djui/djui_lobby_entry.h diff --git a/src/pc/djui/djui_lobby_entry.c b/src/pc/djui/djui_lobby_entry.c new file mode 100644 index 00000000..2bbd44fc --- /dev/null +++ b/src/pc/djui/djui_lobby_entry.c @@ -0,0 +1,81 @@ +#include +#include +#include "djui.h" +#include "djui_lobby_entry.h" + +#define VK_ESCAPE 1 + +static void djui_lobby_entry_update_style(struct DjuiBase* base) { + struct DjuiLobbyEntry* entry = (struct DjuiLobbyEntry*)base; + if (!entry->base.enabled) { + u8 borderBrightness = 75; + u8 rectBrightness = 111; + djui_base_set_border_color(base, borderBrightness, borderBrightness, borderBrightness, 255); + djui_base_set_color(&entry->base, rectBrightness, rectBrightness, rectBrightness, 255); + //djui_base_set_location(&entry->text->base, 0.0f, 0.0f); + } else if (gDjuiCursorDownOn == base) { + djui_base_set_border_color(base, 0, 84, 153, 255); + djui_base_set_color(&entry->base, 204, 228, 247, 255); + //djui_base_set_location(&entry->text->base, 1.0f, 1.0f); + } else if (gDjuiHovered == base) { + djui_base_set_border_color(base, 0, 120, 215, 255); + djui_base_set_color(&entry->base, 229, 241, 251, 255); + //djui_base_set_location(&entry->text->base, -1.0f, -1.0f); + } else { + u8 borderBrightness = 150; + u8 rectBrightness = 222; + djui_base_set_border_color(base, borderBrightness, borderBrightness, borderBrightness, 255); + djui_base_set_color(&entry->base, rectBrightness, rectBrightness, rectBrightness, 255); + //djui_base_set_location(&entry->text->base, 0.0f, 0.0f); + } +} + +static void djui_lobby_entry_destroy(struct DjuiBase* base) { + struct DjuiLobbyEntry* lobbyEntry = (struct DjuiLobbyEntry*)base; + free(lobbyEntry); +} + +struct DjuiLobbyEntry* djui_lobby_entry_create(struct DjuiBase* parent, char* host, char* mode, char* players, void (*on_click)(struct DjuiBase*)) { + struct DjuiLobbyEntry* lobbyEntry = calloc(1, sizeof(struct DjuiLobbyEntry)); + struct DjuiBase* base = &lobbyEntry->base; + + djui_base_init(parent, base, djui_rect_render, djui_lobby_entry_destroy); + djui_base_set_size_type(&lobbyEntry->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&lobbyEntry->base, 1.0f, 32); + djui_base_set_color(&lobbyEntry->base, 255, 255, 255, 128); + djui_base_set_border_color(&lobbyEntry->base, 128, 128, 128, 255); + djui_base_set_border_width(&lobbyEntry->base, 2); + djui_base_set_border_width_type(&lobbyEntry->base, DJUI_SVT_ABSOLUTE); + djui_interactable_create(base, djui_lobby_entry_update_style); + djui_interactable_hook_click(base, on_click); + + u8 numColumns = 3; + f32 x = 0; + for (int i = 0; i < numColumns; i++) { + char* msg = NULL; + f32 width = 0; + switch (i) { + case 0: msg = host; width = 0.4f; break; + case 1: msg = mode; width = 0.45f; break; + case 2: msg = players; width = 0.15f; break; + } + struct DjuiText* text = djui_text_create(&lobbyEntry->base, msg); + + djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); + + djui_base_set_location_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_location(&text->base, x, 0.0f); + + djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&text->base, width, 1.0f); + + djui_base_set_color(&text->base, 11, 11, 11, 255); + djui_text_set_alignment(&text->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_drop_shadow(text, 64, 64, 64, 100); + x += width; + } + + djui_lobby_entry_update_style(base); + + return lobbyEntry; +} diff --git a/src/pc/djui/djui_lobby_entry.h b/src/pc/djui/djui_lobby_entry.h new file mode 100644 index 00000000..e96fca23 --- /dev/null +++ b/src/pc/djui/djui_lobby_entry.h @@ -0,0 +1,8 @@ +#pragma once +#include "djui.h" + +struct DjuiLobbyEntry { + struct DjuiBase base; +}; + +struct DjuiLobbyEntry* djui_lobby_entry_create(struct DjuiBase* parent, char* host, char* mode, char* players, void (*on_click)(struct DjuiBase*)); diff --git a/src/pc/djui/djui_panel_join.c b/src/pc/djui/djui_panel_join.c index bc076ba5..a6bacae2 100644 --- a/src/pc/djui/djui_panel_join.c +++ b/src/pc/djui/djui_panel_join.c @@ -4,6 +4,7 @@ #include "djui_panel_menu.h" #include "djui_panel_join_message.h" #include "djui_panel_modlist.h" +#include "djui_lobby_entry.h" #include "src/pc/network/network.h" #include "src/pc/network/socket/socket.h" #include "src/pc/network/coopnet/coopnet.h" @@ -160,15 +161,15 @@ void djui_panel_join_lobby(struct DjuiBase* caller) { } void djui_panel_join_query(uint64_t aLobbyId, uint64_t aOwnerId, uint16_t aConnections, uint16_t aMaxConnections, const char* aGame, const char* aVersion, const char* aTitle) { - char text[256]; - snprintf(text, 255, "%s - %u/%u", aTitle, aConnections, aMaxConnections); + char playerText[64]; + snprintf(playerText, 63, "%u/%u", aConnections, aMaxConnections); - bool btrue = TRUE; struct DjuiBase* layoutBase = &sLobbyLayout->base; - struct DjuiButton* button = djui_button_create(layoutBase, text, DJUI_BUTTON_STYLE_NORMAL, djui_panel_join_lobby); - button->base.tag = (s64)aLobbyId; - djui_base_set_size_type(&button->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button->base, 1.0f, 32); + struct DjuiLobbyEntry* entry = djui_lobby_entry_create(layoutBase, (char*)aTitle, "Super Mario 64", playerText, djui_panel_join_lobby); + entry->base.tag = (s64)aLobbyId; + + struct DjuiPaginated* paginated = (struct DjuiPaginated*)layoutBase->parent; + djui_paginated_calculate_height(paginated); } #endif @@ -185,6 +186,19 @@ void djui_panel_join_create(struct DjuiBase* caller) { struct DjuiPaginated* paginated = djui_paginated_create(body, 8); sLobbyLayout = paginated->layout; + djui_flow_layout_set_margin(sLobbyLayout, 4); + + struct DjuiBase* layoutBase = &sLobbyLayout->base; + #if 0 + for (int i = 0; i < 4; i++) { + djui_lobby_entry_create(layoutBase, "MysterD", "Super Mario 64", "15/16"); + djui_lobby_entry_create(layoutBase, "djoslin0", "Star Road", "1/16"); + djui_lobby_entry_create(layoutBase, "abcdefghijklmnopqrs", "Snowstorm Avalanche", "16/16"); + djui_lobby_entry_create(layoutBase, "Prince Frizzy", "Hide and Seek", "4/16"); + djui_lobby_entry_create(layoutBase, "Sunk", "Super Mario 74 (+EE)", "5/8"); + } + #endif + //djui_paginated_calculate_height(paginated); /* #ifdef DISCORD_SDK