From e21edd3e18f0817a15d9a917835c4914d70b8884 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 14 Jun 2016 18:21:00 +0200 Subject: [PATCH] Implement selection --- qutebrowser/browser/commands.py | 14 +++++++------- qutebrowser/browser/tab.py | 11 +++++++++-- qutebrowser/browser/webengine/webenginetab.py | 10 +++++++++- qutebrowser/browser/webkit/webkittab.py | 15 +++++++++++---- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 01b995078..36fb99ee5 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1021,8 +1021,8 @@ class CommandDispatcher: mainframe = None else: if webview.hasSelection(): - env['QUTE_SELECTED_TEXT'] = webview.selectedText() - env['QUTE_SELECTED_HTML'] = webview.selectedHtml() + env['QUTE_SELECTED_TEXT'] = webview.selection() + env['QUTE_SELECTED_HTML'] = webview.selection(html=True) mainframe = webview.page().mainFrame() try: @@ -1101,8 +1101,7 @@ class CommandDispatcher: tab: Load the selected link in a new tab. """ widget = self._current_widget() - page = widget.page() - if not page.hasSelection(): + if not widget.has_selection(): return if QWebSettings.globalSettings().testAttribute( QWebSettings.JavascriptEnabled): @@ -1113,7 +1112,7 @@ class CommandDispatcher: else: try: selected_element = xml.etree.ElementTree.fromstring( - '' + widget.selectedHtml() + '').find('a') + '' + widget.selection(html=True) + '').find('a') except xml.etree.ElementTree.ParseError: raise cmdexc.CommandError('Could not parse selected element!') @@ -1640,8 +1639,9 @@ class CommandDispatcher: sel: Use the primary selection instead of the clipboard. keep: If given, stay in visual mode after yanking. """ - s = self._current_widget().selectedText() - if not self._current_widget().hasSelection() or len(s) == 0: + tab = self._current_widget() + s = tab.selection() + if not tab.has_selection() or len(s) == 0: message.info(self._win_id, "Nothing to yank") return diff --git a/qutebrowser/browser/tab.py b/qutebrowser/browser/tab.py index 59ca0d3a3..24e8109d8 100644 --- a/qutebrowser/browser/tab.py +++ b/qutebrowser/browser/tab.py @@ -59,7 +59,8 @@ class AbstractCaret: """Attribute of AbstractTab for caret browsing.""" - def __init__(self, win_id): + def __init__(self, win_id, tab): + self._tab = tab self._win_id = win_id self.widget = None self.selection_enabled = False @@ -259,7 +260,7 @@ class AbstractTab(QWidget): super().__init__(parent) self.history = AbstractHistory(self) self.scroll = AbstractScroller(parent=self) - self.caret = AbstractCaret(win_id=win_id) + self.caret = AbstractCaret(win_id=win_id, tab=self) self._layout = None self._widget = None self.keep_icon = False # FIXME:refactor get rid of this? @@ -316,6 +317,12 @@ class AbstractTab(QWidget): def icon(self): raise NotImplementedError + def has_selection(self): + raise NotImplementedError + + def selection(self, html=False): + raise NotImplementedError + def __repr__(self): url = utils.elide(self.cur_url.toDisplayString(QUrl.EncodeUnicode), 100) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 5ae2974b9..1d07058ea 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -83,7 +83,7 @@ class WebEngineViewTab(tab.AbstractTab): widget = QWebEngineView() self.history = WebEngineHistory(self) self.scroll = WebEngineScroller() - self.caret = WebEngineCaret(win_id=win_id) + self.caret = WebEngineCaret(win_id=win_id, tab=self) self._set_widget(widget) self._connect_signals() @@ -134,6 +134,14 @@ class WebEngineViewTab(tab.AbstractTab): def icon(self): return self._widget.icon() + def has_selection(self): + return self._widget.hasSelection() + + def selection(self, html=False): + if html: + raise NotImplementedError + return self._widget.selectedText() + def _connect_signals(self): view = self._widget page = view.page() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 70eb79b22..269195ffd 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -40,7 +40,7 @@ class WebViewCaret(tab.AbstractCaret): settings = self.widget.settings() settings.setAttribute(QWebSettings.CaretBrowsingEnabled, True) - self.selection_enabled = bool(self.widget.page().selectedText()) + self.selection_enabled = bool(self._tab.selection()) if self.widget.isVisible(): # Sometimes the caret isn't immediately visible, but unfocusing @@ -53,8 +53,7 @@ class WebViewCaret(tab.AbstractCaret): # # Note: We can't use hasSelection() here, as that's always # true in caret mode. - if not self.widget.page().selectedText(): - # FIXME use self.tab here + if not self._tab.selection(): self.widget.page().currentFrame().evaluateJavaScript( utils.read_file('javascript/position_caret.js')) @@ -353,7 +352,7 @@ class WebViewTab(tab.AbstractTab): widget = webview.WebView(win_id, self.tab_id) self.history = WebViewHistory(self) self.scroll = WebViewScroller(parent=self) - self.caret = WebViewCaret(win_id=win_id) + self.caret = WebViewCaret(win_id=win_id, tab=self) self._set_widget(widget) self._connect_signals() @@ -404,6 +403,14 @@ class WebViewTab(tab.AbstractTab): def zoom_factor(self): return self._widget.zoomFactor() + def has_selection(self): + return self._widget.hasSelection() + + def selection(self, html=False): + if html: + return self._widget.selectedHtml() + return self._widget.selectedText() + def _connect_signals(self): view = self._widget page = view.page()