bpo-33664: Scroll IDLE editor text by lines (GH-7351)

Previously, the mouse wheel and scrollbar slider moved text by a fixed
number of pixels, resulting in partial lines at the top of the editor
box. The change also applies to the shell and grep output windows,
but not to read-only text views.
(cherry picked from commit d49dbd9acc)

Co-authored-by: Cheryl Sabella <cheryl.sabella@gmail.com>
This commit is contained in:
Miss Islington (bot) 2018-06-04 09:05:24 -07:00 committed by GitHub
parent 1d3395f09b
commit cfc12ec68c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 2 deletions

View file

@ -30,6 +30,7 @@ from idlelib import windows
# The default tab setting for a Text widget, in average-width characters. # The default tab setting for a Text widget, in average-width characters.
TK_TABWIDTH_DEFAULT = 8 TK_TABWIDTH_DEFAULT = 8
_py_version = ' (%s)' % platform.python_version() _py_version = ' (%s)' % platform.python_version()
darwin = sys.platform == 'darwin'
def _sphinx_version(): def _sphinx_version():
"Format sys.version_info to produce the Sphinx version string used to install the chm docs" "Format sys.version_info to produce the Sphinx version string used to install the chm docs"
@ -49,7 +50,7 @@ class EditorWindow(object):
from idlelib.undo import UndoDelegator from idlelib.undo import UndoDelegator
from idlelib.iomenu import IOBinding, encoding from idlelib.iomenu import IOBinding, encoding
from idlelib import mainmenu from idlelib import mainmenu
from tkinter import Toplevel from tkinter import Toplevel, EventType
from idlelib.statusbar import MultiStatusBar from idlelib.statusbar import MultiStatusBar
from idlelib.autocomplete import AutoComplete from idlelib.autocomplete import AutoComplete
from idlelib.autoexpand import AutoExpand from idlelib.autoexpand import AutoExpand
@ -147,6 +148,9 @@ class EditorWindow(object):
else: else:
# Elsewhere, use right-click for popup menus. # Elsewhere, use right-click for popup menus.
text.bind("<3>",self.right_menu_event) text.bind("<3>",self.right_menu_event)
text.bind('<MouseWheel>', self.mousescroll)
text.bind('<Button-4>', self.mousescroll)
text.bind('<Button-5>', self.mousescroll)
text.bind("<<cut>>", self.cut) text.bind("<<cut>>", self.cut)
text.bind("<<copy>>", self.copy) text.bind("<<copy>>", self.copy)
text.bind("<<paste>>", self.paste) text.bind("<<paste>>", self.paste)
@ -193,7 +197,7 @@ class EditorWindow(object):
text.bind("<<open-turtle-demo>>", self.open_turtle_demo) text.bind("<<open-turtle-demo>>", self.open_turtle_demo)
self.set_status_bar() self.set_status_bar()
vbar['command'] = text.yview vbar['command'] = self.handle_yview
vbar.pack(side=RIGHT, fill=Y) vbar.pack(side=RIGHT, fill=Y)
text['yscrollcommand'] = vbar.set text['yscrollcommand'] = vbar.set
text['font'] = idleConf.GetFont(self.root, 'main', 'EditorWindow') text['font'] = idleConf.GetFont(self.root, 'main', 'EditorWindow')
@ -441,6 +445,27 @@ class EditorWindow(object):
menu.delete(self.wmenu_end+1, end) menu.delete(self.wmenu_end+1, end)
windows.add_windows_to_menu(menu) windows.add_windows_to_menu(menu)
def handle_yview(self, event, *args):
"Handle scrollbar."
if event == 'moveto':
fraction = float(args[0])
lines = (round(self.getlineno('end') * fraction) -
self.getlineno('@0,0'))
event = 'scroll'
args = (lines, 'units')
self.text.yview(event, *args)
return 'break'
def mousescroll(self, event):
"Handle scroll wheel."
up = {EventType.MouseWheel: event.delta >= 0 == darwin,
EventType.Button: event.num == 4}
lines = 5
if up[event.type]:
lines = -lines
self.text.yview_scroll(lines, 'units')
return 'break'
rmenu = None rmenu = None
def right_menu_event(self, event): def right_menu_event(self, event):

View file

@ -0,0 +1,5 @@
Scroll IDLE editor text by lines.
Previously, the mouse wheel and scrollbar slider moved text by a fixed
number of pixels, resulting in partial lines at the top of the editor
box. The change also applies to the shell and grep output windows,
but not to read-only text views.