Add completion for settings values

This commit is contained in:
Florian Bruhin 2014-04-14 17:54:11 +02:00
parent 44ce804bdf
commit f959c0c137
5 changed files with 51 additions and 5 deletions

View File

@ -263,7 +263,7 @@ class Config(QObject):
return newval return newval
@cmdutils.register(name='set', instance='config', @cmdutils.register(name='set', instance='config',
completion=['section', 'option']) completion=['section', 'option', 'value'])
def set_wrapper(self, section, option, value): def set_wrapper(self, section, option, value):
"""Set an option. """Set an option.
@ -279,7 +279,7 @@ class Config(QObject):
message.error("set: {} - {}".format(e.__class__.__name__, e)) message.error("set: {} - {}".format(e.__class__.__name__, e))
@cmdutils.register(name='set_temp', instance='config', @cmdutils.register(name='set_temp', instance='config',
completion=['section', 'option']) completion=['section', 'option', 'value'])
def set_temp_wrapper(self, section, option, value): def set_temp_wrapper(self, section, option, value):
"""Set a temporary option. """Set a temporary option.

View File

@ -100,6 +100,10 @@ class KeyValue:
"""Get dict item tuples.""" """Get dict item tuples."""
return self.values.items() return self.values.items()
def keys(self):
"""Get value keys."""
return self.values.keys()
def from_cp(self, sect): def from_cp(self, sect):
"""Initialize the values from a configparser section. """Initialize the values from a configparser section.
@ -211,6 +215,10 @@ class ValueList:
self.update_valdict() self.update_valdict()
return self.valdict.items() return self.valdict.items()
def keys(self):
"""Get value keys."""
return self.values.keys()
def from_cp(self, sect): def from_cp(self, sect):
"""Initialize the values from a configparser section.""" """Initialize the values from a configparser section."""
keytype = self.keytype() keytype = self.keytype()

View File

@ -23,6 +23,13 @@ from PyQt5.QtCore import Qt, QVariant, QAbstractItemModel, QModelIndex
ROLE_MARKS = Qt.UserRole ROLE_MARKS = Qt.UserRole
class NoCompletionsError(Exception):
"""Gets raised when there are no completions available."""
pass
class CompletionModel(QAbstractItemModel): class CompletionModel(QAbstractItemModel):
"""A simple tree model based on Python OrderdDict containing tuples. """A simple tree model based on Python OrderdDict containing tuples.

View File

@ -17,7 +17,7 @@
"""CompletionModels for settings/sections.""" """CompletionModels for settings/sections."""
from qutebrowser.models.completion import CompletionModel from qutebrowser.models.completion import CompletionModel, NoCompletionsError
from qutebrowser.config.configdata import configdata from qutebrowser.config.configdata import configdata
@ -50,3 +50,23 @@ class SettingOptionCompletionModel(CompletionModel):
except (KeyError, AttributeError): except (KeyError, AttributeError):
desc = "" desc = ""
self.new_item(cat, name, desc) self.new_item(cat, name, desc)
class SettingValueCompletionModel(CompletionModel):
"""A CompletionModel filled with setting values."""
# pylint: disable=abstract-method
def __init__(self, section, option, parent=None):
super().__init__(parent)
cat = self.new_category("Setting values for {}".format(option))
vals = configdata()[section][option].typ.valid_values
if vals is None:
raise NoCompletionsError
for val in vals:
try:
desc = vals.descriptions[val]
except KeyError:
desc = ""
self.new_item(cat, val, desc)

View File

@ -34,13 +34,14 @@ from PyQt5.QtGui import (QIcon, QPalette, QTextDocument, QTextOption,
import qutebrowser.config.config as config import qutebrowser.config.config as config
import qutebrowser.commands.utils as cmdutils import qutebrowser.commands.utils as cmdutils
from qutebrowser.config.configdata import configdata from qutebrowser.config.configdata import configdata
from qutebrowser.models.completion import ROLE_MARKS from qutebrowser.models.completion import ROLE_MARKS, NoCompletionsError
from qutebrowser.config.style import set_register_stylesheet, get_stylesheet from qutebrowser.config.style import set_register_stylesheet, get_stylesheet
from qutebrowser.commands.parsers import split_cmdline from qutebrowser.commands.parsers import split_cmdline
from qutebrowser.models.completionfilter import CompletionFilterModel from qutebrowser.models.completionfilter import CompletionFilterModel
from qutebrowser.models.commandcompletion import CommandCompletionModel from qutebrowser.models.commandcompletion import CommandCompletionModel
from qutebrowser.models.settingcompletion import ( from qutebrowser.models.settingcompletion import (
SettingSectionCompletionModel, SettingOptionCompletionModel) SettingSectionCompletionModel, SettingOptionCompletionModel,
SettingValueCompletionModel)
class CompletionView(QTreeView): class CompletionView(QTreeView):
@ -112,6 +113,13 @@ class CompletionView(QTreeView):
for sect in configdata().keys(): for sect in configdata().keys():
self._completion_models['option_' + sect] = CompletionFilterModel( self._completion_models['option_' + sect] = CompletionFilterModel(
SettingOptionCompletionModel(sect, self)) SettingOptionCompletionModel(sect, self))
for opt in configdata()[sect].keys():
try:
self._completion_models['value_{}_{}'.format(sect,opt)] = (
CompletionFilterModel(SettingValueCompletionModel(sect,
opt, self)))
except NoCompletionsError:
pass
self._ignore_next = False self._ignore_next = False
self._completing = False self._completing = False
@ -178,9 +186,12 @@ class CompletionView(QTreeView):
return None return None
if compl == 'option': if compl == 'option':
compl = 'option_' + parts[-2] compl = 'option_' + parts[-2]
elif compl == 'value':
compl = 'value_{}_{}'.format(parts[-3], parts[-2])
if compl in self._completion_models: if compl in self._completion_models:
return compl return compl
else: else:
logging.debug("No completion model for {}.".format(compl))
return None return None
def set_model(self, model): def set_model(self, model):