[gnome-control-center/wip/jsparber/background: 2/29] background: add buttons at bottom the of the gallery



commit c9fd9dc4d7f6907e13ea658c62b4a4d11af4c345
Author: Julian Sparber <julian sparber net>
Date:   Sun Nov 5 13:30:41 2017 +0100

    background: add buttons at bottom the of the gallery
    
    - Add buttons for "Photo" and "Files" at the bottom of the gallery
    - Change the border on top of the gallery
    - clean up and fix build warnings
    
    https://bugzilla.gnome.org/show_bug.cgi?id=788515

 panels/background/background.ui                  |  71 +++++++-
 panels/background/bg-source.c                    |  12 +-
 panels/background/bg-wallpapers-source.c         |   4 +-
 panels/background/bg-wallpapers-source.h         |   2 +-
 panels/background/cc-background-chooser-dialog.c |   2 +-
 panels/background/cc-background-grid-item.c      |   8 +-
 panels/background/cc-background-grid-item.h      |   8 +-
 panels/background/cc-background-panel.c          | 220 ++++++++++++++---------
 panels/background/cc-background-store.c          |  57 +++++-
 panels/background/cc-background-store.h          |   3 +-
 panels/background/data/background.css            |   1 +
 11 files changed, 275 insertions(+), 113 deletions(-)
---
diff --git a/panels/background/background.ui b/panels/background/background.ui
index aae1f6bb1..147b567f4 100644
--- a/panels/background/background.ui
+++ b/panels/background/background.ui
@@ -111,6 +111,9 @@
       <object class="GtkBox" id="backgroud-gallery-box">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
+        <style>
+          <class name="background-gallery"/>
+        </style>
         <child>
           <object class="GtkScrolledWindow">
             <property name="visible">True</property>
@@ -121,9 +124,6 @@
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="orientation">vertical</property>
-                <style>
-                  <class name="background-gallery"/>
-                </style>
                 <child>
                   <object class="GtkFlowBox" id="background-gallery">
                     <property name="visible">True</property>
@@ -137,9 +137,72 @@
                     <property name="valign">center</property>
                     <property name="margin">25</property>
                     <property name="margin_top">50</property>
+                    <property name="margin_bottom">32</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkBox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">center</property>
+                    <property name="valign">end</property>
+                    <property name="margin">32</property>
+                    <property name="margin_top">0</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">16</property>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Photos or Files can be used to set any 
image as the background</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="halign">center</property>
+                        <property name="spacing">16</property>
+                        <child>
+                          <object class="GtkButton" id="open-gnome-photos">
+                            <property name="label" translatable="yes">Open Photos app</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="open-picture-folder">
+                            <property name="label" translatable="yes">Open Pictures folder</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
-
               </object>
             </child>
           </object>
diff --git a/panels/background/bg-source.c b/panels/background/bg-source.c
index 7d08dbd93..f1fac842f 100644
--- a/panels/background/bg-source.c
+++ b/panels/background/bg-source.c
@@ -52,12 +52,12 @@ bg_source_calculate_thumbnail_dimensions (BgSource *source)
   priv->thumbnail_height = THUMBNAIL_HEIGHT;
   priv->thumbnail_width = THUMBNAIL_WIDTH;
 
-  //if (priv->window == NULL)
-  //  return;
+  if (priv->window == NULL)
+    return;
 
 
-  //scale_factor = gtk_widget_get_scale_factor (priv->window);
-  scale_factor = 1;
+  scale_factor = gtk_widget_get_scale_factor (priv->window);
+
   if (scale_factor > 1)
     {
       priv->thumbnail_height *= scale_factor;
@@ -144,7 +144,7 @@ bg_source_class_init (BgSourceClass *klass)
   pspec = g_param_spec_object ("window",
                                "Window",
                                "Toplevel window used to view the source",
-                               GTK_TYPE_WINDOW,
+                               GTK_TYPE_WIDGET,
                                G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
   g_object_class_install_property (object_class, PROP_WINDOW, pspec);
 }
@@ -176,8 +176,6 @@ bg_source_get_scale_factor (BgSource *source)
 
   priv = bg_source_get_instance_private (source);
 
-  return 1;
-  g_print("Error Here 2\n");
   return gtk_widget_get_scale_factor (priv->window);
 }
 
diff --git a/panels/background/bg-wallpapers-source.c b/panels/background/bg-wallpapers-source.c
index f5b7da1b5..546405d84 100644
--- a/panels/background/bg-wallpapers-source.c
+++ b/panels/background/bg-wallpapers-source.c
@@ -56,7 +56,7 @@ load_wallpapers (gchar              *key,
   if (deleted)
     return;
 
-//  gtk_list_store_append (store, &iter);
+  //gtk_list_store_append (store, &iter);
 
   scale_factor = bg_source_get_scale_factor (BG_SOURCE (source));
   thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (source));
@@ -169,7 +169,7 @@ bg_wallpapers_source_class_init (BgWallpapersSourceClass *klass)
 }
 
 BgWallpapersSource *
-bg_wallpapers_source_new (GtkWindow *window)
+bg_wallpapers_source_new (GtkWidget *window)
 {
   return g_object_new (BG_TYPE_WALLPAPERS_SOURCE, "window", window, NULL);
 }
diff --git a/panels/background/bg-wallpapers-source.h b/panels/background/bg-wallpapers-source.h
index 729266910..3d0d2e0f9 100644
--- a/panels/background/bg-wallpapers-source.h
+++ b/panels/background/bg-wallpapers-source.h
@@ -31,7 +31,7 @@ G_BEGIN_DECLS
 #define BG_TYPE_WALLPAPERS_SOURCE (bg_wallpapers_source_get_type ())
 G_DECLARE_FINAL_TYPE (BgWallpapersSource, bg_wallpapers_source, BG, WALLPAPERS_SOURCE, BgSource)
 
-BgWallpapersSource *bg_wallpapers_source_new (GtkWindow *);
+BgWallpapersSource *bg_wallpapers_source_new (GtkWidget *);
 
 G_END_DECLS
 
diff --git a/panels/background/cc-background-chooser-dialog.c 
b/panels/background/cc-background-chooser-dialog.c
index 47329cae0..b766b6e52 100644
--- a/panels/background/cc-background-chooser-dialog.c
+++ b/panels/background/cc-background-chooser-dialog.c
@@ -458,7 +458,7 @@ cc_background_chooser_dialog_init (CcBackgroundChooserDialog *chooser)
   g_autofree gchar *pictures_dir_uri = NULL;
   GtkTargetList *target_list;
 
-  chooser->wallpapers_source = bg_wallpapers_source_new (GTK_WINDOW (chooser));
+  chooser->wallpapers_source = bg_wallpapers_source_new (GTK_WIDGET (chooser));
   chooser->pictures_source = bg_pictures_source_new (GTK_WINDOW (chooser));
   chooser->colors_source = bg_colors_source_new (GTK_WINDOW (chooser));
 
diff --git a/panels/background/cc-background-grid-item.c b/panels/background/cc-background-grid-item.c
index 991267b06..c2341cc76 100644
--- a/panels/background/cc-background-grid-item.c
+++ b/panels/background/cc-background-grid-item.c
@@ -48,13 +48,15 @@ cc_background_grid_item_new (CcBackgroundItem *item)
                        NULL);
 }
 
-CcBackgroundItem * cc_background_grid_item_get_ref (CcBackgroundGridItem *self)
+CcBackgroundItem * cc_background_grid_item_get_ref (GtkWidget *widget)
 {
+  CcBackgroundGridItem *self = (CcBackgroundGridItem *) widget;
   return self->item;
 }
 void
-cc_background_grid_item_set_ref (CcBackgroundGridItem *self, CcBackgroundItem *item)
+cc_background_grid_item_set_ref (GtkWidget *widget, CcBackgroundItem *item)
 {
+  CcBackgroundGridItem *self = (CcBackgroundGridItem *) widget;
   self->item = item;
 }
 
@@ -119,7 +121,7 @@ static void
 cc_background_grid_item_class_init (CcBackgroundGridItemClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  //GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->finalize = cc_background_grid_item_finalize;
   object_class->dispose = cc_background_grid_item_dispose;
diff --git a/panels/background/cc-background-grid-item.h b/panels/background/cc-background-grid-item.h
index 025a56fab..2c0a19772 100644
--- a/panels/background/cc-background-grid-item.h
+++ b/panels/background/cc-background-grid-item.h
@@ -28,10 +28,10 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (CcBackgroundGridItem, cc_background_grid_item, CC, BACKGROUND_GRID_LIST, 
GtkFlowBoxChild)
 
-GtkWidget*              cc_background_grid_item_new          (CcBackgroundItem             *);
-
-void cc_background_grid_item_set_ref (CcBackgroundGridItem *self, CcBackgroundItem *item);
-CcBackgroundItem * cc_background_grid_item_get_ref (CcBackgroundGridItem *self);
+GtkWidget *             cc_background_grid_item_new             (CcBackgroundItem             *);
+void                    cc_background_grid_item_set_ref         (GtkWidget                    *,
+                                                                 CcBackgroundItem             *);
+CcBackgroundItem *      cc_background_grid_item_get_ref         (GtkWidget                    *);
 
 G_END_DECLS
 
diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c
index 08863fce3..3ec2239fd 100644
--- a/panels/background/cc-background-panel.c
+++ b/panels/background/cc-background-panel.c
@@ -24,13 +24,14 @@
 #include <glib.h>
 #include <glib/gi18n-lib.h>
 #include <glib/gstdio.h>
+#include <gio/gdesktopappinfo.h>
 
 #include <gdesktop-enums.h>
 
 #include "cc-background-panel.h"
 
-#include "bg-wallpapers-source.h"
 #include "cc-background-item.h"
+#include "cc-background-store.h"
 #include "cc-background-grid-item.h"
 #include "cc-background-resources.h"
 #include "cc-background-xml.h"
@@ -55,8 +56,7 @@ struct _CcBackgroundPanel
   GnomeDesktopThumbnailFactory *thumb_factory;
 
   CcBackgroundItem *current_background;
-
-  BgWallpapersSource *wallpapers_source;
+  CcBackgroundStore *store;
 
   GCancellable *copy_cancellable;
 
@@ -114,6 +114,8 @@ cc_background_panel_finalize (GObject *object)
   CcBackgroundPanel *panel = CC_BACKGROUND_PANEL (object);
 
   g_clear_object (&panel->current_background);
+  g_clear_object (&panel->store);
+  g_clear_object (&panel->settings);
 
   G_OBJECT_CLASS (cc_background_panel_parent_class)->finalize (object);
 }
@@ -648,6 +650,7 @@ set_background (CcBackgroundPanel *panel,
       g_settings_set_string (settings, WP_URI_KEY, uri);
     }
 
+
   /* Also set the placement if we have a URI and the previous value was none */
   if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
     {
@@ -679,6 +682,7 @@ set_background (CcBackgroundPanel *panel,
       if (create_save_dir ())
         cc_background_xml_save (panel->current_background, filename);
     }
+
 }
 
 static void
@@ -690,43 +694,12 @@ on_settings_changed (GSettings         *settings,
   update_preview (self, settings, NULL);
 }
 
-static GtkWidget *
-create_view (GtkWidget *parent, GtkTreeModel *model)
-{
-  GtkCellRenderer *renderer;
-  GtkWidget *icon_view;
-  GtkWidget *sw;
-
-  sw = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-  gtk_widget_set_hexpand (sw, TRUE);
-  gtk_widget_set_vexpand (sw, TRUE);
-
-  icon_view = gtk_icon_view_new ();
-  gtk_icon_view_set_model (GTK_ICON_VIEW (icon_view), model);
-  gtk_widget_set_hexpand (icon_view, TRUE);
-  gtk_container_add (GTK_CONTAINER (sw), icon_view);
-
-  gtk_icon_view_set_columns (GTK_ICON_VIEW (icon_view), 3);
-
-  renderer = gtk_cell_renderer_pixbuf_new ();
-  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
-                              renderer,
-                              FALSE);
-  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
-                                  renderer,
-                                  "surface", 0,
-                                  NULL);
-
-  return sw;
-}
-
 static void
 on_background_select (GtkFlowBox      *box,
                       GtkFlowBoxChild *child,
                       gpointer         user_data)
 {
-  CcBackgroundGridItem *selected = (CcBackgroundGridItem *) child;
+  GtkWidget *selected = GTK_WIDGET (child);
   CcBackgroundPanel *panel = user_data;
   CcBackgroundItem *item;
   item = cc_background_grid_item_get_ref (selected);
@@ -734,26 +707,108 @@ on_background_select (GtkFlowBox      *box,
   set_background (panel, panel->settings, item);
 }
 
-gboolean
-do_foreach_background_item (GtkTreeModel *model,
-                         GtkTreePath *path,
-                         GtkTreeIter *iter,
-                         gpointer data)
+static void
+on_open_gnome_photos (GtkWidget *widget,
+                      gpointer  user_data)
+{
+  GAppLaunchContext *context;
+  GDesktopAppInfo *appInfo;
+  GError **error = NULL;
+
+  context = G_APP_LAUNCH_CONTEXT (gdk_display_get_app_launch_context (gdk_display_get_default ()));
+  appInfo = g_desktop_app_info_new("org.gnome.Photos.desktop");
+
+  g_object_unref (context);
+
+  if (appInfo == NULL) {
+    g_debug ("Gnome Photos is not installed.");
+  }
+  else {
+    g_app_info_launch (G_APP_INFO (appInfo), NULL, context, error);
+    g_prefix_error (error,
+                    ("Problem opening Gnome Photos: "));
+
+    g_object_unref (appInfo);
+  }
+}
+
+static void
+on_open_picture_folder (GtkWidget *widget,
+                        gpointer  user_data)
+{
+  GDBusProxy      *proxy;
+  GVariant        *retval;
+  GVariantBuilder *builder;
+  const gchar     *uri;
+  GError **error = NULL;
+  const gchar     *path;
+
+  path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
+
+  uri = g_filename_to_uri (path, NULL, error);
+
+  proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         "org.freedesktop.FileManager1",
+                                         "/org/freedesktop/FileManager1",
+                                         "org.freedesktop.FileManager1",
+                                         NULL, error);
+
+  if (!proxy) {
+    g_prefix_error (error,
+                    ("Connecting to org.freedesktop.FileManager1 failed: "));
+  }
+  else {
+
+    builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
+    g_variant_builder_add (builder, "s", uri);
+
+    retval = g_dbus_proxy_call_sync (proxy,
+                                     "ShowFolders",
+                                     g_variant_new ("(ass)",
+                                                    builder,
+                                                    ""),
+                                     G_DBUS_CALL_FLAGS_NONE,
+                                     -1, NULL, error);
+
+    g_variant_builder_unref (builder);
+    g_object_unref (proxy);
+
+    if (!retval)
+      {
+        g_prefix_error (error, ("Calling ShowFolders failed: "));
+      }
+    else
+      g_variant_unref (retval);
+  }
+}
+
+static gboolean
+is_gnome_photos_installed ()
 {
-  CcBackgroundPanel *panel = data;
-  CcBackgroundGridItem *flow;
+  if (g_desktop_app_info_new("org.gnome.Photos.desktop") == NULL) {
+    return FALSE;
+  }
+  return TRUE;
+}
+
+static GtkWidget *
+create_gallery_item (gpointer item,
+                    gpointer user_data)
+{
+  CcBackgroundPanel *panel = user_data;
+  GtkWidget *flow;
   GtkWidget *widget;
   GdkPixbuf *pixbuf;
-  CcBackgroundItem *item;
+  CcBackgroundItem *self = item;
   gint scale_factor;
   const gint preview_width = 309;
   const gint preview_height = 168;
 
-  gtk_tree_model_get (model, iter, 1, &item, -1);
+  scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (panel));
 
-  scale_factor = gtk_widget_get_scale_factor (panel);
-
-  pixbuf = cc_background_item_get_frame_thumbnail (item,
+  pixbuf = cc_background_item_get_frame_thumbnail (self,
                                                    panel->thumb_factory,
                                                    preview_width,
                                                    preview_height,
@@ -762,45 +817,13 @@ do_foreach_background_item (GtkTreeModel *model,
 
   widget = gtk_image_new_from_pixbuf (pixbuf);
 
-  flow = cc_background_grid_item_new(item);
-  cc_background_grid_item_set_ref (flow, item);
+  flow = cc_background_grid_item_new(self);
+  cc_background_grid_item_set_ref (flow, self);
   gtk_widget_show (flow);
   gtk_widget_show (widget);
-  gtk_container_add (flow, widget);
-
-  gtk_flow_box_insert (GTK_FLOW_BOX (WID("background-gallery")), flow, -1);
-  return TRUE;
-}
+  gtk_container_add (GTK_CONTAINER (flow), widget);
 
-static void
-on_source_added_cb (GtkTreeModel *model,
-                    GtkTreePath  *path,
-                    GtkTreeIter  *iter,
-                    gpointer     user_data)
-{
-  //gtk_tree_model_foreach (model, foreach_background_item, user_data);
-  do_foreach_background_item (model, path, iter, user_data);
-}
-
-static void
-load_wallpapers (CcBackgroundPanel *panel, GtkWidget *parent)
-{
-  GtkListStore *model;
-  GtkTreeIter iter;
-  GtkTreePath  *path;
-  GValue *value = NULL;
-  gint scale_factor;
-
-  scale_factor = gtk_widget_get_scale_factor (panel);
-
-  panel->wallpapers_source = bg_wallpapers_source_new (GTK_WINDOW (NULL));
-  model = bg_source_get_liststore (BG_SOURCE (panel->wallpapers_source));
-
-  gtk_tree_model_foreach (model, do_foreach_background_item, panel);
-
-  g_signal_connect (model, "row-inserted", G_CALLBACK (on_source_added_cb), panel);
-  //g_signal_connect (model, "row-deleted", G_CALLBACK (on_source_removed_cb), chooser);
-  //g_signal_connect (model, "row-changed", G_CALLBACK (on_source_modified_cb), chooser);
+  return flow;
 }
 
 static void
@@ -810,9 +833,11 @@ cc_background_panel_init (CcBackgroundPanel *panel)
   g_autoptr(GError) err = NULL;
   GtkCssProvider *provider;
   GtkStyleProvider *provider;
-  GtkStyleContext *context;
   GtkWidget *widget;
 
+  /* Create wallpapers store */
+  panel->store = cc_background_store_new ();
+
   panel->connection = g_application_get_dbus_connection (g_application_get_default ());
   g_resources_register (cc_background_get_resource ());
 
@@ -838,12 +863,11 @@ cc_background_panel_init (CcBackgroundPanel *panel)
 
   /* add style */
   widget = WID ("background-preview-top");
-  provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
+  provider = gtk_css_provider_new ();
   gtk_css_provider_load_from_resource (provider,
                                        "org/gnome/control-center/background/background.css");
-  context = gtk_widget_get_style_context (widget);
   gtk_style_context_add_provider_for_screen (gdk_screen_get_default(),
-                                             provider,
+                                             GTK_STYLE_PROVIDER (provider),
                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
   g_object_unref (provider);
 
@@ -855,18 +879,36 @@ cc_background_panel_init (CcBackgroundPanel *panel)
 
   panel->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
 
+  /* add button handler */
+  widget = WID ("open-gnome-photos");
+  g_signal_connect (G_OBJECT (widget), "clicked",
+                    G_CALLBACK (on_open_gnome_photos), panel);
+
+  if (!is_gnome_photos_installed ()) {
+    gtk_widget_hide (widget);
+  }
+
+  widget = WID ("open-picture-folder");
+  g_signal_connect (G_OBJECT (widget), "clicked",
+                    G_CALLBACK (on_open_picture_folder), panel);
+
   /* add the gallery widget */
   widget = WID ("background-gallery");
 
   g_signal_connect (G_OBJECT (widget), "child-activated",
                     G_CALLBACK (on_background_select), panel);
 
-  load_wallpapers (panel, widget);
-
   /* Load the backgrounds */
   reload_current_bg (panel, panel->settings);
   update_preview (panel, panel->settings, NULL);
 
+  /* Bind liststore to flowbox */
+  gtk_flow_box_bind_model (GTK_FLOW_BOX (WID("background-gallery")),
+                           G_LIST_MODEL (cc_background_store_get_liststore (panel->store)),
+                           create_gallery_item,
+                           panel,
+                           NULL);
+
   /* Background settings */
   g_signal_connect (panel->settings, "changed", G_CALLBACK (on_settings_changed), panel);
 }
diff --git a/panels/background/cc-background-store.c b/panels/background/cc-background-store.c
index 33c190049..05eb09c27 100644
--- a/panels/background/cc-background-store.c
+++ b/panels/background/cc-background-store.c
@@ -21,12 +21,14 @@
 #include <gio/gio.h>
 #include "cc-background-store.h"
 #include "cc-background-item.h"
+#include "cc-background-xml.h"
 
 struct _CcBackgroundStore
 {
   GObject parent_instance;
 
   /* Other members, including private data. */
+  //CcBackgroundStorePrivate *priv;
 };
 
 /* Private structure definition. */
@@ -34,7 +36,8 @@ typedef struct _CcBackgroundStorePrivate CcBackgroundStorePrivate;
 
 struct _CcBackgroundStorePrivate
 {
-  GListStore * model;
+  GListStore *model;
+  CcBackgroundXml *xml;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (CcBackgroundStore, cc_background_store, G_TYPE_OBJECT)
@@ -56,6 +59,7 @@ cc_background_store_dispose (GObject *gobject)
    * NULL; g_clear_object() does this for us.
    */
   g_clear_object (&priv->model);
+  g_clear_object (&priv->xml);
 
   /* Always chain up to the parent class; there is no need to check if
    * the parent class implements the dispose() virtual function: it is
@@ -77,12 +81,50 @@ cc_background_store_finalize (GObject *gobject)
   G_OBJECT_CLASS (cc_background_store_parent_class)->finalize (gobject);
 }
 
+
+static void
+item_added (CcBackgroundXml    *xml,
+            CcBackgroundItem   *item,
+            CcBackgroundStore *self)
+{
+  CcBackgroundStorePrivate *priv = cc_background_store_get_instance_private (self);
+  g_list_store_append (priv->model, item);
+}
+
+static void
+list_load_cb (GObject *source_object,
+              GAsyncResult *res,
+              gpointer user_data)
+{
+  cc_background_xml_load_list_finish (res);
+}
+
+static void
+cc_background_store_constructed (GObject *object)
+{
+  CcBackgroundStore *self = CC_BACKGROUND_STORE (object);
+  CcBackgroundStorePrivate *priv = cc_background_store_get_instance_private (self);
+
+  G_OBJECT_CLASS (cc_background_store_parent_class)->constructed (object);
+
+  g_signal_connect (G_OBJECT (priv->xml), "added",
+                    G_CALLBACK (item_added), self);
+
+  /* Try adding the default background first */
+  //load_default_bg (self);
+
+  cc_background_xml_load_list_async (priv->xml, NULL, list_load_cb, self);
+}
+
+
+
 static void
 cc_background_store_class_init (CcBackgroundStoreClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->dispose = cc_background_store_dispose;
+  object_class->constructed = cc_background_store_constructed;
   object_class->finalize = cc_background_store_finalize;
 }
 
@@ -91,4 +133,17 @@ cc_background_store_init (CcBackgroundStore *self)
 {
   CcBackgroundStorePrivate *priv = cc_background_store_get_instance_private (self);
   priv->model = g_list_store_new (cc_background_item_get_type());
+  priv->xml = cc_background_xml_new ();
+}
+
+GListStore *
+cc_background_store_get_liststore (CcBackgroundStore *self) {
+  CcBackgroundStorePrivate *priv = cc_background_store_get_instance_private (self);
+  return priv->model;
+}
+
+CcBackgroundStore *
+cc_background_store_new ()
+{
+  return g_object_new (CC_TYPE_BACKGROUND_STORE, NULL);
 }
diff --git a/panels/background/cc-background-store.h b/panels/background/cc-background-store.h
index 40da76d8b..faec58006 100644
--- a/panels/background/cc-background-store.h
+++ b/panels/background/cc-background-store.h
@@ -37,7 +37,8 @@ G_DECLARE_FINAL_TYPE (CcBackgroundStore, cc_background_store, CC, BACKGROUND_STO
 /*
  * Method definitions.
  */
-CcBackgroundStore *cc_backgroud_store_new (void);
+CcBackgroundStore *cc_background_store_new (void);
+GListStore *cc_background_store_get_liststore (CcBackgroundStore *);
 
 G_END_DECLS
 
diff --git a/panels/background/data/background.css b/panels/background/data/background.css
index c2874a6bd..04695ed40 100644
--- a/panels/background/data/background.css
+++ b/panels/background/data/background.css
@@ -1,5 +1,6 @@
 .background-gallery {
   background: #fff;
+  border-top: 1px solid #b6b6b3;
 }
 
 .black-border {


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