[aisleriot/wip/redesign: 6/17] all: Add prefs dialogue
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aisleriot/wip/redesign: 6/17] all: Add prefs dialogue
- Date: Wed, 3 Jul 2013 17:53:51 +0000 (UTC)
commit 77fa146f672653ebde14f29d23dde32074d91ec1
Author: Christian Persch <chpe gnome org>
Date: Tue Jul 2 20:34:06 2013 +0200
all: Add prefs dialogue
src/Makefile.am | 4 +
src/aisleriot.gresource.xml.in | 1 +
src/ar-prefs.c | 183 +++++++++++++++++++++++++++++++++++++++
src/ar-prefs.h | 43 +++++++++
src/menus.ui | 8 --
src/window.c | 185 +++++++++++-----------------------------
6 files changed, 282 insertions(+), 142 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index d79a327..c4475bc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,6 +17,8 @@ sol_SOURCES = \
ar-defines.h \
ar-game-chooser.c \
ar-game-chooser.h \
+ ar-prefs.c \
+ ar-prefs.h \
ar-resources.c \
ar-resources.h \
ar-stock.c \
@@ -85,6 +87,8 @@ sol_clutter_SOURCES = \
ar-defines.h \
ar-game-chooser.c \
ar-game-chooser.h \
+ ar-prefs.c \
+ ar-prefs.h \
ar-resources.c \
ar-resources.h \
ar-stock.c \
diff --git a/src/aisleriot.gresource.xml.in b/src/aisleriot.gresource.xml.in
index 34ed2a3..2186118 100644
--- a/src/aisleriot.gresource.xml.in
+++ b/src/aisleriot.gresource.xml.in
@@ -18,6 +18,7 @@
<gresources>
<gresource prefix="/org/gnome/aisleriot">
<file alias="ui/menus.ui" compressed="true" preprocess="xml-stripblanks">@top_srcdir@/src/menus.ui</file>
+ <file alias="ui/prefs.ui" compressed="true" preprocess="xml-stripblanks">@top_srcdir@/src/prefs.ui</file>
<file alias="art/slot.svg" compressed="true"
preprocess="xml-stripblanks">@top_srcdir@/data/slot.svg</file>
<file alias="art/baize.png">@top_srcdir@/data/baize.png</file>
</gresource>
diff --git a/src/ar-prefs.c b/src/ar-prefs.c
new file mode 100644
index 0000000..f2fdf5a
--- /dev/null
+++ b/src/ar-prefs.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright © 2009, 2013 Christian Persch <chpe gnome org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "ar-prefs.h"
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+
+#include "ar-application.h"
+#include "ar-debug.h"
+#include "ar-defines.h"
+#include "util.h"
+
+typedef struct {
+ AisleriotWindow *window;
+ GSettings *settings;
+ GtkWidget *click_checkbutton;
+ GtkWidget *sound_checkbutton;
+ GtkWidget *animations_checkbutton;
+} ArPrefsPrivate;
+
+struct _ArPrefs
+{
+ GtkDialog parent;
+
+ /*< private >*/
+ ArPrefsPrivate *priv;
+};
+
+struct _ArPrefsClass
+{
+ GtkDialogClass parent_class;
+};
+
+enum {
+ PROP_0,
+ PROP_WINDOW
+};
+
+/* private functions */
+
+static void
+response_cb (GtkWidget *dialog,
+ int response,
+ gpointer user_data)
+{
+ if (response == GTK_RESPONSE_HELP) {
+ aisleriot_show_help (dialog, NULL);
+ return;
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+/* GType impl */
+
+G_DEFINE_TYPE (ArPrefs, ar_prefs, GTK_TYPE_DIALOG)
+
+/* GObjectClass impl */
+
+static void
+ar_prefs_init (ArPrefs *prefs)
+{
+ ArPrefsPrivate *priv;
+
+ priv = prefs->priv = G_TYPE_INSTANCE_GET_PRIVATE (prefs, AR_TYPE_PREFS, ArPrefsPrivate);
+
+ priv->settings = g_settings_new (AR_SETTINGS_SCHEMA);
+
+ gtk_widget_init_template (GTK_WIDGET (prefs));
+
+ g_settings_bind (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY,
+ priv->click_checkbutton, "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY,
+ priv->sound_checkbutton, "active",
+ G_SETTINGS_BIND_DEFAULT);
+#ifdef HAVE_CLUTTER
+ g_settings_bind (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONS_KEY,
+ priv->animations_checkbutton, "active",
+ G_SETTINGS_BIND_DEFAULT);
+#else
+ gtk_widget_hide (priv->animations_checkbutton);
+#endif
+
+ g_signal_connect (prefs, "response", G_CALLBACK (response_cb), NULL);
+}
+
+static void
+ar_prefs_finalize (GObject *object)
+{
+ ArPrefs *prefs = AR_PREFS (object);
+ ArPrefsPrivate *priv = prefs->priv;
+
+ g_clear_object (&priv->settings);
+
+ G_OBJECT_CLASS (ar_prefs_parent_class)->finalize (object);
+}
+
+static void
+ar_prefs_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ArPrefs *prefs = AR_PREFS (object);
+ ArPrefsPrivate *priv = prefs->priv;
+
+ switch (property_id) {
+ case PROP_WINDOW:
+ priv->window = g_value_get_object (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+ar_prefs_class_init (ArPrefsClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (ArPrefsPrivate));
+
+ object_class->finalize = ar_prefs_finalize;
+ object_class->set_property = ar_prefs_set_property;
+
+ /**
+ * ArPrefs:window:
+ *
+ * The parent #AisleriotWindow
+ */
+ g_object_class_install_property
+ (object_class,
+ PROP_WINDOW,
+ g_param_spec_object ("window", NULL, NULL,
+ AISLERIOT_TYPE_WINDOW,
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/aisleriot/ui/prefs.ui");
+ gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, click_checkbutton);
+ gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, sound_checkbutton);
+ gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, animations_checkbutton);
+}
+
+/* public API */
+
+/**
+ * ar_prefs_new:
+ * @window: the parent #AisleriotWindow
+ *
+ * Return value: a new #ArPrefs
+ */
+GtkWidget *
+ar_prefs_new (AisleriotWindow *window)
+{
+ return g_object_new (AR_TYPE_PREFS,
+ "type", GTK_WINDOW_TOPLEVEL,
+ "transient-for", window,
+ "destroy-with-parent", TRUE,
+ "window", window,
+ NULL);
+}
diff --git a/src/ar-prefs.h b/src/ar-prefs.h
new file mode 100644
index 0000000..1a7665d
--- /dev/null
+++ b/src/ar-prefs.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2009, 2013 Christian Persch <chpe gnome org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __AR_PREFS_H__
+#define __AR_PREFS_H__
+
+#include <gtk/gtk.h>
+
+#include "window.h"
+
+G_BEGIN_DECLS
+
+#define AR_TYPE_PREFS (ar_prefs_get_type())
+#define AR_PREFS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), AR_TYPE_PREFS, ArPrefs))
+#define AR_PREFS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), AR_TYPE_PREFS, ArPrefsClass))
+#define AR_IS_PREFS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AR_TYPE_PREFS))
+#define AR_IS_PREFS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), AR_TYPE_PREFS))
+#define AR_PREFS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AR_TYPE_PREFS, ArPrefsClass))
+
+typedef struct _ArPrefs ArPrefs;
+typedef struct _ArPrefsClass ArPrefsClass;
+
+GType ar_prefs_get_type (void);
+
+GtkWidget *ar_prefs_new (AisleriotWindow *window);
+
+G_END_DECLS
+
+#endif /* __AR_PREFS_H__ */
diff --git a/src/menus.ui b/src/menus.ui
index eeeb12f..71dda79 100644
--- a/src/menus.ui
+++ b/src/menus.ui
@@ -67,14 +67,6 @@
<attribute name="action">win.show-statusbar</attribute>
</item>
<item>
- <attribute name="label" translatable="yes">_Enable Sound</attribute>
- <attribute name="action">win.enable-sound</attribute>
- </item>
- <item>
- <attribute name="label" translatable="yes">_Enable Animations</attribute>
- <attribute name="action">win.enable-animations</attribute>
- </item>
- <item>
<attribute name="label" translatable="yes">_Preferences</attribute>
<attribute name="action">win.preferences</attribute>
</item>
diff --git a/src/window.c b/src/window.c
index 117e158..fdbdb3d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -39,6 +39,7 @@
#include "ar-sound.h"
#include "ar-string-utils.h"
#include "ar-gsettings.h"
+#include "ar-prefs.h"
#ifdef HAVE_CLUTTER
#include "ar-clutter-embed.h"
@@ -104,6 +105,7 @@ struct _AisleriotWindowPrivate
GtkWidget *game_over_dialog;
GtkWidget *game_choice_dialog;
+ GtkWidget *prefs_dialog;
AisleriotStatsDialog *stats_dialog;
GtkWidget *hint_dialog;
@@ -483,8 +485,19 @@ action_preferences_cb (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
- // AisleriotWindow *window = user_data;
- //fixme
+ AisleriotWindow *window = user_data;
+ AisleriotWindowPrivate *priv = window->priv;
+
+ if (priv->prefs_dialog) {
+ gtk_window_present (GTK_WINDOW (priv->prefs_dialog));
+ return;
+ }
+
+ priv->prefs_dialog = ar_prefs_new (window);
+ g_signal_connect (priv->prefs_dialog, "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &priv->prefs_dialog);
+
+ gtk_window_present (GTK_WINDOW (priv->prefs_dialog));
}
static void
@@ -946,63 +959,49 @@ leave_fullscreen_cb (GtkAction *action,
#endif
static void
-action_click_to_move_state_cb (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
+click_to_move_changed_cb (GSettings *settings,
+ const char *key,
+ gpointer user_data)
{
AisleriotWindow *window = user_data;
AisleriotWindowPrivate *priv = window->priv;
gboolean click_to_move;
- g_simple_action_set_state (action, state);
-
- click_to_move = g_variant_get_boolean (state);
+ click_to_move = g_settings_get_boolean (settings, key);
aisleriot_game_set_click_to_move (priv->game, click_to_move);
ar_style_set_click_to_move (priv->board_style, click_to_move);
-
- g_settings_set_boolean (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY, click_to_move);
}
static void
-action_enable_sound_state_cb (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
+enable_sound_changed_cb (GSettings *settings,
+ const char *key,
+ gpointer user_data)
{
#ifdef ENABLE_SOUND
- AisleriotWindow *window = user_data;
- AisleriotWindowPrivate *priv = window->priv;
- gboolean sound_enabled;
-
- g_simple_action_set_state (action, state);
-
- sound_enabled = g_variant_get_boolean (state);
+ gboolean enabled;
- ar_sound_enable (sound_enabled);
+ enabled = g_settings_get_boolean (settings, key);
- g_settings_set_boolean (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY, sound_enabled);
+ ar_sound_enable (enabled);
#endif /* ENABLE_SOUND */
}
+#ifdef HAVE_CLUTTER
static void
-action_enable_animations_state_cb (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
+enable_animations_changed_cb (GSettings *settings,
+ const char *key,
+ gpointer user_data)
{
-#ifdef HAVE_CLUTTER
AisleriotWindow *window = user_data;
AisleriotWindowPrivate *priv = window->priv;
gboolean enabled;
- g_simple_action_set_state (action, state);
-
- enabled = g_variant_get_boolean (state);
+ enabled = g_settings_get_boolean (settings, key);
ar_style_set_enable_animations (priv->board_style, enabled);
-
- g_settings_set (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONS_KEY, sound_enabled);
-#endif /* HAVE_CLUTTER */
}
+#endif /* HAVE_CLUTTER */
static void
action_hint_cb (GSimpleAction *action,
@@ -1836,82 +1835,6 @@ game_exception_cb (AisleriotGame *game,
}
static void
-settings_changed_cb (GtkSettings *settings,
- GParamSpec *pspec,
- AisleriotWindow *window)
-{
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
- GAction *action;
- gboolean enabled;
- const char *name;
-
- if (pspec)
- name = pspec->name;
- else
- name = NULL;
-
-#ifdef HAVE_CLUTTER
- if (name == NULL || strcmp (name, "gtk-enable-animations") == 0)
- g_object_get (settings, "gtk-enable-animations", &enabled, NULL);
- else
-#endif /* HAVE_CLUTTER */
- enabled = FALSE;
-
- action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-animations");
- // fixme set visible: g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
-
-#ifdef ENABLE_SOUND
- if (name == NULL || strcmp (name, "gtk-enable-event-sounds") == 0)
- g_object_get (settings, "gtk-enable-event-sounds", &enabled, NULL);
- else
-#endif /* ENABLE_SOUND */
- enabled = FALSE;
-
- action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-sound");
- // fixme set visible: g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-}
-
-static void
-screen_changed_cb (GtkWidget *widget,
- GdkScreen *previous_screen,
- AisleriotWindow *window)
-{
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
- GdkScreen *screen;
- GtkSettings *settings;
-
- screen = gtk_widget_get_screen (widget);
- if (screen == previous_screen)
- return;
-
- if (previous_screen) {
- g_signal_handlers_disconnect_by_func (gtk_settings_get_for_screen (previous_screen),
- G_CALLBACK (settings_changed_cb),
- window);
- }
-
- if (screen == NULL)
- return;
-
-#ifdef ENABLE_SOUND
- ar_sound_init (screen);
-#endif
-
- settings = gtk_widget_get_settings (widget);
- settings_changed_cb (settings, NULL, window);
-#ifdef HAVE_CLUTTER
- g_signal_connect (settings, "notify::gtk-enable-animations",
- G_CALLBACK (settings_changed_cb), window);
-#endif
-#ifdef ENABLE_SOUND
- g_signal_connect (settings, "notify::gtk-enable-event-sounds",
- G_CALLBACK (settings_changed_cb), window);
-#endif
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-}
-
-static void
board_status_message_cb (AisleriotBoard *board,
const char *status_message,
AisleriotWindow *window)
@@ -2039,9 +1962,6 @@ aisleriot_window_init (AisleriotWindow *window)
{ "show-toolbar", action_toggle_state_cb, NULL, "true", action_show_toolbar_state_cb },
{ "show-statusbar", action_toggle_state_cb, NULL, "true", action_show_statusbar_state_cb },
- { "enable-sound", action_toggle_state_cb, NULL, "true", action_enable_sound_state_cb },
- { "enable-animations", action_toggle_state_cb, NULL, "true", action_enable_animations_state_cb },
- { "click-to-move", action_toggle_state_cb, NULL, "true", action_click_to_move_state_cb },
{ "fullscreen", action_toggle_state_cb, NULL, "false", action_fullscreen_state_cb },
};
AisleriotWindowPrivate *priv;
@@ -2049,7 +1969,6 @@ aisleriot_window_init (AisleriotWindow *window)
GAction *action;
const char *theme_name;
ArCardTheme *theme;
- guint i;
GtkStatusbar *statusbar;
GtkWidget *statusbar_hbox, *label, *time_box;
#ifdef HAVE_CLUTTER
@@ -2059,6 +1978,7 @@ aisleriot_window_init (AisleriotWindow *window)
priv = window->priv = AISLERIOT_WINDOW_GET_PRIVATE (window);
priv->settings = g_settings_new (AR_SETTINGS_SCHEMA);
+
priv->state_settings = ar_application_state_settings_new (AR_APPLICATION (g_application_get_default ()),
AR_STATE_SCHEMA);
@@ -2208,39 +2128,17 @@ aisleriot_window_init (AisleriotWindow *window)
priv->toolbar_visible = g_settings_get_boolean (priv->settings, AR_SETTINGS_SHOW_TOOLBAR_KEY);
g_action_change_state (action, g_variant_new_boolean (priv->toolbar_visible));
- action = g_action_map_lookup_action (G_ACTION_MAP (window), "click-to-move");
- g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings,
AR_SETTINGS_CLICK_TO_MOVE_KEY)));
-
#if 0 // fixme
action = gtk_action_group_get_action (priv->action_group, "RecentMenu");
g_object_set (action, "hide-if-empty", FALSE, NULL);
#endif
-#ifdef ENABLE_SOUND
- action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-sound");
- g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings,
AR_SETTINGS_ENABLE_SOUND_KEY)));
- // fixme gtk_action_set_visible (action, ar_sound_is_available ());
-#endif /* ENABLE_SOUND */
-
action = g_action_map_lookup_action (G_ACTION_MAP (window), "show-statusbar");
priv->statusbar_visible = g_settings_get_boolean (priv->settings, AR_SETTINGS_SHOW_STATUSBAR_KEY);
g_action_change_state (action, g_variant_new_boolean (priv->statusbar_visible));
set_fullscreen_actions (window, FALSE);
-#ifdef HAVE_CLUTTER
- action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-animations");
- g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings,
AR_SETTINGS_ENABLE_ANIMATIONS_KEY));
-
-#endif /* HAVE_CLUTTER */
-
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
- /* Set the action visibility and listen for animation and sound mode changes */
- screen_changed_cb (GTK_WIDGET (window), NULL, window);
- g_signal_connect (window, "screen-changed",
- G_CALLBACK (screen_changed_cb), window);
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-
/* Now set up the widgets */
main_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), main_vbox);
@@ -2282,6 +2180,21 @@ aisleriot_window_init (AisleriotWindow *window)
/* Fallback, if there is no saved size */
gtk_window_set_default_size (GTK_WINDOW (window), MIN_WIDTH, MIN_HEIGHT);
+ /* Prefs */
+ click_to_move_changed_cb (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY, window);
+ g_signal_connect (priv->settings, "changed::" AR_SETTINGS_CLICK_TO_MOVE_KEY,
+ G_CALLBACK (click_to_move_changed_cb), window);
+
+ enable_sound_changed_cb (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY, window);
+ g_signal_connect (priv->settings, "changed::" AR_SETTINGS_ENABLE_SOUND_KEY,
+ G_CALLBACK (enable_sound_changed_cb), window);
+
+#ifdef HAVE_CLUTTER
+ enable_animations_changed_cb (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONSKEY, window);
+ g_signal_connect (priv->settings, "changed::" AR_SETTINGS_ENABLE_ANIMATIONS_KEY,
+ G_CALLBACK (enable_animations_changed_cb), window);
+#endif
+
/* Restore window state */
ar_gsettings_bind_window_state (AR_SETTINGS_WINDOW_STATE_PATH, GTK_WINDOW (window));
@@ -2309,6 +2222,10 @@ aisleriot_window_dispose (GObject *object)
gtk_widget_destroy (priv->game_over_dialog);
g_assert (priv->game_over_dialog == NULL);
}
+ if (priv->prefs_dialog) {
+ gtk_widget_destroy (priv->prefs_dialog);
+ g_assert (priv->prefs_dialog == NULL);
+ }
if (priv->game_choice_dialog) {
gtk_widget_destroy (priv->game_choice_dialog);
g_assert (priv->game_choice_dialog == NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]