• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 """TextViewer class.
2 
3 The TextViewer allows you to see how the selected color would affect various
4 characteristics of a Tk text widget.  This is an output viewer only.
5 
6 In the top part of the window is a standard text widget with some sample text
7 in it.  You are free to edit this text in any way you want (BAW: allow you to
8 change font characteristics).  If you want changes in other viewers to update
9 text characteristics, turn on Track color changes.
10 
11 To select which characteristic tracks the change, select one of the radio
12 buttons in the window below.  Text foreground and background affect the text
13 in the window above.  The Selection is what you see when you click the middle
14 button and drag it through some text.  The Insertion is the insertion cursor
15 in the text window (which only has a background).
16 """
17 
18 from tkinter import *
19 import ColorDB
20 
21 ADDTOVIEW = 'Text Window...'
22 
23 
24 
25 class TextViewer:
26     def __init__(self, switchboard, master=None):
27         self.__sb = switchboard
28         optiondb = switchboard.optiondb()
29         root = self.__root = Toplevel(master, class_='Pynche')
30         root.protocol('WM_DELETE_WINDOW', self.withdraw)
31         root.title('Pynche Text Window')
32         root.iconname('Pynche Text Window')
33         root.bind('<Alt-q>', self.__quit)
34         root.bind('<Alt-Q>', self.__quit)
35         root.bind('<Alt-w>', self.withdraw)
36         root.bind('<Alt-W>', self.withdraw)
37         #
38         # create the text widget
39         #
40         self.__text = Text(root, relief=SUNKEN,
41                            background=optiondb.get('TEXTBG', 'black'),
42                            foreground=optiondb.get('TEXTFG', 'white'),
43                            width=35, height=15)
44         sfg = optiondb.get('TEXT_SFG')
45         if sfg:
46             self.__text.configure(selectforeground=sfg)
47         sbg = optiondb.get('TEXT_SBG')
48         if sbg:
49             self.__text.configure(selectbackground=sbg)
50         ibg = optiondb.get('TEXT_IBG')
51         if ibg:
52             self.__text.configure(insertbackground=ibg)
53         self.__text.pack()
54         self.__text.insert(0.0, optiondb.get('TEXT', '''\
55 Insert some stuff here and play
56 with the buttons below to see
57 how the colors interact in
58 textual displays.
59 
60 See how the selection can also
61 be affected by tickling the buttons
62 and choosing a color.'''))
63         insert = optiondb.get('TEXTINS')
64         if insert:
65             self.__text.mark_set(INSERT, insert)
66         try:
67             start, end = optiondb.get('TEXTSEL', (6.0, END))
68             self.__text.tag_add(SEL, start, end)
69         except ValueError:
70             # selection wasn't set
71             pass
72         self.__text.focus_set()
73         #
74         # variables
75         self.__trackp = BooleanVar()
76         self.__trackp.set(optiondb.get('TRACKP', 0))
77         self.__which = IntVar()
78         self.__which.set(optiondb.get('WHICH', 0))
79         #
80         # track toggle
81         self.__t = Checkbutton(root, text='Track color changes',
82                                variable=self.__trackp,
83                                relief=GROOVE,
84                                command=self.__toggletrack)
85         self.__t.pack(fill=X, expand=YES)
86         frame = self.__frame = Frame(root)
87         frame.pack()
88         #
89         # labels
90         self.__labels = []
91         row = 2
92         for text in ('Text:', 'Selection:', 'Insertion:'):
93             l = Label(frame, text=text)
94             l.grid(row=row, column=0, sticky=E)
95             self.__labels.append(l)
96             row += 1
97         col = 1
98         for text in ('Foreground', 'Background'):
99             l = Label(frame, text=text)
100             l.grid(row=1, column=col)
101             self.__labels.append(l)
102             col += 1
103         #
104         # radios
105         self.__radios = []
106         for col in (1, 2):
107             for row in (2, 3, 4):
108                 # there is no insertforeground option
109                 if row==4 and col==1:
110                     continue
111                 r = Radiobutton(frame, variable=self.__which,
112                                 value=(row-2)*2 + col-1,
113                                 command=self.__set_color)
114                 r.grid(row=row, column=col)
115                 self.__radios.append(r)
116         self.__toggletrack()
117 
118     def __quit(self, event=None):
119         self.__root.quit()
120 
121     def withdraw(self, event=None):
122         self.__root.withdraw()
123 
124     def deiconify(self, event=None):
125         self.__root.deiconify()
126 
127     def __forceupdate(self, event=None):
128         self.__sb.update_views_current()
129 
130     def __toggletrack(self, event=None):
131         if self.__trackp.get():
132             state = NORMAL
133             fg = self.__radios[0]['foreground']
134         else:
135             state = DISABLED
136             fg = self.__radios[0]['disabledforeground']
137         for r in self.__radios:
138             r.configure(state=state)
139         for l in self.__labels:
140             l.configure(foreground=fg)
141 
142     def __set_color(self, event=None):
143         which = self.__which.get()
144         text = self.__text
145         if which == 0:
146             color = text['foreground']
147         elif which == 1:
148             color = text['background']
149         elif which == 2:
150             color = text['selectforeground']
151         elif which == 3:
152             color = text['selectbackground']
153         elif which == 5:
154             color = text['insertbackground']
155         try:
156             red, green, blue = ColorDB.rrggbb_to_triplet(color)
157         except ColorDB.BadColor:
158             # must have been a color name
159             red, green, blue = self.__sb.colordb().find_byname(color)
160         self.__sb.update_views(red, green, blue)
161 
162     def update_yourself(self, red, green, blue):
163         if self.__trackp.get():
164             colorname = ColorDB.triplet_to_rrggbb((red, green, blue))
165             which = self.__which.get()
166             text = self.__text
167             if which == 0:
168                 text.configure(foreground=colorname)
169             elif which == 1:
170                 text.configure(background=colorname)
171             elif which == 2:
172                 text.configure(selectforeground=colorname)
173             elif which == 3:
174                 text.configure(selectbackground=colorname)
175             elif which == 5:
176                 text.configure(insertbackground=colorname)
177 
178     def save_options(self, optiondb):
179         optiondb['TRACKP'] = self.__trackp.get()
180         optiondb['WHICH'] = self.__which.get()
181         optiondb['TEXT'] = self.__text.get(0.0, 'end - 1c')
182         optiondb['TEXTSEL'] = self.__text.tag_ranges(SEL)[0:2]
183         optiondb['TEXTINS'] = self.__text.index(INSERT)
184         optiondb['TEXTFG'] = self.__text['foreground']
185         optiondb['TEXTBG'] = self.__text['background']
186         optiondb['TEXT_SFG'] = self.__text['selectforeground']
187         optiondb['TEXT_SBG'] = self.__text['selectbackground']
188         optiondb['TEXT_IBG'] = self.__text['insertbackground']
189