diff --git a/qutebrowser/completion/completer.py b/qutebrowser/completion/completer.py index 569e105be..d6d33ed94 100644 --- a/qutebrowser/completion/completer.py +++ b/qutebrowser/completion/completer.py @@ -23,7 +23,7 @@ from PyQt5.QtCore import pyqtSlot, QObject, QTimer, QItemSelection from qutebrowser.config import config from qutebrowser.commands import cmdutils, runners -from qutebrowser.utils import usertypes, log, objreg, utils +from qutebrowser.utils import usertypes, log, utils from qutebrowser.completion.models import instances, sortfilter @@ -40,8 +40,6 @@ class Completer(QObject): _last_cursor_pos: The old cursor position so we avoid double completion updates. _last_text: The old command text so we avoid double completion updates. - _signals_connected: Whether the signals are connected to update the - completion when the command widget requests that. """ def __init__(self, cmd, win_id, parent=None): @@ -58,64 +56,12 @@ class Completer(QObject): self._cursor_part = None self._last_cursor_pos = None self._last_text = None - - objreg.get('config').changed.connect(self._on_auto_open_changed) - self._handle_signal_connections() - self._cmd.clear_completion_selection.connect( - self._handle_signal_connections) + self._cmd.update_completion.connect(self.schedule_completion_update) + self._cmd.textChanged.connect(self._on_text_edited) def __repr__(self): return utils.get_repr(self) - @config.change_filter('completion', 'auto-open') - def _on_auto_open_changed(self): - self._handle_signal_connections() - - @pyqtSlot() - def _handle_signal_connections(self): - self._connect_signals(config.get('completion', 'auto-open')) - - def _connect_signals(self, connect=True): - """Connect or disconnect the completion signals. - - Args: - connect: Whether to connect (True) or disconnect (False) the - signals. - - Return: - True if the signals were connected (connect=True and aren't - connected yet) - otherwise False. - """ - connections = [ - (self._cmd.update_completion, self.schedule_completion_update), - (self._cmd.textChanged, self._on_text_edited), - ] - - if connect and not self._signals_connected: - for sender, receiver in connections: - sender.connect(receiver) - self._signals_connected = True - return True - elif not connect: - for sender, receiver in connections: - try: - sender.disconnect(receiver) - except TypeError: - # Don't fail if not connected - pass - self._signals_connected = False - return False - - def _open_completion_if_needed(self): - """If auto-open is false, temporarily connect signals. - - Also opens the completion. - """ - if not config.get('completion', 'auto-open'): - connected = self._connect_signals(True) - if connected: - self._update_completion() - def _model(self): """Convenience method to get the current completion model.""" completion = self.parent() @@ -244,7 +190,6 @@ class Completer(QObject): selected: New selection. _deselected: Previous selection. """ - self._open_completion_if_needed() indexes = selected.indexes() if not indexes: return @@ -335,10 +280,6 @@ class Completer(QObject): if self._model().count() == 0: completion.hide() - return - - if completion.enabled: - completion.show() def _split(self, keep=False): """Get the text split up in parts. diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py index 3c608951f..b6ee2cc65 100644 --- a/qutebrowser/completion/completionwidget.py +++ b/qutebrowser/completion/completionwidget.py @@ -30,7 +30,7 @@ from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QItemSelectionModel, from qutebrowser.config import config, style from qutebrowser.completion import completiondelegate from qutebrowser.completion.models import base -from qutebrowser.utils import objreg, utils, usertypes +from qutebrowser.utils import utils, usertypes from qutebrowser.commands import cmdexc, cmdutils @@ -42,7 +42,6 @@ class CompletionView(QTreeView): headers, and children show as flat list. Attributes: - enabled: Whether showing the CompletionView is enabled. _win_id: The ID of the window this CompletionView is associated with. _height: The height to use for the CompletionView. _height_perc: Either None or a percentage if height should be relative. @@ -109,8 +108,6 @@ class CompletionView(QTreeView): def __init__(self, win_id, parent=None): super().__init__(parent) self._win_id = win_id - self.enabled = config.get('completion', 'show') - objreg.get('config').changed.connect(self.set_enabled) # FIXME handle new aliases. # objreg.get('config').changed.connect(self.init_command_completion) @@ -190,11 +187,7 @@ class CompletionView(QTreeView): Args: which: 'next' or 'prev' """ - # selmodel can be None if 'show' and 'auto-open' are set to False - # https://github.com/The-Compiler/qutebrowser/issues/1731 selmodel = self.selectionModel() - if selmodel is None: - return idx = self._next_idx(which == 'prev') if not idx.isValid(): @@ -203,6 +196,9 @@ class CompletionView(QTreeView): selmodel.setCurrentIndex( idx, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) + if config.get('completion', 'show'): + self.show() + def set_model(self, model): """Switch completion to a new model. @@ -211,6 +207,12 @@ class CompletionView(QTreeView): Args: model: The model to use. """ + if (config.get('completion', 'auto-open') and + config.get('completion', 'show')): + self.show() + else: + self.hide() + old_model = self.model() sel_model = self.selectionModel() @@ -245,14 +247,10 @@ class CompletionView(QTreeView): if config.get('completion', 'shrink'): self.resize_completion.emit() - @config.change_filter('completion', 'show') - def set_enabled(self): - """Update self.enabled when the config changed.""" - self.enabled = config.get('completion', 'show') - @pyqtSlot() def on_clear_completion_selection(self): """Clear the selection model when an item is activated.""" + self.hide() selmod = self.selectionModel() if selmod is not None: selmod.clearSelection() diff --git a/tests/unit/completion/test_completionwidget.py b/tests/unit/completion/test_completionwidget.py index f07bfc96b..3d7c082ea 100644 --- a/tests/unit/completion/test_completionwidget.py +++ b/tests/unit/completion/test_completionwidget.py @@ -145,13 +145,3 @@ def test_completion_item_focus(tree, count, expected, completionview): completionview.completion_item_focus(direction) idx = completionview.selectionModel().currentIndex() assert filtermodel.data(idx) == expected - - -def test_completion_item_focus_no_model(completionview): - """Test that next/prev won't crash with no model set. - - This can happen if completion.show and completion.auto-open are False. - Regression test for issue #1722. - """ - completionview.completion_item_focus('prev') - completionview.completion_item_focus('next')