On Wednesday 08 September 2004 10:34, Dirk Meyer wrote:
> BTW, what about using an extra file for each plugin? I guess it would
> look much cleaner and having all the code in __init__.py is very bad.
>
>
> Dischi


Done, all IdleBarPlugins are now seperated into files.


Viggo
diff -Naur freevo/src/plugins/idlebar/__init__.py freevo_devel/src/plugins/idlebar/__init__.py
--- freevo/src/plugins/idlebar/__init__.py	2004-09-13 22:00:38.675851359 +0200
+++ freevo_devel/src/plugins/idlebar/__init__.py	2004-09-13 22:08:05.000000000 +0200
@@ -4,17 +4,6 @@
 # -----------------------------------------------------------------------
 # $Id: __init__.py,v 1.29 2004/09/08 08:33:13 dischi Exp $
 #
-# Documentation moved to the corresponding classes, so that the help
-# interface returns something usefull.
-# Available plugins:
-#       idlebar
-#       idlebar.clock
-#       idlebar.cdstatus
-#       idlebar.mail
-#       idlebar.tv
-#       idlebar.weather
-#       idlebar.holidays
-#
 # -----------------------------------------------------------------------
 # $Log: __init__.py,v $
 # Revision 1.29  2004/09/08 08:33:13  dischi
@@ -84,22 +73,14 @@
 #
 # ----------------------------------------------------------------------- */
 
-
+# python modules
 import time
-import os
-import sys
-import string
-import types
-import mailbox
-import re
 import locale
 
+# freevo modules
 import config
 import plugin
-import util.tv_util as tv_util
-import util.pymetar as pymetar
 import gui
-import gui.imagelib
 import eventhandler
 from event import *
 
@@ -308,418 +289,3 @@
         for o in self.objects:
             o.unparent()
         self.objects = []
-
-
-
-
-class clock(IdleBarPlugin):
-    """
-    Shows the current time.
-
-    Activate with:
-    plugin.activate('idlebar.clock',   level=50)
-    Note: The clock will always be displayed on the right side of
-    the idlebar.
-    """
-    def __init__(self, format=''):
-        IdleBarPlugin.__init__(self)
-	if format == '': # No overiding of the default value
-	    if time.strftime('%P') =='':
-                format ='%a %H:%M'
-            else:
-                format ='%a %I:%M %P'
-        self.format = format
-        self.object = None
-        self.align  = 'right'
-        self.width  = 0
-        self.text   = ''
-
-    def draw(self, width, height):
-        clock  = time.strftime(self.format)
-
-        if self.objects and self.text == clock:
-            return self.NO_CHANGE
-
-        self.clear()
-
-        font  = gui.get_font('clock')
-        width = min(width, font.stringsize(clock))
-
-        txt = gui.Text(clock, (0, 0), (width, height), font,
-                       align_v='center', align_h='right')
-        self.objects.append(txt)
-        self.text = clock
-        return width
-
-
-
-class cdstatus(IdleBarPlugin):
-    """
-    Show the status of all rom drives.
-
-    Activate with:
-    plugin.activate('idlebar.cdstatus')
-    """
-    def __init__(self):
-
-        IdleBarPlugin.__init__(self)
-        icondir = os.path.join(config.ICON_DIR, 'status')
-        self.cdimages ={}
-        self.cdimages ['audiocd']       = os.path.join(icondir, 'cd_audio.png')
-        self.cdimages ['empty_cdrom'] = os.path.join(icondir, 'cd_inactive.png')
-        self.cdimages ['images']      = os.path.join(icondir, 'cd_photo.png')
-        self.cdimages ['video']       = os.path.join(icondir, 'cd_video.png')
-        self.cdimages ['dvd']         = os.path.join(icondir, 'cd_video.png')
-        self.cdimages ['burn']        = os.path.join(icondir, 'cd_burn.png')
-        self.cdimages ['cdrip']       = os.path.join(icondir, 'cd_rip.png')
-        self.cdimages ['mixed']       = os.path.join(icondir, 'cd_mixed.png')
-
-    def draw(self, width, height):
-        image = self.cdimages['empty_cdrom']
-
-        self.clear()
-
-        w = 0
-        for media in config.REMOVABLE_MEDIA:
-            image = self.cdimages['empty_cdrom']
-            if media.type == 'empty_cdrom':
-                image = self.cdimages['empty_cdrom']
-            if media.type and self.cdimages.has_key(media.type):
-                image = self.cdimages[media.type]
-            else:
-                image = self.cdimages['mixed']
-            i = gui.imagelib.load(image, (None, None))
-
-            w += i.width + 10
-
-            self.objects.append(gui.Image(i, (w, (height-i.height)/2)))
-
-
-        if w:
-            w -= 10
-        return w
-
-
-class mail(IdleBarPlugin):
-    """
-    Shows if new mail is in the mailbox.
-
-    Activate with:
-    plugin.activate('idlebar.mail',    level=10, args=('path to mailbox', ))
-
-    """
-    def __init__(self, mailbox):
-        IdleBarPlugin.__init__(self)
-        self.mails = -1
-        self.NO_MAILIMAGE = os.path.join(config.ICON_DIR, 'status/newmail_dimmed.png')
-        self.MAILIMAGE = os.path.join(config.ICON_DIR, 'status/newmail_active.png')
-        self.MAILBOX = mailbox
-
-    def checkmail(self):
-        if not self.MAILBOX:
-            return 0
-        if os.path.isfile(self.MAILBOX):
-            mb = mailbox.UnixMailbox (file(self.MAILBOX,'r'))
-            msg = mb.next()
-            count = 0
-            while msg is not None:
-                count = count + 1
-                msg = mb.next()
-            return count
-        else:
-            return 0
-
-    def draw(self, width, height):
-        mails = self.checkmail()
-
-        if self.mails == mails:
-            return self.NO_CHANGE
-
-        self.mails = mails
-        self.clear()
-
-        if mails > 0:
-            m = gui.imagelib.load(self.MAILIMAGE, (None, None))
-        else:
-            m = gui.imagelib.load(self.NO_MAILIMAGE, (None, None))
-
-        self.objects.append(gui.Image(m, (0, (height-m.height)/2)))
-
-        return m.width
-
-
-
-
-class tv(IdleBarPlugin):
-    """
-    Informs you, when the xmltv-listings expires.
-
-    Activate with:
-    plugin.activate('idlebar.tv', level=20, args=(listings_threshold,))
-    listings_threshold must be a number in hours.  For example if you put
-    args=(12, ) then 12 hours befor your xmltv listings run out the tv icon
-    will present a warning.  Once your xmltv data is expired it will present
-    a more severe warning.  If no args are given then no warnings will be
-    given.
-    """
-    def __init__(self, listings_threshold=-1):
-        IdleBarPlugin.__init__(self)
-
-        self.listings_threshold = listings_threshold
-        self.next_guide_check   = 0
-        self.listings_expire    = 0
-        self.tvlockfile         = config.FREEVO_CACHEDIR + '/record'
-        self.status             = None
-
-        self.TVLOCKED     = 'television_active.png'
-        self.TVFREE       = 'television_inactive.png'
-        self.NEAR_EXPIRED = 'television_near_expired.png'
-        self.EXPIRED      = 'television_expired.png'
-
-
-    def clear(self):
-        IdleBarPlugin.clear(self)
-        self.status = None
-
-
-    def checktv(self):
-        if os.path.exists(self.tvlockfile):
-            return 1
-        return 0
-
-
-    def draw(self, width, height):
-        status = 'inactive'
-        if self.checktv() == 1:
-            status = 'active'
-
-        if self.listings_threshold != -1:
-            now = time.time()
-
-            if now > self.next_guide_check:
-                self.listings_expire = tv_util.when_listings_expire()
-                # check again in 10 minutes
-                self.next_guide_check = now + 10*60
-
-            if self.listings_expire <= self.listings_threshold:
-                status = 'near_expired'
-
-            if self.listings_expire == 0:
-                status = 'expired'
-
-        if self.status == status:
-            return self.NO_CHANGE
-
-        self.clear()
-        self.status = status
-        icon = gui.get_icon('status/television_%s' % status)
-        i = gui.imagelib.load(icon, (None, None))
-
-
-        self.objects.append(gui.Image(i, (0, (height-i.height)/2)))
-        return i.width
-
-
-
-class weather(IdleBarPlugin):
-    """
-    Shows the current weather.
-
-    Activate with:
-    plugin.activate('idlebar.weather', level=30, args=('4-letter code', ))
-
-    For weather station codes see: http://www.nws.noaa.gov/tg/siteloc.shtml
-    You can also set the unit as second parameter in args ('C', 'F', or 'K')
-    """
-    def __init__(self, zone='CYYZ', units='C'):
-        self.current = None, None
-
-        IdleBarPlugin.__init__(self)
-        self.TEMPUNITS = units
-        self.METARCODE = zone
-        self.WEATHERCACHE = config.FREEVO_CACHEDIR + '/weather'
-        print
-        print 'WARNING: the idlebar.weather plugin downloads new weather'
-        print 'information inside the main loop. This bug makes all menu'
-        print 'actions _very_ slow. Consider not using this plugin for higher'
-        print 'speed.'
-        print
-
-
-    def checkweather(self):
-        # We don't want to do this every 30 seconds, so we need
-        # to cache the date somewhere.
-        #
-        # First check the age of the cache.
-        #
-        if (os.path.isfile(self.WEATHERCACHE) == 0 or \
-            (abs(time.time() - os.path.getmtime(self.WEATHERCACHE)) > 3600)):
-            try:
-                rf=pymetar.ReportFetcher(self.METARCODE)
-                rep=rf.FetchReport()
-                rp=pymetar.ReportParser()
-                pr=rp.ParseReport(rep)
-                if (pr.getTemperatureCelsius()):
-                    if self.TEMPUNITS == 'F':
-                        temperature = '%2d' % pr.getTemperatureFahrenheit()
-                    elif self.TEMPUNITS == 'K':
-                        ktemp = pr.getTemperatureCelsius() + 273
-                        temperature = '%3d' % ktemp
-                    else:
-                        temperature = '%2d' % pr.getTemperatureCelsius()
-                else:
-                    temperature = '?'  # Make it a string to match above.
-                if pr.getPixmap():
-                    icon = pr.getPixmap() + '.png'
-                else:
-                    icon = 'sun.png'
-                cachefile = open(self.WEATHERCACHE,'w+')
-                cachefile.write(temperature + '\n')
-                cachefile.write(icon + '\n')
-                cachefile.close()
-            except:
-                try:
-                    # HTTP Problems, use cache. Wait till next try.
-                    cachefile = open(self.WEATHERCACHE,'r')
-                    newlist = map(string.rstrip, cachefile.readlines())
-                    temperature,icon = newlist
-                    cachefile.close()
-                except IOError:
-                    print 'WEATHER: error reading cache. Using fake weather.'
-                    try:
-                        cachefile = open(self.WEATHERCACHE,'w+')
-                        cachefile.write('?' + '\n')
-                        cachefile.write('sun.png' + '\n')
-                        cachefile.close()
-                    except IOError:
-                        print 'You have no permission to write %s' % self.WEATHERCACHE
-                    return '0', 'sun.png'
-
-
-        else:
-            cachefile = open(self.WEATHERCACHE,'r')
-            newlist = map(string.rstrip, cachefile.readlines())
-            temperature,icon = newlist
-            cachefile.close()
-        return temperature, icon
-
-    def draw(self, width, height):
-        t, ic = self.current
-        temp,icon = self.checkweather()
-
-        if temp == t and ic == icon:
-            return self.NO_CHANGE
-
-        self.clear()
-        self.current = temp, icon
-
-        icon = os.path.join(config.ICON_DIR, 'weather', icon)
-        font  = gui.get_font('small0')
-        i = gui.imagelib.load(icon, (None, None))
-        self.objects.append(gui.Image(i, (0, 15)))
-
-        temp = u'%s\xb0' % temp
-        width = font.stringsize(temp)
-
-        self.objects.append(gui.Text(temp, (15, 55-font.height), (width, font.height),
-                                     font, 'left', 'top'))
-
-        return width + 15
-
-
-class holidays(IdleBarPlugin):
-    """
-    Display some holidays in the idlebar
-
-    This plugin checks if the current date is a holiday and will
-    display a specified icon for that holiday. If no holiday is found,
-    nothing will be displayed. If you use the idlebar, you should activate
-    this plugin, most of the time you won't see it.
-
-    You can customize the list of holidays with the variable HOLIDAYS in
-    local_config.py. The default value is:
-
-    [ ('01-01',  'newyear.png'),
-      ('02-14',  'valentine.png'),
-      ('05-07',  'freevo_bday.png'),
-      ('07-03',  'usa_flag.png'),
-      ('07-04',  'usa_flag.png'),
-      ('10-30',  'ghost.png'),
-      ('10-31',  'pumpkin.png'),
-      ('12-21',  'snowman.png'),
-      ('12-25',  'christmas.png')]
-    """
-    def __init__(self):
-        IdleBarPlugin.__init__(self)
-        self.icon = ''
-
-    def config(self):
-        return [ ('HOLIDAYS', [ ('01-01',  'newyear.png'),
-                                ('02-14',  'valentine.png'),
-                                ('05-07',  'freevo_bday.png'),
-                                ('07-03',  'usa_flag.png'),
-                                ('07-04',  'usa_flag.png'),
-                                ('10-30',  'ghost.png'),
-                                ('10-31',  'pumpkin.png'),
-                                ('12-21',  'snowman.png'),
-                                ('12-25',  'christmas.png')],
-                  'list of holidays this plugin knows') ]
-
-    def get_holiday_icon(self):
-        # Creates a string which looks like "07-04" meaning July 04
-        todays_date = time.strftime('%m-%d')
-
-        for i in config.HOLIDAYS:
-            holiday, icon = i
-            if todays_date == holiday:
-                return os.path.join(config.ICON_DIR, 'holidays', icon)
-
-
-    def draw(self, width, height):
-        icon = self.get_holiday_icon()
-
-        if icon == self.icon:
-            return self.NO_CHANGE
-
-        if icon:
-            self.icon = icon
-            self.clear()
-            i = gui.imagelib.load(icon, (None, None))
-            self.objects.append(gui.Image(i, (0, (height-i.height)/2)))
-
-            return i.width
-
-        return 0
-
-
-
-class logo(IdleBarPlugin):
-    """
-    Display the freevo logo in the idlebar
-    """
-    def __init__(self, image=None):
-        IdleBarPlugin.__init__(self)
-        self.image  = image
-        self.file   = file
-        self.object = None
-
-
-    def draw(self, width, height):
-        if not self.image:
-            image = gui.get_image('logo')
-        else:
-            image = os.path.join(config.IMAGE_DIR, self.image)
-
-        if self.objects and self.file == image:
-            return self.NO_CHANGE
-
-        self.file = image
-        self.clear()
-
-        i = gui.imagelib.load(image, (None, height + 10))
-        if not i:
-            return 0
-
-        self.objects.append(gui.Image(i, (0, 0)))
-
-        return i.width
diff -Naur freevo/src/plugins/idlebar/cdstatus.py freevo_devel/src/plugins/idlebar/cdstatus.py
--- freevo/src/plugins/idlebar/cdstatus.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/cdstatus.py	2004-09-13 21:00:52.000000000 +0200
@@ -0,0 +1,82 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# cdstatus.py - IdleBarPlugin for showing cd status
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import os
+
+import gui
+import config
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Show the status of all rom drives.
+
+    Activate with:
+    plugin.activate('idlebar.cdstatus')
+    """
+    def __init__(self):
+
+        IdleBarPlugin.__init__(self)
+        icondir = os.path.join(config.ICON_DIR, 'status')
+        self.cdimages ={}
+        self.cdimages ['audiocd']       = os.path.join(icondir, 'cd_audio.png')
+        self.cdimages ['empty_cdrom'] = os.path.join(icondir, 'cd_inactive.png')
+        self.cdimages ['images']      = os.path.join(icondir, 'cd_photo.png')
+        self.cdimages ['video']       = os.path.join(icondir, 'cd_video.png')
+        self.cdimages ['dvd']         = os.path.join(icondir, 'cd_video.png')
+        self.cdimages ['burn']        = os.path.join(icondir, 'cd_burn.png')
+        self.cdimages ['cdrip']       = os.path.join(icondir, 'cd_rip.png')
+        self.cdimages ['mixed']       = os.path.join(icondir, 'cd_mixed.png')
+
+    def draw(self, width, height):
+        image = self.cdimages['empty_cdrom']
+
+        self.clear()
+
+        w = 0
+        for media in config.REMOVABLE_MEDIA:
+            image = self.cdimages['empty_cdrom']
+            if media.type == 'empty_cdrom':
+                image = self.cdimages['empty_cdrom']
+            if media.type and self.cdimages.has_key(media.type):
+                image = self.cdimages[media.type]
+            else:
+                image = self.cdimages['mixed']
+            i = gui.imagelib.load(image, (None, None))
+
+            w += i.width + 10
+
+            self.objects.append(gui.Image(i, (w, (height-i.height)/2)))
+
+
+        if w:
+            w -= 10
+        return w
diff -Naur freevo/src/plugins/idlebar/clock.py freevo_devel/src/plugins/idlebar/clock.py
--- freevo/src/plugins/idlebar/clock.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/clock.py	2004-09-13 21:00:21.000000000 +0200
@@ -0,0 +1,75 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# clock.py - IdleBar clock
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import time
+
+import gui
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Shows the current time.
+
+    Activate with:
+    plugin.activate('idlebar.clock',   level=50)
+    Note: The clock will always be displayed on the right side of
+    the idlebar.
+    """
+    def __init__(self, format=''):
+        IdleBarPlugin.__init__(self)
+        if format == '': # No overiding of the default value
+            if time.strftime('%P') =='':
+                format ='%a %H:%M'
+            else:
+                format ='%a %I:%M %P'
+
+        self.format = format
+        self.object = None
+        self.align  = 'right'
+        self.width  = 0
+        self.text   = ''
+
+    def draw(self, width, height):
+        clock  = time.strftime(self.format)
+
+        if self.objects and self.text == clock:
+            return self.NO_CHANGE
+
+        self.clear()
+
+        font  = gui.get_font('clock')
+        width = min(width, font.stringsize(clock))
+
+        txt = gui.Text(clock, (0, 0), (width, height), font,
+                       align_v='center', align_h='right')
+        self.objects.append(txt)
+        self.text = clock
+        return width
diff -Naur freevo/src/plugins/idlebar/holidays.py freevo_devel/src/plugins/idlebar/holidays.py
--- freevo/src/plugins/idlebar/holidays.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/holidays.py	2004-09-13 21:00:59.000000000 +0200
@@ -0,0 +1,101 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# holidays.py - IdleBarPlugin for displaying holidays
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import os
+import time
+
+import gui
+import config
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Display some holidays in the idlebar
+
+    This plugin checks if the current date is a holiday and will
+    display a specified icon for that holiday. If no holiday is found,
+    nothing will be displayed. If you use the idlebar, you should activate
+    this plugin, most of the time you won't see it.
+
+    You can customize the list of holidays with the variable HOLIDAYS in
+    local_config.py. The default value is:
+
+    [ ('01-01',  'newyear.png'),
+      ('02-14',  'valentine.png'),
+      ('05-07',  'freevo_bday.png'),
+      ('07-03',  'usa_flag.png'),
+      ('07-04',  'usa_flag.png'),
+      ('10-30',  'ghost.png'),
+      ('10-31',  'pumpkin.png'),
+      ('12-21',  'snowman.png'),
+      ('12-25',  'christmas.png')]
+    """
+    def __init__(self):
+        IdleBarPlugin.__init__(self)
+        self.icon = ''
+
+    def config(self):
+        return [ ('HOLIDAYS', [ ('01-01',  'newyear.png'),
+                                ('02-14',  'valentine.png'),
+                                ('05-07',  'freevo_bday.png'),
+                                ('07-03',  'usa_flag.png'),
+                                ('07-04',  'usa_flag.png'),
+                                ('10-30',  'ghost.png'),
+                                ('10-31',  'pumpkin.png'),
+                                ('12-21',  'snowman.png'),
+                                ('12-25',  'christmas.png')],
+                  'list of holidays this plugin knows') ]
+
+    def get_holiday_icon(self):
+        # Creates a string which looks like "07-04" meaning July 04
+        todays_date = time.strftime('%m-%d')
+
+        for i in config.HOLIDAYS:
+            holiday, icon = i
+            if todays_date == holiday:
+                return os.path.join(config.ICON_DIR, 'holidays', icon)
+
+
+    def draw(self, width, height):
+        icon = self.get_holiday_icon()
+
+        if icon == self.icon:
+            return self.NO_CHANGE
+
+        if icon:
+            self.icon = icon
+            self.clear()
+            i = gui.imagelib.load(icon, (None, None))
+            self.objects.append(gui.Image(i, (0, (height-i.height)/2)))
+
+            return i.width
+
+        return 0
diff -Naur freevo/src/plugins/idlebar/logo.py freevo_devel/src/plugins/idlebar/logo.py
--- freevo/src/plugins/idlebar/logo.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/logo.py	2004-09-13 21:00:48.000000000 +0200
@@ -0,0 +1,67 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# logo.py - IdleBarPlugin for showing a freevo logo
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import os
+
+import gui
+import config
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Display the freevo logo in the idlebar
+    """
+    def __init__(self, image=None):
+        IdleBarPlugin.__init__(self)
+        self.image  = image
+        self.file   = file
+        self.object = None
+
+
+    def draw(self, width, height):
+        if not self.image:
+            image = gui.get_image('logo')
+        else:
+            image = os.path.join(config.IMAGE_DIR, self.image)
+
+        if self.objects and self.file == image:
+            return self.NO_CHANGE
+
+        self.file = image
+        self.clear()
+
+        i = gui.imagelib.load(image, (None, height + 10))
+        if not i:
+            return 0
+
+        self.objects.append(gui.Image(i, (0, 0)))
+
+        return i.width
diff -Naur freevo/src/plugins/idlebar/mail.py freevo_devel/src/plugins/idlebar/mail.py
--- freevo/src/plugins/idlebar/mail.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/mail.py	2004-09-13 20:39:04.000000000 +0200
@@ -0,0 +1,84 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# mail.py - IdleBarPlugin for showing mbox status
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import os
+import mailbox
+
+import gui
+import config
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Shows if new mail is in the mailbox.
+
+    Activate with:
+    plugin.activate('idlebar.mail',    level=10, args=('path to mailbox', ))
+
+    """
+    def __init__(self, mailbox):
+        IdleBarPlugin.__init__(self)
+        self.mails = -1
+        self.NO_MAILIMAGE = os.path.join(config.ICON_DIR, 'status/newmail_dimmed.png')
+        self.MAILIMAGE = os.path.join(config.ICON_DIR, 'status/newmail_active.png')
+        self.MAILBOX = mailbox
+
+    def checkmail(self):
+        if not self.MAILBOX:
+            return 0
+        if os.path.isfile(self.MAILBOX):
+            mb = mailbox.UnixMailbox (file(self.MAILBOX,'r'))
+            msg = mb.next()
+            count = 0
+            while msg is not None:
+                count = count + 1
+                msg = mb.next()
+            return count
+        else:
+            return 0
+
+    def draw(self, width, height):
+        mails = self.checkmail()
+
+        if self.mails == mails:
+            return self.NO_CHANGE
+
+        self.mails = mails
+        self.clear()
+
+        if mails > 0:
+            m = gui.imagelib.load(self.MAILIMAGE, (None, None))
+        else:
+            m = gui.imagelib.load(self.NO_MAILIMAGE, (None, None))
+
+        self.objects.append(gui.Image(m, (0, (height-m.height)/2)))
+
+        return m.width
diff -Naur freevo/src/plugins/idlebar/tv.py freevo_devel/src/plugins/idlebar/tv.py
--- freevo/src/plugins/idlebar/tv.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/tv.py	2004-09-13 21:00:06.000000000 +0200
@@ -0,0 +1,106 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# tv.py - IdleBarPlugin for information about XMLTV-listings
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+import os
+
+import gui
+import config
+import util.tv_util as tv_util
+from plugins.idlebar import IdleBarPlugin
+
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Informs you, when the xmltv-listings expires.
+
+    Activate with:
+    plugin.activate('idlebar.tv', level=20, args=(listings_threshold,))
+    listings_threshold must be a number in hours.  For example if you put
+    args=(12, ) then 12 hours befor your xmltv listings run out the tv icon
+    will present a warning.  Once your xmltv data is expired it will present
+    a more severe warning.  If no args are given then no warnings will be
+    given.
+    """
+    def __init__(self, listings_threshold=-1):
+        IdleBarPlugin.__init__(self)
+
+        self.listings_threshold = listings_threshold
+        self.next_guide_check   = 0
+        self.listings_expire    = 0
+        self.tvlockfile         = config.FREEVO_CACHEDIR + '/record'
+        self.status             = None
+
+        self.TVLOCKED     = 'television_active.png'
+        self.TVFREE       = 'television_inactive.png'
+        self.NEAR_EXPIRED = 'television_near_expired.png'
+        self.EXPIRED      = 'television_expired.png'
+
+
+    def clear(self):
+        IdleBarPlugin.clear(self)
+        self.status = None
+
+
+    def checktv(self):
+        if os.path.exists(self.tvlockfile):
+            return 1
+        return 0
+
+
+    def draw(self, width, height):
+        status = 'inactive'
+        if self.checktv() == 1:
+            status = 'active'
+
+        if self.listings_threshold != -1:
+            now = time.time()
+
+            if now > self.next_guide_check:
+                self.listings_expire = tv_util.when_listings_expire()
+                # check again in 10 minutes
+                self.next_guide_check = now + 10*60
+
+            if self.listings_expire <= self.listings_threshold:
+                status = 'near_expired'
+
+            if self.listings_expire == 0:
+                status = 'expired'
+
+        if self.status == status:
+            return self.NO_CHANGE
+
+        self.clear()
+        self.status = status
+        icon = gui.get_icon('status/television_%s' % status)
+        i = gui.imagelib.load(icon, (None, None))
+
+
+        self.objects.append(gui.Image(i, (0, (height-i.height)/2)))
+        return i.width
diff -Naur freevo/src/plugins/idlebar/weather.py freevo_devel/src/plugins/idlebar/weather.py
--- freevo/src/plugins/idlebar/weather.py	1970-01-01 01:00:00.000000000 +0100
+++ freevo_devel/src/plugins/idlebar/weather.py	2004-09-13 21:01:10.000000000 +0200
@@ -0,0 +1,144 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# weather.py - IdleBarPlugin for showing weatcher status
+# -----------------------------------------------------------------------
+# $Id:
+#
+# -----------------------------------------------------------------------
+# $Log:
+#
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ----------------------------------------------------------------------- */
+
+import os
+import time
+import string
+
+import gui
+import config
+import util.pymetar as pymetar
+from plugins.idlebar import IdleBarPlugin
+
+class PluginInterface(IdleBarPlugin):
+    """
+    Shows the current weather.
+
+    Activate with:
+    plugin.activate('idlebar.weather', level=30, args=('4-letter code', ))
+
+    For weather station codes see: http://www.nws.noaa.gov/tg/siteloc.shtml
+    You can also set the unit as second parameter in args ('C', 'F', or 'K')
+    """
+    def __init__(self, zone='CYYZ', units='C'):
+        self.current = None, None
+
+        IdleBarPlugin.__init__(self)
+        self.TEMPUNITS = units
+        self.METARCODE = zone
+        self.WEATHERCACHE = config.FREEVO_CACHEDIR + '/weather'
+        print
+        print 'WARNING: the idlebar.weather plugin downloads new weather'
+        print 'information inside the main loop. This bug makes all menu'
+        print 'actions _very_ slow. Consider not using this plugin for higher'
+        print 'speed.'
+        print
+
+
+    def checkweather(self):
+        # We don't want to do this every 30 seconds, so we need
+        # to cache the date somewhere.
+        #
+        # First check the age of the cache.
+        #
+        if (os.path.isfile(self.WEATHERCACHE) == 0 or \
+            (abs(time.time() - os.path.getmtime(self.WEATHERCACHE)) > 3600)):
+            try:
+                rf=pymetar.ReportFetcher(self.METARCODE)
+                rep=rf.FetchReport()
+                rp=pymetar.ReportParser()
+                pr=rp.ParseReport(rep)
+                if (pr.getTemperatureCelsius()):
+                    if self.TEMPUNITS == 'F':
+                        temperature = '%2d' % pr.getTemperatureFahrenheit()
+                    elif self.TEMPUNITS == 'K':
+                        ktemp = pr.getTemperatureCelsius() + 273
+                        temperature = '%3d' % ktemp
+                    else:
+                        temperature = '%2d' % pr.getTemperatureCelsius()
+                else:
+                    temperature = '?'  # Make it a string to match above.
+                if pr.getPixmap():
+                    icon = pr.getPixmap() + '.png'
+                else:
+                    icon = 'sun.png'
+                cachefile = open(self.WEATHERCACHE,'w+')
+                cachefile.write(temperature + '\n')
+                cachefile.write(icon + '\n')
+                cachefile.close()
+            except:
+                try:
+                    # HTTP Problems, use cache. Wait till next try.
+                    cachefile = open(self.WEATHERCACHE,'r')
+                    newlist = map(string.rstrip, cachefile.readlines())
+                    temperature,icon = newlist
+                    cachefile.close()
+                except IOError:
+                    print 'WEATHER: error reading cache. Using fake weather.'
+                    try:
+                        cachefile = open(self.WEATHERCACHE,'w+')
+                        cachefile.write('?' + '\n')
+                        cachefile.write('sun.png' + '\n')
+                        cachefile.close()
+                    except IOError:
+                        print 'You have no permission to write %s' % self.WEATHERCACHE
+                    return '0', 'sun.png'
+
+
+        else:
+            cachefile = open(self.WEATHERCACHE,'r')
+            newlist = map(string.rstrip, cachefile.readlines())
+            temperature,icon = newlist
+            cachefile.close()
+        return temperature, icon
+
+    def draw(self, width, height):
+        t, ic = self.current
+        temp,icon = self.checkweather()
+
+        if temp == t and ic == icon:
+            return self.NO_CHANGE
+
+        self.clear()
+        self.current = temp, icon
+
+        icon = os.path.join(config.ICON_DIR, 'weather', icon)
+        font  = gui.get_font('small0')
+        i = gui.imagelib.load(icon, (None, None))
+        self.objects.append(gui.Image(i, (0, 15)))
+
+        temp = u'%s\xb0' % temp
+        width = font.stringsize(temp)
+
+        self.objects.append(gui.Text(temp, (15, 55-font.height), (width, font.height),
+                                     font, 'left', 'top'))
+
+        return width + 15

Reply via email to