[tracker] TrackerStatusIcon: Update icon according to miners' status.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] TrackerStatusIcon: Update icon according to miners' status.
- Date: Tue, 8 Sep 2009 08:31:14 +0000 (UTC)
commit cb75e2ba9d850de4d6674ac560724502c7a12712
Author: Carlos Garnacho <carlos lanedo com>
Date: Mon Sep 7 18:06:04 2009 +0200
TrackerStatusIcon: Update icon according to miners' status.
This takes into account idle/paused/active/inactive miners.
src/tracker-applet/tracker-status-icon.c | 89 +++++++++++++++++++++++++-----
1 files changed, 75 insertions(+), 14 deletions(-)
---
diff --git a/src/tracker-applet/tracker-status-icon.c b/src/tracker-applet/tracker-status-icon.c
index fd6c6a4..ceae6d7 100644
--- a/src/tracker-applet/tracker-status-icon.c
+++ b/src/tracker-applet/tracker-status-icon.c
@@ -63,9 +63,11 @@ struct MinerMenuEntry {
GtkWidget *box;
GtkWidget *state;
GtkWidget *name;
- GtkWidget *progress;
+ GtkWidget *progress_bar;
+ gdouble progress;
guint32 cookie;
+ guint active : 1;
};
static void status_icon_constructed (GObject *object);
@@ -234,6 +236,53 @@ status_icon_popup_menu (GtkStatusIcon *icon,
}
static void
+update_icon_status (TrackerStatusIcon *icon)
+{
+ TrackerStatusIconPrivate *priv;
+ GHashTableIter iter;
+ gpointer key, value;
+ gint miners_idle, miners_indexing, miners_paused;
+ TrackerStatus status;
+
+ priv = TRACKER_STATUS_ICON_GET_PRIVATE (icon);
+ g_hash_table_iter_init (&iter, priv->miners);
+ miners_idle = miners_indexing = miners_paused = 0;
+
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ MinerMenuEntry *entry = value;
+
+ if (!entry->active) {
+ miners_idle++;
+ } else {
+ if (entry->cookie == 0) {
+ if (entry->progress != 1) {
+ miners_indexing++;
+ } else {
+ miners_idle++;
+ }
+ } else {
+ miners_paused++;
+ }
+ }
+ }
+
+ if (miners_indexing > 0) {
+ /* Some miner is indexing, the others are either
+ * paused or inactive, so we shouldn't care about them
+ */
+ status = STATUS_INDEXING;
+ } else if (miners_paused > 0) {
+ /* All active miners are paused */
+ status = STATUS_PAUSED;
+ } else {
+ /* No paused nor running miners */
+ status = STATUS_IDLE;
+ }
+
+ status_icon_set_status (icon, status);
+}
+
+static void
status_icon_miner_progress (TrackerMinerManager *manager,
const gchar *miner_name,
const gchar *status,
@@ -255,20 +304,15 @@ status_icon_miner_progress (TrackerMinerManager *manager,
}
gtk_widget_set_tooltip_text (entry->box, status);
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (entry->progress), progress);
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (entry->progress_bar), progress);
progress_str = g_strdup_printf ("%3.0f%%", progress * 100);
- gtk_progress_bar_set_text (GTK_PROGRESS_BAR (entry->progress), progress_str);
+ gtk_progress_bar_set_text (GTK_PROGRESS_BAR (entry->progress_bar), progress_str);
g_free (progress_str);
- if (progress == 1) {
- /* This miner has finished, check whether
- * there are more active ones, and set to idle
- * if necessary.
- */
- } else {
- status_icon_set_status (icon, STATUS_INDEXING);
- }
+ entry->progress = progress;
+
+ update_icon_status (icon);
}
static void
@@ -292,6 +336,8 @@ status_icon_miner_paused (TrackerMinerManager *manager,
gtk_image_set_from_stock (GTK_IMAGE (entry->state),
GTK_STOCK_MEDIA_PAUSE,
GTK_ICON_SIZE_MENU);
+
+ update_icon_status (icon);
}
static void
@@ -315,6 +361,8 @@ status_icon_miner_resumed (TrackerMinerManager *manager,
gtk_image_set_from_stock (GTK_IMAGE (entry->state),
GTK_STOCK_MEDIA_PLAY,
GTK_ICON_SIZE_MENU);
+
+ update_icon_status (icon);
}
static void
@@ -336,6 +384,9 @@ status_icon_miner_activated (TrackerMinerManager *manager,
}
gtk_widget_set_sensitive (entry->menu_item, TRUE);
+ entry->active = TRUE;
+
+ update_icon_status (icon);
}
static void
@@ -357,6 +408,14 @@ status_icon_miner_deactivated (TrackerMinerManager *manager,
}
gtk_widget_set_sensitive (entry->menu_item, FALSE);
+ status_icon_miner_progress (priv->manager, miner_name,
+ _("Miner is not running"), 0.0, icon);
+ entry->active = FALSE;
+
+ /* invalidate pause cookie */
+ entry->cookie = 0;
+
+ update_icon_status (icon);
}
static void
@@ -419,10 +478,10 @@ miner_menu_entry_add (TrackerStatusIcon *icon,
entry->name = gtk_label_new (name);
gtk_misc_set_alignment (GTK_MISC (entry->name), 0, 0.5);
- entry->progress = gtk_progress_bar_new ();
+ entry->progress_bar = gtk_progress_bar_new ();
gtk_box_pack_start (GTK_BOX (entry->box), entry->name, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (entry->box), entry->progress, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (entry->box), entry->progress_bar, TRUE, TRUE, 0);
gtk_size_group_add_widget (priv->size_group, entry->name);
@@ -437,7 +496,9 @@ miner_menu_entry_add (TrackerStatusIcon *icon,
gtk_menu_shell_append (GTK_MENU_SHELL (priv->miner_menu), entry->menu_item);
- if (!tracker_miner_manager_is_active (priv->manager, miner)) {
+ entry->active = tracker_miner_manager_is_active (priv->manager, miner);
+
+ if (!entry->active) {
gtk_widget_set_sensitive (entry->menu_item, FALSE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]