From 777e93bd3f2217f88d640d740041cf9d74db7fed Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 14 Oct 2014 22:26:57 +0200 Subject: [PATCH 01/16] quickmarks completion It works, but: * terrible performance (5s for ~1600 marks) * split and join operations in the loop - i want direct access to name + url in the marks dict! how? --- qutebrowser/browser/commands.py | 3 ++- qutebrowser/models/completion.py | 28 ++++++++++++++++++++++++++++ qutebrowser/utils/completer.py | 8 ++++++++ qutebrowser/utils/usertypes.py | 2 +- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 333195d6e..0fc7c4ea8 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -817,7 +817,8 @@ class CommandDispatcher: """Save the current page as a quickmark.""" quickmarks.prompt_save(self._win_id, self._current_url()) - @cmdutils.register(instance='command-dispatcher', scope='window') + @cmdutils.register(instance='command-dispatcher', scope='window', + completion=[usertypes.Completion.quickmark]) def quickmark_load(self, name, tab=False, bg=False, window=False): """Load a quickmark. diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 98bf46635..e40a0bed7 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -25,6 +25,7 @@ from qutebrowser.config import config, configdata from qutebrowser.models import basecompletion from qutebrowser.utils import log, qtutils, objreg from qutebrowser.commands import cmdutils +from qutebrowser.browser import quickmarks class SettingSectionCompletionModel(basecompletion.BaseCompletionModel): @@ -192,3 +193,30 @@ class HelpCompletionModel(basecompletion.BaseCompletionModel): desc = desc.splitlines()[0] name = '{}->{}'.format(sectname, optname) self.new_item(cat, name, desc) + + +class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): + + """A CompletionModel filled with all quickmarks.""" + + # pylint: disable=abstract-method + + def __init__(self, parent=None): + super().__init__(parent) + assert cmdutils.cmd_dict + + qmlist = [] + for qm in quickmarks.marks.items(): + # strange. in qm[0] is the first word of the quickmark, + # in qm[1] the rest. I have to split the url manually. + # omg help wtf bbq! FIXME + + qm_splitter = str(qm[0] + ' ' + qm[1]).split(' ') + qm_name = ' '.join(qm_splitter[:-1]) + qm_url = qm_splitter[-1] + qmlist.append((qm_url, qm_name)) + + cat = self.new_category("Quickmarks") + for (name, desc) in sorted(qmlist): + self.new_item(cat, name, desc) + diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index b3202bcf4..ec8add8c9 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -61,6 +61,7 @@ class Completer(QObject): } self._init_static_completions() self._init_setting_completions() + self._init_quickmark_completions() def __repr__(self): return utils.get_repr(self) @@ -94,6 +95,13 @@ class Completer(QObject): self._models[usertypes.Completion.value][sectname][opt] = CFM( model, self) + def _init_quickmark_completions(self): + """Initialize the quickmark completion models.""" + self._models[usertypes.Completion.quickmark] = CFM( + models.QuickmarkCompletionModel(self), self) + self._models[usertypes.Completion.helptopic] = CFM( + models.HelpCompletionModel(self), self) + def _get_new_completion(self, parts, cursor_part): """Get a new completion model. diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 409fac36c..7bcb0ef7d 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -230,7 +230,7 @@ KeyMode = enum('KeyMode', ['normal', 'hint', 'command', 'yesno', 'prompt', # Available command completions Completion = enum('Completion', ['command', 'section', 'option', 'value', - 'helptopic']) + 'helptopic', 'quickmark']) class Question(QObject): From 167e01160c01d1f5147d93f8a0b4bc6957154e32 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 15 Oct 2014 11:59:01 +0200 Subject: [PATCH 02/16] minor copy paste fails --- qutebrowser/models/completion.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index e40a0bed7..fe2404235 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -203,7 +203,6 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): def __init__(self, parent=None): super().__init__(parent) - assert cmdutils.cmd_dict qmlist = [] for qm in quickmarks.marks.items(): @@ -217,6 +216,6 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): qmlist.append((qm_url, qm_name)) cat = self.new_category("Quickmarks") - for (name, desc) in sorted(qmlist): + for (name, desc) in qmlist: self.new_item(cat, name, desc) From f4c7c1d5a077bda0ade1a9b5f1351050c39ee89c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 15 Oct 2014 12:04:37 +0200 Subject: [PATCH 03/16] der Sensemann --- qutebrowser/browser/quickmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/quickmarks.py b/qutebrowser/browser/quickmarks.py index e6b4f52a5..4e7886aba 100644 --- a/qutebrowser/browser/quickmarks.py +++ b/qutebrowser/browser/quickmarks.py @@ -21,7 +21,7 @@ Note we violate our general QUrl rule by storing url strings in the marks OrderedDict. This is because we read them from a file at start and write them -to a file on shutdown, so it makes semse to keep them as strings here. +to a file on shutdown, so it makes sense to keep them as strings here. """ import functools From 621388e5e074ded06700fec0171e9b571fa826c8 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 15 Oct 2014 12:08:37 +0200 Subject: [PATCH 04/16] init quickmark completion in init_static --- qutebrowser/utils/completer.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index ec8add8c9..daa069286 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -61,7 +61,6 @@ class Completer(QObject): } self._init_static_completions() self._init_setting_completions() - self._init_quickmark_completions() def __repr__(self): return utils.get_repr(self) @@ -78,6 +77,8 @@ class Completer(QObject): models.CommandCompletionModel(self), self) self._models[usertypes.Completion.helptopic] = CFM( models.HelpCompletionModel(self), self) + self._models[usertypes.Completion.quickmark] = CFM( + models.QuickmarkCompletionModel(self), self) def _init_setting_completions(self): """Initialize setting completion models.""" @@ -95,13 +96,6 @@ class Completer(QObject): self._models[usertypes.Completion.value][sectname][opt] = CFM( model, self) - def _init_quickmark_completions(self): - """Initialize the quickmark completion models.""" - self._models[usertypes.Completion.quickmark] = CFM( - models.QuickmarkCompletionModel(self), self) - self._models[usertypes.Completion.helptopic] = CFM( - models.HelpCompletionModel(self), self) - def _get_new_completion(self, parts, cursor_part): """Get a new completion model. From 37023fe896711df2c740743b93d048c1d5ae1574 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 15 Oct 2014 12:16:05 +0200 Subject: [PATCH 05/16] Improved qmarks model filling thx to the fix from The-Compiler! --- qutebrowser/models/completion.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index fe2404235..887b3a793 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -205,14 +205,7 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): super().__init__(parent) qmlist = [] - for qm in quickmarks.marks.items(): - # strange. in qm[0] is the first word of the quickmark, - # in qm[1] the rest. I have to split the url manually. - # omg help wtf bbq! FIXME - - qm_splitter = str(qm[0] + ' ' + qm[1]).split(' ') - qm_name = ' '.join(qm_splitter[:-1]) - qm_url = qm_splitter[-1] + for qm_name, qm_url in quickmarks.marks.items(): qmlist.append((qm_url, qm_name)) cat = self.new_category("Quickmarks") From 36328a01a420ff4bd4a1240eca07fb19c5b1bf8e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 17 Oct 2014 21:39:28 +0200 Subject: [PATCH 06/16] updating code according to https://github.com/The-Compiler/qutebrowser/pull/189#issuecomment-59220531 --- qutebrowser/app.py | 3 +++ qutebrowser/models/completion.py | 2 +- qutebrowser/utils/completer.py | 41 +++++++++++++++++++------------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 6d10d6b6b..7038e0c08 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -343,6 +343,9 @@ class Application(QApplication): self.lastWindowClosed.connect(self.shutdown) config_obj.style_changed.connect(style.get_stylesheet.cache_clear) self.focusChanged.connect(self.on_focus_changed) + quickmark_model = objreg.get('completer').models[usertypes.Completion.quickmark] + quickmark_manager = objreg.get('quickmark-manager') + quickmark_manager.changed.connect(quickmark_model.on_quickmarks.changed) def _get_widgets(self): """Get a string list of all widgets.""" diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 887b3a793..fe9bf6bb1 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -205,7 +205,7 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): super().__init__(parent) qmlist = [] - for qm_name, qm_url in quickmarks.marks.items(): + for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): qmlist.append((qm_url, qm_name)) cat = self.new_category("Quickmarks") diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index e2935f269..0515119aa 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -36,7 +36,7 @@ class Completer(QObject): Attributes: _ignore_change: Whether to ignore the next completion update. - _models: dict of available completion models. + models: dict of available completion models. _win_id: The window ID this completer is in. Signals: @@ -55,12 +55,13 @@ class Completer(QObject): self._win_id = win_id self._ignore_change = False - self._models = { + self.models = { usertypes.Completion.option: {}, usertypes.Completion.value: {}, } self._init_static_completions() self._init_setting_completions() + self._init_quickmark_completions() def __repr__(self): return utils.get_repr(self) @@ -73,29 +74,32 @@ class Completer(QObject): def _init_static_completions(self): """Initialize the static completion models.""" - self._models[usertypes.Completion.command] = CFM( + self.models[usertypes.Completion.command] = CFM( models.CommandCompletionModel(self), self) - self._models[usertypes.Completion.helptopic] = CFM( + self.models[usertypes.Completion.helptopic] = CFM( models.HelpCompletionModel(self), self) - self._models[usertypes.Completion.quickmark] = CFM( - models.QuickmarkCompletionModel(self), self) def _init_setting_completions(self): """Initialize setting completion models.""" - self._models[usertypes.Completion.section] = CFM( + self.models[usertypes.Completion.section] = CFM( models.SettingSectionCompletionModel(self), self) - self._models[usertypes.Completion.option] = {} - self._models[usertypes.Completion.value] = {} + self.models[usertypes.Completion.option] = {} + self.models[usertypes.Completion.value] = {} for sectname in configdata.DATA: model = models.SettingOptionCompletionModel(sectname, self) - self._models[usertypes.Completion.option][sectname] = CFM( + self.models[usertypes.Completion.option][sectname] = CFM( model, self) - self._models[usertypes.Completion.value][sectname] = {} + self.models[usertypes.Completion.value][sectname] = {} for opt in configdata.DATA[sectname].keys(): model = models.SettingValueCompletionModel(sectname, opt, self) - self._models[usertypes.Completion.value][sectname][opt] = CFM( + self.models[usertypes.Completion.value][sectname][opt] = CFM( model, self) + def _init_quickmark_completions(self): + """Initialize quickmark completion models.""" + self.models[usertypes.Completion.quickmark] = CFM( + models.QuickmarkCompletionModel(self), self) + def _get_new_completion(self, parts, cursor_part): """Get a new completion model. @@ -105,7 +109,7 @@ class Completer(QObject): """ if cursor_part == 0: # '|' or 'set|' - return self._models[usertypes.Completion.command] + return self.models[usertypes.Completion.command] # delegate completion to command try: completions = cmdutils.cmd_dict[parts[0]].completion @@ -129,17 +133,17 @@ class Completer(QObject): ', '.join(dbg_completions))) if completion == usertypes.Completion.option: section = parts[cursor_part - 1] - model = self._models[completion].get(section) + model = self.models[completion].get(section) elif completion == usertypes.Completion.value: section = parts[cursor_part - 2] option = parts[cursor_part - 1] try: - model = self._models[completion][section][option] + model = self.models[completion][section][option] except KeyError: # No completion model for this section/option. model = None else: - model = self._models.get(completion) + model = self.models.get(completion) return model def _quote(self, s): @@ -182,6 +186,11 @@ class Completer(QObject): self._ignore_change = True self.change_completed_part.emit(data, False) + @pyqtSlot(str, list, int) + def on_quickmarks_changed(self): + self.clear() + self._init_quickmark_completions() + @pyqtSlot(str, list, int) def on_update_completion(self, prefix, parts, cursor_part): """Schedule updating/enabling completion. From afe45f99707dac6aca9efb7d9f058b1afd0f19fb Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Oct 2014 16:42:06 +0200 Subject: [PATCH 07/16] puschschsch --- qutebrowser/app.py | 3 --- qutebrowser/models/completion.py | 3 +++ qutebrowser/utils/completer.py | 2 +- qutebrowser/widgets/mainwindow.py | 4 ++++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 7038e0c08..6d10d6b6b 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -343,9 +343,6 @@ class Application(QApplication): self.lastWindowClosed.connect(self.shutdown) config_obj.style_changed.connect(style.get_stylesheet.cache_clear) self.focusChanged.connect(self.on_focus_changed) - quickmark_model = objreg.get('completer').models[usertypes.Completion.quickmark] - quickmark_manager = objreg.get('quickmark-manager') - quickmark_manager.changed.connect(quickmark_model.on_quickmarks.changed) def _get_widgets(self): """Get a string list of all widgets.""" diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index fe9bf6bb1..a5974ec04 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -203,6 +203,9 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): def __init__(self, parent=None): super().__init__(parent) + self._on_quickmarks_changed(self) + + def _on_quickmarks_changed(self, parent=None): qmlist = [] for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index 0515119aa..510ad3cd4 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -186,7 +186,7 @@ class Completer(QObject): self._ignore_change = True self.change_completed_part.emit(data, False) - @pyqtSlot(str, list, int) + @pyqtSlot() def on_quickmarks_changed(self): self.clear() self._init_quickmark_completions() diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py index c565cbec9..613809560 100644 --- a/qutebrowser/widgets/mainwindow.py +++ b/qutebrowser/widgets/mainwindow.py @@ -119,6 +119,10 @@ class MainWindow(QWidget): config.on_change(self.resize_completion, 'completion', 'height') config.on_change(self.resize_completion, 'completion', 'shrink') + quickmark_model = self._get_object('completer').models[usertypes.Completion.quickmark] + quickmark_manager = objreg.get('quickmark-manager') + quickmark_manager.changed.connect(quickmark_model.srcmodel.on_quickmarks_changed) + #self.retranslateUi(MainWindow) #self.tabWidget.setCurrentIndex(0) #QtCore.QMetaObject.connectSlotsByName(MainWindow) From 572a9857ecaeab4d7bb453b23eb3242c068bde22 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Oct 2014 22:00:28 +0200 Subject: [PATCH 08/16] fixes --- qutebrowser/utils/completer.py | 42 +++++++++++++++---------------- qutebrowser/widgets/mainwindow.py | 9 ++++--- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index 510ad3cd4..5085e62b1 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -55,13 +55,13 @@ class Completer(QObject): self._win_id = win_id self._ignore_change = False - self.models = { + self._models = { usertypes.Completion.option: {}, usertypes.Completion.value: {}, } self._init_static_completions() self._init_setting_completions() - self._init_quickmark_completions() + self.init_quickmark_completions() def __repr__(self): return utils.get_repr(self) @@ -74,30 +74,35 @@ class Completer(QObject): def _init_static_completions(self): """Initialize the static completion models.""" - self.models[usertypes.Completion.command] = CFM( + self._models[usertypes.Completion.command] = CFM( models.CommandCompletionModel(self), self) - self.models[usertypes.Completion.helptopic] = CFM( + self._models[usertypes.Completion.helptopic] = CFM( models.HelpCompletionModel(self), self) def _init_setting_completions(self): """Initialize setting completion models.""" - self.models[usertypes.Completion.section] = CFM( + self._models[usertypes.Completion.section] = CFM( models.SettingSectionCompletionModel(self), self) - self.models[usertypes.Completion.option] = {} - self.models[usertypes.Completion.value] = {} + self._models[usertypes.Completion.option] = {} + self._models[usertypes.Completion.value] = {} for sectname in configdata.DATA: model = models.SettingOptionCompletionModel(sectname, self) - self.models[usertypes.Completion.option][sectname] = CFM( + self._models[usertypes.Completion.option][sectname] = CFM( model, self) - self.models[usertypes.Completion.value][sectname] = {} + self._models[usertypes.Completion.value][sectname] = {} for opt in configdata.DATA[sectname].keys(): model = models.SettingValueCompletionModel(sectname, opt, self) - self.models[usertypes.Completion.value][sectname][opt] = CFM( + self._models[usertypes.Completion.value][sectname][opt] = CFM( model, self) - def _init_quickmark_completions(self): + @pyqtSlot() + def init_quickmark_completions(self): """Initialize quickmark completion models.""" - self.models[usertypes.Completion.quickmark] = CFM( + try: + self._models[usertypes.Completion.quickmark].deleteLater() + except KeyError: + pass + self._models[usertypes.Completion.quickmark] = CFM( models.QuickmarkCompletionModel(self), self) def _get_new_completion(self, parts, cursor_part): @@ -109,7 +114,7 @@ class Completer(QObject): """ if cursor_part == 0: # '|' or 'set|' - return self.models[usertypes.Completion.command] + return self._models[usertypes.Completion.command] # delegate completion to command try: completions = cmdutils.cmd_dict[parts[0]].completion @@ -133,17 +138,17 @@ class Completer(QObject): ', '.join(dbg_completions))) if completion == usertypes.Completion.option: section = parts[cursor_part - 1] - model = self.models[completion].get(section) + model = self._models[completion].get(section) elif completion == usertypes.Completion.value: section = parts[cursor_part - 2] option = parts[cursor_part - 1] try: - model = self.models[completion][section][option] + model = self._models[completion][section][option] except KeyError: # No completion model for this section/option. model = None else: - model = self.models.get(completion) + model = self._models.get(completion) return model def _quote(self, s): @@ -186,11 +191,6 @@ class Completer(QObject): self._ignore_change = True self.change_completed_part.emit(data, False) - @pyqtSlot() - def on_quickmarks_changed(self): - self.clear() - self._init_quickmark_completions() - @pyqtSlot(str, list, int) def on_update_completion(self, prefix, parts, cursor_part): """Schedule updating/enabling completion. diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py index 613809560..7e8ec2912 100644 --- a/qutebrowser/widgets/mainwindow.py +++ b/qutebrowser/widgets/mainwindow.py @@ -119,10 +119,6 @@ class MainWindow(QWidget): config.on_change(self.resize_completion, 'completion', 'height') config.on_change(self.resize_completion, 'completion', 'shrink') - quickmark_model = self._get_object('completer').models[usertypes.Completion.quickmark] - quickmark_manager = objreg.get('quickmark-manager') - quickmark_manager.changed.connect(quickmark_model.srcmodel.on_quickmarks_changed) - #self.retranslateUi(MainWindow) #self.tabWidget.setCurrentIndex(0) #QtCore.QMetaObject.connectSlotsByName(MainWindow) @@ -264,6 +260,11 @@ class MainWindow(QWidget): # downloads tabs.start_download.connect(download_manager.fetch) + # quickmark completion + completer = self._get_object('completer') + quickmark_manager = objreg.get('quickmark-manager') + quickmark_manager.changed.connect(completer.init_quickmark_completions) + @pyqtSlot() def resize_completion(self): """Adjust completion according to config.""" From ecbe5c071d97cc8148398e58520a9f7583754294 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Oct 2014 22:25:21 +0200 Subject: [PATCH 09/16] match urls with open, names with quickmark-load --- qutebrowser/browser/commands.py | 5 +++-- qutebrowser/models/completion.py | 16 +++++++++++----- qutebrowser/utils/completer.py | 9 ++++++--- qutebrowser/utils/usertypes.py | 3 ++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 5a3be8ed0..d69508a93 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -274,7 +274,8 @@ class CommandDispatcher: tabbar.setSelectionBehaviorOnRemove(old_selection_behavior) @cmdutils.register(instance='command-dispatcher', name='open', - split=False, scope='window') + split=False, scope='window', + completion=[usertypes.Completion.quickmark_by_url]) def openurl(self, url, bg=False, tab=False, window=False, count: {'special': 'count'}=None): """Open a URL in the current/[count]th tab. @@ -819,7 +820,7 @@ class CommandDispatcher: quickmark_manager.prompt_save(self._win_id, self._current_url()) @cmdutils.register(instance='command-dispatcher', scope='window', - completion=[usertypes.Completion.quickmark]) + completion=[usertypes.Completion.quickmark_by_name]) def quickmark_load(self, name, tab=False, bg=False, window=False): """Load a quickmark. diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index a5974ec04..eaf8e06a1 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -201,15 +201,21 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): # pylint: disable=abstract-method - def __init__(self, parent=None): + def __init__(self, parent=None, match_field='url'): super().__init__(parent) - self._on_quickmarks_changed(self) + self._on_quickmarks_changed(self, match_field) - def _on_quickmarks_changed(self, parent=None): + def _on_quickmarks_changed(self, parent=None, match_field='url'): qmlist = [] - for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): - qmlist.append((qm_url, qm_name)) + + if match_field == 'url': + for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): + qmlist.append((qm_url, qm_name)) + + if match_field == 'name': + for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): + qmlist.append((qm_name, qm_url)) cat = self.new_category("Quickmarks") for (name, desc) in qmlist: diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index 5085e62b1..e19d28849 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -99,11 +99,14 @@ class Completer(QObject): def init_quickmark_completions(self): """Initialize quickmark completion models.""" try: - self._models[usertypes.Completion.quickmark].deleteLater() + self._models[usertypes.Completion.quickmark_by_url].deleteLater() + self._models[usertypes.Completion.quickmark_by_name].deleteLater() except KeyError: pass - self._models[usertypes.Completion.quickmark] = CFM( - models.QuickmarkCompletionModel(self), self) + self._models[usertypes.Completion.quickmark_by_url] = CFM( + models.QuickmarkCompletionModel(self, 'url'), self) + self._models[usertypes.Completion.quickmark_by_name] = CFM( + models.QuickmarkCompletionModel(self, 'name'), self) def _get_new_completion(self, parts, cursor_part): """Get a new completion model. diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 7bcb0ef7d..c21b7febf 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -230,7 +230,8 @@ KeyMode = enum('KeyMode', ['normal', 'hint', 'command', 'yesno', 'prompt', # Available command completions Completion = enum('Completion', ['command', 'section', 'option', 'value', - 'helptopic', 'quickmark']) + 'helptopic', 'quickmark_by_url', + 'quickmark_by_name']) class Question(QObject): From ed51367bdd7e7f7fbf81a01fad98504b888fdaf8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Oct 2014 23:01:06 +0200 Subject: [PATCH 10/16] selfish parameters --- qutebrowser/models/completion.py | 5 +---- qutebrowser/utils/completer.py | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index eaf8e06a1..ffc3a83b7 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -201,11 +201,8 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): # pylint: disable=abstract-method - def __init__(self, parent=None, match_field='url'): + def __init__(self, match_field='url', parent=None): super().__init__(parent) - self._on_quickmarks_changed(self, match_field) - - def _on_quickmarks_changed(self, parent=None, match_field='url'): qmlist = [] diff --git a/qutebrowser/utils/completer.py b/qutebrowser/utils/completer.py index e19d28849..90fbf2c08 100644 --- a/qutebrowser/utils/completer.py +++ b/qutebrowser/utils/completer.py @@ -104,9 +104,9 @@ class Completer(QObject): except KeyError: pass self._models[usertypes.Completion.quickmark_by_url] = CFM( - models.QuickmarkCompletionModel(self, 'url'), self) + models.QuickmarkCompletionModel('url', self), self) self._models[usertypes.Completion.quickmark_by_name] = CFM( - models.QuickmarkCompletionModel(self, 'name'), self) + models.QuickmarkCompletionModel('name', self), self) def _get_new_completion(self, parts, cursor_part): """Get a new completion model. From 14d8d01d925cce41915f171b66a2068ed9c889e3 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Oct 2014 23:04:32 +0200 Subject: [PATCH 11/16] raising value error --- qutebrowser/models/completion.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index ffc3a83b7..8630e0c1e 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -210,10 +210,13 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): qmlist.append((qm_url, qm_name)) - if match_field == 'name': + elif match_field == 'name': for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): qmlist.append((qm_name, qm_url)) + else: + raise ValueError("Invalid value '{}' for match_field!".format(match_field)) + cat = self.new_category("Quickmarks") for (name, desc) in qmlist: self.new_item(cat, name, desc) From 8e9836785f4bb1255bf52019e5cd1f45e4084351 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 20 Oct 2014 00:24:46 +0200 Subject: [PATCH 12/16] Remove unused import. --- qutebrowser/models/completion.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 8630e0c1e..6733212b8 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -25,7 +25,6 @@ from qutebrowser.config import config, configdata from qutebrowser.models import basecompletion from qutebrowser.utils import log, qtutils, objreg from qutebrowser.commands import cmdutils -from qutebrowser.browser import quickmarks class SettingSectionCompletionModel(basecompletion.BaseCompletionModel): From 1238807745d8ec12f831b71309dcecc9e1f266a7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 20 Oct 2014 00:24:55 +0200 Subject: [PATCH 13/16] Whitespace fixes. --- qutebrowser/models/completion.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 6733212b8..e8a6daba9 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -208,15 +208,12 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): if match_field == 'url': for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): qmlist.append((qm_url, qm_name)) - elif match_field == 'name': for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): qmlist.append((qm_name, qm_url)) - else: raise ValueError("Invalid value '{}' for match_field!".format(match_field)) cat = self.new_category("Quickmarks") for (name, desc) in qmlist: self.new_item(cat, name, desc) - From 4ae4d0c74b032aaa3c2d1794305a464e02c731df Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 20 Oct 2014 00:27:45 +0200 Subject: [PATCH 14/16] Simplify getting of quickmarks --- qutebrowser/models/completion.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index e8a6daba9..1678e553f 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -203,17 +203,14 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): def __init__(self, match_field='url', parent=None): super().__init__(parent) - qmlist = [] + cat = self.new_category("Quickmarks") + quickmarks = objreg.get('quickmark-manager').marks.items() if match_field == 'url': - for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): - qmlist.append((qm_url, qm_name)) + for qm_name, qm_url in quickmarks: + self.new_item(cat, qm_url, qm_name) elif match_field == 'name': - for qm_name, qm_url in objreg.get('quickmark-manager').marks.items(): - qmlist.append((qm_name, qm_url)) + for qm_name, qm_url in quickmarks: + self.new_item(cat, qm_name, qm_url) else: raise ValueError("Invalid value '{}' for match_field!".format(match_field)) - - cat = self.new_category("Quickmarks") - for (name, desc) in qmlist: - self.new_item(cat, name, desc) From 1b91cd61cdb090101ab5d3fb334cce05ca5d9e8a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 20 Oct 2014 00:28:14 +0200 Subject: [PATCH 15/16] Fix long line --- qutebrowser/models/completion.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 1678e553f..74814102f 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -213,4 +213,5 @@ class QuickmarkCompletionModel(basecompletion.BaseCompletionModel): for qm_name, qm_url in quickmarks: self.new_item(cat, qm_name, qm_url) else: - raise ValueError("Invalid value '{}' for match_field!".format(match_field)) + raise ValueError("Invalid value '{}' for match_field!".format( + match_field)) From eb7d12445bdb3d356b0dd9c8ca5f1ade78b2e924 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 20 Oct 2014 00:29:19 +0200 Subject: [PATCH 16/16] Fix indent --- qutebrowser/browser/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index d69508a93..6b7fc386d 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -820,7 +820,7 @@ class CommandDispatcher: quickmark_manager.prompt_save(self._win_id, self._current_url()) @cmdutils.register(instance='command-dispatcher', scope='window', - completion=[usertypes.Completion.quickmark_by_name]) + completion=[usertypes.Completion.quickmark_by_name]) def quickmark_load(self, name, tab=False, bg=False, window=False): """Load a quickmark.