[gnome-packagekit] Remove gpk-repo and merge the functionality into the control center panel
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-packagekit] Remove gpk-repo and merge the functionality into the control center panel
- Date: Tue, 6 Jul 2010 21:20:15 +0000 (UTC)
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]