mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	Add lobby refresh button
This commit is contained in:
		
							parent
							
								
									fe2bb479ca
								
							
						
					
					
						commit
						3f38c740d8
					
				
					 8 changed files with 59 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -331,5 +331,6 @@ LANGUAGE = "LANGUAGE"
 | 
			
		|||
PUBLIC_LOBBIES = "PUBLIC LOBBIES"
 | 
			
		||||
PRIVATE_LOBBIES = "PRIVATE LOBBIES"
 | 
			
		||||
REFRESH = "Refresh"
 | 
			
		||||
REFRESHING = "Refreshing..."
 | 
			
		||||
ENTER_PASSWORD = "Enter the private lobby's password:"
 | 
			
		||||
SEARCH = "Search"
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ typedef struct {
 | 
			
		|||
    void (*OnLobbyJoined)(uint64_t aLobbyId, uint64_t aUserId, uint64_t aOwnerId);
 | 
			
		||||
    void (*OnLobbyLeft)(uint64_t aLobbyId, uint64_t aUserId);
 | 
			
		||||
    void (*OnLobbyListGot)(uint64_t aLobbyId, uint64_t aOwnerId, uint16_t aConnections, uint16_t aMaxConnections, const char* aGame, const char* aVersion, const char* aHostName, const char* aMode);
 | 
			
		||||
    void (*OnLobbyListFinish)(void);
 | 
			
		||||
    void (*OnReceive)(uint64_t aFromUserId, const uint8_t* aData, uint64_t aSize);
 | 
			
		||||
    void (*OnError)(enum MPacketErrorNumber aErrorNumber);
 | 
			
		||||
    void (*OnPeerConnected)(uint64_t aPeerId);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -393,6 +393,19 @@ void djui_base_destroy(struct DjuiBase* base) {
 | 
			
		|||
    base->destroy(base);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_base_destroy_children(struct DjuiBase* base) {
 | 
			
		||||
    // destroy all children and our linked list
 | 
			
		||||
    struct DjuiBaseChild* child = base->child;
 | 
			
		||||
    while (child != NULL) {
 | 
			
		||||
        struct DjuiBaseChild* nextChild = child->next;
 | 
			
		||||
        child->base->parent = NULL;
 | 
			
		||||
        djui_base_destroy(child->base);
 | 
			
		||||
        free(child);
 | 
			
		||||
        child = nextChild;
 | 
			
		||||
    }
 | 
			
		||||
    base->child = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_base_init(struct DjuiBase* parent, struct DjuiBase* base, bool (*render)(struct DjuiBase*), void (*destroy)(struct DjuiBase*)) {
 | 
			
		||||
    memset(base, 0, sizeof(struct DjuiBase));
 | 
			
		||||
    base->parent = parent;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,4 +69,5 @@ void djui_base_compute_tree(struct DjuiBase* base);
 | 
			
		|||
 | 
			
		||||
bool djui_base_render(struct DjuiBase* base);
 | 
			
		||||
void djui_base_destroy(struct DjuiBase* base);
 | 
			
		||||
void djui_base_destroy_children(struct DjuiBase* base);
 | 
			
		||||
void djui_base_init(struct DjuiBase* parent, struct DjuiBase* base, bool (*render)(struct DjuiBase*), void (*destroy)(struct DjuiBase*));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,8 @@
 | 
			
		|||
#ifdef COOPNET
 | 
			
		||||
 | 
			
		||||
static struct DjuiFlowLayout* sLobbyLayout = NULL;
 | 
			
		||||
static struct DjuiButton* sRefreshButton = NULL;
 | 
			
		||||
static char* sPassword = NULL;
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_lobby(struct DjuiBase* caller) {
 | 
			
		||||
    gCoopNetDesiredLobby = (uint64_t)caller->tag;
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +27,8 @@ void djui_panel_join_lobby(struct DjuiBase* caller) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_query(uint64_t aLobbyId, UNUSED uint64_t aOwnerId, uint16_t aConnections, uint16_t aMaxConnections, UNUSED const char* aGame, UNUSED const char* aVersion, const char* aHostName, const char* aMode) {
 | 
			
		||||
    if (!sLobbyLayout) { return; }
 | 
			
		||||
 | 
			
		||||
    char playerText[64];
 | 
			
		||||
    snprintf(playerText, 63, "%u/%u", aConnections, aMaxConnections);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,16 +37,36 @@ void djui_panel_join_query(uint64_t aLobbyId, UNUSED uint64_t aOwnerId, uint16_t
 | 
			
		|||
    entry->base.tag = (s64)aLobbyId;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_lobbies_create(struct DjuiBase* caller, const char* password) {
 | 
			
		||||
void djui_panel_join_query_finish(void) {
 | 
			
		||||
    if (!sRefreshButton) { return; }
 | 
			
		||||
    djui_text_set_text(sRefreshButton->text, DLANG(LOBBIES, REFRESH));
 | 
			
		||||
    djui_base_set_enabled(&sRefreshButton->base, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_lobbies_on_destroy(UNUSED struct DjuiBase* caller) {
 | 
			
		||||
    if (sPassword) { free(sPassword); }
 | 
			
		||||
    sPassword = NULL;
 | 
			
		||||
    sRefreshButton = NULL;
 | 
			
		||||
    sLobbyLayout = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_lobbies_refresh(UNUSED struct DjuiBase* caller) {
 | 
			
		||||
    djui_base_destroy_children(&sLobbyLayout->base);
 | 
			
		||||
    djui_text_set_text(sRefreshButton->text, DLANG(LOBBIES, REFRESHING));
 | 
			
		||||
    djui_base_set_enabled(&sRefreshButton->base, false);
 | 
			
		||||
    ns_coopnet_query(djui_panel_join_query, djui_panel_join_query_finish, sPassword);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void djui_panel_join_lobbies_create(struct DjuiBase* caller, const char* password) {
 | 
			
		||||
    if (sPassword) { free(sPassword); sPassword = NULL; }
 | 
			
		||||
    sPassword = strdup(password);
 | 
			
		||||
    bool private = (strlen(password) > 0);
 | 
			
		||||
    ns_coopnet_query(djui_panel_join_query, password);
 | 
			
		||||
    ns_coopnet_query(djui_panel_join_query, djui_panel_join_query_finish, password);
 | 
			
		||||
 | 
			
		||||
    struct DjuiBase* defaultBase = NULL;
 | 
			
		||||
    struct DjuiThreePanel* panel = djui_panel_menu_create(private ? DLANG(LOBBIES, PRIVATE_LOBBIES) : DLANG(LOBBIES, PUBLIC_LOBBIES));
 | 
			
		||||
    struct DjuiBase* body = djui_three_panel_get_body(panel);
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        struct DjuiPaginated* paginated = djui_paginated_create(body, 8);
 | 
			
		||||
        sLobbyLayout = paginated->layout;
 | 
			
		||||
        djui_flow_layout_set_margin(sLobbyLayout, 4);
 | 
			
		||||
| 
						 | 
				
			
			@ -65,14 +89,16 @@ void djui_panel_join_lobbies_create(struct DjuiBase* caller, const char* passwor
 | 
			
		|||
            djui_base_set_size(&button1->base, 0.485f, 64);
 | 
			
		||||
            djui_base_set_alignment(&button1->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP);
 | 
			
		||||
 | 
			
		||||
            struct DjuiButton* button2 = djui_button_create(&rect2->base, DLANG(LOBBIES, REFRESH), DJUI_BUTTON_STYLE_NORMAL, NULL);
 | 
			
		||||
            djui_base_set_size(&button2->base, 0.485f, 64);
 | 
			
		||||
            djui_base_set_alignment(&button2->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP);
 | 
			
		||||
            defaultBase = &button2->base;
 | 
			
		||||
            sRefreshButton = djui_button_create(&rect2->base, DLANG(LOBBIES, REFRESHING), DJUI_BUTTON_STYLE_NORMAL, djui_panel_join_lobbies_refresh);
 | 
			
		||||
            djui_base_set_size(&sRefreshButton->base, 0.485f, 64);
 | 
			
		||||
            djui_base_set_alignment(&sRefreshButton->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP);
 | 
			
		||||
            djui_base_set_enabled(&sRefreshButton->base, false);
 | 
			
		||||
            defaultBase = &sRefreshButton->base;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    djui_panel_add(caller, panel, defaultBase);
 | 
			
		||||
    struct DjuiPanel* p = djui_panel_add(caller, panel, defaultBase);
 | 
			
		||||
    p->on_panel_destroy = djui_panel_join_lobbies_on_destroy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -21,8 +21,9 @@ static enum NetworkType sNetworkType;
 | 
			
		|||
 | 
			
		||||
static CoopNetRc coopnet_initialize(void);
 | 
			
		||||
 | 
			
		||||
void ns_coopnet_query(QueryCallbackPtr callback, const char* password) {
 | 
			
		||||
void ns_coopnet_query(QueryCallbackPtr callback, QueryFinishCallbackPtr finishCallback, const char* password) {
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListGot = callback;
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListFinish = finishCallback;
 | 
			
		||||
    if (coopnet_initialize() != COOPNET_OK) { return; }
 | 
			
		||||
    coopnet_lobby_list_get(CN_GAME_STR, password);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +36,8 @@ static void coopnet_on_disconnected(void) {
 | 
			
		|||
    LOG_INFO("Coopnet shutdown!");
 | 
			
		||||
    djui_popup_create(DLANG(NOTIF, COOPNET_DISCONNECTED), 2);
 | 
			
		||||
    coopnet_shutdown();
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListGot = NULL;
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListFinish = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void coopnet_on_peer_disconnected(uint64_t peerId) {
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +124,8 @@ static int ns_coopnet_network_send(u8 localIndex, void* address, u8* data, u16 d
 | 
			
		|||
static void ns_coopnet_shutdown(void) {
 | 
			
		||||
    LOG_INFO("Coopnet shutdown!");
 | 
			
		||||
    coopnet_shutdown();
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListGot = NULL;
 | 
			
		||||
    gCoopNetCallbacks.OnLobbyListFinish = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoopNetRc coopnet_initialize(void) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,10 +3,12 @@
 | 
			
		|||
#ifdef COOPNET
 | 
			
		||||
 | 
			
		||||
typedef void (*QueryCallbackPtr)(uint64_t aLobbyId, uint64_t aOwnerId, uint16_t aConnections, uint16_t aMaxConnections, const char* aGame, const char* aVersion, const char* aHostName, const char* aMode);
 | 
			
		||||
typedef void (*QueryFinishCallbackPtr)(void);
 | 
			
		||||
 | 
			
		||||
extern struct NetworkSystem gNetworkSystemCoopNet;
 | 
			
		||||
extern uint64_t gCoopNetDesiredLobby;
 | 
			
		||||
 | 
			
		||||
void ns_coopnet_query(QueryCallbackPtr callback, const char* password);
 | 
			
		||||
void ns_coopnet_query(QueryCallbackPtr callback, QueryFinishCallbackPtr finishCallback, const char* password);
 | 
			
		||||
bool ns_coopnet_is_connected(void);
 | 
			
		||||
void ns_coopnet_update(void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue