Barry Warsaw | 69a4ab5 | 1998-10-02 16:27:40 +0000 | [diff] [blame] | 1 | """TypeinViewer class. |
| 2 | |
| 3 | The TypeinViewer is what you see at the lower right of the main Pynche |
| 4 | widget. It contains three text entry fields, one each for red, green, blue. |
| 5 | Input into these windows is highly constrained; it only allows you to enter |
| 6 | values that are legal for a color axis. This usually means 0-255 for decimal |
| 7 | input and 0x0 - 0xff for hex input. |
| 8 | |
| 9 | You can toggle whether you want to view and input the values in either decimal |
| 10 | or hex by clicking on Hexadecimal. By clicking on Update while typing, the |
| 11 | color selection will be made on every change to the text field. Otherwise, |
| 12 | you must hit Return or Tab to select the color. |
| 13 | """ |
| 14 | |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 15 | from Tkinter import * |
Barry Warsaw | 2e6c13f | 1998-02-10 00:13:06 +0000 | [diff] [blame] | 16 | |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 17 | |
| 18 | |
Barry Warsaw | 4202019 | 1998-09-29 20:02:27 +0000 | [diff] [blame] | 19 | class TypeinViewer: |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 20 | def __init__(self, switchboard, master=None): |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 21 | # non-gui ivars |
| 22 | self.__sb = switchboard |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 23 | optiondb = switchboard.optiondb() |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 24 | self.__hexp = BooleanVar() |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 25 | self.__hexp.set(optiondb.get('HEXTYPE', 0)) |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 26 | self.__uwtyping = BooleanVar() |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 27 | self.__uwtyping.set(optiondb.get('UPWHILETYPE', 0)) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 28 | # create the gui |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 29 | self.__frame = Frame(master, relief=RAISED, borderwidth=1) |
Barry Warsaw | f72d580 | 1998-10-22 18:48:45 +0000 | [diff] [blame] | 30 | self.__frame.grid(row=3, column=1, sticky='NSEW') |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 31 | # Red |
| 32 | self.__xl = Label(self.__frame, text='Red:') |
| 33 | self.__xl.grid(row=0, column=0, sticky=E) |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 34 | subframe = Frame(self.__frame) |
| 35 | subframe.grid(row=0, column=1) |
| 36 | self.__xox = Label(subframe, text='0x') |
| 37 | self.__xox.grid(row=0, column=0, sticky=E) |
| 38 | self.__xox['font'] = 'courier' |
| 39 | self.__x = Entry(subframe, width=3) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 40 | self.__x.grid(row=0, column=1) |
| 41 | self.__x.bindtags(self.__x.bindtags() + ('Normalize', 'Update')) |
| 42 | self.__x.bind_class('Normalize', '<Key>', self.__normalize) |
Barry Warsaw | 4202019 | 1998-09-29 20:02:27 +0000 | [diff] [blame] | 43 | self.__x.bind_class('Update' , '<Key>', self.__maybeupdate) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 44 | # Green |
| 45 | self.__yl = Label(self.__frame, text='Green:') |
| 46 | self.__yl.grid(row=1, column=0, sticky=E) |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 47 | subframe = Frame(self.__frame) |
| 48 | subframe.grid(row=1, column=1) |
| 49 | self.__yox = Label(subframe, text='0x') |
| 50 | self.__yox.grid(row=0, column=0, sticky=E) |
| 51 | self.__yox['font'] = 'courier' |
| 52 | self.__y = Entry(subframe, width=3) |
| 53 | self.__y.grid(row=0, column=1) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 54 | self.__y.bindtags(self.__y.bindtags() + ('Normalize', 'Update')) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 55 | # Blue |
| 56 | self.__zl = Label(self.__frame, text='Blue:') |
| 57 | self.__zl.grid(row=2, column=0, sticky=E) |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 58 | subframe = Frame(self.__frame) |
| 59 | subframe.grid(row=2, column=1) |
| 60 | self.__zox = Label(subframe, text='0x') |
| 61 | self.__zox.grid(row=0, column=0, sticky=E) |
| 62 | self.__zox['font'] = 'courier' |
| 63 | self.__z = Entry(subframe, width=3) |
| 64 | self.__z.grid(row=0, column=1) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 65 | self.__z.bindtags(self.__z.bindtags() + ('Normalize', 'Update')) |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 66 | # Update while typing? |
| 67 | self.__uwt = Checkbutton(self.__frame, |
| 68 | text='Update while typing', |
| 69 | variable=self.__uwtyping) |
| 70 | self.__uwt.grid(row=3, column=0, columnspan=2, sticky=W) |
| 71 | # Hex/Dec |
| 72 | self.__hex = Checkbutton(self.__frame, |
| 73 | text='Hexadecimal', |
Barry Warsaw | 85e6965 | 1998-10-01 13:41:05 +0000 | [diff] [blame] | 74 | variable=self.__hexp, |
| 75 | command=self.__togglehex) |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 76 | self.__hex.grid(row=4, column=0, columnspan=2, sticky=W) |
Barry Warsaw | 2e6c13f | 1998-02-10 00:13:06 +0000 | [diff] [blame] | 77 | |
Barry Warsaw | 85e6965 | 1998-10-01 13:41:05 +0000 | [diff] [blame] | 78 | def __togglehex(self, event=None): |
Barry Warsaw | c2d8f57 | 1998-10-06 16:08:39 +0000 | [diff] [blame] | 79 | red, green, blue = self.__sb.current_rgb() |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 80 | if self.__hexp.get(): |
| 81 | label = '0x' |
| 82 | else: |
| 83 | label = ' ' |
| 84 | self.__xox['text'] = label |
| 85 | self.__yox['text'] = label |
| 86 | self.__zox['text'] = label |
Barry Warsaw | c2d8f57 | 1998-10-06 16:08:39 +0000 | [diff] [blame] | 87 | self.update_yourself(red, green, blue) |
Barry Warsaw | 85e6965 | 1998-10-01 13:41:05 +0000 | [diff] [blame] | 88 | |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 89 | def __normalize(self, event=None): |
| 90 | ew = event.widget |
| 91 | contents = ew.get() |
Barry Warsaw | a398924 | 1998-10-06 15:47:45 +0000 | [diff] [blame] | 92 | icursor = ew.index(INSERT) |
Barry Warsaw | 1bbc048 | 2001-02-01 21:31:58 +0000 | [diff] [blame] | 93 | if contents and contents[0] in 'xX' and self.__hexp.get(): |
Barry Warsaw | 8934af0 | 1998-10-07 02:44:17 +0000 | [diff] [blame] | 94 | contents = '0' + contents |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 95 | # Figure out the contents in the current base. |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 96 | try: |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 97 | if self.__hexp.get(): |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 98 | v = int(contents, 16) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 99 | else: |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 100 | v = int(contents) |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 101 | except ValueError: |
| 102 | v = None |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 103 | # If value is not legal, or empty, delete the last character inserted |
| 104 | # and ring the bell. Don't ring the bell if the field is empty (it'll |
| 105 | # just equal zero. |
| 106 | if v is None: |
| 107 | pass |
| 108 | elif v < 0 or v > 255: |
Barry Warsaw | 85e6965 | 1998-10-01 13:41:05 +0000 | [diff] [blame] | 109 | i = ew.index(INSERT) |
Barry Warsaw | 8934af0 | 1998-10-07 02:44:17 +0000 | [diff] [blame] | 110 | if event.char: |
| 111 | contents = contents[:i-1] + contents[i:] |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 112 | icursor -= 1 |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 113 | ew.bell() |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 114 | elif self.__hexp.get(): |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 115 | contents = hex(v)[2:] |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 116 | else: |
| 117 | contents = int(v) |
| 118 | ew.delete(0, END) |
| 119 | ew.insert(0, contents) |
Barry Warsaw | a398924 | 1998-10-06 15:47:45 +0000 | [diff] [blame] | 120 | ew.icursor(icursor) |
Barry Warsaw | 2e6c13f | 1998-02-10 00:13:06 +0000 | [diff] [blame] | 121 | |
Barry Warsaw | 4202019 | 1998-09-29 20:02:27 +0000 | [diff] [blame] | 122 | def __maybeupdate(self, event=None): |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 123 | if self.__uwtyping.get() or event.keysym in ('Return', 'Tab'): |
Barry Warsaw | 4202019 | 1998-09-29 20:02:27 +0000 | [diff] [blame] | 124 | self.__update(event) |
| 125 | |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 126 | def __update(self, event=None): |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 127 | redstr = self.__x.get() or '0' |
| 128 | greenstr = self.__y.get() or '0' |
| 129 | bluestr = self.__z.get() or '0' |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 130 | if self.__hexp.get(): |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 131 | base = 16 |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 132 | else: |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 133 | base = 10 |
| 134 | red, green, blue = [int(x, base) for x in (redstr, greenstr, bluestr)] |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 135 | self.__sb.update_views(red, green, blue) |
Barry Warsaw | 2e6c13f | 1998-02-10 00:13:06 +0000 | [diff] [blame] | 136 | |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 137 | def update_yourself(self, red, green, blue): |
Barry Warsaw | 0fa6e4b | 1998-10-01 02:57:05 +0000 | [diff] [blame] | 138 | if self.__hexp.get(): |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 139 | sred, sgreen, sblue = [hex(x)[2:] for x in (red, green, blue)] |
Barry Warsaw | 885b371 | 1998-09-29 19:51:18 +0000 | [diff] [blame] | 140 | else: |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 141 | sred, sgreen, sblue = red, green, blue |
Barry Warsaw | 8934af0 | 1998-10-07 02:44:17 +0000 | [diff] [blame] | 142 | x, y, z = self.__x, self.__y, self.__z |
| 143 | xicursor = x.index(INSERT) |
| 144 | yicursor = y.index(INSERT) |
| 145 | zicursor = z.index(INSERT) |
| 146 | x.delete(0, END) |
| 147 | y.delete(0, END) |
| 148 | z.delete(0, END) |
Barry Warsaw | 780028e | 2001-07-10 21:50:44 +0000 | [diff] [blame] | 149 | x.insert(0, sred) |
| 150 | y.insert(0, sgreen) |
| 151 | z.insert(0, sblue) |
Barry Warsaw | 8934af0 | 1998-10-07 02:44:17 +0000 | [diff] [blame] | 152 | x.icursor(xicursor) |
| 153 | y.icursor(yicursor) |
| 154 | z.icursor(zicursor) |
Barry Warsaw | 6831c30 | 1998-10-06 15:49:19 +0000 | [diff] [blame] | 155 | |
Barry Warsaw | 73290df | 1998-10-06 15:50:36 +0000 | [diff] [blame] | 156 | def hexp_var(self): |
| 157 | return self.__hexp |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 158 | |
| 159 | def save_options(self, optiondb): |
| 160 | optiondb['HEXTYPE'] = self.__hexp.get() |
| 161 | optiondb['UPWHILETYPE'] = self.__uwtyping.get() |