[gnome-todo] list-panel: store active view



commit 9b41a949e8f1a77c78110f5b07992b60d9518840
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sun Jan 31 18:03:43 2016 -0200

    list-panel: store active view
    
    Save the active view type and load it when it
    inits, so the user is presented with the last
    visible state of To Do when he last used it.

 data/Makefile.am                    |    4 ++
 data/org.gnome.todo.gschema.xml     |    5 ++
 src/gtd-enums.h                     |    6 ++
 src/views/gtd-list-selector-panel.c |   94 ++++++++++++++++++++++++++++-------
 4 files changed, 91 insertions(+), 18 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index 3cf2bcf..aacda76 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -17,6 +17,10 @@ appdata_in_files = $(srcdir)/appdata/org.gnome.Todo.appdata.xml.in
 
 @INTLTOOL_DESKTOP_RULE@
 
+gsettings_ENUM_NAMESPACE = org.gnome.todo
+gsettings_ENUM_FILES = \
+       $(top_srcdir)/src/gtd-enums.h
+
 gsettings_SCHEMAS = org.gnome.todo.gschema.xml
 
 @GSETTINGS_RULES@
diff --git a/data/org.gnome.todo.gschema.xml b/data/org.gnome.todo.gschema.xml
index 6659fb0..cd9feac 100644
--- a/data/org.gnome.todo.gschema.xml
+++ b/data/org.gnome.todo.gschema.xml
@@ -31,5 +31,10 @@
             <summary>List of active extensions</summary>
             <description>The list of active extensions</description>
         </key>
+        <key name="view" enum="org.gnome.todo.GtdListSelectorViewType">
+            <default>'grid'</default>
+            <summary>The current list selector</summary>
+            <description>The current list selector. Can be 'grid' or 'list'.</description>
+        </key>
     </schema>
 </schemalist>
diff --git a/src/gtd-enums.h b/src/gtd-enums.h
index 86c5c2f..baf349d 100644
--- a/src/gtd-enums.h
+++ b/src/gtd-enums.h
@@ -29,6 +29,12 @@ typedef enum
   GTD_WINDOW_MODE_SELECTION
 } GtdWindowMode;
 
+typedef enum
+{
+  GTD_LIST_SELECTOR_VIEW_GRID,
+  GTD_LIST_SELECTOR_VIEW_LIST
+} GtdListSelectorViewType;
+
 G_END_DECLS
 
 #endif /* GTD_ENUMS_H */
diff --git a/src/views/gtd-list-selector-panel.c b/src/views/gtd-list-selector-panel.c
index 15ca748..1b5ddcb 100644
--- a/src/views/gtd-list-selector-panel.c
+++ b/src/views/gtd-list-selector-panel.c
@@ -43,6 +43,7 @@ struct _GtdListSelectorPanel
   GMenu              *menu;
 
   GtdListSelector    *active_selector;
+  GtdListSelectorViewType active_view;
 
   /* Action bar widgets */
   GtkWidget          *actionbar;
@@ -83,32 +84,62 @@ enum {
   PROP_MENU,
   PROP_NAME,
   PROP_TITLE,
+  PROP_VIEW,
   N_PROPS
 };
 
 static void
-gtd_list_selector_panel_switch_view (GtdListSelectorPanel *panel)
+gtd_list_selector_panel_set_view (GtdListSelectorPanel    *self,
+                                  GtdListSelectorViewType  view)
 {
-  GtkWidget *next_view;
-  const gchar *icon_name;
+  GSettings *settings;
 
-  if (GTK_WIDGET (panel->active_selector) == panel->grid_selector)
-    {
-      next_view = panel->list_selector;
-      icon_name = "view-grid-symbolic";
-    }
-  else
+  /* Load last active view */
+  settings = gtd_manager_get_settings (gtd_manager_get_default ());
+
+  switch (view)
     {
-      next_view = panel->grid_selector;
-      icon_name = "view-list-symbolic";
+    case GTD_LIST_SELECTOR_VIEW_GRID:
+      self->active_selector = GTD_LIST_SELECTOR (self->grid_selector);
+      gtk_image_set_from_icon_name (GTK_IMAGE (self->view_button_image),
+                                    "view-list-symbolic",
+                                    GTK_ICON_SIZE_BUTTON);
+      break;
+
+    case GTD_LIST_SELECTOR_VIEW_LIST:
+      self->active_selector = GTD_LIST_SELECTOR (self->list_selector);
+      gtk_image_set_from_icon_name (GTK_IMAGE (self->view_button_image),
+                                    "view-grid-symbolic",
+                                    GTK_ICON_SIZE_BUTTON);
+      break;
+
+    default:
+      self->active_selector = GTD_LIST_SELECTOR (self->grid_selector);
+      g_warning ("Couldn't detect stored view, defaulting to 'grid'");
     }
 
-  gtk_stack_set_visible_child (GTK_STACK (panel->stack), next_view);
-  gtk_image_set_from_icon_name (GTK_IMAGE (panel->view_button_image),
-                                icon_name,
-                                GTK_ICON_SIZE_BUTTON);
+  gtk_stack_set_visible_child (GTK_STACK (self->stack), GTK_WIDGET (self->active_selector));
+
+  /* Save the current view */
+  g_settings_set_enum (settings,
+                       "view",
+                       view);
 
-  panel->active_selector = GTD_LIST_SELECTOR (next_view);
+  self->active_view = view;
+  g_object_notify (G_OBJECT (self), "view");
+}
+
+static void
+gtd_list_selector_panel_switch_view (GtdListSelectorPanel *panel)
+{
+  GtdListSelectorViewType next_view;
+
+  if (GTK_WIDGET (panel->active_selector) == panel->grid_selector)
+    next_view = GTD_LIST_SELECTOR_VIEW_LIST;
+  else
+    next_view = GTD_LIST_SELECTOR_VIEW_GRID;
+
+  gtd_list_selector_panel_set_view (panel, next_view);
 }
 
 static void
@@ -468,6 +499,10 @@ gtd_list_selector_panel_get_property (GObject    *object,
       g_value_set_string (value, gtd_list_selector_panel_get_panel_title (self));
       break;
 
+    case PROP_VIEW:
+      g_value_set_enum (value, GTD_LIST_SELECTOR_PANEL (self)->active_view);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -509,6 +544,10 @@ gtd_list_selector_panel_set_property (GObject      *object,
       gtd_list_selector_panel_set_mode (self, g_value_get_enum (value));
       break;
 
+    case PROP_VIEW:
+      gtd_list_selector_panel_set_view (self, g_value_get_enum (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -551,6 +590,20 @@ gtd_list_selector_panel_class_init (GtdListSelectorPanelClass *klass)
                                                       GTD_WINDOW_MODE_NORMAL,
                                                       G_PARAM_READWRITE));
 
+  /**
+   * GtdListSelectorPanel::view:
+   *
+   * Which view is the current view (list or grid).
+   */
+  g_object_class_install_property (object_class,
+                                   PROP_VIEW,
+                                   g_param_spec_enum ("view",
+                                                      "View of the selector",
+                                                      "The current view of the selector",
+                                                      GTD_TYPE_LIST_SELECTOR_VIEW_TYPE,
+                                                      GTD_LIST_SELECTOR_VIEW_GRID,
+                                                      G_PARAM_READWRITE));
+
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/list-selector-panel.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdListSelectorPanel, actionbar);
@@ -615,6 +668,8 @@ setup_panel (GtdListSelectorPanel *self,
 static void
 gtd_list_selector_panel_init (GtdListSelectorPanel *self)
 {
+  GSettings *settings;
+
   gtk_widget_init_template (GTK_WIDGET (self));
 
   /* Grid selector */
@@ -625,8 +680,6 @@ gtd_list_selector_panel_init (GtdListSelectorPanel *self)
                "grid",
                "Grid");
 
-  self->active_selector = GTD_LIST_SELECTOR (self->grid_selector);
-
   /* List selector */
   self->list_selector = gtd_list_selector_list_new ();
 
@@ -635,6 +688,11 @@ gtd_list_selector_panel_init (GtdListSelectorPanel *self)
                "list",
                "List");
 
+  /* Load last active view */
+  settings = gtd_manager_get_settings (gtd_manager_get_default ());
+
+  gtd_list_selector_panel_set_view (self, g_settings_get_enum (settings, "view"));
+
   /* Menu */
   self->menu = g_menu_new ();
   g_menu_append (self->menu,


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