more settings dialog tests
[drnoksnes] / gui / settings.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 "../platform/hgw.h"
40 #include "plugin.h"
41 #include "i18n.h"
42
43 struct scaler {
44         const char * id;
45         const char * name;
46 };
47
48 static struct scaler scalers[] = {
49 #if MAEMO_VERSION == 5
50 #ifdef __arm__
51         {"hdarm2x", N_("Simple 2x zoom (fast)")},
52 #else
53         {"hdsoft2x", N_("Simple 2x zoom")},
54 #endif /* __arm__ */
55         {"hdfill", N_("Fill the entire screen")},
56 #elif MAEMO_VERSION == 4
57 #ifdef __arm__
58         {"xsp", N_("Antialiased 2x zoom (fast)")},
59         {"arm2x", N_("Simple 2x zoom")},
60 #else
61         {"soft2x", N_("Simple 2x zoom")},
62 #endif /* __arm__ */
63 #endif /* MAEMO_VERSION */
64         {"none", N_("Original size")},
65 };
66
67 static GtkDialog* dialog;
68 #if MAEMO_VERSION >= 5
69 static HildonButton* player1_btn;
70 static HildonCheckButton* accu_check;
71 static HildonPickerButton* scaler_picker;
72 static HildonPickerButton* speedhacks_picker;
73 #else
74 static GtkComboBox* scaler_combo;
75 #endif
76
77 static int find_scaler(const char * id)
78 {
79         gchar* lid = g_ascii_strdown(id, -1);
80         
81         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
82                 if (strcmp(id, scalers[i].id) == 0) {
83                         g_free(lid);
84                         return i;
85                 }
86         }
87
88         g_free(lid);
89         return -1;
90 }
91
92 static void fill_scaler_list(GtkWidget* w)
93 {
94         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
95 #if MAEMO_VERSION >= 5
96                 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
97                         _(scalers[i].name));
98 #else
99                 gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
100 #endif
101         }
102 }
103
104 static void load_settings()
105 {
106         gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
107         int scaler_num = find_scaler(scaler_id);
108         if (scaler_num < 0) scaler_num = 0;
109
110 #if MAEMO_VERSION >= 5
111         hildon_check_button_set_active(accu_check,
112                 gconf_client_get_bool(gcc, kGConfTransparency, NULL));
113         hildon_picker_button_set_active(scaler_picker, scaler_num);
114         hildon_picker_button_set_active(speedhacks_picker,
115                 gconf_client_get_int(gcc, kGConfSpeedhacks, NULL));
116 #else
117         gtk_combo_box_set_active(scaler_combo, scaler_num);
118 #endif
119 }
120
121 static void save_settings()
122 {
123         int scaler_num = 0;
124 #if MAEMO_VERSION >= 5
125         gconf_client_set_bool(gcc, kGConfTransparency,
126                 hildon_check_button_get_active(accu_check), NULL);
127         scaler_num = hildon_picker_button_get_active(scaler_picker);
128         gconf_client_set_int(gcc, kGConfSpeedhacks,
129                 hildon_picker_button_get_active(speedhacks_picker), NULL);
130 #else
131         scaler_num = gtk_combo_box_get_active(scaler_combo);
132 #endif
133         if (scaler_num < 0) scaler_num = 0;
134         gconf_client_set_string(gcc, kGConfScaler, scalers[scaler_num].id, NULL);
135 }
136
137 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
138 {
139         if (response == GTK_RESPONSE_OK) {
140                 save_settings();
141         }
142
143         gtk_widget_destroy(GTK_WIDGET(dialog));
144 }
145
146 #if MAEMO_VERSION >= 5
147 static void controls_btn_callback(GtkWidget * button, gpointer data)
148 {
149         controls_dialog(GTK_WINDOW(dialog));
150 }
151
152 static void set_button_layout(HildonButton* button,
153  GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
154 {
155         hildon_button_add_title_size_group(button, titles_size_group);
156         hildon_button_add_value_size_group(button, values_size_group);
157         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
158         /*hildon_button_set_title_alignment(button, 0.0, 0.5);
159         hildon_button_set_value_alignment(button, 0.0, 0.5);*/
160 }
161 #endif
162
163 void settings_dialog(GtkWindow* parent)
164 {
165         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
166                 parent, GTK_DIALOG_MODAL,
167                 GTK_STOCK_OK, GTK_RESPONSE_OK,
168                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
169
170 #if MAEMO_VERSION >= 5
171         GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
172         HildonPannableArea * pannable =
173                 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
174         GtkSizeGroup * titles_size_group =
175                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
176         GtkSizeGroup * values_size_group =
177                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
178         PangoAttrList *pattrlist = pango_attr_list_new();
179         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
180         attr->start_index = 0;
181         attr->end_index = G_MAXINT;
182         pango_attr_list_insert(pattrlist, attr);
183
184         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Controls")));
185         gtk_label_set_attributes(separator_1, pattrlist);
186         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
187
188         player1_btn = HILDON_BUTTON(hildon_button_new_with_text(
189                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
190                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
191                 _("Player 1"), _("Keyboard")));
192         set_button_layout(HILDON_BUTTON(player1_btn),
193                 titles_size_group, values_size_group);
194         g_signal_connect(G_OBJECT(player1_btn), "clicked",
195                                         G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(1));
196
197         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
198         gtk_label_set_attributes(separator_2, pattrlist);
199         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
200
201         accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
202                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
203         gtk_button_set_label(GTK_BUTTON(accu_check), _("Accurate graphics"));
204         set_button_layout(HILDON_BUTTON(accu_check),
205                 titles_size_group, values_size_group);
206
207         scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
208                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
209                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
210         hildon_button_set_title(HILDON_BUTTON(scaler_picker), _("Zoom"));
211         set_button_layout(HILDON_BUTTON(scaler_picker),
212                 titles_size_group, values_size_group);
213
214         HildonTouchSelector* scaler_sel =
215                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
216         fill_scaler_list(GTK_WIDGET(scaler_sel));
217         hildon_picker_button_set_selector(scaler_picker, scaler_sel);
218
219         speedhacks_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
220                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
221                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
222         hildon_button_set_title(HILDON_BUTTON(speedhacks_picker), _("Speedhacks"));
223         set_button_layout(HILDON_BUTTON(speedhacks_picker),
224                 titles_size_group, values_size_group);
225
226         HildonTouchSelector* speedhacks_sel =
227                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
228         hildon_touch_selector_append_text(speedhacks_sel, _("No speedhacks"));
229         hildon_touch_selector_append_text(speedhacks_sel, _("Safe hacks only"));
230         hildon_touch_selector_append_text(speedhacks_sel, _("All speedhacks"));
231         hildon_picker_button_set_selector(speedhacks_picker, speedhacks_sel);
232
233         gtk_box_pack_start(box, GTK_WIDGET(separator_1),
234                 FALSE, FALSE, HILDON_MARGIN_HALF);
235         gtk_box_pack_start(box, GTK_WIDGET(player1_btn),
236                 FALSE, FALSE, 0);
237         gtk_box_pack_start(box, GTK_WIDGET(separator_2),
238                 FALSE, FALSE, HILDON_MARGIN_HALF);
239         gtk_box_pack_start(box, GTK_WIDGET(accu_check),
240                 FALSE, FALSE, 0);
241         gtk_box_pack_start(box, GTK_WIDGET(scaler_picker),
242                 FALSE, FALSE, 0);
243         gtk_box_pack_start(box, GTK_WIDGET(speedhacks_picker),
244                 FALSE, FALSE, 0);
245
246         hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
247         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
248
249         pango_attr_list_unref(pattrlist);
250         g_object_unref(titles_size_group);
251         g_object_unref(values_size_group);
252 #else
253         xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
254         GtkWidget* xsp_caption = hildon_caption_new(NULL, 
255                 "Use hardware scaling", GTK_WIDGET(xsp_check), NULL, 
256                 HILDON_CAPTION_OPTIONAL);
257         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
258 #endif
259
260         load_settings();
261
262 #if MAEMO_VERSION >= 5
263         gtk_window_resize(GTK_WINDOW(dialog), 800, 350);
264 #else
265         gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
266 #endif
267
268         g_signal_connect(G_OBJECT(dialog), "response",
269                                         G_CALLBACK (cb_dialog_response), NULL);
270         
271         gtk_widget_show_all(GTK_WIDGET(dialog));
272 }
273