summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2017-07-22 04:56:18 (GMT)
committerGitHub <noreply@github.com>2017-07-22 04:56:18 (GMT)
commit04864b491e3ce0f022e918ad344fb53a99ce2a1b (patch)
tree12c6d83f27ced36b347a24c39418de5df8c397f2 /Lib
parent64b9a15886840df422c5203fad25c9801b4cf61e (diff)
downloadcpython-04864b491e3ce0f022e918ad344fb53a99ce2a1b.zip
cpython-04864b491e3ce0f022e918ad344fb53a99ce2a1b.tar.gz
cpython-04864b491e3ce0f022e918ad344fb53a99ce2a1b.tar.bz2
[3.6] bpo-30981: IDLE -- Add more configdialog font page tests. (GH-… (#2796)
Verify that clicking the bold checkbutton and calling its command, set_samples, changes the bold setting of both samples. Simplify some names in configdialog. (cherry picked from commit d0969d6) (Incorporates changes and fixes from PRs 2798, 7c5798e, and 2810, 616ecf1) * Fix broken test with PR2798 and PR2810 changes.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/idlelib/configdialog.py83
-rw-r--r--Lib/idlelib/idle_test/test_configdialog.py57
2 files changed, 75 insertions, 65 deletions
diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
index e1c3923..c1db768 100644
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -153,22 +153,29 @@ class ConfigDialog(Toplevel):
def create_page_font_tab(self):
"""Return frame of widgets for Font/Tabs tab.
+ Enable users to provisionally change font face, size, or
+ boldness and to see the consequence of proposed choices. Each
+ action set 3 options in changes structuree and changes the
+ corresponding aspect of the font sample on this page and
+ highlight sample on highlight page.
+
+ Enable users to change spaces entered for indent tabs.
+
Tk Variables:
+ font_name: Font face.
font_size: Font size.
font_bold: Select font bold or not.
- font_name: Font face.
Note: these 3 share var_changed_font callback.
space_num: Indentation width.
Data Attribute:
- edit_font: Font widget with default font name, size, and weight.
+ edit_font: Font with default font name, size, and weight.
Methods:
load_font_cfg: Set vars and fontlist.
on_fontlist_select: Bound to fontlist button release
or key release.
- set_font_sample: Command for opt_menu_font_size and
- check_font_bold.
+ set_samples: Notify both samples of any font change.
load_tab_cfg: Get current.
Widget Structure: (*) widgets bound to self
@@ -181,7 +188,7 @@ class ConfigDialog(Toplevel):
frame_font_param: Frame
font_size_title: Label
(*)opt_menu_font_size: DynOptionMenu - font_size
- check_font_bold: Checkbutton - font_bold
+ (*)bold_toggle: Checkbutton - font_bold
frame_font_sample: Frame
(*)font_sample: Label
frame_indent: LabelFrame
@@ -190,9 +197,9 @@ class ConfigDialog(Toplevel):
(*)scale_indent_size: Scale - space_num
"""
parent = self.parent
+ self.font_name = StringVar(parent)
self.font_size = StringVar(parent)
self.font_bold = BooleanVar(parent)
- self.font_name = StringVar(parent)
self.space_num = IntVar(parent)
self.edit_font = tkFont.Font(parent, ('courier', 10, 'normal'))
@@ -218,10 +225,10 @@ class ConfigDialog(Toplevel):
self.fontlist.config(yscrollcommand=scroll_font.set)
font_size_title = Label(frame_font_param, text='Size :')
self.opt_menu_font_size = DynOptionMenu(
- frame_font_param, self.font_size, None, command=self.set_font_sample)
- check_font_bold = Checkbutton(
+ frame_font_param, self.font_size, None, command=self.set_samples)
+ self.bold_toggle = Checkbutton(
frame_font_param, variable=self.font_bold, onvalue=1,
- offvalue=0, text='Bold', command=self.set_font_sample)
+ offvalue=0, text='Bold', command=self.set_samples)
frame_font_sample = Frame(frame_font, relief=SOLID, borderwidth=1)
self.font_sample = Label(
frame_font_sample, justify=LEFT, font=self.edit_font,
@@ -247,7 +254,7 @@ class ConfigDialog(Toplevel):
scroll_font.pack(side=LEFT, fill=Y)
font_size_title.pack(side=LEFT, anchor=W)
self.opt_menu_font_size.pack(side=LEFT, anchor=W)
- check_font_bold.pack(side=LEFT, anchor=W, padx=20)
+ self.bold_toggle.pack(side=LEFT, anchor=W, padx=20)
frame_font_sample.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
self.font_sample.pack(expand=TRUE, fill=BOTH)
# frame_indent
@@ -292,7 +299,7 @@ class ConfigDialog(Toplevel):
Widget Structure: (*) widgets bound to self
frame
frame_custom: LabelFrame
- (*)text_highlight_sample: Text
+ (*)highlight_sample: Text
(*)frame_color_set: Frame
button_set_color: Button
(*)opt_menu_highlight_target: DynOptionMenu - highlight_target
@@ -342,11 +349,11 @@ class ConfigDialog(Toplevel):
frame_theme = LabelFrame(frame, borderwidth=2, relief=GROOVE,
text=' Highlighting Theme ')
#frame_custom
- self.text_highlight_sample=Text(
+ self.highlight_sample=Text(
frame_custom, relief=SOLID, borderwidth=1,
font=('courier', 12, ''), cursor='hand2', width=21, height=11,
takefocus=FALSE, highlightthickness=0, wrap=NONE)
- text=self.text_highlight_sample
+ text=self.highlight_sample
text.bind('<Double-Button-1>', lambda e: 'break')
text.bind('<B1-Motion>', lambda e: 'break')
text_and_tags=(
@@ -416,7 +423,7 @@ class ConfigDialog(Toplevel):
#frame_custom
self.frame_color_set.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=X)
frame_fg_bg_toggle.pack(side=TOP, padx=5, pady=0)
- self.text_highlight_sample.pack(
+ self.highlight_sample.pack(
side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
button_set_color.pack(side=TOP, expand=TRUE, fill=X, padx=8, pady=4)
self.opt_menu_highlight_target.pack(
@@ -1142,7 +1149,7 @@ class ConfigDialog(Toplevel):
self.frame_color_set.config(bg=new_color) # Set sample.
plane ='foreground' if self.fg_bg_toggle.get() else 'background'
sample_element = self.theme_elements[self.highlight_target.get()][0]
- self.text_highlight_sample.tag_config(sample_element, **{plane:new_color})
+ self.highlight_sample.tag_config(sample_element, **{plane:new_color})
theme = self.custom_theme.get()
theme_element = sample_element + '-' + plane
changes.add_option('highlight', theme, theme_element, new_color)
@@ -1210,41 +1217,25 @@ class ConfigDialog(Toplevel):
"""Handle selecting a font from the list.
Event can result from either mouse click or Up or Down key.
- Set font_name and example display to selection.
-
- Attributes updated:
- font_name: Set to name selected from fontlist.
-
- Methods:
- set_font_sample
+ Set font_name and example displays to selection.
"""
font = self.fontlist.get(
ACTIVE if event.type.name == 'KeyRelease' else ANCHOR)
self.font_name.set(font.lower())
- self.set_font_sample()
-
- def set_font_sample(self, event=None):
- """Update the screen samples with the font settings from the dialog.
-
- Attributes accessed:
- font_name
- font_bold
- font_size
+ self.set_samples()
- Attributes updated:
- font_sample: Set to selected font name, size, and weight.
- text_highlight_sample: Set to selected font name, size, and weight.
+ def set_samples(self, event=None):
+ """Update update both screen samples with the font settings.
- Called from:
- handler for opt_menu_font_size and check_font_bold
- on_fontlist_select
- load_font_cfg
+ Called on font initialization and change events.
+ Accesses font_name, font_size, and font_bold Variables.
+ Updates font_sample and hightlight page highlight_sample.
"""
font_name = self.font_name.get()
font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL
new_font = (font_name, self.font_size.get(), font_weight)
- self.font_sample.config(font=new_font)
- self.text_highlight_sample.configure(font=new_font)
+ self.font_sample['font'] = new_font
+ self.highlight_sample['font'] = new_font
def set_highlight_target(self):
"""Set fg/bg toggle and color based on highlight tag target.
@@ -1289,7 +1280,7 @@ class ConfigDialog(Toplevel):
theme_elements
highlight_target
fg_bg_toggle
- text_highlight_sample
+ highlight_sample
Attributes updated:
frame_color_set
@@ -1297,7 +1288,7 @@ class ConfigDialog(Toplevel):
# Set the color sample area.
tag = self.theme_elements[self.highlight_target.get()][0]
plane = 'foreground' if self.fg_bg_toggle.get() else 'background'
- color = self.text_highlight_sample.tag_cget(tag, plane)
+ color = self.highlight_sample.tag_cget(tag, plane)
self.frame_color_set.config(bg=color)
def paint_theme_sample(self):
@@ -1310,7 +1301,7 @@ class ConfigDialog(Toplevel):
custom_theme
Attributes updated:
- text_highlight_sample: Set the tag elements to the theme.
+ highlight_sample: Set the tag elements to the theme.
Methods:
set_color_sample
@@ -1337,7 +1328,7 @@ class ConfigDialog(Toplevel):
colors['foreground'] = theme_dict[element + '-foreground']
if element + '-background' in theme_dict:
colors['background'] = theme_dict[element + '-background']
- self.text_highlight_sample.tag_config(element, **colors)
+ self.highlight_sample.tag_config(element, **colors)
self.set_color_sample()
def help_source_selected(self, event):
@@ -1424,7 +1415,7 @@ class ConfigDialog(Toplevel):
font_bold: Set to current font weight.
Methods:
- set_font_sample
+ set_samples
"""
# Set base editor font selection list.
fonts = list(tkFont.families(self))
@@ -1452,7 +1443,7 @@ class ConfigDialog(Toplevel):
# Set font weight.
self.font_bold.set(font_bold)
# Set font sample.
- self.set_font_sample()
+ self.set_samples()
def load_tab_cfg(self):
"""Load current configuration settings for the tab options.
diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py
index 4f1f9af..171fa3d 100644
--- a/Lib/idlelib/idle_test/test_configdialog.py
+++ b/Lib/idlelib/idle_test/test_configdialog.py
@@ -28,18 +28,12 @@ mainpage = changes['main']
highpage = changes['highlight']
keyspage = changes['keys']
-
-class TestDialog(ConfigDialog):
- pass # Delete?
-
-
def setUpModule():
global root, dialog
idleConf.userCfg = testcfg
root = Tk()
# root.withdraw() # Comment out, see issue 30870
- dialog = TestDialog(root, 'Test', _utest=True)
-
+ dialog = ConfigDialog(root, 'Test', _utest=True)
def tearDownModule():
global root, dialog
@@ -52,12 +46,16 @@ def tearDownModule():
class FontTabTest(unittest.TestCase):
+ "Test that font widget enable users to make font changes."
+
def setUp(self):
changes.clear()
- def test_font(self):
- # Set values guaranteed not to be defaults.
+ def test_font_set(self):
+ # Test that setting a font Variable results in 3 provisional
+ # change entries. Use values sure to not be defaults.
+ # Other font tests verify that user actions set Variables.
default_font = idleConf.GetFont(root, 'main', 'EditorWindow')
default_size = str(default_font[1])
default_bold = default_font[2] == 'bold'
@@ -79,9 +77,30 @@ class FontTabTest(unittest.TestCase):
'font-bold': str(not default_bold)}}
self.assertEqual(mainpage, expected)
- def test_set_sample(self):
- # Set_font_sample also sets highlight_sample.
- pass
+ def test_set_samples_bold_toggle(self):
+ # Set up.
+ d = dialog
+ d.font_sample, d.highlight_sample = {}, {} # Must undo this.
+ d.font_name.set('test')
+ d.font_size.set('5')
+ d.font_bold.set(1)
+ expected0 = {'font': ('test', '5', 'normal')}
+ expected1 = {'font': ('test', '5', 'bold')}
+
+ # Test set_samples.
+ d.set_samples()
+ self.assertTrue(d.font_sample == d.highlight_sample == expected1)
+
+ # Test bold_toggle.
+ d.bold_toggle.invoke()
+ self.assertFalse(d.font_bold.get())
+ self.assertTrue(d.font_sample == d.highlight_sample == expected0)
+ d.bold_toggle.invoke()
+ self.assertTrue(d.font_bold.get())
+ self.assertTrue(d.font_sample == d.highlight_sample == expected1)
+
+ # Clean up.
+ del d.font_sample, d.highlight_sample
def test_tabspace(self):
dialog.space_num.set(6)
@@ -90,7 +109,7 @@ class FontTabTest(unittest.TestCase):
class FontSelectTest(unittest.TestCase):
# These two functions test that selecting a new font in the
- # list of fonts changes font_name and calls set_font_sample.
+ # list of fonts changes font_name and calls set_samples.
# The fontlist widget and on_fontlist_select event handler
# are tested here together.
@@ -98,14 +117,14 @@ class FontSelectTest(unittest.TestCase):
def setUpClass(cls):
if dialog.fontlist.size() < 2:
cls.skipTest('need at least 2 fonts')
- dialog.set_font_sample = Func() # Mask instance method.
+ dialog.set_samples = Func() # Mask instance method.
@classmethod
def tearDownClass(cls):
- del dialog.set_font_sample # Unmask instance method.
+ del dialog.set_samples # Unmask instance method.
def setUp(self):
- dialog.set_font_sample.called = 0
+ dialog.set_samples.called = 0
changes.clear()
def test_select_font_key(self):
@@ -124,7 +143,7 @@ class FontSelectTest(unittest.TestCase):
down_font = fontlist.get('active')
self.assertNotEqual(down_font, font)
self.assertIn(dialog.font_name.get(), down_font.lower())
- self.assertEqual(dialog.set_font_sample.called, 1)
+ self.assertEqual(dialog.set_samples.called, 1)
# Test Up key.
fontlist.focus_force()
@@ -135,7 +154,7 @@ class FontSelectTest(unittest.TestCase):
up_font = fontlist.get('active')
self.assertEqual(up_font, font)
self.assertIn(dialog.font_name.get(), up_font.lower())
- self.assertEqual(dialog.set_font_sample.called, 2)
+ self.assertEqual(dialog.set_samples.called, 2)
def test_select_font_mouse(self):
# Click on item should select that item.
@@ -157,7 +176,7 @@ class FontSelectTest(unittest.TestCase):
select_font = fontlist.get('anchor')
self.assertEqual(select_font, font1)
self.assertIn(dialog.font_name.get(), font1.lower())
- self.assertEqual(dialog.set_font_sample.called, 1)
+ self.assertEqual(dialog.set_samples.called, 1)
class HighlightTest(unittest.TestCase):