blob: d971ecafd62b03d3e95c232cd7a4a6be0905eee2 [file] [log] [blame]
Barry Warsaw4638c5b1998-10-02 16:20:14 +00001"""TextViewer class.
2
3The TextViewer allows you to see how the selected color would affect various
4characteristics of a Tk text widget. This is an output viewer only.
5
6In the top part of the window is a standard text widget with some sample text
7in it. You are free to edit this text in any way you want (TBD: allow you to
8change font characteristics). If you want changes in other viewers to update
9text characteristics, turn on Track color changes.
10
11To select which characteristic tracks the change, select one of the radio
12buttons in the window below. Text foreground and background affect the text
13in the window above. The Selection is what you see when you click the middle
14button and drag it through some text. The Insertion is the insertion cursor
15in the text window (which only has a background).
16"""
17
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000018from Tkinter import *
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000019import ColorDB
20
Barry Warsawf3ebf901999-04-27 18:54:12 +000021ADDTOVIEW = 'Text Window...'
22
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000023class TextViewer:
Barry Warsawca07ba01998-10-22 03:25:59 +000024 def __init__(self, switchboard, master=None):
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000025 self.__sb = switchboard
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000026 optiondb = switchboard.optiondb()
Barry Warsawca07ba01998-10-22 03:25:59 +000027 root = self.__root = Toplevel(master, class_='Pynche')
28 root.protocol('WM_DELETE_WINDOW', self.withdraw)
Barry Warsaw7c51a9a1998-10-05 21:31:37 +000029 root.title('Pynche Text Window')
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000030 root.iconname('Pynche Text Window')
31 root.bind('<Alt-q>', self.__quit)
32 root.bind('<Alt-Q>', self.__quit)
Barry Warsawca07ba01998-10-22 03:25:59 +000033 root.bind('<Alt-w>', self.withdraw)
34 root.bind('<Alt-W>', self.withdraw)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000035 #
36 # create the text widget
37 #
38 self.__text = Text(root, relief=SUNKEN,
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000039 background=optiondb.get('TEXTBG', 'black'),
40 foreground=optiondb.get('TEXTFG', 'white'),
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000041 width=35, height=15)
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000042 sfg = optiondb.get('TEXT_SFG')
43 if sfg:
44 self.__text.configure(selectforeground=sfg)
45 sbg = optiondb.get('TEXT_SBG')
46 if sbg:
47 self.__text.configure(selectbackground=sbg)
48 ibg = optiondb.get('TEXT_IBG')
49 if ibg:
50 self.__text.configure(insertbackground=ibg)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000051 self.__text.pack()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000052 self.__text.insert(0.0, optiondb.get('TEXT', '''\
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000053Insert some stuff here and play
54with the buttons below to see
55how the colors interact in
Barry Warsawda7502e1998-10-06 21:40:22 +000056textual displays.
57
58See how the selection can also
59be affected by tickling the buttons
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000060and choosing a color.'''))
61 insert = optiondb.get('TEXTINS')
62 if insert:
63 self.__text.mark_set(INSERT, insert)
64 try:
65 start, end = optiondb.get('TEXTSEL', (6.0, END))
66 self.__text.tag_add(SEL, start, end)
67 except ValueError:
68 # selection wasn't set
69 pass
70 self.__text.focus_set()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000071 #
72 # variables
73 self.__trackp = BooleanVar()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000074 self.__trackp.set(optiondb.get('TRACKP', 0))
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000075 self.__which = IntVar()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000076 self.__which.set(optiondb.get('WHICH', 0))
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000077 #
78 # track toggle
79 self.__t = Checkbutton(root, text='Track color changes',
80 variable=self.__trackp,
Barry Warsaw3a476e91998-10-06 18:46:57 +000081 relief=GROOVE,
82 command=self.__toggletrack)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000083 self.__t.pack(fill=X, expand=YES)
84 frame = self.__frame = Frame(root)
85 frame.pack()
86 #
87 # labels
88 self.__labels = []
89 row = 2
90 for text in ('Text:', 'Selection:', 'Insertion:'):
91 l = Label(frame, text=text)
92 l.grid(row=row, column=0, sticky=E)
93 self.__labels.append(l)
94 row = row + 1
95 col = 1
96 for text in ('Foreground', 'Background'):
97 l = Label(frame, text=text)
98 l.grid(row=1, column=col)
99 self.__labels.append(l)
100 col = col + 1
101 #
102 # radios
103 self.__radios = []
104 val = 0
105 for col in (1, 2):
106 for row in (2, 3, 4):
107 # there is no insertforeground option
108 if row==4 and col==1:
109 continue
110 r = Radiobutton(frame, variable=self.__which,
Barry Warsaw7b281221999-04-27 15:56:53 +0000111 value=(row-2)*2 + col-1,
112 command=self.__set_color)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000113 r.grid(row=row, column=col)
114 self.__radios.append(r)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000115 self.__toggletrack()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000116
117 def __quit(self, event=None):
Barry Warsaw45c8d341998-10-06 19:48:35 +0000118 self.__root.quit()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000119
Barry Warsawca07ba01998-10-22 03:25:59 +0000120 def withdraw(self, event=None):
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000121 self.__root.withdraw()
122
123 def deiconify(self, event=None):
124 self.__root.deiconify()
125
126 def __forceupdate(self, event=None):
127 self.__sb.update_views_current()
128
Barry Warsaw3a476e91998-10-06 18:46:57 +0000129 def __toggletrack(self, event=None):
130 if self.__trackp.get():
131 state = NORMAL
132 fg = self.__radios[0]['foreground']
133 else:
134 state = DISABLED
135 fg = self.__radios[0]['disabledforeground']
136 for r in self.__radios:
137 r.configure(state=state)
138 for l in self.__labels:
139 l.configure(foreground=fg)
140
Barry Warsaw7b281221999-04-27 15:56:53 +0000141 def __set_color(self, event=None):
142 which = self.__which.get()
143 text = self.__text
144 if which == 0:
145 color = text['foreground']
146 elif which == 1:
147 color = text['background']
148 elif which == 2:
149 color = text['selectforeground']
150 elif which == 3:
151 color = text['selectbackground']
152 elif which == 5:
153 color = text['insertbackground']
154 try:
155 red, green, blue = ColorDB.rrggbb_to_triplet(color)
156 except ColorDB.BadColor:
157 # must have been a color name
158 red, green, blue = self.__sb.colordb().find_byname(color)
159 self.__sb.update_views(red, green, blue)
160
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000161 def update_yourself(self, red, green, blue):
Barry Warsaw3a476e91998-10-06 18:46:57 +0000162 if self.__trackp.get():
163 colorname = ColorDB.triplet_to_rrggbb((red, green, blue))
164 which = self.__which.get()
Barry Warsaw7b281221999-04-27 15:56:53 +0000165 text = self.__text
Barry Warsaw3a476e91998-10-06 18:46:57 +0000166 if which == 0:
Barry Warsaw7b281221999-04-27 15:56:53 +0000167 text.configure(foreground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000168 elif which == 1:
Barry Warsaw7b281221999-04-27 15:56:53 +0000169 text.configure(background=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000170 elif which == 2:
Barry Warsaw7b281221999-04-27 15:56:53 +0000171 text.configure(selectforeground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000172 elif which == 3:
Barry Warsaw7b281221999-04-27 15:56:53 +0000173 text.configure(selectbackground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000174 elif which == 5:
Barry Warsaw7b281221999-04-27 15:56:53 +0000175 text.configure(insertbackground=colorname)
Barry Warsaw8a09e1c1998-10-20 20:45:46 +0000176
177 def save_options(self, optiondb):
178 optiondb['TRACKP'] = self.__trackp.get()
179 optiondb['WHICH'] = self.__which.get()
180 optiondb['TEXT'] = self.__text.get(0.0, 'end - 1c')
181 optiondb['TEXTSEL'] = self.__text.tag_ranges(SEL)[0:2]
182 optiondb['TEXTINS'] = self.__text.index(INSERT)
183 optiondb['TEXTFG'] = self.__text['foreground']
184 optiondb['TEXTBG'] = self.__text['background']
185 optiondb['TEXT_SFG'] = self.__text['selectforeground']
186 optiondb['TEXT_SBG'] = self.__text['selectbackground']
187 optiondb['TEXT_IBG'] = self.__text['insertbackground']