Move object registry to its own file.

This commit is contained in:
Florian Bruhin 2014-09-24 07:06:45 +02:00
parent b121ceef21
commit 3f02451828
30 changed files with 185 additions and 160 deletions

View File

@ -44,7 +44,7 @@ from qutebrowser.browser import quickmarks, cookies, downloads, cache
from qutebrowser.widgets import mainwindow, console, crash from qutebrowser.widgets import mainwindow, console, crash
from qutebrowser.keyinput import modeparsers, keyparser, modeman from qutebrowser.keyinput import modeparsers, keyparser, modeman
from qutebrowser.utils import (log, version, message, utilcmds, readline, from qutebrowser.utils import (log, version, message, utilcmds, readline,
utils, qtutils, urlutils, debug) utils, qtutils, urlutils, debug, objreg)
from qutebrowser.utils import usertypes as utypes from qutebrowser.utils import usertypes as utypes
@ -83,8 +83,8 @@ class Application(QApplication):
'tabs': False, 'tabs': False,
'main': False, 'main': False,
} }
self.meta_registry = utypes.ObjectRegistry() self.meta_registry = objreg.ObjectRegistry()
self.registry = utypes.ObjectRegistry() self.registry = objreg.ObjectRegistry()
self.meta_registry['global'] = self.registry self.meta_registry['global'] = self.registry
self.registry['app'] = self self.registry['app'] = self
self._shutting_down = False self._shutting_down = False
@ -626,7 +626,7 @@ class Application(QApplication):
# exceptions occur. # exceptions occur.
if pages is None: if pages is None:
pages = [] pages = []
for tab in utils.get_object('tabbed-browser').widgets(): for tab in objreg.get('tabbed-browser').widgets():
urlstr = tab.cur_url.toString( urlstr = tab.cur_url.toString(
QUrl.RemovePassword | QUrl.FullyEncoded) QUrl.RemovePassword | QUrl.FullyEncoded)
if urlstr: if urlstr:

View File

@ -38,7 +38,7 @@ from qutebrowser.commands import userscripts, cmdexc, cmdutils
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.browser import hints, quickmarks, webelem from qutebrowser.browser import hints, quickmarks, webelem
from qutebrowser.utils import (message, editor, usertypes, log, qtutils, from qutebrowser.utils import (message, editor, usertypes, log, qtutils,
urlutils, utils) urlutils, objreg)
class CommandDispatcher: class CommandDispatcher:
@ -143,7 +143,7 @@ class CommandDispatcher:
def _tab_focus_last(self): def _tab_focus_last(self):
"""Select the tab which was last focused.""" """Select the tab which was last focused."""
try: try:
tab = utils.get_object('last-focused-tab') tab = objreg.get('last-focused-tab')
except KeyError: except KeyError:
raise cmdexc.CommandError("No last focused tab!") raise cmdexc.CommandError("No last focused tab!")
idx = self._tabs.indexOf(tab) idx = self._tabs.indexOf(tab)

View File

@ -29,7 +29,8 @@ from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import message, http, usertypes, log, utils, qtutils from qutebrowser.utils import (message, http, usertypes, log, utils, qtutils,
objreg)
class DownloadItem(QObject): class DownloadItem(QObject):
@ -409,7 +410,7 @@ class DownloadManager(QObject):
q.destroyed.connect(functools.partial(self.questions.remove, q)) q.destroyed.connect(functools.partial(self.questions.remove, q))
self.questions.append(q) self.questions.append(q)
download.cancelled.connect(q.abort) download.cancelled.connect(q.abort)
utils.get_object('message-bridge').ask(q, blocking=False) objreg.get('message-bridge').ask(q, blocking=False)
@pyqtSlot(DownloadItem) @pyqtSlot(DownloadItem)
def on_finished(self, download): def on_finished(self, download):

View File

@ -31,7 +31,7 @@ from qutebrowser.config import config
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.browser import webelem from qutebrowser.browser import webelem
from qutebrowser.commands import userscripts, cmdexc from qutebrowser.commands import userscripts, cmdexc
from qutebrowser.utils import usertypes, log, qtutils, message, utils from qutebrowser.utils import usertypes, log, qtutils, message, objreg
ElemTuple = collections.namedtuple('ElemTuple', 'elem, label') ElemTuple = collections.namedtuple('ElemTuple', 'elem, label')
@ -149,8 +149,8 @@ class HintManager(QObject):
""" """
super().__init__(parent) super().__init__(parent)
self._context = None self._context = None
utils.get_object('mode-manager').left.connect(self.on_mode_left) objreg.get('mode-manager').left.connect(self.on_mode_left)
utils.get_object('mode-manager').entered.connect(self.on_mode_entered) objreg.get('mode-manager').entered.connect(self.on_mode_entered)
def _cleanup(self): def _cleanup(self):
"""Clean up after hinting.""" """Clean up after hinting."""
@ -160,7 +160,7 @@ class HintManager(QObject):
except webelem.IsNullError: except webelem.IsNullError:
pass pass
text = self.HINT_TEXTS[self._context.target] text = self.HINT_TEXTS[self._context.target]
utils.get_object('message-bridge').maybe_reset_text(text) objreg.get('message-bridge').maybe_reset_text(text)
self._context = None self._context = None
def _hint_strings(self, elems): def _hint_strings(self, elems):
@ -271,7 +271,7 @@ class HintManager(QObject):
display = 'none' display = 'none'
rect = elem.geometry() rect = elem.geometry()
return self.HINT_CSS.format( return self.HINT_CSS.format(
left=rect.x(), top=rect.y(), config=utils.get_object('config'), left=rect.x(), top=rect.y(), config=objreg.get('config'),
display=display) display=display)
def _draw_label(self, elem, string): def _draw_label(self, elem, string):
@ -542,7 +542,7 @@ class HintManager(QObject):
self._context.frames = webelem.get_child_frames(mainframe) self._context.frames = webelem.get_child_frames(mainframe)
self._context.args = args self._context.args = args
self._init_elements(mainframe, group) self._init_elements(mainframe, group)
utils.get_object('message-bridge').set_text(self.HINT_TEXTS[target]) objreg.get('message-bridge').set_text(self.HINT_TEXTS[target])
self._connect_frame_signals() self._connect_frame_signals()
try: try:
modeman.enter(usertypes.KeyMode.hint, 'HintManager.start') modeman.enter(usertypes.KeyMode.hint, 'HintManager.start')

View File

@ -25,7 +25,7 @@ import argparse
from PyQt5.QtCore import QUrl from PyQt5.QtCore import QUrl
from qutebrowser.commands import cmdexc from qutebrowser.commands import cmdexc
from qutebrowser.utils import utils from qutebrowser.utils import utils, objreg
SUPPRESS = argparse.SUPPRESS SUPPRESS = argparse.SUPPRESS
@ -54,7 +54,7 @@ class HelpAction(argparse.Action):
""" """
def __call__(self, parser, _namespace, _values, _option_string=None): def __call__(self, parser, _namespace, _values, _option_string=None):
utils.get_object('tabbed-browser').tabopen( objreg.get('tabbed-browser').tabopen(
QUrl('qute://help/commands.html#{}'.format(parser.name))) QUrl('qute://help/commands.html#{}'.format(parser.name)))
parser.exit() parser.exit()

View File

@ -25,7 +25,8 @@ import collections
from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKit import QWebSettings
from qutebrowser.commands import cmdexc, argparser from qutebrowser.commands import cmdexc, argparser
from qutebrowser.utils import log, utils, message, debug, usertypes, docutils from qutebrowser.utils import (log, utils, message, debug, usertypes, docutils,
objreg)
class Command: class Command:
@ -97,7 +98,7 @@ class Command:
Raise: Raise:
PrerequisitesError if the command can't be called currently. PrerequisitesError if the command can't be called currently.
""" """
curmode = utils.get_object('mode-manager').mode() curmode = objreg.get('mode-manager').mode()
if self.modes is not None and curmode not in self.modes: if self.modes is not None and curmode not in self.modes:
mode_names = '/'.join(mode.name for mode in self.modes) mode_names = '/'.join(mode.name for mode in self.modes)
raise cmdexc.PrerequisitesError( raise cmdexc.PrerequisitesError(
@ -298,7 +299,7 @@ class Command:
args: The positional argument list. Gets modified directly. args: The positional argument list. Gets modified directly.
""" """
assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
obj = utils.get_object(self.instance) obj = objreg.get(self.instance)
args.append(obj) args.append(obj)
def _get_count_arg(self, param, args, kwargs): def _get_count_arg(self, param, args, kwargs):

View File

@ -24,7 +24,7 @@ from PyQt5.QtWebKitWidgets import QWebPage
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import message, log, utils from qutebrowser.utils import message, log, utils, objreg
def replace_variables(arglist): def replace_variables(arglist):
@ -32,7 +32,7 @@ def replace_variables(arglist):
args = [] args = []
for arg in arglist: for arg in arglist:
if arg == '{url}': if arg == '{url}':
url = utils.get_object('tabbed-browser').current_url().toString( url = objreg.get('tabbed-browser').current_url().toString(
QUrl.FullyEncoded | QUrl.RemovePassword) QUrl.FullyEncoded | QUrl.RemovePassword)
args.append(url) args.append(url)
else: else:

View File

@ -35,18 +35,18 @@ from PyQt5.QtCore import pyqtSignal, QObject
from qutebrowser.utils import log from qutebrowser.utils import log
from qutebrowser.config import configdata, iniparsers, configtypes, textwrapper from qutebrowser.config import configdata, iniparsers, configtypes, textwrapper
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import message, utils from qutebrowser.utils import message, objreg
from qutebrowser.utils.usertypes import Completion from qutebrowser.utils.usertypes import Completion
def get(*args, **kwargs): def get(*args, **kwargs):
"""Convenience method to call get(...) of the config instance.""" """Convenience method to call get(...) of the config instance."""
return utils.get_object('config').get(*args, **kwargs) return objreg.get('config').get(*args, **kwargs)
def section(sect): def section(sect):
"""Get a config section from the global config.""" """Get a config section from the global config."""
return utils.get_object('config')[sect] return objreg.get('config')[sect]
class NoSectionError(configparser.NoSectionError): class NoSectionError(configparser.NoSectionError):

View File

@ -25,7 +25,7 @@ import jinja2
from PyQt5.QtGui import QColor from PyQt5.QtGui import QColor
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import log, utils from qutebrowser.utils import log, objreg
@functools.lru_cache(maxsize=16) @functools.lru_cache(maxsize=16)
@ -42,7 +42,7 @@ def get_stylesheet(template_str):
fontdict = FontDict(config.section('fonts')) fontdict = FontDict(config.section('fonts'))
template = jinja2.Template(template_str) template = jinja2.Template(template_str)
return template.render(color=colordict, font=fontdict, return template.render(color=colordict, font=fontdict,
config=utils.get_object('config')) config=objreg.get('config'))
def set_register_stylesheet(obj): def set_register_stylesheet(obj):
@ -60,8 +60,8 @@ def set_register_stylesheet(obj):
log.style.vdebug("stylesheet for {}: {}".format( log.style.vdebug("stylesheet for {}: {}".format(
obj.__class__.__name__, qss)) obj.__class__.__name__, qss))
obj.setStyleSheet(qss) obj.setStyleSheet(qss)
utils.get_object('config').changed.connect( objreg.get('config').changed.connect(functools.partial(
functools.partial(_update_stylesheet, obj)) _update_stylesheet, obj))
def _update_stylesheet(obj, _section, _option): def _update_stylesheet(obj, _section, _option):

View File

@ -26,7 +26,7 @@ import functools
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QObject from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QObject
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, utils, objreg
class BaseKeyParser(QObject): class BaseKeyParser(QObject):
@ -321,7 +321,7 @@ class BaseKeyParser(QObject):
self._modename = modename self._modename = modename
self.bindings = {} self.bindings = {}
self.special_bindings = {} self.special_bindings = {}
keyconfparser = utils.get_object('key-config') keyconfparser = objreg.get('key-config')
for (key, cmd) in keyconfparser.get_bindings_for(modename).items(): for (key, cmd) in keyconfparser.get_bindings_for(modename).items():
if not cmd: if not cmd:
continue continue

View File

@ -29,7 +29,7 @@ from PyQt5.QtWidgets import QApplication
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
class ModeLockedError(Exception): class ModeLockedError(Exception):
@ -39,18 +39,18 @@ class ModeLockedError(Exception):
def enter(mode, reason=None): def enter(mode, reason=None):
"""Enter the mode 'mode'.""" """Enter the mode 'mode'."""
utils.get_object('mode-manager').enter(mode, reason) objreg.get('mode-manager').enter(mode, reason)
def leave(mode, reason=None): def leave(mode, reason=None):
"""Leave the mode 'mode'.""" """Leave the mode 'mode'."""
utils.get_object('mode-manager').leave(mode, reason) objreg.get('mode-manager').leave(mode, reason)
def maybe_enter(mode, reason=None): def maybe_enter(mode, reason=None):
"""Convenience method to enter 'mode' without exceptions.""" """Convenience method to enter 'mode' without exceptions."""
try: try:
utils.get_object('mode-manager').enter(mode, reason) objreg.get('mode-manager').enter(mode, reason)
except ModeLockedError: except ModeLockedError:
pass pass
@ -58,7 +58,7 @@ def maybe_enter(mode, reason=None):
def maybe_leave(mode, reason=None): def maybe_leave(mode, reason=None):
"""Convenience method to leave 'mode' without exceptions.""" """Convenience method to leave 'mode' without exceptions."""
try: try:
utils.get_object('mode-manager').leave(mode, reason) objreg.get('mode-manager').leave(mode, reason)
except ValueError as e: except ValueError as e:
# This is rather likely to happen, so we only log to debug log. # This is rather likely to happen, so we only log to debug log.
log.modes.debug(e) log.modes.debug(e)
@ -283,7 +283,7 @@ class ModeManager(QObject):
# we're not interested in it anymore. # we're not interested in it anymore.
return False return False
if (QApplication.instance().activeWindow() is not if (QApplication.instance().activeWindow() is not
utils.get_object('main-window')): objreg.get('main-window')):
# Some other window (print dialog, etc.) is focused so we pass # Some other window (print dialog, etc.) is focused so we pass
# the event through. # the event through.
return False return False

View File

@ -23,7 +23,7 @@ from PyQt5.QtCore import pyqtSlot, Qt
from qutebrowser.config import config, configdata from qutebrowser.config import config, configdata
from qutebrowser.models import basecompletion from qutebrowser.models import basecompletion
from qutebrowser.utils import log, qtutils, utils from qutebrowser.utils import log, qtutils, objreg
from qutebrowser.commands import cmdutils from qutebrowser.commands import cmdutils
@ -155,7 +155,7 @@ class CommandCompletionModel(basecompletion.BaseCompletionModel):
assert cmdutils.cmd_dict assert cmdutils.cmd_dict
cmdlist = [] cmdlist = []
for obj in set(cmdutils.cmd_dict.values()): for obj in set(cmdutils.cmd_dict.values()):
if obj.hide or (obj.debug and not utils.get_object('args').debug): if obj.hide or (obj.debug and not objreg.get('args').debug):
pass pass
else: else:
cmdlist.append((obj.name, obj.desc)) cmdlist.append((obj.name, obj.desc))
@ -182,7 +182,7 @@ class HelpCompletionModel(basecompletion.BaseCompletionModel):
assert cmdutils.cmd_dict assert cmdutils.cmd_dict
cmdlist = [] cmdlist = []
for obj in set(cmdutils.cmd_dict.values()): for obj in set(cmdutils.cmd_dict.values()):
if obj.hide or (obj.debug and not utils.get_object('args').debug): if obj.hide or (obj.debug and not objreg.get('args').debug):
pass pass
else: else:
cmdlist.append((':' + obj.name, obj.desc)) cmdlist.append((':' + obj.name, obj.desc))

View File

@ -23,7 +23,7 @@ from PyQt5.QtCore import (pyqtSlot, Qt, QVariant, QAbstractListModel,
QModelIndex) QModelIndex)
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import usertypes, qtutils, utils from qutebrowser.utils import usertypes, qtutils, objreg
Role = usertypes.enum('Role', 'item', start=Qt.UserRole, is_int=True) Role = usertypes.enum('Role', 'item', start=Qt.UserRole, is_int=True)
@ -39,7 +39,7 @@ class DownloadModel(QAbstractListModel):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
download_manager = utils.get_object('download-manager') download_manager = objreg.get('download-manager')
download_manager.download_about_to_be_added.connect( download_manager.download_about_to_be_added.connect(
lambda idx: self.beginInsertRows(QModelIndex(), idx, idx)) lambda idx: self.beginInsertRows(QModelIndex(), idx, idx))
download_manager.download_added.connect(self.endInsertRows) download_manager.download_added.connect(self.endInsertRows)
@ -81,7 +81,7 @@ class DownloadModel(QAbstractListModel):
if index.parent().isValid() or index.column() != 0: if index.parent().isValid() or index.column() != 0:
return QVariant() return QVariant()
item = utils.get_object('download-manager').downloads[index.row()] item = objreg.get('download-manager').downloads[index.row()]
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
data = str(item) data = str(item)
elif role == Qt.ForegroundRole: elif role == Qt.ForegroundRole:
@ -105,4 +105,4 @@ class DownloadModel(QAbstractListModel):
if parent.isValid(): if parent.isValid():
# We don't have children # We don't have children
return 0 return 0
return len(utils.get_object('download-manager').downloads) return len(objreg.get('download-manager').downloads)

View File

@ -30,7 +30,7 @@ else:
SSL_AVAILABLE = QSslSocket.supportsSsl() SSL_AVAILABLE = QSslSocket.supportsSsl()
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import message, log, usertypes, utils from qutebrowser.utils import message, log, usertypes, utils, objreg
from qutebrowser.network import qutescheme, schemehandler from qutebrowser.network import qutescheme, schemehandler
@ -55,10 +55,10 @@ class NetworkManager(QNetworkAccessManager):
# We have a shared cookie jar and cache - we restore their parents so # We have a shared cookie jar and cache - we restore their parents so
# we don't take ownership of them. # we don't take ownership of them.
app = QCoreApplication.instance() app = QCoreApplication.instance()
cookie_jar = utils.get_object('cookie-jar') cookie_jar = objreg.get('cookie-jar')
self.setCookieJar(cookie_jar) self.setCookieJar(cookie_jar)
cookie_jar.setParent(app) cookie_jar.setParent(app)
cache = utils.get_object('cache') cache = objreg.get('cache')
self.setCache(cache) self.setCache(cache)
cache.setParent(app) cache.setParent(app)

View File

@ -23,7 +23,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from qutebrowser.config import config, configdata from qutebrowser.config import config, configdata
from qutebrowser.commands import cmdutils from qutebrowser.commands import cmdutils
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
from qutebrowser.models import completion as models from qutebrowser.models import completion as models
from qutebrowser.models.completionfilter import CompletionFilterModel as CFM from qutebrowser.models.completionfilter import CompletionFilterModel as CFM
@ -72,7 +72,7 @@ class Completer(QObject):
def _init_setting_completions(self): def _init_setting_completions(self):
"""Initialize setting completion models.""" """Initialize setting completion models."""
config_obj = utils.get_object('config') config_obj = objreg.get('config')
self._models[usertypes.Completion.section] = CFM( self._models[usertypes.Completion.section] = CFM(
models.SettingSectionCompletionModel(self), self) models.SettingSectionCompletionModel(self), self)
self._models[usertypes.Completion.option] = {} self._models[usertypes.Completion.option] = {}

View File

@ -21,7 +21,7 @@
from PyQt5.QtCore import pyqtSignal, QObject, QTimer from PyQt5.QtCore import pyqtSignal, QObject, QTimer
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
def error(message, immediately=False): def error(message, immediately=False):
@ -30,7 +30,7 @@ def error(message, immediately=False):
Args: Args:
See MessageBridge.error. See MessageBridge.error.
""" """
utils.get_object('message-bridge').error(message, immediately) objreg.get('message-bridge').error(message, immediately)
def info(message, immediately=True): def info(message, immediately=True):
@ -39,12 +39,12 @@ def info(message, immediately=True):
Args: Args:
See MessageBridge.info. See MessageBridge.info.
""" """
utils.get_object('message-bridge').info(message, immediately) objreg.get('message-bridge').info(message, immediately)
def set_cmd_text(txt): def set_cmd_text(txt):
"""Convienience function to Set the statusbar command line to a text.""" """Convienience function to Set the statusbar command line to a text."""
utils.get_object('message-bridge').set_cmd_text(txt) objreg.get('message-bridge').set_cmd_text(txt)
def ask(message, mode, default=None): def ask(message, mode, default=None):
@ -62,7 +62,7 @@ def ask(message, mode, default=None):
q.text = message q.text = message
q.mode = mode q.mode = mode
q.default = default q.default = default
utils.get_object('message-bridge').ask(q, blocking=True) objreg.get('message-bridge').ask(q, blocking=True)
q.deleteLater() q.deleteLater()
return q.answer return q.answer
@ -72,7 +72,7 @@ def alert(message):
q = usertypes.Question() q = usertypes.Question()
q.text = message q.text = message
q.mode = usertypes.PromptMode.alert q.mode = usertypes.PromptMode.alert
utils.get_object('message-bridge').ask(q, blocking=True) objreg.get('message-bridge').ask(q, blocking=True)
q.deleteLater() q.deleteLater()
@ -87,7 +87,7 @@ def ask_async(message, mode, handler, default=None):
""" """
if not isinstance(mode, usertypes.PromptMode): if not isinstance(mode, usertypes.PromptMode):
raise TypeError("Mode {} is no PromptMode member!".format(mode)) raise TypeError("Mode {} is no PromptMode member!".format(mode))
bridge = utils.get_object('message-bridge') bridge = objreg.get('message-bridge')
q = usertypes.Question(bridge) q = usertypes.Question(bridge)
q.text = message q.text = message
q.mode = mode q.mode = mode
@ -106,7 +106,7 @@ def confirm_async(message, yes_action, no_action=None, default=None):
no_action: Callable to be called when the user answered no. no_action: Callable to be called when the user answered no.
default: True/False to set a default value, or None. default: True/False to set a default value, or None.
""" """
bridge = utils.get_object('message-bridge') bridge = objreg.get('message-bridge')
q = usertypes.Question(bridge) q = usertypes.Question(bridge)
q.text = message q.text = message
q.mode = usertypes.PromptMode.yesno q.mode = usertypes.PromptMode.yesno

View File

@ -0,0 +1,95 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2014 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# 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 <http://www.gnu.org/licenses/>.
"""The global object registry and related utility functions."""
import collections
import functools
from PyQt5.QtCore import QCoreApplication, QObject
_UNSET = object()
class ObjectRegistry(collections.UserDict):
"""A registry of long-living objects in qutebrowser.
Inspired by the eric IDE code (E5Gui/E5Application.py).
"""
def __setitem__(self, name, obj):
"""Register an object in the object registry.
Sets a slot to remove QObjects when they are destroyed.
"""
if isinstance(obj, QObject):
obj.destroyed.connect(functools.partial(self.on_destroyed, name))
super().__setitem__(name, obj)
def on_destroyed(self, name):
"""Remove a destroyed QObject."""
try:
del self[name]
except KeyError:
pass
def dump_objects(self):
"""Dump all objects as a list of strings."""
lines = []
for name, obj in self.data.items():
lines.append("{}: {}".format(name, repr(obj)))
return lines
def get(name, default=_UNSET):
"""Helper function to get an object.
Args:
default: A default to return if the object does not exist.
"""
try:
return QCoreApplication.instance().registry[name]
except KeyError:
if default is not _UNSET:
return default
else:
raise
def register(name, obj, update=False):
"""Helper function to register an object.
Args:
name: The name the object will be registered as.
obj: The object to register.
update: If True, allows to update an already registered object.
"""
registry = QCoreApplication.instance().registry
if not update and name in registry:
raise KeyError("Object '{}' is already registered ({})!".format(
name, repr(registry[name])))
registry[name] = obj
def delete(name):
"""Helper function to unregister an object."""
del QCoreApplication.instance().registry[name]

View File

@ -24,8 +24,6 @@ Module attributes:
""" """
import operator import operator
import functools
import collections
import collections.abc import collections.abc
import enum as pyenum import enum as pyenum
@ -383,34 +381,3 @@ class Timer(QTimer):
super().start(msec) super().start(msec)
else: else:
super().start() super().start()
class ObjectRegistry(collections.UserDict):
"""A registry of long-living objects in qutebrowser.
Inspired by the eric IDE code (E5Gui/E5Application.py).
"""
def __setitem__(self, name, obj):
"""Register an object in the object registry.
Sets a slot to remove QObjects when they are destroyed.
"""
if isinstance(obj, QObject):
obj.destroyed.connect(functools.partial(self.on_destroyed, name))
super().__setitem__(name, obj)
def on_destroyed(self, name):
"""Remove a destroyed QObject."""
try:
del self[name]
except KeyError:
pass
def dump_objects(self):
"""Dump all objects as a list of strings."""
lines = []
for name, obj in self.data.items():
lines.append("{}: {}".format(name, repr(obj)))
return lines

View File

@ -25,7 +25,7 @@ import functools
from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QCoreApplication
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
from qutebrowser.commands import runners, cmdexc, cmdutils from qutebrowser.commands import runners, cmdexc, cmdutils
from qutebrowser.config import style from qutebrowser.config import style
@ -96,7 +96,7 @@ def debug_all_objects():
@cmdutils.register(debug=True) @cmdutils.register(debug=True)
def debug_cache_stats(): def debug_cache_stats():
"""Print LRU cache stats.""" """Print LRU cache stats."""
config_info = utils.get_object('config').get.cache_info() config_info = objreg.get('config').get.cache_info()
style_info = style.get_stylesheet.cache_info() style_info = style.get_stylesheet.cache_info()
log.misc.debug('config: {}'.format(config_info)) log.misc.debug('config: {}'.format(config_info))
log.misc.debug('style: {}'.format(style_info)) log.misc.debug('style: {}'.format(style_info))
@ -105,4 +105,4 @@ def debug_cache_stats():
@cmdutils.register(debug=True) @cmdutils.register(debug=True)
def debug_console(): def debug_console():
"""Show the debugging console.""" """Show the debugging console."""
utils.get_object('debug-console').show() objreg.get('debug-console').show()

View File

@ -39,9 +39,6 @@ import qutebrowser
from qutebrowser.utils import qtutils, log from qutebrowser.utils import qtutils, log
_UNSET = object()
def elide(text, length): def elide(text, length):
"""Elide text so it uses a maximum of length chars.""" """Elide text so it uses a maximum of length chars."""
if length < 1: if length < 1:
@ -581,38 +578,3 @@ def is_enum(obj):
return issubclass(obj, enum.Enum) return issubclass(obj, enum.Enum)
except TypeError: except TypeError:
return False return False
def get_object(name, default=_UNSET):
"""Helper function to get an object.
Args:
default: A default to return if the object does not exist.
"""
try:
return QCoreApplication.instance().registry[name]
except KeyError:
if default is not _UNSET:
return default
else:
raise
def register_object(name, obj, update=False):
"""Helper function to register an object.
Args:
name: The name the object will be registered as.
obj: The object to register.
update: If True, allows to update an already registered object.
"""
registry = QCoreApplication.instance().registry
if not update and name in registry:
raise KeyError("Object '{}' is already registered ({})!".format(
name, repr(registry[name])))
registry[name] = obj
def delete_object(name):
"""Helper function to unregister an object."""
del QCoreApplication.instance().registry[name]

View File

@ -29,7 +29,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QItemSelectionModel
from qutebrowser.commands import cmdutils from qutebrowser.commands import cmdutils
from qutebrowser.config import config, style from qutebrowser.config import config, style
from qutebrowser.widgets import completiondelegate from qutebrowser.widgets import completiondelegate
from qutebrowser.utils import completer, usertypes, qtutils, utils from qutebrowser.utils import completer, usertypes, qtutils, objreg
class CompletionView(QTreeView): class CompletionView(QTreeView):
@ -92,7 +92,7 @@ class CompletionView(QTreeView):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
completer_obj = completer.Completer(self) completer_obj = completer.Completer(self)
utils.register_object('completer', completer_obj) objreg.register('completer', completer_obj)
self.enabled = config.get('completion', 'show') self.enabled = config.get('completion', 'show')
self._delegate = completiondelegate.CompletionItemDelegate(self) self._delegate = completiondelegate.CompletionItemDelegate(self)
@ -225,7 +225,7 @@ class CompletionView(QTreeView):
def selectionChanged(self, selected, deselected): def selectionChanged(self, selected, deselected):
"""Extend selectionChanged to call completers selection_changed.""" """Extend selectionChanged to call completers selection_changed."""
super().selectionChanged(selected, deselected) super().selectionChanged(selected, deselected)
utils.get_object('completer').selection_changed(selected, deselected) objreg.get('completer').selection_changed(selected, deselected)
def resizeEvent(self, e): def resizeEvent(self, e):
"""Extend resizeEvent to adjust column size.""" """Extend resizeEvent to adjust column size."""

View File

@ -29,7 +29,7 @@ from PyQt5.QtCore import Qt, QSize
from PyQt5.QtWidgets import (QDialog, QLabel, QTextEdit, QPushButton, from PyQt5.QtWidgets import (QDialog, QLabel, QTextEdit, QPushButton,
QVBoxLayout, QHBoxLayout) QVBoxLayout, QHBoxLayout)
from qutebrowser.utils import version, log, utils from qutebrowser.utils import version, log, utils, objreg
class _CrashDialog(QDialog): class _CrashDialog(QDialog):
@ -130,7 +130,7 @@ class _CrashDialog(QDialog):
except Exception: except Exception:
self._crash_info.append(("Version info", traceback.format_exc())) self._crash_info.append(("Version info", traceback.format_exc()))
try: try:
conf = utils.get_object('config') conf = objreg.get('config')
self._crash_info.append(("Config", conf.dump_userconfig())) self._crash_info.append(("Config", conf.dump_userconfig()))
except Exception: except Exception:
self._crash_info.append(("Config", traceback.format_exc())) self._crash_info.append(("Config", traceback.format_exc()))

View File

@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QWidget, QVBoxLayout
from qutebrowser.commands import cmdutils from qutebrowser.commands import cmdutils
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import message, log, usertypes, qtutils, utils from qutebrowser.utils import message, log, usertypes, qtutils, objreg
from qutebrowser.widgets import tabbedbrowser, completion, downloads from qutebrowser.widgets import tabbedbrowser, completion, downloads
from qutebrowser.widgets.statusbar import bar from qutebrowser.widgets.statusbar import bar
@ -50,7 +50,7 @@ class MainWindow(QWidget):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle('qutebrowser') self.setWindowTitle('qutebrowser')
state_config = utils.get_object('state-config') state_config = objreg.get('state-config')
try: try:
data = state_config['geometry']['mainwindow'] data = state_config['geometry']['mainwindow']
log.init.debug("Restoring mainwindow from {}".format(data)) log.init.debug("Restoring mainwindow from {}".format(data))
@ -83,11 +83,11 @@ class MainWindow(QWidget):
self._tabbed_browser = tabbedbrowser.TabbedBrowser() self._tabbed_browser = tabbedbrowser.TabbedBrowser()
self._tabbed_browser.title_changed.connect(self.setWindowTitle) self._tabbed_browser.title_changed.connect(self.setWindowTitle)
utils.register_object('tabbed-browser', self._tabbed_browser) objreg.register('tabbed-browser', self._tabbed_browser)
self._vbox.addWidget(self._tabbed_browser) self._vbox.addWidget(self._tabbed_browser)
self._completion = completion.CompletionView(self) self._completion = completion.CompletionView(self)
utils.register_object('completion', self._completion) objreg.register('completion', self._completion)
self.status = bar.StatusBar() self.status = bar.StatusBar()
self._vbox.addWidget(self.status) self._vbox.addWidget(self.status)

View File

@ -26,7 +26,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, pyqtProperty, Qt
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy
from qutebrowser.config import config, style from qutebrowser.config import config, style
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
from qutebrowser.widgets.statusbar import (command, progress, keystring, from qutebrowser.widgets.statusbar import (command, progress, keystring,
percentage, url, prompt) percentage, url, prompt)
from qutebrowser.widgets.statusbar import text as textwidget from qutebrowser.widgets.statusbar import text as textwidget
@ -132,7 +132,7 @@ class StatusBar(QWidget):
self._stack.setContentsMargins(0, 0, 0, 0) self._stack.setContentsMargins(0, 0, 0, 0)
self._cmd = command.Command() self._cmd = command.Command()
utils.register_object('status-command', self._cmd) objreg.register('status-command', self._cmd)
self._stack.addWidget(self._cmd) self._stack.addWidget(self._cmd)
self.txt = textwidget.Text() self.txt = textwidget.Text()
@ -376,7 +376,7 @@ class StatusBar(QWidget):
@pyqtSlot(usertypes.KeyMode) @pyqtSlot(usertypes.KeyMode)
def on_mode_entered(self, mode): def on_mode_entered(self, mode):
"""Mark certain modes in the commandline.""" """Mark certain modes in the commandline."""
if mode in utils.get_object('mode-manager').passthrough: if mode in objreg.get('mode-manager').passthrough:
text = "-- {} MODE --".format(mode.name.upper()) text = "-- {} MODE --".format(mode.name.upper())
self.txt.set_text(self.txt.Text.normal, text) self.txt.set_text(self.txt.Text.normal, text)
if mode == usertypes.KeyMode.insert: if mode == usertypes.KeyMode.insert:
@ -385,7 +385,7 @@ class StatusBar(QWidget):
@pyqtSlot(usertypes.KeyMode) @pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode): def on_mode_left(self, mode):
"""Clear marked mode.""" """Clear marked mode."""
if mode in utils.get_object('mode-manager').passthrough: if mode in objreg.get('mode-manager').passthrough:
self.txt.set_text(self.txt.Text.normal, '') self.txt.set_text(self.txt.Text.normal, '')
if mode == usertypes.KeyMode.insert: if mode == usertypes.KeyMode.insert:
self._set_insert_active(False) self._set_insert_active(False)

View File

@ -26,7 +26,7 @@ from qutebrowser.keyinput import modeman, modeparsers
from qutebrowser.commands import runners, cmdexc, cmdutils from qutebrowser.commands import runners, cmdexc, cmdutils
from qutebrowser.widgets import misc from qutebrowser.widgets import misc
from qutebrowser.models import cmdhistory from qutebrowser.models import cmdhistory
from qutebrowser.utils import usertypes, log, utils from qutebrowser.utils import usertypes, log, objreg
class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
@ -74,7 +74,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
misc.CommandLineEdit.__init__(self, parent) misc.CommandLineEdit.__init__(self, parent)
misc.MinimalLineEditMixin.__init__(self) misc.MinimalLineEditMixin.__init__(self)
self.cursor_part = 0 self.cursor_part = 0
self.history.history = utils.get_object('command-history').data self.history.history = objreg.get('command-history').data
self._empty_item_idx = None self._empty_item_idx = None
self.textEdited.connect(self.on_text_edited) self.textEdited.connect(self.on_text_edited)
self.cursorPositionChanged.connect(self._update_cursor_part) self.cursorPositionChanged.connect(self._update_cursor_part)
@ -172,7 +172,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
Args: Args:
text: The commandline to set. text: The commandline to set.
""" """
url = utils.get_object('tabbed-browser').current_url().toString( url = objreg.get('tabbed-browser').current_url().toString(
QUrl.FullyEncoded | QUrl.RemovePassword) QUrl.FullyEncoded | QUrl.RemovePassword)
# FIXME we currently replace the URL in any place in the arguments, # FIXME we currently replace the URL in any place in the arguments,
# rather than just replacing it if it is a dedicated argument. We could # rather than just replacing it if it is a dedicated argument. We could

View File

@ -24,7 +24,7 @@ from PyQt5.QtWidgets import QHBoxLayout, QWidget, QLineEdit
from qutebrowser.widgets import misc from qutebrowser.widgets import misc
from qutebrowser.widgets.statusbar import textbase, prompter from qutebrowser.widgets.statusbar import textbase, prompter
from qutebrowser.utils import utils from qutebrowser.utils import objreg
class PromptLineEdit(misc.MinimalLineEditMixin, QLineEdit): class PromptLineEdit(misc.MinimalLineEditMixin, QLineEdit):
@ -66,7 +66,7 @@ class Prompt(QWidget):
self._hbox.addWidget(self.lineedit) self._hbox.addWidget(self.lineedit)
prompter_obj = prompter.Prompter(self) prompter_obj = prompter.Prompter(self)
utils.register_object('prompter', prompter_obj) objreg.register('prompter', prompter_obj)
def __repr__(self): def __repr__(self):
return '<{}>'.format(self.__class__.__name__) return '<{}>'.format(self.__class__.__name__)

View File

@ -26,7 +26,7 @@ from PyQt5.QtWidgets import QLineEdit
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.commands import cmdutils from qutebrowser.commands import cmdutils
from qutebrowser.utils import usertypes, log, qtutils, utils from qutebrowser.utils import usertypes, log, qtutils, objreg
PromptContext = collections.namedtuple('PromptContext', PromptContext = collections.namedtuple('PromptContext',
@ -280,7 +280,7 @@ class Prompter:
self.question = question self.question = question
mode = self._display_question() mode = self._display_question()
question.aborted.connect(lambda: modeman.maybe_leave(mode, 'aborted')) question.aborted.connect(lambda: modeman.maybe_leave(mode, 'aborted'))
mode_manager = utils.get_object('mode-manager') mode_manager = objreg.get('mode-manager')
try: try:
modeman.enter(mode, 'question asked') modeman.enter(mode, 'question asked')
except modeman.ModeLockedError: except modeman.ModeLockedError:

View File

@ -31,7 +31,7 @@ from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.widgets import tabwidget, webview from qutebrowser.widgets import tabwidget, webview
from qutebrowser.browser import signalfilter, commands from qutebrowser.browser import signalfilter, commands
from qutebrowser.utils import log, message, usertypes, utils, qtutils from qutebrowser.utils import log, message, usertypes, utils, qtutils, objreg
class TabbedBrowser(tabwidget.TabWidget): class TabbedBrowser(tabwidget.TabWidget):
@ -109,7 +109,7 @@ class TabbedBrowser(tabwidget.TabWidget):
self.url_stack = [] self.url_stack = []
self._filter = signalfilter.SignalFilter(self) self._filter = signalfilter.SignalFilter(self)
dispatcher = commands.CommandDispatcher(self) dispatcher = commands.CommandDispatcher(self)
utils.register_object('command-dispatcher', dispatcher) objreg.register('command-dispatcher', dispatcher)
self._now_focused = None self._now_focused = None
# FIXME adjust this to font size # FIXME adjust this to font size
self.setIconSize(QSize(12, 12)) self.setIconSize(QSize(12, 12))
@ -261,8 +261,8 @@ class TabbedBrowser(tabwidget.TabWidget):
tab)) tab))
if tab is self._now_focused: if tab is self._now_focused:
self._now_focused = None self._now_focused = None
if tab is utils.get_object('last-focused-tab', None): if tab is objreg.get('last-focused-tab', None):
utils.delete_object('last-focused-tab') objreg.delete('last-focused-tab')
if not tab.cur_url.isEmpty(): if not tab.cur_url.isEmpty():
qtutils.ensure_valid(tab.cur_url) qtutils.ensure_valid(tab.cur_url)
self.url_stack.append(tab.cur_url) self.url_stack.append(tab.cur_url)
@ -525,8 +525,7 @@ class TabbedBrowser(tabwidget.TabWidget):
tab.setFocus() tab.setFocus()
modeman.maybe_leave(usertypes.KeyMode.hint, 'tab changed') modeman.maybe_leave(usertypes.KeyMode.hint, 'tab changed')
if self._now_focused is not None: if self._now_focused is not None:
utils.register_object('last-focused-tab', self._now_focused, objreg.register('last-focused-tab', self._now_focused, update=True)
update=True)
self._now_focused = tab self._now_focused = tab
self.current_tab_changed.emit(tab) self.current_tab_changed.emit(tab)
self.title_changed.emit('{} - qutebrowser'.format(self.tabText(idx))) self.title_changed.emit('{} - qutebrowser'.format(self.tabText(idx)))

View File

@ -31,7 +31,7 @@ from PyQt5.QtWidgets import (QTabWidget, QTabBar, QSizePolicy, QCommonStyle,
QStyle, QStylePainter, QStyleOptionTab) QStyle, QStylePainter, QStyleOptionTab)
from PyQt5.QtGui import QIcon, QPalette, QColor from PyQt5.QtGui import QIcon, QPalette, QColor
from qutebrowser.utils import qtutils, utils from qutebrowser.utils import qtutils, objreg
from qutebrowser.config import config from qutebrowser.config import config
@ -209,7 +209,7 @@ class TabBar(QTabBar):
confwidth = str(config.get('tabs', 'width')) confwidth = str(config.get('tabs', 'width'))
if confwidth.endswith('%'): if confwidth.endswith('%'):
perc = int(confwidth.rstrip('%')) perc = int(confwidth.rstrip('%'))
width = utils.get_object('main-window').width() * perc / 100 width = objreg.get('main-window').width() * perc / 100
else: else:
width = int(confwidth) width = int(confwidth)
size = QSize(max(minimum_size.width(), width), height) size = QSize(max(minimum_size.width(), width), height)

View File

@ -26,7 +26,7 @@ from PyQt5.QtWebKitWidgets import QWebView, QWebPage
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.utils import message, log, usertypes, utils, qtutils from qutebrowser.utils import message, log, usertypes, utils, qtutils, objreg
from qutebrowser.browser import webpage, hints, webelem from qutebrowser.browser import webpage, hints, webelem
from qutebrowser.commands import cmdexc from qutebrowser.commands import cmdexc
@ -358,7 +358,7 @@ class WebView(QWebView):
self._set_load_status(LoadStatus.error) self._set_load_status(LoadStatus.error)
if not config.get('input', 'auto-insert-mode'): if not config.get('input', 'auto-insert-mode'):
return return
cur_mode = utils.get_object('mode-manager').mode() cur_mode = objreg.get('mode-manager').mode()
if cur_mode == usertypes.KeyMode.insert or not ok: if cur_mode == usertypes.KeyMode.insert or not ok:
return return
frame = self.page().currentFrame() frame = self.page().currentFrame()