[gnome-games/sudoku-tube] Make autofill-all work
- From: Zhang Sen <zhangsen src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-games/sudoku-tube] Make autofill-all work
- Date: Fri, 10 Jul 2009 23:32:33 +0000 (UTC)
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]