[tracker] tracker-status-icon: Make progress menu more visually attractive
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] tracker-status-icon: Make progress menu more visually attractive
- Date: Thu, 15 Oct 2009 16:33:26 +0000 (UTC)
commit 325b075314f53051993cccb59886ddbdf84f2050
Author: Martyn Russell <martyn lanedo com>
Date: Thu Oct 15 17:24:15 2009 +0100
tracker-status-icon: Make progress menu more visually attractive
src/tracker-status-icon/tracker-status-icon.c | 120 ++++++++++++++++++++++---
1 files changed, 108 insertions(+), 12 deletions(-)
---
diff --git a/src/tracker-status-icon/tracker-status-icon.c b/src/tracker-status-icon/tracker-status-icon.c
index 52b837e..9babfad 100644
--- a/src/tracker-status-icon/tracker-status-icon.c
+++ b/src/tracker-status-icon/tracker-status-icon.c
@@ -68,8 +68,12 @@ struct MinerMenuEntry {
GtkWidget *state;
GtkWidget *name;
GtkWidget *progress_bar;
+ GtkWidget *progress_percentage;
+ gchar *status;
gdouble progress;
+ gboolean paused;
+ guint pulse_id;
guint32 cookie;
guint active : 1;
};
@@ -127,6 +131,18 @@ tracker_status_icon_class_init (TrackerStatusIconClass *klass)
}
static void
+miner_menu_entry_free (MinerMenuEntry *entry)
+{
+ if (entry->pulse_id) {
+ g_source_remove (entry->pulse_id);
+ entry->pulse_id = 0;
+ }
+
+ g_free (entry->status);
+ g_free (entry);
+}
+
+static void
tracker_status_icon_init (TrackerStatusIcon *icon)
{
TrackerStatusIconPrivate *priv;
@@ -157,7 +173,7 @@ tracker_status_icon_init (TrackerStatusIcon *icon)
priv->miners = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
- (GDestroyNotify) g_free);
+ (GDestroyNotify) miner_menu_entry_free);
priv->miner_menu = gtk_menu_new ();
priv->context_menu = status_icon_create_context_menu (icon);
@@ -291,9 +307,61 @@ update_icon_status (TrackerStatusIcon *icon)
status = STATUS_IDLE;
}
+ /* entry = g_hash_table_lookup (priv->miners, miner_name); */
+
status_icon_set_status (icon, status);
}
+static gboolean
+status_icon_miner_pulse (gpointer user_data)
+{
+ MinerMenuEntry *entry = user_data;
+
+ gtk_progress_bar_pulse (GTK_PROGRESS_BAR (entry->progress_bar));
+
+ return TRUE;
+}
+
+static void
+status_icon_miner_pulse_start (MinerMenuEntry *entry)
+{
+ if (entry->pulse_id == 0) {
+ entry->pulse_id = g_timeout_add (100, status_icon_miner_pulse, entry);
+ }
+}
+
+static void
+status_icon_miner_pulse_stop (MinerMenuEntry *entry)
+{
+ if (entry->pulse_id != 0) {
+ g_source_remove (entry->pulse_id);
+ entry->pulse_id = 0;
+ }
+}
+
+static void
+status_icon_miner_progress_set (MinerMenuEntry *entry)
+{
+ gchar *progress_str;
+
+ if (!entry->paused) {
+ if (entry->progress == 0.00) {
+ status_icon_miner_pulse_start (entry);
+ } else {
+ status_icon_miner_pulse_stop (entry);
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (entry->progress_bar), entry->progress);
+ }
+ } else {
+ status_icon_miner_pulse_stop (entry);
+ }
+
+ progress_str = g_strdup_printf ("%3.0f%%", entry->progress * 100);
+ gtk_label_set_text (GTK_LABEL (entry->progress_percentage), progress_str);
+ g_free (progress_str);
+
+ gtk_widget_set_tooltip_text (entry->box, entry->status);
+}
+
static void
status_icon_miner_progress (TrackerMinerManager *manager,
const gchar *miner_name,
@@ -304,7 +372,6 @@ status_icon_miner_progress (TrackerMinerManager *manager,
TrackerStatusIconPrivate *priv;
TrackerStatusIcon *icon;
MinerMenuEntry *entry;
- gchar *progress_str;
icon = TRACKER_STATUS_ICON (user_data);
priv = TRACKER_STATUS_ICON_GET_PRIVATE (icon);
@@ -315,15 +382,11 @@ status_icon_miner_progress (TrackerMinerManager *manager,
return;
}
- gtk_widget_set_tooltip_text (entry->box, status);
- 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_bar), progress_str);
- g_free (progress_str);
-
+ g_free (entry->status);
+ entry->status = g_strdup (status);
entry->progress = progress;
+ status_icon_miner_progress_set (entry);
update_icon_status (icon);
}
@@ -345,6 +408,9 @@ status_icon_miner_paused (TrackerMinerManager *manager,
return;
}
+ entry->paused = TRUE;
+ status_icon_miner_progress_set (entry);
+
gtk_image_set_from_stock (GTK_IMAGE (entry->state),
GTK_STOCK_MEDIA_PAUSE,
GTK_ICON_SIZE_MENU);
@@ -370,6 +436,9 @@ status_icon_miner_resumed (TrackerMinerManager *manager,
return;
}
+ entry->paused = FALSE;
+ status_icon_miner_progress_set (entry);
+
gtk_image_set_from_stock (GTK_IMAGE (entry->state),
GTK_STOCK_MEDIA_PLAY,
GTK_ICON_SIZE_MENU);
@@ -396,6 +465,7 @@ status_icon_miner_activated (TrackerMinerManager *manager,
}
gtk_widget_set_sensitive (entry->menu_item, TRUE);
+ gtk_widget_show (entry->progress_bar);
entry->active = TRUE;
update_icon_status (icon);
@@ -420,6 +490,8 @@ status_icon_miner_deactivated (TrackerMinerManager *manager,
}
gtk_widget_set_sensitive (entry->menu_item, FALSE);
+ gtk_widget_hide (entry->progress_bar);
+
status_icon_miner_progress (priv->manager, miner_name,
_("Miner is not running"), 0.0, icon);
entry->active = FALSE;
@@ -479,24 +551,47 @@ miner_menu_entry_add (TrackerStatusIcon *icon,
{
TrackerStatusIconPrivate *priv;
MinerMenuEntry *entry;
+ PangoFontDescription *fontdesc;
+ PangoFontMetrics *metrics;
+ PangoContext *context;
+ PangoLanguage *lang;
const gchar *name;
gchar *str;
+ gint ascent;
priv = TRACKER_STATUS_ICON_GET_PRIVATE (icon);
name = tracker_miner_manager_get_display_name (priv->manager, miner);
str = g_strdup (miner);
entry = g_new0 (MinerMenuEntry, 1);
+
entry->box = gtk_hbox_new (FALSE, 6);
entry->state = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY,
GTK_ICON_SIZE_MENU);
entry->name = gtk_label_new (name);
- gtk_misc_set_alignment (GTK_MISC (entry->name), 0, 0.5);
+ gtk_misc_set_alignment (GTK_MISC (entry->name), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (entry->box), entry->name, TRUE, TRUE, 0);
+
+ entry->progress_percentage = gtk_label_new ("");
+ gtk_misc_set_alignment (GTK_MISC (entry->progress_percentage), 1.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (entry->box), entry->progress_percentage, FALSE, TRUE, 0);
entry->progress_bar = gtk_progress_bar_new ();
+ gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (entry->progress_bar), 0.02);
+ gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (entry->progress_bar), PANGO_ELLIPSIZE_END);
+
+ /* Get the font ascent for the current font and language */
+ context = gtk_widget_get_pango_context (entry->progress_bar);
+ fontdesc = pango_context_get_font_description (context);
+ lang = pango_context_get_language (context);
+ metrics = pango_context_get_metrics (context, fontdesc, lang);
+ ascent = pango_font_metrics_get_ascent (metrics) * 1.5 / PANGO_SCALE;
+ pango_font_metrics_unref (metrics);
+
+ /* Size our progress bar to be five ascents long */
+ gtk_widget_set_size_request (entry->progress_bar, ascent * 5, -1);
- gtk_box_pack_start (GTK_BOX (entry->box), entry->name, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (entry->box), entry->progress_bar, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (entry->box), entry->progress_bar, FALSE, TRUE, 0);
gtk_size_group_add_widget (priv->size_group, entry->name);
@@ -515,6 +610,7 @@ miner_menu_entry_add (TrackerStatusIcon *icon,
if (!entry->active) {
gtk_widget_set_sensitive (entry->menu_item, FALSE);
+ gtk_widget_hide (entry->progress_bar);
}
g_hash_table_replace (priv->miners, str, entry);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]