diff options
author | Florian Bruhin <git@the-compiler.org> | 2015-02-26 20:41:04 +0100 |
---|---|---|
committer | Florian Bruhin <git@the-compiler.org> | 2015-03-18 23:13:43 +0100 |
commit | d929590cffcb90bc5b8f943aa7df48fbea6e2bee (patch) | |
tree | 15cfbd84bc59a79a4536a884825542bb6d4859a3 | |
parent | 8291090b43b82115afbb42ce819c0e316ce0650b (diff) | |
download | qutebrowser-d929590cffcb90bc5b8f943aa7df48fbea6e2bee.tar.gz qutebrowser-d929590cffcb90bc5b8f943aa7df48fbea6e2bee.zip |
Refactor how click/hint open targets are handled.
-rw-r--r-- | qutebrowser/browser/hints.py | 13 | ||||
-rw-r--r-- | qutebrowser/browser/webpage.py | 35 | ||||
-rw-r--r-- | qutebrowser/browser/webview.py | 38 |
3 files changed, 48 insertions, 38 deletions
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 8279c90c3..831eb9953 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -24,7 +24,8 @@ import functools import subprocess import collections -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QEvent, Qt, QUrl +from PyQt5.QtCore import (pyqtSignal, pyqtSlot, QObject, QEvent, Qt, QUrl, + QTimer) from PyQt5.QtGui import QMouseEvent, QClipboard from PyQt5.QtWidgets import QApplication from PyQt5.QtWebKit import QWebElement @@ -108,7 +109,9 @@ class HintManager(QObject): Signals: mouse_event: Mouse event to be posted in the web view. arg: A QMouseEvent - set_open_target: Set a new target to open the links in. + start_hinting: Emitted when hinting starts, before a link is clicked. + arg: The hinting target name. + stop_hinting: Emitted after a link was clicked. """ HINT_TEXTS = { @@ -129,7 +132,8 @@ class HintManager(QObject): } mouse_event = pyqtSignal('QMouseEvent') - set_open_target = pyqtSignal(str) + start_hinting = pyqtSignal(str) + stop_hinting = pyqtSignal() def __init__(self, win_id, tab_id, parent=None): """Constructor.""" @@ -373,6 +377,7 @@ class HintManager(QObject): action = "Hovering" if target == Target.hover else "Clicking" log.hints.debug("{} on '{}' at {}/{}".format( action, elem, pos.x(), pos.y())) + self.start_hinting.emit(target.name) if target in (Target.tab, Target.tab_bg, Target.window): modifiers = Qt.ControlModifier else: @@ -382,7 +387,6 @@ class HintManager(QObject): Qt.NoModifier), ] if target != Target.hover: - self.set_open_target.emit(target.name) events += [ QMouseEvent(QEvent.MouseButtonPress, pos, Qt.LeftButton, Qt.LeftButton, modifiers), @@ -391,6 +395,7 @@ class HintManager(QObject): ] for evt in events: self.mouse_event.emit(evt) + QTimer.singleShot(0, self.stop_hinting.emit) def _yank(self, url, context): """Yank an element to the clipboard or primary selection. diff --git a/qutebrowser/browser/webpage.py b/qutebrowser/browser/webpage.py index 8e6be0d11..4f944f481 100644 --- a/qutebrowser/browser/webpage.py +++ b/qutebrowser/browser/webpage.py @@ -41,6 +41,9 @@ class BrowserPage(QWebPage): Attributes: error_occured: Whether an error occured while loading. + open_target: Where to open the next navigation request. + ("normal", "tab", "tab_bg") + _hint_target: Override for open_target while hinting, or None. _extension_handlers: Mapping of QWebPage extensions to their handlers. _networkmnager: The NetworkManager used. _win_id: The window ID this BrowserPage is associated with. @@ -63,6 +66,8 @@ class BrowserPage(QWebPage): } self._ignore_load_started = False self.error_occured = False + self.open_target = usertypes.ClickTarget.normal + self._hint_target = None self._networkmanager = networkmanager.NetworkManager( win_id, tab_id, self) self.setNetworkAccessManager(self._networkmanager) @@ -280,6 +285,24 @@ class BrowserPage(QWebPage): else: self.error_occured = False + @pyqtSlot(str) + def on_start_hinting(self, hint_target): + """Emitted before a hinting-click takes place. + + Args: + hint_target: A string to set self._hint_target to. + """ + t = getattr(usertypes.ClickTarget, hint_target) + log.webview.debug("Setting force target to {}/{}".format( + hint_target, t)) + self._hint_target = t + + @pyqtSlot() + def on_stop_hinting(self): + """Emitted when hinting is finished.""" + log.webview.debug("Finishing hinting.") + self._hint_target = None + def userAgentForUrl(self, url): """Override QWebPage::userAgentForUrl to customize the user agent.""" ua = config.get('network', 'user-agent') @@ -383,15 +406,17 @@ class BrowserPage(QWebPage): return False tabbed_browser = objreg.get('tabbed-browser', scope='window', window=self._win_id) - open_target = self.view().open_target - self.view().open_target = usertypes.ClickTarget.normal - if open_target == usertypes.ClickTarget.tab: + if self._hint_target is not None: + target = self._hint_target + else: + target = self.open_target + if target == usertypes.ClickTarget.tab: tabbed_browser.tabopen(url, False) return False - elif open_target == usertypes.ClickTarget.tab_bg: + elif target == usertypes.ClickTarget.tab_bg: tabbed_browser.tabopen(url, True) return False - elif open_target == usertypes.ClickTarget.window: + elif target == usertypes.ClickTarget.window: main_window = objreg.get('main-window', scope='window', window=self._win_id) win_id = main_window.spawn() diff --git a/qutebrowser/browser/webview.py b/qutebrowser/browser/webview.py index c1229718c..8674c369c 100644 --- a/qutebrowser/browser/webview.py +++ b/qutebrowser/browser/webview.py @@ -55,7 +55,6 @@ class WebView(QWebView): statusbar_message: The current javscript statusbar message. inspector: The QWebInspector used for this webview. load_status: loading status of this page (index into LoadStatus) - open_target: Where to open the next tab ("normal", "tab", "tab_bg") viewing_source: Whether the webview is currently displaying source code. registry: The ObjectRegistry associated with this tab. @@ -64,7 +63,6 @@ class WebView(QWebView): _has_ssl_errors: Whether SSL errors occured during loading. _zoom: A NeighborList with the zoom levels. _old_scroll_pos: The old scroll position. - _force_open_target: Override for open_target. _check_insertmode: If True, in mouseReleaseEvent we should check if we need to enter/leave insert mode. _default_zoom_changed: Whether the zoom was changed from the default. @@ -99,8 +97,6 @@ class WebView(QWebView): self.scroll_pos = (-1, -1) self.statusbar_message = '' self._old_scroll_pos = (-1, -1) - self.open_target = usertypes.ClickTarget.normal - self._force_open_target = None self._zoom = None self._has_ssl_errors = False self.init_neighborlist() @@ -124,7 +120,8 @@ class WebView(QWebView): self.setPage(page) hintmanager = hints.HintManager(win_id, self.tab_id, self) hintmanager.mouse_event.connect(self.on_mouse_event) - hintmanager.set_open_target.connect(self.set_force_open_target) + hintmanager.start_hinting.connect(page.on_start_hinting) + hintmanager.stop_hinting.connect(page.on_stop_hinting) objreg.register('hintmanager', hintmanager, registry=self.registry) mode_manager = objreg.get('mode-manager', scope='window', window=win_id) @@ -280,24 +277,18 @@ class WebView(QWebView): Args: e: The QMouseEvent. """ - if self._force_open_target is not None: - self.open_target = self._force_open_target - self._force_open_target = None - log.mouse.debug("Setting force target: {}".format( - self.open_target)) - elif (e.button() == Qt.MidButton or - e.modifiers() & Qt.ControlModifier): + if e.button() == Qt.MidButton or e.modifiers() & Qt.ControlModifier: background_tabs = config.get('tabs', 'background-tabs') if e.modifiers() & Qt.ShiftModifier: background_tabs = not background_tabs if background_tabs: - self.open_target = usertypes.ClickTarget.tab_bg + target = usertypes.ClickTarget.tab_bg else: - self.open_target = usertypes.ClickTarget.tab - log.mouse.debug("Middle click, setting target: {}".format( - self.open_target)) + target = usertypes.ClickTarget.tab + self.page().open_target = target + log.mouse.debug("Middle click, setting target: {}".format(target)) else: - self.open_target = usertypes.ClickTarget.normal + self.page().open_target = usertypes.ClickTarget.normal log.mouse.debug("Normal click, setting normal target") def shutdown(self): @@ -435,17 +426,6 @@ class WebView(QWebView): "left.".format(mode)) self.setFocusPolicy(Qt.WheelFocus) - @pyqtSlot(str) - def set_force_open_target(self, target): - """Change the forced link target. Setter for _force_open_target. - - Args: - target: A string to set self._force_open_target to. - """ - t = getattr(usertypes.ClickTarget, target) - log.webview.debug("Setting force target to {}/{}".format(target, t)) - self._force_open_target = t - def createWindow(self, wintype): """Called by Qt when a page wants to create a new window. @@ -504,7 +484,7 @@ class WebView(QWebView): This does the following things: - Check if a link was clicked with the middle button or Ctrl and - set the open_target attribute accordingly. + set the page's open_target attribute accordingly. - Emit the editable_elem_selected signal if an editable element was clicked. |