diff --git a/qutebrowser/browser/quickmarks.py b/qutebrowser/browser/quickmarks.py index b41c9888f..578738ceb 100644 --- a/qutebrowser/browser/quickmarks.py +++ b/qutebrowser/browser/quickmarks.py @@ -43,9 +43,19 @@ class QuickmarkManager(QObject): marks: An OrderedDict of all quickmarks. _lineparser: The LineParser used for the quickmarks, or None (when qutebrowser is started with -c ''). + + Signals: + changed: Emitted when anything changed. + added: Emitted when a new quickmark was added. + arg 0: The name of the quickmark. + arg 1: The URL of the quickmark, as string. + removed: Emitted when an existing quickmark was removed. + arg 0: The name of the quickmark. """ changed = pyqtSignal() + added = pyqtSignal(str, str) + removed = pyqtSignal(str) def __init__(self, parent=None): """Initialize and read quickmarks.""" @@ -117,6 +127,7 @@ class QuickmarkManager(QObject): """Really set the quickmark.""" self.marks[name] = url self.changed.emit() + self.added.emit(name, url) if name in self.marks: message.confirm_async( @@ -138,6 +149,7 @@ class QuickmarkManager(QObject): raise cmdexc.CommandError("Quickmark '{}' not found!".format(name)) else: self.changed.emit() + self.removed.emit(name) def get(self, name): """Get the URL of the quickmark named name as a QUrl.""" diff --git a/qutebrowser/completion/models/urlmodel.py b/qutebrowser/completion/models/urlmodel.py index 100defbf1..e8898ec85 100644 --- a/qutebrowser/completion/models/urlmodel.py +++ b/qutebrowser/completion/models/urlmodel.py @@ -21,7 +21,7 @@ import datetime -from PyQt5.QtCore import pyqtSlot +from PyQt5.QtCore import pyqtSlot, Qt from qutebrowser.utils import objreg, utils from qutebrowser.completion.models import base @@ -42,20 +42,21 @@ class UrlCompletionModel(base.BaseCompletionModel): self._quickmark_cat = self.new_category("Quickmarks") self._history_cat = self.new_category("History") - quickmarks = objreg.get('quickmark-manager').marks.items() - self._history = objreg.get('web-history') - + quickmark_manager = objreg.get('quickmark-manager') + quickmarks = quickmark_manager.marks.items() for qm_name, qm_url in quickmarks: - self.new_item(self._quickmark_cat, qm_url, qm_name) + self._add_quickmark_entry(qm_name, qm_url) + quickmark_manager.added.connect(self.on_quickmark_added) + quickmark_manager.removed.connect(self.on_quickmark_removed) + self._history = objreg.get('web-history') max_history = config.get('completion', 'web-history-max-items') history = utils.newest_slice(self._history, max_history) - for entry in history: self._add_history_entry(entry) - self._history.item_about_to_be_added.connect( self.on_history_item_added) + objreg.get('config').changed.connect(self.reformat_timestamps) def _fmt_atime(self, atime): @@ -71,6 +72,15 @@ class UrlCompletionModel(base.BaseCompletionModel): self._fmt_atime(entry.atime), sort=int(entry.atime), userdata=entry.url) + def _add_quickmark_entry(self, name, url): + """Add a new quickmark entry to the completion. + + Args: + name: The name of the new quickmark. + url: The URL of the new quickmark. + """ + self.new_item(self._quickmark_cat, url, name) + @config.change_filter('completion', 'timestamp-format') def reformat_timestamps(self): """Reformat the timestamps if the config option was changed.""" @@ -93,3 +103,26 @@ class UrlCompletionModel(base.BaseCompletionModel): break else: self._add_history_entry(entry) + + @pyqtSlot(str, str) + def on_quickmark_added(self, name, url): + """Called when a quickmark has been added by the user. + + Args: + name: The name of the new quickmark. + url: The url of the new quickmark, as string. + """ + self._add_quickmark_entry(name, url) + + @pyqtSlot(str) + def on_quickmark_removed(self, name): + """Called when a quickmark has been removed by the user. + + Args: + name: The name of the quickmark which has been removed. + """ + for i in range(self._quickmark_cat.rowCount()): + name_item = self._quickmark_cat.child(i, 1) + if name_item.data(Qt.DisplayRole) == name: + self._quickmark_cat.removeRow(i) + break