Feature #1129 ยป 0088-gtk4x-Use-GListStore-implemention-of-pages.c-host-li.patch
| client/gui-gtk-5.0/pages.c | ||
|---|---|---|
|
static GtkWidget *scenario_filename;
|
||
|
static GtkWidget *scenario_version;
|
||
|
static GtkListStore *load_store, *scenario_store, *meta_store_depr, *lan_store_depr;
|
||
|
static GtkListStore *load_store, *scenario_store;
|
||
|
static GListStore *lan_store, *meta_store;
|
||
|
static GtkListStore *server_playerlist_store;
|
||
|
static GtkWidget *server_playerlist_view;
|
||
|
static GtkTreeSelection *load_selection, *scenario_selection;
|
||
|
static GtkTreeSelection *meta_selection_depr, *lan_selection_depr;
|
||
|
static GtkSingleSelection *meta_selection, *lan_selection;
|
||
|
/* This is the current page. Invalid value at start, to be sure that it won't
|
||
| ... | ... | |
|
static void update_server_list(enum server_scan_type sstype,
|
||
|
const struct server_list *list)
|
||
|
{
|
||
|
GtkTreeSelection *sel_depr = nullptr;
|
||
|
GListStore *store = nullptr;
|
||
|
GtkTreeView *view;
|
||
|
GtkTreeIter it;
|
||
|
GtkListStore *store_depr;
|
||
|
GListStore *store;
|
||
|
GtkSingleSelection *sel = nullptr;
|
||
|
const gchar *host, *portstr;
|
||
|
int port;
|
||
|
int i;
|
||
|
switch (sstype) {
|
||
|
case SERVER_SCAN_LOCAL:
|
||
|
sel_depr = lan_selection_depr;
|
||
|
store = G_LIST_STORE(gtk_single_selection_get_model(lan_selection));
|
||
|
sel = lan_selection;
|
||
|
break;
|
||
|
case SERVER_SCAN_GLOBAL:
|
||
|
sel_depr = meta_selection_depr;
|
||
|
store = G_LIST_STORE(gtk_single_selection_get_model(meta_selection));
|
||
|
sel = meta_selection;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
if (sel_depr == nullptr) {
|
||
|
if (sel == nullptr) {
|
||
|
return;
|
||
|
}
|
||
|
store = G_LIST_STORE(gtk_single_selection_get_model(sel));
|
||
|
if (store == nullptr) {
|
||
|
return;
|
||
|
}
|
||
|
view = gtk_tree_selection_get_tree_view(sel_depr);
|
||
|
store_depr = GTK_LIST_STORE(gtk_tree_view_get_model(view));
|
||
|
gtk_list_store_clear(store_depr);
|
||
|
g_list_store_remove_all(store);
|
||
|
if (!list) {
|
||
|
if (list == nullptr) {
|
||
|
return;
|
||
|
}
|
||
| ... | ... | |
|
portstr = gtk_entry_buffer_get_text(gtk_entry_get_buffer(GTK_ENTRY(network_port)));
|
||
|
port = atoi(portstr);
|
||
|
i = 0;
|
||
|
server_list_iterate(list, pserver) {
|
||
|
FcHostRow *row = fc_host_row_new();
|
||
|
char buf[35];
|
||
|
if (pserver->humans >= 0) {
|
||
| ... | ... | |
|
} else {
|
||
|
sz_strlcpy(buf, _("Unknown"));
|
||
|
}
|
||
|
gtk_list_store_append(store_depr, &it);
|
||
|
gtk_list_store_set(store_depr, &it,
|
||
|
0, pserver->host,
|
||
|
1, pserver->port,
|
||
|
2, pserver->version,
|
||
|
3, _(pserver->state),
|
||
|
4, pserver->nplayers,
|
||
|
5, buf,
|
||
|
6, pserver->message,
|
||
|
-1);
|
||
|
if (strcmp(host, pserver->host) == 0 && port == pserver->port) {
|
||
|
gtk_tree_selection_select_iter(sel_depr, &it);
|
||
|
}
|
||
|
FcHostRow *row = fc_host_row_new();
|
||
|
row->host = pserver->host;
|
||
|
row->port = pserver->port;
|
||
| ... | ... | |
|
g_list_store_append(store, row);
|
||
|
g_object_unref(row);
|
||
|
if (strcmp(host, pserver->host) == 0 && port == pserver->port) {
|
||
|
gtk_single_selection_set_selected(sel, i);
|
||
|
}
|
||
|
i++;
|
||
|
} server_list_iterate_end;
|
||
|
}
|
||
| ... | ... | |
|
log_error("Unsupported connection status: %d", connection_status);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Connect on list item double-click.
|
||
|
**************************************************************************/
|
||
|
static void network_activate_callback_depr(GtkTreeView *view,
|
||
|
GtkTreePath *arg1,
|
||
|
GtkTreeViewColumn *arg2,
|
||
|
gpointer data)
|
||
|
{
|
||
|
connect_callback(NULL, data);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Fills the server player list with the players in the given server, or
|
||
|
clears it if there is no player data.
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Sets the host, port and player list of the selected server.
|
||
|
**************************************************************************/
|
||
|
static void network_list_callback_depr(GtkTreeSelection *select, gpointer data)
|
||
|
{
|
||
|
GtkTreeModel *model;
|
||
|
GtkTreeIter it;
|
||
|
const char *host;
|
||
|
int port;
|
||
|
char portstr[32];
|
||
|
const struct server *pserver = NULL;
|
||
|
if (!gtk_tree_selection_get_selected(select, &model, &it)) {
|
||
|
return;
|
||
|
}
|
||
|
if (select == meta_selection_depr) {
|
||
|
GtkTreePath *path;
|
||
|
struct srv_list *srvrs;
|
||
|
srvrs = server_scan_get_list(meta_scan.scan);
|
||
|
path = gtk_tree_model_get_path(model, &it);
|
||
|
if (!holding_srv_list_mutex) {
|
||
|
/* We are not yet inside mutex protected block */
|
||
|
fc_mutex_allocate(&srvrs->mutex);
|
||
|
}
|
||
|
if (srvrs->servers && path) {
|
||
|
gint pos = gtk_tree_path_get_indices(path)[0];
|
||
|
pserver = server_list_get(srvrs->servers, pos);
|
||
|
}
|
||
|
if (!holding_srv_list_mutex) {
|
||
|
/* We are not yet inside mutex protected block */
|
||
|
fc_mutex_release(&srvrs->mutex);
|
||
|
}
|
||
|
gtk_tree_path_free(path);
|
||
|
}
|
||
|
update_server_playerlist(pserver);
|
||
|
gtk_tree_model_get(model, &it, 0, &host, 1, &port, -1);
|
||
|
gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(network_host)), host, -1);
|
||
|
fc_snprintf(portstr, sizeof(portstr), "%d", port);
|
||
|
gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(network_port)), portstr, -1);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Sets the host, port and player list of the selected server.
|
||
|
**************************************************************************/
|
||
| ... | ... | |
|
{
|
||
|
char buf[256];
|
||
|
gtk_tree_selection_unselect_all(lan_selection_depr);
|
||
|
gtk_tree_selection_unselect_all(meta_selection_depr);
|
||
|
gtk_single_selection_set_selected(lan_selection, GTK_INVALID_LIST_POSITION);
|
||
|
gtk_single_selection_set_selected(meta_selection, GTK_INVALID_LIST_POSITION);
|
||
|
gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(network_login)), user_name, -1);
|
||
|
gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(network_host)), server_host, -1);
|
||
| ... | ... | |
|
{
|
||
|
GtkWidget *box, *sbox, *bbox, *hbox, *notebook;
|
||
|
GtkWidget *button, *label, *view, *sw, *table;
|
||
|
GtkTreeSelection *selection_depr;
|
||
|
GtkListStore *store;
|
||
|
GtkEventController *controller;
|
||
|
GtkListItemFactory *factory;
|
||
| ... | ... | |
|
gtk_box_append(GTK_BOX(box), notebook);
|
||
|
/* LAN pane. */
|
||
|
lan_store_depr = gtk_list_store_new(7, G_TYPE_STRING, /* host */
|
||
|
G_TYPE_INT, /* port */
|
||
|
G_TYPE_STRING, /* version */
|
||
|
G_TYPE_STRING, /* state */
|
||
|
G_TYPE_INT, /* nplayers */
|
||
|
G_TYPE_STRING, /* humans */
|
||
|
G_TYPE_STRING); /* message */
|
||
|
lan_store = g_list_store_new(FC_TYPE_HOST_ROW);
|
||
|
lan_selection = gtk_single_selection_new(G_LIST_MODEL(lan_store));
|
||
|
list = gtk_column_view_new(GTK_SELECTION_MODEL(lan_selection));
|
||
| ... | ... | |
|
column = gtk_column_view_column_new(_("Comment"), factory);
|
||
|
gtk_column_view_append_column(GTK_COLUMN_VIEW(list), column);
|
||
|
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(lan_store_depr));
|
||
|
gtk_widget_set_hexpand(view, TRUE);
|
||
|
gtk_widget_set_vexpand(view, TRUE);
|
||
|
g_object_unref(lan_store_depr);
|
||
|
gtk_tree_view_columns_autosize(GTK_TREE_VIEW(view));
|
||
|
selection_depr = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
|
||
|
lan_selection_depr = selection_depr;
|
||
|
gtk_tree_selection_set_mode(selection_depr, GTK_SELECTION_SINGLE);
|
||
|
controller = gtk_event_controller_focus_new();
|
||
|
g_signal_connect(controller, "enter",
|
||
|
G_CALLBACK(terminate_signal_processing), NULL);
|
||
|
gtk_widget_add_controller(view, controller);
|
||
|
g_signal_connect(view, "row-activated",
|
||
|
G_CALLBACK(network_activate_callback_depr), NULL);
|
||
|
g_signal_connect(selection_depr, "changed",
|
||
|
G_CALLBACK(network_list_callback_depr), NULL);
|
||
|
gtk_widget_add_controller(list, controller);
|
||
|
g_signal_connect(lan_selection, "selection-changed",
|
||
|
G_CALLBACK(network_list_callback), NULL);
|
||
|
add_treeview_column(view, _("Server Name"), G_TYPE_STRING, 0);
|
||
|
add_treeview_column(view, _("Port"), G_TYPE_INT, 1);
|
||
|
add_treeview_column(view, _("Version"), G_TYPE_STRING, 2);
|
||
|
add_treeview_column(view, _("Status"), G_TYPE_STRING, 3);
|
||
|
add_treeview_column(view, _("Players"), G_TYPE_INT, 4);
|
||
|
add_treeview_column(view, _("Humans"), G_TYPE_STRING, 5);
|
||
|
add_treeview_column(view, _("Comment"), G_TYPE_STRING, 6);
|
||
|
label = gtk_label_new_with_mnemonic(_("Local _Area Network"));
|
||
|
sw = gtk_scrolled_window_new();
|
||
|
gtk_widget_set_margin_start(sw, 4);
|
||
|
gtk_widget_set_margin_end(sw, 4);
|
||
|
gtk_widget_set_margin_top(sw, 4);
|
||
|
gtk_widget_set_margin_bottom(sw, 4);
|
||
|
gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(sw), TRUE);
|
||
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
|
||
|
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||
|
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
|
||
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, label);
|
||
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), list, label);
|
||
|
/* Metaserver pane. */
|
||
|
meta_store_depr = gtk_list_store_new(7, G_TYPE_STRING, /* host */
|
||
|
G_TYPE_INT, /* port */
|
||
|
G_TYPE_STRING, /* version */
|
||
|
G_TYPE_STRING, /* state */
|
||
|
G_TYPE_INT, /* nplayers */
|
||
|
G_TYPE_STRING, /* humans */
|
||
|
G_TYPE_STRING); /* message */
|
||
|
meta_store = g_list_store_new(FC_TYPE_HOST_ROW);
|
||
|
meta_selection = gtk_single_selection_new(G_LIST_MODEL(meta_store));
|
||
|
list = gtk_column_view_new(GTK_SELECTION_MODEL(meta_selection));
|
||
| ... | ... | |
|
column = gtk_column_view_column_new(_("Comment"), factory);
|
||
|
gtk_column_view_append_column(GTK_COLUMN_VIEW(list), column);
|
||
|
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(meta_store_depr));
|
||
|
gtk_widget_set_hexpand(view, TRUE);
|
||
|
gtk_widget_set_vexpand(view, TRUE);
|
||
|
g_object_unref(meta_store_depr);
|
||
|
gtk_tree_view_columns_autosize(GTK_TREE_VIEW(view));
|
||
|
selection_depr = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
|
||
|
meta_selection_depr = selection_depr;
|
||
|
gtk_tree_selection_set_mode(selection_depr, GTK_SELECTION_SINGLE);
|
||
|
controller = gtk_event_controller_focus_new();
|
||
|
g_signal_connect(controller, "enter",
|
||
|
G_CALLBACK(terminate_signal_processing), NULL);
|
||
|
gtk_widget_add_controller(view, controller);
|
||
|
g_signal_connect(view, "row-activated",
|
||
|
G_CALLBACK(network_activate_callback_depr), NULL);
|
||
|
g_signal_connect(selection_depr, "changed",
|
||
|
G_CALLBACK(network_list_callback_depr), NULL);
|
||
|
gtk_widget_add_controller(list, controller);
|
||
|
g_signal_connect(meta_selection, "selection-changed",
|
||
|
G_CALLBACK(network_list_callback), NULL);
|
||
|
add_treeview_column(view, _("Server Name"), G_TYPE_STRING, 0);
|
||
|
add_treeview_column(view, _("Port"), G_TYPE_INT, 1);
|
||
|
add_treeview_column(view, _("Version"), G_TYPE_STRING, 2);
|
||
|
add_treeview_column(view, _("Status"), G_TYPE_STRING, 3);
|
||
|
add_treeview_column(view, _("Players"), G_TYPE_INT, 4);
|
||
|
add_treeview_column(view, _("Humans"), G_TYPE_STRING, 5);
|
||
|
add_treeview_column(view, _("Comment"), G_TYPE_STRING, 6);
|
||
|
label = gtk_label_new_with_mnemonic(_("Internet _Metaserver"));
|
||
|
sw = gtk_scrolled_window_new();
|
||
|
gtk_widget_set_margin_start(sw, 4);
|
||
|
gtk_widget_set_margin_end(sw, 4);
|
||
|
gtk_widget_set_margin_top(sw, 4);
|
||
|
gtk_widget_set_margin_bottom(sw, 4);
|
||
|
gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(sw), TRUE);
|
||
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
|
||
|
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||
|
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
|
||
|
if (GUI_GTK_OPTION(metaserver_tab_first)) {
|
||
|
gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), sw, label);
|
||
|
gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), list, label);
|
||
|
} else {
|
||
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, label);
|
||
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), list, label);
|
||
|
}
|
||
|
/* Bottom part of the page, outside the inner notebook. */
|
||