[gnome-packagekit] Remove gpk-repo and merge the functionality into the control center panel



commit a0c7c907c8ff7831c2ddd6eb5602fbbcfe4c5a69
Author: Richard Hughes <richard hughsie com>
Date:   Tue Jul 6 22:19:31 2010 +0100

    Remove gpk-repo and merge the functionality into the control center panel

 contrib/gnome-packagekit.spec.in |    4 +-
 data/Makefile.am                 |    4 +-
 data/gpk-prefs.desktop.in        |    2 +-
 data/gpk-prefs.ui                |  133 +++++++-
 data/gpk-repo.desktop.in         |   11 -
 po/POTFILES.in                   |    2 -
 src/Makefile.am                  |   18 +-
 src/cc-update-panel.c            |  545 ++++++++++++++++++++++++++++-
 src/gpk-application.c            |    2 +-
 src/gpk-repo.c                   |  734 --------------------------------------
 10 files changed, 677 insertions(+), 778 deletions(-)
---
diff --git a/contrib/gnome-packagekit.spec.in b/contrib/gnome-packagekit.spec.in
index 328b0af..3ae1a05 100644
--- a/contrib/gnome-packagekit.spec.in
+++ b/contrib/gnome-packagekit.spec.in
@@ -83,7 +83,7 @@ desktop-file-install --delete-original                   \
   --dir=$RPM_BUILD_ROOT%{_sysconfdir}/xdg/autostart/                    \
   $RPM_BUILD_ROOT%{_datadir}/gnome/autostart/gpk-update-icon.desktop
 
-for i in gpk-application gpk-update-viewer gpk-install-file gpk-log gpk-prefs gpk-repo ; do
+for i in gpk-application gpk-update-viewer gpk-install-file gpk-log gpk-prefs ; do
   desktop-file-install --delete-original                                \
     --dir=$RPM_BUILD_ROOT%{_datadir}/applications/                      \
     $RPM_BUILD_ROOT%{_datadir}/applications/$i.desktop
@@ -121,7 +121,6 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
 %{_bindir}/gpk-application
 %{_bindir}/gpk-install-*
 %{_bindir}/gpk-log
-%{_bindir}/gpk-repo
 %{_bindir}/gpk-update-icon
 %{_bindir}/gpk-update-viewer
 %{_bindir}/gpk-dbus-service
@@ -154,7 +153,6 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
 %{_datadir}/applications/gpk-prefs.desktop
 %{_datadir}/applications/gpk-install-catalog.desktop
 %{_datadir}/applications/gpk-log.desktop
-%{_datadir}/applications/gpk-repo.desktop
 %{_datadir}/applications/gpk-update-viewer.desktop
 %{_datadir}/dbus-1/services/org.freedesktop.PackageKit.service
 %{_datadir}/glib-2.0/schemas/org.gnome.packagekit.gschema.xml
diff --git a/data/Makefile.am b/data/Makefile.am
index df8814a..7f031e1 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -14,7 +14,6 @@ desktop_in_files =					\
 	gpk-prefs.desktop.in				\
 	gpk-application.desktop.in			\
 	gpk-update-viewer.desktop.in			\
-	gpk-repo.desktop.in				\
 	gpk-log.desktop.in				\
 	$(NULL)
 
@@ -26,11 +25,11 @@ autostart_in_files = gpk-update-icon.desktop.in
 autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
 
 pkgdata_DATA =						\
-	gpk-repo.ui					\
 	gpk-eula.ui					\
 	gpk-application.ui				\
 	gpk-update-viewer.ui				\
 	gpk-prefs.ui					\
+	gpk-repo.ui					\
 	gpk-service-pack.ui				\
 	gpk-signature.ui				\
 	gpk-error.ui					\
@@ -61,7 +60,6 @@ clean-local :
 	rm -f *~
 
 DISTCLEANFILES =					\
-	gpk-repo.desktop				\
 	gpk-prefs.desktop				\
 	gpk-service-pack.desktop			\
 	gpk-update-viewer.desktop			\
diff --git a/data/gpk-prefs.desktop.in b/data/gpk-prefs.desktop.in
index f9dc2c1..a54d67d 100644
--- a/data/gpk-prefs.desktop.in
+++ b/data/gpk-prefs.desktop.in
@@ -1,6 +1,6 @@
 [Desktop Entry]
 _Name=Software Updates
-_Comment=Change software update preferences
+_Comment=Change software update preferences and enable or disable software sources
 Icon=gpk-prefs
 Exec=gnome-control-center update
 Terminal=false
diff --git a/data/gpk-prefs.ui b/data/gpk-prefs.ui
index 9203dcb..6720b84 100644
--- a/data/gpk-prefs.ui
+++ b/data/gpk-prefs.ui
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
   <!-- interface-naming-policy toplevel-contextual -->
@@ -12,19 +12,16 @@
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox1">
         <property name="visible">True</property>
-        <property name="orientation">vertical</property>
         <property name="spacing">2</property>
         <child>
           <object class="GtkVBox" id="vbox4">
             <property name="visible">True</property>
             <property name="border_width">6</property>
-            <property name="orientation">vertical</property>
             <property name="spacing">18</property>
             <child>
               <object class="GtkVBox" id="vbox1">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkLabel" id="label_check">
                     <property name="visible">True</property>
@@ -47,7 +44,6 @@
                     <child>
                       <object class="GtkVBox" id="vbox8">
                         <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
                         <property name="spacing">5</property>
                         <child>
                           <object class="GtkTable" id="table1">
@@ -197,10 +193,133 @@
                 <property name="position">0</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkVBox" id="vbox2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <object class="GtkLabel" id="label_check2">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Software Sources</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="top_padding">6</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox3">
+                        <property name="visible">True</property>
+                        <property name="border_width">6</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox1">
+                            <property name="visible">True</property>
+                            <child>
+                              <object class="GtkLabel" id="label2">
+                                <property name="visible">True</property>
+                                <property name="xalign">0.49000000953674316</property>
+                                <property name="label" translatable="yes">A software source contains packages that can be installed on this computer.</property>
+                                <attributes>
+                                  <attribute name="style" value="normal"/>
+                                </attributes>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow_repo">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="vscrollbar_policy">automatic</property>
+                            <property name="shadow_type">in</property>
+                            <child>
+                              <object class="GtkTreeView" id="treeview_repo">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkViewport" id="viewport_animation_preview">
+                            <property name="resize_mode">queue</property>
+                            <child>
+                              <object class="GtkHBox" id="hbox_animation">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkLabel" id="label_animation">
+                                    <property name="visible">True</property>
+                                    <property name="label">Another action is in progress.</property>
+                                    <attributes>
+                                      <attribute name="weight" value="bold"/>
+                                    </attributes>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="checkbutton_detail">
+                            <property name="label" translatable="yes" comments="shows extra -source, -debuginfo, and -devel software sources">_Show debug and development software sources</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
             <property name="position">2</property>
           </packing>
         </child>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 60c9ba6..64ae689 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -14,7 +14,6 @@ data/gpk-log.desktop.in
 [type: gettext/glade]data/gpk-log.ui
 data/gpk-prefs.desktop.in
 [type: gettext/glade]data/gpk-prefs.ui
-data/gpk-repo.desktop.in
 [type: gettext/glade]data/gpk-repo.ui
 [type: gettext/glade]data/gpk-service-pack.desktop.in
 [type: gettext/glade]data/gpk-service-pack.ui
@@ -47,7 +46,6 @@ src/gpk-install-package-name.c
 src/gpk-install-provide-file.c
 src/gpk-log.c
 src/gpk-modal-dialog.c
-src/gpk-repo.c
 src/gpk-service-pack.c
 src/gpk-update-icon.c
 src/gpk-update-viewer.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 93c4d2f..9081050 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,7 +33,6 @@ ccpanels_LTLIBRARIES = libupdate.la
 
 bin_PROGRAMS =						\
 	gpk-application					\
-	gpk-repo					\
 	gpk-service-pack				\
 	gpk-install-catalog				\
 	gpk-install-local-file				\
@@ -211,6 +210,14 @@ gpk_service_pack_LDADD =				\
 libupdate_la_SOURCES =					\
 	egg-debug.h					\
 	egg-debug.c					\
+	gpk-animated-icon.c				\
+	gpk-animated-icon.h				\
+	gpk-enum.c					\
+	gpk-enum.h					\
+	gpk-common.c					\
+	gpk-common.h					\
+	gpk-error.c					\
+	gpk-error.h					\
 	cc-update-panel.c				\
 	cc-update-panel.h				\
 	$(NULL)
@@ -241,15 +248,6 @@ gpk_update_viewer_LDADD =				\
 	$(shared_LIBS)					\
 	$(NULL)
 
-gpk_repo_SOURCES =					\
-	gpk-repo.c					\
-	$(NULL)
-
-gpk_repo_LDADD =					\
-	libgpkshared.a					\
-	$(shared_LIBS)					\
-	$(NULL)
-
 gpk_log_SOURCES =					\
 	gpk-log.c					\
 	$(NULL)
diff --git a/src/cc-update-panel.c b/src/cc-update-panel.c
index 2ea72e9..32c07bb 100644
--- a/src/cc-update-panel.c
+++ b/src/cc-update-panel.c
@@ -34,10 +34,29 @@
 #include "gpk-common.h"
 #include "gpk-gnome.h"
 #include "gpk-enum.h"
+#include "gpk-error.h"
+#include "gpk-animated-icon.h"
 
 struct _CcUpdatePanelPrivate {
 	GtkBuilder		*builder;
 	GSettings		*settings;
+	GtkListStore		*list_store;
+	PkClient		*client;
+	PkBitfield		 roles;
+	GtkTreePath		*path_tmp;
+	const gchar		*id_tmp;
+	PkStatusEnum		 status;
+	GtkWidget		*image_animation;
+	guint			 status_id;
+};
+
+enum {
+	GPK_COLUMN_ENABLED,
+	GPK_COLUMN_TEXT,
+	GPK_COLUMN_ID,
+	GPK_COLUMN_ACTIVE,
+	GPK_COLUMN_SENSITIVE,
+	GPK_COLUMN_LAST
 };
 
 G_DEFINE_DYNAMIC_TYPE (CcUpdatePanel, cc_update_panel, CC_TYPE_PANEL)
@@ -198,7 +217,7 @@ cc_update_panel_update_freq_combo_setup (CcUpdatePanel *panel)
 
 	/* only do this after else we redraw the window */
 	g_signal_connect (G_OBJECT (widget), "changed",
-			  G_CALLBACK (cc_update_panel_update_freq_combo_changed), NULL);
+			  G_CALLBACK (cc_update_panel_update_freq_combo_changed), panel);
 }
 
 /**
@@ -235,7 +254,7 @@ cc_update_panel_upgrade_freq_combo_setup (CcUpdatePanel *panel)
 
 	/* only do this after else we redraw the window */
 	g_signal_connect (G_OBJECT (widget), "changed",
-			  G_CALLBACK (cc_update_panel_upgrade_freq_combo_changed), NULL);
+			  G_CALLBACK (cc_update_panel_upgrade_freq_combo_changed), panel);
 }
 
 /**
@@ -265,7 +284,7 @@ cc_update_panel_auto_update_combo_setup (CcUpdatePanel *panel)
 
 	/* only do this after else we redraw the window */
 	g_signal_connect (G_OBJECT (widget), "changed",
-			  G_CALLBACK (cc_update_panel_update_combo_changed), NULL);
+			  G_CALLBACK (cc_update_panel_update_combo_changed), panel);
 }
 
 /**
@@ -288,6 +307,451 @@ cc_update_panel_notify_network_state_cb (PkControl *control, GParamSpec *pspec,
 		gtk_widget_hide (widget);
 }
 
+
+/**
+ * cc_update_panel_find_iter_model_cb:
+ **/
+static gboolean
+cc_update_panel_find_iter_model_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, CcUpdatePanel *panel)
+{
+	gchar *repo_id_tmp = NULL;
+	gtk_tree_model_get (model, iter,
+			    GPK_COLUMN_ID, &repo_id_tmp,
+			    -1);
+	if (strcmp (repo_id_tmp, panel->priv->id_tmp) == 0) {
+		panel->priv->path_tmp = gtk_tree_path_copy (path);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+/**
+ * cc_update_panel_mark_nonactive_cb:
+ **/
+static gboolean
+cc_update_panel_mark_nonactive_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, CcUpdatePanel *panel)
+{
+	gtk_list_store_set (GTK_LIST_STORE(model), iter,
+			    GPK_COLUMN_ACTIVE, FALSE,
+			    -1);
+	return FALSE;
+}
+
+/**
+ * cc_update_panel_mark_nonactive:
+ **/
+static void
+cc_update_panel_mark_nonactive (CcUpdatePanel *panel, GtkTreeModel *model)
+{
+	gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) cc_update_panel_mark_nonactive_cb, panel);
+}
+
+/**
+ * cc_update_panel_model_get_iter:
+ **/
+static gboolean
+cc_update_panel_model_get_iter (CcUpdatePanel *panel, GtkTreeModel *model, GtkTreeIter *iter, const gchar *id)
+{
+	gboolean ret = TRUE;
+	panel->priv->id_tmp = id;
+	panel->priv->path_tmp = NULL;
+	gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) cc_update_panel_find_iter_model_cb, panel);
+	if (panel->priv->path_tmp == NULL) {
+		gtk_list_store_append (GTK_LIST_STORE(model), iter);
+	} else {
+		ret = gtk_tree_model_get_iter (model, iter, panel->priv->path_tmp);
+		gtk_tree_path_free (panel->priv->path_tmp);
+	}
+	return ret;
+}
+
+/**
+ * cc_update_panel_remove_nonactive_cb:
+ **/
+static gboolean
+cc_update_panel_remove_nonactive_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gboolean *ret)
+{
+	gboolean active;
+	gtk_tree_model_get (model, iter,
+			    GPK_COLUMN_ACTIVE, &active,
+			    -1);
+	if (!active) {
+		*ret = TRUE;
+		gtk_list_store_remove (GTK_LIST_STORE(model), iter);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+/**
+ * cc_update_panel_remove_nonactive:
+ **/
+static void
+cc_update_panel_remove_nonactive (GtkTreeModel *model)
+{
+	gboolean ret;
+	/* do this again and again as removing in gtk_tree_model_foreach causes errors */
+	do {
+		ret = FALSE;
+		gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) cc_update_panel_remove_nonactive_cb, &ret);
+	} while (ret);
+}
+
+/**
+ * cc_update_panel_status_changed_timeout_cb:
+ **/
+static gboolean
+cc_update_panel_status_changed_timeout_cb (CcUpdatePanel *panel)
+{
+	const gchar *text;
+	GtkWidget *widget;
+
+	/* set the text and show */
+	widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "viewport_animation_preview"));
+	gtk_widget_show (widget);
+	widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "label_animation"));
+	text = gpk_status_enum_to_localised_text (panel->priv->status);
+	gtk_label_set_label (GTK_LABEL (widget), text);
+
+	/* set icon */
+	gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (panel->priv->image_animation), panel->priv->status, GTK_ICON_SIZE_LARGE_TOOLBAR);
+
+	/* never repeat */
+	panel->priv->status_id = 0;
+	return FALSE;
+}
+
+/**
+ * cc_update_panel_progress_cb:
+ **/
+static void
+cc_update_panel_progress_cb (PkProgress *progress, PkProgressType type, CcUpdatePanel *panel)
+{
+	PkStatusEnum status;
+	GtkWidget *widget;
+
+	if (type != PK_PROGRESS_TYPE_STATUS)
+		return;
+
+	/* get value */
+	g_object_get (progress,
+		      "status", &panel->priv->status,
+		      NULL);
+	egg_debug ("now %s", pk_status_enum_to_text (status));
+
+	if (panel->priv->status == PK_STATUS_ENUM_FINISHED) {
+		/* we've not yet shown, so don't bother */
+		if (panel->priv->status_id > 0) {
+			g_source_remove (panel->priv->status_id);
+			panel->priv->status_id = 0;
+		}
+		widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "viewport_animation_preview"));
+		gtk_widget_hide (widget);
+		gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (panel->priv->image_animation), FALSE);
+		goto out;
+	}
+
+	/* already pending show */
+	if (panel->priv->status_id > 0)
+		goto out;
+
+	/* only show after some time in the transaction */
+	panel->priv->status_id = g_timeout_add (GPK_UI_STATUS_SHOW_DELAY, (GSourceFunc) cc_update_panel_status_changed_timeout_cb, panel);
+#if GLIB_CHECK_VERSION(2,25,8)
+	g_source_set_name_by_id (panel->priv->status_id, "[GpkRepo] status");
+#endif
+out:
+	return;
+}
+
+/**
+ * cc_update_panel_process_messages_cb:
+ **/
+static void
+cc_update_panel_process_messages_cb (PkMessage *item, CcUpdatePanel *panel)
+{
+	GtkWindow *window;
+	PkMessageEnum type;
+	gchar *details;
+	const gchar *title;
+
+	/* get data */
+	g_object_get (item,
+		      "type", &type,
+		      "details", &details,
+		      NULL);
+
+	/* show a modal window */
+	window = GTK_WINDOW (gtk_builder_get_object (panel->priv->builder, "dialog_prefs"));
+	title = gpk_message_enum_to_localised_text (type);
+	gpk_error_dialog_modal (window, title, details, NULL);
+
+	g_free (details);
+}
+
+/**
+ * cc_update_panel_repo_enable_cb
+ **/
+static void
+cc_update_panel_repo_enable_cb (GObject *object, GAsyncResult *res, CcUpdatePanel *panel)
+{
+	PkClient *client = PK_CLIENT (object);
+	GError *error = NULL;
+	PkResults *results = NULL;
+	PkError *error_code = NULL;
+	GtkWindow *window;
+	GPtrArray *array;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get set repo: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* check error code */
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to set repo: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		window = GTK_WINDOW (gtk_builder_get_object (panel->priv->builder, "dialog_prefs"));
+		/* TRANSLATORS: for one reason or another, we could not enable or disable a software source */
+		gpk_error_dialog_modal (window, _("Failed to change status"),
+					gpk_error_enum_to_localised_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		goto out;
+	}
+
+	/* process messages */
+	array = pk_results_get_message_array (results);
+	g_ptr_array_foreach (array, (GFunc) cc_update_panel_process_messages_cb, panel);
+	g_ptr_array_unref (array);
+out:
+	if (error_code != NULL)
+		g_object_unref (error_code);
+	if (results != NULL)
+		g_object_unref (results);
+}
+
+static void
+gpk_misc_enabled_toggled (GtkCellRendererToggle *cell, gchar *path_str, CcUpdatePanel *panel)
+{
+	GtkTreeModel *model;
+	GtkTreeView *treeview;
+	GtkTreeIter iter;
+	GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
+	gboolean enabled;
+	gchar *repo_id = NULL;
+
+	/* do we have the capability? */
+	if (pk_bitfield_contain (panel->priv->roles, PK_ROLE_ENUM_REPO_ENABLE) == FALSE) {
+		egg_debug ("can't change state");
+		goto out;
+	}
+
+	/* get toggled iter */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+	model = gtk_tree_view_get_model (treeview);
+	gtk_tree_model_get_iter (model, &iter, path);
+	gtk_tree_model_get (model, &iter,
+			    GPK_COLUMN_ENABLED, &enabled,
+			    GPK_COLUMN_ID, &repo_id, -1);
+
+	/* do something with the value */
+	enabled ^= 1;
+
+	/* set new value */
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			    GPK_COLUMN_SENSITIVE, FALSE,
+			    -1);
+
+	/* set the repo */
+	egg_debug ("setting %s to %i", repo_id, enabled);
+	pk_client_repo_enable_async (panel->priv->client, repo_id, enabled, NULL,
+				     (PkProgressCallback) cc_update_panel_progress_cb, panel,
+				     (GAsyncReadyCallback) cc_update_panel_repo_enable_cb, panel);
+
+out:
+	/* clean up */
+	g_free (repo_id);
+	gtk_tree_path_free (path);
+}
+
+/**
+ * gpk_treeview_add_columns:
+ **/
+static void
+gpk_treeview_add_columns (CcUpdatePanel *panel, GtkTreeView *treeview)
+{
+	GtkCellRenderer *renderer;
+	GtkTreeViewColumn *column;
+
+	/* column for enabled toggles */
+	renderer = gtk_cell_renderer_toggle_new ();
+	g_signal_connect (renderer, "toggled", G_CALLBACK (gpk_misc_enabled_toggled), panel);
+
+	/* TRANSLATORS: column if the source is enabled */
+	column = gtk_tree_view_column_new_with_attributes (_("Enabled"), renderer,
+							   "active", GPK_COLUMN_ENABLED,
+							   "sensitive", GPK_COLUMN_SENSITIVE,
+							   NULL);
+	gtk_tree_view_append_column (treeview, column);
+
+	/* column for text */
+	renderer = gtk_cell_renderer_text_new ();
+	/* TRANSLATORS: column for the source description */
+	column = gtk_tree_view_column_new_with_attributes (_("Software Source"), renderer,
+							   "markup", GPK_COLUMN_TEXT,
+							   NULL);
+	gtk_tree_view_column_set_sort_column_id (column, GPK_COLUMN_TEXT);
+	gtk_tree_view_append_column (treeview, column);
+}
+
+/**
+ * gpk_repos_treeview_clicked_cb:
+ **/
+static void
+gpk_repos_treeview_clicked_cb (GtkTreeSelection *selection, CcUpdatePanel *panel)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	gchar *repo_id;
+
+	/* This will only work in single or browse selection mode! */
+	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+		gtk_tree_model_get (model, &iter, GPK_COLUMN_ID, &repo_id, -1);
+		egg_debug ("selected row is: %s", repo_id);
+		g_free (repo_id);
+	} else {
+		egg_debug ("no row selected");
+	}
+}
+
+/**
+ * cc_update_panel_get_repo_list_cb
+ **/
+static void
+cc_update_panel_get_repo_list_cb (GObject *object, GAsyncResult *res, CcUpdatePanel *panel)
+{
+	PkClient *client = PK_CLIENT (object);
+	GError *error = NULL;
+	PkResults *results = NULL;
+	PkError *error_code = NULL;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	GtkWindow *window;
+	GPtrArray *array = NULL;
+	guint i;
+	PkRepoDetail *item;
+	GtkTreeIter iter;
+	gchar *repo_id;
+	gchar *description;
+	gboolean enabled;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get repo list: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* check error code */
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get repo list: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		window = GTK_WINDOW (gtk_builder_get_object (panel->priv->builder, "dialog_prefs"));
+		/* TRANSLATORS: for one reason or another, we could not get the list of sources */
+		gpk_error_dialog_modal (window, _("Failed to get the list of sources"),
+					gpk_error_enum_to_localised_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		goto out;
+	}
+
+	/* add repos */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+	model = gtk_tree_view_get_model (treeview);
+	array = pk_results_get_repo_detail_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+		g_object_get (item,
+			      "repo-id", &repo_id,
+			      "description", &description,
+			      "enabled", &enabled,
+			      NULL);
+		egg_debug ("repo = %s:%s:%i", repo_id, description, enabled);
+		cc_update_panel_model_get_iter (panel, model, &iter, repo_id);
+		gtk_list_store_set (panel->priv->list_store, &iter,
+				    GPK_COLUMN_ENABLED, enabled,
+				    GPK_COLUMN_TEXT, description,
+				    GPK_COLUMN_ID, repo_id,
+				    GPK_COLUMN_ACTIVE, TRUE,
+				    GPK_COLUMN_SENSITIVE, TRUE,
+				    -1);
+
+		g_free (repo_id);
+		g_free (description);
+	}
+
+	/* remove the items that are not now present */
+	cc_update_panel_remove_nonactive (model);
+
+	/* sort */
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(panel->priv->list_store), GPK_COLUMN_TEXT, GTK_SORT_ASCENDING);
+out:
+	if (error_code != NULL)
+		g_object_unref (error_code);
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
+}
+
+/**
+ * cc_update_panel_repo_list_refresh:
+ **/
+static void
+cc_update_panel_repo_list_refresh (CcUpdatePanel *panel)
+{
+	PkBitfield filters;
+	GtkWidget *widget;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	gboolean show_details;
+
+	/* mark the items as not used */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+	model = gtk_tree_view_get_model (treeview);
+	cc_update_panel_mark_nonactive (panel, model);
+
+	egg_debug ("refreshing list");
+	widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "checkbutton_detail"));
+	show_details = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+	if (!show_details)
+		filters = pk_bitfield_value (PK_FILTER_ENUM_NOT_DEVELOPMENT);
+	else
+		filters = pk_bitfield_value (PK_FILTER_ENUM_NONE);
+	pk_client_get_repo_list_async (panel->priv->client, filters, NULL,
+				       (PkProgressCallback) cc_update_panel_progress_cb, panel,
+				       (GAsyncReadyCallback) cc_update_panel_get_repo_list_cb, panel);
+}
+
+/**
+ * cc_update_panel_repo_list_changed_cb:
+ **/
+static void
+cc_update_panel_repo_list_changed_cb (PkControl *control, CcUpdatePanel *panel)
+{
+	cc_update_panel_repo_list_refresh (panel);
+}
+
+/**
+ * cc_update_panel_checkbutton_detail_cb:
+ **/
+static void
+cc_update_panel_checkbutton_detail_cb (GtkWidget *widget, CcUpdatePanel *panel)
+{
+	cc_update_panel_repo_list_refresh (panel);
+}
+
 /**
  * cc_update_panel_get_properties_cb:
  **/
@@ -298,7 +762,6 @@ cc_update_panel_get_properties_cb (GObject *object, GAsyncResult *res, CcUpdateP
 	GError *error = NULL;
 	PkControl *control = PK_CONTROL(object);
 	gboolean ret;
-	PkBitfield roles;
 	PkNetworkEnum state;
 
 	/* get the result */
@@ -312,7 +775,7 @@ cc_update_panel_get_properties_cb (GObject *object, GAsyncResult *res, CcUpdateP
 
 	/* get values */
 	g_object_get (control,
-		      "roles", &roles,
+		      "roles", &panel->priv->roles,
 		      "network-state", &state,
 		      NULL);
 
@@ -321,12 +784,34 @@ cc_update_panel_get_properties_cb (GObject *object, GAsyncResult *res, CcUpdateP
 	gtk_widget_set_visible (widget, (state == PK_NETWORK_ENUM_MOBILE));
 
 	/* hide if not supported */
-	if (!pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES)) {
+	if (!pk_bitfield_contain (panel->priv->roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES)) {
 		widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "label_upgrade"));
 		gtk_widget_hide (widget);
 		widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "combobox_upgrade"));
 		gtk_widget_hide (widget);
 	}
+
+	/* setup sources GUI elements */
+	if (pk_bitfield_contain (panel->priv->roles, PK_ROLE_ENUM_GET_REPO_LIST)) {
+		cc_update_panel_repo_list_refresh (panel);
+	} else {
+		GtkTreeIter iter;
+		GtkTreeView *treeview = GTK_TREE_VIEW (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+		GtkTreeModel *model = gtk_tree_view_get_model (treeview);
+
+		gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+		gtk_list_store_set (panel->priv->list_store, &iter,
+				    GPK_COLUMN_ENABLED, FALSE,
+				    GPK_COLUMN_TEXT, _("Getting software source list not supported by backend"),
+				    GPK_COLUMN_ACTIVE, FALSE,
+				    GPK_COLUMN_SENSITIVE, FALSE,
+				    -1);
+
+		widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "checkbutton_detail"));
+		gtk_widget_set_sensitive (widget, FALSE);
+	}
 out:
 	return;
 }
@@ -350,6 +835,8 @@ cc_update_panel_finalize (GObject *object)
 	CcUpdatePanel *panel = CC_UPDATE_PANEL (object);
 	g_object_unref (panel->priv->builder);
 	g_object_unref (panel->priv->settings);
+	g_object_unref (panel->priv->list_store);
+	g_object_unref (panel->priv->client);
 	G_OBJECT_CLASS (cc_update_panel_parent_class)->finalize (object);
 }
 
@@ -361,9 +848,15 @@ cc_update_panel_init (CcUpdatePanel *panel)
 	PkControl *control;
 	guint retval;
 	GError *error = NULL;
+	GtkTreeSelection *selection;
+	GtkBox *box;
 
 	panel->priv = CC_UPDATE_PREFS_GET_PRIVATE (panel);
 
+	/* add application specific icons to search path */
+	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
+                                           GPK_DATA G_DIR_SEPARATOR_S "icons");
+
 	/* load settings */
 	panel->priv->settings = g_settings_new (GPK_SETTINGS_SCHEMA);
 
@@ -371,6 +864,13 @@ cc_update_panel_init (CcUpdatePanel *panel)
 	control = pk_control_new ();
 	g_signal_connect (control, "notify::network-state",
 			  G_CALLBACK (cc_update_panel_notify_network_state_cb), panel);
+	g_signal_connect (control, "repo-list-changed",
+			  G_CALLBACK (cc_update_panel_repo_list_changed_cb), panel);
+
+	panel->priv->client = pk_client_new ();
+	g_object_set (panel->priv->client,
+		      "background", FALSE,
+		      NULL);
 
 	/* get UI */
 	panel->priv->builder = gtk_builder_new ();
@@ -396,6 +896,39 @@ cc_update_panel_init (CcUpdatePanel *panel)
 	cc_update_panel_upgrade_freq_combo_setup (panel);
 	cc_update_panel_auto_update_combo_setup (panel);
 
+	/* add animated widget */
+	panel->priv->image_animation = gpk_animated_icon_new ();
+	box = GTK_BOX (gtk_builder_get_object (panel->priv->builder, "hbox_animation"));
+	gtk_box_pack_start (box, panel->priv->image_animation, FALSE, FALSE, 0);
+	gtk_box_reorder_child (box, panel->priv->image_animation, 0);
+	gtk_widget_show (panel->priv->image_animation);
+
+	widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "checkbutton_detail"));
+	g_settings_bind (panel->priv->settings,
+			 GPK_SETTINGS_REPO_SHOW_DETAILS,
+			 widget, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (cc_update_panel_checkbutton_detail_cb), panel);
+
+	/* create list stores */
+	panel->priv->list_store = gtk_list_store_new (GPK_COLUMN_LAST, G_TYPE_BOOLEAN,
+						      G_TYPE_STRING, G_TYPE_STRING,
+						      G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
+
+	/* create repo tree view */
+	widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "treeview_repo"));
+	gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
+				 GTK_TREE_MODEL (panel->priv->list_store));
+
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+	g_signal_connect (selection, "changed",
+			  G_CALLBACK (gpk_repos_treeview_clicked_cb), panel);
+
+	/* add columns to the tree view */
+	gpk_treeview_add_columns (panel, GTK_TREE_VIEW (widget));
+	gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
+
 	/* get some data */
 	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) cc_update_panel_get_properties_cb, panel);
 out:
diff --git a/src/gpk-application.c b/src/gpk-application.c
index d132e0a..c51bb8a 100644
--- a/src/gpk-application.c
+++ b/src/gpk-application.c
@@ -2838,7 +2838,7 @@ gpk_application_menu_sources_cb (GtkAction *action, GpkApplication *application)
 	window = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "window_manager"));
 	xid = gdk_x11_drawable_get_xid (gtk_widget_get_window (window));
 
-	command = g_strdup_printf ("%s/gpk-repo --parent-window %u", BINDIR, xid);
+	command = g_strdup_printf ("%s/gnome-control-center update --parent-window %u", BINDIR, xid);
 	egg_debug ("running: %s", command);
 	ret = g_spawn_command_line_async (command, NULL);
 	if (!ret) {



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