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