Add clicking on links

This commit is contained in:
Florian Bruhin 2014-04-21 16:59:03 +02:00
parent c2aa9517ea
commit de0e96ab2d
3 changed files with 33 additions and 3 deletions

View File

@ -17,10 +17,12 @@
"""A HintManager to draw hints over links.""" """A HintManager to draw hints over links."""
import logging
import math import math
from collections import namedtuple from collections import namedtuple
from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtCore import pyqtSignal, QObject, QEvent, Qt
from PyQt5.QtGui import QMouseEvent
import qutebrowser.config.config as config import qutebrowser.config.config as config
from qutebrowser.utils.keyparser import KeyParser from qutebrowser.utils.keyparser import KeyParser
@ -71,7 +73,14 @@ class HintManager(QObject):
Signals: Signals:
hint_strings_updated: Emitted when the possible hint strings changed. hint_strings_updated: Emitted when the possible hint strings changed.
arg: A list of hint strings.
set_mode: Emitted when the input mode should be changed. set_mode: Emitted when the input mode should be changed.
arg: The new mode, as a string.
mouse_event: Mouse event to be posted in the web view.
arg: A QMouseEvent
openurl: Open a new url
arg 0: URL to open as a string.
arg 1: true if it should be opened in a new tab, else false.
""" """
SELECTORS = { SELECTORS = {
@ -100,6 +109,7 @@ class HintManager(QObject):
hint_strings_updated = pyqtSignal(list) hint_strings_updated = pyqtSignal(list)
set_mode = pyqtSignal(str) set_mode = pyqtSignal(str)
mouse_event = pyqtSignal('QMouseEvent')
def __init__(self, frame): def __init__(self, frame):
"""Constructor. """Constructor.
@ -247,7 +257,7 @@ class HintManager(QObject):
def stop(self): def stop(self):
"""Stop hinting.""" """Stop hinting."""
for elem in self._elems: for elem in self._elems.values():
elem.label.removeFromDocument() elem.label.removeFromDocument()
self._elems = {} self._elems = {}
self.set_mode.emit("normal") self.set_mode.emit("normal")
@ -269,4 +279,16 @@ class HintManager(QObject):
def fire(self, keystr): def fire(self, keystr):
"""Fire a completed hint.""" """Fire a completed hint."""
raise NotImplementedError elem = self._elems[keystr].elem
logging.debug("Clicking on: {}".format(elem.toPlainText()))
self.stop()
events = [
QMouseEvent(QEvent.MouseMove, elem.geometry().center(),
Qt.NoButton, Qt.NoButton, Qt.NoModifier),
QMouseEvent(QEvent.MouseButtonPress, elem.geometry().center(),
Qt.LeftButton, Qt.NoButton, Qt.NoModifier),
QMouseEvent(QEvent.MouseButtonRelease, elem.geometry().center(),
Qt.LeftButton, Qt.NoButton, Qt.NoModifier),
]
for evt in events:
self.mouse_event.emit(evt)

View File

@ -341,6 +341,7 @@ DATA = OrderedDict([
('r', 'reload'), ('r', 'reload'),
('H', 'back'), ('H', 'back'),
('L', 'forward'), ('L', 'forward'),
('f', 'hint'),
('h', 'scroll -50 0'), ('h', 'scroll -50 0'),
('j', 'scroll 0 50'), ('j', 'scroll 0 50'),
('k', 'scroll 0 -50'), ('k', 'scroll 0 -50'),

View File

@ -21,6 +21,7 @@ import logging
import functools import functools
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtWebKitWidgets import QWebView, QWebPage from PyQt5.QtWebKitWidgets import QWebView, QWebPage
@ -77,6 +78,7 @@ class BrowserTab(QWebView):
self.page_ = BrowserPage(self) self.page_ = BrowserPage(self)
self.setPage(self.page_) self.setPage(self.page_)
self.hintmanager = HintManager(self.page_.mainFrame()) self.hintmanager = HintManager(self.page_.mainFrame())
self.hintmanager.mouse_event.connect(self.on_mouse_event)
self.signal_cache = SignalCache(uncached=['linkHovered']) self.signal_cache = SignalCache(uncached=['linkHovered'])
self.page_.setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.page_.setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
self.page_.linkHovered.connect(self.linkHovered) self.page_.linkHovered.connect(self.linkHovered)
@ -185,6 +187,11 @@ class BrowserTab(QWebView):
if section == 'general' and option in ['zoomlevels', 'defaultzoom']: if section == 'general' and option in ['zoomlevels', 'defaultzoom']:
self._init_neighborlist() self._init_neighborlist()
@pyqtSlot('QMouseEvent')
def on_mouse_event(self, evt):
"""Post a new mouseevent from a hintmanager."""
QApplication.postEvent(self, evt)
def _on_destroyed(self, sender): def _on_destroyed(self, sender):
"""Called when a subsystem has been destroyed during shutdown. """Called when a subsystem has been destroyed during shutdown.