Skip to content

bpo-33664: Scroll IDLE editor text by lines #7351

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 4, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions Lib/idlelib/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
# The default tab setting for a Text widget, in average-width characters.
TK_TABWIDTH_DEFAULT = 8
_py_version = ' (%s)' % platform.python_version()
darwin = sys.platform == 'darwin'

def _sphinx_version():
"Format sys.version_info to produce the Sphinx version string used to install the chm docs"
Expand All @@ -49,7 +50,7 @@ class EditorWindow(object):
from idlelib.undo import UndoDelegator
from idlelib.iomenu import IOBinding, encoding
from idlelib import mainmenu
from tkinter import Toplevel
from tkinter import Toplevel, EventType
from idlelib.statusbar import MultiStatusBar
from idlelib.autocomplete import AutoComplete
from idlelib.autoexpand import AutoExpand
Expand Down Expand Up @@ -147,6 +148,9 @@ def __init__(self, flist=None, filename=None, key=None, root=None):
else:
# Elsewhere, use right-click for popup menus.
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("<<copy>>", self.copy)
text.bind("<<paste>>", self.paste)
Expand Down Expand Up @@ -193,7 +197,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None):
text.bind("<<open-turtle-demo>>", self.open_turtle_demo)

self.set_status_bar()
vbar['command'] = text.yview
vbar['command'] = self.handle_yview
vbar.pack(side=RIGHT, fill=Y)
text['yscrollcommand'] = vbar.set
text['font'] = idleConf.GetFont(self.root, 'main', 'EditorWindow')
Expand Down Expand Up @@ -441,6 +445,27 @@ def postwindowsmenu(self):
menu.delete(self.wmenu_end+1, end)
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

def right_menu_event(self, event):
Expand Down
Original file line number Diff line number Diff line change
@@ -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.