[Python-checkins] bpo-39781: Do not jump when select in IDLE codecontext (GH-18683)
Miss Islington (bot)
webhook-mailer at python.org
Fri Feb 28 13:43:29 EST 2020
https://github.com/python/cpython/commit/846ca4961da24669e6e0c901986e66ff485917b2
commit: 846ca4961da24669e6e0c901986e66ff485917b2
branch: 3.8
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2020-02-28T10:43:25-08:00
summary:
bpo-39781: Do not jump when select in IDLE codecontext (GH-18683)
Previously, the button-up part of selecting with a mouse was treated as a click
that meant 'jump' to this line, which modified the context and undid the selection
(cherry picked from commit c705fd1e89ccb8f6d414ec817b4616546147d877)
Co-authored-by: Terry Jan Reedy <tjreedy at udel.edu>
files:
A Misc/NEWS.d/next/IDLE/2020-02-27-22-17-09.bpo-39781.bbYBeL.rst
M Lib/idlelib/NEWS.txt
M Lib/idlelib/codecontext.py
M Lib/idlelib/idle_test/test_codecontext.py
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index fe1706ed5a8be..134f843d85e8a 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -3,6 +3,8 @@ Released on 2019-12-16?
======================================
+bpo-39781: Selecting code context lines no longer causes a jump.
+
bpo-39663: Add tests for pyparse find_good_parse_start().
bpo-39600: Remove duplicate font names from configuration list.
diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py
index 4ce98136fe417..989b30e599465 100644
--- a/Lib/idlelib/codecontext.py
+++ b/Lib/idlelib/codecontext.py
@@ -7,7 +7,6 @@
enclosing block. The number of hint lines is determined by the maxlines
variable in the codecontext section of config-extensions.def. Lines which do
not open blocks are not shown in the context hints pane.
-
"""
import re
from sys import maxsize as INFINITY
@@ -17,8 +16,8 @@
from idlelib.config import idleConf
-BLOCKOPENERS = {"class", "def", "elif", "else", "except", "finally", "for",
- "if", "try", "while", "with", "async"}
+BLOCKOPENERS = {'class', 'def', 'if', 'elif', 'else', 'while', 'for',
+ 'try', 'except', 'finally', 'with', 'async'}
def get_spaces_firstword(codeline, c=re.compile(r"^(\s*)(\w*)")):
@@ -84,7 +83,7 @@ def __del__(self):
if self.t1 is not None:
try:
self.text.after_cancel(self.t1)
- except tkinter.TclError:
+ except tkinter.TclError: # pragma: no cover
pass
self.t1 = None
@@ -112,7 +111,7 @@ def toggle_code_context_event(self, event=None):
padx += widget.tk.getint(info['padx'])
padx += widget.tk.getint(widget.cget('padx'))
border += widget.tk.getint(widget.cget('border'))
- self.context = tkinter.Text(
+ context = self.context = tkinter.Text(
self.editwin.text_frame,
height=1,
width=1, # Don't request more than we get.
@@ -120,11 +119,11 @@ def toggle_code_context_event(self, event=None):
padx=padx, border=border, relief=SUNKEN, state='disabled')
self.update_font()
self.update_highlight_colors()
- self.context.bind('<ButtonRelease-1>', self.jumptoline)
+ context.bind('<ButtonRelease-1>', self.jumptoline)
# Get the current context and initiate the recurring update event.
self.timer_event()
# Grid the context widget above the text widget.
- self.context.grid(row=0, column=1, sticky=NSEW)
+ context.grid(row=0, column=1, sticky=NSEW)
line_number_colors = idleConf.GetHighlight(idleConf.CurrentTheme(),
'linenumber')
@@ -215,18 +214,25 @@ def update_code_context(self):
self.context['state'] = 'disabled'
def jumptoline(self, event=None):
- "Show clicked context line at top of editor."
- lines = len(self.info)
- if lines == 1: # No context lines are showing.
- newtop = 1
- else:
- # Line number clicked.
- contextline = int(float(self.context.index('insert')))
- # Lines not displayed due to maxlines.
- offset = max(1, lines - self.context_depth) - 1
- newtop = self.info[offset + contextline][0]
- self.text.yview(f'{newtop}.0')
- self.update_code_context()
+ """ Show clicked context line at top of editor.
+
+ If a selection was made, don't jump; allow copying.
+ If no visible context, show the top line of the file.
+ """
+ try:
+ self.context.index("sel.first")
+ except tkinter.TclError:
+ lines = len(self.info)
+ if lines == 1: # No context lines are showing.
+ newtop = 1
+ else:
+ # Line number clicked.
+ contextline = int(float(self.context.index('insert')))
+ # Lines not displayed due to maxlines.
+ offset = max(1, lines - self.context_depth) - 1
+ newtop = self.info[offset + contextline][0]
+ self.text.yview(f'{newtop}.0')
+ self.update_code_context()
def timer_event(self):
"Event on editor text widget triggered every UPDATEINTERVAL ms."
diff --git a/Lib/idlelib/idle_test/test_codecontext.py b/Lib/idlelib/idle_test/test_codecontext.py
index 3ec49e97af6f9..9578cc731a6f9 100644
--- a/Lib/idlelib/idle_test/test_codecontext.py
+++ b/Lib/idlelib/idle_test/test_codecontext.py
@@ -332,6 +332,14 @@ def test_jumptoline(self):
jump()
eq(cc.topvisible, 8)
+ # Context selection stops jump.
+ cc.text.yview('5.0')
+ cc.update_code_context()
+ cc.context.tag_add('sel', '1.0', '2.0')
+ cc.context.mark_set('insert', '1.0')
+ jump() # Without selection, to line 2.
+ eq(cc.topvisible, 5)
+
@mock.patch.object(codecontext.CodeContext, 'update_code_context')
def test_timer_event(self, mock_update):
# Ensure code context is not active.
diff --git a/Misc/NEWS.d/next/IDLE/2020-02-27-22-17-09.bpo-39781.bbYBeL.rst b/Misc/NEWS.d/next/IDLE/2020-02-27-22-17-09.bpo-39781.bbYBeL.rst
new file mode 100644
index 0000000000000..4ae0defc2e217
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2020-02-27-22-17-09.bpo-39781.bbYBeL.rst
@@ -0,0 +1 @@
+Selecting code context lines no longer causes a jump.
More information about the Python-checkins
mailing list