[gnome-games/sudoku-tube] Make autofill-all work



commit aff8a591cf25bbe05a3a53711aa750928a2d95a2
Author: Zhang Sen <zh jesse gmail com>
Date:   Fri Jul 10 22:52:53 2009 +0800

    Make autofill-all work
    
    * Make SudokuSolver (sudoku.py)'s auto_fill only return the possibility, not
    actually do the fill, which should be the duty of SudokuModel.
    * Break Undo/Redo

 gnome-sudoku/src/lib/gsudoku.py |   35 +++++++++++++++++------------------
 gnome-sudoku/src/lib/main.py    |   22 ++++++++++++----------
 gnome-sudoku/src/lib/sudoku.py  |   11 ++---------
 3 files changed, 31 insertions(+), 37 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/gsudoku.py b/gnome-sudoku/src/lib/gsudoku.py
index 4af245a..d2d4a0e 100644
--- a/gnome-sudoku/src/lib/gsudoku.py
+++ b/gnome-sudoku/src/lib/gsudoku.py
@@ -160,6 +160,9 @@ class ParallelDict (dict):
 
 class SudokuView(SudokuNumberGrid, gobject.GObject):
 
+    __gsignals__ = {
+        'puzzle-finished':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())}
+
     def __init__(self, group_size):
         SudokuNumberGrid.__init__(self, group_size)
         gobject.GObject.__init__(self)
@@ -199,6 +202,9 @@ class SudokuView(SudokuNumberGrid, gobject.GObject):
             if box.conflict is not None:
                 self._show_conflict(x, y, box.conflict)
 
+    def puzzle_finished_cb(self):
+        self.emit("puzzle-finished")
+
     def _show_conflict(self, x, y, conflict):
         self.__entries__[(x, y)].set_error_highlight(conflict)
 
@@ -307,14 +313,9 @@ class NumberBoxModel:
         self.conflict = conflict
 
 
-class SudokuModel(gobject.GObject):
-
-    __gsignals__ = {
-        'puzzle-finished':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())
-        }
+class SudokuModel:
 
     def __init__ (self, grid, group_size):
-        group_size = int(group_size)
         self.hints = 0
         self.always_show_hints = False
         self.auto_fills = 0
@@ -323,7 +324,6 @@ class SudokuModel(gobject.GObject):
         self.impossibilities = []
         self.trackers = {}
         self.__trackers_tracking__ = {}
-        gobject.GObject.__init__(self)
         self._setup_grid(grid, group_size)
 
         self._observers = []
@@ -335,6 +335,10 @@ class SudokuModel(gobject.GObject):
         for observer in self._observers:
             observer.update(values)
 
+    def _signal_completeness(self):
+        for observer in self._observers:
+            observer.puzzle_finished_cb()
+
     def show_hint (self):
         entry = self.get_focus()
         if entry:
@@ -492,6 +496,9 @@ class SudokuModel(gobject.GObject):
             result.append(change)
         self._signal_observers(result)
 
+        if self.grid.check_for_completeness():
+            self._signal_completeness()
+
     def _remove_related_conflicts(self, x, y):
         result = []
         if self.__error_pairs__.has_key((x, y)):
@@ -567,18 +574,10 @@ class SudokuModel(gobject.GObject):
         e.unset_color()
 
     def auto_fill (self):
-        changed = self.grid.auto_fill()
-        retval = []
+        changed = set(self.grid.auto_fill()) # there are duplicate?
         for coords, val in changed:
-            self.add_value(coords[0], coords[1], val)
-            retval.append((coords[0], coords[1], val))
-            if self.show_impossible_implications:
-                self._mark_impossible_implications(*coords)
-        if retval:
-            self.auto_fills += 1
-        if self.grid.check_for_completeness():
-            self.emit('puzzle-finished')
-        return retval
+            self.set_value(coords[0], coords[1], val)
+        return changed
 
     def auto_fill_current_entry (self):
         e = self.get_focus()
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 7f60ac7..8bdda16 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -490,18 +490,20 @@ class UI (gconf_wrapper.GConfWrapper):
             self.gsd.show_impossible_implications = False
 
     def auto_fill_cb (self, *args):
-        if not hasattr(self, 'autofilled'):
-            self.autofilled = []
-        if not hasattr(self, 'autofiller'):
-            self.autofiller = Undo.UndoableObject(
-                self.do_auto_fill,
-                self.undo_auto_fill,
-                self.history
-                )
-        self.autofiller.perform()
+        self.do_auto_fill()
+#        if not hasattr(self, 'autofilled'):
+#            self.autofilled = []
+#        if not hasattr(self, 'autofiller'):
+#            self.autofiller = Undo.UndoableObject(
+#                self.do_auto_fill,
+#                self.undo_auto_fill,
+#                self.history
+#                )
+#        self.autofiller.perform()
 
     def do_auto_fill (self, *args):
-        self.autofilled.append(self.gsd.auto_fill())
+#        self.autofilled.append(self.gsd.auto_fill())
+        self._main_model.auto_fill()
         if self.gconf['always_show_hints']:
             self.gsd.update_all_hints()
 
diff --git a/gnome-sudoku/src/lib/sudoku.py b/gnome-sudoku/src/lib/sudoku.py
index 06823cb..f8d6fcf 100644
--- a/gnome-sudoku/src/lib/sudoku.py
+++ b/gnome-sudoku/src/lib/sudoku.py
@@ -338,13 +338,7 @@ class SudokuSolver (SudokuGrid):
                     if not coords:
                         raise UnsolvablePuzzle('Missing a %s in %s' % (n, label))
                     else:
-                        try:
-                            self.add(coords[0], coords[1], n)
-                            changed.append((coords, n))
-                        except AlreadySetError:
-                            raise UnsolvablePuzzle(
-                                "%s,%s must be two values at once!" % (coords)
-                                )
+                        changed.append((coords, n))
         return changed
 
     def fill_deterministically (self):
@@ -355,8 +349,7 @@ class SudokuSolver (SudokuGrid):
             if self.verbose:
                 print 'Deterministically adding ', coords, choices
             val = choices.pop()
-            self.add(coords[0], coords[1], val)
-            retval.append([(coords[0], coords[1]), val])
+            retval.append(((coords[0], coords[1]), val))
         if self.verbose:
             print 'deterministically returning ', retval
         return retval



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