Updated to new post-PMW framework. Moved generators to here and added

the StripViewer class.
This commit is contained in:
Barry Warsaw 1998-09-28 22:42:44 +00:00
parent 93d27547d0
commit 0dc9c92b10
1 changed files with 74 additions and 36 deletions

View File

@ -21,6 +21,33 @@ BTNUP = 5
BTNDRAG = 6
def constant(numchips):
step = 255.0 / (numchips - 1)
start = 0.0
seq = []
while numchips > 0:
seq.append(int(start))
start = start + step
numchips = numchips - 1
return seq
# red variations, green+blue = cyan constant
def constant_cyan_generator(numchips, red, green, blue):
seq = constant(numchips)
return map(None, seq, [green] * numchips, [blue] * numchips)
# green variations, red+blue = magenta constant
def constant_magenta_generator(numchips, red, green, blue):
seq = constant(numchips)
return map(None, [red] * numchips, seq, [blue] * numchips)
# blue variations, red+green = yellow constant
def constant_yellow_generator(numchips, red, green, blue):
seq = constant(numchips)
return map(None, [red] * numchips, [green] * numchips, seq)
class LeftArrow:
_ARROWWIDTH = 30
@ -94,16 +121,16 @@ class StripWidget:
def __init__(self, switchboard,
parent = None,
color = (128, 128, 128),
chipwidth = self._CHIPWIDTH,
chipheight = self._CHIPHEIGHT,
numchips = self._NUMCHIPS,
chipwidth = _CHIPWIDTH,
chipheight = _CHIPHEIGHT,
numchips = _NUMCHIPS,
generator = None,
axis = None,
label = ''):
# instance variables
self.__generator = generator
self.__axis = axis
self.__numchips = numchips
assert self.__axis in (0, 1, 2)
self.__update_while_dragging = 0
# the last chip selected
@ -148,7 +175,7 @@ class StripWidget:
# create the strip label
self.__label = canvas.create_text(
3, y + chipheight + 8,
text=self['label'],
text=label,
anchor=W)
# create the arrow and text item
@ -158,39 +185,29 @@ class StripWidget:
chipx = self.__arrow_x(len(chips) - 1)
self.__rightarrow = RightArrow(canvas, chipx)
# Invoked when one of the chips is clicked. This should just tell the
# switchboard to set the color on all the output components
def __set_color(self):
rgbtuple = self['color']
self.set_color(self, rgbtuple)
def __arrow_x(self, chipnum):
coords = self.__canvas.coords(chipnum+1)
assert coords
x0, y0, x1, y1 = coords
return (x1 + x0) / 2.0
# Invoked when one of the chips is clicked. This should just tell the
# switchboard to set the color on all the output components
def __select_chip(self, event=None):
if self.__delegate:
x = event.x
y = event.y
canvas = self.__canvas
chip = canvas.find_overlapping(x, y, x, y)
if chip and (1 <= chip[0] <= self.__numchips):
color = self.__chips[chip[0]-1]
rgbtuple = ColorDB.rrggbb_to_triplet(color)
etype = int(event.type)
if (etype == BTNUP or self.__update_while_dragging):
# update everyone
self.__delegate.set_color(self, rgbtuple)
else:
# just track the arrows
self.__trackarrow(chip[0], rgbtuple)
def __set_delegate(self):
self.__delegate = self['delegate']
x = event.x
y = event.y
canvas = self.__canvas
chip = canvas.find_overlapping(x, y, x, y)
if chip and (1 <= chip[0] <= self.__numchips):
color = self.__chips[chip[0]-1]
red, green, blue = ColorDB.rrggbb_to_triplet(color)
etype = int(event.type)
if (etype == BTNUP or self.__update_while_dragging):
# update everyone
self.__sb.update_views(red, green, blue)
else:
# just track the arrows
self.__trackarrow(chip[0], (red, green, blue))
def __trackarrow(self, chip, rgbtuple):
# invert the last chip
@ -221,10 +238,6 @@ class StripWidget:
self.__canvas.itemconfigure(chip, outline=outline)
#
# public interface
#
def update_yourself(self, red, green, blue):
assert self.__generator
i = 1
@ -233,7 +246,7 @@ class StripWidget:
tclcmd = []
tk = self.__canvas.tk
# get the red, green, and blue components for all chips
for t in self.__generator(self.__numchips, rgbtuple):
for t in self.__generator(self.__numchips, red, green, blue):
rrggbb = ColorDB.triplet_to_rrggbb(t)
chips.append(rrggbb)
tred, tgreen, tblue = t
@ -248,3 +261,28 @@ class StripWidget:
def set_update_while_dragging(self, flag):
self.__update_while_dragging = flag
class StripViewer:
def __init__(self, switchboard, parent=None):
self.__sb = switchboard
self.__reds = StripWidget(switchboard, parent,
generator=constant_cyan_generator,
axis=0,
label='Red Variations')
self.__greens = StripWidget(switchboard, parent,
generator=constant_magenta_generator,
axis=1,
label='Green Variations')
self.__blues = StripWidget(switchboard, parent,
generator=constant_yellow_generator,
axis=2,
label='Blue Variations')
def update_yourself(self, red, green, blue):
self.__reds.update_yourself(red, green, blue)
self.__greens.update_yourself(red, green, blue)
self.__blues.update_yourself(red, green, blue)