tSwitch from GtkCList to GtkTreeView for metaserver - vaccinewars - be a doctor… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 53ae389a1e9322660ba0a9a06e3921e80db96731 | |
parent f19f8aaba7004c96d82945b3401c6d22cd1a014b | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 16 Nov 2020 21:57:52 -0800 | |
Switch from GtkCList to GtkTreeView for metaserver | |
Use a GtkTreeView widget to show the metaserver | |
information rather than a GtkCList. The latter is | |
deprecated in GTK+2 and removed entirely in GTK+3. | |
Diffstat: | |
M src/gui_client/newgamedia.c | 151 +++++++++++++++++++----------… | |
1 file changed, 93 insertions(+), 58 deletions(-) | |
--- | |
diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c | |
t@@ -223,20 +223,31 @@ static void ConnectToServer(GtkWidget *widget, gpointer … | |
} | |
} | |
+/* Columns in metaserver list */ | |
+enum { | |
+ META_COL_SERVER = 0, | |
+ META_COL_PORT, | |
+ META_COL_VERSION, | |
+ META_COL_PLAYERS, | |
+ META_COL_COMMENT, | |
+ META_NUM_COLS | |
+}; | |
+ | |
static void FillMetaServerList(gboolean UseNewList) | |
{ | |
GtkWidget *metaserv; | |
+ GtkListStore *store; | |
ServerData *ThisServer; | |
- gchar *titles[5]; | |
+ GtkTreeIter iter; | |
GSList *ListPt; | |
- gint row, width; | |
if (UseNewList && !stgam.NewMetaList) | |
return; | |
metaserv = stgam.metaserv; | |
- gtk_clist_freeze(GTK_CLIST(metaserv)); | |
- gtk_clist_clear(GTK_CLIST(metaserv)); | |
+ store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(metaserv))); | |
+ | |
+ gtk_list_store_clear(store); | |
if (UseNewList) { | |
ClearServerList(&MetaList); | |
t@@ -245,36 +256,27 @@ static void FillMetaServerList(gboolean UseNewList) | |
} | |
for (ListPt = MetaList; ListPt; ListPt = g_slist_next(ListPt)) { | |
+ char *players; | |
ThisServer = (ServerData *)(ListPt->data); | |
- titles[0] = ThisServer->Name; | |
- titles[1] = g_strdup_printf("%d", ThisServer->Port); | |
- titles[2] = ThisServer->Version; | |
if (ThisServer->CurPlayers == -1) { | |
/* Displayed if we don't know how many players are logged on to a | |
server */ | |
- titles[3] = _("Unknown"); | |
+ players = _("Unknown"); | |
} else { | |
/* e.g. "5 of 20" means 5 players are logged on to a server, out of | |
a maximum of 20 */ | |
- titles[3] = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers, | |
+ players = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers, | |
ThisServer->MaxPlayers); | |
} | |
- titles[4] = ThisServer->Comment; | |
- row = gtk_clist_append(GTK_CLIST(metaserv), titles); | |
- gtk_clist_set_row_data(GTK_CLIST(metaserv), row, (gpointer)ThisServer); | |
- g_free(titles[1]); | |
+ gtk_list_store_append(store, &iter); | |
+ gtk_list_store_set(store, &iter, META_COL_SERVER, ThisServer->Name, | |
+ META_COL_PORT, ThisServer->Port, | |
+ META_COL_VERSION, ThisServer->Version, | |
+ META_COL_PLAYERS, players, | |
+ META_COL_COMMENT, ThisServer->Comment, -1); | |
if (ThisServer->CurPlayers != -1) | |
- g_free(titles[3]); | |
+ g_free(players); | |
} | |
- if (MetaList) { | |
- width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 4); | |
- gtk_clist_set_column_width(GTK_CLIST(metaserv), 4, width); | |
- width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 3); | |
- gtk_clist_set_column_width(GTK_CLIST(metaserv), 3, width); | |
- width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 0); | |
- gtk_clist_set_column_width(GTK_CLIST(metaserv), 0, width); | |
- } | |
- gtk_clist_thaw(GTK_CLIST(metaserv)); | |
} | |
void DisplayConnectStatus(NBStatus oldstatus, NBSocksStatus oldsocks) | |
t@@ -352,18 +354,18 @@ static void UpdateMetaServerList(GtkWidget *widget) | |
static void MetaServerConnect(GtkWidget *widget, gpointer data) | |
{ | |
- GList *selection; | |
- gint row; | |
- GtkWidget *clist; | |
- ServerData *ThisServer; | |
+ GtkTreeSelection *treesel; | |
+ GtkTreeModel *model; | |
+ GtkTreeIter iter; | |
- clist = stgam.metaserv; | |
- selection = GTK_CLIST(clist)->selection; | |
- if (selection) { | |
- row = GPOINTER_TO_INT(selection->data); | |
- ThisServer = (ServerData *)gtk_clist_get_row_data(GTK_CLIST(clist), row); | |
- AssignName(&ServerName, ThisServer->Name); | |
- Port = ThisServer->Port; | |
+ treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(stgam.metaserv)); | |
+ | |
+ if (gtk_tree_selection_get_selected(treesel, &model, &iter)) { | |
+ gchar *name; | |
+ gtk_tree_model_get(model, &iter, META_COL_SERVER, &name, | |
+ META_COL_PORT, &Port, -1); | |
+ AssignName(&ServerName, name); | |
+ g_free(name); | |
if (GetStartGamePlayerName(&stgam.play->Name)) { | |
DoConnect(); | |
t@@ -401,16 +403,54 @@ static void CloseNewGameDia(GtkWidget *widget, gpointer … | |
} | |
#ifdef NETWORKING | |
-static void metalist_row_select(GtkWidget *clist, gint row, gint column, | |
- GdkEvent *event, GtkWidget *conn_button) | |
+static void metalist_changed(GtkTreeSelection *sel, GtkWidget *conn_button) | |
{ | |
- gtk_widget_set_sensitive(conn_button, TRUE); | |
+ gtk_widget_set_sensitive(conn_button, | |
+ gtk_tree_selection_count_selected_rows(sel) > 0); | |
} | |
+#endif | |
-static void metalist_row_unselect(GtkWidget *clist, gint row, gint column, | |
- GdkEvent *event, GtkWidget *conn_button) | |
+#ifdef NETWORKING | |
+static GtkTreeModel *create_metaserver_model(void) | |
{ | |
- gtk_widget_set_sensitive(conn_button, FALSE); | |
+ GtkListStore *store; | |
+ | |
+ store = gtk_list_store_new(META_NUM_COLS, G_TYPE_STRING, G_TYPE_UINT, | |
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); | |
+ return GTK_TREE_MODEL(store); | |
+} | |
+ | |
+static GtkWidget *create_metaserver_view(void) | |
+{ | |
+ int i; | |
+ GtkWidget *view; | |
+ GtkTreeModel *model; | |
+ GtkCellRenderer *renderer; | |
+ GtkTreeViewColumn *col; | |
+ gchar *server_titles[META_NUM_COLS]; | |
+ gboolean expand[META_NUM_COLS]; | |
+ | |
+ /* Column titles of metaserver information */ | |
+ server_titles[0] = _("Server"); expand[0] = TRUE; | |
+ server_titles[1] = _("Port"); expand[1] = FALSE; | |
+ server_titles[2] = _("Version"); expand[2] = FALSE; | |
+ server_titles[3] = _("Players"); expand[3] = FALSE; | |
+ server_titles[4] = _("Comment"); expand[4] = TRUE; | |
+ | |
+ view = gtk_tree_view_new(); | |
+ renderer = gtk_cell_renderer_text_new(); | |
+ for (i = 0; i < META_NUM_COLS; ++i) { | |
+ col = gtk_tree_view_column_new_with_attributes( | |
+ server_titles[i], renderer, "text", i, NULL); | |
+ gtk_tree_view_column_set_resizable(col, TRUE); | |
+ gtk_tree_view_column_set_expand(col, expand[i]); | |
+ gtk_tree_view_insert_column(GTK_TREE_VIEW(view), col, -1); | |
+ } | |
+ model = create_metaserver_model(); | |
+ gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); | |
+ /* Tree view keeps a reference, so we can drop ours */ | |
+ g_object_unref(model); | |
+ return view; | |
} | |
#endif | |
t@@ -427,17 +467,11 @@ void NewGameDialog(Player *play) | |
#ifdef NETWORKING | |
GtkWidget *clist, *scrollwin, *table, *hbbox, *defbutton; | |
- gchar *server_titles[5], *ServerEntry, *text; | |
+ GtkTreeSelection *treesel; | |
+ gchar *ServerEntry, *text; | |
gboolean UpdateMeta = FALSE; | |
SetCurlCallback(MetaConn, glib_timeout, glib_socket); | |
- /* Column titles of metaserver information */ | |
- server_titles[0] = _("Server"); | |
- server_titles[1] = _("Port"); | |
- server_titles[2] = _("Version"); | |
- server_titles[3] = _("Players"); | |
- server_titles[4] = _("Comment"); | |
- | |
stgam.MetaConn = MetaConn; | |
stgam.NewMetaList = NULL; | |
stgam.sockstat = sockstat; | |
t@@ -571,12 +605,15 @@ void NewGameDialog(Player *play) | |
vbox2 = gtk_vbox_new(FALSE, 7); | |
gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4); | |
- clist = stgam.metaserv = | |
- gtk_scrolled_clist_new_with_titles(5, server_titles, &scrollwin); | |
- gtk_clist_column_titles_passive(GTK_CLIST(clist)); | |
- gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE); | |
- gtk_clist_set_column_width(GTK_CLIST(clist), 0, 130); | |
- gtk_clist_set_column_width(GTK_CLIST(clist), 1, 35); | |
+ clist = stgam.metaserv = create_metaserver_view(); | |
+ gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(clist), FALSE); | |
+ gtk_tree_selection_set_mode( | |
+ gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)), GTK_SELECTION_SINGLE… | |
+ scrollwin = gtk_scrolled_window_new(NULL, NULL); | |
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), | |
+ GTK_POLICY_AUTOMATIC, | |
+ GTK_POLICY_AUTOMATIC); | |
+ gtk_container_add (GTK_CONTAINER(scrollwin), clist); | |
gtk_box_pack_start(GTK_BOX(vbox2), scrollwin, TRUE, TRUE, 0); | |
t@@ -593,10 +630,8 @@ void NewGameDialog(Player *play) | |
gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
GTK_SIGNAL_FUNC(MetaServerConnect), NULL); | |
gtk_widget_set_sensitive(button, FALSE); | |
- gtk_signal_connect(GTK_OBJECT(clist), "select_row", | |
- GTK_SIGNAL_FUNC(metalist_row_select), button); | |
- gtk_signal_connect(GTK_OBJECT(clist), "unselect_row", | |
- GTK_SIGNAL_FUNC(metalist_row_unselect), button); | |
+ treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)); | |
+ g_signal_connect(treesel, "changed", G_CALLBACK(metalist_changed), button); | |
gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); | |
gtk_box_pack_start(GTK_BOX(vbox2), hbbox, FALSE, FALSE, 0); |