You'll find in attachement a patch which add a progress bar to the tray
icon during download (you'll also find a small screenshot).

I'm not a great designer, so it's quite simple. It consists of 2 svg
images: one "gPodder" green rectangle for the background, one dark green
rectangle for the progress.
I'm open for any comment or suggestion (horizontal, vertical, diagonal,
left, right, blue, red, ...), but keep it light...

Jérôme





Index: bin/gpodder
===================================================================
--- bin/gpodder	(revision 579)
+++ bin/gpodder	(working copy)
@@ -127,6 +127,7 @@
         #default run gui
         gpodder.interface_is_gui = True
         from gpodder import gui
+        from gpodder import trayicon
         from gpodder.SimpleGladeApp import bindtextdomain
         import gtk.glade
 
@@ -139,11 +140,15 @@
         gui.glade_dir = os.path.join( prefix, *gui.glade_dir)
         gui.icon_dir = os.path.join( prefix, *gui.icon_dir)
         gui.scalable_dir = os.path.join( prefix, *gui.scalable_dir)
+        trayicon.progress_bar_dir = os.path.join( prefix, *trayicon.progress_bar_dir)
+        trayicon.progress_bar_background_dir = os.path.join( prefix, *trayicon.progress_bar_background_dir)
 
         if options.local:
             gui.glade_dir = os.path.join( prefix, 'data')
             gui.icon_dir = os.path.join( prefix, 'data', 'gpodder.png')
             gui.scalable_dir = os.path.join( prefix, 'data', 'gpodder.svg')
+            trayicon.progress_bar_dir = os.path.join( prefix, 'data', 'tray_icon_progress_bar.svg')
+            trayicon.progress_bar_background_dir = os.path.join( prefix, 'data', 'tray_icon_progress_bar_background.svg')
             locale_dir = os.path.join( prefix, 'data', 'locale')
 
         bindtextdomain( domain, locale_dir)
Index: data/tray_icon_progress_bar.svg
===================================================================
--- data/tray_icon_progress_bar.svg	(revision 0)
+++ data/tray_icon_progress_bar.svg	(revision 0)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"; 
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:ev="http://www.w3.org/2001/xml-events";
+   version="1.1"
+   baseProfile="full"
+   x="0"
+   y="0"
+   width="4"
+   height="48"
+   id="svg2">
+  <title>Rectangles</title>
+  <defs
+     id="defs4" />
+  <g
+     id="layer1">
+    <rect
+       width="4"
+       height="48"
+       x="0"
+       y="0"
+       fill="green"
+       id="rect1306" />
+  </g>
+</svg>
Index: data/tray_icon_progress_bar_background.svg
===================================================================
--- data/tray_icon_progress_bar_background.svg	(revision 0)
+++ data/tray_icon_progress_bar_background.svg	(revision 0)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"; 
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:ev="http://www.w3.org/2001/xml-events";
+   version="1.1"
+   baseProfile="full"
+   x="0"
+   y="0"
+   width="4"
+   height="48"
+   id="svg2">
+  <title>Rectangles</title>
+  <defs
+     id="defs4" />
+  <g
+     id="layer1">
+    <rect
+       width="4"
+       height="48"
+       x="0"
+       y="0"
+       fill="#73d216"
+       id="rect1306" />
+  </g>
+</svg>
Index: setup.py
===================================================================
--- setup.py	(revision 579)
+++ setup.py	(working copy)
@@ -44,12 +44,16 @@
 inst_icons_22 = [ 'data/icons/22/gpodder.png' ]
 inst_icons_16 = [ 'data/icons/16/gpodder.png' ]
 inst_icons_svg = [ 'data/gpodder.svg' ]
+inst_tray_progress_svg = [ 'data/tray_icon_progress_bar.svg' ]
+inst_tray_progress_bg_svg = [ 'data/tray_icon_progress_bar_background.svg' ]
 
 data_files = [
   ('share/man/man1',       inst_manpages),
   ('share/gpodder',        inst_share),
   ('share/applications',   inst_desktop),
   ('share/pixmaps',        inst_icons),
+  ('share/gpodder',        inst_tray_progress_svg),
+  ('share/gpodder',        inst_tray_progress_bg_svg),
 
   ('share/icons/hicolor/scalable/apps', inst_icons_svg),
   ('share/icons/hicolor/48x48/apps', inst_icons),
Index: src/gpodder/trayicon.py
===================================================================
--- src/gpodder/trayicon.py	(revision 579)
+++ src/gpodder/trayicon.py	(working copy)
@@ -41,6 +41,9 @@
 
 from libgpodder import gPodderLib
 
+progress_bar_dir = ['share', 'gpodder', 'tray_icon_progress_bar.svg']
+progress_bar_background_dir = ['share', 'gpodder', 'tray_icon_progress_bar_background.svg']
+
 class GPodderStatusIcon(gtk.StatusIcon):
     """ this class display a status icon in the system tray
     this icon serves to show or hide gPodder, notify dowload status
@@ -77,6 +80,7 @@
         self.__is_downloading = False
         self.__synchronisation_device = None
         self.__download_start_time = None
+        self.__previous_progress_bar_height = 0
 
         self.__previous_notification = []
 
@@ -86,6 +90,15 @@
         except Exception, exc:
             log('Warning: Cannot load gPodder icon, will use the default icon (%s)', exc, sender=self)
             self.__icon = gtk.icon_theme_get_default().load_icon(gtk.STOCK_DIALOG_QUESTION, 30, 30)
+            
+        # try getting the icons for progress bar
+        self.__progress_bar = None
+        self.__progress_bar_bg = None
+        try:
+            self.__progress_bar = gtk.gdk.pixbuf_new_from_file(progress_bar_dir)
+            self.__progress_bar_bg = gtk.gdk.pixbuf_new_from_file(progress_bar_background_dir)
+        except Exception, exc:
+            log('Warning: Cannot load icon for progress bar, progress bar disabled (%s)', exc, sender=self)
 
         # Reset trayicon (default icon, default tooltip)
         self.set_status()
@@ -215,6 +228,8 @@
                 tooltip.append(self.format_episode_list(self.__finished_downloads, _('Finished downloads:')))
 
             self.set_status(self.STATUS_DOWNLOAD_IN_PROGRESS, ''.join(tooltip))
+            
+            self.progress_bar(percentage/100)
         else:
             self.__is_downloading = False
             self.__download_start_time = None
@@ -320,12 +335,20 @@
         self.set_tooltip(tooltip)
 
     def format_episode_list(self, episode_list, caption=''):
-        """Format a list of episodes for tooltips and notifications
-        The parameter "episode_list" can either be a list containing
-        podcastItem objects or a list of strings.
+        """
+        Format a list of episodes for tooltips and notifications
+        Return a listing of episodes title separated by a line break.
+        Long title are troncated: "xxxx...xxxx"
+        If the list is too long, it is cut and the string "x others episodes" is append
+        
+        episode_list
+            can be either a list containing podcastItem objects 
+            or a list of strings of episode's title.
 
-        A formatted list of episodes is returned.
+        return
+            the formatted list of episodes as a string
         """
+        
         MAX_EPISODES = 10
         MAX_TITLE_LENGTH = 100
 
@@ -384,5 +407,37 @@
             self.send_notification(_('Your device has been updated by gPodder.'), _('Operation finished'))
         self.set_status()
         
+    def progress_bar(self, ratio):
+        """
+        draw a progress bar on top of the tray icon.
+        Be sure to call this method the first time with ratio=0
+        in order to initialise background image
+            
+        ratio
+            value between 0 and 1 (inclusive) indicating the ratio 
+            of the progress bar to be drawn
+                
+        """
+        
+        # exit if no svg was found
+        if not self.__progress_bar_bg: return
+        
+        bar_height=round(self.__progress_bar.get_height() * ratio) + 1
+        icon = self.get_pixbuf() 
+        pos_left=0
 
-        
+        if ratio == 0 or bar_height < self.__previous_progress_bar_height:
+            # for some reason, the bar went back, need to redraw the background
+            bg = self.__progress_bar_bg
+            bg.composite(icon, pos_left, 0, bg.get_width(), bg.get_height(), 0, 0, 1, 1, gtk.gdk.INTERP_NEAREST, 255)
+            log('(re)init %ipx progress bar for ratio %f', bar_height, ratio , sender=self)
+
+        if bar_height == self.__previous_progress_bar_height:
+            # only draw when a new pixel is needed
+            return
+
+        pb = self.__progress_bar
+        pb.composite(icon, pos_left, icon.get_height() - bar_height, pb.get_width(), bar_height, 0, 0, 1, 1, gtk.gdk.INTERP_NEAREST, 255)
+        self.set_from_pixbuf(icon)
+        self.__previous_progress_bar_height = bar_height
+

<<inline: progressbar.png>>

_______________________________________________
gpodder-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/gpodder-devel

Reply via email to