164 lines
6.0 KiB
Python
164 lines
6.0 KiB
Python
"""TypeinViewer class.
|
||
|
||
The TypeinViewer is what you see at the lower right of the main Pynche
|
||
widget. It contains three text entry fields, one each for red, green, blue.
|
||
Input into these windows is highly constrained; it only allows you to enter
|
||
values that are legal for a color axis. This usually means 0-255 for decimal
|
||
input and 0x0 - 0xff for hex input.
|
||
|
||
You can toggle whether you want to view and input the values in either decimal
|
||
or hex by clicking on Hexadecimal. By clicking on Update while typing, the
|
||
color selection will be made on every change to the text field. Otherwise,
|
||
you must hit Return or Tab to select the color.
|
||
"""
|
||
|
||
import sys
|
||
import re
|
||
from Tkinter import *
|
||
|
||
|
||
|
||
class TypeinViewer:
|
||
def __init__(self, switchboard, master=None):
|
||
# non-gui ivars
|
||
self.__sb = switchboard
|
||
optiondb = switchboard.optiondb()
|
||
self.__hexp = BooleanVar()
|
||
self.__hexp.set(optiondb.get('HEXTYPE', 0))
|
||
self.__uwtyping = BooleanVar()
|
||
self.__uwtyping.set(optiondb.get('UPWHILETYPE', 0))
|
||
# create the gui
|
||
self.__frame = Frame(master, relief=RAISED, borderwidth=1)
|
||
self.__frame.grid(row=3, column=1, sticky='NSEW')
|
||
# Red
|
||
self.__xl = Label(self.__frame, text='Red:')
|
||
self.__xl.grid(row=0, column=0, sticky=E)
|
||
subframe = Frame(self.__frame)
|
||
subframe.grid(row=0, column=1)
|
||
self.__xox = Label(subframe, text='0x')
|
||
self.__xox.grid(row=0, column=0, sticky=E)
|
||
self.__xox['font'] = 'courier'
|
||
self.__x = Entry(subframe, width=3)
|
||
self.__x.grid(row=0, column=1)
|
||
self.__x.bindtags(self.__x.bindtags() + ('Normalize', 'Update'))
|
||
self.__x.bind_class('Normalize', '<Key>', self.__normalize)
|
||
self.__x.bind_class('Update' , '<Key>', self.__maybeupdate)
|
||
# Green
|
||
self.__yl = Label(self.__frame, text='Green:')
|
||
self.__yl.grid(row=1, column=0, sticky=E)
|
||
subframe = Frame(self.__frame)
|
||
subframe.grid(row=1, column=1)
|
||
self.__yox = Label(subframe, text='0x')
|
||
self.__yox.grid(row=0, column=0, sticky=E)
|
||
self.__yox['font'] = 'courier'
|
||
self.__y = Entry(subframe, width=3)
|
||
self.__y.grid(row=0, column=1)
|
||
self.__y.bindtags(self.__y.bindtags() + ('Normalize', 'Update'))
|
||
# Blue
|
||
self.__zl = Label(self.__frame, text='Blue:')
|
||
self.__zl.grid(row=2, column=0, sticky=E)
|
||
subframe = Frame(self.__frame)
|
||
subframe.grid(row=2, column=1)
|
||
self.__zox = Label(subframe, text='0x')
|
||
self.__zox.grid(row=0, column=0, sticky=E)
|
||
self.__zox['font'] = 'courier'
|
||
self.__z = Entry(subframe, width=3)
|
||
self.__z.grid(row=0, column=1)
|
||
self.__z.bindtags(self.__z.bindtags() + ('Normalize', 'Update'))
|
||
# Update while typing?
|
||
self.__uwt = Checkbutton(self.__frame,
|
||
text='Update while typing',
|
||
variable=self.__uwtyping)
|
||
self.__uwt.grid(row=3, column=0, columnspan=2, sticky=W)
|
||
# Hex/Dec
|
||
self.__hex = Checkbutton(self.__frame,
|
||
text='Hexadecimal',
|
||
variable=self.__hexp,
|
||
command=self.__togglehex)
|
||
self.__hex.grid(row=4, column=0, columnspan=2, sticky=W)
|
||
|
||
def __togglehex(self, event=None):
|
||
red, green, blue = self.__sb.current_rgb()
|
||
if self.__hexp.get():
|
||
label = '0x'
|
||
else:
|
||
label = ' '
|
||
self.__xox['text'] = label
|
||
self.__yox['text'] = label
|
||
self.__zox['text'] = label
|
||
self.update_yourself(red, green, blue)
|
||
|
||
def __normalize(self, event=None):
|
||
ew = event.widget
|
||
contents = ew.get()
|
||
icursor = ew.index(INSERT)
|
||
if contents and contents[0] in 'xX' and self.__hexp.get():
|
||
contents = '0' + contents
|
||
# Figure out the contents in the current base.
|
||
try:
|
||
if self.__hexp.get():
|
||
v = int(contents, 16)
|
||
else:
|
||
v = int(contents)
|
||
except ValueError:
|
||
v = None
|
||
# If value is not legal, or empty, delete the last character inserted
|
||
# and ring the bell. Don't ring the bell if the field is empty (it'll
|
||
# just equal zero.
|
||
if v is None:
|
||
pass
|
||
elif v < 0 or v > 255:
|
||
i = ew.index(INSERT)
|
||
if event.char:
|
||
contents = contents[:i-1] + contents[i:]
|
||
icursor -= 1
|
||
ew.bell()
|
||
elif self.__hexp.get():
|
||
contents = hex(v)[2:]
|
||
else:
|
||
contents = int(v)
|
||
ew.delete(0, END)
|
||
ew.insert(0, contents)
|
||
ew.icursor(icursor)
|
||
|
||
def __maybeupdate(self, event=None):
|
||
if self.__uwtyping.get() or event.keysym in ('Return', 'Tab'):
|
||
self.__update(event)
|
||
|
||
def __update(self, event=None):
|
||
redstr = self.__x.get() or '0'
|
||
greenstr = self.__y.get() or '0'
|
||
bluestr = self.__z.get() or '0'
|
||
if self.__hexp.get():
|
||
base = 16
|
||
else:
|
||
base = 10
|
||
red, green, blue = [int(x, base) for x in (redstr, greenstr, bluestr)]
|
||
self.__sb.update_views(red, green, blue)
|
||
|
||
def update_yourself(self, red, green, blue):
|
||
if self.__hexp.get():
|
||
sred, sgreen, sblue = [hex(x)[2:] for x in (red, green, blue)]
|
||
else:
|
||
sred, sgreen, sblue = red, green, blue
|
||
x, y, z = self.__x, self.__y, self.__z
|
||
xicursor = x.index(INSERT)
|
||
yicursor = y.index(INSERT)
|
||
zicursor = z.index(INSERT)
|
||
x.delete(0, END)
|
||
y.delete(0, END)
|
||
z.delete(0, END)
|
||
x.insert(0, sred)
|
||
y.insert(0, sgreen)
|
||
z.insert(0, sblue)
|
||
x.icursor(xicursor)
|
||
y.icursor(yicursor)
|
||
z.icursor(zicursor)
|
||
|
||
def hexp_var(self):
|
||
return self.__hexp
|
||
|
||
def save_options(self, optiondb):
|
||
optiondb['HEXTYPE'] = self.__hexp.get()
|
||
optiondb['UPWHILETYPE'] = self.__uwtyping.get()
|