initial scaler selector in gui
[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 <gtk/gtk.h>
24 #include <hildon/hildon-helper.h>
25
26 #if MAEMO_VERSION >= 5
27 #include <hildon/hildon-gtk.h>
28 #include <hildon/hildon-check-button.h>
29 #include <hildon/hildon-picker-button.h>
30 #include <hildon/hildon-touch-selector.h>
31 #else
32 #include <hildon/hildon-caption.h>
33 #endif
34
35 #include "../platform/hgw.h"
36 #include "plugin.h"
37 #include "i18n.h"
38
39 struct scaler {
40         const char * id;
41         const char * name;
42 };
43
44 static struct scaler scalers[] = {
45 #if MAEMO_VERSION == 5
46 #ifdef __arm__
47         {"hdarm2x", N_("Simple 2x zoom (fast)")},
48 #else
49         {"hdsoft2x", N_("Simple 2x zoom")},
50 #endif /* __arm__ */
51         {"hdfill", N_("Fill the entire screen")},
52 #elif MAEMO_VERSION == 4
53 #ifdef __arm__
54         {"xsp", N_("Antialiased 2x zoom (fast)")},
55         {"arm2x", N_("Simple 2x zoom")},
56 #else
57         {"soft2x", N_("Simple 2x zoom")},
58 #endif /* __arm__ */
59 #endif /* MAEMO_VERSION */
60         {"none", N_("Original size")},
61 };
62
63 static GtkDialog* dialog;
64 #if MAEMO_VERSION >= 5
65 static HildonCheckButton* accu_check;
66 static HildonPickerButton* scaler_picker;
67 #else
68 static GtkComboBox* scaler_combo;
69 #endif
70
71 static int find_scaler(const char * id)
72 {
73         
74 }
75
76 static void fill_scaler_list(GtkWidget* w)
77 {
78         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
79 #if MAEMO_VERSION >= 5
80                 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
81                         _(scalers[i].name));
82 #else
83                 gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
84 #endif
85         }
86 }
87
88 static void load_settings()
89 {
90 #if MAEMO_VERSION >= 5
91         hildon_check_button_set_active(accu_check,
92                 gconf_client_get_bool(gcc, kGConfTransparency, NULL));
93 #else
94         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsp_check),
95                 gconf_client_get_bool(gcc, kGConfXSP, NULL));
96 #endif
97 }
98
99 static void save_settings()
100 {
101 #if MAEMO_VERSION >= 5
102         gconf_client_set_bool(gcc, kGConfTransparency,
103                 hildon_check_button_get_active(accu_check), NULL);
104 #else
105         gconf_client_set_bool(gcc, kGConfXSP,
106                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL);
107 #endif
108 }
109
110 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
111 {
112         if (response == GTK_RESPONSE_OK) {
113                 save_settings();
114         }
115
116         gtk_widget_destroy(GTK_WIDGET(dialog));
117 }
118
119 #if MAEMO_VERSION >= 5
120 static void set_button_layout(HildonButton* button, GtkSizeGroup* sizegroup)
121 {
122         hildon_button_add_title_size_group(button, sizegroup);
123         hildon_button_add_value_size_group(button, sizegroup);
124         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
125         hildon_button_set_title_alignment(button, 0.0, 0.5);
126         hildon_button_set_value_alignment(button, 0.0, 0.5);
127 }
128 #endif
129
130 void settings_dialog(GtkWindow* parent)
131 {
132         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Settings",
133                 parent, GTK_DIALOG_MODAL,
134                 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
135                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
136
137 #if MAEMO_VERSION >= 5
138         GtkSizeGroup * size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
139         accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
140                 HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
141         gtk_button_set_label(GTK_BUTTON(accu_check), "Accurate graphics");
142         set_button_layout(HILDON_BUTTON(accu_check), size_group);
143
144         scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
145                 HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
146                 HILDON_BUTTON_ARRANGEMENT_VERTICAL));
147         hildon_button_set_title(HILDON_BUTTON(scaler_picker), "Zoom");
148         set_button_layout(HILDON_BUTTON(scaler_picker), size_group);
149
150         HildonTouchSelector* scaler_sel =
151                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
152         fill_scaler_list(GTK_WIDGET(scaler_sel));
153         hildon_picker_button_set_selector(scaler_picker, scaler_sel);
154         
155         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check),
156                 FALSE, FALSE, 0);
157         gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(scaler_picker),
158                 FALSE, FALSE, 0);
159
160         g_object_unref(size_group);
161 #else
162         xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
163         GtkWidget* xsp_caption = hildon_caption_new(NULL, 
164                 "Use hardware scaling", GTK_WIDGET(xsp_check), NULL, 
165                 HILDON_CAPTION_OPTIONAL);
166         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
167 #endif
168
169         load_settings();
170
171 #if MAEMO_VERSION >= 5
172         gtk_window_resize(GTK_WINDOW(dialog), 800, 300);
173 #else
174         gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
175 #endif
176
177         g_signal_connect(G_OBJECT(dialog), "response",
178                                         G_CALLBACK (cb_dialog_response), NULL);
179         
180         gtk_widget_show_all(GTK_WIDGET(dialog));
181 }
182