[gnome-games/applygsoc2009: 54/76] XXX: Basic undo/redo



commit 91460195ad28ddf576faba4ca6fb079854cdc8bc
Author: Pablo Castellano <pablog src gnome org>
Date:   Wed Sep 1 04:35:53 2010 +0200

    XXX: Basic undo/redo

 gnome-sudoku/src/lib/main.py |   33 ++++++++++++---------------------
 gnome-sudoku/src/lib/view.py |   41 ++++++++++++++++++++++-------------------
 2 files changed, 34 insertions(+), 40 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 46ffccb..29006c4 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -26,7 +26,8 @@ import tracker_box
 import tracker_info
 from defaults import (APPNAME, APPNAME_SHORT, AUTHORS, COPYRIGHT, DESCRIPTION, DOMAIN, 
         IMAGE_DIR, LICENSE, MIN_NEW_PUZZLES, UI_DIR, VERSION, WEBSITE, WEBSITE_LABEL)
-from gtk_goodies import gconf_wrapper, Undo, dialog_extras
+from gtk_goodies import gconf_wrapper, dialog_extras
+import undo
 
 logging.basicConfig()
 logger = logging.getLogger("main")
@@ -61,6 +62,7 @@ class UI (gconf_wrapper.GConfWrapper):
         self.sudoku_tracker = saver.SudokuTracker()
         self._main_model = None
         self._main_grid_vew = None
+        self._history_manager = None
         self.setup_gui()
         self.timer = timer.ActiveTimer(self.w)
         self.gsd.set_timer(self.timer)
@@ -193,13 +195,13 @@ class UI (gconf_wrapper.GConfWrapper):
     def setup_gui (self):
         self.initialize_prefs()
         self.setup_main_window()
+        self.setup_undo()
         self.gsd = gsudoku.SudokuGameDisplay() #? 
         self.gsd.set_parent_for(self.w) #?
         self.gsd.connect('puzzle-finished', self.you_win_callback) #?
         self.setup_color()
         self._setup_actions()
         return
-        self.setup_undo()
         self.setup_autosave()
         #TODO
 #        self.w.add_accel_group(self.uimanager.get_accel_group())
@@ -229,7 +231,7 @@ class UI (gconf_wrapper.GConfWrapper):
     def _setup_main_boxes(self):
         main_area = self.builder.get_object("main_area")
 
-        self._main_grid_vew = view.SudokuView(group_size=9)
+        self._main_grid_vew = view.SudokuView(9, self._history_manager)
         main_grid_container.pack_start(self._main_grid_vew, padding=6)
 
         self.tracker_ui = tracker_box.TrackerBox(self._main_grid_vew)
@@ -289,26 +291,15 @@ class UI (gconf_wrapper.GConfWrapper):
 #    def clear_notes_cb (self, *args): #?!?!?
 
     def setup_undo (self):
-        #TODO
-        return
         self.cleared = [] # used for Undo memory
         self.cleared_notes = [] # used for Undo memory
-        # Set up our UNDO stuff
-        undo_widg = self.builder.get_object('Undo')
-        redo_widg = self.builder.get_object('Redo')
-        self.history = Undo.UndoHistoryList(undo_widg, redo_widg)
-        for entry in self.gsd.__entries__.values():
-            Undo.UndoableGenericWidget(entry, self.history,
-                                       set_method = 'set_value_for_undo',
-                                       get_method = 'get_value_for_undo',
-                                       pre_change_signal = 'value-about-to-change'
-                                       )
-            Undo.UndoableGenericWidget(entry, self.history,
-                                       set_method = 'set_notes_for_undo',
-                                       get_method = 'get_notes_for_undo',
-                                       signal = 'notes-changed',
-                                       pre_change_signal = 'notes-about-to-change',
-                                       )
+        undo_action = self.builder.get_object('Undo')
+        redo_action = self.builder.get_object('Redo')
+        self._history_manager = undo.HistoryManager(undo_action, redo_action)
+        undo_action.connect("activate",
+                lambda *args: self._history_manager.undo())
+        redo_action.connect("activate",
+                lambda *args: self._history_manager.redo())
 
     def setup_autosave (self):
         gobject.timeout_add_seconds(self.gconf['auto_save_interval'] or 60, # in seconds...
diff --git a/gnome-sudoku/src/lib/view.py b/gnome-sudoku/src/lib/view.py
index 68c7fc2..d9b1f26 100644
--- a/gnome-sudoku/src/lib/view.py
+++ b/gnome-sudoku/src/lib/view.py
@@ -6,6 +6,7 @@ import gobject
 
 import colors
 import number_box
+import undo
 
 TRACKER_COLORS = [
     # Use tango colors recommended here:
@@ -151,6 +152,11 @@ class SudokuNumberGrid (gtk.AspectFrame):
         for e in self.__entries__.values():
             e.modify_bg(gtk.STATE_NORMAL, color)
 
+    def get_value(self, x, y):
+        return self.__entries__[(x, y)].get_value()
+
+#   def set_value(self, x, y): ?!?!?!?!
+
     def get_focus(self):
 	    return self.table.get_focus_child()
 
@@ -162,7 +168,7 @@ class SudokuView (SudokuNumberGrid, gobject.GObject):
             "puzzle-finished": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())
             }
 
-    def __init__(self, group_size):
+    def __init__(self, group_size, controller=None):
         SudokuNumberGrid.__init__(self, group_size)
 #        self.hint_square = None
 #        self.tinfo = tracker_info.TrackerInfo()
@@ -173,13 +179,15 @@ class SudokuView (SudokuNumberGrid, gobject.GObject):
         self._do_highlight_cells = False
 		self._notes_model = None
 
-        for e in self.__entries__.values():
-            e.show()
-            e.connect('number-changed', self._number_changed_cb)
-            e.connect('notes-changed', self._notes_changed_cb)
-            e.connect('focus-in-event', self._focus_callback)
-            e.connect('key-press-event', self._key_press_cb)
-        self.connect('focus-changed', self._highlight_cells)
+        self._controller = controller
+        if controller:
+            # if controller is not set, we don't react to any user interaction
+            for e in self.__entries__.values():
+                e.show()
+                e.connect('number-changed', self._number_changed_cb)
+                e.connect('notes-changed', self._notes_changed_cb)
+                e.connect('focus-in-event', self._focus_callback)
+                e.connect('key-press-event', self._key_press_cb)
         
         self._tracker = _Tracker(self)
 
@@ -243,17 +251,12 @@ class SudokuView (SudokuNumberGrid, gobject.GObject):
             self.__entries__[(x, y)].set_notes((top_note, bottom_note))
 
     def _number_changed_cb(self, widget, new_number):
-        print "user input: number", (widget.x, widget.y, new_number)
-        self._model.set_value(widget.x, widget.y, new_number)
-		self.update_model(widget.x, widget.y, new_number)
-
-    def _number_changed_cb(self, widget, new_number):
-        print "user input: number", (widget.x, widget.y, new_number)
-        self._model.set_value(widget.x, widget.y, new_number)
-		self.update_model(widget.x, widget.y, new_number)
-
-    def update_model(self, x, y, value):
-        self._model.set_value(x, y, value)
+        x, y = widget.x, widget.y
+        # Use the displayed value, instead of that from the grid;
+        # because conflicting value doesn't get into the grid
+        old = self.get_value(x, y)
+        cmd = undo.ChangeValueCmd(self._model, x, y, old, new_number)
+        self._controller.execute_command(cmd)
 
     def _notes_changed_cb(self, widget, top_note, bottom_note):
 		self._notes_model.set_notes(widget.x, widget.y, top_note, bottom_note)



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