blob: e0b7ab115053502b4530a9f3a940527589a0d81f [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
21class TextViewer:
Barry Warsawca07ba01998-10-22 03:25:59 +000022 def __init__(self, switchboard, master=None):
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000023 self.__sb = switchboard
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000024 optiondb = switchboard.optiondb()
Barry Warsawca07ba01998-10-22 03:25:59 +000025 root = self.__root = Toplevel(master, class_='Pynche')
26 root.protocol('WM_DELETE_WINDOW', self.withdraw)
Barry Warsaw7c51a9a1998-10-05 21:31:37 +000027 root.title('Pynche Text Window')
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000028 root.iconname('Pynche Text Window')
29 root.bind('<Alt-q>', self.__quit)
30 root.bind('<Alt-Q>', self.__quit)
Barry Warsawca07ba01998-10-22 03:25:59 +000031 root.bind('<Alt-w>', self.withdraw)
32 root.bind('<Alt-W>', self.withdraw)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000033 #
34 # create the text widget
35 #
36 self.__text = Text(root, relief=SUNKEN,
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000037 background=optiondb.get('TEXTBG', 'black'),
38 foreground=optiondb.get('TEXTFG', 'white'),
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000039 width=35, height=15)
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000040 sfg = optiondb.get('TEXT_SFG')
41 if sfg:
42 self.__text.configure(selectforeground=sfg)
43 sbg = optiondb.get('TEXT_SBG')
44 if sbg:
45 self.__text.configure(selectbackground=sbg)
46 ibg = optiondb.get('TEXT_IBG')
47 if ibg:
48 self.__text.configure(insertbackground=ibg)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000049 self.__text.pack()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000050 self.__text.insert(0.0, optiondb.get('TEXT', '''\
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000051Insert some stuff here and play
52with the buttons below to see
53how the colors interact in
Barry Warsawda7502e1998-10-06 21:40:22 +000054textual displays.
55
56See how the selection can also
57be affected by tickling the buttons
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000058and choosing a color.'''))
59 insert = optiondb.get('TEXTINS')
60 if insert:
61 self.__text.mark_set(INSERT, insert)
62 try:
63 start, end = optiondb.get('TEXTSEL', (6.0, END))
64 self.__text.tag_add(SEL, start, end)
65 except ValueError:
66 # selection wasn't set
67 pass
68 self.__text.focus_set()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000069 #
70 # variables
71 self.__trackp = BooleanVar()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000072 self.__trackp.set(optiondb.get('TRACKP', 0))
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000073 self.__which = IntVar()
Barry Warsaw8a09e1c1998-10-20 20:45:46 +000074 self.__which.set(optiondb.get('WHICH', 0))
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000075 #
76 # track toggle
77 self.__t = Checkbutton(root, text='Track color changes',
78 variable=self.__trackp,
Barry Warsaw3a476e91998-10-06 18:46:57 +000079 relief=GROOVE,
80 command=self.__toggletrack)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +000081 self.__t.pack(fill=X, expand=YES)
82 frame = self.__frame = Frame(root)
83 frame.pack()
84 #
85 # labels
86 self.__labels = []
87 row = 2
88 for text in ('Text:', 'Selection:', 'Insertion:'):
89 l = Label(frame, text=text)
90 l.grid(row=row, column=0, sticky=E)
91 self.__labels.append(l)
92 row = row + 1
93 col = 1
94 for text in ('Foreground', 'Background'):
95 l = Label(frame, text=text)
96 l.grid(row=1, column=col)
97 self.__labels.append(l)
98 col = col + 1
99 #
100 # radios
101 self.__radios = []
102 val = 0
103 for col in (1, 2):
104 for row in (2, 3, 4):
105 # there is no insertforeground option
106 if row==4 and col==1:
107 continue
108 r = Radiobutton(frame, variable=self.__which,
Barry Warsaw7b281221999-04-27 15:56:53 +0000109 value=(row-2)*2 + col-1,
110 command=self.__set_color)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000111 r.grid(row=row, column=col)
112 self.__radios.append(r)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000113 self.__toggletrack()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000114
115 def __quit(self, event=None):
Barry Warsaw45c8d341998-10-06 19:48:35 +0000116 self.__root.quit()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000117
Barry Warsawca07ba01998-10-22 03:25:59 +0000118 def withdraw(self, event=None):
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000119 self.__root.withdraw()
120
121 def deiconify(self, event=None):
122 self.__root.deiconify()
123
124 def __forceupdate(self, event=None):
125 self.__sb.update_views_current()
126
Barry Warsaw3a476e91998-10-06 18:46:57 +0000127 def __toggletrack(self, event=None):
128 if self.__trackp.get():
129 state = NORMAL
130 fg = self.__radios[0]['foreground']
131 else:
132 state = DISABLED
133 fg = self.__radios[0]['disabledforeground']
134 for r in self.__radios:
135 r.configure(state=state)
136 for l in self.__labels:
137 l.configure(foreground=fg)
138
Barry Warsaw7b281221999-04-27 15:56:53 +0000139 def __set_color(self, event=None):
140 which = self.__which.get()
141 text = self.__text
142 if which == 0:
143 color = text['foreground']
144 elif which == 1:
145 color = text['background']
146 elif which == 2:
147 color = text['selectforeground']
148 elif which == 3:
149 color = text['selectbackground']
150 elif which == 5:
151 color = text['insertbackground']
152 try:
153 red, green, blue = ColorDB.rrggbb_to_triplet(color)
154 except ColorDB.BadColor:
155 # must have been a color name
156 red, green, blue = self.__sb.colordb().find_byname(color)
157 self.__sb.update_views(red, green, blue)
158
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000159 def update_yourself(self, red, green, blue):
Barry Warsaw3a476e91998-10-06 18:46:57 +0000160 if self.__trackp.get():
161 colorname = ColorDB.triplet_to_rrggbb((red, green, blue))
162 which = self.__which.get()
Barry Warsaw7b281221999-04-27 15:56:53 +0000163 text = self.__text
Barry Warsaw3a476e91998-10-06 18:46:57 +0000164 if which == 0:
Barry Warsaw7b281221999-04-27 15:56:53 +0000165 text.configure(foreground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000166 elif which == 1:
Barry Warsaw7b281221999-04-27 15:56:53 +0000167 text.configure(background=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000168 elif which == 2:
Barry Warsaw7b281221999-04-27 15:56:53 +0000169 text.configure(selectforeground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000170 elif which == 3:
Barry Warsaw7b281221999-04-27 15:56:53 +0000171 text.configure(selectbackground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000172 elif which == 5:
Barry Warsaw7b281221999-04-27 15:56:53 +0000173 text.configure(insertbackground=colorname)
Barry Warsaw8a09e1c1998-10-20 20:45:46 +0000174
175 def save_options(self, optiondb):
176 optiondb['TRACKP'] = self.__trackp.get()
177 optiondb['WHICH'] = self.__which.get()
178 optiondb['TEXT'] = self.__text.get(0.0, 'end - 1c')
179 optiondb['TEXTSEL'] = self.__text.tag_ranges(SEL)[0:2]
180 optiondb['TEXTINS'] = self.__text.index(INSERT)
181 optiondb['TEXTFG'] = self.__text['foreground']
182 optiondb['TEXTBG'] = self.__text['background']
183 optiondb['TEXT_SFG'] = self.__text['selectforeground']
184 optiondb['TEXT_SBG'] = self.__text['selectbackground']
185 optiondb['TEXT_IBG'] = self.__text['insertbackground']