diff --git a/pymlac/led16.py b/pymlac/led16.py
index 808b9d9..2ee06cc 100644
--- a/pymlac/led16.py
+++ b/pymlac/led16.py
@@ -8,36 +8,25 @@ Event attributes:
'state' - the current displayed value (int)
Instance methods:
- Led16(parent, label, pos, led, *args, **kwargs)
+ Led16(parent, label, pos, led_on, led_off, *args, **kwargs)
parent owning widget
label label above leftmost led
pos position (x, y)
- led image of led 'on' state
+ led_on image of led 'on' state
+ led_off image of led 'off' state
args ?
kwargs ?
SetState(state)
- sets widget state, 'state' is as in constructor.
+ sets widget state, 'state' is a 16 bit value.
The widget will look like:
- +-
----------------------------+
- | |
- LeftSpacer--+-> O O O O O O O O O O O O O O O O |\TickSpacer
- | +-+-----+-----+-----+-----+-----+ |/
- | |
- +------------------------------------+
-
-
--
-|top spacer
--
-|-------------| --label spacer
-left spacer /
- O O O O O O O O O O O O O O O O --tick spacer
- +-+-----+-----+-----+-----+-----+ /
-- ^
-|bot spacer |
-- octal ticks
+ +-----------------------------------+
+ | |
+--> O O O O O O O O O O O O O O O O <---
+ | +-+-----+-----+-----+-----+-----+ |
+ | |
+ +-----------------------------------+
"""
import os
@@ -45,19 +34,21 @@ import wx
# layout 'constants'
+print('os.name=%s' % str(os.name))
if os.name == 'nt':
LeftSpacer = 7 # left border
- TopSpacer = 30
- TickSpacer = 30
- BotSpacer = 0 # space between ticks and box
+ RightSpacer = 7 # right border
+ TopSpacer = 30 # space at top
+ TickSpacer = 30 # space down to ticks
+ BotSpacer = 0 # space at the bottom
elif os.name == 'posix':
LeftSpacer = 3 # left border
- TopSpacer = 10 # space between top box and label
- LabelSpacer = 10
- TickSpacer = 30
- BotSpacer = 10 # space between ticks and box
+ RightSpacer = 3 # right border
+ TopSpacer = 3 # space at top
+ TickSpacer = 10 # space down to ticks
+ BotSpacer = 3 # space at the bottom
else:
- # TODO: Make it work on Mac
+ # TODO: Make it work on ???
raise Exception('Unrecognized platform: %s' % os.name)
@@ -68,82 +59,79 @@ else:
class Led16(wx.Panel):
"""A custom widget for showing 16 leds."""
- def __init__(self, parent, label, led_img, background=None, *args, **kwargs):
+ def __init__(self, parent, led_on, led_off, background=None, **kwargs):
"""Initialize an Led16 object.
parent owning widget
- label label above leftmost led
- led_img image of led 'on' state
+ led_on image of led 'on' state
+ led_off image of led 'off' state
background widget background colour
- args ?
- kwargs ?
+ kwargs extra args for the panel
"""
- wx.Panel.__init__(self, parent, *args, **kwargs)
- self.SetBackgroundColour(background)
+ print('Led16: background=%s' % str(background))
+
+ wx.Panel.__init__(self, parent, **kwargs)
+ if background is not None:
+ self.SetBackgroundColour(background)
+
+ self.led_on = led_on
+ self.led_off = led_off
+ led_width = led_on.GetWidth() # assume ON and OFF are same size image
+ led_height = led_on.GetHeight()
x = LeftSpacer
y = TopSpacer
- led_width = led_img.GetWidth()
- led_height = led_img.GetHeight()
- label = ' ' + label.strip() + ' '
- sbox = wx.StaticBox(self, label=label)
- vbox = wx.StaticBoxSizer(sbox, wx.VERTICAL)
-
- vbox.AddSpacer(BotSpacer)
- y += LabelSpacer
-
- #hbox = wx.BoxSizer(wx.HORIZONTAL)
- self.leds = []
mark_count = 2
self.ticks = [(x-17+led_width, y+led_height/2+5,
x-17+led_width, y+led_height/2+10)]
+ self.led_posn = []
+
+ # calculate positions of all 16 LEDs and construct ticks draw list
for i in range(16):
- led = wx.StaticBitmap(self, -1, led_img, pos=(x-1+i*17, y))
- #hbox.Add(led)
- self.leds.append(led)
+ self.led_posn.append((x-1+i*17, y))
mark_count += 1
if mark_count >= 3:
mark_count = 0
self.ticks.append((x+i*17 + led_width, y+led_height/2+5,
x+i*17 + led_width, y+led_height/2+10))
- vbox.Add(hbox)
-
first = self.ticks[0]
last = self.ticks[-1]
(fx1, fy1, fx2, fy2) = first
(lx1, ly1, lx2, ly2) = last
self.ticks.append((fx1, ly1+5, lx1, ly1+5))
- vbox.AddSpacer(BotSpacer)
-
self.set_value(0)
- self.SetSizer(vbox)
-
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
-
def OnPaint(self, event):
+ # allow transparent colours
dc = wx.PaintDC(self)
+ dc = wx.GCDC(dc)
+
+ # draw 16 on/off LEDs
+ mask = 0x8000
+ for i in range(16):
+ posn = self.led_posn[i]
+ if self.value & mask:
+ wx.StaticBitmap(self, -1, self.led_on, pos=posn)
+ else:
+ wx.StaticBitmap(self, -1, self.led_off, pos=posn)
+ mask = mask >> 1
+
+ # draw the tick marks underneath the LEDs
dc.SetPen(wx.Pen('black', 1))
dc.DrawLineList(self.ticks)
-
def OnSize(self, event):
self.Refresh()
-
def set_value(self, value):
- mask = 0x8000
- for l in self.leds:
- if value & mask:
- l.Enable()
- else:
- l.Disable()
- mask = mask >> 1
+ self.value = value
+ self.Refresh()
if __name__ == "__main__":
@@ -154,14 +142,18 @@ if __name__ == "__main__":
frame = wx.Frame(None, -1, "Test Led16", size=(350, 75))
vbox = wx.BoxSizer(wx.VERTICAL)
- led = wx.Image('images/led_on.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
+ led_on = wx.Image('images/led_on.png',
+ wx.BITMAP_TYPE_PNG).ConvertToBitmap()
- self.led16 = Led16(frame, 'Led16', led, size=(300,100))
+ led_off = wx.Image('images/led_off.png',
+ wx.BITMAP_TYPE_PNG).ConvertToBitmap()
+
+ self.led16 = Led16(frame, led_on, led_off, size=(300,100))
vbox.Add(self.led16)
vbox.Fit(frame)
frame.Show(True)
self.SetTopWindow(frame)
- self.led16.set_value(0xfffe)
+ self.led16.set_value(012345)
return True
app = MyApp(0)