about summary refs log tree commit diff
path: root/src/game/client
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-09-04 18:42:26 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-09-04 18:42:26 +0000
commit7248dd641def707fd518486caa9449e672187023 (patch)
treeb68a276ec6f7ffeb6e0455ff1338eccca51919c8 /src/game/client
parentbcabb31780d4b61cd33e5ea65487523db3dec450 (diff)
downloadzcatch-7248dd641def707fd518486caa9449e672187023.tar.gz
zcatch-7248dd641def707fd518486caa9449e672187023.zip
cleaned up the browser code a bit
Diffstat (limited to 'src/game/client')
-rw-r--r--src/game/client/components/menus.hpp4
-rw-r--r--src/game/client/components/menus_browser.cpp513
2 files changed, 237 insertions, 280 deletions
diff --git a/src/game/client/components/menus.hpp b/src/game/client/components/menus.hpp
index f1c87270..a4f6ec99 100644
--- a/src/game/client/components/menus.hpp
+++ b/src/game/client/components/menus.hpp
@@ -79,6 +79,10 @@ class MENUS : public COMPONENT
 	void render_serverinfo(RECT main_view);
 	
 	// found in menus_browser.cpp
+	int selected_index;
+	void render_serverbrowser_serverlist(RECT view);
+	void render_serverbrowser_serverdetail(RECT view);
+	void render_serverbrowser_filters(RECT view);
 	void render_serverbrowser(RECT main_view);
 	
 	// found in menus_settings.cpp
diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp
index d6a92864..c213e3f1 100644
--- a/src/game/client/components/menus_browser.cpp
+++ b/src/game/client/components/menus_browser.cpp
@@ -15,54 +15,13 @@ extern "C" {
 #include <game/client/gc_render.hpp>
 #include "menus.hpp"
 
-void MENUS::render_serverbrowser(RECT main_view)
+void MENUS::render_serverbrowser_serverlist(RECT view)
 {
-	ui_draw_rect(&main_view, color_tabbar_active, CORNER_ALL, 10.0f);
-	
-	RECT view;
-	ui_margin(&main_view, 10.0f, &view);
-	
-	/*
-		+--headers--------+ +
-		|                 |
-		|                 | |     |
-		|                 | |     |
-		|                 | |     |
-		|                 | |     |
-		|                 | |     |
-		+--status---------+
-	
-	*/
-	
-	
 	RECT headers;
-	//RECT filters;
 	RECT status;
-	RECT status_toolbar;
-	RECT toolbox;
-	RECT button_box;
-	//RECT server_details;
-	//RECT server_scoreboard;
-
-	//ui_hsplit_t(&view, 20.0f, &status, &view);
-	//ui_hsplit_b(&view, 110.0f, &view, &filters);
-
-	// split off a piece for filters, details and scoreboard
-	ui_vsplit_r(&view, 200.0f, &view, &toolbox);
-	ui_hsplit_b(&toolbox, 120.0f, &toolbox, &button_box);
-
-	// server list
+	
 	ui_hsplit_t(&view, 16.0f, &headers, &view);
-	//ui_hsplit_b(&view, 110.0f, &view, &filters);
-	//ui_hsplit_b(&view, 5.0f, &view, 0);
-	ui_hsplit_b(&view, 30.0f, &view, &status_toolbar);
 	ui_hsplit_b(&view, 20.0f, &view, &status);
-
-	//ui_vsplit_r(&filters, 300.0f, &filters, &toolbox);
-	//ui_vsplit_r(&filters, 150.0f, &filters, 0);
-
-	//ui_vsplit_mid(&filters, &filters, &toolbox);
-	//ui_vsplit_r(&filters, 50.0f, &filters, 0);
 	
 	// split of the scrollbar
 	ui_draw_rect(&headers, vec4(1,1,1,0.25f), CORNER_T, 5.0f);
@@ -195,9 +154,10 @@ void MENUS::render_serverbrowser(RECT main_view)
 	view.y -= scrollvalue*scrollnum*cols[0].rect.h;
 	
 	int new_selected = -1;
-	int selected_index = -1;
 	int num_players = 0;
 
+	selected_index = -1;
+
 	for (int i = 0; i < num_servers; i++)
 	{
 		SERVER_INFO *item = client_serverbrowse_sorted_get(i);
@@ -346,239 +306,276 @@ void MENUS::render_serverbrowser(RECT main_view)
 			client_connect(config.ui_server_address);
 	}
 	
-	SERVER_INFO *selected_server = client_serverbrowse_sorted_get(selected_index);
-	//RECT server_header;
-	
-	static int toolbox_page = 0;
-	
-	ui_vsplit_l(&toolbox, 5.0f, 0, &toolbox);
 
-	// do tabbar
+	// render status
+	ui_draw_rect(&status, vec4(1,1,1,0.25f), CORNER_B, 5.0f);
+	ui_vmargin(&status, 50.0f, &status);
+	char buf[128];
+	str_format(buf, sizeof(buf), "%d of %d servers, %d players", client_serverbrowse_sorted_num(), client_serverbrowse_num(), num_players);
+	ui_do_label(&status, buf, 14.0f, -1);
+}
+
+void MENUS::render_serverbrowser_filters(RECT view)
+{
+	// filters
+	RECT button;
+
+	ui_hsplit_t(&view, 5.0f, 0, &view);
+	ui_vsplit_l(&view, 5.0f, 0, &view);
+	ui_vsplit_r(&view, 5.0f, &view, 0);
+	ui_hsplit_b(&view, 5.0f, &view, 0);
+
+	// render filters
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	if (ui_do_button(&config.b_filter_empty, "Has people playing", config.b_filter_empty, &button, ui_draw_checkbox, 0))
+		config.b_filter_empty ^= 1;
+
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	if (ui_do_button(&config.b_filter_full, "Server not full", config.b_filter_full, &button, ui_draw_checkbox, 0))
+		config.b_filter_full ^= 1;
+
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	if (ui_do_button(&config.b_filter_pw, "No password", config.b_filter_pw, &button, ui_draw_checkbox, 0))
+		config.b_filter_pw ^= 1;
+
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	if (ui_do_button((char *)&config.b_filter_compatversion, "Compatible Version", config.b_filter_compatversion, &button, ui_draw_checkbox, 0))
+		config.b_filter_compatversion ^= 1;
+
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	ui_do_label(&button, "Game types: ", 14.0f, -1);
+	ui_vsplit_l(&button, 95.0f, 0, &button);
+	ui_margin(&button, 1.0f, &button);
+	ui_do_edit_box(&config.b_filter_gametype, &button, config.b_filter_gametype, sizeof(config.b_filter_gametype), 14.0f);
+	
+	ui_hsplit_t(&view, 20.0f, &button, &view);
+	ui_do_label(&button, "Quick search: ", 14.0f, -1);
+	ui_vsplit_l(&button, 95.0f, 0, &button);
+	ui_margin(&button, 1.0f, &button);
+	ui_do_edit_box(&config.b_filter_string, &button, config.b_filter_string, sizeof(config.b_filter_string), 14.0f);
+
 	{
-		RECT tab_bar;
-		RECT tabbutton0, tabbutton1;
-		ui_hsplit_t(&toolbox, 30, &tab_bar, &toolbox);
-	
-		ui_vsplit_mid(&tab_bar, &tabbutton0, &tabbutton1);
-		ui_vsplit_r(&tabbutton0, 5.0f, &tabbutton0, 0);
-		ui_vsplit_l(&tabbutton1, 5.0f, 0, &tabbutton1);
+		ui_hsplit_t(&view, 20.0f, &button, &view);
+		RECT editbox;
+		ui_vsplit_l(&button, 40.0f, &editbox, &button);
+		ui_vsplit_l(&button, 5.0f, &button, &button);
 		
+		char buf[8];
+		str_format(buf, sizeof(buf), "%d", config.b_filter_ping);
+		ui_do_edit_box(&config.b_filter_ping, &editbox, buf, sizeof(buf), 14.0f);
+		config.b_filter_ping = atoi(buf);
 		
-		static int filters_tab = 0;
-		if (ui_do_button(&filters_tab, "Filter", toolbox_page==0, &tabbutton0, ui_draw_menu_tab_button, 0))
-			toolbox_page = 0;
-			
-		static int info_tab = 0;
-		if (ui_do_button(&info_tab, "Info", toolbox_page==1, &tabbutton1, ui_draw_menu_tab_button, 0))
-			toolbox_page = 1;
+		ui_do_label(&button, "Maximum ping", 14.0f, -1);
 	}
+	
+	//ui_vsplit_r(&buttons, 30.0f, &buttons, &button);
+	ui_hsplit_b(&view, 25.0f, &view, &button);
+	static int clear_button = 0;
+	if(ui_do_button(&clear_button, "Reset Filter", 0, &button, ui_draw_menu_button, 0))
+	{
+		config.b_filter_full = 0;
+		config.b_filter_empty = 0;
+		config.b_filter_pw = 0;
+		config.b_filter_ping = 999;
+		config.b_filter_gametype[0] = 0;
+		config.b_filter_compatversion = 1;
+		config.b_filter_string[0] = 0;
+	}		
+}
 
-	ui_draw_rect(&toolbox, vec4(0,0,0,0.15f), 0, 0);
+void MENUS::render_serverbrowser_serverdetail(RECT view)
+{
+	RECT server_details = view;
+	RECT server_scoreboard, server_header;
 	
-	ui_hsplit_t(&toolbox, 5.0f, 0, &toolbox);
+	SERVER_INFO *selected_server = client_serverbrowse_sorted_get(selected_index);
 	
-	if(toolbox_page == 0)
-	{
-		// filters
-		RECT button;
+	//ui_vsplit_l(&server_details, 10.0f, 0x0, &server_details);
 
-		ui_hsplit_t(&toolbox, 5.0f, 0, &toolbox);
-		ui_vsplit_l(&toolbox, 5.0f, 0, &toolbox);
-		ui_vsplit_r(&toolbox, 5.0f, &toolbox, 0);
-		ui_hsplit_b(&toolbox, 5.0f, &toolbox, 0);
-
-		// render filters
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		if (ui_do_button(&config.b_filter_empty, "Has people playing", config.b_filter_empty, &button, ui_draw_checkbox, 0))
-			config.b_filter_empty ^= 1;
-
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		if (ui_do_button(&config.b_filter_full, "Server not full", config.b_filter_full, &button, ui_draw_checkbox, 0))
-			config.b_filter_full ^= 1;
-
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		if (ui_do_button(&config.b_filter_pw, "No password", config.b_filter_pw, &button, ui_draw_checkbox, 0))
-			config.b_filter_pw ^= 1;
-
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		if (ui_do_button((char *)&config.b_filter_compatversion, "Compatible Version", config.b_filter_compatversion, &button, ui_draw_checkbox, 0))
-			config.b_filter_compatversion ^= 1;
-
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		ui_do_label(&button, "Game types: ", 14.0f, -1);
-		ui_vsplit_l(&button, 95.0f, 0, &button);
-		ui_margin(&button, 1.0f, &button);
-		ui_do_edit_box(&config.b_filter_gametype, &button, config.b_filter_gametype, sizeof(config.b_filter_gametype), 14.0f);
-		
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		ui_do_label(&button, "Quick search: ", 14.0f, -1);
-		ui_vsplit_l(&button, 95.0f, 0, &button);
-		ui_margin(&button, 1.0f, &button);
-		ui_do_edit_box(&config.b_filter_string, &button, config.b_filter_string, sizeof(config.b_filter_string), 14.0f);
+	// split off a piece to use for scoreboard
+	ui_hsplit_t(&server_details, 140.0f, &server_details, &server_scoreboard);
+	ui_hsplit_b(&server_details, 10.0f, &server_details, 0x0);
 
-		{
-			ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-			RECT editbox;
-			ui_vsplit_l(&button, 40.0f, &editbox, &button);
-			ui_vsplit_l(&button, 5.0f, &button, &button);
-			
-			char buf[8];
-			str_format(buf, sizeof(buf), "%d", config.b_filter_ping);
-			ui_do_edit_box(&config.b_filter_ping, &editbox, buf, sizeof(buf), 14.0f);
-			config.b_filter_ping = atoi(buf);
-			
-			ui_do_label(&button, "Maximum ping", 14.0f, -1);
-		}
-		
-		//ui_vsplit_r(&buttons, 30.0f, &buttons, &button);
-		ui_hsplit_b(&toolbox, 25.0f, &toolbox, &button);
-		static int clear_button = 0;
-		if(ui_do_button(&clear_button, "Reset Filter", 0, &button, ui_draw_menu_button, 0))
-		{
-			config.b_filter_full = 0;
-			config.b_filter_empty = 0;
-			config.b_filter_pw = 0;
-			config.b_filter_ping = 999;
-			config.b_filter_gametype[0] = 0;
-			config.b_filter_compatversion = 1;
-			config.b_filter_string[0] = 0;
-		}		
-	}
-	else if(toolbox_page == 1)
-	{
-		RECT server_details = toolbox;
-		RECT server_scoreboard, server_header;
-		
-		//ui_vsplit_l(&server_details, 10.0f, 0x0, &server_details);
+	// server details
+	const float font_size = 12.0f;
+	ui_hsplit_t(&server_details, 20.0f, &server_header, &server_details);
+	ui_draw_rect(&server_header, vec4(1,1,1,0.25f), CORNER_T, 4.0f);
+	ui_draw_rect(&server_details, vec4(0,0,0,0.15f), CORNER_B, 4.0f);
+	ui_vsplit_l(&server_header, 8.0f, 0x0, &server_header);
+	ui_do_label(&server_header, "Server Details: ", font_size+2.0f, -1);
 
-		// split off a piece to use for scoreboard
-		ui_hsplit_t(&server_details, 140.0f, &server_details, &server_scoreboard);
-		ui_hsplit_b(&server_details, 10.0f, &server_details, 0x0);
+	ui_vsplit_l(&server_details, 5.0f, 0x0, &server_details);
 
-		// server details
-		const float font_size = 12.0f;
-		ui_hsplit_t(&server_details, 20.0f, &server_header, &server_details);
-		ui_draw_rect(&server_header, vec4(1,1,1,0.25f), CORNER_T, 4.0f);
-		ui_draw_rect(&server_details, vec4(0,0,0,0.15f), CORNER_B, 4.0f);
-		ui_vsplit_l(&server_header, 8.0f, 0x0, &server_header);
-		ui_do_label(&server_header, "Server Details: ", font_size+2.0f, -1);
+	ui_margin(&server_details, 3.0f, &server_details);
 
-		ui_vsplit_l(&server_details, 5.0f, 0x0, &server_details);
+	if (selected_server)
+	{
+		RECT row;
+		static const char *labels[] = { "Version:", "Game Type:", "Progression:", "Ping:" };
 
-		ui_margin(&server_details, 3.0f, &server_details);
+		RECT left_column;
+		RECT right_column;
 
-		if (selected_server)
+		// 
 		{
-			RECT row;
-			static const char *labels[] = { "Version:", "Game Type:", "Progression:", "Ping:" };
-
-			RECT left_column;
-			RECT right_column;
-
-			// 
+			RECT button;
+			ui_hsplit_b(&server_details, 20.0f, &server_details, &button);
+			static int add_fav_button = 0;
+			if (ui_do_button(&add_fav_button, "Favorite", selected_server->favorite, &button, ui_draw_checkbox, 0))
 			{
-				RECT button;
-				ui_hsplit_b(&server_details, 20.0f, &server_details, &button);
-				static int add_fav_button = 0;
-				if (ui_do_button(&add_fav_button, "Favorite", selected_server->favorite, &button, ui_draw_checkbox, 0))
-				{
-					if(selected_server->favorite)
-						client_serverbrowse_removefavorite(selected_server->netaddr);
-					else
-						client_serverbrowse_addfavorite(selected_server->netaddr);
-				}
+				if(selected_server->favorite)
+					client_serverbrowse_removefavorite(selected_server->netaddr);
+				else
+					client_serverbrowse_addfavorite(selected_server->netaddr);
 			}
-			//ui_do_label(&row, temp, font_size, -1);		
+		}
+		//ui_do_label(&row, temp, font_size, -1);		
 
-			ui_vsplit_l(&server_details, 5.0f, 0x0, &server_details);
-			ui_vsplit_l(&server_details, 80.0f, &left_column, &right_column);
+		ui_vsplit_l(&server_details, 5.0f, 0x0, &server_details);
+		ui_vsplit_l(&server_details, 80.0f, &left_column, &right_column);
 
-			for (int i = 0; i < 4; i++)
-			{
-				ui_hsplit_t(&left_column, 15.0f, &row, &left_column);
-				ui_do_label(&row, labels[i], font_size, -1);
-			}
+		for (int i = 0; i < 4; i++)
+		{
+			ui_hsplit_t(&left_column, 15.0f, &row, &left_column);
+			ui_do_label(&row, labels[i], font_size, -1);
+		}
 
-			ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
-			ui_do_label(&row, selected_server->version, font_size, -1);
+		ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
+		ui_do_label(&row, selected_server->version, font_size, -1);
 
-			ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
-			ui_do_label(&row, selected_server->gametype, font_size, -1);
+		ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
+		ui_do_label(&row, selected_server->gametype, font_size, -1);
 
-			char temp[16];
+		char temp[16];
 
-			if(selected_server->progression < 0)
-				str_format(temp, sizeof(temp), "N/A");
-			else
-				str_format(temp, sizeof(temp), "%d%%", selected_server->progression);
-			ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
-			ui_do_label(&row, temp, font_size, -1);
+		if(selected_server->progression < 0)
+			str_format(temp, sizeof(temp), "N/A");
+		else
+			str_format(temp, sizeof(temp), "%d%%", selected_server->progression);
+		ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
+		ui_do_label(&row, temp, font_size, -1);
 
-			str_format(temp, sizeof(temp), "%d", selected_server->latency);
-			ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
-			ui_do_label(&row, temp, font_size, -1);
+		str_format(temp, sizeof(temp), "%d", selected_server->latency);
+		ui_hsplit_t(&right_column, 15.0f, &row, &right_column);
+		ui_do_label(&row, temp, font_size, -1);
 
-		}
-		
-		// server scoreboard
-		
-		ui_hsplit_b(&server_scoreboard, 10.0f, &server_scoreboard, 0x0);
-		ui_hsplit_t(&server_scoreboard, 20.0f, &server_header, &server_scoreboard);
-		ui_draw_rect(&server_header, vec4(1,1,1,0.25f), CORNER_T, 4.0f);
-		ui_draw_rect(&server_scoreboard, vec4(0,0,0,0.15f), CORNER_B, 4.0f);
-		ui_vsplit_l(&server_header, 8.0f, 0x0, &server_header);
-		ui_do_label(&server_header, "Scoreboard: ", font_size+2.0f, -1);
+	}
+	
+	// server scoreboard
+	
+	ui_hsplit_b(&server_scoreboard, 10.0f, &server_scoreboard, 0x0);
+	ui_hsplit_t(&server_scoreboard, 20.0f, &server_header, &server_scoreboard);
+	ui_draw_rect(&server_header, vec4(1,1,1,0.25f), CORNER_T, 4.0f);
+	ui_draw_rect(&server_scoreboard, vec4(0,0,0,0.15f), CORNER_B, 4.0f);
+	ui_vsplit_l(&server_header, 8.0f, 0x0, &server_header);
+	ui_do_label(&server_header, "Scoreboard: ", font_size+2.0f, -1);
 
-		ui_vsplit_l(&server_scoreboard, 5.0f, 0x0, &server_scoreboard);
+	ui_vsplit_l(&server_scoreboard, 5.0f, 0x0, &server_scoreboard);
 
-		ui_margin(&server_scoreboard, 3.0f, &server_scoreboard);
+	ui_margin(&server_scoreboard, 3.0f, &server_scoreboard);
 
-		if (selected_server)
+	if (selected_server)
+	{
+		for (int i = 0; i < selected_server->num_players; i++)
 		{
-			for (int i = 0; i < selected_server->num_players; i++)
-			{
-				RECT row;
-				char temp[16];
-				ui_hsplit_t(&server_scoreboard, 16.0f, &row, &server_scoreboard);
+			RECT row;
+			char temp[16];
+			ui_hsplit_t(&server_scoreboard, 16.0f, &row, &server_scoreboard);
 
-				str_format(temp, sizeof(temp), "%d", selected_server->players[i].score);
-				ui_do_label(&row, temp, font_size, -1);
+			str_format(temp, sizeof(temp), "%d", selected_server->players[i].score);
+			ui_do_label(&row, temp, font_size, -1);
 
-				ui_vsplit_l(&row, 25.0f, 0x0, &row);
+			ui_vsplit_l(&row, 25.0f, 0x0, &row);
+		
+			TEXT_CURSOR cursor;
+			gfx_text_set_cursor(&cursor, row.x, row.y, 12.0f, TEXTFLAG_RENDER);
 			
-				TEXT_CURSOR cursor;
-				gfx_text_set_cursor(&cursor, row.x, row.y, 12.0f, TEXTFLAG_RENDER);
-				
-				const char *name = selected_server->players[i].name;
-				if(config.b_filter_string[0])
+			const char *name = selected_server->players[i].name;
+			if(config.b_filter_string[0])
+			{
+				// highlight the parts that matches
+				const char *s = str_find_nocase(name, config.b_filter_string);
+				if(s)
 				{
-					// highlight the parts that matches
-					const char *s = str_find_nocase(name, config.b_filter_string);
-					if(s)
-					{
-						gfx_text_ex(&cursor, name, (int)(s-name));
-						gfx_text_color(0.4f,0.4f,1,1);
-						gfx_text_ex(&cursor, s, strlen(config.b_filter_string));
-						gfx_text_color(1,1,1,1);
-						gfx_text_ex(&cursor, s+strlen(config.b_filter_string), -1);
-					}
-					else
-						gfx_text_ex(&cursor, name, -1);
+					gfx_text_ex(&cursor, name, (int)(s-name));
+					gfx_text_color(0.4f,0.4f,1,1);
+					gfx_text_ex(&cursor, s, strlen(config.b_filter_string));
+					gfx_text_color(1,1,1,1);
+					gfx_text_ex(&cursor, s+strlen(config.b_filter_string), -1);
 				}
 				else
 					gfx_text_ex(&cursor, name, -1);
-				
 			}
+			else
+				gfx_text_ex(&cursor, name, -1);
+			
 		}
 	}
+}
 
-	// render status
-	ui_draw_rect(&status, vec4(1,1,1,0.25f), CORNER_B, 5.0f);
-	ui_vmargin(&status, 50.0f, &status);
-	char buf[128];
-	str_format(buf, sizeof(buf), "%d of %d servers, %d players", client_serverbrowse_sorted_num(), client_serverbrowse_num(), num_players);
-	ui_do_label(&status, buf, 14.0f, -1);
+void MENUS::render_serverbrowser(RECT main_view)
+{
+	ui_draw_rect(&main_view, color_tabbar_active, CORNER_ALL, 10.0f);
+	
+	RECT view;
+	ui_margin(&main_view, 10.0f, &view);
+	
+	/*
+		+-----------------+ +------+
+		|                 | |      |
+		|                 | | tool |
+		|                 | | box  |
+		|                 | |      |
+		|                 | +------+
+		+-----------------+  button
+	      status toolbar      box
+	*/
+	
+	
+	//RECT filters;
+	RECT status_toolbar;
+	RECT toolbox;
+	RECT button_box;
 
+	// split off a piece for filters, details and scoreboard
+	ui_vsplit_r(&view, 200.0f, &view, &toolbox);
+	ui_hsplit_b(&toolbox, 120.0f, &toolbox, &button_box);
+	ui_hsplit_b(&view, 30.0f, &view, &status_toolbar);
+
+	render_serverbrowser_serverlist(view);
+	
+	static int toolbox_page = 0;
+	
+	ui_vsplit_l(&toolbox, 5.0f, 0, &toolbox);
+
+	// do tabbar
+	{
+		RECT tab_bar;
+		RECT tabbutton0, tabbutton1;
+		ui_hsplit_t(&toolbox, 30, &tab_bar, &toolbox);
+	
+		ui_vsplit_mid(&tab_bar, &tabbutton0, &tabbutton1);
+		ui_vsplit_r(&tabbutton0, 5.0f, &tabbutton0, 0);
+		ui_vsplit_l(&tabbutton1, 5.0f, 0, &tabbutton1);
+		
+		
+		static int filters_tab = 0;
+		if (ui_do_button(&filters_tab, "Filter", toolbox_page==0, &tabbutton0, ui_draw_menu_tab_button, 0))
+			toolbox_page = 0;
+			
+		static int info_tab = 0;
+		if (ui_do_button(&info_tab, "Info", toolbox_page==1, &tabbutton1, ui_draw_menu_tab_button, 0))
+			toolbox_page = 1;
+	}
+
+	ui_draw_rect(&toolbox, vec4(0,0,0,0.15f), 0, 0);
+	
+	ui_hsplit_t(&toolbox, 5.0f, 0, &toolbox);
+	
+	if(toolbox_page == 0)
+		render_serverbrowser_filters(toolbox);
+	else if(toolbox_page == 1)
+		render_serverbrowser_serverdetail(toolbox);
 
 	{
 		ui_hsplit_t(&status_toolbar, 5.0f, 0, &status_toolbar);
@@ -599,6 +596,7 @@ void MENUS::render_serverbrowser(RECT main_view)
 		ui_do_label(&status_toolbar, "new version.. LOLZ!!", 14.0f, -1);
 	}
 	
+	// do the button box
 	{
 		
 		ui_vsplit_l(&button_box, 5.0f, 0, &button_box);
@@ -619,49 +617,4 @@ void MENUS::render_serverbrowser(RECT main_view)
 		ui_hsplit_b(&button_box, 20.0f, &button_box, &button);
 		ui_do_label(&button, "Host address:", 14.0f, -1);
 	}
-
-	// render toolbox
-	if(0)
-	{
-		RECT buttons, button;
-		ui_hsplit_b(&toolbox, 25.0f, &toolbox, &buttons);
-
-		ui_vsplit_r(&buttons, 100.0f, &buttons, &button);
-		ui_vmargin(&button, 2.0f, &button);
-		static int join_button = 0;
-		if(ui_do_button(&join_button, "Connect", 0, &button, ui_draw_menu_button, 0))
-			client_connect(config.ui_server_address);
-
-		ui_vsplit_r(&buttons, 20.0f, &buttons, &button);
-		ui_vsplit_r(&buttons, 100.0f, &buttons, &button);
-		ui_vmargin(&button, 2.0f, &button);
-		static int refresh_button = 0;
-		if(ui_do_button(&refresh_button, "Refresh", 0, &button, ui_draw_menu_button, 0))
-		{
-			if(config.ui_page == PAGE_INTERNET)
-				client_serverbrowse_refresh(0);
-			else if(config.ui_page == PAGE_LAN)
-				client_serverbrowse_refresh(1);
-		}
-
-		//ui_vsplit_r(&buttons, 30.0f, &buttons, &button);
-		ui_vsplit_l(&buttons, 120.0f, &button, &buttons);
-		static int clear_button = 0;
-		if(ui_do_button(&clear_button, "Reset Filter", 0, &button, ui_draw_menu_button, 0))
-		{
-			config.b_filter_full = 0;
-			config.b_filter_empty = 0;
-			config.b_filter_pw = 0;
-			config.b_filter_ping = 999;
-			config.b_filter_gametype[0] = 0;
-			config.b_filter_compatversion = 1;
-			config.b_filter_string[0] = 0;
-		}
-
-		
-		ui_hsplit_t(&toolbox, 20.0f, &button, &toolbox);
-		ui_do_label(&button, "Host address:", 14.0f, -1);
-		ui_vsplit_l(&button, 100.0f, 0, &button);
-		ui_do_edit_box(&config.ui_server_address, &button, config.ui_server_address, sizeof(config.ui_server_address), 14.0f);
-	}
 }