1 /* Pioneers - Implementation of the excellent Settlers of Catan board game.
2 * Go buy a copy.
3 *
4 * Copyright (C) 2008 Roland Clobus <rclobus@bigfoot.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include "config.h"
22 #include <glib/gi18n.h>
23 #include <gtk/gtk.h>
24 #include <string.h>
25 #include "network.h"
26 #include "config-gnome.h"
27
28 #include "metaserver.h"
29
30 static void metaserver_init(GTypeInstance * instance, gpointer g_class);
31
32 /* Register the class */
metaserver_get_type(void)33 GType metaserver_get_type(void)
34 {
35 static GType sg_type = 0;
36
37 if (!sg_type) {
38 static const GTypeInfo sg_info = {
39 sizeof(MetaServerClass),
40 NULL, /* base_init */
41 NULL, /* base_finalize */
42 NULL, /* class_init */
43 NULL, /* class_finalize */
44 NULL, /* class_data */
45 sizeof(MetaServer),
46 0,
47 metaserver_init,
48 NULL
49 };
50 sg_type =
51 g_type_register_static(GTK_TYPE_GRID, "MetaServer",
52 &sg_info, 0);
53 }
54 return sg_type;
55 }
56
57 /* Build the composite widget */
metaserver_init(GTypeInstance * instance,G_GNUC_UNUSED gpointer g_class)58 static void metaserver_init(GTypeInstance * instance,
59 G_GNUC_UNUSED gpointer g_class)
60 {
61 GtkTreeIter iter;
62 GtkCellRenderer *cell;
63 gchar *default_metaserver_name;
64 gchar *custom_metaserver_name;
65 gboolean novar;
66 MetaServer *ms = METASERVER(instance);
67
68 /* Create model */
69 ms->data = gtk_list_store_new(1, G_TYPE_STRING);
70 ms->combo_box =
71 gtk_combo_box_new_with_model(GTK_TREE_MODEL(ms->data));
72
73 cell = gtk_cell_renderer_text_new();
74 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(ms->combo_box),
75 cell, TRUE);
76 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(ms->combo_box),
77 cell, "text", 0, NULL);
78
79 gtk_widget_show(ms->combo_box);
80 gtk_widget_set_hexpand(ms->combo_box, TRUE);
81 gtk_widget_set_tooltip_text(ms->combo_box,
82 /* Tooltip for the list of metaservers */
83 _("Select a metaserver"));
84 gtk_grid_attach(GTK_GRID(ms), ms->combo_box, 0, 0, 1, 1);
85
86 /* Default metaserver */
87 default_metaserver_name = get_metaserver_name(TRUE);
88 metaserver_add(ms, default_metaserver_name);
89 g_free(default_metaserver_name);
90
91 /* Custom metaserver */
92 custom_metaserver_name =
93 config_get_string
94 ("server/custom-metaserver=pioneers.game-host.org", &novar);
95 metaserver_add(ms, custom_metaserver_name);
96 g_free(custom_metaserver_name);
97
98 /* Select the first item.
99 * When later metaserver_add is called, it will set the current metaserver */
100 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ms->data), &iter);
101 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(ms->combo_box), &iter);
102 }
103
104 /* Create a new instance of the widget */
metaserver_new(void)105 GtkWidget *metaserver_new(void)
106 {
107 return GTK_WIDGET(g_object_new(metaserver_get_type(), NULL));
108 }
109
metaserver_add(MetaServer * ms,const gchar * text)110 void metaserver_add(MetaServer * ms, const gchar * text)
111 {
112 GtkTreeIter iter;
113 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ms->data), &iter)) {
114 gchar *old;
115 gboolean found = FALSE;
116 gboolean atend = FALSE;
117 do {
118 gtk_tree_model_get(GTK_TREE_MODEL(ms->data), &iter,
119 0, &old, -1);
120 if (!strcmp(text, old))
121 found = TRUE;
122 else
123 atend =
124 !gtk_tree_model_iter_next
125 (GTK_TREE_MODEL(ms->data), &iter);
126 g_free(old);
127 } while (!found && !atend);
128 if (!found)
129 gtk_list_store_insert_with_values(ms->data, &iter,
130 999, 0, text,
131 -1);
132 } else {
133 /* Was empty */
134 gtk_list_store_insert_with_values(ms->data, &iter, 999,
135 0, text, -1);
136 }
137 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(ms->combo_box), &iter);
138 }
139
metaserver_get(MetaServer * ms)140 gchar *metaserver_get(MetaServer * ms)
141 {
142 GtkTreeIter iter;
143 gchar *text;
144 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ms->combo_box), &iter);
145
146 gtk_tree_model_get(GTK_TREE_MODEL(ms->data), &iter, 0, &text, -1);
147 return text;
148 }
149