blob: c927009c9eebeca8dc1dcac493206eb5beaa9a67 [file] [log] [blame]
Barry Warsaw9d882bc1998-02-12 19:51:57 +00001from Tkinter import *
2import Pmw
3import ColorDB
4
5class LeftArrow:
6 _ARROWWIDTH = 30
7 _ARROWHEIGHT = 15
8 _YOFFSET = 13
9 _TEXTYOFFSET = 1
10 _TAG = ('leftarrow',)
11
12 def __init__(self, canvas, x):
13 self._canvas = canvas
14 self.__arrow, self.__text = self._create(x)
15 self.move_to(x)
16
17 def _create(self, x):
18 arrow = self._canvas.create_line(
19 x, self._ARROWHEIGHT + self._YOFFSET,
20 x, self._YOFFSET,
21 x + self._ARROWWIDTH, self._YOFFSET,
22 arrow='first',
23 width=3.0,
24 tags=self._TAG)
25 text = self._canvas.create_text(
26 x + self._ARROWWIDTH + 13,
27 self._ARROWHEIGHT - self._TEXTYOFFSET,
Barry Warsaw35ae8641998-02-13 21:28:47 +000028 tags=self._TAG,
Barry Warsaw9d882bc1998-02-12 19:51:57 +000029 text='128')
30 return arrow, text
31
32 def _x(self):
33 coords = self._canvas.coords(self._TAG)
34 assert coords
35 return coords[0]
36
37 def move_to(self, x):
38 deltax = x - self._x()
39 self._canvas.move(self._TAG, deltax, 0)
40
Barry Warsaw35ae8641998-02-13 21:28:47 +000041 def set_text(self, text):
42 self._canvas.itemconfigure(self.__text, text=text)
43
Barry Warsaw9d882bc1998-02-12 19:51:57 +000044
45class RightArrow(LeftArrow):
46 _TAG = ('rightarrow',)
47
48 def _create(self, x):
49 arrow = self._canvas.create_line(
50 x, self._YOFFSET,
51 x + self._ARROWWIDTH, self._YOFFSET,
52 x + self._ARROWWIDTH, self._ARROWHEIGHT + self._YOFFSET,
53 arrow='last',
54 width=3.0,
55 tags=self._TAG)
56 text = self._canvas.create_text(
Barry Warsaw35ae8641998-02-13 21:28:47 +000057 x - self._ARROWWIDTH + 15, # TBD: kludge
Barry Warsaw9d882bc1998-02-12 19:51:57 +000058 self._ARROWHEIGHT - self._TEXTYOFFSET,
Barry Warsaw35ae8641998-02-13 21:28:47 +000059 text='128',
60 tags=self._TAG)
Barry Warsaw9d882bc1998-02-12 19:51:57 +000061 return arrow, text
62
63 def _x(self):
64 coords = self._canvas.bbox(self._TAG)
65 assert coords
66 return coords[2] - 6 # TBD: kludge
67
68
69
70class StripWidget(Pmw.MegaWidget):
71 _CHIPHEIGHT = 50
72 _CHIPWIDTH = 10
73 _NUMCHIPS = 40
74
75 def __init__(self, parent=None, **kw):
76 options = (('color', (128, 128, 128), self.__set_color),
77 ('delegate', None, None),
78 ('chipwidth', self._CHIPWIDTH, Pmw.INITOPT),
79 ('chipheight', self._CHIPHEIGHT, Pmw.INITOPT),
80 ('numchips', self._NUMCHIPS, Pmw.INITOPT),
81 ('generator', None, Pmw.INITOPT),
Barry Warsaw35ae8641998-02-13 21:28:47 +000082 ('axis', None, Pmw.INITOPT),
Barry Warsawbc689301998-02-17 03:09:40 +000083 ('label', '', Pmw.INITOPT),
Barry Warsaw9d882bc1998-02-12 19:51:57 +000084 )
85 self.defineoptions(kw, options)
86
87 Pmw.MegaWidget.__init__(self, parent)
88 interiorarg = (self.interior(),)
89
90 # group component contains a convas containing a bunch of objects
91 # (moveable arrow + text label, relief'd rectangle color chips)
92 chipwidth = self.__chipwidth = self['chipwidth']
93 chipheight = self.__chipheight = self['chipheight']
94 numchips = self.__numchips = self['numchips']
95
96 canvaswidth = numchips * (chipwidth + 1)
Barry Warsawbc689301998-02-17 03:09:40 +000097 canvasheight = chipheight + 43 # TBD: Kludge
Barry Warsaw9d882bc1998-02-12 19:51:57 +000098
Barry Warsawbc689301998-02-17 03:09:40 +000099 # create the canvas and pack it
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000100 self.__canvas = Canvas(
101 parent,
102 width=canvaswidth,
Barry Warsawbc689301998-02-17 03:09:40 +0000103 height=canvasheight,
104## borderwidth=2,
105## relief=GROOVE
106 )
107
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000108 self.__canvas.pack()
Barry Warsawbc689301998-02-17 03:09:40 +0000109 self.__canvas.bind('<ButtonRelease-1>',
110 self.__select_chip)
111 self.__canvas.bind('<B1-Motion>',
112 self.__select_chip)
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000113
114 # create the color strip
115 chips = self.__chips = []
116 x = 1
117 y = 30
118 for c in range(self.__numchips):
119 rect = self.__canvas.create_rectangle(
120 x, y, x+chipwidth, y+chipheight,
121 fill='grey', outline='grey')
122
123 x = x + chipwidth + 1 # for outline
124 chips.append(rect)
125
Barry Warsawbc689301998-02-17 03:09:40 +0000126 # create the string tag
127 self.__label = self.__canvas.create_text(
128 3, y + chipheight + 8,
129 text=self['label'],
130 anchor=W)
131
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000132 # create the arrow and text item
133 chipx = self.__arrow_x(0)
134 self.__leftarrow = LeftArrow(self.__canvas, chipx)
135
136 chipx = self.__arrow_x(len(chips) - 1)
137 self.__rightarrow = RightArrow(self.__canvas, chipx)
138
139 self.__generator = self['generator']
Barry Warsaw35ae8641998-02-13 21:28:47 +0000140 self.__axis = self['axis']
141 assert self.__axis in (0, 1, 2)
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000142 self.initialiseoptions(StripWidget)
143
144 def __set_color(self):
145 rgbtuple = self['color']
Barry Warsawbc689301998-02-17 03:09:40 +0000146 self.set_color(self, rgbtuple)
147
148 def __arrow_x(self, chipnum):
149 coords = self.__canvas.coords(self.__chips[chipnum])
150 assert coords
151 x0, y0, x1, y1 = coords
152 return (x1 + x0) / 2.0
153
154 def __select_chip(self, event=None):
155 chip = self.__canvas.find_closest(event.x, event.y)
156 delegate = self['delegate']
157 if chip and delegate:
158 color = self.__canvas.itemcget(chip, 'fill')
159 rgbtuple = ColorDB.rrggbb_to_triplet(color)
160 delegate.set_color(self, rgbtuple)
161
162
163 #
164 # public interface
165 #
166
167 def set_color(self, obj, rgbtuple):
Barry Warsaw35ae8641998-02-13 21:28:47 +0000168 red, green, blue = rgbtuple
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000169 if self.__generator:
170 i = 0
Barry Warsaw35ae8641998-02-13 21:28:47 +0000171 chip = 0
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000172 for t in self.__generator(self.__numchips, rgbtuple):
173 rrggbb = ColorDB.triplet_to_rrggbb(t)
174 self.__canvas.itemconfigure(self.__chips[i],
175 fill=rrggbb,
176 outline=rrggbb)
Barry Warsaw35ae8641998-02-13 21:28:47 +0000177 tred, tgreen, tblue = t
178 if tred <= red and tgreen <= green and tblue <= blue:
179 chip = i
Barry Warsaw9d882bc1998-02-12 19:51:57 +0000180 i = i + 1
Barry Warsaw35ae8641998-02-13 21:28:47 +0000181 # get the arrow's text
182 coloraxis = rgbtuple[self.__axis]
183 text = repr(coloraxis)
184
185 # move the arrow, and set it's text
186 if coloraxis <= 128:
187 # use the left chip
188 self.__leftarrow.set_text(text)
189 self.__leftarrow.move_to(self.__arrow_x(chip))
190 self.__rightarrow.move_to(-100)
191 else:
192 # use the right chip
193 self.__rightarrow.set_text(text)
194 self.__rightarrow.move_to(self.__arrow_x(chip))
195 self.__leftarrow.move_to(-100)
196 # and set the chip's outline
197 pmwrgb = ColorDB.triplet_to_pmwrgb(rgbtuple)
198 b = Pmw.Color.rgb2brightness(pmwrgb)
199 if b <= 0.5:
200 outline = 'white'
201 else:
202 outline = 'black'
203 self.__canvas.itemconfigure(self.__chips[chip],
204 outline=outline)