address requested changes

- add INPUT_MODES & PROMPT_MODES constants in modeman
- use those in tabbedbrowser and modeman
- fix debug logs format to be more human readable
- fix associated tests for new debug logs
This commit is contained in:
Marc Jauvin 2018-03-13 23:31:48 -04:00
parent 7c2802e843
commit c9f6cd507b
3 changed files with 33 additions and 36 deletions

View File

@ -30,6 +30,9 @@ from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import usertypes, log, objreg, utils from qutebrowser.utils import usertypes, log, objreg, utils
INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough]
PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]
@attr.s(frozen=True) @attr.s(frozen=True)
class KeyEvent: class KeyEvent:
@ -115,7 +118,7 @@ class ModeManager(QObject):
Attributes: Attributes:
mode: The mode we're currently in. mode: The mode we're currently in.
_win_id: The window ID of this ModeManager _win_id: The window ID of this ModeManager
_prev_mode: mode before a prompt poped up _prev_mode: Mode before a prompt popped up
_parsers: A dictionary of modes and their keyparsers. _parsers: A dictionary of modes and their keyparsers.
_forward_unbound_keys: If we should forward unbound keys. _forward_unbound_keys: If we should forward unbound keys.
_releaseevents_to_pass: A set of KeyEvents where the keyPressEvent was _releaseevents_to_pass: A set of KeyEvents where the keyPressEvent was
@ -235,10 +238,8 @@ class ModeManager(QObject):
mode, '' if reason is None else ' (reason: {})'.format(reason))) mode, '' if reason is None else ' (reason: {})'.format(reason)))
if mode not in self._parsers: if mode not in self._parsers:
raise ValueError("No keyparser for mode {}".format(mode)) raise ValueError("No keyparser for mode {}".format(mode))
prompt_modes = (usertypes.KeyMode.prompt, usertypes.KeyMode.yesno) if self.mode == mode or (self.mode in PROMPT_MODES and
input_modes = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] mode in PROMPT_MODES):
if self.mode == mode or (self.mode in prompt_modes and
mode in prompt_modes):
log.modes.debug("Ignoring request as we're in mode {} " log.modes.debug("Ignoring request as we're in mode {} "
"already.".format(self.mode)) "already.".format(self.mode))
return return
@ -250,9 +251,8 @@ class ModeManager(QObject):
return return
log.modes.debug("Overriding mode {}.".format(self.mode)) log.modes.debug("Overriding mode {}.".format(self.mode))
self.left.emit(self.mode, mode, self._win_id) self.left.emit(self.mode, mode, self._win_id)
if (mode in prompt_modes and self.mode in input_modes and if (mode in PROMPT_MODES and self.mode in INPUT_MODES and
config.val.tabs.mode_on_change == 'restore'): config.val.tabs.mode_on_change == 'restore'):
# save previous mode when being prompted
self._prev_mode = self.mode self._prev_mode = self.mode
else: else:
self._prev_mode = usertypes.KeyMode.normal self._prev_mode = usertypes.KeyMode.normal
@ -303,7 +303,7 @@ class ModeManager(QObject):
self.clear_keychain() self.clear_keychain()
self.mode = usertypes.KeyMode.normal self.mode = usertypes.KeyMode.normal
self.left.emit(mode, self.mode, self._win_id) self.left.emit(mode, self.mode, self._win_id)
if mode in [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]: if mode in PROMPT_MODES:
self.enter(self._prev_mode, self.enter(self._prev_mode,
reason='restore mode before {}'.format(mode.name)) reason='restore mode before {}'.format(mode.name))

View File

@ -634,8 +634,8 @@ class TabbedBrowser(tabwidget.TabWidget):
@pyqtSlot(usertypes.KeyMode) @pyqtSlot(usertypes.KeyMode)
def on_mode_entered(self, mode): def on_mode_entered(self, mode):
"""Save input mode when tabs.mode_on_change = restore.""" """Save input mode when tabs.mode_on_change = restore."""
input_modes = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] if (config.val.tabs.mode_on_change == 'restore' and
if mode in input_modes and config.val.tabs.mode_on_change == 'restore': mode in modeman.INPUT_MODES):
tab = self.currentWidget() tab = self.currentWidget()
if tab is not None: if tab is not None:
tab.data.input_mode = mode tab.data.input_mode = mode
@ -643,18 +643,15 @@ class TabbedBrowser(tabwidget.TabWidget):
@pyqtSlot(usertypes.KeyMode) @pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode): def on_mode_left(self, mode):
"""Give focus to current tab if command mode was left.""" """Give focus to current tab if command mode was left."""
if mode in [usertypes.KeyMode.command, usertypes.KeyMode.prompt,
usertypes.KeyMode.yesno]:
widget = self.currentWidget() widget = self.currentWidget()
log.modes.debug("Left status-input mode, focusing {!r}".format(
widget))
if widget is None: if widget is None:
return return
if mode in [usertypes.KeyMode.command] + modeman.PROMPT_MODES:
log.modes.debug("Left status-input mode, focusing {!r}".format(
widget))
widget.setFocus() widget.setFocus()
elif config.val.tabs.mode_on_change == 'restore': if config.val.tabs.mode_on_change == 'restore':
tab = self.currentWidget() widget.data.input_mode = usertypes.KeyMode.normal
if tab is not None:
tab.data.input_mode = usertypes.KeyMode.normal
@pyqtSlot(int) @pyqtSlot(int)
def on_current_changed(self, idx): def on_current_changed(self, idx):
@ -672,25 +669,24 @@ class TabbedBrowser(tabwidget.TabWidget):
log.modes.debug("Current tab changed, focusing {!r}".format(tab)) log.modes.debug("Current tab changed, focusing {!r}".format(tab))
tab.setFocus() tab.setFocus()
prompt_modes = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]
modes_to_leave = [usertypes.KeyMode.hint, usertypes.KeyMode.caret] modes_to_leave = [usertypes.KeyMode.hint, usertypes.KeyMode.caret]
mm_instance = modeman.instance(self._win_id) mm_instance = modeman.instance(self._win_id)
current_mode = mm_instance.mode current_mode = mm_instance.mode
log.modes.debug("{}: mode before tab change: {}." log.modes.debug("Mode before tab change: {} (mode_on_change = {})"
.format(mode_on_change, current_mode.name)) .format(current_mode.name, mode_on_change))
if mode_on_change == 'normal': if mode_on_change == 'normal':
modes_to_leave += [usertypes.KeyMode.insert, modes_to_leave += modeman.INPUT_MODES
usertypes.KeyMode.passthrough]
for mode in modes_to_leave: for mode in modes_to_leave:
modeman.leave(self._win_id, mode, 'tab changed', maybe=True) modeman.leave(self._win_id, mode, 'tab changed', maybe=True)
if mode_on_change == 'restore' and current_mode not in prompt_modes: if (mode_on_change == 'restore' and
current_mode not in modeman.PROMPT_MODES):
modeman.enter(self._win_id, tab.data.input_mode, 'restore') modeman.enter(self._win_id, tab.data.input_mode, 'restore')
if self._now_focused is not None: if self._now_focused is not None:
objreg.register('last-focused-tab', self._now_focused, update=True, objreg.register('last-focused-tab', self._now_focused, update=True,
scope='window', window=self._win_id) scope='window', window=self._win_id)
log.modes.debug("{}: mode after tab change: {}." log.modes.debug("Mode after tab change: {} (mode_on_change = {})"
.format(mode_on_change, mm_instance.mode.name)) .format(current_mode.name, mode_on_change))
self._now_focused = tab self._now_focused = tab
self.current_tab_changed.emit(tab) self.current_tab_changed.emit(tab)
QTimer.singleShot(0, self._update_window_title) QTimer.singleShot(0, self._update_window_title)

View File

@ -163,7 +163,7 @@ Feature: Keyboard input
Then the message "foo 3" should be shown Then the message "foo 3" should be shown
And the message "foo 3" should be shown And the message "foo 3" should be shown
# :test all tabs.mode_on_change modes # test all tabs.mode_on_change modes
Scenario: mode on change normal Scenario: mode on change normal
Given I set tabs.mode_on_change to normal Given I set tabs.mode_on_change to normal
@ -173,8 +173,8 @@ Feature: Keyboard input
And I open about:blank in a new tab And I open about:blank in a new tab
Then "Entering mode KeyMode.insert (reason: command)" should be logged Then "Entering mode KeyMode.insert (reason: command)" should be logged
And "Leaving mode KeyMode.insert (reason: tab changed)" should be logged And "Leaving mode KeyMode.insert (reason: tab changed)" should be logged
And "normal: mode before tab change: insert." should be logged And "Mode before tab change: insert (mode_on_change = normal)" should be logged
And "normal: mode after tab change: normal." should be logged And "Mode after tab change: normal (mode_on_change = normal)" should be logged
Scenario: mode on change persist Scenario: mode on change persist
Given I set tabs.mode_on_change to persist Given I set tabs.mode_on_change to persist
@ -183,8 +183,9 @@ Feature: Keyboard input
And I run :enter-mode insert And I run :enter-mode insert
And I open about:blank in a new tab And I open about:blank in a new tab
Then "Entering mode KeyMode.insert (reason: command)" should be logged Then "Entering mode KeyMode.insert (reason: command)" should be logged
And "persist: mode before tab change: insert." should be logged And "Leaving mode KeyMode.insert (reason: tab changed)" should not be logged
And "persist: mode after tab change: insert." should be logged And "Mode before tab change: insert (mode_on_change = persist)" should be logged
And "Mode after tab change: insert (mode_on_change = persist)" should be logged
Scenario: mode on change restore Scenario: mode on change restore
Given I set tabs.mode_on_change to restore Given I set tabs.mode_on_change to restore
@ -195,11 +196,11 @@ Feature: Keyboard input
And I run :enter-mode passthrough And I run :enter-mode passthrough
And I run :tab-focus 1 And I run :tab-focus 1
Then "Entering mode KeyMode.insert (reason: command)" should be logged Then "Entering mode KeyMode.insert (reason: command)" should be logged
And "restore: mode before tab change: insert." should be logged And "Mode before tab change: insert (mode_on_change = restore)" should be logged
And "Entering mode KeyMode.normal (reason: restore)" should be logged And "Entering mode KeyMode.normal (reason: restore)" should be logged
And "restore: mode after tab change: normal." should be logged And "Mode after tab change: normal (mode_on_change = restore)" should be logged
And "Entering mode KeyMode.passthrough (reason: command)" should be logged And "Entering mode KeyMode.passthrough (reason: command)" should be logged
And "restore: mode before tab change: passthrough." should be logged And "Mode before tab change: passthrough (mode_on_change = restore)" should be logged
And "Entering mode KeyMode.insert (reason: restore)" should be logged And "Entering mode KeyMode.insert (reason: restore)" should be logged
And "restore: mode after tab change: insert." should be logged And "Mode after tab change: insert (mode_on_change = restore)" should be logged