From 04864b491e3ce0f022e918ad344fb53a99ce2a1b Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 22 Jul 2017 00:56:18 -0400 Subject: [PATCH] =?utf8?q?[3.6]=20bpo-30981:=20IDLE=20--=20Add=20more=20co?= =?utf8?q?nfigdialog=20font=20page=20tests.=20=20(GH-=E2=80=A6=20(#2796)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. --- Lib/idlelib/configdialog.py | 83 +++++++++---------- Lib/idlelib/idle_test/test_configdialog.py | 57 ++++++++----- .../2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst | 1 + 3 files changed, 76 insertions(+), 65 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index e1c3923cae..c1db76817c 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('', lambda e: 'break') text.bind('', 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 4f1f9af180..171fa3d309 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): diff --git a/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst b/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst new file mode 100644 index 0000000000..48d477ed2e --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2017-07-21-01-55-14.bpo-30981.ZFvQPt.rst @@ -0,0 +1 @@ +IDLE -- Add more configdialog font page tests. -- 2.40.0