Fix statusbar with nested passthrough modes.

Fixes #87.
This commit is contained in:
Florian Bruhin 2014-12-08 20:18:55 +01:00
parent 1d7f704804
commit d611a37d7d
2 changed files with 18 additions and 10 deletions

View File

@ -159,11 +159,12 @@ class ModeManager(QObject):
arg2: The window ID of this mode manager.
left: Emitted when a mode is left.
arg1: The mode which has been left.
arg2: The window ID of this mode manager.
arg2: The new current mode.
arg3: The window ID of this mode manager.
"""
entered = pyqtSignal(usertypes.KeyMode, int)
left = pyqtSignal(usertypes.KeyMode, int)
left = pyqtSignal(usertypes.KeyMode, usertypes.KeyMode, int)
def __init__(self, win_id, parent=None):
super().__init__(parent)
@ -321,7 +322,7 @@ class ModeManager(QObject):
log.modes.debug("Leaving mode {}{}, new mode stack {}".format(
mode, '' if reason is None else ' (reason: {})'.format(reason),
self.mode_stack))
self.left.emit(mode, self._win_id)
self.left.emit(mode, self.mode(), self._win_id)
@cmdutils.register(instance='mode-manager', name='leave-mode',
not_modes=[usertypes.KeyMode.normal], hide=True,

View File

@ -235,6 +235,11 @@ class StatusBar(QWidget):
self._insert_active = val
self.setStyleSheet(style.get_stylesheet(self.STYLESHEET))
def _set_mode_text(self, mode):
"""Set the mode text."""
text = "-- {} MODE --".format(mode.upper())
self.txt.set_text(self.txt.Text.normal, text)
def _pop_text(self):
"""Display a text in the statusbar and pop it from _text_queue."""
try:
@ -386,19 +391,21 @@ class StatusBar(QWidget):
mode_manager = objreg.get('mode-manager', scope='window',
window=self._win_id)
if mode in mode_manager.passthrough:
text = "-- {} MODE --".format(mode.name.upper())
self.txt.set_text(self.txt.Text.normal, text)
self._set_mode_text(mode.name)
if mode == usertypes.KeyMode.insert:
self._set_insert_active(True)
@pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode):
@pyqtSlot(usertypes.KeyMode, usertypes.KeyMode)
def on_mode_left(self, old_mode, new_mode):
"""Clear marked mode."""
mode_manager = objreg.get('mode-manager', scope='window',
window=self._win_id)
if mode in mode_manager.passthrough:
self.txt.set_text(self.txt.Text.normal, '')
if mode == usertypes.KeyMode.insert:
if old_mode in mode_manager.passthrough:
if new_mode in mode_manager.passthrough:
self._set_mode_text(new_mode.name)
else:
self.txt.set_text(self.txt.Text.normal, '')
if old_mode == usertypes.KeyMode.insert:
self._set_insert_active(False)
@config.change_filter('ui', 'message-timeout')