ce700948f90dfe67e5370a3556ae4501031e6a2c
[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
68         strcpy(key, kGConfPlayerTouchscreenEnable);
69         hildon_check_button_set_active(touch_chk,
70                 gconf_client_get_bool(gcc, key_base, NULL));
71         strcpy(key, kGConfPlayerTouchscreenShow);
72         hildon_check_button_set_active(touch_show_chk,
73                 gconf_client_get_bool(gcc, key_base, NULL));
74 #else
75         strcpy(key, kGConfPlayerKeyboardEnable);
76         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(keys_chk),
77                 gconf_client_get_bool(gcc, key_base, NULL));
78
79         strcpy(key, kGConfPlayerTouchscreenEnable);
80         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_chk),
81                 gconf_client_get_bool(gcc, key_base, NULL));
82         strcpy(key, kGConfPlayerTouchscreenShow);
83         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_show_chk),
84                 gconf_client_get_bool(gcc, key_base, NULL));
85 #endif
86 }
87
88 static void save_settings()
89 {
90         gchar key_base[kGConfPlayerPathBufferLen];
91         const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
92         gchar *key = key_base + key_len;
93
94 #if MAEMO_VERSION >= 5
95         strcpy(key, kGConfPlayerKeyboardEnable);
96         gconf_client_set_bool(gcc, key_base,
97                 hildon_check_button_get_active(keys_chk), NULL);
98
99         strcpy(key, kGConfPlayerTouchscreenEnable);
100         gconf_client_set_bool(gcc, key_base,
101                 hildon_check_button_get_active(touch_chk), NULL);
102         strcpy(key, kGConfPlayerTouchscreenShow);
103         gconf_client_set_bool(gcc, key_base,
104                 hildon_check_button_get_active(touch_show_chk), NULL);
105 #else
106         strcpy(key, kGConfPlayerKeyboardEnable);
107         gconf_client_set_bool(gcc, key_base,
108                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(keys_chk)), NULL);
109
110         strcpy(key, kGConfPlayerTouchscreenEnable);
111         gconf_client_set_bool(gcc, key_base,
112                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_chk)), NULL);
113         strcpy(key, kGConfPlayerTouchscreenShow);
114         gconf_client_set_bool(gcc, key_base,
115                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_show_chk)), NULL);
116 #endif
117 }
118
119 static void keys_btn_callback(GtkWidget * button, gpointer data)
120 {
121         keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
122 }
123
124 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
125 {
126         if (response == GTK_RESPONSE_OK) {
127                 save_settings();
128                 settings_update_controls(current_player);
129         }
130
131         gtk_widget_destroy(GTK_WIDGET(dialog));
132 }
133
134 #if MAEMO_VERSION >= 5
135 static void set_button_layout(HildonButton* button,
136  GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
137 {
138         hildon_button_add_title_size_group(button, titles_size_group);
139         hildon_button_add_value_size_group(button, values_size_group);
140         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
141 }
142 #endif
143
144 gchar* controls_describe(int player)
145 {
146         static gchar description[128];
147
148         gchar key_base[kGConfPlayerPathBufferLen];
149         const int key_len = sprintf(key_base, kGConfPlayerPath, player);
150         gchar *key = key_base + key_len;
151
152         description[0] = '\0';
153
154         strcpy(key, kGConfPlayerKeyboardEnable);
155         if (gconf_client_get_bool(gcc, key_base, NULL)) {
156                 strcpy(description, _("Keyboard"));
157         }
158
159         if (description[0] == '\0') {
160                 strcpy(description, _("Disabled"));
161         }
162
163         return description;
164 }
165
166 void controls_dialog(GtkWindow* parent, int player)
167 {
168         gchar* title = g_strdup_printf(_("Player %d controls"), player);
169         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
170                 parent, GTK_DIALOG_MODAL,
171                 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
172                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
173         g_free(title);
174
175         current_player = player;
176
177 #if MAEMO_VERSION >= 5
178         GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
179         HildonPannableArea * pannable =
180                 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
181         GtkSizeGroup * titles_size_group =
182                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
183         GtkSizeGroup * values_size_group =
184                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
185         PangoAttrList *pattrlist = pango_attr_list_new();
186         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
187         attr->start_index = 0;
188         attr->end_index = G_MAXINT;
189         pango_attr_list_insert(pattrlist, attr);
190
191         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys")));
192         gtk_label_set_attributes(separator_1, pattrlist);
193         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
194
195         keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
196                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
197         gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard"));
198         set_button_layout(HILDON_BUTTON(keys_chk),
199                 titles_size_group, values_size_group);
200
201         keys_btn = HILDON_BUTTON(hildon_button_new_with_text(
202                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
203                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
204                 _("Configure keys…"), NULL));
205         set_button_layout(HILDON_BUTTON(keys_btn),
206                 titles_size_group, values_size_group);
207         g_signal_connect(G_OBJECT(keys_btn), "clicked",
208                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
209
210         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen")));
211         gtk_label_set_attributes(separator_2, pattrlist);
212         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
213
214         touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
215                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
216         gtk_button_set_label(GTK_BUTTON(touch_chk),
217                 _("Enable touchscreen buttons"));
218         set_button_layout(HILDON_BUTTON(touch_chk),
219                 titles_size_group, values_size_group);
220                 
221         touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
222                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
223         gtk_button_set_label(GTK_BUTTON(touch_show_chk),
224                 _("Show on-screen button grid"));
225         set_button_layout(HILDON_BUTTON(touch_show_chk),
226                 titles_size_group, values_size_group);
227
228         GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer")));
229         gtk_label_set_attributes(separator_3, pattrlist);
230         gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER);
231         
232         GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote")));
233         gtk_label_set_attributes(separator_4, pattrlist);
234         gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER);
235         
236         GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote")));
237         gtk_label_set_attributes(separator_5, pattrlist);
238         gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER);
239
240         gtk_box_pack_start(box, GTK_WIDGET(separator_1),
241                 FALSE, FALSE, HILDON_MARGIN_HALF);
242         gtk_box_pack_start(box, GTK_WIDGET(keys_chk),
243                 FALSE, FALSE, 0);
244         gtk_box_pack_start(box, GTK_WIDGET(keys_btn),
245                 FALSE, FALSE, 0);
246         gtk_box_pack_start(box, GTK_WIDGET(separator_2),
247                 FALSE, FALSE, HILDON_MARGIN_HALF);
248         gtk_box_pack_start(box, GTK_WIDGET(touch_chk),
249                 FALSE, FALSE, 0);
250         gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk),
251                 FALSE, FALSE, 0);
252         gtk_box_pack_start(box, GTK_WIDGET(separator_3),
253                 FALSE, FALSE, HILDON_MARGIN_HALF);
254         gtk_box_pack_start(box, GTK_WIDGET(separator_4),
255                 FALSE, FALSE, HILDON_MARGIN_HALF);
256         gtk_box_pack_start(box, GTK_WIDGET(separator_5),
257                 FALSE, FALSE, HILDON_MARGIN_HALF);
258
259         hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
260         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
261
262         pango_attr_list_unref(pattrlist);
263         g_object_unref(titles_size_group);
264         g_object_unref(values_size_group);
265 #else
266         GtkBox* keys_box = GTK_BOX(gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT));
267
268         keys_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
269                 _("Enable keyboard")));
270         keys_btn = GTK_BUTTON(gtk_button_new_with_label(_("Configure keys…")));
271         g_signal_connect(G_OBJECT(keys_btn), "clicked",
272                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
273
274         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_chk));
275         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_btn));
276
277         GtkWidget* sep_1 = GTK_WIDGET(gtk_hseparator_new());
278
279         GtkBox* touch_box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
280
281         touch_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
282                 _("Enable touchscreen buttons")));
283         touch_show_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
284                 _("Show on-screen button grid")));
285
286         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_chk));
287         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_show_chk));
288
289         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_box));
290         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_1);
291         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(touch_box));
292 #endif
293
294         load_settings();
295
296 #if MAEMO_VERSION >= 5
297         gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
298 #else
299         gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
300 #endif
301
302         g_signal_connect(G_OBJECT(dialog), "response",
303                                         G_CALLBACK (cb_dialog_response), NULL);
304         
305         gtk_widget_show_all(GTK_WIDGET(dialog));
306 }
307