From 0de249e904b1df1c22d9644e95afa01c834b9ce3 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 22 Apr 2014 14:23:55 +0200 Subject: [PATCH] Support frames correctly in HintManager --- qutebrowser/browser/curcommand.py | 3 ++- qutebrowser/browser/hints.py | 40 ++++++++++++++++--------------- qutebrowser/widgets/browsertab.py | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/qutebrowser/browser/curcommand.py b/qutebrowser/browser/curcommand.py index f1515ecaf..878da0844 100644 --- a/qutebrowser/browser/curcommand.py +++ b/qutebrowser/browser/curcommand.py @@ -194,7 +194,8 @@ class CurCommandDispatcher(QObject): target: Where to open the links. """ widget = self._tabs.currentWidget() - widget.hintmanager.start(widget.url(), mode, target) + widget.hintmanager.start(widget.page_.currentFrame(), widget.url(), + mode, target) @pyqtSlot(str) def handle_hint_key(self, keystr): diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 5dc817e6f..1bbc786b1 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -151,15 +151,15 @@ class HintManager(QObject): set_open_target = pyqtSignal(str) set_cmd_text = pyqtSignal(str) - def __init__(self, frame): + def __init__(self, parent=None): """Constructor. Args: frame: The QWebFrame to use for finding elements and drawing. """ - super().__init__(frame) - self._frame = frame + super().__init__(parent) self._elems = {} + self._frame = None self._target = None self._baseurl = None @@ -337,10 +337,11 @@ class HintManager(QObject): link = self._baseurl.resolved(link) return link - def start(self, baseurl, mode="all", target="normal"): + def start(self, frame, baseurl, mode="all", target="normal"): """Start hinting. Args: + frame: The QWebFrame to place hints in. baseurl: URL of the current page. mode: The mode to be used. target: What to do with the link. See attribute docstring. @@ -351,7 +352,8 @@ class HintManager(QObject): """ self._target = target 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) visible_elems = [] for e in elems: @@ -361,8 +363,8 @@ class HintManager(QObject): if (not rect.isValid()) and rect.x() == 0: # Most likely an invisible link continue - framegeom = self._frame.geometry() - framegeom.translate(self._frame.scrollPosition()) + framegeom = frame.geometry() + framegeom.translate(frame.scrollPosition()) if not framegeom.contains(rect.topLeft()): # out of screen continue @@ -386,7 +388,7 @@ class HintManager(QObject): for e, string in zip(visible_elems, strings): label = self._draw_label(e, string) 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.set_mode.emit("hint") @@ -402,6 +404,7 @@ class HintManager(QObject): self.on_contents_size_changed) self._elems = {} self._target = None + self._frame = None self.set_mode.emit("normal") message.clear() @@ -425,28 +428,27 @@ class HintManager(QObject): # Targets which require a valid link require_link = ['yank', 'yank_primary', 'cmd', 'cmd_tab', 'cmd_bgtab'] elem = self._elems[keystr].elem - target = self._target - if target != 'rapid': - self.stop() - if target in require_link: + if self._target in require_link: link = self._resolve_link(elem) if link is None: message.error("No suitable link found for this element.") return - if target in ['normal', 'tab', 'bgtab']: - self._click(elem, target) - elif target == 'rapid': + if self._target in ['normal', 'tab', 'bgtab']: + self._click(elem, self._target) + elif self._target == 'rapid': self._click(elem, 'bgtab') - elif target in ['yank', 'yank_primary']: - sel = target == 'yank_primary' + elif self._target in ['yank', 'yank_primary']: + sel = self._target == 'yank_primary' self._yank(link, sel) - elif target in ['cmd', 'cmd_tab', 'cmd_bgtab']: + elif self._target in ['cmd', 'cmd_tab', 'cmd_bgtab']: commands = { 'cmd': 'open', 'cmd_tab': 'tabopen', '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 @pyqtSlot('QSize') diff --git a/qutebrowser/widgets/browsertab.py b/qutebrowser/widgets/browsertab.py index 9ed0a3f3d..3301db8a4 100644 --- a/qutebrowser/widgets/browsertab.py +++ b/qutebrowser/widgets/browsertab.py @@ -77,7 +77,7 @@ class BrowserTab(QWebView): self._init_neighborlist() self.page_ = BrowserPage(self) 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.set_open_target.connect(self.set_force_open_target) self.signal_cache = SignalCache(uncached=['linkHovered'])