[gnome-games/sudoku-vala] UI support for multisized Sudoku, bugfix



commit ee4f0811d8dd3e2056b70de17c3180b25fdb0f35
Author: PioneerAxon <arth svnit gmail com>
Date:   Mon Apr 2 12:52:21 2012 +0530

    UI support for multisized Sudoku, bugfix
    
    UI now has full support for multisized sudoku.
    Updated SudokuBoard for easier integreation with UI.
    Bugfix : hide number_picker on focus_out event.

 gnome-sudoku/src/gnome-sudoku.vala |   14 -----------
 gnome-sudoku/src/sudoku-game.vala  |   46 ++++++++++++++++++++++-------------
 gnome-sudoku/src/sudoku-view.vala  |   38 ++++++++++++++++-------------
 3 files changed, 50 insertions(+), 48 deletions(-)
---
diff --git a/gnome-sudoku/src/gnome-sudoku.vala b/gnome-sudoku/src/gnome-sudoku.vala
index bd87c6b..2c48107 100644
--- a/gnome-sudoku/src/gnome-sudoku.vala
+++ b/gnome-sudoku/src/gnome-sudoku.vala
@@ -96,20 +96,6 @@ public class Application
     [CCode (cname = "G_MODULE_EXPORT quit_cb", instance_pos = -1)]
     public void quit_cb (Gtk.Widget widget)
     {
-/* FIXME: Every time the game exits with Segmentation fault.
-The stack trace is 
-#0  0x00007ffff7267b70 in ?? () from /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
-#1  0x00007ffff726a315 in ?? () from /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
-#2  0x00007ffff68799f0 in g_object_unref () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
-#3  0x0000000000406b98 in application_finalize (obj=<optimized out>) at gnome-sudoku.c:832
-#4  0x0000000000406f26 in application_unref (instance=0x6ba980) at gnome-sudoku.c:869
-#5  application_unref (instance=0x6ba980) at gnome-sudoku.c:865
-#6  0x0000000000407322 in gnome_sudoku_main (args=0x7fffffffe108, args_length1=1) at gnome-sudoku.c:959
-#7  0x00007ffff5fd730d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
-#8  0x0000000000405b39 in _start ()
-
-Hope this helps.
-*/
         Gtk.main_quit ();
     }
 
diff --git a/gnome-sudoku/src/sudoku-game.vala b/gnome-sudoku/src/sudoku-game.vala
index c13e0f8..0f47965 100644
--- a/gnome-sudoku/src/sudoku-game.vala
+++ b/gnome-sudoku/src/sudoku-game.vala
@@ -7,13 +7,25 @@ public class SudokuBoard
     private bool[,] possible_in_row;            /* if specific value is possible in specific row */
     private bool[,] possible_in_col;            /* if specific value is possible in specific col */
     private bool[,,] possible_in_block;         /* if specific value is possible in specific block */
-    private int block_row;                      /* size of sub-part ( block ) in board */
-    private int block_col;                      /* size of sub-part ( block ) in board */
     public bool broken;                         /* true if forced inserted */
 
     public signal void value_changed (int row, int col, int old_value, int new_value);
     public signal void value_changing (int row, int col, int old_value, int new_value);
 
+    /* Number of rows in one block */
+    private int _block_row;
+    public int block_row
+    {
+        get { return _block_row; }
+    }
+
+    /* Number of columns in one block */
+    private int _block_col;
+    public int block_col
+    {
+        get { return _block_col; }
+    }
+
     /* Number of rows in board */
     private int _row;
     public int row
@@ -41,17 +53,17 @@ public class SudokuBoard
         get { return _filled; }
     }
 
-    public SudokuBoard (int row = 9, int col = 9, int block_row = 3, int block_col = 3)
+    public SudokuBoard (int block_row, int block_col)
     {
-        _row = row;
-        _col = col;
-        this.block_row = block_row;
-        this.block_col = block_col;
+        _row = block_row * block_col;
+        _col = block_row * block_col;
+        _block_row = block_row;
+        _block_col = block_col;
         cells = new int[_row, _col];
         is_fixed = new bool[_row, _col];
         possible_in_row = new bool[_row, _col];
         possible_in_col = new bool[_col, _row];
-        possible_in_block = new bool[block_row, block_col, block_row * block_col];
+        possible_in_block = new bool[_block_row, _block_col, _block_row * _block_col];
         broken = false;
         for (var l1 = 0; l1 < _row; l1++)
         {
@@ -63,9 +75,9 @@ public class SudokuBoard
                 possible_in_col[l2, l1] = true;
             }
         }
-        for (var l1 = 0; l1 < block_row; l1++)
+        for (var l1 = 0; l1 < _block_row; l1++)
         {
-            for (var l2 = 0; l2 < block_col; l2++)
+            for (var l2 = 0; l2 < _block_col; l2++)
             {
                 for (var l3 = 0; l3 < max_val; l3++)
                     possible_in_block[l1, l2, l3] = true;
@@ -86,7 +98,7 @@ public class SudokuBoard
     public bool is_possible (int row, int col, int val)
     {
         val--;
-        return (possible_in_row[row,val] && possible_in_col[col,val] && possible_in_block [ row / block_col, col / block_row, val]);
+        return (possible_in_row[row,val] && possible_in_col[col,val] && possible_in_block [ row / _block_col, col / _block_row, val]);
     }
 
     public int count_possible (int row, int col)
@@ -130,10 +142,10 @@ public class SudokuBoard
                 int val = cells [l1, l2];
                 if (val-- == 0)
                     continue;
-                ret |= (possible_in_row [l1, val] == false || possible_in_col [l2, val] == false || possible_in_block [l1 / block_col, l2 / block_row, val] == false);
+                ret |= (possible_in_row [l1, val] == false || possible_in_col [l2, val] == false || possible_in_block [l1 / _block_col, l2 / _block_row, val] == false);
                 possible_in_row [l1, val] = false;
                 possible_in_col [l2, val] = false;
-                possible_in_block [l1 / block_col, l2 / block_row, val] = false;
+                possible_in_block [l1 / _block_col, l2 / _block_row, val] = false;
             }
         }
         return ret;
@@ -153,7 +165,7 @@ public class SudokuBoard
         val--;
         possible_in_row[row, val] = false;
         possible_in_col[col, val] = false;
-        possible_in_block[row / block_col, col / block_row, val] = false;
+        possible_in_block[row / _block_col, col / _block_row, val] = false;
         _filled++;
     }
 
@@ -179,7 +191,7 @@ public class SudokuBoard
         cells[row, col] = 0;
         possible_in_row[row, val] = true;
         possible_in_col[col, val] = true;
-        possible_in_block[row / block_col, col / block_row, val] = true;
+        possible_in_block[row / _block_col, col / _block_row, val] = true;
         _filled--;
         if (broken)
             broken = update_possibles ();
@@ -222,9 +234,9 @@ public class SudokuGame
 
     public signal void cell_changed (int row, int col, int old_val, int new_val);
 
-    public SudokuGame ()
+    public SudokuGame (int block_row = 3, int block_col = 3)
     {
-        board = new SudokuBoard ();
+        board = new SudokuBoard (block_row, block_col);
         undostack = null;
         redostack = null;
         board.value_changing.connect (update_undo);
diff --git a/gnome-sudoku/src/sudoku-view.vala b/gnome-sudoku/src/sudoku-view.vala
index f166d4b..c6c6bb4 100644
--- a/gnome-sudoku/src/sudoku-view.vala
+++ b/gnome-sudoku/src/sudoku-view.vala
@@ -145,12 +145,12 @@ private class SudokuCellView : Gtk.DrawingArea
         popup.skip_pager_hint = true;
         popup.set_type_hint (Gdk.WindowTypeHint.DIALOG);
 
-        var table = new Gtk.Table (3, 3, false);
-        for (var col = 0; col < 3; col++)
+        var table = new Gtk.Table (board.block_row, board.block_col, true);
+        for (var col = 0; col < board.block_col; col++)
         {
-            for (var row = 0; row < 3; row++)
+            for (var row = 0; row < board.block_row; row++)
             {
-                int n = col + row * 3 + 1;
+                int n = col + row * board.block_col + 1;
 
                 var button = new Gtk.Button ();
                 table.attach_defaults (button, col, col+1, row, row+1);
@@ -181,7 +181,7 @@ private class SudokuCellView : Gtk.DrawingArea
         get_window ().get_origin (out x, out y);
         popup.show ();
         popup.get_size (out width, out height);
-
+        popup.focus_out_event.connect (() => { hide_popup (); return true; });
         var screen = popup.get_screen ();
         var popup_x = x - (width - get_allocated_width ()) / 2;
         var popup_y = y - (height - get_allocated_height ()) / 2;
@@ -391,19 +391,23 @@ public class SudokuView : Gtk.AspectFrame
         add (box);
         box.show ();
 
-        var table = new Gtk.Table (9, 9, true);
+        var table = new Gtk.Table (game.board.row, game.board.col, false);
         table.row_spacing = 1;
         table.column_spacing = 1;
-        table.set_row_spacing (2, 2);
-        table.set_row_spacing (5, 2);
-        table.set_col_spacing (2, 2);
-        table.set_col_spacing (5, 2);
+        for (var row = game.board.block_row; row < game.board.row; row += game.board.block_row)
+        {
+            table.set_row_spacing (row - 1, 2);
+        }
+        for (var col = game.board.block_col; col < game.board.col; col += game.board.block_col)
+        {
+            table.set_col_spacing (col - 1, 2);
+        }
         table.border_width = 2;
 
-        cells = new SudokuCellView[9,9];
-        for (var row = 0; row < 9; row++)
+        cells = new SudokuCellView[game.board.row, game.board.col];
+        for (var row = 0; row < game.board.row; row++)
         {
-            for (var col = 0; col < 9; col++)
+            for (var col = 0; col < game.board.col; col++)
             {
                 var cell = new SudokuCellView (row, col, ref game.board);
                 cells[row, col] = cell;
@@ -445,16 +449,16 @@ public class SudokuView : Gtk.AspectFrame
 
     public void clear_top_notes ()
     {
-        for (var i = 0; i < 9; i++)
-            for (var j = 0; j < 9; j++)
+        for (var i = 0; i < game.board.row; i++)
+            for (var j = 0; j < game.board.col; j++)
                 cells[i,j].top_notes = "";
         queue_draw ();
     }
 
     public void clear_bottom_notes ()
     {
-        for (var i = 0; i < 9; i++)
-            for (var j = 0; j < 9; j++)
+        for (var i = 0; i < game.board.row; i++)
+            for (var j = 0; j < game.board.col; j++)
                 cells[i,j].bottom_notes = "";
         queue_draw ();
     }



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