[gnome-sudoku] Create popovers on demand
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-sudoku] Create popovers on demand
- Date: Mon, 9 Mar 2015 14:25:00 +0000 (UTC)
commit 21c7182e727d37524807384f3f87b0c0f7a7df33
Author: Iulian Radu <iulian radu67 gmail com>
Date: Sun Mar 8 15:00:58 2015 +0200
Create popovers on demand
There were 81 popovers and 81 earmarks popovers and 162 pickers created
at the beggining of the game and always present. This patch creates and
destroy the pickers and popovers on demand.
https://bugzilla.gnome.org/show_bug.cgi?id=736598
src/sudoku-view.vala | 121 +++++++++++++++++++++++++++++++++-----------------
1 files changed, 80 insertions(+), 41 deletions(-)
---
diff --git a/src/sudoku-view.vala b/src/sudoku-view.vala
index e49cdca..1b7ec1b 100644
--- a/src/sudoku-view.vala
+++ b/src/sudoku-view.vala
@@ -118,39 +118,6 @@ private class SudokuCellView : Gtk.DrawingArea
if (is_fixed)
return;
- number_picker = new NumberPicker (ref game.board);
- number_picker.number_picked.connect ((o, number) => {
- value = number;
- if (number == 0)
- notify_property ("value");
- this.game.board.disable_all_earmarks (row, col);
-
- popover.hide ();
- });
-
- popover = new Popover (this);
- popover.add (number_picker);
- popover.modal = false;
- popover.position = PositionType.BOTTOM;
- popover.focus_out_event.connect (() => { popover.hide (); return true; });
-
- earmark_picker = new NumberPicker (ref game.board, true);
- earmark_picker.earmark_state_changed.connect ((number, state) => {
- if (state)
- this.game.board.enable_earmark (row, col, number);
- else
- this.game.board.disable_earmark (row, col, number);
- this.game.cell_changed (row, col, value, value);
- queue_draw ();
- });
- earmark_picker.set_earmarks (row, col);
-
- earmark_popover = new Popover (this);
- earmark_popover.add (earmark_picker);
- earmark_popover.modal = false;
- earmark_popover.position = PositionType.BOTTOM;
- earmark_popover.focus_out_event.connect (() => { earmark_popover.hide (); return true; });
-
focus_out_event.connect (focus_out_cb);
game.cell_changed.connect (cell_changed_cb);
}
@@ -165,7 +132,7 @@ private class SudokuCellView : Gtk.DrawingArea
if (is_fixed || game.paused)
return false;
- if (popover.visible || earmark_popover.visible)
+ if (popover != null || earmark_popover != null)
{
hide_both_popovers ();
return false;
@@ -184,23 +151,90 @@ private class SudokuCellView : Gtk.DrawingArea
return false;
}
+ private void create_earmark_picker ()
+ {
+ earmark_picker = new NumberPicker (ref game.board, true);
+ earmark_picker.earmark_state_changed.connect ((number, state) => {
+ if (state)
+ this.game.board.enable_earmark (row, col, number);
+ else
+ this.game.board.disable_earmark (row, col, number);
+ this.game.cell_changed (row, col, value, value);
+ queue_draw ();
+ });
+ earmark_picker.set_earmarks (row, col);
+ }
+
private void show_number_picker ()
{
+ if (earmark_popover != null)
+ earmark_popover.hide ();
+
+ number_picker = new NumberPicker (ref game.board);
+ number_picker.number_picked.connect ((o, number) => {
+ value = number;
+ if (number == 0)
+ notify_property ("value");
+ this.game.board.disable_all_earmarks (row, col);
+
+ popover.hide ();
+ });
number_picker.set_clear_button_visibility (value != 0);
- earmark_popover.hide ();
+
+ popover = new Popover (this);
+ popover.add (number_picker);
+ popover.modal = false;
+ popover.position = PositionType.BOTTOM;
+ popover.notify["visible"].connect (()=> {
+ if (!popover.visible)
+ destroy_popover (ref popover);
+ });
+ popover.focus_out_event.connect (() => {
+ popover.hide ();
+ return true;
+ });
+
popover.show ();
}
private void show_earmark_picker ()
{
- popover.hide ();
+ if (popover != null)
+ popover.hide ();
+
+ create_earmark_picker ();
+
+ earmark_popover = new Popover (this);
+ earmark_popover.add (earmark_picker);
+ earmark_popover.modal = false;
+ earmark_popover.position = PositionType.BOTTOM;
+ earmark_popover.notify["visible"].connect (()=> {
+ if (!earmark_popover.visible)
+ destroy_popover (ref earmark_popover);
+ });
+ earmark_popover.focus_out_event.connect (() => {
+ earmark_popover.hide ();
+ return true;
+ });
+
earmark_popover.show ();
}
+ private void destroy_popover (ref Gtk.Popover popover)
+ {
+ if (popover != null)
+ {
+ popover.destroy ();
+ popover = null;
+ }
+ }
+
private void hide_both_popovers ()
{
- popover.hide ();
- earmark_popover.hide ();
+ if (popover != null)
+ popover.hide ();
+ if (earmark_popover != null)
+ earmark_popover.hide ();
}
private bool focus_out_cb (Gtk.Widget widget, Gdk.EventFocus event)
@@ -250,6 +284,8 @@ private class SudokuCellView : Gtk.DrawingArea
if ((event.state & ModifierType.CONTROL_MASK) > 0)
{
var new_state = !game.board.is_earmark_enabled (row, col, k_no);
+ if (earmark_picker == null)
+ create_earmark_picker ();
if (earmark_picker.set_earmark (row, col, k_no-1, new_state))
{
if (new_state)
@@ -275,6 +311,11 @@ private class SudokuCellView : Gtk.DrawingArea
if (k_name == "space" || k_name == "Return" || k_name == "KP_Enter")
{
+ if (popover != null)
+ {
+ popover.hide ();
+ return false;
+ }
show_number_picker ();
return true;
}
@@ -382,9 +423,7 @@ private class SudokuCellView : Gtk.DrawingArea
public void clear ()
{
- if (earmark_picker != null)
- for (var i = 0; i < game.board.max_val; i++)
- earmark_picker.set_earmark (row, col, i, false);
+ game.board.disable_all_earmarks (row, col);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]