[gnome-clocks] Store window size and panel state with gsettings
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-clocks] Store window size and panel state with gsettings
- Date: Tue, 14 May 2013 19:47:49 +0000 (UTC)
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]