translating
[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-check-button.h>
30 #include <hildon/hildon-picker-button.h>
31 #include <hildon/hildon-touch-selector.h>
32 #include <pango/pango-attributes.h>
33 #else
34 #include <hildon/hildon-caption.h>
35 #endif
36
37 #include "../platform/hgw.h"
38 #include "plugin.h"
39 #include "i18n.h"
40
41 struct scaler {
42         const char * id;
43         const char * name;
44 };
45
46 static struct scaler scalers[] = {
47 #if MAEMO_VERSION == 5
48 #ifdef __arm__
49         {"hdarm2x", N_("Simple 2x zoom (fast)")},
50 #else
51         {"hdsoft2x", N_("Simple 2x zoom")},
52 #endif /* __arm__ */
53         {"hdfill", N_("Fill the entire screen")},
54 #elif MAEMO_VERSION == 4
55 #ifdef __arm__
56         {"xsp", N_("Antialiased 2x zoom (fast)")},
57         {"arm2x", N_("Simple 2x zoom")},
58 #else
59         {"soft2x", N_("Simple 2x zoom")},
60 #endif /* __arm__ */
61 #endif /* MAEMO_VERSION */
62         {"none", N_("Original size")},
63 };
64
65 static GtkDialog* dialog;
66 #if MAEMO_VERSION >= 5
67 static HildonCheckButton* accu_check;
68 static HildonPickerButton* scaler_picker;
69 #else
70 static GtkComboBox* scaler_combo;
71 #endif
72
73 static int find_scaler(const char * id)
74 {
75         gchar* lid = g_ascii_strdown(id, -1);
76         
77         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
78                 if (strcmp(id, scalers[i].id) == 0) {
79                         g_free(lid);
80                         return i;
81                 }
82         }
83
84         g_free(lid);
85         return -1;
86 }
87
88 static void fill_scaler_list(GtkWidget* w)
89 {
90         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
91 #if MAEMO_VERSION >= 5
92                 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
93                         _(scalers[i].name));
94 #else
95                 gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
96 #endif
97         }
98 }
99
100 static void load_settings()
101 {
102         gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
103         int scaler_num = find_scaler(scaler_id);
104         if (scaler_num < 0) scaler_num = 0;
105
106 #if MAEMO_VERSION >= 5
107         hildon_check_button_set_active(accu_check,
108                 gconf_client_get_bool(gcc, kGConfTransparency, NULL));
109         hildon_picker_button_set_active(scaler_picker, scaler_num);
110 #else
111         gtk_combo_box_set_active(scaler_combo, scaler_num);
112 #endif
113 }
114
115 static void save_settings()
116 {
117 #if MAEMO_VERSION >= 5
118         gconf_client_set_bool(gcc, kGConfTransparency,
119                 hildon_check_button_get_active(accu_check), NULL);
120 #else
121         gconf_client_set_bool(gcc, kGConfXSP,
122                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL);
123 #endif
124 }
125
126 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
127 {
128         if (response == GTK_RESPONSE_OK) {
129                 save_settings();
130         }
131
132         gtk_widget_destroy(GTK_WIDGET(dialog));
133 }
134
135 #if MAEMO_VERSION >= 5
136 static void set_button_layout(HildonButton* button, GtkSizeGroup* sizegroup)
137 {
138         hildon_button_add_title_size_group(button, sizegroup);
139         hildon_button_add_value_size_group(button, sizegroup);
140         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
141         hildon_button_set_title_alignment(button, 0.0, 0.5);
142         hildon_button_set_value_alignment(button, 0.0, 0.5);
143 }
144 #endif
145
146 void settings_dialog(GtkWindow* parent)
147 {
148         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
149                 parent, GTK_DIALOG_MODAL,
150                 GTK_STOCK_OK, GTK_RESPONSE_OK,
151                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
152
153 #if MAEMO_VERSION >= 5
154         GtkSizeGroup * size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
155         PangoAttrList *pattrlist = pango_attr_list_new();
156         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
157         attr->start_index = 0;
158         attr->end_index = G_MAXINT;
159         pango_attr_list_insert(pattrlist, attr);
160
161         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Controls")));
162         gtk_label_set_attributes(separator_1, pattrlist);
163         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
164
165         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
166         gtk_label_set_attributes(separator_2, pattrlist);
167         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
168
169         accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
170                 HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
171         gtk_button_set_label(GTK_BUTTON(accu_check), _("Accurate graphics"));
172         set_button_layout(HILDON_BUTTON(accu_check), size_group);
173
174         scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
175                 HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
176                 HILDON_BUTTON_ARRANGEMENT_VERTICAL));
177         hildon_button_set_title(HILDON_BUTTON(scaler_picker), _("Zoom"));
178         set_button_layout(HILDON_BUTTON(scaler_picker), size_group);
179
180         HildonTouchSelector* scaler_sel =
181                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
182         fill_scaler_list(GTK_WIDGET(scaler_sel));
183         hildon_picker_button_set_selector(scaler_picker, scaler_sel);
184
185         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(separator_1),
186                 FALSE, FALSE, HILDON_MARGIN_DEFAULT);
187         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(separator_2),
188                 FALSE, FALSE, HILDON_MARGIN_DEFAULT);
189         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check),
190                 FALSE, FALSE, 0);
191         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(scaler_picker),
192                 FALSE, FALSE, 0);
193
194         pango_attr_list_unref(pattrlist);
195         g_object_unref(size_group);
196 #else
197         xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
198         GtkWidget* xsp_caption = hildon_caption_new(NULL, 
199                 "Use hardware scaling", GTK_WIDGET(xsp_check), NULL, 
200                 HILDON_CAPTION_OPTIONAL);
201         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
202 #endif
203
204         load_settings();
205
206 #if MAEMO_VERSION >= 5
207         gtk_window_resize(GTK_WINDOW(dialog), 800, 300);
208 #else
209         gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
210 #endif
211
212         g_signal_connect(G_OBJECT(dialog), "response",
213                                         G_CALLBACK (cb_dialog_response), NULL);
214         
215         gtk_widget_show_all(GTK_WIDGET(dialog));
216 }
217