This commit adds
`test_keybinding_successfully_reassigned_after_clearing` test,
which checks that a key binding is successfully reassigned after it
has been cleared.
When a key binding is cleared its value is now set to "" (an empty
string) instead of `None` as before.
This change is introduced because `Gtk.accelerator_parse` does not
allow `None` to be used as a value, which in turn breaks
`on_cellrenderer_accel_edited` function in
`terminatorlib/prefseditor.py` by raising a `TypeError` every time a
new key binding is introduced. Note that this only happens if at
least one key binding has been cleared first.
This commit allows to assign the `Shift+Tab` key binding to an action in
`Preferences>Keybindings`.
In GTK the Tab key can be modified by the Shift key. Such a key combination
has a special key value - `Gdk.KEY_ISO_Left_Tab`.
To allow it, `key = key_with_shift.keyval` was added to the code.
However, `Gdk.KEY_ISO_Left_Tab` key value is displayed as `Left Tab` in
`Preferences>Keybindings`, which is confusing as it is not obvious that it
corresponds to the `Shift+Tab` key combination. To make sure that `Shift+Tab`
is displayed as `Shift+Tab`, the `Shift+Tab` case is treated as if no Shift
was pressed at all.
This commit adds tests that check that:
1) Default key binding accelerators are distinct.
2) Message dialog appears when a duplicate key binding accelerator is
attempted to be assigned to a different action.
3) Duplicate key binding accelerator cannot refer to more than one action.
Also, `active_message_dialog` attribute was added to `PrefsEditor`, so
that tests could get a reference to a message dialog window.
This commit forbids setting duplicate key bindings in
`Preferences > Keybindings` tab.
If a duplicate key binding is detected upon editing, such a key binding
is not assigned and instead a message dialog is displayed saying that the
key binding is a duplicate.