bpo-37849: IDLE: fix completion window positioning above line (GH-15267)

This commit is contained in:
Tal Einat 2019-08-14 20:06:06 +03:00 committed by Terry Jan Reedy
parent 4fa10dde40
commit 71662dc2f1
3 changed files with 20 additions and 2 deletions

View File

@ -3,6 +3,11 @@ Released on 2019-10-20?
====================================== ======================================
bpo-37849: Fix completions list appearing too high or low when shown
above the current line.
bpo-36419: Refactor autocompete and improve testing.
bpo-37748: Reorder the Run menu. Put the most common choice, bpo-37748: Reorder the Run menu. Put the most common choice,
Run Module, at the top. Run Module, at the top.

View File

@ -52,10 +52,12 @@ class AutoCompleteWindow:
# (for example, he clicked the list) # (for example, he clicked the list)
self.userwantswindow = None self.userwantswindow = None
# event ids # event ids
self.hideid = self.keypressid = self.listupdateid = self.winconfigid \ self.hideid = self.keypressid = self.listupdateid = \
= self.keyreleaseid = self.doubleclickid = None self.winconfigid = self.keyreleaseid = self.doubleclickid = None
# Flag set if last keypress was a tab # Flag set if last keypress was a tab
self.lastkey_was_tab = False self.lastkey_was_tab = False
# Flag set to avoid recursive <Configure> callback invocations.
self.is_configuring = False
def _change_start(self, newstart): def _change_start(self, newstart):
min_len = min(len(self.start), len(newstart)) min_len = min(len(self.start), len(newstart))
@ -223,12 +225,18 @@ class AutoCompleteWindow:
self.widget.event_add(KEYRELEASE_VIRTUAL_EVENT_NAME,KEYRELEASE_SEQUENCE) self.widget.event_add(KEYRELEASE_VIRTUAL_EVENT_NAME,KEYRELEASE_SEQUENCE)
self.listupdateid = listbox.bind(LISTUPDATE_SEQUENCE, self.listupdateid = listbox.bind(LISTUPDATE_SEQUENCE,
self.listselect_event) self.listselect_event)
self.is_configuring = False
self.winconfigid = acw.bind(WINCONFIG_SEQUENCE, self.winconfig_event) self.winconfigid = acw.bind(WINCONFIG_SEQUENCE, self.winconfig_event)
self.doubleclickid = listbox.bind(DOUBLECLICK_SEQUENCE, self.doubleclickid = listbox.bind(DOUBLECLICK_SEQUENCE,
self.doubleclick_event) self.doubleclick_event)
return None return None
def winconfig_event(self, event): def winconfig_event(self, event):
if self.is_configuring:
# Avoid running on recursive <Configure> callback invocations.
return
self.is_configuring = True
if not self.is_active(): if not self.is_active():
return return
# Position the completion list window # Position the completion list window
@ -236,6 +244,7 @@ class AutoCompleteWindow:
text.see(self.startindex) text.see(self.startindex)
x, y, cx, cy = text.bbox(self.startindex) x, y, cx, cy = text.bbox(self.startindex)
acw = self.autocompletewindow acw = self.autocompletewindow
acw.update()
acw_width, acw_height = acw.winfo_width(), acw.winfo_height() acw_width, acw_height = acw.winfo_width(), acw.winfo_height()
text_width, text_height = text.winfo_width(), text.winfo_height() text_width, text_height = text.winfo_width(), text.winfo_height()
new_x = text.winfo_rootx() + min(x, max(0, text_width - acw_width)) new_x = text.winfo_rootx() + min(x, max(0, text_width - acw_width))
@ -256,6 +265,8 @@ class AutoCompleteWindow:
acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid) acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid)
self.winconfigid = None self.winconfigid = None
self.is_configuring = False
def _hide_event_check(self): def _hide_event_check(self):
if not self.autocompletewindow: if not self.autocompletewindow:
return return

View File

@ -0,0 +1,2 @@
Fixed completions list appearing too high or low when shown above
the current line.