[gnome-games/applygsoc2009: 54/76] XXX: Basic undo/redo
- From: Pablo Castellano <pablog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games/applygsoc2009: 54/76] XXX: Basic undo/redo
- Date: Mon, 6 Sep 2010 02:51:45 +0000 (UTC)
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]