[gnome-clocks] Store window size and panel state with gsettings



commit 1993d6517e774abc7deb5889c339683db23ff777
Author: Evgeny Bobkin <evgen ibqn gmail com>
Date:   Tue May 14 14:49:11 2013 +0200

    Store window size and panel state with gsettings
    
    https://bugzilla.gnome.org/show_bug.cgi?id=700034

 data/org.gnome.clocks.gschema.xml.in |   32 ++++++++++++++++++
 src/alarm.vala                       |    3 +-
 src/clock.vala                       |   10 ++++++
 src/stopwatch.vala                   |    3 +-
 src/timer.vala                       |    3 +-
 src/window.vala                      |   60 ++++++++++++++++++++++-----------
 src/world.vala                       |    3 +-
 7 files changed, 90 insertions(+), 24 deletions(-)
---
diff --git a/data/org.gnome.clocks.gschema.xml.in b/data/org.gnome.clocks.gschema.xml.in
index 4f9eb25..b2c0eee 100644
--- a/data/org.gnome.clocks.gschema.xml.in
+++ b/data/org.gnome.clocks.gschema.xml.in
@@ -22,4 +22,36 @@
       </_description>
     </key>
   </schema>
+  <enum id="org.gnome.clocks.panelid">
+    <value nick="world" value="0"/>
+    <value nick="alarm" value="1"/>
+    <value nick="stopwatch" value="2"/>
+    <value nick="timer" value="3"/>
+  </enum>
+  <schema id="org.gnome.clocks.state" path="/org/gnome/clocks/state/">
+    <child schema="org.gnome.clocks.state.window" name="window"/>
+  </schema>
+  <schema id="org.gnome.clocks.state.window" path="/org/gnome/clocks/state/window/">
+    <key type="i" name="state">
+      <default>0</default>
+      <summary>Window state</summary>
+      <description>
+        State of the window: i.e. maximized.
+      </description>
+    </key>
+    <key type="(ii)" name="size">
+      <default>(870, 690)</default>
+      <_summary>Window width and height</_summary>
+      <_description>
+        Width and height of the window.
+      </_description>
+    </key>
+    <key enum="org.gnome.clocks.panelid" name="panel-id">
+      <default>"world"</default>
+      <_summary>Panel state</_summary>
+      <_description>
+        Current clock panel.
+      </_description>
+    </key>
+  </schema>
 </schemalist>
diff --git a/src/alarm.vala b/src/alarm.vala
index 2f4d657..ed61e69 100644
--- a/src/alarm.vala
+++ b/src/alarm.vala
@@ -465,6 +465,7 @@ private class RingingPanel : Gtk.EventBox {
 public class MainPanel : Gd.Stack, Clocks.Clock {
     public string label { get; construct set; }
     public HeaderBar header_bar { get; construct set; }
+    public PanelId panel_id { get; construct set; }
 
     private List<Item> alarms;
     private GLib.Settings settings;
@@ -473,7 +474,7 @@ public class MainPanel : Gd.Stack, Clocks.Clock {
     private RingingPanel ringing_panel;
 
     public MainPanel (HeaderBar header_bar) {
-        Object (label: _("Alarm"), header_bar: header_bar);
+        Object (label: _("Alarm"), header_bar: header_bar, panel_id: PanelId.ALARM);
 
         alarms = new List<Item> ();
         settings = new GLib.Settings ("org.gnome.clocks");
diff --git a/src/clock.vala b/src/clock.vala
index daa039c..32bb696 100644
--- a/src/clock.vala
+++ b/src/clock.vala
@@ -18,9 +18,19 @@
 
 namespace Clocks {
 
+public enum PanelId {
+    WORLD,
+    ALARM,
+    STOPWATCH,
+    TIMER,
+}
+
+public static const int N_PANELS = 4;
+
 public interface Clock : GLib.Object {
     public abstract string label { get; protected construct set; }
     public abstract HeaderBar header_bar { get; protected construct set; }
+    public abstract PanelId panel_id { get; protected construct set; }
 
     public virtual void activate_new () {
     }
diff --git a/src/stopwatch.vala b/src/stopwatch.vala
index 030782e..5ac6ed4 100644
--- a/src/stopwatch.vala
+++ b/src/stopwatch.vala
@@ -34,6 +34,7 @@ public class MainPanel : Gtk.Box, Clocks.Clock {
 
     public string label { get; construct set; }
     public HeaderBar header_bar { get; construct set; }
+    public PanelId panel_id { get; construct set; }
 
     private State state;
     private GLib.Timer timer;
@@ -47,7 +48,7 @@ public class MainPanel : Gtk.Box, Clocks.Clock {
     private Gtk.TreeView laps_view;
 
     public MainPanel (HeaderBar header_bar) {
-        Object (label: _("Stopwatch"), header_bar: header_bar);
+        Object (label: _("Stopwatch"), header_bar: header_bar, panel_id: PanelId.STOPWATCH);
 
         timer = new GLib.Timer ();
         timeout_id = 0;
diff --git a/src/timer.vala b/src/timer.vala
index 1ca4ee1..fb467db 100644
--- a/src/timer.vala
+++ b/src/timer.vala
@@ -28,6 +28,7 @@ public class MainPanel : Gd.Stack, Clocks.Clock {
 
     public string label { get; construct set; }
     public HeaderBar header_bar { get; construct set; }
+    public PanelId panel_id { get; construct set; }
 
     private State state;
     private GLib.Settings settings;
@@ -46,7 +47,7 @@ public class MainPanel : Gd.Stack, Clocks.Clock {
     private GLib.Timer timer;
 
     public MainPanel (HeaderBar header_bar) {
-        Object (label: _("Timer"), header_bar: header_bar, transition_type: 
Gd.StackTransitionType.CROSSFADE);
+        Object (label: _("Timer"), header_bar: header_bar, transition_type: 
Gd.StackTransitionType.CROSSFADE, panel_id: PanelId.TIMER);
 
         settings = new GLib.Settings ("org.gnome.clocks");
 
diff --git a/src/window.vala b/src/window.vala
index 94410a2..c274ba5 100644
--- a/src/window.vala
+++ b/src/window.vala
@@ -19,10 +19,6 @@
 namespace Clocks {
 
 public class Window : Gtk.ApplicationWindow {
-    // Default size is enough for two rows of three clocks
-    private const int DEFAULT_WIDTH = 870;
-    private const int DEFAULT_HEIGHT = 680;
-
     private const GLib.ActionEntry[] action_entries = {
         // app menu
         { "new", on_new_activate },
@@ -35,10 +31,8 @@ public class Window : Gtk.ApplicationWindow {
 
     private HeaderBar header_bar;
     private Gd.Stack stack;
-    private World.MainPanel world;
-    private Alarm.MainPanel alarm;
-    private Stopwatch.MainPanel stopwatch;
-    private Timer.MainPanel timer;
+    private GLib.Settings settings;
+    private Gtk.Widget[] panels;
 
     public Window (Application app) {
         Object (application: app, title: _("Clocks"));
@@ -46,7 +40,17 @@ public class Window : Gtk.ApplicationWindow {
         set_hide_titlebar_when_maximized (true);
         add_action_entries (action_entries, this);
 
-        set_size_request (DEFAULT_WIDTH, DEFAULT_HEIGHT);
+        settings = new Settings ("org.gnome.clocks.state.window");
+
+        // Setup window geometry saving
+        Gdk.WindowState window_state = (Gdk.WindowState)settings.get_int ("state");
+        if (Gdk.WindowState.MAXIMIZED in window_state) {
+            maximize ();
+        }
+
+        int width, height;
+        settings.get ("size", "(ii)", out width, out height);
+        resize (width, height);
 
         var builder = Utils.load_ui ("window.ui");
 
@@ -54,15 +58,16 @@ public class Window : Gtk.ApplicationWindow {
         header_bar = builder.get_object ("header_bar") as HeaderBar;
         stack = builder.get_object ("stack") as Gd.Stack;
 
-        world = new World.MainPanel (header_bar);
-        alarm = new Alarm.MainPanel (header_bar);
-        stopwatch = new Stopwatch.MainPanel (header_bar);
-        timer = new Timer.MainPanel (header_bar);
+        panels = new Gtk.Widget[N_PANELS];
 
-        stack.add_titled (world, world.label, world.label);
-        stack.add_titled (alarm, alarm.label, alarm.label);
-        stack.add_titled (stopwatch, stopwatch.label, stopwatch.label);
-        stack.add_titled (timer, timer.label, timer.label);
+        panels[PanelId.WORLD] = new World.MainPanel (header_bar);
+        panels[PanelId.ALARM] =  new Alarm.MainPanel (header_bar);
+        panels[PanelId.STOPWATCH] = new Stopwatch.MainPanel (header_bar);
+        panels[PanelId.TIMER] = new Timer.MainPanel (header_bar);
+
+        foreach (var clock in panels) {
+            stack.add_titled (clock, ((Clock)clock).label, ((Clock)clock).label);
+        }
 
         header_bar.set_stack (stack);
 
@@ -81,15 +86,16 @@ public class Window : Gtk.ApplicationWindow {
             stack_id = 0;
         });
 
-        alarm.ring.connect ((w) => {
+        ((Alarm.MainPanel)panels[PanelId.ALARM]).ring.connect ((w) => {
             stack.visible_child = w;
         });
 
-        timer.ring.connect ((w) => {
+        ((Timer.MainPanel)panels[PanelId.TIMER]).ring.connect ((w) => {
             stack.visible_child = w;
         });
 
-        stack.visible_child = world;
+        stack.visible_child = panels[settings.get_enum ("panel-id")];
+
         update_header_bar ();
 
         add (main_panel);
@@ -117,6 +123,19 @@ public class Window : Gtk.ApplicationWindow {
         return base.key_press_event (event);
     }
 
+    protected override bool configure_event (Gdk.EventConfigure event) {
+        if (get_realized () && !(Gdk.WindowState.MAXIMIZED in get_window ().get_state ())) {
+            settings.set ("size", "(ii)", event.width, event.height);
+        }
+
+        return base.configure_event (event);
+    }
+
+    protected override bool window_state_event (Gdk.EventWindowState event) {
+        settings.set_int ("state", event.new_window_state);
+        return base.window_state_event (event);
+    }
+
     private void on_about_activate () {
         const string copyright = "Copyright \xc2\xa9 2011 Collabora Ltd.\n" +
                                  "Copyright \xc2\xa9 2012-2013 Collabora Ltd., Seif Lotfy, Emily Gonyer\n" +
@@ -155,6 +174,7 @@ public class Window : Gtk.ApplicationWindow {
         header_bar.clear ();
         var clock = (Clock) stack.visible_child;
         if (clock != null) {
+            settings.set_enum ("panel-id", clock.panel_id);
             clock.update_header_bar ();
             ((Gtk.Widget) clock).grab_focus ();
         }
diff --git a/src/world.vala b/src/world.vala
index de8af52..2d18879 100644
--- a/src/world.vala
+++ b/src/world.vala
@@ -264,6 +264,7 @@ private class StandalonePanel : Gtk.EventBox {
 public class MainPanel : Gd.Stack, Clocks.Clock {
     public string label { get; construct set; }
     public HeaderBar header_bar { get; construct set; }
+    public PanelId panel_id { get; construct set; }
 
     private List<Item> locations;
     private GLib.Settings settings;
@@ -275,7 +276,7 @@ public class MainPanel : Gd.Stack, Clocks.Clock {
     private StandalonePanel standalone;
 
     public MainPanel (HeaderBar header_bar) {
-        Object (label: _("World"), header_bar: header_bar, transition_type: 
Gd.StackTransitionType.CROSSFADE);
+        Object (label: _("World"), header_bar: header_bar, transition_type: 
Gd.StackTransitionType.CROSSFADE, panel_id: PanelId.WORLD);
 
         locations = new List<Item> ();
         settings = new GLib.Settings ("org.gnome.clocks");


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