diablo controls dialog
[drnoksnes] / gui / controls.c
1 /*
2 * This file is part of DrNokSnes
3 *
4 * Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
5 *
6 * This software is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * This software is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this software; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23 #include <string.h>
24 #include <gtk/gtk.h>
25 #include <hildon/hildon-helper.h>
26
27 #if MAEMO_VERSION >= 5
28 #include <hildon/hildon-gtk.h>
29 #include <hildon/hildon-pannable-area.h>
30 #include <hildon/hildon-button.h>
31 #include <hildon/hildon-check-button.h>
32 #include <hildon/hildon-picker-button.h>
33 #include <hildon/hildon-touch-selector.h>
34 #include <pango/pango-attributes.h>
35 #else
36 #include <hildon/hildon-caption.h>
37 #endif
38
39 #include "plugin.h"
40 #include "gconf.h"
41 #include "i18n.h"
42
43 static GtkDialog* dialog;
44 static int current_player;
45 #if MAEMO_VERSION >= 5
46 static HildonCheckButton* keys_chk;
47 static HildonButton* keys_btn;
48 static HildonCheckButton* touch_chk;
49 static HildonCheckButton* touch_show_chk;
50 #else
51 static GtkCheckButton* keys_chk;
52 static GtkButton* keys_btn;
53 static GtkCheckButton* touch_chk;
54 static GtkCheckButton* touch_show_chk;
55 #endif
56
57 static void load_settings()
58 {
59         gchar key_base[kGConfPlayerPathBufferLen];
60         const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
61         gchar *key = key_base + key_len;
62
63 #if MAEMO_VERSION >= 5
64         strcpy(key, kGConfPlayerKeyboardEnable);
65         hildon_check_button_set_active(keys_chk,
66                 gconf_client_get_bool(gcc, key_base, NULL));
67 #else
68         strcpy(key, kGConfPlayerKeyboardEnable);
69         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(keys_chk),
70                 gconf_client_get_bool(gcc, key_base, NULL));
71 #endif
72 }
73
74 static void save_settings()
75 {
76         gchar key_base[kGConfPlayerPathBufferLen];
77         const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
78         gchar *key = key_base + key_len;
79
80 #if MAEMO_VERSION >= 5
81         strcpy(key, kGConfPlayerKeyboardEnable);
82         gconf_client_set_bool(gcc, key_base,
83                 hildon_check_button_get_active(keys_chk), NULL);
84 #else
85         strcpy(key, kGConfPlayerKeyboardEnable);
86         gconf_client_set_bool(gcc, key_base,
87                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(keys_chk)), NULL);
88 #endif
89 }
90
91 static void keys_btn_callback(GtkWidget * button, gpointer data)
92 {
93         keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
94 }
95
96 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
97 {
98         if (response == GTK_RESPONSE_OK) {
99                 save_settings();
100                 settings_update_controls(current_player);
101         }
102
103         gtk_widget_destroy(GTK_WIDGET(dialog));
104 }
105
106 #if MAEMO_VERSION >= 5
107 static void set_button_layout(HildonButton* button,
108  GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
109 {
110         hildon_button_add_title_size_group(button, titles_size_group);
111         hildon_button_add_value_size_group(button, values_size_group);
112         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
113 }
114 #endif
115
116 gchar* controls_describe(int player)
117 {
118         static gchar description[128];
119
120         gchar key_base[kGConfPlayerPathBufferLen];
121         const int key_len = sprintf(key_base, kGConfPlayerPath, player);
122         gchar *key = key_base + key_len;
123
124         description[0] = '\0';
125
126         strcpy(key, kGConfPlayerKeyboardEnable);
127         if (gconf_client_get_bool(gcc, key_base, NULL)) {
128                 strcpy(description, _("Keyboard"));
129         }
130
131         if (description[0] == '\0') {
132                 strcpy(description, _("Disabled"));
133         }
134
135         return description;
136 }
137
138 void controls_dialog(GtkWindow* parent, int player)
139 {
140         gchar* title = g_strdup_printf(_("Player %d controls"), player);
141         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
142                 parent, GTK_DIALOG_MODAL,
143                 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
144                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
145         g_free(title);
146
147         current_player = player;
148
149 #if MAEMO_VERSION >= 5
150         GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
151         HildonPannableArea * pannable =
152                 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
153         GtkSizeGroup * titles_size_group =
154                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
155         GtkSizeGroup * values_size_group =
156                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
157         PangoAttrList *pattrlist = pango_attr_list_new();
158         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
159         attr->start_index = 0;
160         attr->end_index = G_MAXINT;
161         pango_attr_list_insert(pattrlist, attr);
162
163         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys")));
164         gtk_label_set_attributes(separator_1, pattrlist);
165         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
166
167         keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
168                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
169         gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard"));
170         set_button_layout(HILDON_BUTTON(keys_chk),
171                 titles_size_group, values_size_group);
172
173         keys_btn = HILDON_BUTTON(hildon_button_new_with_text(
174                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
175                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
176                 _("Configure keys…"), NULL));
177         set_button_layout(HILDON_BUTTON(keys_btn),
178                 titles_size_group, values_size_group);
179         g_signal_connect(G_OBJECT(keys_btn), "clicked",
180                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
181
182         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen")));
183         gtk_label_set_attributes(separator_2, pattrlist);
184         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
185
186         touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
187                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
188         gtk_button_set_label(GTK_BUTTON(touch_chk),
189                 _("Enable touchscreen buttons"));
190         set_button_layout(HILDON_BUTTON(touch_chk),
191                 titles_size_group, values_size_group);
192                 
193         touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
194                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
195         gtk_button_set_label(GTK_BUTTON(touch_show_chk),
196                 _("Show on-screen button grid"));
197         set_button_layout(HILDON_BUTTON(touch_show_chk),
198                 titles_size_group, values_size_group);
199
200         GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer")));
201         gtk_label_set_attributes(separator_3, pattrlist);
202         gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER);
203         
204         GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote")));
205         gtk_label_set_attributes(separator_4, pattrlist);
206         gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER);
207         
208         GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote")));
209         gtk_label_set_attributes(separator_5, pattrlist);
210         gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER);
211
212         gtk_box_pack_start(box, GTK_WIDGET(separator_1),
213                 FALSE, FALSE, HILDON_MARGIN_HALF);
214         gtk_box_pack_start(box, GTK_WIDGET(keys_chk),
215                 FALSE, FALSE, 0);
216         gtk_box_pack_start(box, GTK_WIDGET(keys_btn),
217                 FALSE, FALSE, 0);
218         gtk_box_pack_start(box, GTK_WIDGET(separator_2),
219                 FALSE, FALSE, HILDON_MARGIN_HALF);
220         gtk_box_pack_start(box, GTK_WIDGET(touch_chk),
221                 FALSE, FALSE, 0);
222         gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk),
223                 FALSE, FALSE, 0);
224         gtk_box_pack_start(box, GTK_WIDGET(separator_3),
225                 FALSE, FALSE, HILDON_MARGIN_HALF);
226         gtk_box_pack_start(box, GTK_WIDGET(separator_4),
227                 FALSE, FALSE, HILDON_MARGIN_HALF);
228         gtk_box_pack_start(box, GTK_WIDGET(separator_5),
229                 FALSE, FALSE, HILDON_MARGIN_HALF);
230
231         hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
232         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
233
234         pango_attr_list_unref(pattrlist);
235         g_object_unref(titles_size_group);
236         g_object_unref(values_size_group);
237 #else
238         GtkBox* keys_box = GTK_BOX(gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT));
239
240         keys_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
241                 _("Enable keyboard")));
242         keys_btn = GTK_BUTTON(gtk_button_new_with_label(_("Configure keys…")));
243         g_signal_connect(G_OBJECT(keys_btn), "clicked",
244                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
245
246         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_chk));
247         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_btn));
248
249         GtkWidget* sep_1 = GTK_WIDGET(gtk_hseparator_new());
250
251         GtkBox* touch_box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
252
253         touch_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
254                 _("Enable touchscreen buttons")));
255         touch_show_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
256                 _("Show on-screen button grid")));
257
258         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_chk));
259         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_show_chk));
260
261         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_box));
262         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_1);
263         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(touch_box));
264 #endif
265
266         load_settings();
267
268 #if MAEMO_VERSION >= 5
269         gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
270 #else
271         gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
272 #endif
273
274         g_signal_connect(G_OBJECT(dialog), "response",
275                                         G_CALLBACK (cb_dialog_response), NULL);
276         
277         gtk_widget_show_all(GTK_WIDGET(dialog));
278 }
279