diff --git a/qutebrowser/completion/completer.py b/qutebrowser/completion/completer.py index e36e5e0bd..12c71a770 100644 --- a/qutebrowser/completion/completer.py +++ b/qutebrowser/completion/completer.py @@ -24,7 +24,7 @@ from PyQt5.QtCore import pyqtSlot, QObject, QTimer, Qt from qutebrowser.config import config, configdata from qutebrowser.commands import cmdutils, runners from qutebrowser.utils import usertypes, log, objreg, utils -from qutebrowser.completion.models import completion as models +from qutebrowser.completion.models import miscmodels, urlmodel, configmodel from qutebrowser.completion.models.sortfilter import ( CompletionFilterModel as CFM) @@ -82,26 +82,27 @@ class Completer(QObject): def _init_static_completions(self): """Initialize the static completion models.""" self._models[usertypes.Completion.command] = CFM( - models.CommandCompletionModel(self), self) + miscmodels.CommandCompletionModel(self), self) self._models[usertypes.Completion.helptopic] = CFM( - models.HelpCompletionModel(self), self) + miscmodels.HelpCompletionModel(self), self) self._models[usertypes.Completion.url] = CFM( - models.UrlCompletionModel(self), self, + urlmodel.UrlCompletionModel(self), self, dumb_sort=Qt.DescendingOrder) def _init_setting_completions(self): """Initialize setting completion models.""" self._models[usertypes.Completion.section] = CFM( - models.SettingSectionCompletionModel(self), self) + configmodel.SettingSectionCompletionModel(self), self) self._models[usertypes.Completion.option] = {} self._models[usertypes.Completion.value] = {} for sectname in configdata.DATA: - model = models.SettingOptionCompletionModel(sectname, self) + model = configmodel.SettingOptionCompletionModel(sectname, self) self._models[usertypes.Completion.option][sectname] = CFM( model, self) self._models[usertypes.Completion.value][sectname] = {} for opt in configdata.DATA[sectname].keys(): - model = models.SettingValueCompletionModel(sectname, opt, self) + model = configmodel.SettingValueCompletionModel(sectname, opt, + self) self._models[usertypes.Completion.value][sectname][opt] = CFM( model, self) @@ -114,9 +115,9 @@ class Completer(QObject): except KeyError: pass self._models[usertypes.Completion.quickmark_by_url] = CFM( - models.QuickmarkCompletionModel('url', self), self) + miscmodels.QuickmarkCompletionModel('url', self), self) self._models[usertypes.Completion.quickmark_by_name] = CFM( - models.QuickmarkCompletionModel('name', self), self) + miscmodels.QuickmarkCompletionModel('name', self), self) @pyqtSlot() def init_session_completion(self): @@ -126,7 +127,7 @@ class Completer(QObject): except KeyError: pass self._models[usertypes.Completion.sessions] = CFM( - models.SessionCompletionModel(self), self) + miscmodels.SessionCompletionModel(self), self) def _get_completion_model(self, completion, parts, cursor_part): """Get a completion model based on an enum member. diff --git a/qutebrowser/completion/models/completion.py b/qutebrowser/completion/models/configmodel.py similarity index 50% rename from qutebrowser/completion/models/completion.py rename to qutebrowser/completion/models/configmodel.py index b99b8de11..6d39fed7b 100644 --- a/qutebrowser/completion/models/completion.py +++ b/qutebrowser/completion/models/configmodel.py @@ -17,13 +17,12 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""CompletionModels for different usages.""" +"""CompletionModels for the config.""" from PyQt5.QtCore import pyqtSlot, Qt from qutebrowser.config import config, configdata from qutebrowser.utils import log, qtutils, objreg -from qutebrowser.commands import cmdutils from qutebrowser.completion.models import base @@ -148,168 +147,3 @@ class SettingValueCompletionModel(base.BaseCompletionModel): if not ok: raise ValueError("Setting data failed! (section: {}, option: {}, " "value: {})".format(section, option, value)) - - -class CommandCompletionModel(base.BaseCompletionModel): - - """A CompletionModel filled with all commands and descriptions.""" - - # pylint: disable=abstract-method - - def __init__(self, parent=None): - super().__init__(parent) - assert cmdutils.cmd_dict - cmdlist = [] - for obj in set(cmdutils.cmd_dict.values()): - if (obj.hide or (obj.debug and not objreg.get('args').debug) or - obj.deprecated): - pass - else: - cmdlist.append((obj.name, obj.desc)) - for name, cmd in config.section('aliases').items(): - cmdlist.append((name, "Alias for '{}'".format(cmd))) - cat = self.new_category("Commands") - for (name, desc) in sorted(cmdlist): - self.new_item(cat, name, desc) - - -class HelpCompletionModel(base.BaseCompletionModel): - - """A CompletionModel filled with help topics.""" - - # pylint: disable=abstract-method - - def __init__(self, parent=None): - super().__init__(parent) - self._init_commands() - self._init_settings() - - def _init_commands(self): - """Fill completion with :command entries.""" - assert cmdutils.cmd_dict - cmdlist = [] - for obj in set(cmdutils.cmd_dict.values()): - if (obj.hide or (obj.debug and not objreg.get('args').debug) or - obj.deprecated): - pass - else: - cmdlist.append((':' + obj.name, obj.desc)) - cat = self.new_category("Commands") - for (name, desc) in sorted(cmdlist): - self.new_item(cat, name, desc) - - def _init_settings(self): - """Fill completion with section->option entries.""" - cat = self.new_category("Settings") - for sectname, sectdata in configdata.DATA.items(): - for optname in sectdata.keys(): - try: - desc = sectdata.descriptions[optname] - except (KeyError, AttributeError): - # Some stuff (especially ValueList items) don't have a - # description. - desc = "" - else: - desc = desc.splitlines()[0] - name = '{}->{}'.format(sectname, optname) - self.new_item(cat, name, desc) - - -class UrlCompletionModel(base.BaseCompletionModel): - - """A model which combines quickmarks and web history URLs. - - Used for the `open` command.""" - - # pylint: disable=abstract-method - - def __init__(self, parent=None): - super().__init__(parent) - - self._quickcat = self.new_category("Quickmarks") - self._histcat = self.new_category("History") - self._histstore = objreg.get('web-history') - - WebHistoryCompletionModel.fill_model(self, cat=self._histcat) - QuickmarkCompletionModel.fill_model(self, cat=self._quickcat) - - self._histstore.item_added.connect( - lambda e: WebHistoryCompletionModel.history_changed( - self, e, self._histcat)) - - -class WebHistoryCompletionModel(base.BaseCompletionModel): - - """A CompletionModel filled with global browsing history.""" - - # pylint: disable=abstract-method - - def __init__(self, parent=None): - super().__init__(parent) - - self._histcat = self.new_category("History") - self._histstore = objreg.get('web-history') - - self.fill_model(self, self._histcat, self._histstore) - - self._histstore.item_added.connect( - lambda e: self.history_changed(e, self._histcat)) - - @staticmethod - def fill_model(model, cat=None, histstore=None): - """Fill the given model/category with the given history.""" - if not histstore: - histstore = objreg.get('web-history') - if not cat: - cat = model.new_category("History") - - for entry in histstore: - atime = int(entry.atime) - model.new_item(cat, entry.url, "", str(atime), sort=atime) - - def history_changed(self, entry, cat): - """Slot called when a new history item was added.""" - if entry.url: - atime = int(entry.atime) - self.new_item(cat, entry.url, "", str(atime), sort=atime) - - -class QuickmarkCompletionModel(base.BaseCompletionModel): - - """A CompletionModel filled with all quickmarks.""" - - # pylint: disable=abstract-method - - def __init__(self, match_field='url', parent=None): - super().__init__(parent) - self.fill_model(self, match_field) - - @staticmethod - def fill_model(model, match_field='url', cat=None): - """Fill the given model/category with quickmarks.""" - if not cat: - cat = model.new_category("Quickmarks") - quickmarks = objreg.get('quickmark-manager').marks.items() - - if match_field == 'url': - for qm_name, qm_url in quickmarks: - model.new_item(cat, qm_url, qm_name) - elif match_field == 'name': - for qm_name, qm_url in quickmarks: - model.new_item(cat, qm_name, qm_url) - else: - raise ValueError("Invalid value '{}' for match_field!".format( - match_field)) - - -class SessionCompletionModel(base.BaseCompletionModel): - - """A CompletionModel filled with session names.""" - - # pylint: disable=abstract-method - - def __init__(self, parent=None): - super().__init__(parent) - cat = self.new_category("Sessions") - for name in objreg.get('session-manager').list_sessions(): - self.new_item(cat, name) diff --git a/qutebrowser/completion/models/miscmodels.py b/qutebrowser/completion/models/miscmodels.py new file mode 100644 index 000000000..6f3db764b --- /dev/null +++ b/qutebrowser/completion/models/miscmodels.py @@ -0,0 +1,124 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2014-2015 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Misc. CompletionModels.""" + +from qutebrowser.config import config, configdata +from qutebrowser.utils import objreg +from qutebrowser.commands import cmdutils +from qutebrowser.completion.models import base + + +class CommandCompletionModel(base.BaseCompletionModel): + + """A CompletionModel filled with all commands and descriptions.""" + + # pylint: disable=abstract-method + + def __init__(self, parent=None): + super().__init__(parent) + assert cmdutils.cmd_dict + cmdlist = [] + for obj in set(cmdutils.cmd_dict.values()): + if (obj.hide or (obj.debug and not objreg.get('args').debug) or + obj.deprecated): + pass + else: + cmdlist.append((obj.name, obj.desc)) + for name, cmd in config.section('aliases').items(): + cmdlist.append((name, "Alias for '{}'".format(cmd))) + cat = self.new_category("Commands") + for (name, desc) in sorted(cmdlist): + self.new_item(cat, name, desc) + + +class HelpCompletionModel(base.BaseCompletionModel): + + """A CompletionModel filled with help topics.""" + + # pylint: disable=abstract-method + + def __init__(self, parent=None): + super().__init__(parent) + self._init_commands() + self._init_settings() + + def _init_commands(self): + """Fill completion with :command entries.""" + assert cmdutils.cmd_dict + cmdlist = [] + for obj in set(cmdutils.cmd_dict.values()): + if (obj.hide or (obj.debug and not objreg.get('args').debug) or + obj.deprecated): + pass + else: + cmdlist.append((':' + obj.name, obj.desc)) + cat = self.new_category("Commands") + for (name, desc) in sorted(cmdlist): + self.new_item(cat, name, desc) + + def _init_settings(self): + """Fill completion with section->option entries.""" + cat = self.new_category("Settings") + for sectname, sectdata in configdata.DATA.items(): + for optname in sectdata.keys(): + try: + desc = sectdata.descriptions[optname] + except (KeyError, AttributeError): + # Some stuff (especially ValueList items) don't have a + # description. + desc = "" + else: + desc = desc.splitlines()[0] + name = '{}->{}'.format(sectname, optname) + self.new_item(cat, name, desc) + + +class QuickmarkCompletionModel(base.BaseCompletionModel): + + """A CompletionModel filled with all quickmarks.""" + + # pylint: disable=abstract-method + + def __init__(self, match_field='url', parent=None): + super().__init__(parent) + cat = self.new_category("Quickmarks") + quickmarks = objreg.get('quickmark-manager').marks.items() + if match_field == 'url': + 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 quickmarks: + self.new_item(cat, qm_name, qm_url) + else: + raise ValueError("Invalid value '{}' for match_field!".format( + match_field)) + + +class SessionCompletionModel(base.BaseCompletionModel): + + """A CompletionModel filled with session names.""" + + # pylint: disable=abstract-method + + def __init__(self, parent=None): + super().__init__(parent) + cat = self.new_category("Sessions") + for name in objreg.get('session-manager').list_sessions(): + self.new_item(cat, name) diff --git a/qutebrowser/completion/models/urlmodel.py b/qutebrowser/completion/models/urlmodel.py new file mode 100644 index 000000000..5cf8b708e --- /dev/null +++ b/qutebrowser/completion/models/urlmodel.py @@ -0,0 +1,61 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2014-2015 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""CompletionModels for URLs.""" + +from PyQt5.QtCore import pyqtSlot + +from qutebrowser.utils import objreg +from qutebrowser.completion.models import base + + +class UrlCompletionModel(base.BaseCompletionModel): + + """A model which combines quickmarks and web history URLs. + + Used for the `open` command.""" + + # pylint: disable=abstract-method + + def __init__(self, parent=None): + super().__init__(parent) + + self._quickmark_cat = self.new_category("Quickmarks") + self._history_cat = self.new_category("History") + + quickmarks = objreg.get('quickmark-manager').marks.items() + history = objreg.get('web-history') + + for qm_name, qm_url in quickmarks: + self.new_item(self._quickmark_cat, qm_url, qm_name) + + for entry in history: + atime = int(entry.atime) + self.new_item(self._history_cat, entry.url, "", str(atime), + sort=atime) + + history.item_added.connect(self.on_history_item_added) + + @pyqtSlot(object) + def on_history_item_added(self, item): + """Slot called when a new history item was added.""" + if item.url: + atime = int(item.atime) + self.new_item(self._quickmark_cat, item.url, "", str(atime), + sort=atime)