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

View File

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

View File

@ -98,9 +98,7 @@ class Command:
Raise: Raise:
PrerequisitesError if the command can't be called currently. PrerequisitesError if the command can't be called currently.
""" """
# We don't use modeman.instance() here to avoid a circular import curmode = utils.get_object('modeman').mode()
# of qutebrowser.keyinput.modeman.
curmode = QCoreApplication.instance().modeman.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(

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 from qutebrowser.utils import usertypes, log, utils
class ModeLockedError(Exception): class ModeLockedError(Exception):
@ -37,25 +37,20 @@ class ModeLockedError(Exception):
"""Exception raised when the mode is currently locked.""" """Exception raised when the mode is currently locked."""
def instance():
"""Get the global modeman instance."""
return QApplication.instance().modeman
def enter(mode, reason=None): def enter(mode, reason=None):
"""Enter the mode 'mode'.""" """Enter the mode 'mode'."""
instance().enter(mode, reason) utils.get_object('modeman').enter(mode, reason)
def leave(mode, reason=None): def leave(mode, reason=None):
"""Leave the mode 'mode'.""" """Leave the mode 'mode'."""
instance().leave(mode, reason) utils.get_object('modeman').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:
instance().enter(mode, reason) utils.get_object('modeman').enter(mode, reason)
except ModeLockedError: except ModeLockedError:
pass pass
@ -63,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:
instance().leave(mode, reason) utils.get_object('modeman').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)

View File

@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.config import config, style 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, 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
@ -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 modeman.instance().passthrough: if mode in utils.get_object('modeman').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 modeman.instance().passthrough: if mode in utils.get_object('modeman').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

@ -280,13 +280,14 @@ 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'))
modeman_obj = utils.get_object('modeman')
try: try:
modeman.enter(mode, 'question asked') modeman.enter(mode, 'question asked')
except modeman.ModeLockedError: except modeman.ModeLockedError:
if modeman.instance().mode() != usertypes.KeyMode.prompt: if modeman_obj.mode() != usertypes.KeyMode.prompt:
question.abort() question.abort()
return None return None
modeman.instance().locked = True modeman_obj.locked = True
if blocking: if blocking:
loop = qtutils.EventLoop() loop = qtutils.EventLoop()
self._loops.append(loop) self._loops.append(loop)

View File

@ -358,7 +358,8 @@ 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
if modeman.instance().mode() == usertypes.KeyMode.insert or not ok: if (utils.get_object('modeman').mode() == usertypes.KeyMode.insert or
not ok):
return return
frame = self.page().currentFrame() frame = self.page().currentFrame()
try: try: