blob: 33d12dcd4ca677e4fccfb854ab0f0dddc5b72bc3 [file] [log] [blame]
Barry Warsawddb9fc11998-10-02 15:58:50 +00001"""Chip viewer and widget.
2
3In the lower left corner of the main Pynche window, you will see two
4ChipWidgets, one for the selected color and one for the nearest color. The
5selected color is the actual RGB value expressed as an X11 #COLOR name. The
6nearest color is the named color from the X11 database that is closest to the
7selected color in 3D space. There may be other colors equally close, but the
8nearest one is the first one found.
9
10Clicking on the nearest color chip selects that named color.
11
12The ChipViewer class includes the entire lower left quandrant; i.e. both the
13selected and nearest ChipWidgets.
14"""
15
Barry Warsawdc492e61998-09-29 15:44:20 +000016from types import StringType
Barry Warsaw7080a7f1998-01-29 23:48:55 +000017from Tkinter import *
Barry Warsawdc492e61998-09-29 15:44:20 +000018import ColorDB
Barry Warsaw7080a7f1998-01-29 23:48:55 +000019
Barry Warsawdc492e61998-09-29 15:44:20 +000020
21class ChipWidget:
Barry Warsaw37400e81998-02-11 18:54:23 +000022 _WIDTH = 150
23 _HEIGHT = 80
Barry Warsaw7080a7f1998-01-29 23:48:55 +000024
Barry Warsawdc492e61998-09-29 15:44:20 +000025 def __init__(self,
Barry Warsawca07ba01998-10-22 03:25:59 +000026 master = None,
Barry Warsawdc492e61998-09-29 15:44:20 +000027 width = _WIDTH,
28 height = _HEIGHT,
29 text = 'Color',
30 initialcolor = 'blue',
31 presscmd = None,
32 releasecmd = None):
33 # create the text label
Barry Warsawca07ba01998-10-22 03:25:59 +000034 self.__label = Label(master, text=text)
Barry Warsawdc492e61998-09-29 15:44:20 +000035 self.__label.grid(row=0, column=0)
36 # create the color chip, implemented as a frame
Barry Warsawca07ba01998-10-22 03:25:59 +000037 self.__chip = Frame(master, relief=RAISED, borderwidth=2,
Barry Warsawdc492e61998-09-29 15:44:20 +000038 width=width,
39 height=height,
40 background=initialcolor)
41 self.__chip.grid(row=1, column=0)
42 # create the color name, ctor argument must be a string
Barry Warsawca07ba01998-10-22 03:25:59 +000043 self.__name = Label(master, text=initialcolor)
Barry Warsawdc492e61998-09-29 15:44:20 +000044 self.__name.grid(row=2, column=0)
45 #
46 # set bindings
47 if presscmd:
48 self.__chip.bind('<ButtonPress-1>', presscmd)
49 if releasecmd:
50 self.__chip.bind('<ButtonRelease-1>', releasecmd)
Barry Warsaw7080a7f1998-01-29 23:48:55 +000051
Barry Warsaw0604d721999-04-26 23:17:16 +000052 def set_color(self, color, colorname=None):
Barry Warsawdc492e61998-09-29 15:44:20 +000053 self.__chip.config(background=color)
Barry Warsaw0604d721999-04-26 23:17:16 +000054 self.__name.config(text=colorname or color)
Barry Warsaw7080a7f1998-01-29 23:48:55 +000055
Barry Warsawdc492e61998-09-29 15:44:20 +000056 def get_color(self):
57 return self.__chip['background']
Barry Warsaw7080a7f1998-01-29 23:48:55 +000058
Barry Warsawdc492e61998-09-29 15:44:20 +000059 def press(self):
60 self.__chip.configure(relief=SUNKEN)
Barry Warsaw7080a7f1998-01-29 23:48:55 +000061
Barry Warsawdc492e61998-09-29 15:44:20 +000062 def release(self):
63 self.__chip.configure(relief=RAISED)
Barry Warsaw7080a7f1998-01-29 23:48:55 +000064
Barry Warsaw7080a7f1998-01-29 23:48:55 +000065
66
Barry Warsawdc492e61998-09-29 15:44:20 +000067class ChipViewer:
Barry Warsawca07ba01998-10-22 03:25:59 +000068 def __init__(self, switchboard, master=None):
Barry Warsawdc492e61998-09-29 15:44:20 +000069 self.__sb = switchboard
Barry Warsawca07ba01998-10-22 03:25:59 +000070 self.__frame = Frame(master, relief=RAISED, borderwidth=1)
Barry Warsaw615a66a1998-11-18 03:15:19 +000071 self.__frame.grid(row=3, column=0, ipadx=5, sticky='NSEW')
Barry Warsawdc492e61998-09-29 15:44:20 +000072 # create the chip that will display the currently selected color
73 # exactly
74 self.__sframe = Frame(self.__frame)
75 self.__sframe.grid(row=0, column=0)
76 self.__selected = ChipWidget(self.__sframe, text='Selected')
77 # create the chip that will display the nearest real X11 color
78 # database color name
79 self.__nframe = Frame(self.__frame)
80 self.__nframe.grid(row=0, column=1)
81 self.__nearest = ChipWidget(self.__nframe, text='Nearest',
82 presscmd = self.__buttonpress,
83 releasecmd = self.__buttonrelease)
Barry Warsaw7080a7f1998-01-29 23:48:55 +000084
Barry Warsawdc492e61998-09-29 15:44:20 +000085 def update_yourself(self, red, green, blue):
Barry Warsaw0604d721999-04-26 23:17:16 +000086 # Selected always shows the #rrggbb name of the color, nearest always
87 # shows the name of the nearest color in the database. TBD: should
88 # an exact match be indicated in some way?
89 #
90 # Always use the #rrggbb style to actually set the color, since we may
91 # not be using X color names (e.g. "web-safe" names)
92 colordb = self.__sb.colordb()
Barry Warsawdc492e61998-09-29 15:44:20 +000093 rgbtuple = (red, green, blue)
Barry Warsaw0604d721999-04-26 23:17:16 +000094 rrggbb = ColorDB.triplet_to_rrggbb(rgbtuple)
95 # find the nearest
96 nearest = colordb.nearest(red, green, blue)
97 nearest_tuple = colordb.find_byname(nearest)
98 nearest_rrggbb = ColorDB.triplet_to_rrggbb(nearest_tuple)
99 self.__selected.set_color(rrggbb)
100 self.__nearest.set_color(nearest_rrggbb, nearest)
Barry Warsawdc492e61998-09-29 15:44:20 +0000101
102 def __buttonpress(self, event=None):
103 self.__nearest.press()
104
105 def __buttonrelease(self, event=None):
106 self.__nearest.release()
Barry Warsaw0604d721999-04-26 23:17:16 +0000107 rrggbb = self.__nearest.get_color()
108 red, green, blue = ColorDB.rrggbb_to_triplet(rrggbb)
Barry Warsawdc492e61998-09-29 15:44:20 +0000109 self.__sb.update_views(red, green, blue)