From 75b19e771c527e8444aae70543b2b617dae2e892 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 12 Dec 2004 19:58:11 +0000 Subject: Ported server list dialog over to Guichan. --- src/gui/char_server.cpp | 255 +++++++++++++++++++++++++++++------------------- 1 file changed, 153 insertions(+), 102 deletions(-) (limited to 'src/gui/char_server.cpp') diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp index 7217abd8..c84fc167 100644 --- a/src/gui/char_server.cpp +++ b/src/gui/char_server.cpp @@ -25,118 +25,169 @@ #include "../graphic/graphic.h" char server[30]; +int showServerList = 1; -DIALOG char_server_dialog[] = { - /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ - { tmw_dialog_proc, 300, 240, 200, 104, 0, -1, 0, 0, 0, 0, (char*)"Server select", NULL, NULL }, - { tmw_list_proc, 304, 262, 192, 55, 0, 0, 0, 0, 0, 0, (char*)server_list, NULL, NULL }, - { tmw_button_proc, 398, 322, 44, 18, 0, -1, 'o', D_EXIT, -1, 0, (char*)"&Ok", NULL, NULL }, - { tmw_button_proc, 446, 322, 44, 18, 0, -1, 'c', D_EXIT, -1, 0, (char*)"&Cancel", NULL, NULL }, - { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }, -}; - -/** Helper function to create server list */ -char *server_list(int index, int *size) { - static char buffer[30]; - if (index < 0) { - *size = n_server; - return NULL; - } - sprintf(buffer, "%s (%i)", server_info[index].name, server_info[index].online_users); - return buffer; +ServerListModel *serverListModel; +gcn::ListBox *serverList; + + +void ServerSelectListener::action(const std::string& eventId) { + printf("%s\n", eventId.c_str()); + if (eventId == "ok") { + server_char_server(serverList->getSelected()); + } + else if (eventId == "cancel") { + } + showServerList = 0; +} + + +int ServerListModel::getNumberOfElements() { + return n_server; +} + +std::string ServerListModel::getElementAt(int i) { + static char buffer[30]; + sprintf(buffer, "%s (%i)", server_info[i].name, + server_info[i].online_users); + return buffer; } + void char_server() { - state = LOGIN; - centre_dialog(char_server_dialog); - DIALOG_PLAYER *player = init_dialog(char_server_dialog, -1); - if(!player)ok("Error", "Unable to initialize login dialog"); - int gui_exit = 1; - if(n_server==0)char_server_dialog[2].flags |= D_DISABLED; - while ((!key[KEY_ESC])&&(gui_exit)&&(!key[KEY_ENTER])) { - clear_bitmap(buffer); - blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600); - gui_exit = gui_update(player); - blit(buffer, screen, 0, 0, 0, 0, 800, 600); - } - gui_exit = shutdown_dialog(player); - if((gui_exit==2)||(key[KEY_ENTER])) { - server_char_server(); - } + // Create dialog + gcn::Container *dialog; + gcn::Button *okButton; + gcn::Button *cancelButton; + gcn::ScrollArea *scrollArea; + + serverListModel = new ServerListModel(); + dialog = new gcn::Container(); + serverList = new gcn::ListBox(serverListModel); + scrollArea = new gcn::ScrollArea(serverList); + okButton = new gcn::Button("OK"); + cancelButton = new gcn::Button("Cancel"); + + dialog->setDimension(gcn::Rectangle(300, 200, 200, 100)); + scrollArea->setDimension(gcn::Rectangle(4, 4, 192, 55)); + okButton->setPosition(120, 70); + cancelButton->setPosition(146, 70); + + serverList->setEventId("ok"); + okButton->setEventId("ok"); + cancelButton->setEventId("cancel"); + + ServerSelectListener *actionListener = new ServerSelectListener(); + serverList->addActionListener(actionListener); + okButton->addActionListener(actionListener); + cancelButton->addActionListener(actionListener); + + dialog->add(scrollArea); + dialog->add(okButton); + dialog->add(cancelButton); + + guiTop->add(dialog); + + state = LOGIN; + + if (n_server == 0) { + // Disable Ok button + //okButton->char_server_dialog[2].flags |= D_DISABLED; + } else { + // Select first server + serverList->setSelected(1); + } + + showServerList = 1; + while (showServerList) { + clear_bitmap(buffer); + blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600); + gui_update(NULL); + blit(buffer, screen, 0, 0, 0, 0, 800, 600); + } + + delete dialog; + delete serverList; + delete serverListModel; + delete scrollArea; + delete okButton; + delete cancelButton; + delete actionListener; } -void server_char_server() { - int ret; - state = LOGIN; +void server_char_server(int serverIndex) { + int ret; + state = LOGIN; // Connect to char server - ret = open_session(iptostring(server_info[char_server_dialog[1].d1].address), server_info[char_server_dialog[1].d1].port); - if(ret==SOCKET_ERROR) { - ok("Error", "Unable to connect to char server"); - return; - } - - // Send login infos - WFIFOW(0) = net_w_value(0x0065); - WFIFOL(2) = net_l_value(account_ID); - WFIFOL(6) = net_l_value(session_ID1); - WFIFOL(10) = net_l_value(session_ID2); - WFIFOW(14) = 0; - WFIFOB(16) = net_b_value(sex); - WFIFOSET(17); - - while((in_size<4)||(out_size>0))flush(); - RFIFOSKIP(4); + ret = open_session(iptostring(server_info[serverIndex].address), + server_info[serverIndex].port); + if (ret == SOCKET_ERROR) { + ok("Error", "Unable to connect to char server"); + return; + } + + // Send login infos + WFIFOW(0) = net_w_value(0x0065); + WFIFOL(2) = net_l_value(account_ID); + WFIFOL(6) = net_l_value(session_ID1); + WFIFOL(10) = net_l_value(session_ID2); + WFIFOW(14) = 0; + WFIFOB(16) = net_b_value(sex); + WFIFOSET(17); + + while((in_size<4)||(out_size>0))flush(); + RFIFOSKIP(4); while(in_size<3)flush(); - if(RFIFOW(0)==0x006b) { - while(in_sizename, RFIFOW(0), RFIFOW(2)); - - - RFIFOSKIP(RFIFOW(2)); - } else if(RFIFOW(0)==0x006c) { - switch(RFIFOB(2)) { - case 0: - ok("Error", "Access denied"); - break; - case 1: - ok("Error", "Cannot use this ID"); + if(RFIFOW(0)==0x006b) { + while(in_sizename, RFIFOW(0), RFIFOW(2)); + + + RFIFOSKIP(RFIFOW(2)); + } else if(RFIFOW(0)==0x006c) { + switch(RFIFOB(2)) { + case 0: + ok("Error", "Access denied"); + break; + case 1: + ok("Error", "Cannot use this ID"); + break; + default: + ok("Error", "Rejected from server"); break; - default: - ok("Error", "Rejected from server"); - break; - } - RFIFOSKIP(3); - close_session(); - } else ok("Error", "Unknown error"); - // Todo: add other packets + } + RFIFOSKIP(3); + close_session(); + } else ok("Error", "Unknown error"); + // Todo: add other packets } -- cgit v1.2.3-70-g09d2