diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py index 9907055d2..824606af0 100644 --- a/aqt/deckbrowser.py +++ b/aqt/deckbrowser.py @@ -64,8 +64,7 @@ class DeckBrowser: return False def _keyHandler(self, evt): - # currently does nothing - key = str(evt.text()) + return False def _selDeck(self, did): self.mw.col.decks.select(did) diff --git a/aqt/main.py b/aqt/main.py index 7223b16ff..99c61ac8f 100644 --- a/aqt/main.py +++ b/aqt/main.py @@ -512,6 +512,7 @@ title="%s" %s>%s''' % ( tweb = self.toolbarWeb = aqt.webview.AnkiWebView() tweb.title = "top toolbar" tweb.setFocusPolicy(Qt.WheelFocus) + tweb.keyEventDelegate = self.globalKeyHandler self.toolbar = aqt.toolbar.Toolbar(self, tweb) self.toolbar.draw() # main area @@ -519,10 +520,12 @@ title="%s" %s>%s''' % ( self.web.title = "main webview" self.web.setFocusPolicy(Qt.WheelFocus) self.web.setMinimumWidth(400) + self.web.keyEventDelegate = self.globalKeyHandler # bottom area sweb = self.bottomWeb = aqt.webview.AnkiWebView() sweb.title = "bottom toolbar" sweb.setFocusPolicy(Qt.WheelFocus) + sweb.keyEventDelegate = self.globalKeyHandler # add in a layout self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0,0,0,0) @@ -622,13 +625,17 @@ title="%s" %s>%s''' % ( self.debugShortcut.activated.connect(self.onDebug) def keyPressEvent(self, evt): + if not self.globalKeyHandler(evt): + QMainWindow.keyPressEvent(self, evt) + + # true if we handled key + # called via mw's keyPressEvent() or a webview's event filter + def globalKeyHandler(self, evt): # do we have a delegate? if self.keyHandler: # did it eat the key? if self.keyHandler(evt): - return - # run standard handler - QMainWindow.keyPressEvent(self, evt) + return True # check global keys key = str(evt.text()) if key == "d": @@ -647,6 +654,9 @@ title="%s" %s>%s''' % ( self.onStats() elif key == "y": self.onSync() + else: + return False + return True # App exit ########################################################################## diff --git a/aqt/overview.py b/aqt/overview.py index 31c906b56..5a25e67cf 100644 --- a/aqt/overview.py +++ b/aqt/overview.py @@ -68,17 +68,20 @@ class Overview: key = str(evt.text()) if key == "o": self.mw.onDeckConf() - if key == "r" and cram: + elif key == "r" and cram: self.mw.col.sched.rebuildDyn() self.mw.reset() - if key == "e" and cram: + elif key == "e" and cram: self.mw.col.sched.emptyDyn(self.mw.col.decks.selected()) self.mw.reset() - if key == "c" and not cram: + elif key == "c" and not cram: self.onStudyMore() - if key == "u": + elif key == "u": self.mw.col.sched.unburyCardsForDeck() self.mw.reset() + else: + return False + return True # HTML ############################################################ diff --git a/aqt/reviewer.py b/aqt/reviewer.py index 3e946ed3f..8d133af3b 100644 --- a/aqt/reviewer.py +++ b/aqt/reviewer.py @@ -319,6 +319,9 @@ The front of this card is empty. Please run Tools>Empty Cards.""") self._answerCard(int(key)) elif key == "v": self.onReplayRecorded() + else: + return False + return True def _linkHandler(self, url): if url == "ans": diff --git a/aqt/webview.py b/aqt/webview.py index ef48438dc..63e0d3f16 100644 --- a/aqt/webview.py +++ b/aqt/webview.py @@ -75,6 +75,8 @@ class AnkiWebView(QWebEngineView): self._loadFinishedCB = None self.setPage(self._page) + self.keyEventDelegate = None + self._page.profile().setHttpCacheType(QWebEngineProfile.MemoryHttpCache) self.resetHandlers() self.allowDrops = False @@ -105,9 +107,18 @@ class AnkiWebView(QWebEngineView): from aqt import mw if w != mw: w.close() + else: + self.clearFocus() break w = w.parent() return True + + if self.keyEventDelegate: + ret = self.keyEventDelegate(evt) + if ret is None: + raise Exception("add-ons that modify key handlers should make sure true/false is returned") + return ret + return False def onCopy(self):