diff options
author | Tal Einat <taleinat@gmail.com> | 2019-07-23 15:22:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-23 15:22:11 +0300 |
commit | 7123ea009b0b004062d91f69859bddf422c34ab4 (patch) | |
tree | 710e79beacd4853354ccb4a5d6333148914e54ec /Lib/idlelib/editor.py | |
parent | 1ebee37dde5c2aabc8e2d2c7bbe2a69b293133bb (diff) | |
download | cpython-git-7123ea009b0b004062d91f69859bddf422c34ab4.tar.gz |
bpo-17535: IDLE editor line numbers (GH-14030)
Diffstat (limited to 'Lib/idlelib/editor.py')
-rw-r--r-- | Lib/idlelib/editor.py | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 24b1ffc679..497ee12f18 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -53,6 +53,7 @@ class EditorWindow(object): from idlelib.autoexpand import AutoExpand from idlelib.calltip import Calltip from idlelib.codecontext import CodeContext + from idlelib.sidebar import LineNumbers from idlelib.format import FormatParagraph, FormatRegion, Indents, Rstrip from idlelib.parenmatch import ParenMatch from idlelib.squeezer import Squeezer @@ -61,7 +62,8 @@ class EditorWindow(object): filesystemencoding = sys.getfilesystemencoding() # for file names help_url = None - allow_codecontext = True + allow_code_context = True + allow_line_numbers = True def __init__(self, flist=None, filename=None, key=None, root=None): # Delay import: runscript imports pyshell imports EditorWindow. @@ -198,12 +200,14 @@ class EditorWindow(object): text.bind("<<open-turtle-demo>>", self.open_turtle_demo) self.set_status_bar() + text_frame.pack(side=LEFT, fill=BOTH, expand=1) + text_frame.rowconfigure(1, weight=1) + text_frame.columnconfigure(1, weight=1) vbar['command'] = self.handle_yview - vbar.pack(side=RIGHT, fill=Y) + vbar.grid(row=1, column=2, sticky=NSEW) text['yscrollcommand'] = vbar.set text['font'] = idleConf.GetFont(self.root, 'main', 'EditorWindow') - text_frame.pack(side=LEFT, fill=BOTH, expand=1) - text.pack(side=TOP, fill=BOTH, expand=1) + text.grid(row=1, column=1, sticky=NSEW) text.focus_set() # usetabs true -> literal tab characters are used by indent and @@ -250,7 +254,8 @@ class EditorWindow(object): self.good_load = False self.set_indentation_params(False) self.color = None # initialized below in self.ResetColorizer - self.codecontext = None + self.code_context = None # optionally initialized later below + self.line_numbers = None # optionally initialized later below if filename: if os.path.exists(filename) and not os.path.isdir(filename): if io.loadfile(filename): @@ -316,10 +321,20 @@ class EditorWindow(object): text.bind("<<refresh-calltip>>", ctip.refresh_calltip_event) text.bind("<<force-open-calltip>>", ctip.force_open_calltip_event) text.bind("<<zoom-height>>", self.ZoomHeight(self).zoom_height_event) - if self.allow_codecontext: - self.codecontext = self.CodeContext(self) + if self.allow_code_context: + self.code_context = self.CodeContext(self) text.bind("<<toggle-code-context>>", - self.codecontext.toggle_code_context_event) + self.code_context.toggle_code_context_event) + else: + self.update_menu_state('options', '*Code Context', 'disabled') + if self.allow_line_numbers: + self.line_numbers = self.LineNumbers(self) + if idleConf.GetOption('main', 'EditorWindow', + 'line-numbers-default', type='bool'): + self.toggle_line_numbers_event() + text.bind("<<toggle-line-numbers>>", self.toggle_line_numbers_event) + else: + self.update_menu_state('options', '*Line Numbers', 'disabled') def _filename_to_unicode(self, filename): """Return filename as BMP unicode so displayable in Tk.""" @@ -779,8 +794,11 @@ class EditorWindow(object): self._addcolorizer() EditorWindow.color_config(self.text) - if self.codecontext is not None: - self.codecontext.update_highlight_colors() + if self.code_context is not None: + self.code_context.update_highlight_colors() + + if self.line_numbers is not None: + self.line_numbers.update_colors() IDENTCHARS = string.ascii_letters + string.digits + "_" @@ -799,11 +817,16 @@ class EditorWindow(object): "Update the text widgets' font if it is changed" # Called from configdialog.py - new_font = idleConf.GetFont(self.root, 'main', 'EditorWindow') # Update the code context widget first, since its height affects # the height of the text widget. This avoids double re-rendering. - if self.codecontext is not None: - self.codecontext.update_font(new_font) + if self.code_context is not None: + self.code_context.update_font() + # Next, update the line numbers widget, since its width affects + # the width of the text widget. + if self.line_numbers is not None: + self.line_numbers.update_font() + # Finally, update the main text widget. + new_font = idleConf.GetFont(self.root, 'main', 'EditorWindow') self.text['font'] = new_font def RemoveKeybindings(self): @@ -1467,6 +1490,19 @@ class EditorWindow(object): indentsmall = indentlarge = 0 return indentlarge - indentsmall + def toggle_line_numbers_event(self, event=None): + if self.line_numbers is None: + return + + if self.line_numbers.is_shown: + self.line_numbers.hide_sidebar() + menu_label = "Show" + else: + self.line_numbers.show_sidebar() + menu_label = "Hide" + self.update_menu_label(menu='options', index='*Line Numbers', + label=f'{menu_label} Line Numbers') + # "line.col" -> line, as an int def index2line(index): return int(float(index)) |