From b11910032107c2b5203bf48dd21c90728a18c790 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Sep 2014 20:21:43 +0200 Subject: [PATCH] Get rid of _tabs attribute in CommandDispatcher. --- qutebrowser/browser/commands.py | 130 ++++++++++++++------------- qutebrowser/widgets/tabbedbrowser.py | 4 +- 2 files changed, 72 insertions(+), 62 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index da0e9a9dd..25e6e0d8f 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -55,21 +55,31 @@ class CommandDispatcher: _editor: The ExternalEditor object. """ - def __init__(self, parent): - """Constructor. - - Args: - parent: The TabbedBrowser for this dispatcher. - """ - self._tabs = parent + def __init__(self): self._editor = None def __repr__(self): return '<{}>'.format(self.__class__.__name__) + def _count(self): + """Convenience method to get the widget count.""" + return objreg.get('tabbed-browser').count() + + def _set_current_index(self, idx): + """Convenience method to set the current widget index.""" + return objreg.get('tabbed-browser').setCurrentIndex(idx) + + def _current_index(self): + """Convenience method to get the current widget index.""" + return objreg.get('tabbed-browser').currentIndex() + + def _current_url(self): + """Convenience method to get the current url.""" + return objreg.get('tabbed-browser').current_url() + def _current_widget(self): """Get the currently active widget from a command.""" - widget = self._tabs.currentWidget() + widget = objreg.get('tabbed-browser').currentWidget() if widget is None: raise cmdexc.CommandError("No WebView available yet!") return widget @@ -82,12 +92,13 @@ class CommandDispatcher: tab: Whether to open in a new tab. background: Whether to open in the background. """ + tabbed_browser = objreg.get('tabbed-browser') if tab and background: raise cmdexc.CommandError("Only one of -t/-b can be given!") elif tab: - self._tabs.tabopen(url, background=False, explicit=True) + tabbed_browser.tabopen(url, background=False, explicit=True) elif background: - self._tabs.tabopen(url, background=True, explicit=True) + tabbed_browser.tabopen(url, background=True, explicit=True) else: widget = self._current_widget() widget.openurl(url) @@ -103,15 +114,15 @@ class CommandDispatcher: The widget with the given tab ID if count is given. None if no widget was found. """ + tabbed_browser = objreg.get('tabbed-browser') if count is None: - return self._tabs.currentWidget() - elif 1 <= count <= self._tabs.count(): + return tabbed_browser.currentWidget() + elif 1 <= count <= self._count(): cmdutils.check_overflow(count + 1, 'int') - return self._tabs.widget(count - 1) + return tabbed_browser.widget(count - 1) else: return None - def _scroll_percent(self, perc=None, count=None, orientation=None): """Inner logic for scroll_percent_(x|y). @@ -140,7 +151,7 @@ class CommandDispatcher: if idx is None: return 0 elif idx == 0: - return self._tabs.count() - 1 + return self._count() - 1 else: return idx - 1 @@ -156,9 +167,9 @@ class CommandDispatcher: # gets called from tab_move which has delta set to None by default. delta = 1 if direction == '-': - return self._tabs.currentIndex() - delta + return self._current_index() - delta elif direction == '+': - return self._tabs.currentIndex() + delta + return self._current_index() + delta def _tab_focus_last(self): """Select the tab which was last focused.""" @@ -166,10 +177,10 @@ class CommandDispatcher: tab = objreg.get('last-focused-tab') except KeyError: raise cmdexc.CommandError("No last focused tab!") - idx = self._tabs.indexOf(tab) + idx = objreg.get('tabbed-browser').indexOf(tab) if idx == -1: raise cmdexc.CommandError("Last focused tab vanished!") - self._tabs.setCurrentIndex(idx) + self._set_current_index(idx) def _editor_cleanup(self, oshandle, filename): """Clean up temporary file when the editor was closed.""" @@ -193,7 +204,7 @@ class CommandDispatcher: tab = self._cntwidget(count) if tab is None: return - self._tabs.close_tab(tab) + objreg.get('tabbed-browser').close_tab(tab) @cmdutils.register(instance='command-dispatcher', name='open', split=False) @@ -210,17 +221,15 @@ class CommandDispatcher: url = urlutils.fuzzy_url(url) except urlutils.FuzzyUrlError as e: raise cmdexc.CommandError(e) - if tab: - self._tabs.tabopen(url, background=False, explicit=True) - elif bg: - self._tabs.tabopen(url, background=True, explicit=True) + if tab or bg: + self._open(url, tab, bg) else: curtab = self._cntwidget(count) if curtab is None: if count is None: # We want to open a URL in the current tab, but none exists # yet. - self._tabs.tabopen(url) + objreg.get('tabbed-browser').tabopen(url) else: # Explicit count with a tab that doesn't exist. return @@ -334,8 +343,8 @@ class CommandDispatcher: frame = widget.page().mainFrame() if frame is None: raise cmdexc.CommandError("No frame focused!") - widget.hintmanager.start(frame, self._tabs.current_url(), group, - target, *args) + widget.hintmanager.start(frame, self._current_url(), group, target, + *args) @cmdutils.register(instance='command-dispatcher', hide=True) def follow_hint(self): @@ -412,7 +421,7 @@ class CommandDispatcher: """ widget = self._current_widget() frame = widget.page().currentFrame() - url = self._tabs.current_url() + url = self._current_url() if frame is None: raise cmdexc.CommandError("No frame focused!") if where == 'prev': @@ -487,9 +496,9 @@ class CommandDispatcher: """ clipboard = QApplication.clipboard() if title: - s = self._tabs.tabText(self._tabs.currentIndex()) + s = objreg.get('tabbed-browser').tabText(self._current_index()) else: - s = self._tabs.current_url().toString( + s = self._current_url().toString( QUrl.FullyEncoded | QUrl.RemovePassword) if sel and clipboard.supportsSelection(): mode = QClipboard.Selection @@ -543,17 +552,18 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher') def tab_only(self): """Close all tabs except for the current one.""" - for tab in self._tabs.widgets(): + tabbed_browser = objreg.get('tabbed-browser') + for tab in tabbed_browser.widgets(): if tab is self._current_widget(): continue - self._tabs.close_tab(tab) + tabbed_browser.close_tab(tab) @cmdutils.register(instance='command-dispatcher') def undo(self): """Re-open a closed tab (optionally skipping [count] closed tabs).""" url_stack = objreg.get('url-stack', None) if url_stack: - self._tabs.tabopen(url_stack.pop()) + objreg.get('tabbed-browser').tabopen(url_stack.pop()) else: raise cmdexc.CommandError("Nothing to undo!") @@ -564,11 +574,11 @@ class CommandDispatcher: Args: count: How many tabs to switch back. """ - newidx = self._tabs.currentIndex() - count + newidx = self._current_index() - count if newidx >= 0: - self._tabs.setCurrentIndex(newidx) + self._set_current_index(newidx) elif config.get('tabs', 'wrap'): - self._tabs.setCurrentIndex(newidx % self._tabs.count()) + self._set_current_index(newidx % self._count()) else: raise cmdexc.CommandError("First tab") @@ -579,11 +589,11 @@ class CommandDispatcher: Args: count: How many tabs to switch forward. """ - newidx = self._tabs.currentIndex() + count - if newidx < self._tabs.count(): - self._tabs.setCurrentIndex(newidx) + newidx = self._current_index() + count + if newidx < self._count(): + self._set_current_index(newidx) elif config.get('tabs', 'wrap'): - self._tabs.setCurrentIndex(newidx % self._tabs.count()) + self._set_current_index(newidx % self._count()) else: raise cmdexc.CommandError("Last tab") @@ -627,12 +637,12 @@ class CommandDispatcher: return try: idx = cmdutils.arg_or_count(index, count, default=1, - countzero=self._tabs.count()) + countzero=self._count()) except ValueError as e: raise cmdexc.CommandError(e) cmdutils.check_overflow(idx + 1, 'int') - if 1 <= idx <= self._tabs.count(): - self._tabs.setCurrentIndex(idx - 1) + if 1 <= idx <= self._count(): + self._set_current_index(idx - 1) else: raise cmdexc.CommandError("There's no tab with index {}!".format( idx)) @@ -658,22 +668,23 @@ class CommandDispatcher: else: raise cmdexc.CommandError("Invalid direction '{}'!".format( direction)) - if not 0 <= new_idx < self._tabs.count(): + if not 0 <= new_idx < self._count(): raise cmdexc.CommandError("Can't move tab to position {}!".format( new_idx)) + tabbed_browser = objreg.get('tabbed-browser') tab = self._current_widget() - cur_idx = self._tabs.currentIndex() - icon = self._tabs.tabIcon(cur_idx) - label = self._tabs.tabText(cur_idx) + cur_idx = self._current_index() + icon = tabbed_browser.tabIcon(cur_idx) + label = tabbed_browser.tabText(cur_idx) cmdutils.check_overflow(cur_idx, 'int') cmdutils.check_overflow(new_idx, 'int') - self._tabs.setUpdatesEnabled(False) + tabbed_browser.setUpdatesEnabled(False) try: - self._tabs.removeTab(cur_idx) - self._tabs.insertTab(new_idx, tab, icon, label) - self._tabs.setCurrentIndex(new_idx) + tabbed_browser.removeTab(cur_idx) + tabbed_browser.insertTab(new_idx, tab, icon, label) + self._set_current_index(new_idx) finally: - self._tabs.setUpdatesEnabled(True) + tabbed_browser.setUpdatesEnabled(True) @cmdutils.register(instance='command-dispatcher', split=False) def spawn(self, *args): @@ -706,13 +717,12 @@ class CommandDispatcher: cmd: The userscript to run. args: Arguments to pass to the userscript. """ - url = self._tabs.current_url() - userscripts.run(cmd, *args, url=url) + userscripts.run(cmd, *args, url=self._current_url()) @cmdutils.register(instance='command-dispatcher') def quickmark_save(self): """Save the current page as a quickmark.""" - quickmarks.prompt_save(self._tabs.current_url()) + quickmarks.prompt_save(self._current_url()) @cmdutils.register(instance='command-dispatcher') def quickmark_load(self, name, tab=False, bg=False): @@ -756,7 +766,8 @@ class CommandDispatcher: def download_page(self): """Download the current page.""" page = self._current_widget().page() - self._tabs.download_get.emit(self._tabs.current_url(), page) + tabbed_browser = objreg.get('tabbed-browser') + tabbed_browser.download_get.emit(self._current_url(), page) @cmdutils.register(instance='command-dispatcher') def view_source(self): @@ -767,14 +778,13 @@ class CommandDispatcher: if widget.viewing_source: raise cmdexc.CommandError("Already viewing source!") frame = widget.page().currentFrame() - url = self._tabs.current_url() html = frame.toHtml() lexer = pygments.lexers.HtmlLexer() formatter = pygments.formatters.HtmlFormatter( full=True, linenos='table') highlighted = pygments.highlight(html, lexer, formatter) - tab = self._tabs.tabopen(explicit=True) - tab.setHtml(highlighted, url) + tab = objreg.get('tabbed-browser').tabopen(explicit=True) + tab.setHtml(highlighted, self._current_url()) tab.viewing_source = True @cmdutils.register(instance='command-dispatcher', name='help', @@ -840,7 +850,7 @@ class CommandDispatcher: text = str(elem) else: text = elem.evaluateJavaScript('this.value') - self._editor = editor.ExternalEditor(self._tabs) + self._editor = editor.ExternalEditor(objreg.get('tabbed-browser')) self._editor.editing_finished.connect( partial(self.on_editing_finished, elem)) self._editor.edit(text) diff --git a/qutebrowser/widgets/tabbedbrowser.py b/qutebrowser/widgets/tabbedbrowser.py index 171985933..ef91eb665 100644 --- a/qutebrowser/widgets/tabbedbrowser.py +++ b/qutebrowser/widgets/tabbedbrowser.py @@ -27,7 +27,7 @@ from PyQt5.QtGui import QIcon from PyQt5.QtWebKitWidgets import QWebPage from qutebrowser.config import config -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.commands import cmdexc from qutebrowser.keyinput import modeman from qutebrowser.widgets import tabwidget, webview from qutebrowser.browser import signalfilter, commands @@ -109,7 +109,7 @@ class TabbedBrowser(tabwidget.TabWidget): self._url_stack = [] objreg.register('url-stack', self._url_stack) self._filter = signalfilter.SignalFilter(self) - dispatcher = commands.CommandDispatcher(self) + dispatcher = commands.CommandDispatcher() objreg.register('command-dispatcher', dispatcher) self._now_focused = None # FIXME adjust this to font size