Use object registry for modeman.

This commit is contained in:
Florian Bruhin 2014-09-23 19:57:51 +02:00
parent d441471a17
commit 5f45d3de60
7 changed files with 49 additions and 51 deletions

View File

@ -58,7 +58,6 @@ class Application(QApplication):
mainwindow: The MainWindow QWidget.
config: The main ConfigManager
cmd_history: The "cmd_history" LineConfigParser instance.
modeman: The global ModeManager instance.
args: ArgumentParser instance.
_commandrunner: The main CommandRunner instance.
_debugconsole: The ConsoleWidget for debugging.
@ -95,7 +94,6 @@ class Application(QApplication):
self._keyparsers = None
self._crashdlg = None
self._crashlogfile = None
self.modeman = None
self.cmd_history = None
self.config = None
self.keyconfig = None
@ -112,6 +110,7 @@ class Application(QApplication):
self._handle_segfault()
log.init.debug("Initializing modes...")
self._init_modes()
modeman_obj = self.registry['modeman']
log.init.debug("Initializing websettings...")
websettings.init()
log.init.debug("Initializing quickmarks...")
@ -137,16 +136,16 @@ class Application(QApplication):
self.downloadmanager = downloads.DownloadManager(self)
log.init.debug("Initializing main window...")
self.mainwindow = mainwindow.MainWindow()
self.modeman.mainwindow = self.mainwindow
modeman_obj.mainwindow = self.mainwindow
log.init.debug("Initializing debug console...")
self._debugconsole = console.ConsoleWidget()
log.init.debug("Initializing eventfilter...")
self.installEventFilter(self.modeman)
self.installEventFilter(modeman_obj)
self.setQuitOnLastWindowClosed(False)
log.init.debug("Connecting signals...")
self._connect_signals()
self.modeman.enter(utypes.KeyMode.normal, 'init')
modeman.enter(utypes.KeyMode.normal, 'init')
log.init.debug("Showing mainwindow...")
if not args.nowindow:
@ -227,26 +226,27 @@ class Application(QApplication):
utypes.KeyMode.yesno:
modeparsers.PromptKeyParser(self),
}
self.modeman = modeman.ModeManager(self)
self.modeman.register(utypes.KeyMode.normal,
self._keyparsers[utypes.KeyMode.normal].handle)
self.modeman.register(utypes.KeyMode.hint,
self._keyparsers[utypes.KeyMode.hint].handle)
self.modeman.register(utypes.KeyMode.insert,
self._keyparsers[utypes.KeyMode.insert].handle,
passthrough=True)
self.modeman.register(
modeman_obj = modeman.ModeManager(self)
self.registry['modeman'] = modeman_obj
modeman_obj.register(utypes.KeyMode.normal,
self._keyparsers[utypes.KeyMode.normal].handle)
modeman_obj.register(utypes.KeyMode.hint,
self._keyparsers[utypes.KeyMode.hint].handle)
modeman_obj.register(utypes.KeyMode.insert,
self._keyparsers[utypes.KeyMode.insert].handle,
passthrough=True)
modeman_obj.register(
utypes.KeyMode.passthrough,
self._keyparsers[utypes.KeyMode.passthrough].handle,
passthrough=True)
self.modeman.register(utypes.KeyMode.command,
self._keyparsers[utypes.KeyMode.command].handle,
passthrough=True)
self.modeman.register(utypes.KeyMode.prompt,
self._keyparsers[utypes.KeyMode.prompt].handle,
passthrough=True)
self.modeman.register(utypes.KeyMode.yesno,
self._keyparsers[utypes.KeyMode.yesno].handle)
modeman_obj.register(utypes.KeyMode.command,
self._keyparsers[utypes.KeyMode.command].handle,
passthrough=True)
modeman_obj.register(utypes.KeyMode.prompt,
self._keyparsers[utypes.KeyMode.prompt].handle,
passthrough=True)
modeman_obj.register(utypes.KeyMode.yesno,
self._keyparsers[utypes.KeyMode.yesno].handle)
def _init_misc(self):
"""Initialize misc things."""
@ -378,16 +378,17 @@ class Application(QApplication):
completer = self.mainwindow.completion.completer
searchrunner = self.registry['searchrunner']
messagebridge = self.registry['messagebridge']
modeman = self.registry['modeman']
# misc
self.lastWindowClosed.connect(self.shutdown)
tabs.quit.connect(self.shutdown)
# status bar
self.modeman.entered.connect(status.on_mode_entered)
self.modeman.left.connect(status.on_mode_left)
self.modeman.left.connect(status.cmd.on_mode_left)
self.modeman.left.connect(status.prompt.prompter.on_mode_left)
modeman.entered.connect(status.on_mode_entered)
modeman.left.connect(status.on_mode_left)
modeman.left.connect(status.cmd.on_mode_left)
modeman.left.connect(status.prompt.prompter.on_mode_left)
# commands
cmd.got_cmd.connect(self._commandrunner.run_safely)
@ -418,7 +419,7 @@ class Application(QApplication):
# config
self.config.style_changed.connect(style.get_stylesheet.cache_clear)
for obj in (tabs, completion, self.mainwindow, self.cmd_history,
websettings, self.modeman, status, status.txt):
websettings, modeman, status, status.txt):
self.config.changed.connect(obj.on_config_changed)
for obj in kp.values():
self.keyconfig.changed.connect(obj.on_keyconfig_changed)
@ -444,7 +445,7 @@ class Application(QApplication):
tabs.cur_load_status_changed.connect(status.url.on_load_status_changed)
# command input / completion
self.modeman.left.connect(tabs.on_mode_left)
modeman.left.connect(tabs.on_mode_left)
cmd.clear_completion_selection.connect(
completion.on_clear_completion_selection)
cmd.hide_completion.connect(completion.hide)
@ -747,9 +748,11 @@ class Application(QApplication):
"""Second stage of shutdown."""
log.destroy.debug("Stage 2 of shutting down...")
# Remove eventfilter
if self.modeman is not None:
try:
log.destroy.debug("Removing eventfilter...")
self.removeEventFilter(self.modeman)
self.removeEventFilter(self.registry['modeman'])
except KeyError:
pass
# Close all tabs
if self.mainwindow is not None:
log.destroy.debug("Closing tabs...")

View File

@ -149,8 +149,8 @@ class HintManager(QObject):
"""
super().__init__(parent)
self._context = None
modeman.instance().left.connect(self.on_mode_left)
modeman.instance().entered.connect(self.on_mode_entered)
utils.get_object('modeman').left.connect(self.on_mode_left)
utils.get_object('modeman').entered.connect(self.on_mode_entered)
def _cleanup(self):
"""Clean up after hinting."""

View File

@ -98,9 +98,7 @@ class Command:
Raise:
PrerequisitesError if the command can't be called currently.
"""
# We don't use modeman.instance() here to avoid a circular import
# of qutebrowser.keyinput.modeman.
curmode = QCoreApplication.instance().modeman.mode()
curmode = utils.get_object('modeman').mode()
if self.modes is not None and curmode not in self.modes:
mode_names = '/'.join(mode.name for mode in self.modes)
raise cmdexc.PrerequisitesError(

View File

@ -29,7 +29,7 @@ from PyQt5.QtWidgets import QApplication
from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import usertypes, log
from qutebrowser.utils import usertypes, log, utils
class ModeLockedError(Exception):
@ -37,25 +37,20 @@ class ModeLockedError(Exception):
"""Exception raised when the mode is currently locked."""
def instance():
"""Get the global modeman instance."""
return QApplication.instance().modeman
def enter(mode, reason=None):
"""Enter the mode 'mode'."""
instance().enter(mode, reason)
utils.get_object('modeman').enter(mode, reason)
def leave(mode, reason=None):
"""Leave the mode 'mode'."""
instance().leave(mode, reason)
utils.get_object('modeman').leave(mode, reason)
def maybe_enter(mode, reason=None):
"""Convenience method to enter 'mode' without exceptions."""
try:
instance().enter(mode, reason)
utils.get_object('modeman').enter(mode, reason)
except ModeLockedError:
pass
@ -63,7 +58,7 @@ def maybe_enter(mode, reason=None):
def maybe_leave(mode, reason=None):
"""Convenience method to leave 'mode' without exceptions."""
try:
instance().leave(mode, reason)
utils.get_object('modeman').leave(mode, reason)
except ValueError as e:
# This is rather likely to happen, so we only log to debug log.
log.modes.debug(e)

View File

@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy
from qutebrowser.keyinput import modeman
from qutebrowser.config import config, style
from qutebrowser.utils import usertypes, log
from qutebrowser.utils import usertypes, log, utils
from qutebrowser.widgets.statusbar import (command, progress, keystring,
percentage, url, prompt)
from qutebrowser.widgets.statusbar import text as textwidget
@ -376,7 +376,7 @@ class StatusBar(QWidget):
@pyqtSlot(usertypes.KeyMode)
def on_mode_entered(self, mode):
"""Mark certain modes in the commandline."""
if mode in modeman.instance().passthrough:
if mode in utils.get_object('modeman').passthrough:
text = "-- {} MODE --".format(mode.name.upper())
self.txt.set_text(self.txt.Text.normal, text)
if mode == usertypes.KeyMode.insert:
@ -385,7 +385,7 @@ class StatusBar(QWidget):
@pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode):
"""Clear marked mode."""
if mode in modeman.instance().passthrough:
if mode in utils.get_object('modeman').passthrough:
self.txt.set_text(self.txt.Text.normal, '')
if mode == usertypes.KeyMode.insert:
self._set_insert_active(False)

View File

@ -280,13 +280,14 @@ class Prompter:
self.question = question
mode = self._display_question()
question.aborted.connect(lambda: modeman.maybe_leave(mode, 'aborted'))
modeman_obj = utils.get_object('modeman')
try:
modeman.enter(mode, 'question asked')
except modeman.ModeLockedError:
if modeman.instance().mode() != usertypes.KeyMode.prompt:
if modeman_obj.mode() != usertypes.KeyMode.prompt:
question.abort()
return None
modeman.instance().locked = True
modeman_obj.locked = True
if blocking:
loop = qtutils.EventLoop()
self._loops.append(loop)

View File

@ -358,7 +358,8 @@ class WebView(QWebView):
self._set_load_status(LoadStatus.error)
if not config.get('input', 'auto-insert-mode'):
return
if modeman.instance().mode() == usertypes.KeyMode.insert or not ok:
if (utils.get_object('modeman').mode() == usertypes.KeyMode.insert or
not ok):
return
frame = self.page().currentFrame()
try: