Support frames correctly in HintManager
This commit is contained in:
parent
ebd3ab778f
commit
0de249e904
@ -194,7 +194,8 @@ class CurCommandDispatcher(QObject):
|
|||||||
target: Where to open the links.
|
target: Where to open the links.
|
||||||
"""
|
"""
|
||||||
widget = self._tabs.currentWidget()
|
widget = self._tabs.currentWidget()
|
||||||
widget.hintmanager.start(widget.url(), mode, target)
|
widget.hintmanager.start(widget.page_.currentFrame(), widget.url(),
|
||||||
|
mode, target)
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def handle_hint_key(self, keystr):
|
def handle_hint_key(self, keystr):
|
||||||
|
@ -151,15 +151,15 @@ class HintManager(QObject):
|
|||||||
set_open_target = pyqtSignal(str)
|
set_open_target = pyqtSignal(str)
|
||||||
set_cmd_text = pyqtSignal(str)
|
set_cmd_text = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self, frame):
|
def __init__(self, parent=None):
|
||||||
"""Constructor.
|
"""Constructor.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
frame: The QWebFrame to use for finding elements and drawing.
|
frame: The QWebFrame to use for finding elements and drawing.
|
||||||
"""
|
"""
|
||||||
super().__init__(frame)
|
super().__init__(parent)
|
||||||
self._frame = frame
|
|
||||||
self._elems = {}
|
self._elems = {}
|
||||||
|
self._frame = None
|
||||||
self._target = None
|
self._target = None
|
||||||
self._baseurl = None
|
self._baseurl = None
|
||||||
|
|
||||||
@ -337,10 +337,11 @@ class HintManager(QObject):
|
|||||||
link = self._baseurl.resolved(link)
|
link = self._baseurl.resolved(link)
|
||||||
return link
|
return link
|
||||||
|
|
||||||
def start(self, baseurl, mode="all", target="normal"):
|
def start(self, frame, baseurl, mode="all", target="normal"):
|
||||||
"""Start hinting.
|
"""Start hinting.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
frame: The QWebFrame to place hints in.
|
||||||
baseurl: URL of the current page.
|
baseurl: URL of the current page.
|
||||||
mode: The mode to be used.
|
mode: The mode to be used.
|
||||||
target: What to do with the link. See attribute docstring.
|
target: What to do with the link. See attribute docstring.
|
||||||
@ -351,7 +352,8 @@ class HintManager(QObject):
|
|||||||
"""
|
"""
|
||||||
self._target = target
|
self._target = target
|
||||||
self._baseurl = baseurl
|
self._baseurl = baseurl
|
||||||
elems = self._frame.findAllElements(self.SELECTORS[mode])
|
self._frame = frame
|
||||||
|
elems = frame.findAllElements(self.SELECTORS[mode])
|
||||||
filterfunc = self.FILTERS.get(mode, lambda e: True)
|
filterfunc = self.FILTERS.get(mode, lambda e: True)
|
||||||
visible_elems = []
|
visible_elems = []
|
||||||
for e in elems:
|
for e in elems:
|
||||||
@ -361,8 +363,8 @@ class HintManager(QObject):
|
|||||||
if (not rect.isValid()) and rect.x() == 0:
|
if (not rect.isValid()) and rect.x() == 0:
|
||||||
# Most likely an invisible link
|
# Most likely an invisible link
|
||||||
continue
|
continue
|
||||||
framegeom = self._frame.geometry()
|
framegeom = frame.geometry()
|
||||||
framegeom.translate(self._frame.scrollPosition())
|
framegeom.translate(frame.scrollPosition())
|
||||||
if not framegeom.contains(rect.topLeft()):
|
if not framegeom.contains(rect.topLeft()):
|
||||||
# out of screen
|
# out of screen
|
||||||
continue
|
continue
|
||||||
@ -386,7 +388,7 @@ class HintManager(QObject):
|
|||||||
for e, string in zip(visible_elems, strings):
|
for e, string in zip(visible_elems, strings):
|
||||||
label = self._draw_label(e, string)
|
label = self._draw_label(e, string)
|
||||||
self._elems[string] = ElemTuple(e, label)
|
self._elems[string] = ElemTuple(e, label)
|
||||||
self._frame.contentsSizeChanged.connect(self.on_contents_size_changed)
|
frame.contentsSizeChanged.connect(self.on_contents_size_changed)
|
||||||
self.hint_strings_updated.emit(strings)
|
self.hint_strings_updated.emit(strings)
|
||||||
self.set_mode.emit("hint")
|
self.set_mode.emit("hint")
|
||||||
|
|
||||||
@ -402,6 +404,7 @@ class HintManager(QObject):
|
|||||||
self.on_contents_size_changed)
|
self.on_contents_size_changed)
|
||||||
self._elems = {}
|
self._elems = {}
|
||||||
self._target = None
|
self._target = None
|
||||||
|
self._frame = None
|
||||||
self.set_mode.emit("normal")
|
self.set_mode.emit("normal")
|
||||||
message.clear()
|
message.clear()
|
||||||
|
|
||||||
@ -425,28 +428,27 @@ class HintManager(QObject):
|
|||||||
# Targets which require a valid link
|
# Targets which require a valid link
|
||||||
require_link = ['yank', 'yank_primary', 'cmd', 'cmd_tab', 'cmd_bgtab']
|
require_link = ['yank', 'yank_primary', 'cmd', 'cmd_tab', 'cmd_bgtab']
|
||||||
elem = self._elems[keystr].elem
|
elem = self._elems[keystr].elem
|
||||||
target = self._target
|
if self._target in require_link:
|
||||||
if target != 'rapid':
|
|
||||||
self.stop()
|
|
||||||
if target in require_link:
|
|
||||||
link = self._resolve_link(elem)
|
link = self._resolve_link(elem)
|
||||||
if link is None:
|
if link is None:
|
||||||
message.error("No suitable link found for this element.")
|
message.error("No suitable link found for this element.")
|
||||||
return
|
return
|
||||||
if target in ['normal', 'tab', 'bgtab']:
|
if self._target in ['normal', 'tab', 'bgtab']:
|
||||||
self._click(elem, target)
|
self._click(elem, self._target)
|
||||||
elif target == 'rapid':
|
elif self._target == 'rapid':
|
||||||
self._click(elem, 'bgtab')
|
self._click(elem, 'bgtab')
|
||||||
elif target in ['yank', 'yank_primary']:
|
elif self._target in ['yank', 'yank_primary']:
|
||||||
sel = target == 'yank_primary'
|
sel = self._target == 'yank_primary'
|
||||||
self._yank(link, sel)
|
self._yank(link, sel)
|
||||||
elif target in ['cmd', 'cmd_tab', 'cmd_bgtab']:
|
elif self._target in ['cmd', 'cmd_tab', 'cmd_bgtab']:
|
||||||
commands = {
|
commands = {
|
||||||
'cmd': 'open',
|
'cmd': 'open',
|
||||||
'cmd_tab': 'tabopen',
|
'cmd_tab': 'tabopen',
|
||||||
'cmd_bgtab': 'backtabopen',
|
'cmd_bgtab': 'backtabopen',
|
||||||
}
|
}
|
||||||
self._set_cmd_text(link, commands[target])
|
self._set_cmd_text(link, commands[self._target])
|
||||||
|
if self._target != 'rapid':
|
||||||
|
self.stop()
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
@pyqtSlot('QSize')
|
@pyqtSlot('QSize')
|
||||||
|
@ -77,7 +77,7 @@ class BrowserTab(QWebView):
|
|||||||
self._init_neighborlist()
|
self._init_neighborlist()
|
||||||
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)
|
||||||
self.hintmanager.mouse_event.connect(self.on_mouse_event)
|
self.hintmanager.mouse_event.connect(self.on_mouse_event)
|
||||||
self.hintmanager.set_open_target.connect(self.set_force_open_target)
|
self.hintmanager.set_open_target.connect(self.set_force_open_target)
|
||||||
self.signal_cache = SignalCache(uncached=['linkHovered'])
|
self.signal_cache = SignalCache(uncached=['linkHovered'])
|
||||||
|
Loading…
Reference in New Issue
Block a user