[FoLUG] Screenlets > Calendar
Raffaele Ravaioli
raffaele.ravaioli@gmail.com
Dom 7 Set 2008 11:28:44 CEST
Il codice seguente è quello relativo allo screenlet "Calendar".
Ho già cambiato i giorni della settimana dall'inglese all'italiano.
(grande programmatore!) :-)
Come dovrei cambiarlo per far sì che nella visualizzazione il primo
giorno sia lunedì anziché domenica?
Grazie.
PS. É puramente un esercizio per cercare di capirci qualcosa non che sia
una vera e propria necessità... vivo lo stesso anche se la settimana
iniziasse di mercoledì. D'altronde quel po' che so di visual basic l'ho
imparato così, giocando con le routine di altri per comprendere come
funzionano le cose.)
Ciao
#!/usr/bin/env python
# This application is released under the GNU General Public License
# v3 (or, at your option, any later version). You can find the full
# text of the license under http://www.gnu.org/licenses/gpl.txt.
# By using, editing and/or distributing this software you agree to
# the terms and conditions of this license.
# Thank you for using free software!
# CalendarScreenlet (c) robgig1088 2007
#
# INFO:
# -
#
import screenlets
import cairo
import pango
import datetime
class CalendarScreenlet (screenlets.Screenlet):
"""A simple Calendar Screenlet."""
# default meta-info for Screenlets
__name__ = 'CalendarScreenlet'
__version__ = '0.3'
__author__ = 'RYX (initial version by robgig1088)'
__desc__ = __doc__
# constructor
def __init__(self, **keyword_args):
# call super
screenlets.Screenlet.__init__(self, uses_theme=True, **keyword_args)
# set some options
self.text_shadow_offset = 0.666
# set theme
self.theme_name = "ryx"
def on_init (self):
print "Screenlet has been initialized."
# add default menuitems
self.add_default_menuitems()
def get_date_info(self):
now = datetime.datetime.now()
#get day
day = now.strftime("%d")
#get the month number
month_num = now.strftime("%m")
# get the year
year = now.strftime("%Y")
#get the month name
month_name = now.strftime("%B")
#make a date (1st of month)
when = datetime.date(int(year), int(month_num), int(1))
# get the first day of the month (mon, tues, etc..)
first_day = when.strftime("%A")
# find number of days in the month
if month_num in (1, 3, 5, 7, 8, 10, 12):
days_in_month = 31
elif month_num <> 2:
days_in_month = 30
elif year%4 == 0:
days_in_month = 29
else:
days_in_month = 28
#find the first day of the month
start_day = int(when.strftime("%u"))
if start_day == 7: # and do calculations on it...
start_day = 0
start_day = start_day + 1
# return the whole stuff
return [day, month_num, year, month_name, days_in_month,
first_day, start_day]
def draw_year_and_month (self, ctx, pl, year, month):
ctx.save()
ctx.translate(5 + self.text_shadow_offset, 5 + self.text_shadow_offset)
# draw the month
pl.set_width((self.width) * pango.SCALE)
pl.set_markup('<b>' + month + '</b>')
ctx.set_source_rgba(0, 0, 0, 0.3)
ctx.show_layout(pl)
ctx.translate(-self.text_shadow_offset, -self.text_shadow_offset)
ctx.set_source_rgba(1, 1, 1, 0.8)
ctx.show_layout(pl)
# draw the year
ctx.translate(70 + self.text_shadow_offset, self.text_shadow_offset)
pl.set_markup('<b>' + year + '</b>')
ctx.set_source_rgba(0, 0, 0, 0.3)
ctx.show_layout(pl)
ctx.translate(-self.text_shadow_offset, -self.text_shadow_offset)
ctx.set_source_rgba(1, 1, 1, 0.8)
ctx.show_layout(pl)
ctx.restore()
def draw_header (self, ctx, pl):
ctx.save()
ctx.translate(5 + self.text_shadow_offset, 17 + self.text_shadow_offset)
pl.set_markup('<b>' + "Do Lu Ma Me Gi Ve Sa" + '</b>')
ctx.set_source_rgba(0, 0, 0, 0.3)
ctx.show_layout(pl)
ctx.translate(-self.text_shadow_offset, -self.text_shadow_offset)
ctx.set_source_rgba(1, 1, 1, 0.8)
ctx.show_layout(pl)
ctx.restore()
def draw_days (self, ctx, pl, date):
#ctx.translate(-5, 0)
row = 1
day = int(date[6])
tso = self.text_shadow_offset
for x in range(date[4] + 1):
ctx.save()
ctx.translate(4 + (day-1) * 13 + tso, 30 + 12 * (row - 1) + tso)
if str(int(x)+1) == str(date[0]) or \
"0" + str(int(x)+1) == str(date[0]):
ctx.save()
ctx.translate(0, -1)
self.theme.render(ctx, 'calendar-day-bg')
ctx.restore()
if int(x)+1 < 10:
# draw the days
pl.set_markup('<b>' + " 0" + str(x+1) + '</b>')
else:
pl.set_markup('<b>' + " " + str(x+1) + '</b>')
ctx.set_source_rgba(0, 0, 0, 0.3)
ctx.show_layout(pl)
ctx.translate(-tso, -tso)
ctx.set_source_rgba(1, 1, 1, 0.8)
ctx.show_layout(pl)
if day == 7:
day = 0
row = row + 1
day = day + 1
ctx.restore()
def on_draw (self, ctx):
# get dates
date = self.get_date_info()
# set size
ctx.scale(self.scale, self.scale)
# draw bg (if theme available)
ctx.set_operator(cairo.OPERATOR_OVER)
if self.theme:
# render bg
self.theme.render(ctx, 'calendar-bg')
# create layout
p_layout = ctx.create_layout()
p_fdesc = pango.FontDescription("Free Sans 5")
p_layout.set_font_description(p_fdesc)
# draw year/month
self.draw_year_and_month(ctx, p_layout, date[2], date[3])
# draw header
self.draw_header(ctx, p_layout)
# draw days
self.draw_days(ctx, p_layout, date)
def on_draw_shape(self,ctx):
ctx.scale(self.scale, self.scale)
if self.theme:
self.theme.render(ctx, 'calendar-bg')
# If the program is run directly or passed as an argument to the python
# interpreter then create a Screenlet instance and show it
if __name__ == "__main__":
import screenlets.session
screenlets.session.create_session(CalendarScreenlet)
Maggiori informazioni sulla lista
FoLUG