1
0
mirror of https://github.com/gryf/wmdocklib.git synced 2025-12-19 12:28:10 +01:00
Files
wmdocklib/examples/pywmdatetime.py
mfrasca 48b67704bb 1724798: labels are not aligned
implemented the 'align' parameter to the Application.addLabel method.

the pywmhelpers.addString function now returns the x-size of the string.

moved all labels in pywmdatetime one pixel to the left.
2007-05-24 19:04:48 +00:00

201 lines
7.1 KiB
Python
Executable File

#!/usr/bin/env python
"""pywmdatetime.py
WindowMaker dockapp that displays time, date, weekday and week number.
Copyright (C) 2003 Kristoffer Erlandsson
Licensed under the GNU General Public License.
Changes:
2003-09-01 Kristoffer Erlandsson
Fixed a bug where the week didn't update if we used %q style week numbering.
2003-06-28 Kristoffer Erlandsson
Fixed a bug where a mouse click caused an infinite loop
2003-06-26 Kristoffer Erlandsson
Fixed bug when longer strings didn't get cleared when shorter ones where
painted. Now only repaint the strings when they have changed.
2003-06-24 Kristoffer Erlandsson
Added event handling for graceful shutdown
2003-06-16 Kristoffer Erlandsson
First workingish version
"""
import sys
import time
import os
from wmdocklib import wmoo, readConfigFile
width = 64
height = 64
xOffset = 4
yOffset = 4
patterns = [
".+@@+.....#@...#@@#...#@@#....$@%...@@@@+..+=@%..+@@@@@..%@@+...&@@#.....",
"$@==@$...+@@..&@--@&.*@--@&...#@%..*@-%%*.$==-@&.*%%%@=.#@-=@*.*@=-@&....",
"&@**@&..#@@@..&@$.@%.&-..@%..*@@%..+@+....+@*.%*....+@*.%@.+@+.%@$.-%.*+.",
"%@..@%..#+%@.....$@%....+@#..--@%..&@=@#..%@$+$.....--..&@&%@$.%@..%@.%@.",
"%@..@%....%@.....%@*...%@-..*@$@%..%@%=@*.%@=@@*...*@&...=@@#..&@%&@@.*+.",
"%@..@%....%@....+@%....&-@+.=#.@%...*.$@%.%@%&@-...#@...#@&%@*..=@@@@....",
"%@..@%....%@...+@=$......-@.@-%@=&.....@%.%@..%@...=-...@%..@%...+*%@.&%.",
"&@**@&....%@..$@=$...&-..-@.@@@@@%.--.*@#.+@$.-@...@%...@-.$@%.$#*.=%.%@.",
"$@==@$....%@..#@-%%&.+@--@#....@%..%@-=@$.$@=-@#..+@+...#@-=@*.$@=-@+....",
".+@@+.....%@..@@@@@%..#@@#.....@%..$-@=+...+=@%$..+@+...$#@@&...+@@#.....",
]
palette = {
".":"#181818",
"+":"#6E6E0F",
"@":"#FFFF00",
"#":"#A0A009",
"$":"#3B3B14",
"%":"#B9B907",
"&":"#87870C",
"*":"#545411",
"=":"#E6E602",
"-":"#CFCF04",
}
timeDefaultFormat = '%H:%M:%S'
dateDefaultFormat = '%d-%m-%y'
dayDefaultFormat = '%A'
weekDefaultFormat = 'wk %q' # %q added by Kristoffer for different week calculation.
defaultConfigFile = '~/.pywmdatetimerc'
class Application(wmoo.Application):
def __init__(self):
from optparse import OptionParser
parser = OptionParser()
parser.add_option('-a', '--antialiased', dest='antialiased',
action="store_true", default=False)
parser.add_option('-f', '--foreground', type='string', default='cyan3')
parser.add_option('-F', '--font', type='string', default='6x8orig')
parser.add_option('-b', '--background', type='string', default='black')
parser.add_option('-t', '--timeformat', type='string', default=timeDefaultFormat)
parser.add_option('-d', '--dateformat', default=dateDefaultFormat)
parser.add_option('-y', '--weekdayformat', default=dayDefaultFormat)
parser.add_option('-e', '--weekformat', default=weekDefaultFormat)
parser.add_option('-r', '--rgbfile')
#parser.add_option('-c', '--configfile', default=defaultConfigFile)
parser.add_option('--debug', action='store_true', default=False)
configFile = os.path.expanduser("~/.pywmdatetimerc")
# Merge the two configs, let the commandline options overwrite those in the
# configuration file.
config = readConfigFile(configFile, sys.stderr)
parser.set_defaults(**config)
(options, args) = parser.parse_args()
palette[0] = options.background
palette[2] = options.foreground
if options.antialiased:
background = [((6,3),(57,19)),
((3,22),(60,60))]
else:
background = [((3,3),(59,60))]
wmoo.Application.__init__(self,
patterns=patterns,
font_name=options.font,
bg=0, fg=2, palette=palette,
background=background,
debug=options.debug)
if options.antialiased:
self.addLabel('date', orig=(4,24), size=(54,10), align=wmoo.CENTRE)
self.addLabel('day', orig=(4,36), size=(54,10), align=wmoo.CENTRE)
self.addLabel('week', orig=(4,48), size=(54,10), align=wmoo.CENTRE)
else:
self.addLabel('time', orig=(4, 5), size=(54,10), align=wmoo.CENTRE)
self.addLabel('time2', orig=(4,16), size=(54,10), align=wmoo.CENTRE)
self.addLabel('date', orig=(4,27), size=(54,10), align=wmoo.CENTRE)
self.addLabel('day', orig=(4,38), size=(54,10), align=wmoo.CENTRE)
self.addLabel('week', orig=(4,49), size=(54,10), align=wmoo.CENTRE)
self.timeFmt = options.timeformat
self.dateFmt = options.dateformat
self.dayFmt = options.weekdayformat
self.weekFmt = options.weekformat
self.antialiased = options.antialiased
self.debug = options.debug
self.recalcWeek = self.weekFmt.find('%q') + 1 # True if we found %q.
self.counter = -1
self.lastStrs = [''] * 4
pass
def calculateWeek(self, localTime):
"""Calculate the week number as we do, for example in Sweden.
That is, add one to the %W format if the year didn't start on a monday."""
day = int(time.strftime('%j', localTime))
weekDay = int(time.strftime('%w')) - 1
if weekDay == -1:
weekDay = 6
lastMonday = day - weekDay
if lastMonday % 7 == 0:
return int(time.strftime('%W'))
return int(time.strftime('%W')) + 1
def updateTimeString(self, s):
if self.antialiased:
x, y = 8, 6
for c in s:
charW = 7
charX = (ord(c) - ord('0')) * 7
if not c.isdigit():
charX = 70
charW = 3
self.putPattern(charX, 0, charW, 10, x, y)
x += charW
else:
self.setLabelText('time', s)
def update(self):
self.counter += 1
lt = time.localtime()
timeStr = time.strftime(self.timeFmt, lt)
self.updateTimeString(timeStr)
self.lastStrs[0] = timeStr
if self.counter % 100 == 0:
# We only perform the date/week checks/updates once every 100th
# iteration. We will maybe lag behind a couple of seconds when
# switching, but switching occurs seldom and it will be alot of
# unnecessary checks :).
dateStr = time.strftime(self.dateFmt, lt)
newWeekFmt = self.weekFmt
if self.recalcWeek:
week = calculateWeek(lt)
newWeekFmt = self.weekFmt.replace('%q', str(week))
weekStr = time.strftime(newWeekFmt, lt)
dayStr = time.strftime(self.dayFmt, lt)
if self.lastStrs[1] != dateStr:
self.setLabelText('date', dateStr)
self.lastStrs[1] = dateStr
if self.lastStrs[2] != dayStr:
self.setLabelText('day', dayStr)
self.lastStrs[2] = dayStr
if self.lastStrs[3] != weekStr:
self.setLabelText('week', weekStr)
self.lastStrs[3] = weekStr
if __name__ == '__main__':
app = Application()
app.run()