diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py index 0bd6b04c9..0ad17fa7e 100644 --- a/qutebrowser/completion/completionwidget.py +++ b/qutebrowser/completion/completionwidget.py @@ -26,7 +26,7 @@ subclasses to provide completions. from PyQt5.QtWidgets import QStyle, QTreeView, QSizePolicy from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QItemSelectionModel -from qutebrowser.commands import cmdutils +from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.config import config, style from qutebrowser.completion import completiondelegate, completer from qutebrowser.utils import usertypes, qtutils, objreg, utils @@ -245,6 +245,15 @@ class CompletionView(QTreeView): """Select the next completion item.""" self._next_prev_item(prev=False) + @cmdutils.register(instance='completion', hide=True, + modes=[usertypes.KeyMode.command], scope='window') + def completion_item_del(self): + """Delete the current completion item.""" + try: + self.model().srcmodel.delete_cur_item(self._win_id) + except NotImplementedError: + raise cmdexc.CommandError("Cannot delete this item.") + def selectionChanged(self, selected, deselected): """Extend selectionChanged to call completers selection_changed.""" super().selectionChanged(selected, deselected) diff --git a/qutebrowser/completion/models/base.py b/qutebrowser/completion/models/base.py index 8c79910db..7f1e0c7d6 100644 --- a/qutebrowser/completion/models/base.py +++ b/qutebrowser/completion/models/base.py @@ -95,6 +95,10 @@ class BaseCompletionModel(QStandardItemModel): nameitem.setData(userdata, Role.userdata) return nameitem, descitem, miscitem + def delete_cur_item(self, win_id): + """Delete the selected item.""" + raise NotImplementedError + def flags(self, index): """Return the item flags for index. diff --git a/qutebrowser/completion/models/urlmodel.py b/qutebrowser/completion/models/urlmodel.py index d0d603c19..46db1d54c 100644 --- a/qutebrowser/completion/models/urlmodel.py +++ b/qutebrowser/completion/models/urlmodel.py @@ -23,7 +23,7 @@ import datetime from PyQt5.QtCore import pyqtSlot, Qt -from qutebrowser.utils import objreg, utils +from qutebrowser.utils import message, objreg, utils from qutebrowser.completion.models import base from qutebrowser.config import config @@ -174,3 +174,27 @@ class UrlCompletionModel(base.BaseCompletionModel): if url_item.data(Qt.DisplayRole) == url: self._bookmark_cat.removeRow(i) break + + def delete_cur_item(self, win_id): + """Delete the selected item. + + Args: + win_id: The current windows id. + """ + completion = objreg.get('completion', scope='window', + window=win_id) + index = completion.currentIndex() + model = completion.model() + url = model.data(index) + category = index.parent() + if category.isValid(): + if category.data() == 'Bookmarks': + bookmark_manager = objreg.get('bookmark-manager') + bookmark_manager.bookmark_del(url) + message.info(win_id, "Bookmarks deleted") + elif category.data() == 'Quickmarks': + quickmark_manager = objreg.get('quickmark-manager') + name = model.data(index.sibling(index.row(), + index.column() + 1)) + quickmark_manager.quickmark_del(name) + message.info(win_id, "Quickmarks deleted") diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 6149ba577..3f4fdb690 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -1280,6 +1280,7 @@ KEY_DATA = collections.OrderedDict([ ('command-history-next', ['']), ('completion-item-prev', ['', '']), ('completion-item-next', ['', '']), + ('completion-item-del', ['']), ('command-accept', RETURN_KEYS), ])), diff --git a/qutebrowser/mainwindow/statusbar/command.py b/qutebrowser/mainwindow/statusbar/command.py index 86b761fdc..1d8105c2f 100644 --- a/qutebrowser/mainwindow/statusbar/command.py +++ b/qutebrowser/mainwindow/statusbar/command.py @@ -26,7 +26,7 @@ from qutebrowser.keyinput import modeman, modeparsers from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.misc import cmdhistory from qutebrowser.misc import miscwidgets as misc -from qutebrowser.utils import message, usertypes, log, objreg, qtutils +from qutebrowser.utils import usertypes, log, objreg, qtutils class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): @@ -211,31 +211,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): e.ignore() return else: - if e.key() == Qt.Key_D and (e.modifiers() & Qt.ControlModifier == - Qt.ControlModifier): - self.delete_current_item() - else: - super().keyPressEvent(e) - - def delete_current_item(self): - """Delete the selected bookmark/quickmark.""" - completion = objreg.get('completion', scope='window', - window=self._win_id) - index = completion.currentIndex() - model = completion.model() - url = model.data(index) - category = index.parent() - if category.isValid(): - if category.data() == 'Bookmarks': - bookmark_manager = objreg.get('bookmark-manager') - bookmark_manager.bookmark_del(url) - message.info(self._win_id, "Bookmarks deleted") - elif category.data() == 'Quickmarks': - quickmark_manager = objreg.get('quickmark-manager') - name = model.data(index.sibling(index.row(), - index.column() + 1)) - quickmark_manager.quickmark_del(name) - message.info(self._win_id, "Quickmarks deleted") + super().keyPressEvent(e) def sizeHint(self): """Dynamically calculate the needed size."""