[gnome-control-center] background: derive background sources from a common source object



commit abdb42e9e2d5c862e4cc1a2a6951b513d4419038
Author: Thomas Wood <thomas wood intel com>
Date:   Tue Aug 10 17:01:15 2010 +0100

    background: derive background sources from a common source object
    
    Add the BgSource object to define the common aspects of background sources
    and make sure the existing sources inherit from it.

 panels/background/Makefile.am            |    2 +
 panels/background/background.ui          |    2 +
 panels/background/bg-colors-source.c     |   48 +----------
 panels/background/bg-colors-source.h     |    9 +--
 panels/background/bg-flickr-source.c     |   26 +-----
 panels/background/bg-flickr-source.h     |    6 +-
 panels/background/bg-pictures-source.c   |   28 ++-----
 panels/background/bg-pictures-source.h   |    6 +-
 panels/background/bg-source.c            |  129 ++++++++++++++++++++++++++++++
 panels/background/bg-source.h            |   73 +++++++++++++++++
 panels/background/bg-wallpapers-source.c |   37 +++------
 panels/background/bg-wallpapers-source.h |    5 +-
 panels/background/cc-background-panel.c  |   45 +++++------
 13 files changed, 265 insertions(+), 151 deletions(-)
---
diff --git a/panels/background/Makefile.am b/panels/background/Makefile.am
index aa9f1a1..82d3c07 100644
--- a/panels/background/Makefile.am
+++ b/panels/background/Makefile.am
@@ -23,6 +23,8 @@ libbackground_la_SOURCES =		\
 	background-module.c	\
 	cc-background-panel.c	\
 	cc-background-panel.h	\
+	bg-source.c		\
+	bg-source.h		\
 	bg-pictures-source.c			\
 	bg-pictures-source.h			\
 	bg-wallpapers-source.c			\
diff --git a/panels/background/background.ui b/panels/background/background.ui
index 0cd1154..85a575c 100644
--- a/panels/background/background.ui
+++ b/panels/background/background.ui
@@ -54,6 +54,8 @@
       <column type="guint"/>
       <!-- column-name readonly -->
       <column type="gboolean"/>
+      <!-- column-name source-pointer -->
+      <column type="gpointer"/>
     </columns>
   </object>
   <object class="GtkVBox" id="background-panel">
diff --git a/panels/background/bg-colors-source.c b/panels/background/bg-colors-source.c
index 26e697d..fd3ae66 100644
--- a/panels/background/bg-colors-source.c
+++ b/panels/background/bg-colors-source.c
@@ -27,46 +27,14 @@
 
 #include <glib/gi18n-lib.h>
 
-G_DEFINE_TYPE (BgColorsSource, bg_colors_source, G_TYPE_OBJECT)
+G_DEFINE_TYPE (BgColorsSource, bg_colors_source, BG_TYPE_SOURCE)
 
 #define COLORS_SOURCE_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), BG_TYPE_COLORS_SOURCE, BgColorsSourcePrivate))
 
-struct _BgColorsSourcePrivate
-{
-  GtkListStore *store;
-};
-
-
-static void
-bg_colors_source_dispose (GObject *object)
-{
-  BgColorsSourcePrivate *priv = BG_COLORS_SOURCE (object)->priv;
-
-  if (priv->store)
-    {
-      g_object_unref (priv->store);
-      priv->store = NULL;
-    }
-
-  G_OBJECT_CLASS (bg_colors_source_parent_class)->dispose (object);
-}
-
-static void
-bg_colors_source_finalize (GObject *object)
-{
-  G_OBJECT_CLASS (bg_colors_source_parent_class)->finalize (object);
-}
-
 static void
 bg_colors_source_class_init (BgColorsSourceClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  g_type_class_add_private (klass, sizeof (BgColorsSourcePrivate));
-
-  object_class->dispose = bg_colors_source_dispose;
-  object_class->finalize = bg_colors_source_finalize;
 }
 
 static gchar *colors[] =
@@ -103,13 +71,10 @@ static void
 bg_colors_source_init (BgColorsSource *self)
 {
   GnomeDesktopThumbnailFactory *thumb_factory;
-  BgColorsSourcePrivate *priv;
   gchar **c, **n;
+  GtkListStore *store;
 
-
-  priv = self->priv = COLORS_SOURCE_PRIVATE (self);
-
-  priv->store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_POINTER);
+  store = bg_source_get_liststore (BG_SOURCE (self));
 
   thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
 
@@ -136,7 +101,7 @@ bg_colors_source_init (BgColorsSource *self)
       pixbuf = gnome_wp_item_get_thumbnail (item,
                                             thumb_factory,
                                             100, 75);
-      gtk_list_store_insert_with_values (priv->store, NULL, 0,
+      gtk_list_store_insert_with_values (store, NULL, 0,
                                          0, pixbuf,
                                          1, item,
                                          -1);
@@ -151,8 +116,3 @@ bg_colors_source_new (void)
   return g_object_new (BG_TYPE_COLORS_SOURCE, NULL);
 }
 
-GtkListStore *
-bg_colors_source_get_liststore (BgColorsSource *source)
-{
-  return source->priv->store;
-}
diff --git a/panels/background/bg-colors-source.h b/panels/background/bg-colors-source.h
index 395b628..040370d 100644
--- a/panels/background/bg-colors-source.h
+++ b/panels/background/bg-colors-source.h
@@ -24,6 +24,7 @@
 #define _BG_COLORS_SOURCE_H
 
 #include <gtk/gtk.h>
+#include "bg-source.h"
 
 G_BEGIN_DECLS
 
@@ -51,24 +52,20 @@ G_BEGIN_DECLS
 
 typedef struct _BgColorsSource BgColorsSource;
 typedef struct _BgColorsSourceClass BgColorsSourceClass;
-typedef struct _BgColorsSourcePrivate BgColorsSourcePrivate;
 
 struct _BgColorsSource
 {
-  GObject parent;
-
-  BgColorsSourcePrivate *priv;
+  BgSource parent;
 };
 
 struct _BgColorsSourceClass
 {
-  GObjectClass parent_class;
+  BgSourceClass parent_class;
 };
 
 GType bg_colors_source_get_type (void) G_GNUC_CONST;
 
 BgColorsSource *bg_colors_source_new (void);
-GtkListStore * bg_colors_source_get_liststore (BgColorsSource *source);
 
 G_END_DECLS
 
diff --git a/panels/background/bg-flickr-source.c b/panels/background/bg-flickr-source.c
index 50637d8..71aad57 100644
--- a/panels/background/bg-flickr-source.c
+++ b/panels/background/bg-flickr-source.c
@@ -28,15 +28,13 @@
 
 #include "gnome-wp-item.h"
 
-G_DEFINE_TYPE (BgFlickrSource, bg_flickr_source, G_TYPE_OBJECT)
+G_DEFINE_TYPE (BgFlickrSource, bg_flickr_source, BG_TYPE_SOURCE)
 
 #define FLICKR_SOURCE_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), BG_TYPE_FLICKR_SOURCE, BgFlickrSourcePrivate))
 
 struct _BgFlickrSourcePrivate
 {
-  GtkListStore *store;
-
   SwClient *client;
   SwClientService *service;
 };
@@ -47,12 +45,6 @@ bg_flickr_source_dispose (GObject *object)
 {
   BgFlickrSourcePrivate *priv = BG_FLICKR_SOURCE (object)->priv;
 
-  if (priv->store)
-    {
-      g_object_unref (priv->store);
-      priv->store = NULL;
-    }
-
   if (priv->client)
     {
       g_object_unref (priv->client);
@@ -91,7 +83,8 @@ _view_items_added_cb (SwClientItemView *item_view,
                       gpointer          userdata)
 {
   GList *l;
-  BgFlickrSourcePrivate *priv = (BgFlickrSourcePrivate *) userdata;
+  BgFlickrSource *source = (BgFlickrSource *) userdata;
+  GtkListStore *store = bg_source_get_liststore (BG_SOURCE (source));
 
   for (l = items; l; l = l->next)
     {
@@ -119,7 +112,7 @@ _view_items_added_cb (SwClientItemView *item_view,
       thumb_url = sw_item_get_value (sw_item, "thumbnail");
       pixbuf = gdk_pixbuf_new_from_file_at_scale (thumb_url, 100, 75, TRUE,
                                                   NULL);
-      gtk_list_store_insert_with_values (priv->store, NULL, 0,
+      gtk_list_store_insert_with_values (store, NULL, 0,
                                          0, pixbuf,
                                          1, item,
                                          -1);
@@ -159,14 +152,10 @@ bg_flickr_source_init (BgFlickrSource *self)
                                      "feed",
                                      NULL,
                                      _query_open_view_cb,
-                                     priv);
-
-  priv->store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_POINTER);
+                                     self);
 
   thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
 
-
-
   g_object_unref (thumb_factory);
 }
 
@@ -176,8 +165,3 @@ bg_flickr_source_new (void)
   return g_object_new (BG_TYPE_FLICKR_SOURCE, NULL);
 }
 
-GtkListStore *
-bg_flickr_source_get_liststore (BgFlickrSource *source)
-{
-  return source->priv->store;
-}
diff --git a/panels/background/bg-flickr-source.h b/panels/background/bg-flickr-source.h
index 880341f..1dde05f 100644
--- a/panels/background/bg-flickr-source.h
+++ b/panels/background/bg-flickr-source.h
@@ -24,6 +24,7 @@
 #define _BG_FLICKR_SOURCE_H
 
 #include <gtk/gtk.h>
+#include "bg-source.h"
 
 G_BEGIN_DECLS
 
@@ -55,20 +56,19 @@ typedef struct _BgFlickrSourcePrivate BgFlickrSourcePrivate;
 
 struct _BgFlickrSource
 {
-  GObject parent;
+  BgSource parent;
 
   BgFlickrSourcePrivate *priv;
 };
 
 struct _BgFlickrSourceClass
 {
-  GObjectClass parent_class;
+  BgSourceClass parent_class;
 };
 
 GType bg_flickr_source_get_type (void) G_GNUC_CONST;
 
 BgFlickrSource *bg_flickr_source_new (void);
-GtkListStore * bg_flickr_source_get_liststore (BgFlickrSource *source);
 
 G_END_DECLS
 
diff --git a/panels/background/bg-pictures-source.c b/panels/background/bg-pictures-source.c
index e584544..9e05855 100644
--- a/panels/background/bg-pictures-source.c
+++ b/panels/background/bg-pictures-source.c
@@ -29,15 +29,13 @@
 #include <libgnomeui/gnome-desktop-thumbnail.h>
 
 
-G_DEFINE_TYPE (BgPicturesSource, bg_pictures_source, G_TYPE_OBJECT)
+G_DEFINE_TYPE (BgPicturesSource, bg_pictures_source, BG_TYPE_SOURCE)
 
 #define PICTURES_SOURCE_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), BG_TYPE_PICTURES_SOURCE, BgPicturesSourcePrivate))
 
 struct _BgPicturesSourcePrivate
 {
-  GtkListStore *liststore;
-
   GFile *dir;
 
   GCancellable *cancellable;
@@ -84,12 +82,6 @@ bg_pictures_source_dispose (GObject *object)
       priv->cancellable = NULL;
     }
 
-  if (priv->liststore)
-    {
-      g_object_unref (priv->liststore);
-      priv->liststore = NULL;
-    }
-
   if (priv->thumb_factory)
     {
       g_object_unref (priv->thumb_factory);
@@ -129,11 +121,13 @@ file_info_async_ready (GObject      *source,
                        GAsyncResult *res,
                        gpointer      user_data)
 {
-  BgPicturesSourcePrivate *priv = BG_PICTURES_SOURCE (user_data)->priv;
+  BgPicturesSource *bg_source = BG_PICTURES_SOURCE (user_data);
+  BgPicturesSourcePrivate *priv = bg_source->priv;
   GList *files, *l;
   GError *err = NULL;
   GFile *parent;
   gchar *path;
+  GtkListStore *store = bg_source_get_liststore (BG_SOURCE (bg_source));
 
   files = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source),
                                                res,
@@ -192,14 +186,14 @@ file_info_async_ready (GObject      *source,
           /* insert the item into the liststore */
           pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, 100, 75, TRUE,
                                                       NULL);
-          gtk_list_store_insert_with_values (priv->liststore, &iter, 0,
+          gtk_list_store_insert_with_values (store, &iter, 0,
                                              0, pixbuf,
                                              1, item,
                                              -1);
-          tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->liststore),
+          tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store),
                                                &iter);
           item->rowref =
-            gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->liststore),
+            gtk_tree_row_reference_new (GTK_TREE_MODEL (store),
                                         tree_path);
           gtk_tree_path_free (tree_path);
 
@@ -247,9 +241,6 @@ bg_pictures_source_init (BgPicturesSource *self)
   BgPicturesSourcePrivate *priv;
   priv = self->priv = PICTURES_SOURCE_PRIVATE (self);
 
-
-  priv->liststore = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_POINTER);
-
   priv->cancellable = g_cancellable_new ();
 
   pictures_path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
@@ -273,8 +264,3 @@ bg_pictures_source_new (void)
   return g_object_new (BG_TYPE_PICTURES_SOURCE, NULL);
 }
 
-GtkListStore*
-bg_pictures_source_get_liststore (BgPicturesSource *source)
-{
-  return source->priv->liststore;
-}
diff --git a/panels/background/bg-pictures-source.h b/panels/background/bg-pictures-source.h
index 36281bf..0835202 100644
--- a/panels/background/bg-pictures-source.h
+++ b/panels/background/bg-pictures-source.h
@@ -25,6 +25,7 @@
 #define _BG_PICTURES_SOURCE_H
 
 #include <gtk/gtk.h>
+#include "bg-source.h"
 
 G_BEGIN_DECLS
 
@@ -56,20 +57,19 @@ typedef struct _BgPicturesSourcePrivate BgPicturesSourcePrivate;
 
 struct _BgPicturesSource
 {
-  GObject parent;
+  BgSource parent;
 
   BgPicturesSourcePrivate *priv;
 };
 
 struct _BgPicturesSourceClass
 {
-  GObjectClass parent_class;
+  BgSourceClass parent_class;
 };
 
 GType bg_pictures_source_get_type (void) G_GNUC_CONST;
 
 BgPicturesSource *bg_pictures_source_new (void);
-GtkListStore     *bg_pictures_source_get_liststore (BgPicturesSource *source);
 
 G_END_DECLS
 
diff --git a/panels/background/bg-source.c b/panels/background/bg-source.c
new file mode 100644
index 0000000..f323c3c
--- /dev/null
+++ b/panels/background/bg-source.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2010 Intel, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#include "bg-source.h"
+
+G_DEFINE_ABSTRACT_TYPE (BgSource, bg_source, G_TYPE_OBJECT)
+
+#define SOURCE_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BG_TYPE_SOURCE, BgSourcePrivate))
+
+struct _BgSourcePrivate
+{
+  GtkListStore *store;
+};
+
+enum
+{
+  PROP_LISTSTORE = 1
+};
+
+
+static void
+bg_source_get_property (GObject    *object,
+                        guint       property_id,
+                        GValue     *value,
+                        GParamSpec *pspec)
+{
+  BgSource *source = BG_SOURCE (object);
+
+  switch (property_id)
+    {
+    case PROP_LISTSTORE:
+      g_value_set_object (value, bg_source_get_liststore (source));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+    }
+}
+
+static void
+bg_source_set_property (GObject      *object,
+                        guint         property_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
+{
+  switch (property_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+    }
+}
+
+static void
+bg_source_dispose (GObject *object)
+{
+  BgSourcePrivate *priv = BG_SOURCE (object)->priv;
+
+  if (priv->store)
+    {
+      g_object_unref (priv->store);
+      priv->store = NULL;
+    }
+
+  G_OBJECT_CLASS (bg_source_parent_class)->dispose (object);
+}
+
+static void
+bg_source_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (bg_source_parent_class)->finalize (object);
+}
+
+static void
+bg_source_class_init (BgSourceClass *klass)
+{
+  GParamSpec *pspec;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (BgSourcePrivate));
+
+  object_class->get_property = bg_source_get_property;
+  object_class->set_property = bg_source_set_property;
+  object_class->dispose = bg_source_dispose;
+  object_class->finalize = bg_source_finalize;
+
+  pspec = g_param_spec_object ("liststore",
+                               "Liststore",
+                               "Liststore used in the source",
+                               GTK_TYPE_LIST_STORE,
+                               G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+  g_object_class_install_property (object_class, PROP_LISTSTORE, pspec);
+}
+
+static void
+bg_source_init (BgSource *self)
+{
+  BgSourcePrivate *priv;
+
+  priv = self->priv = SOURCE_PRIVATE (self);
+
+  priv->store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_POINTER);
+}
+
+GtkListStore*
+bg_source_get_liststore (BgSource *source)
+{
+  g_return_val_if_fail (BG_IS_SOURCE (source), NULL);
+
+  return source->priv->store;
+}
diff --git a/panels/background/bg-source.h b/panels/background/bg-source.h
new file mode 100644
index 0000000..e783136
--- /dev/null
+++ b/panels/background/bg-source.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 Intel, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#ifndef _BG_SOURCE_H
+#define _BG_SOURCE_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define BG_TYPE_SOURCE bg_source_get_type()
+
+#define BG_SOURCE(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+  BG_TYPE_SOURCE, BgSource))
+
+#define BG_SOURCE_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), \
+  BG_TYPE_SOURCE, BgSourceClass))
+
+#define BG_IS_SOURCE(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+  BG_TYPE_SOURCE))
+
+#define BG_IS_SOURCE_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+  BG_TYPE_SOURCE))
+
+#define BG_SOURCE_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+  BG_TYPE_SOURCE, BgSourceClass))
+
+typedef struct _BgSource BgSource;
+typedef struct _BgSourceClass BgSourceClass;
+typedef struct _BgSourcePrivate BgSourcePrivate;
+
+struct _BgSource
+{
+  GObject parent;
+
+  BgSourcePrivate *priv;
+};
+
+struct _BgSourceClass
+{
+  GObjectClass parent_class;
+};
+
+GType bg_source_get_type (void) G_GNUC_CONST;
+
+GtkListStore* bg_source_get_liststore (BgSource *source);
+
+G_END_DECLS
+
+#endif /* _BG_SOURCE_H */
diff --git a/panels/background/bg-wallpapers-source.c b/panels/background/bg-wallpapers-source.c
index 527e664..4cdb1cf 100644
--- a/panels/background/bg-wallpapers-source.c
+++ b/panels/background/bg-wallpapers-source.c
@@ -29,7 +29,7 @@
 #include <libgnomeui/gnome-desktop-thumbnail.h>
 #include <gio/gio.h>
 
-G_DEFINE_TYPE (BgWallpapersSource, bg_wallpapers_source, G_TYPE_OBJECT)
+G_DEFINE_TYPE (BgWallpapersSource, bg_wallpapers_source, BG_TYPE_SOURCE)
 
 #define WALLPAPERS_SOURCE_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), BG_TYPE_WALLPAPERS_SOURCE, BgWallpapersSourcePrivate))
@@ -72,12 +72,6 @@ bg_wallpapers_source_dispose (GObject *object)
 {
   BgWallpapersSourcePrivate *priv = BG_WALLPAPERS_SOURCE (object)->priv;
 
-  if (priv->store)
-    {
-      g_object_unref (priv->store);
-      priv->store = NULL;
-    }
-
   if (priv->thumb_factory)
     {
       g_object_unref (priv->thumb_factory);
@@ -160,24 +154,26 @@ item_changed_cb (GnomeBG    *bg,
 
 
 static void
-load_wallpapers (gchar                     *key,
-                 GnomeWPItem               *item,
-                 BgWallpapersSourcePrivate *priv)
+load_wallpapers (gchar              *key,
+                 GnomeWPItem        *item,
+                 BgWallpapersSource *source)
 {
+  BgWallpapersSourcePrivate *priv = source->priv;
   GtkTreeIter iter;
   GtkTreePath *path;
   GdkPixbuf *pixbuf;
+  GtkListStore *store = bg_source_get_liststore (BG_SOURCE (source));
 
   if (item->deleted == TRUE)
     return;
 
-  gtk_list_store_append (GTK_LIST_STORE (priv->store), &iter);
+  gtk_list_store_append (store, &iter);
 
   pixbuf = gnome_wp_item_get_thumbnail (item, priv->thumb_factory,
                                         100, 75);
   gnome_wp_item_update_description (item);
 
-  gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter,
+  gtk_list_store_set (store, &iter,
                       0, pixbuf,
                       1, item,
                       -1);
@@ -185,9 +181,8 @@ load_wallpapers (gchar                     *key,
   if (pixbuf)
     g_object_unref (pixbuf);
 
-  path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
-  item->rowref = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->store), path);
-  ///g_signal_connect (item->bg, "changed", G_CALLBACK (item_changed_cb), priv->wp_xml);
+  path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
+  item->rowref = gtk_tree_row_reference_new (GTK_TREE_MODEL (store), path);
   gtk_tree_path_free (path);
 }
 
@@ -199,8 +194,6 @@ bg_wallpapers_source_init (BgWallpapersSource *self)
 
   priv = self->priv = WALLPAPERS_SOURCE_PRIVATE (self);
 
-  priv->store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_POINTER);
-
   priv->thumb_factory =
     gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
 
@@ -208,7 +201,7 @@ bg_wallpapers_source_init (BgWallpapersSource *self)
   wp_xml = g_new0 (GnomeWpXml, 1);
   wp_xml->wp_hash = g_hash_table_new (g_str_hash, g_str_equal);
   wp_xml->client = gconf_client_get_default ();
-  wp_xml->wp_model = priv->store;
+  wp_xml->wp_model = bg_source_get_liststore (BG_SOURCE (self));
   wp_xml->thumb_width = 100;
   wp_xml->thumb_height = 75;
   wp_xml->thumb_factory = priv->thumb_factory;
@@ -216,7 +209,7 @@ bg_wallpapers_source_init (BgWallpapersSource *self)
   gnome_wp_xml_load_list (wp_xml);
   g_hash_table_foreach (wp_xml->wp_hash,
                         (GHFunc) load_wallpapers,
-                        priv);
+                        self);
 
   g_hash_table_destroy (wp_xml->wp_hash);
   g_object_unref (wp_xml->client);
@@ -229,9 +222,3 @@ bg_wallpapers_source_new (void)
   return g_object_new (BG_TYPE_WALLPAPERS_SOURCE, NULL);
 }
 
-
-GtkListStore *
-bg_wallpapers_source_get_liststore (BgWallpapersSource *source)
-{
-  return source->priv->store;
-}
diff --git a/panels/background/bg-wallpapers-source.h b/panels/background/bg-wallpapers-source.h
index f9ad58f..a99111f 100644
--- a/panels/background/bg-wallpapers-source.h
+++ b/panels/background/bg-wallpapers-source.h
@@ -25,6 +25,7 @@
 #define _BG_WALLPAPERS_SOURCE_H
 
 #include <gtk/gtk.h>
+#include "bg-source.h"
 
 G_BEGIN_DECLS
 
@@ -56,14 +57,14 @@ typedef struct _BgWallpapersSourcePrivate BgWallpapersSourcePrivate;
 
 struct _BgWallpapersSource
 {
-  GObject parent;
+  BgSource parent;
 
   BgWallpapersSourcePrivate *priv;
 };
 
 struct _BgWallpapersSourceClass
 {
-  GObjectClass parent_class;
+  BgSourceClass parent_class;
 };
 
 GType bg_wallpapers_source_get_type (void) G_GNUC_CONST;
diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c
index 02be5d2..d0522f0 100644
--- a/panels/background/cc-background-panel.c
+++ b/panels/background/cc-background-panel.c
@@ -53,8 +53,6 @@ struct _CcBackgroundPanelPrivate
   BgFlickrSource *flickr_source;
 #endif
 
-  GtkListStore *selected_store;
-
   GConfClient *client;
 
   GnomeDesktopThumbnailFactory *thumb_factory;
@@ -202,34 +200,21 @@ source_changed_cb (GtkTreeSelection         *selection,
 {
   GtkTreeIter iter;
   GtkTreeModel *model;
-  GtkListStore *store;
   GtkIconView *view;
   guint type;
+  BgSource *source;
 
   gtk_tree_selection_get_selected (selection, &model, &iter);
   gtk_tree_model_get (model, &iter,
                       1, &type,
-                      2, &priv->current_source_readonly, -1);
+                      2, &priv->current_source_readonly,
+                      3, &source, -1);
 
   view = (GtkIconView *) gtk_builder_get_object (priv->builder,
                                                  "backgrounds-iconview");
 
-  if (type == SOURCE_WALLPAPERS)
-    store = bg_wallpapers_source_get_liststore (priv->wallpapers_source);
-  else if (type == SOURCE_PICTURES)
-    store = bg_pictures_source_get_liststore (priv->pictures_source);
-  else if (type == SOURCE_COLORS)
-    store = bg_colors_source_get_liststore (priv->colors_source);
-#ifdef HAVE_LIBSOCIALWEB
-  else if (type == SOURCE_FLICKR)
-    store = bg_flickr_source_get_liststore (priv->flickr_source);
-#endif
-  else
-    store = NULL;
-
-  priv->selected_store = store;
-
-  gtk_icon_view_set_model (view, GTK_TREE_MODEL (store));
+  gtk_icon_view_set_model (view,
+                           GTK_TREE_MODEL (bg_source_get_liststore (source)));
 }
 
 static void
@@ -551,30 +536,38 @@ cc_background_panel_init (CcBackgroundPanel *self)
   store = (GtkListStore*) gtk_builder_get_object (priv->builder,
                                                   "sources-liststore");
 
-  priv->pictures_source = bg_pictures_source_new ();
+  priv->wallpapers_source = bg_wallpapers_source_new ();
   gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
                                      0, _("Wallpapers"),
                                      1, SOURCE_WALLPAPERS,
-                                     2, TRUE, -1);
+                                     2, TRUE,
+                                     3, priv->wallpapers_source,
+                                     -1);
 
-  priv->wallpapers_source = bg_wallpapers_source_new ();
+  priv->pictures_source = bg_pictures_source_new ();
   gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
                                      0, _("Pictures Folder"),
                                      1, SOURCE_PICTURES,
-                                     2, FALSE, -1);
+                                     2, FALSE,
+                                     3, priv->pictures_source,
+                                     -1);
 
   priv->colors_source = bg_colors_source_new ();
   gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
                                      0, _("Colors"),
                                      1, SOURCE_COLORS,
-                                     2, TRUE, -1);
+                                     2, TRUE,
+                                     3, priv->colors_source,
+                                     -1);
 
 #ifdef HAVE_LIBSOCIALWEB
   priv->flickr_source = bg_flickr_source_new ();
   gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
                                      0, _("Flickr"),
                                      1, SOURCE_FLICKR,
-                                     2, FALSE, -1);
+                                     2, FALSE,
+                                     3, priv->flickr_source,
+                                     -1);
 #endif
 
 



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