blob: 106dd1fd0d8ec62149075cd328ead1bb4fc29b7b [file] [log] [blame]
Barry Warsawfefbf791998-01-31 23:39:01 +00001"""Main Pynche (Pythonically Natural Color and Hue Editor) widget.
2"""
3
4from Tkinter import *
5import Pmw
6import ColorDB
7from ChipWidget import ChipWidget
Barry Warsawa6f591a1998-02-11 17:19:54 +00008from TypeinWidget import TypeinWidget
Barry Warsaw29fe4dd1998-02-12 19:52:31 +00009from StripWidget import StripWidget
Barry Warsawfefbf791998-01-31 23:39:01 +000010
Barry Warsaw29fe4dd1998-02-12 19:52:31 +000011
12def constant(numchips):
13 step = 255.0 / (numchips - 1)
14 start = 0.0
15 seq = []
16 while numchips > 0:
17 seq.append(int(start))
18 start = start + step
19 numchips = numchips - 1
20 return seq
21
22def constant_red_generator(numchips, rgbtuple):
23 red = rgbtuple[0]
24 seq = constant(numchips)
25 return map(None, [red] * numchips, seq, seq)
26
27def constant_green_generator(numchips, rgbtuple):
28 green = rgbtuple[1]
29 seq = constant(numchips)
30 return map(None, seq, [green] * numchips, seq)
31
32def constant_blue_generator(numchips, rgbtuple):
33 blue = rgbtuple[2]
34 seq = constant(numchips)
35 return map(None, seq, seq, [blue] * numchips)
36
37
38
Barry Warsawfefbf791998-01-31 23:39:01 +000039class PyncheWidget(Pmw.MegaWidget):
40 def __init__(self, colordb, parent=None, **kw):
41 self.__colordb = colordb
42
Barry Warsawa6f591a1998-02-11 17:19:54 +000043 options = (('color', (128, 128, 128), self.__set_color),
44 ('delegate', None, None),
45 )
46 self.defineoptions(kw, options)
Barry Warsawfefbf791998-01-31 23:39:01 +000047
48 # initialize base class -- after defining options
49 Pmw.MegaWidget.__init__(self, parent)
50 interiorarg = (self.interior(),)
51
52 # create color selectors
Barry Warsaw29fe4dd1998-02-12 19:52:31 +000053 group = Pmw.Group(parent, tag_text='Color Selectors')
54 group.pack(side=TOP, expand=YES, fill=BOTH)
55 self.__reds = StripWidget(group.interior(),
56 generator=constant_red_generator)
57 self.__reds.pack()
58 self.__blues = StripWidget(group.interior(),
59 generator=constant_blue_generator)
60 self.__blues.pack()
61 self.__greens = StripWidget(group.interior(),
62 generator=constant_green_generator)
63 self.__greens.pack()
Barry Warsawfefbf791998-01-31 23:39:01 +000064
65 # create chip window
66 group = Pmw.Group(parent, tag_text='Current Color')
67 group.pack(side=LEFT, fill=Y)
68 self.__selected = ChipWidget(group.interior(),
69 label_text='Selected')
70 self.__selected.grid()
71 self.__nearest = ChipWidget(group.interior(),
72 label_text='Nearest')
73 self.__nearest.grid(row=0, column=1)
74
75 # create the options window
Barry Warsawa6f591a1998-02-11 17:19:54 +000076 group = Pmw.Group(parent, tag_text='Options')
77 group.pack(expand=YES, fill=BOTH)
78 self.__typein = TypeinWidget(group.interior())
79 self.__typein.grid()
Barry Warsawfefbf791998-01-31 23:39:01 +000080
81 # Check keywords and initialize options
82 self.initialiseoptions(PyncheWidget)
83
Barry Warsawa6f591a1998-02-11 17:19:54 +000084 self.__typein.configure(delegate=self)
85
86 #
87 # PUBLIC INTERFACE
88 #
89
90
91 def set_color(self, obj, rgbtuple):
Barry Warsawa6f591a1998-02-11 17:19:54 +000092 nearest = self.__colordb.nearest(rgbtuple)
Barry Warsaw55d3ffa1998-02-11 18:55:50 +000093 red, green, blue = self.__colordb.find_byname(nearest)
Barry Warsawa6f591a1998-02-11 17:19:54 +000094 # for an exact match, use the color name
95 if (red, green, blue) == rgbtuple:
96 self.__selected.configure(color=nearest)
97 # otherwise, use the #rrggbb name
98 else:
99 rrggbb = ColorDB.triplet_to_rrggbb(rgbtuple)
100 self.__selected.configure(color=rrggbb)
Barry Warsaw29fe4dd1998-02-12 19:52:31 +0000101
102 # configure all subwidgets
Barry Warsawa6f591a1998-02-11 17:19:54 +0000103 self.__nearest.configure(color=nearest)
104 self.__typein.configure(color=rgbtuple)
Barry Warsaw29fe4dd1998-02-12 19:52:31 +0000105 self.__reds.configure(color=rgbtuple)
106 self.__greens.configure(color=rgbtuple)
107 self.__blues.configure(color=rgbtuple)
Barry Warsawa6f591a1998-02-11 17:19:54 +0000108 delegate = self['delegate']
109 if delegate:
110 delegate.set_color(self, rgbtuple)
111
112 #
113 # PRIVATE INTERFACE
114 #
Barry Warsawfefbf791998-01-31 23:39:01 +0000115
116 def __set_color(self):
Barry Warsawa6f591a1998-02-11 17:19:54 +0000117 self.set_color(self, self['color'])