mirror of https://github.com/python/cpython
bpo-33768: IDLE: Clicking on code context line moves it to top of editor (GH-7411)
This commit is contained in:
parent
4aa3006619
commit
041272b657
|
@ -117,6 +117,7 @@ class CodeContext:
|
||||||
height=1,
|
height=1,
|
||||||
width=1, # Don't request more than we get.
|
width=1, # Don't request more than we get.
|
||||||
padx=padx, border=border, relief=SUNKEN, state='disabled')
|
padx=padx, border=border, relief=SUNKEN, state='disabled')
|
||||||
|
self.context.bind('<ButtonRelease-1>', self.jumptoline)
|
||||||
# Pack the context widget before and above the text_frame widget,
|
# Pack the context widget before and above the text_frame widget,
|
||||||
# thus ensuring that it will appear directly above text_frame.
|
# thus ensuring that it will appear directly above text_frame.
|
||||||
self.context.pack(side=TOP, fill=X, expand=False,
|
self.context.pack(side=TOP, fill=X, expand=False,
|
||||||
|
@ -196,6 +197,20 @@ class CodeContext:
|
||||||
self.context.insert('end', '\n'.join(context_strings[showfirst:]))
|
self.context.insert('end', '\n'.join(context_strings[showfirst:]))
|
||||||
self.context['state'] = 'disabled'
|
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()
|
||||||
|
|
||||||
def timer_event(self):
|
def timer_event(self):
|
||||||
"Event on editor text widget triggered every UPDATEINTERVAL ms."
|
"Event on editor text widget triggered every UPDATEINTERVAL ms."
|
||||||
if self.context:
|
if self.context:
|
||||||
|
|
|
@ -72,6 +72,7 @@ class CodeContextTest(unittest.TestCase):
|
||||||
del cls.root
|
del cls.root
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
self.text.yview(0)
|
||||||
self.cc = codecontext.CodeContext(self.editor)
|
self.cc = codecontext.CodeContext(self.editor)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -264,6 +265,39 @@ class CodeContextTest(unittest.TestCase):
|
||||||
# context_depth is 1.
|
# context_depth is 1.
|
||||||
eq(cc.context.get('1.0', 'end-1c'), ' def __init__(self, a, b):')
|
eq(cc.context.get('1.0', 'end-1c'), ' def __init__(self, a, b):')
|
||||||
|
|
||||||
|
def test_jumptoline(self):
|
||||||
|
eq = self.assertEqual
|
||||||
|
cc = self.cc
|
||||||
|
jump = cc.jumptoline
|
||||||
|
|
||||||
|
if not cc.context:
|
||||||
|
cc.toggle_code_context_event()
|
||||||
|
|
||||||
|
# Empty context.
|
||||||
|
cc.text.yview(f'{2}.0')
|
||||||
|
cc.update_code_context()
|
||||||
|
eq(cc.topvisible, 2)
|
||||||
|
cc.context.mark_set('insert', '1.5')
|
||||||
|
jump()
|
||||||
|
eq(cc.topvisible, 1)
|
||||||
|
|
||||||
|
# 4 lines of context showing.
|
||||||
|
cc.text.yview(f'{12}.0')
|
||||||
|
cc.update_code_context()
|
||||||
|
eq(cc.topvisible, 12)
|
||||||
|
cc.context.mark_set('insert', '3.0')
|
||||||
|
jump()
|
||||||
|
eq(cc.topvisible, 8)
|
||||||
|
|
||||||
|
# More context lines than limit.
|
||||||
|
cc.context_depth = 2
|
||||||
|
cc.text.yview(f'{12}.0')
|
||||||
|
cc.update_code_context()
|
||||||
|
eq(cc.topvisible, 12)
|
||||||
|
cc.context.mark_set('insert', '1.0')
|
||||||
|
jump()
|
||||||
|
eq(cc.topvisible, 8)
|
||||||
|
|
||||||
@mock.patch.object(codecontext.CodeContext, 'update_code_context')
|
@mock.patch.object(codecontext.CodeContext, 'update_code_context')
|
||||||
def test_timer_event(self, mock_update):
|
def test_timer_event(self, mock_update):
|
||||||
# Ensure code context is not active.
|
# Ensure code context is not active.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Clicking on a context line moves that line to the top of the editor window.
|
Loading…
Reference in New Issue