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