blob: 30a87f73bced70ce0bf7a9ae79a841f0cb6bfe01 [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 = []
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000104 for col in (1, 2):
105 for row in (2, 3, 4):
106 # there is no insertforeground option
107 if row==4 and col==1:
108 continue
109 r = Radiobutton(frame, variable=self.__which,
Barry Warsaw7b281221999-04-27 15:56:53 +0000110 value=(row-2)*2 + col-1,
111 command=self.__set_color)
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000112 r.grid(row=row, column=col)
113 self.__radios.append(r)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000114 self.__toggletrack()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000115
116 def __quit(self, event=None):
Barry Warsaw45c8d341998-10-06 19:48:35 +0000117 self.__root.quit()
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000118
Barry Warsawca07ba01998-10-22 03:25:59 +0000119 def withdraw(self, event=None):
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000120 self.__root.withdraw()
121
122 def deiconify(self, event=None):
123 self.__root.deiconify()
124
125 def __forceupdate(self, event=None):
126 self.__sb.update_views_current()
127
Barry Warsaw3a476e91998-10-06 18:46:57 +0000128 def __toggletrack(self, event=None):
129 if self.__trackp.get():
130 state = NORMAL
131 fg = self.__radios[0]['foreground']
132 else:
133 state = DISABLED
134 fg = self.__radios[0]['disabledforeground']
135 for r in self.__radios:
136 r.configure(state=state)
137 for l in self.__labels:
138 l.configure(foreground=fg)
139
Barry Warsaw7b281221999-04-27 15:56:53 +0000140 def __set_color(self, event=None):
141 which = self.__which.get()
142 text = self.__text
143 if which == 0:
144 color = text['foreground']
145 elif which == 1:
146 color = text['background']
147 elif which == 2:
148 color = text['selectforeground']
149 elif which == 3:
150 color = text['selectbackground']
151 elif which == 5:
152 color = text['insertbackground']
153 try:
154 red, green, blue = ColorDB.rrggbb_to_triplet(color)
155 except ColorDB.BadColor:
156 # must have been a color name
157 red, green, blue = self.__sb.colordb().find_byname(color)
158 self.__sb.update_views(red, green, blue)
159
Barry Warsawf9c6ddc1998-10-01 16:45:32 +0000160 def update_yourself(self, red, green, blue):
Barry Warsaw3a476e91998-10-06 18:46:57 +0000161 if self.__trackp.get():
162 colorname = ColorDB.triplet_to_rrggbb((red, green, blue))
163 which = self.__which.get()
Barry Warsaw7b281221999-04-27 15:56:53 +0000164 text = self.__text
Barry Warsaw3a476e91998-10-06 18:46:57 +0000165 if which == 0:
Barry Warsaw7b281221999-04-27 15:56:53 +0000166 text.configure(foreground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000167 elif which == 1:
Barry Warsaw7b281221999-04-27 15:56:53 +0000168 text.configure(background=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000169 elif which == 2:
Barry Warsaw7b281221999-04-27 15:56:53 +0000170 text.configure(selectforeground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000171 elif which == 3:
Barry Warsaw7b281221999-04-27 15:56:53 +0000172 text.configure(selectbackground=colorname)
Barry Warsaw3a476e91998-10-06 18:46:57 +0000173 elif which == 5:
Barry Warsaw7b281221999-04-27 15:56:53 +0000174 text.configure(insertbackground=colorname)
Barry Warsaw8a09e1c1998-10-20 20:45:46 +0000175
176 def save_options(self, optiondb):
177 optiondb['TRACKP'] = self.__trackp.get()
178 optiondb['WHICH'] = self.__which.get()
179 optiondb['TEXT'] = self.__text.get(0.0, 'end - 1c')
180 optiondb['TEXTSEL'] = self.__text.tag_ranges(SEL)[0:2]
181 optiondb['TEXTINS'] = self.__text.index(INSERT)
182 optiondb['TEXTFG'] = self.__text['foreground']
183 optiondb['TEXTBG'] = self.__text['background']
184 optiondb['TEXT_SFG'] = self.__text['selectforeground']
185 optiondb['TEXT_SBG'] = self.__text['selectbackground']
186 optiondb['TEXT_IBG'] = self.__text['insertbackground']