more cleanup
[drnoksnes] / gui / controls.c
index 0dedcc9..c597949 100644 (file)
 #include <gtk/gtk.h>
 #include <hildon/hildon-helper.h>
 
+#if MAEMO_VERSION >= 5
+#include <hildon/hildon-gtk.h>
+#include <hildon/hildon-pannable-area.h>
+#include <hildon/hildon-check-button.h>
+#endif
+
 #include "../platform/hgw.h"
 #include "plugin.h"
 #include "cellrendererkey.h"
 static GtkDialog* dialog;
 static GtkComboBox* combo;
 static GtkLabel* none_label;
+#if MAEMO_VERSION >= 5
+static HildonPannableArea* keys_scroll;
+#else
 static GtkScrolledWindow* keys_scroll;
+#endif
 static GtkListStore* keys_store;
 static GtkTreeView* keys_list;
-static GtkLabel* ts_label;
+#if MAEMO_VERSION >= 5
+static HildonCheckButton* ts_show_check;
+#else
+static GtkCheckButton* ts_show_check;
+#endif
 
 enum
 {
@@ -50,8 +64,12 @@ typedef struct ButtonEntry {
 } ButtonEntry;
 #define BUTTON_INITIALIZER(desc, name, default) \
        { desc, kGConfKeysPath "/" name, 0, default }
+
+#define ACTION_INITIALIZER(...) BUTTON_INITIALIZER(__VA_ARGS__)
+
 #define BUTTON_LAST    \
        { 0 }
+
 static ButtonEntry buttons[] = {
        BUTTON_INITIALIZER("A", "a", 48),
        BUTTON_INITIALIZER("B", "b", 20),
@@ -65,8 +83,12 @@ static ButtonEntry buttons[] = {
        BUTTON_INITIALIZER("Down", "down", 116),
        BUTTON_INITIALIZER("Left", "left", 113),
        BUTTON_INITIALIZER("Right", "right", 114),
-       BUTTON_INITIALIZER("Return to launcher", "quit", 9),
-       BUTTON_INITIALIZER("Fullscreen", "fullscreen", 72),
+       ACTION_INITIALIZER("Return to launcher", "quit", 9),
+       ACTION_INITIALIZER("Fullscreen", "fullscreen", 72),
+       ACTION_INITIALIZER("Quick Load 1", "quickload1", 0),
+       ACTION_INITIALIZER("Quick Save 1", "quicksave1", 0),
+       ACTION_INITIALIZER("Quick Load 2", "quickload2", 0),
+       ACTION_INITIALIZER("Quick Save 2", "quicksave2", 0),
        BUTTON_LAST
 };
 
@@ -75,16 +97,25 @@ static void show_widgets()
        gtk_widget_show_all(GTK_WIDGET(combo));
        gtk_widget_hide_all(GTK_WIDGET(none_label));
        gtk_widget_hide_all(GTK_WIDGET(keys_scroll));
-       gtk_widget_hide_all(GTK_WIDGET(ts_label));
+       gtk_widget_hide_all(GTK_WIDGET(ts_show_check));
        switch (gtk_combo_box_get_active(combo)) {
                case 0:
                        gtk_widget_show_all(GTK_WIDGET(none_label));
                        break;
-               case 1:
+               case 1: // Keys
                        gtk_widget_show_all(GTK_WIDGET(keys_scroll));
                        break;
-               case 2:
-                       gtk_widget_show_all(GTK_WIDGET(ts_label));
+               case 2: // Touchscreen
+                       gtk_widget_show_all(GTK_WIDGET(ts_show_check));
+                       break;
+               case 3: // Touchscreen + keys
+                       gtk_widget_show_all(GTK_WIDGET(keys_scroll));
+                       gtk_widget_show_all(GTK_WIDGET(ts_show_check));
+                       break;
+               case 4: // Mouse
+                       break;
+               case 5: // Mouse + keys
+                       gtk_widget_show_all(GTK_WIDGET(keys_scroll));
                        break;
        }
 }
@@ -121,6 +152,14 @@ static void load_config()
        gconf_client_preload(gcc, kGConfKeysPath, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
        gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store), load_key_config, NULL);
 
+       gboolean ts_show_active =
+               gconf_client_get_bool(gcc, kGConfDisplayControls, NULL);
+#if MAEMO_VERSION >= 5
+       hildon_check_button_set_active(ts_show_check, ts_show_active);
+#else
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ts_show_check), ts_show_active);
+#endif 
+
        show_widgets();
        gconf_value_free(mapping);
 }
@@ -196,6 +235,17 @@ cb_key_cleared(GtkCellRendererText *cell, const char *path_string,
        button_entry->scancode = 0;
 }
 
+static void cb_ts_show_toggled(void * widget, gpointer data)
+{
+       gboolean active;
+#if MAEMO_VERSION >= 5
+       active = hildon_check_button_get_active(ts_show_check);
+#else
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ts_show_check));
+#endif
+       gconf_client_set_bool(gcc, kGConfDisplayControls, active, NULL);
+}
+
 static void cb_combo_changed(GtkComboBox * widget, gpointer data)
 {
        show_widgets();
@@ -210,22 +260,22 @@ static void cb_dialog_response(GtkWidget * button, gpointer data)
 
 void controls_setup()
 {
-       GConfValue* mapping = gconf_client_get(gcc, kGConfMapping, NULL);
-
-       if (!mapping) {
-               // Key not set; setup defaults
-               int i;
-               for (i = 0; buttons[i].name; i++) {
-                       gconf_client_set_int(gcc,
-                               buttons[i].gconf_key, buttons[i].default_scancode, NULL);
-               }
+       int i;
 
-               g_debug("Loading default key mappings\n");
+       // Check if all the keys exist. If not, fill them with default values.
+       // XXX Note that not filling a key will cause HGW to crash.
 
-               gconf_client_set_int(gcc, kGConfMapping, 1, NULL);
-       } else {
-               // If this is set, consider defaults loaded.
-               gconf_value_free(mapping);
+       gconf_client_preload(gcc, kGConfKeysPath, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+       for (i = 0; buttons[i].name; i++) {
+               GConfValue *mapping = gconf_client_get(gcc, buttons[i].gconf_key, NULL);
+
+               if (!mapping) {
+                       // Not set; set to default.
+                       gconf_client_set_int(gcc, buttons[i].gconf_key,
+                               buttons[i].default_scancode, NULL);
+               } else {
+                       gconf_value_free(mapping);
+               }
        }
 }
 
@@ -239,16 +289,25 @@ void controls_dialog(GtkWindow* parent)
        gtk_combo_box_append_text(combo, "No controls/Use config file");
        gtk_combo_box_append_text(combo, "Use physical keys");
        gtk_combo_box_append_text(combo, "Use touchscreen");
+       gtk_combo_box_append_text(combo, "Use touchscreen + physical keys");
+       gtk_combo_box_append_text(combo, "Use SNES mouse");
+       gtk_combo_box_append_text(combo, "Use SNES mouse + physical keys");
 
        none_label = GTK_LABEL(gtk_label_new("Check documentation for details."));
 
-       keys_scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
-       gtk_scrolled_window_set_policy(keys_scroll,
-               GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        keys_store = GTK_LIST_STORE(gtk_list_store_new(N_COLUMNS,
                G_TYPE_STRING, G_TYPE_POINTER));
+#if MAEMO_VERSION >= 5
+       keys_list = GTK_TREE_VIEW(hildon_gtk_tree_view_new_with_model(
+               HILDON_UI_MODE_EDIT, GTK_TREE_MODEL(keys_store)));
+       keys_scroll = HILDON_PANNABLE_AREA(hildon_pannable_area_new());
+#else
        keys_list = GTK_TREE_VIEW(
                gtk_tree_view_new_with_model(GTK_TREE_MODEL(keys_store)));
+       keys_scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
+       gtk_scrolled_window_set_policy(keys_scroll,
+               GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+#endif
 
        GtkCellRenderer* renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());
        GtkTreeViewColumn * column =
@@ -264,7 +323,11 @@ void controls_dialog(GtkWindow* parent)
        column = gtk_tree_view_column_new_with_attributes("Key", renderer, NULL);
        gtk_tree_view_column_set_cell_data_func(column, renderer, accel_set_func, NULL, NULL);
        gtk_tree_view_column_set_resizable(column, FALSE);
-       gtk_tree_view_column_set_min_width(column, 240);
+#if MAEMO_VERSION >= 5
+       gtk_tree_view_column_set_min_width(column, 340);
+#else
+       gtk_tree_view_column_set_min_width(column, 250);
+#endif
        gtk_tree_view_append_column(keys_list, column);
        gtk_tree_view_set_headers_visible(keys_list, TRUE);
 
@@ -278,15 +341,27 @@ void controls_dialog(GtkWindow* parent)
                        -1);
        }
 
-       ts_label = GTK_LABEL(gtk_label_new("Not implemented."));
-
+#if MAEMO_VERSION >= 5
+       ts_show_check = 
+        HILDON_CHECK_BUTTON(hildon_check_button_new(
+               HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
+       gtk_button_set_label(GTK_BUTTON(ts_show_check), "Show onscreen buttons");
+#else
+       ts_show_check =
+        GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Show onscreen buttons"));
+#endif
+
+#if MAEMO_VERSION >= 5
+       gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
+#else
        gtk_window_resize(GTK_WINDOW(dialog), 600, 340);
+#endif
        gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(combo),
                FALSE, FALSE, HILDON_MARGIN_HALF);
        gtk_container_add(GTK_CONTAINER(keys_scroll), GTK_WIDGET(keys_list));
        gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(none_label));
        gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_scroll));
-       gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(ts_label));
+       gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(ts_show_check), FALSE, FALSE, 0);
 
        load_config();
 
@@ -298,6 +373,8 @@ void controls_dialog(GtkWindow* parent)
                                        G_CALLBACK(cb_key_edited), NULL);
        g_signal_connect(G_OBJECT(renderer), "accel_cleared",
                     G_CALLBACK(cb_key_cleared), NULL);
+       g_signal_connect(G_OBJECT(ts_show_check), "toggled",
+                                       G_CALLBACK(cb_ts_show_toggled), NULL);
 
        gtk_widget_show(GTK_WIDGET(dialog));
 }