Skip to content
Permalink
Browse files

Move HintManager out of WebView

This moves creating the HintManager to AbstractTab, and lets
TabData (which is now a QObject) handle the start_hinting/end_hinting
signal.

For the mouse_event signal of HintManager, we now have a slot in
AbstractTab too, though that might actually be moved to
WebKitTab/WebEngineTab later when needed.
  • Loading branch information
The-Compiler committed Aug 11, 2016
1 parent 3bffb71 commit 421b14681f21aa85b2b70b6ba1d7176e0f0404dd
Showing with 44 additions and 41 deletions.
  1. +43 −8 qutebrowser/browser/browsertab.py
  2. +0 −18 qutebrowser/browser/webkit/webpage.py
  3. +1 −15 qutebrowser/browser/webkit/webview.py
@@ -23,14 +23,14 @@

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QPoint, QSizeF
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QWidget, QApplication

from qutebrowser.keyinput import modeman
from qutebrowser.config import config
from qutebrowser.utils import (utils, objreg, usertypes, message, log, qtutils,
debug, urlutils)
from qutebrowser.misc import miscwidgets
from qutebrowser.browser import mouse
from qutebrowser.browser import mouse, hints


tab_id_gen = itertools.count(0)
@@ -60,7 +60,7 @@ class WebTabError(Exception):
"""Base class for various errors."""


class TabData:
class TabData(QObject):

"""A simple namespace with a fixed set of attributes.
@@ -73,10 +73,8 @@ class TabData:
hint_target: Override for open_target for hints.
"""

__slots__ = ['keep_icon', 'viewing_source', 'inspector', 'open_target',
'hint_target']

def __init__(self):
def __init__(self, parent=None):
super().__init__(parent)
self.keep_icon = False
self.viewing_source = False
self.inspector = None
@@ -89,6 +87,21 @@ def combined_target(self):
else:
return self.open_target

@pyqtSlot(usertypes.ClickTarget)
def _on_start_hinting(self, hint_target):
"""Emitted before a hinting-click takes place.
Args:
hint_target: A ClickTarget member to set self.hint_target to.
"""
log.webview.debug("Setting force target to {}".format(hint_target))
self.hint_target = hint_target

@pyqtSlot()
def _on_stop_hinting(self):
log.webview.debug("Finishing hinting.")
self.hint_target = None


class AbstractPrinting:

@@ -475,7 +488,8 @@ def __init__(self, win_id, parent=None):
# self.zoom = AbstractZoom(win_id=win_id)
# self.search = AbstractSearch(parent=self)
# self.printing = AbstractPrinting()
self.data = TabData()

self.data = TabData(parent=self)
self._layout = miscwidgets.WrapperLayout(self)
self._widget = None
self._progress = 0
@@ -484,6 +498,17 @@ def __init__(self, win_id, parent=None):
self._mouse_event_filter = mouse.MouseEventFilter(self, parent=self)
self.backend = None

# FIXME:qtwebengine Should this be public api via self.hints?
# Also, should we get it out of objreg?
hintmanager = hints.HintManager(win_id, self.tab_id, parent=self)
hintmanager.mouse_event.connect(self._on_hint_mouse_event)
# pylint: disable=protected-access
hintmanager.start_hinting.connect(self.data._on_start_hinting)
hintmanager.stop_hinting.connect(self.data._on_stop_hinting)
# pylint: enable=protected-access
objreg.register('hintmanager', hintmanager, scope='tab',
window=self.win_id, tab=self.tab_id)

def _set_widget(self, widget):
# pylint: disable=protected-access
self._widget = widget
@@ -507,6 +532,16 @@ def _set_load_status(self, val):
self._load_status = val
self.load_status_changed.emit(val.name)

@pyqtSlot('QMouseEvent')
def _on_hint_mouse_event(self, evt):
"""Post a new mouse event from a hintmanager."""
# FIXME:qtwebengine Will this implementation work for QtWebEngine?
# We probably need to send the event to the
# focusProxy()?
log.modes.debug("Hint triggered, focusing {!r}".format(self))
self._widget.setFocus()
QApplication.postEvent(self._widget, evt)

@pyqtSlot(QUrl)
def _on_link_clicked(self, url):
log.webview.debug("link clicked: url {}, hint target {}, "
@@ -421,24 +421,6 @@ def on_restore_frame_state_requested(self, frame):
if 'scroll-pos' in data and frame.scrollPosition() == QPoint(0, 0):
frame.setScrollPosition(data['scroll-pos'])

@pyqtSlot(usertypes.ClickTarget)
def on_start_hinting(self, hint_target):
"""Emitted before a hinting-click takes place.
Args:
hint_target: A ClickTarget member to set self._hint_target to.
"""
# FIXME move this away
log.webview.debug("Setting force target to {}".format(hint_target))
self._tabdata.hint_target = hint_target

@pyqtSlot()
def on_stop_hinting(self):
"""Emitted when hinting is finished."""
# FIXME move this away
log.webview.debug("Finishing hinting.")
self._tabdata.hint_target = None

def userAgentForUrl(self, url):
"""Override QWebPage::userAgentForUrl to customize the user agent."""
ua = config.get('network', 'user-agent')
@@ -23,14 +23,13 @@

from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QTimer, QUrl, QPoint
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QStyleFactory
from PyQt5.QtWidgets import QStyleFactory
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtWebKitWidgets import QWebView, QWebPage, QWebFrame

from qutebrowser.config import config
from qutebrowser.keyinput import modeman
from qutebrowser.utils import log, usertypes, utils, qtutils, objreg
from qutebrowser.browser import hints
from qutebrowser.browser.webkit import webpage, webkitelem


@@ -75,12 +74,6 @@ def __init__(self, win_id, tab_id, tab, parent=None):
self._tab_id = tab_id

page = self._init_page(tab.data)
hintmanager = hints.HintManager(win_id, self._tab_id, self)
hintmanager.mouse_event.connect(self.on_mouse_event)
hintmanager.start_hinting.connect(page.on_start_hinting)
hintmanager.stop_hinting.connect(page.on_stop_hinting)
objreg.register('hintmanager', hintmanager, scope='tab', window=win_id,
tab=tab_id)
mode_manager = objreg.get('mode-manager', scope='window',
window=win_id)
mode_manager.entered.connect(self.on_mode_entered)
@@ -241,13 +234,6 @@ def add_js_bridge(self):
bridge = objreg.get('js-bridge')
frame.addToJavaScriptWindowObject('qute', bridge)

@pyqtSlot('QMouseEvent')
def on_mouse_event(self, evt):
"""Post a new mouse event from a hintmanager."""
log.modes.debug("Hint triggered, focusing {!r}".format(self))
self.setFocus()
QApplication.postEvent(self, evt)

@pyqtSlot()
def on_load_finished(self):
"""Handle a finished page load.

0 comments on commit 421b146

Please sign in to comment.