Skip to content

Commit 77e97ca

Browse files
authored
bpo-30993: IDLE - Improve configdialog font page and tests. (#2831)
In configdialog: Document causal pathways in create_font_tab docstring. Simplify some attribute names. Move set_samples calls to var_changed_font (idea from Cheryl Sabella). Move related functions to positions after the create widgets function. In test_configdialog: Fix test_font_set so not order dependent. Fix renamed test_indent_scale so it tests the widget. Adjust tests for movement of set_samples call. Add tests for load functions. Put all font tests in one class and tab indent tests in another. Except for two lines, these tests completely cover the related functions.
1 parent 26248ef commit 77e97ca

File tree

3 files changed

+216
-201
lines changed

3 files changed

+216
-201
lines changed

‎Lib/idlelib/configdialog.py‎

Lines changed: 105 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ def create_action_buttons(self):
150150
buttons.pack(side=BOTTOM)
151151
return outer
152152

153+
153154
def create_page_font_tab(self):
154155
"""Return frame of widgets for Font/Tabs tab.
155156
@@ -159,29 +160,26 @@ def create_page_font_tab(self):
159160
corresponding aspect of the font sample on this page and
160161
highlight sample on highlight page.
161162
163+
Load_font_cfg initializes font vars and widgets from
164+
idleConf entries and tk.
165+
162166
Fontlist: mouse button 1 click or up or down key invoke
163-
on_fontlist_select(), which sets Var font_name and calls
164-
set_samples.
167+
on_fontlist_select(), which sets var font_name.
165168
166169
Sizelist: clicking the menubutton opens the dropdown menu. A
167-
mouse button 1 click or return key invokes an internal command
168-
which sets Var font_size and calls set_samples.
170+
mouse button 1 click or return key sets var font_size.
169171
170-
Bold_toggle, clicking the box toggles font_bold and calls
171-
set_samples.
172+
Bold_toggle: clicking the box toggles var font_bold.
172173
173-
Setting any of the font vars invokes var_changed_font, which
174-
adds all 3 font options to changes. Set_samples applies a new
175-
font constructed from the font vars to font_sample and
176-
highlight_sample on the hightlight page.
174+
Changing any of the font vars invokes var_changed_font, which
175+
adds all 3 font options to changes and calls set_samples.
176+
Set_samples applies a new font constructed from the font vars to
177+
font_sample and to highlight_sample on the hightlight page.
177178
178179
Tabs: Enable users to change spaces entered for indent tabs.
179180
Changing indent_scale value with the mouse sets Var space_num,
180181
which invokes var_changed_space_num, which adds an entry to
181-
changes.
182-
183-
Load_font_cfg and load_tab_cfg initialize vars and widgets from
184-
idleConf entries.
182+
changes. Load_tab_cfg initializes space_num to default.
185183
186184
Widget Structure: (*) widgets bound to self
187185
frame (of tab_pages)
@@ -227,11 +225,10 @@ def create_page_font_tab(self):
227225
scroll_font.config(command=self.fontlist.yview)
228226
self.fontlist.config(yscrollcommand=scroll_font.set)
229227
font_size_title = Label(frame_font_param, text='Size :')
230-
self.sizelist = DynOptionMenu(frame_font_param, self.font_size,
231-
None, command=self.set_samples)
228+
self.sizelist = DynOptionMenu(frame_font_param, self.font_size, None)
232229
self.bold_toggle = Checkbutton(
233-
frame_font_param, variable=self.font_bold, onvalue=1,
234-
offvalue=0, text='Bold', command=self.set_samples)
230+
frame_font_param, variable=self.font_bold,
231+
onvalue=1, offvalue=0, text='Bold')
235232
frame_font_sample = Frame(frame_font, relief=SOLID, borderwidth=1)
236233
temp_font = tkFont.Font(parent, ('courier', 10, 'normal'))
237234
self.font_sample = Label(
@@ -267,6 +264,96 @@ def create_page_font_tab(self):
267264

268265
return frame
269266

267+
def load_font_cfg(self):
268+
"""Load current configuration settings for the font options.
269+
270+
Retrieve current font with idleConf.GetFont and font families
271+
from tk. Setup fontlist and set font_name. Setup sizelist,
272+
which sets font_size. Set font_bold. Setting font variables
273+
calls set_samples (thrice).
274+
"""
275+
configured_font = idleConf.GetFont(self, 'main', 'EditorWindow')
276+
font_name = configured_font[0].lower()
277+
font_size = configured_font[1]
278+
font_bold = configured_font[2]=='bold'
279+
280+
# Set editor font selection list and font_name.
281+
fonts = list(tkFont.families(self))
282+
fonts.sort()
283+
for font in fonts:
284+
self.fontlist.insert(END, font)
285+
self.font_name.set(font_name)
286+
lc_fonts = [s.lower() for s in fonts]
287+
try:
288+
current_font_index = lc_fonts.index(font_name)
289+
self.fontlist.see(current_font_index)
290+
self.fontlist.select_set(current_font_index)
291+
self.fontlist.select_anchor(current_font_index)
292+
self.fontlist.activate(current_font_index)
293+
except ValueError:
294+
pass
295+
# Set font size dropdown.
296+
self.sizelist.SetMenu(('7', '8', '9', '10', '11', '12', '13', '14',
297+
'16', '18', '20', '22', '25', '29', '34', '40'),
298+
font_size)
299+
# Set font weight.
300+
self.font_bold.set(font_bold)
301+
302+
def on_fontlist_select(self, event):
303+
"""Handle selecting a font from the list.
304+
305+
Event can result from either mouse click or Up or Down key.
306+
Set font_name and example displays to selection.
307+
"""
308+
font = self.fontlist.get(
309+
ACTIVE if event.type.name == 'KeyRelease' else ANCHOR)
310+
self.font_name.set(font.lower())
311+
312+
def var_changed_font(self, *params):
313+
"""Store changes to font attributes.
314+
315+
When one font attribute changes, save them all, as they are
316+
not independent from each other. In particular, when we are
317+
overriding the default font, we need to write out everything.
318+
"""
319+
value = self.font_name.get()
320+
changes.add_option('main', 'EditorWindow', 'font', value)
321+
value = self.font_size.get()
322+
changes.add_option('main', 'EditorWindow', 'font-size', value)
323+
value = self.font_bold.get()
324+
changes.add_option('main', 'EditorWindow', 'font-bold', value)
325+
self.set_samples()
326+
327+
def set_samples(self, event=None):
328+
"""Update update both screen samples with the font settings.
329+
330+
Called on font initialization and change events.
331+
Accesses font_name, font_size, and font_bold Variables.
332+
Updates font_sample and hightlight page highlight_sample.
333+
"""
334+
font_name = self.font_name.get()
335+
font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL
336+
new_font = (font_name, self.font_size.get(), font_weight)
337+
self.font_sample['font'] = new_font
338+
self.highlight_sample['font'] = new_font
339+
340+
def load_tab_cfg(self):
341+
"""Load current configuration settings for the tab options.
342+
343+
Attributes updated:
344+
space_num: Set to value from idleConf.
345+
"""
346+
# Set indent sizes.
347+
space_num = idleConf.GetOption(
348+
'main', 'Indent', 'num-spaces', default=4, type='int')
349+
self.space_num.set(space_num)
350+
351+
def var_changed_space_num(self, *params):
352+
"Store change to indentation size."
353+
value = self.space_num.get()
354+
changes.add_option('main', 'Indent', 'num-spaces', value)
355+
356+
270357
def create_page_highlight(self):
271358
"""Return frame of widgets for Highlighting tab.
272359
@@ -729,25 +816,6 @@ def remove_var_callbacks(self):
729816
self.startup_edit, self.autosave,):
730817
var.trace_remove('write', var.trace_info()[0][1])
731818

732-
def var_changed_font(self, *params):
733-
"""Store changes to font attributes.
734-
735-
When one font attribute changes, save them all, as they are
736-
not independent from each other. In particular, when we are
737-
overriding the default font, we need to write out everything.
738-
"""
739-
value = self.font_name.get()
740-
changes.add_option('main', 'EditorWindow', 'font', value)
741-
value = self.font_size.get()
742-
changes.add_option('main', 'EditorWindow', 'font-size', value)
743-
value = self.font_bold.get()
744-
changes.add_option('main', 'EditorWindow', 'font-bold', value)
745-
746-
def var_changed_space_num(self, *params):
747-
"Store change to indentation size."
748-
value = self.space_num.get()
749-
changes.add_option('main', 'Indent', 'num-spaces', value)
750-
751819
def var_changed_color(self, *params):
752820
"Process change to color choice."
753821
self.on_new_color_set()
@@ -1216,30 +1284,6 @@ def create_new_theme(self, new_theme_name):
12161284
self.is_builtin_theme.set(0)
12171285
self.set_theme_type()
12181286

1219-
def on_fontlist_select(self, event):
1220-
"""Handle selecting a font from the list.
1221-
1222-
Event can result from either mouse click or Up or Down key.
1223-
Set font_name and example displays to selection.
1224-
"""
1225-
font = self.fontlist.get(
1226-
ACTIVE if event.type.name == 'KeyRelease' else ANCHOR)
1227-
self.font_name.set(font.lower())
1228-
self.set_samples()
1229-
1230-
def set_samples(self, event=None):
1231-
"""Update update both screen samples with the font settings.
1232-
1233-
Called on font initialization and change events.
1234-
Accesses font_name, font_size, and font_bold Variables.
1235-
Updates font_sample and hightlight page highlight_sample.
1236-
"""
1237-
font_name = self.font_name.get()
1238-
font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL
1239-
new_font = (font_name, self.font_size.get(), font_weight)
1240-
self.font_sample['font'] = new_font
1241-
self.highlight_sample['font'] = new_font
1242-
12431287
def set_highlight_target(self):
12441288
"""Set fg/bg toggle and color based on highlight tag target.
12451289
@@ -1404,61 +1448,6 @@ def update_user_help_changed_items(self):
14041448
'main', 'HelpFiles', str(num),
14051449
';'.join(self.user_helplist[num-1][:2]))
14061450

1407-
def load_font_cfg(self):
1408-
"""Load current configuration settings for the font options.
1409-
1410-
Retrieve current font values from idleConf.GetFont to set
1411-
as initial values for font widgets.
1412-
1413-
Attributes updated:
1414-
fontlist: Populate with fonts from tkinter.font.
1415-
font_name: Set to current font.
1416-
sizelist: Populate valid options tuple and set
1417-
to current size.
1418-
font_bold: Set to current font weight.
1419-
1420-
Methods:
1421-
set_samples
1422-
"""
1423-
# Set base editor font selection list.
1424-
fonts = list(tkFont.families(self))
1425-
fonts.sort()
1426-
for font in fonts:
1427-
self.fontlist.insert(END, font)
1428-
configured_font = idleConf.GetFont(self, 'main', 'EditorWindow')
1429-
font_name = configured_font[0].lower()
1430-
font_size = configured_font[1]
1431-
font_bold = configured_font[2]=='bold'
1432-
self.font_name.set(font_name)
1433-
lc_fonts = [s.lower() for s in fonts]
1434-
try:
1435-
current_font_index = lc_fonts.index(font_name)
1436-
self.fontlist.see(current_font_index)
1437-
self.fontlist.select_set(current_font_index)
1438-
self.fontlist.select_anchor(current_font_index)
1439-
self.fontlist.activate(current_font_index)
1440-
except ValueError:
1441-
pass
1442-
# Set font size dropdown.
1443-
self.sizelist.SetMenu(('7', '8', '9', '10', '11', '12', '13', '14',
1444-
'16', '18', '20', '22', '25', '29', '34', '40'),
1445-
font_size)
1446-
# Set font weight.
1447-
self.font_bold.set(font_bold)
1448-
# Set font sample.
1449-
self.set_samples()
1450-
1451-
def load_tab_cfg(self):
1452-
"""Load current configuration settings for the tab options.
1453-
1454-
Attributes updated:
1455-
space_num: Set to value from idleConf.
1456-
"""
1457-
# Set indent sizes.
1458-
space_num = idleConf.GetOption(
1459-
'main', 'Indent', 'num-spaces', default=4, type='int')
1460-
self.space_num.set(space_num)
1461-
14621451
def load_theme_cfg(self):
14631452
"""Load current configuration settings for the theme options.
14641453

0 commit comments

Comments
 (0)