[gnome-games] sudoku: Use GSettings



commit 7bb5395a439f41745aefe17fec32dc4c22e7516b
Author: Robert Ancell <robert ancell canonical com>
Date:   Wed Jan 11 15:40:53 2012 +0100

    sudoku: Use GSettings

 gnome-sudoku/data/Makefile.am                      |   30 +--
 gnome-sudoku/data/gnome-sudoku.schemas.in          |  329 --------------------
 .../data/org.gnome.gnome-sudoku.gschema.xml.in     |  105 +++++++
 gnome-sudoku/src/lib/gtk_goodies/Makefile.am       |    1 -
 gnome-sudoku/src/lib/gtk_goodies/gconf_wrapper.py  |  205 ------------
 gnome-sudoku/src/lib/main.py                       |   95 +++----
 gnome-sudoku/src/lib/printing.py                   |   53 ++--
 7 files changed, 179 insertions(+), 639 deletions(-)
---
diff --git a/gnome-sudoku/data/Makefile.am b/gnome-sudoku/data/Makefile.am
index c644336..f3dc54d 100644
--- a/gnome-sudoku/data/Makefile.am
+++ b/gnome-sudoku/data/Makefile.am
@@ -1,5 +1,10 @@
 SUBDIRS = icons
 
+gsettings_in_file = org.gnome.gnome-sudoku.gschema.xml.in
+gsettings_SCHEMAS = $(gsettings_in_file:.xml.in=.xml)
+ INTLTOOL_XML_NOMERGE_RULE@
+ GSETTINGS_RULES@
+
 desktopdir = $(datadir)/applications
 desktop_in_files = gnome-sudoku.desktop.in.in
 desktop_DATA = $(desktop_in_files:.desktop.in.in=.desktop)
@@ -21,23 +26,6 @@ ui_DATA = \
 	select_game.ui \
 	tracker.ui
 
-schema_in_files = gnome-sudoku.schemas.in
-if HAVE_GNOME
-schemadir = $(GCONF_SCHEMA_FILE_DIR)
-schema_DATA = $(schema_in_files:.schemas.in=.schemas)
-endif
-
-install-schemas-local: $(schema_DATA)
-if GCONF_SCHEMAS_INSTALL
-	if test -z "$(DESTDIR)" ; then \
-		for p in $^ ; do \
-			GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p 2>&1 > /dev/null; \
-		done \
-	fi
-endif
-
-install-data-local: install-schemas-local
-
 man_MANS = gnome-sudoku.6
 
 EXTRA_DIST = \
@@ -45,17 +33,15 @@ EXTRA_DIST = \
 	$(desktop_DATA)	\
 	$(puzzle_DATA)	\
 	$(ui_DATA)	\
-	$(schema_in_files) \
+	$(gsettings_in_file) \
 	$(man_MANS)
 
 CLEANFILES = \
 	$(desktop_DATA) \
-	$(schema_DATA)
+	$(gsettings_SCHEMAS)
 
 DISTCLEANFILES = \
 	$(desktop_DATA) \
-	$(schema_DATA)
-
- INTLTOOL_SCHEMAS_RULE@
+	$(gsettings_SCHEMAS)
 
 -include $(top_srcdir)/git.mk
diff --git a/gnome-sudoku/data/org.gnome.gnome-sudoku.gschema.xml.in b/gnome-sudoku/data/org.gnome.gnome-sudoku.gschema.xml.in
new file mode 100644
index 0000000..61c58ce
--- /dev/null
+++ b/gnome-sudoku/data/org.gnome.gnome-sudoku.gschema.xml.in
@@ -0,0 +1,105 @@
+<schemalist>
+  <schema id="org.gnome.gnome-sudoku" path="/org/gnome/gnome-sudoku/">
+    <key name="auto-save-interval" type="i">
+      <default>60</default>
+      <summary>The number of seconds between automatic saves</summary>
+      <description>The number of seconds between automatic saves</description>
+    </key>
+    <key name="number-of-sudokus-to-generate" type="i">
+      <default>10</default>
+    </key>
+    <key name="print-already-played-games" type="b">
+      <default>false</default>
+      <summary>Print games that have been played</summary>
+      <description>Print games that have been played</description>
+    </key>
+    <key name="mark-printed-as-played" type="b">
+      <default>false</default>
+      <summary>Mark printed games as played</summary>
+      <description>Mark printed games as played</description>
+    </key>
+    <key name="group-size" type="i">
+      <default>9</default>
+    </key>
+    <key name="generate-target-easy" type="b">
+      <default>true</default>
+    </key>
+    <key name="generate-target-medium" type="b">
+      <default>false</default>
+    </key>
+    <key name="generate-target-hard" type="b">
+      <default>true</default>
+    </key>
+    <key name="generate-target-very-hard" type="b">
+      <default>true</default>
+    </key>
+    <key name="print-easy" type="b">
+      <default>true</default>
+    </key>
+    <key name="print-medium" type="b">
+      <default>true</default>
+    </key>
+    <key name="print-hard" type="b">
+      <default>true</default>
+    </key>
+    <key name="print-very-hard" type="b">
+      <default>true</default>
+    </key>
+    <key name="minimum-number-of-new-puzzles" type="i">
+      <default>90</default>
+    </key>
+    <key name="difficulty" type="d">
+      <default>0.0</default>
+    </key>
+    <key name="width" type="i">
+      <default>700</default>
+      <summary>Width of application window in pixels</summary>
+      <description>Width of application window in pixels</description>
+    </key>
+    <key name="height" type="i">
+      <default>675</default>
+      <summary>Height of application window in pixels</summary>
+      <description>Height of application window in pixels</description>
+    </key>
+    <key name="print-multiple-sudokus-to-print" type="i">
+      <default>4</default>
+    </key>
+    <key name="highlight" type="b">
+      <default>false</default>
+      <summary>Show hint highlights</summary>
+      <description>Show hint highlights</description>
+    </key>
+    <key name="show-tracker" type="b">
+      <default>false</default>
+    </key>
+    <key name="bg-color" type="s">
+      <default>'black'</default>
+      <summary>Color of the grid border</summary>
+      <description>Color of the grid border</description>
+    </key>
+    <key name="show-toolbar" type="b">
+      <default>true</default>
+      <summary>Show the application toolbar</summary>
+      <description>Show the application toolbar</description>
+    </key>
+    <key name="show-impossible-implications" type="b">
+      <default>false</default>
+    </key>
+    <key name="always-show-hints" type="b">
+      <default>false</default>
+      <summary>Show hints</summary>
+      <description>Show hints</description>
+    </key>
+    <key name="generate-for-target" type="b">
+      <default>false</default>
+    </key>
+    <key name="generate-endlessly" type="b">
+      <default>true</default>
+    </key>
+    <key name="sudokus-per-page" type="i">
+      <default>2</default>
+      <summary>Number of puzzles to print on a page</summary>
+      <description>Number of puzzles to print on a page</description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/gnome-sudoku/src/lib/gtk_goodies/Makefile.am b/gnome-sudoku/src/lib/gtk_goodies/Makefile.am
index 9a3ad9e..1fe6f5f 100644
--- a/gnome-sudoku/src/lib/gtk_goodies/Makefile.am
+++ b/gnome-sudoku/src/lib/gtk_goodies/Makefile.am
@@ -1,7 +1,6 @@
 gnomesudokudir = $(pythondir)/gnome_sudoku/gtk_goodies
 gnomesudoku_PYTHON = \
 	dialog_extras.py	\
-	gconf_wrapper.py	\
 	__init__.py		\
 	Undo.py
 
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 73d2912..3101957 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -5,7 +5,7 @@ import threading
 import gi
 gi.require_version("Gtk", "3.0")
 
-from gi.repository import Gtk,GdkPixbuf,GObject,Pango,Gdk
+from gi.repository import Gtk,GdkPixbuf,GObject,Pango,Gdk,Gio
 from gettext import gettext as _
 from gettext import ngettext
 
@@ -20,7 +20,7 @@ import timer
 import tracker_info
 from defaults import (APPNAME, APPNAME_SHORT, AUTHORS, COPYRIGHT, DESCRIPTION, DOMAIN, 
         IMAGE_DIR, MIN_NEW_PUZZLES, UI_DIR, VERSION, WEBSITE, WEBSITE_LABEL)
-from gtk_goodies import gconf_wrapper, Undo, dialog_extras
+from gtk_goodies import Undo, dialog_extras
 from simple_debug import simple_debug, options
 
 def inactivate_new_game_etc (fun):
@@ -60,7 +60,7 @@ def inactivate_new_game_etc (fun):
         return ret
     return inactivate_new_game_etc_
 
-class UI (gconf_wrapper.GConfWrapper):
+class UI:
     ui = '''<ui>
     <menubar name="MenuBar">
       <menu name="Game" action="Game">
@@ -110,18 +110,6 @@ class UI (gconf_wrapper.GConfWrapper):
     </toolbar>
     </ui>'''
 
-    initial_prefs = {'group_size':9,
-                     'always_show_hints':False,
-                     'difficulty':0.0,
-                     'minimum_number_of_new_puzzles':MIN_NEW_PUZZLES,
-                     'highlight':False,
-                     'bg_color':'black',
-                     'show_tracker':False,
-                     'width': 700,
-                     'height': 675,
-                     'auto_save_interval':60 # auto-save interval in seconds...
-                     }
-
     @simple_debug
     def __init__ (self, run_selector = True):
         """run_selector means that we start our regular game.
@@ -130,9 +118,7 @@ class UI (gconf_wrapper.GConfWrapper):
         run_selector=False to this method to avoid running the dialog
         and allow a tester to set up a game programmatically.
         """
-        gconf_wrapper.GConfWrapper.__init__(self,
-                                            gconf_wrapper.GConfWrap('gnome-sudoku')
-                                            )
+        self.settings = Gio.Settings("org.gnome.gnome-sudoku")
         self.setup_gui()
         self.timer = timer.ActiveTimer(self.w)
         self.gsd.set_timer(self.timer)
@@ -168,11 +154,11 @@ class UI (gconf_wrapper.GConfWrapper):
             self.gsd.change_grid(choice[1], 9)
         if choice[0] == game_selector.NewOrSavedGameSelector.SAVED_GAME:
             saver.open_game(self, choice[1])
-        if self.gconf['show_toolbar']:
+        if self.settings.get_boolean('show-toolbar'):
             self.tb.show()
-        if self.gconf['always_show_hints']:
+        if self.settings.get_boolean('always-show-hints'):
             self.gsd.update_all_hints()
-        if self.gconf['highlight']:
+        if self.settings.get_boolean('highlight'):
             self.gsd.toggle_highlight(True)
 
 
@@ -181,7 +167,6 @@ class UI (gconf_wrapper.GConfWrapper):
         self.w.show()
 
     def setup_gui (self):
-        self.initialize_prefs()
         self.setup_main_window()
         self.gsd = gsudoku.SudokuGameDisplay()
         self.gsd.set_parent_for(self.w)
@@ -198,7 +183,7 @@ class UI (gconf_wrapper.GConfWrapper):
     def setup_main_window (self):
         Gtk.Window.set_default_icon_name('gnome-sudoku')
         self.w = Gtk.Window()
-        self.w.set_default_size(self.gconf['width'], self.gconf['height'])
+        self.w.set_default_size(self.settings.get_int('width'), self.settings.get_int('height'))
         self.w.set_title(APPNAME_SHORT)
         self.w.connect('configure-event', self.resize_cb)
         self.w.connect('delete-event', self.quit_cb)
@@ -286,12 +271,12 @@ class UI (gconf_wrapper.GConfWrapper):
 
     def setup_color (self):
         # setup background colors
-        bgcol = self.gconf['bg_color']
+        bgcol = self.settings.get_string('bg-color')
         if bgcol != '':
             self.gsd.set_bg_color(bgcol)
 
     def setup_autosave (self):
-        GObject.timeout_add_seconds(self.gconf['auto_save_interval'] or 60, # in seconds...
+        GObject.timeout_add_seconds(self.settings.get_int('auto-save-interval') or 60, # in seconds...
                             self.autosave)
 
     def setup_main_boxes (self):
@@ -316,34 +301,38 @@ class UI (gconf_wrapper.GConfWrapper):
         self.main_area.pack_start(self.game_box, False, False, 12)
         self.w.add(self.vb)
 
+    def wrap_toggle (self, key_name, action):
+        action.set_active(self.settings.get_boolean(key_name))
+        action.connect('toggled', self.set_key, key_name)
+
+    def set_key (self, action, key_name):
+        self.settings.set_boolean(key_name, action.get_active())
+
     def setup_toggles (self):
-        # sync up toggles with gconf values...
-        map(lambda tpl: self.gconf_wrap_toggle(*tpl),
-            [('always_show_hints',
+        # sync up toggles with gsettings values...
+        map(lambda tpl: self.wrap_toggle(*tpl),
+            [('always-show-hints',
               self.main_actions.get_action('AlwaysShowPossible')),
-             ('show_impossible_implications',
+             ('show-impossible-implications',
               self.main_actions.get_action('ShowImpossibleImplications')),
-             ('show_toolbar',
+             ('show-toolbar',
               self.main_actions.get_action('ToggleToolbar')),
              ('highlight',
               self.main_actions.get_action('ToggleHighlight')),
-             ('show_tracker',
+             ('show-tracker',
               self.main_actions.get_action('Tracker')),
              ])
 
     @simple_debug
     def start_worker_thread (self, *args):
         n_new_puzzles = self.sudoku_maker.n_puzzles(new = True)
-        try:
-            if n_new_puzzles < self.gconf['minimum_number_of_new_puzzles']:
-                self.worker = threading.Thread(target = lambda *args: self.sudoku_maker.work(limit = 5))
-                self.worker_connections = [
-                    self.timer.connect('timing-started', self.sudoku_maker.resume),
-                    self.timer.connect('timing-stopped', self.sudoku_maker.pause)
-                    ]
-                self.worker.start()
-        except gconf_wrapper.GConfError:
-            pass # assume we have enough new puzzles
+        if n_new_puzzles < self.settings.get_int('minimum-number-of-new-puzzles'):
+            self.worker = threading.Thread(target = lambda *args: self.sudoku_maker.work(limit = 5))
+            self.worker_connections = [
+                self.timer.connect('timing-started', self.sudoku_maker.resume),
+                self.timer.connect('timing-stopped', self.sudoku_maker.pause)
+                ]
+            self.worker.start()
         return True
 
     @simple_debug
@@ -369,7 +358,7 @@ class UI (gconf_wrapper.GConfWrapper):
             return
         self.won = True
         # increase difficulty for next time.
-        self.gconf['difficulty'] = self.gconf['difficulty'] + 0.1
+        self.settings.set_double('difficulty', self.settings.get_double('difficulty') + 0.1)
         self.timer.finish_timing()
         self.sudoku_tracker.finish_game(self)
         if self.timer.active_time < 60:
@@ -404,14 +393,6 @@ class UI (gconf_wrapper.GConfWrapper):
                                    )
 
     @simple_debug
-    def initialize_prefs (self):
-        for k, v in self.initial_prefs.items():
-            try:
-                self.gconf[k]
-            except:
-                self.gconf[k] = v
-
-    @simple_debug
     @inactivate_new_game_etc
     def new_cb (self, *args):
         if (self.gsd.grid and self.gsd.grid.is_changed() and not self.won):
@@ -453,8 +434,8 @@ class UI (gconf_wrapper.GConfWrapper):
 
     @simple_debug
     def resize_cb (self, widget, event, user_data=None):
-        self.gconf['width'] = event.width
-        self.gconf['height'] = event.height
+        self.settings.set_int('width', event.width)
+        self.settings.set_int('height', event.height)
 
     @simple_debug
     def quit_cb (self, *args):
@@ -550,11 +531,11 @@ class UI (gconf_wrapper.GConfWrapper):
         '''
         self.cleared_notes.append((self.tinfo.current_tracker, self.gsd.clear_notes(side)))
         # Turn off auto-hint if the player clears the bottom notes
-        if side == 'Bottom' and self.gconf['always_show_hints']:
+        if side == 'Bottom' and self.settings.get_boolean('always_show_hints'):
             always_show_hint_wdgt = self.main_actions.get_action('AlwaysShowPossible')
             always_show_hint_wdgt.activate()
         # Update the hints...in case we're redoing a clear of them
-        if self.gconf['always_show_hints']:
+        if self.settings.get_boolean ('always_show_hints'):
             self.gsd.update_all_hints()
 
     def undo_clear_notes(self):
@@ -568,7 +549,7 @@ class UI (gconf_wrapper.GConfWrapper):
             self.tracker_ui.select_tracker(cleared_tracker)
         self.gsd.apply_notelist(cleared_notes)
         # Update the hints...in case we're undoing over top of them
-        if self.gconf['always_show_hints']:
+        if self.settings.get_boolean('always-show-hints'):
             self.gsd.update_all_hints()
         # Redraw the notes
         self.gsd.update_all_notes()
@@ -703,7 +684,7 @@ class UI (gconf_wrapper.GConfWrapper):
 
     @simple_debug
     def print_multiple_games (self, *args):
-        gp = printing.GamePrinter(self.sudoku_maker, self.gconf)
+        gp = printing.GamePrinter(self.sudoku_maker)
         gp.run_dialog()
 
 class TrackerBox (Gtk.VBox):
@@ -867,7 +848,7 @@ class TrackerBox (Gtk.VBox):
         if selected_tracker_id != tracker_info.NO_TRACKER:
             self.main_ui.gsd.show_track()
         self.main_ui.gsd.update_all_notes()
-        if self.main_ui.gconf['always_show_hints']:
+        if self.main_ui.settings.get_boolean('always-show-hints'):
             self.main_ui.gsd.update_all_hints()
 
     @simple_debug
diff --git a/gnome-sudoku/src/lib/printing.py b/gnome-sudoku/src/lib/printing.py
index e2d9270..6e8e052 100644
--- a/gnome-sudoku/src/lib/printing.py
+++ b/gnome-sudoku/src/lib/printing.py
@@ -1,10 +1,9 @@
 # -*- coding: utf-8 -*-
-from gi.repository import Gtk
+from gi.repository import Gtk,Gio
 import cairo
 import time
 import os.path
 import sudoku, gsudoku, saver, defaults
-from gtk_goodies import gconf_wrapper
 from gettext import gettext as _
 
 def fit_squares_in_rectangle (width, height, n, margin = 0):
@@ -114,50 +113,54 @@ def print_sudokus(*args, **kwargs):
         error_dialog.connect("response", lambda w, id: w.destroy())
         error_dialog.show()
 
-class GamePrinter (gconf_wrapper.GConfWrapper):
+class GamePrinter:
 
     ui_file = os.path.join(defaults.UI_DIR, 'print_games.ui')
 
-    initial_prefs = {'sudokus_per_page':2,
-                     'print_multiple_sudokus_to_print':4,
-                     'print_minimum_difficulty':0,
-                     'print_maximum_difficulty':0.9,
-                     'print_easy':True,
-                     'print_medium':True,
-                     'print_hard':True,
-                     'print_very_hard':True,
-                     }
-
-    def __init__ (self, sudoku_maker, gconf):
-        gconf_wrapper.GConfWrapper.__init__(self, gconf)
+    def __init__ (self, sudoku_maker):
         self.sudoku_maker = sudoku_maker
+        self.settings = Gio.Settings("org.gnome.gnome-sudoku")
         self.builder = Gtk.Builder()
         self.builder.set_translation_domain(defaults.DOMAIN)
         self.builder.add_from_file(self.ui_file)
         # Set up toggles...
-        for key, wname in [('mark_printed_as_played', 'markAsPlayedToggle'),
-                          ('print_already_played_games', 'includeOldGamesToggle'),
-                          ('print_easy', 'easyCheckButton'),
-                          ('print_medium', 'mediumCheckButton'),
-                          ('print_hard', 'hardCheckButton'),
-                          ('print_very_hard', 'very_hardCheckButton'),
+        for key, wname in [('mark-printed-as-played', 'markAsPlayedToggle'),
+                          ('print-already-played-games', 'includeOldGamesToggle'),
+                          ('print-easy', 'easyCheckButton'),
+                          ('print-medium', 'mediumCheckButton'),
+                          ('print-hard', 'hardCheckButton'),
+                          ('print-very-hard', 'very_hardCheckButton'),
                           ]:
             setattr(self, wname, self.builder.get_object(wname))
             try:
                 assert(getattr(self, wname))
             except:
                 raise AssertionError('Widget %s does not exist' % wname)
-            self.gconf_wrap_toggle(key, getattr(self, wname))
+            self.wrap_toggle(key, getattr(self, wname))
         self.sudokusToPrintSpinButton = self.builder.get_object('sudokusToPrintSpinButton')
         self.sudokusPerPageSpinButton = self.builder.get_object('sudokusPerPageSpinButton')
-        for key, widg in [('print_multiple_sudokus_to_print', self.sudokusToPrintSpinButton.get_adjustment()),
-                          ('sudokus_per_page', self.sudokusPerPageSpinButton.get_adjustment())
+        for key, widg in [('print-multiple-sudokus-to-print', self.sudokusToPrintSpinButton.get_adjustment()),
+                          ('sudokus-per-page', self.sudokusPerPageSpinButton.get_adjustment())
                          ]:
-            self.gconf_wrap_adjustment(key, widg)
+            self.wrap_adjustment(key, widg)
         self.dialog = self.builder.get_object('dialog')
         self.dialog.set_default_response(Gtk.ResponseType.OK)
         self.dialog.connect('response', self.response_cb)
 
+    def wrap_toggle (self, key_name, action):
+        action.set_active(self.settings.get_boolean(key_name))
+        action.connect('toggled', self.set_boolean_key, key_name)
+
+    def set_boolean_key (self, action, key_name):
+        self.settings.set_boolean(key_name, action.get_active())
+
+    def wrap_adjustment (self, key_name, action):
+        action.set_value(self.settings.get_int(key_name))
+        action.connect('value-changed', self.set_int_key, key_name)
+
+    def set_int_key (self, action, key_name):
+        self.settings.set_int(key_name, action.get_value())
+
     def response_cb (self, dialog, response):
         if response not in (Gtk.ResponseType.ACCEPT, Gtk.ResponseType.OK):
             self.dialog.hide()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]