From 55ca95bb344bcfdc716c02239a7f3b403398062f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Nov 2019 15:23:39 +0530 Subject: [PATCH] Better implementation of setting current item on mouse motion in completion popups Dont rely on the entered() signal since it is emitted even when the mouse does not move but the list scrolls. --- src/calibre/gui2/complete2.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/calibre/gui2/complete2.py b/src/calibre/gui2/complete2.py index 46efa12a0b..a4deed1ad5 100644 --- a/src/calibre/gui2/complete2.py +++ b/src/calibre/gui2/complete2.py @@ -98,7 +98,6 @@ class Completer(QListView): # {{{ self.setAlternatingRowColors(True) self.setModel(CompleteModel(self, sort_func=sort_func, strip_completion_entries=strip_completion_entries)) self.setMouseTracking(True) - self.entered.connect(self.item_entered, type=Qt.QueuedConnection) self.activated.connect(self.item_chosen) self.pressed.connect(self.item_chosen) self.installEventFilter(self) @@ -125,16 +124,6 @@ class Completer(QListView): # {{{ if self.isVisible(): self.relayout_needed.emit() - def item_entered(self, idx): - if self.visualRect(idx).top() < self.viewport().rect().bottom() - 5: - # Prevent any bottom item in the list that is only partially - # visible from triggering setCurrentIndex() - self.entered.disconnect() - try: - self.setCurrentIndex(idx) - finally: - self.entered.connect(self.item_entered, type=Qt.QueuedConnection) - def next_match(self, previous=False): c = self.currentIndex() if c.isValid(): @@ -206,6 +195,14 @@ class Completer(QListView): # {{{ if ev.type() in (ev.KeyPress, ev.ShortcutOverride, ev.KeyRelease): print('\tkey:', QKeySequence(ev.key()).toString()) + def mouseMoveEvent(self, ev): + idx = self.indexAt(ev.pos()) + if idx.isValid(): + ci = self.currentIndex() + if idx.row() != ci.row(): + self.setCurrentIndex(idx) + return QListView.mouseMoveEvent(self, ev) + def eventFilter(self, obj, e): 'Redirect key presses from the popup to the widget' widget = self.completer_widget()