From e6f8878157f7b06fcd1f8015aa9a320dad436e1f Mon Sep 17 00:00:00 2001 From: Johannes Schultz Date: Sat, 16 Nov 2024 13:49:50 +0000 Subject: [PATCH] [New] Key bindings with IT-like and FT2-like note entry (but otherwise identical keyboard shortcuts) can now be applied directly from the keyboard settings dialog, without the need for external keymap files. git-svn-id: https://source.openmpt.org/svn/openmpt/trunk/OpenMPT@22201 56274372-70c3-4bfc-bfc3-4c3a0b034d27 --- mptrack/CommandSet.cpp | 213 ++++++++++++++++++++++++++++++++++++--- mptrack/CommandSet.h | 14 ++- mptrack/KeyConfigDlg.cpp | 21 +++- mptrack/KeyConfigDlg.h | 8 +- mptrack/mptrack.rc | 3 +- mptrack/resource.h | 2 + 6 files changed, 236 insertions(+), 25 deletions(-) diff --git a/mptrack/CommandSet.cpp b/mptrack/CommandSet.cpp index 27420927eac..9afdd170fac 100644 --- a/mptrack/CommandSet.cpp +++ b/mptrack/CommandSet.cpp @@ -44,7 +44,7 @@ constexpr std::tuple NoteContexts[] = {kCtxViewComments, kcCommentsStartNotes, kcCommentsStartNoteStops}, }; -constexpr struct +struct DefaultKeybinding { CommandID cmd; uint16 key; // Virtual key code, or scan code if high bit is set @@ -52,7 +52,9 @@ constexpr struct FlagSet events; InputTargetContext ctx; Version addedInVersion; -} DefaultKeybindings[] = +}; + +constexpr DefaultKeybinding DefaultKeybindings[] = // clang-format off { {kcFileNew, 'N', ModCtrl, kKeyEventDown, kCtxAllContexts, MPT_V("1.31")}, @@ -255,7 +257,7 @@ constexpr struct {kcSetOctave9, VK_NUMPAD9, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31")}, {kcChordModifier, VK_SHIFT, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31")}, {kcNoteCut, VK_OEM_3, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31")}, - {kcNoteCut, 41 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31.12.02") }, + {kcNoteCut, 41 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31.12.02")}, {kcNoteOff, VK_OEM_PLUS, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31.12.02")}, {kcNoteOff, 13 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31.12.02")}, {kcNoteFade, VK_OEM_MINUS, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.31.12.02")}, @@ -523,6 +525,157 @@ constexpr struct }; // clang-format on +constexpr DefaultKeybinding DefaultKeybindingsIT[] = +// clang-format off +{ + {kcClearFieldStepITStyle, 52 | 0x8000, ModNone, kKeyEventDown | kKeyEventRepeat, kCtxViewPatterns, MPT_V("1.32")}, + {kcVPNoteC_0, 44 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS0, 31 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_0, 45 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS0, 32 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_0, 46 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_0, 47 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS0, 34 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_0, 48 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteGS0, 35 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteA_1, 49 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteAS1, 36 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteB_1, 50 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + + {kcVPNoteC_1, 16 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS1, 3 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_1, 17 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS1, 4 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_1, 18 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_1, 19 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS1, 6 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_1, 20 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteGS1, 7 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteA_2, 21 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteAS2, 8 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteB_2, 22 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteC_2, 23 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS2, 10 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_2, 24 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS2, 11 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_2, 25 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_2, 26 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS2, 13 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_2, 27 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + + {kcSetOctave0, '0', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave0, VK_NUMPAD0, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave1, '1', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave1, VK_NUMPAD1, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave2, '2', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave2, VK_NUMPAD2, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave3, '3', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave3, VK_NUMPAD3, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave4, '4', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave4, VK_NUMPAD4, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave5, '5', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave5, VK_NUMPAD5, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave6, '6', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave6, VK_NUMPAD6, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave7, '7', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave7, VK_NUMPAD7, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave8, '8', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave8, VK_NUMPAD8, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave9, '9', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave9, VK_NUMPAD9, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcChordModifier, VK_SHIFT, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteCut, '1', ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, VK_OEM_3, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, 41 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteFade, VK_OEM_3, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteFade, 41 | 0x8000, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteFade, VK_OEM_5, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteFade, 43 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePC, VK_OEM_102, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePC, 86 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePCS, VK_OEM_102, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePCS, 86 | 0x8000, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, +}; +// clang-format on + +constexpr DefaultKeybinding DefaultKeybindingsFT2[] = +// clang-format off +{ + {kcVPNoteC_1, 44 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS1, 31 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_1, 45 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS1, 32 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_1, 46 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_1, 47 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS1, 34 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_1, 48 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteGS1, 35 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteA_2, 49 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteAS2, 36 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteB_2, 50 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteC_2, 51 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS2, 38 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_2, 52 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS2, 39 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_2, 53 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS2, 43 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + + {kcVPNoteC_2, 16 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS2, 3 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_2, 17 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS2, 4 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_2, 18 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_2, 19 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS2, 6 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_2, 20 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteGS2, 7 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteA_3, 21 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteAS3, 8 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteB_3, 22 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteC_3, 23 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteCS3, 10 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteD_3, 24 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteDS3, 11 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteE_3, 25 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteF_3, 26 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteFS3, 13 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcVPNoteG_3, 27 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + + {kcSetOctave0, '0', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave0, VK_NUMPAD0, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave1, '1', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave1, VK_NUMPAD1, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave2, '2', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave2, VK_NUMPAD2, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave3, '3', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave3, VK_NUMPAD3, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave4, '4', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave4, VK_NUMPAD4, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave5, '5', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave5, VK_NUMPAD5, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave6, '6', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave6, VK_NUMPAD6, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave7, '7', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave7, VK_NUMPAD7, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave8, '8', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave8, VK_NUMPAD8, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave9, '9', ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcSetOctave9, VK_NUMPAD9, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcChordModifier, VK_SHIFT, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteCut, VK_OEM_3, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteCut, 41 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, VK_CAPITAL, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, 58 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, VK_OEM_102, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteOff, 86 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNoteFade, '1', ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePC, VK_OEM_7, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePC, 40 | 0x8000, ModNone, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePCS, VK_OEM_7, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, + {kcNotePCS, 40 | 0x8000, ModShift, kKeyEventDown, kCtxViewPatternsNote, MPT_V("1.32")}, +}; +// clang-format on + }; // namespace #ifdef MPT_ALL_LOGGING @@ -2119,7 +2272,7 @@ void CCommandSet::GenKeyMap(KeyMap &km) void CCommandSet::Copy(const CCommandSet &source) { - m_oldSpecs = source.m_oldSpecs; + m_currentModSpecs = source.m_currentModSpecs; std::copy(std::begin(source.m_commands), std::end(source.m_commands), std::begin(m_commands)); } @@ -2297,7 +2450,7 @@ bool CCommandSet::LoadFile(std::istream &iStrm, const mpt::ustring &filenameDesc } } - ApplyDefaultKeybindings(keymapVersion); + ApplyDefaultKeybindings(KeyboardPreset::MPT, keymapVersion); // Fix up old keymaps containing legacy commands that have been merged into other commands static constexpr std::pair MergeCommands[] = @@ -2337,28 +2490,60 @@ bool CCommandSet::LoadFile(const mpt::PathString &filename) } -void CCommandSet::LoadDefaultKeymap() +void CCommandSet::LoadDefaultKeymap(KeyboardPreset preset) { for(auto &cmd : m_commands) cmd.kcList.clear(); - ApplyDefaultKeybindings(); + ApplyDefaultKeybindings(KeyboardPreset::MPT); + + if(preset == KeyboardPreset::MPT) + return; + + const auto defaults = (preset == KeyboardPreset::IT) ? mpt::as_span(DefaultKeybindingsIT) : mpt::as_span(DefaultKeybindingsFT2); + // Remove all pre-populated notes + for(CommandID cmd = kcVPStartNotes; cmd <= kcVPEndNotes; cmd = static_cast(cmd + 1)) + { + for(const auto &kc : m_commands[cmd].kcList) + { + EnforceAll(kc, cmd, false); + } + m_commands[cmd].kcList.clear(); + } + // Also remove any other keys that are going to be overwritten + for (const auto &key : defaults) + { + for(const auto &kc : m_commands[key.cmd].kcList) + { + EnforceAll(kc, key.cmd, false); + } + m_commands[key.cmd].kcList.clear(); + } + ApplyDefaultKeybindings(preset); } -void CCommandSet::ApplyDefaultKeybindings(const Version onlyCommandsAfterVersion) +void CCommandSet::ApplyDefaultKeybindings(KeyboardPreset preset, const Version onlyCommandsAfterVersion) { - if(m_oldSpecs) + if(m_currentModSpecs) { - const auto specs = m_oldSpecs; - m_oldSpecs = nullptr; + const auto specs = m_currentModSpecs; + m_currentModSpecs = nullptr; QuickChange_SetEffects(*specs); } std::vector layouts(GetKeyboardLayoutList(0, nullptr)); GetKeyboardLayoutList(static_cast(layouts.size()), layouts.data()); + mpt::span defaults; + switch(preset) + { + case KeyboardPreset::MPT: defaults = DefaultKeybindings; break; + case KeyboardPreset::IT: defaults = DefaultKeybindingsIT; break; + case KeyboardPreset::FT2: defaults = DefaultKeybindingsFT2; break; + } + CommandID lastAdded = kcNull; - for(const auto &kb : DefaultKeybindings) + for(const auto &kb : defaults) { if(onlyCommandsAfterVersion != Version{}) { @@ -2567,11 +2752,11 @@ bool CCommandSet::QuickChange_NotesRepeat(bool repeat) bool CCommandSet::QuickChange_SetEffects(const CModSpecifications &modSpecs) { // Is this already the active key configuration? - if(&modSpecs == m_oldSpecs) + if(&modSpecs == m_currentModSpecs) { return false; } - m_oldSpecs = &modSpecs; + m_currentModSpecs = &modSpecs; KeyCombination kc(kCtxViewPatternsFX, ModNone, 0, kKeyEventDown | kKeyEventRepeat); diff --git a/mptrack/CommandSet.h b/mptrack/CommandSet.h index 30cedcd5e2e..f2709ea44a3 100644 --- a/mptrack/CommandSet.h +++ b/mptrack/CommandSet.h @@ -1209,6 +1209,14 @@ struct KeyCommand }; +enum class KeyboardPreset +{ + MPT, + IT, + FT2, +}; + + enum RuleID { krPreventDuplicate, @@ -1241,7 +1249,7 @@ class CCommandSet CommandID FindCmd(uint32 uid) const; bool KeyCombinationConflict(KeyCombination kc1, KeyCombination kc2, bool checkEventConflict = true) const; - void ApplyDefaultKeybindings(const Version onlyCommandsAfterVersion = {}); + void ApplyDefaultKeybindings(KeyboardPreset preset, const Version onlyCommandsAfterVersion = {}); public: CCommandSet(); @@ -1272,12 +1280,12 @@ class CCommandSet bool SaveFile(const mpt::PathString &filename); bool LoadFile(const mpt::PathString &filename); bool LoadFile(std::istream &iStrm, const mpt::ustring &filenameDescription); - void LoadDefaultKeymap(); + void LoadDefaultKeymap(KeyboardPreset preset = KeyboardPreset::MPT); static bool MustBeModifierKey(CommandID id); protected: - const CModSpecifications *m_oldSpecs = nullptr; + const CModSpecifications *m_currentModSpecs = nullptr; KeyCommand m_commands[kcNumCommands]; std::bitset m_isParentContext[kCtxMaxInputContexts]; std::bitset m_enforceRule; diff --git a/mptrack/KeyConfigDlg.cpp b/mptrack/KeyConfigDlg.cpp index 7ab07e44716..1107bf6b91c 100644 --- a/mptrack/KeyConfigDlg.cpp +++ b/mptrack/KeyConfigDlg.cpp @@ -151,6 +151,8 @@ BEGIN_MESSAGE_MAP(COptionsKeyboard, CPropertyPage) ON_COMMAND(IDC_NOTESREPEAT, &COptionsKeyboard::OnNotesRepeat) ON_COMMAND(IDC_NONOTESREPEAT, &COptionsKeyboard::OnNoNotesRepeat) ON_COMMAND(IDC_RESTORE_KEYMAP, &COptionsKeyboard::OnRestoreDefaultKeymap) + ON_COMMAND(ID_KEYPRESET_IT, &COptionsKeyboard::OnRestoreITKeymap) + ON_COMMAND(ID_KEYPRESET_FT2, &COptionsKeyboard::OnRestoreFT2Keymap) ON_EN_CHANGE(IDC_FIND, &COptionsKeyboard::OnSearchTermChanged) ON_EN_SETFOCUS(IDC_FINDHOTKEY, &COptionsKeyboard::OnClearHotKey) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMMAND_LIST, &COptionsKeyboard::OnCommandKeySelChanged) @@ -173,6 +175,7 @@ void COptionsKeyboard::DoDataExchange(CDataExchange *pDX) DDX_Control(pDX, IDC_FIND, m_eFind); DDX_Control(pDX, IDC_STATIC1, m_warnIconCtl); DDX_Control(pDX, IDC_KEYREPORT, m_warnText); + DDX_Control(pDX, IDC_RESTORE_KEYMAP, m_restoreDefaultButton); } @@ -208,6 +211,14 @@ BOOL COptionsKeyboard::OnInitDialog() m_cmbCategory.SetCurSel(0); UpdateDialog(); + CMenu *splitButtonMenu = new CMenu{}; + if(splitButtonMenu->CreatePopupMenu()) + { + splitButtonMenu->AppendMenu(MF_STRING, ID_KEYPRESET_IT, _T("&Impulse Tracker style")); + splitButtonMenu->AppendMenu(MF_STRING, ID_KEYPRESET_FT2, _T("&Fast Tracker style")); + m_restoreDefaultButton.SetDropDownMenu(splitButtonMenu); // takes ownership of menu pointer + } + m_eCustHotKey.SetOwner(*this); m_eFindHotKey.SetOwner(*this); @@ -1059,10 +1070,10 @@ void COptionsKeyboard::OnNoNotesRepeat() void COptionsKeyboard::ForceUpdateGUI(bool updateAllKeys) { - m_forceUpdate = true; // m_nCurKeyChoice and m_nCurHotKey haven't changed, yet we still want to update. - int ntmpChoice = m_curKeyChoice; // next call will overwrite m_nCurKeyChoice + m_forceUpdate = true; // m_curKeyChoice and m_curCommand haven't changed, yet we still want to update. + int curChoice = m_curKeyChoice; // next call will overwrite m_curKeyChoice OnCommandKeySelChanged(); // update keychoice list - m_cmbKeyChoice.SetCurSel(ntmpChoice); // select fresh keychoice (thus restoring m_nCurKeyChoice) + m_cmbKeyChoice.SetCurSel(curChoice); // select fresh keychoice (thus restoring m_curKeyChoice) OnKeyChoiceSelect(); // update key data OnSettingsChanged(); // Enable "apply" button @@ -1081,11 +1092,11 @@ void COptionsKeyboard::ForceUpdateGUI(bool updateAllKeys) } -void COptionsKeyboard::OnRestoreDefaultKeymap() +void COptionsKeyboard::RestoreKeymap(KeyboardPreset preset) { if(Reporting::Confirm("Discard all custom changes and restore default key configuration?", false, true, this) == cnfYes) { - m_localCmdSet->LoadDefaultKeymap(); + m_localCmdSet->LoadDefaultKeymap(preset); ForceUpdateGUI(true); } } diff --git a/mptrack/KeyConfigDlg.h b/mptrack/KeyConfigDlg.h index 3c1c0873a03..462c18825a5 100644 --- a/mptrack/KeyConfigDlg.h +++ b/mptrack/KeyConfigDlg.h @@ -12,7 +12,7 @@ #include "openmpt/all/BuildSettings.hpp" #include "CListCtrl.h" -#include "InputHandler.h" +#include "CommandSet.h" OPENMPT_NAMESPACE_BEGIN @@ -79,6 +79,7 @@ class COptionsKeyboard: public CPropertyPage CStatic m_warnIconCtl, m_warnText; CEdit m_eFind; CEdit m_eChordWaitTime; + CSplitButton m_restoreDefaultButton; HICON m_infoIcon = nullptr, m_warnIcon = nullptr; CString m_lastWarning; @@ -116,6 +117,7 @@ class COptionsKeyboard: public CPropertyPage void EnableKeyChoice(bool enable); void UpdateWarning(CString text = {}, bool notify = false); + void RestoreKeymap(KeyboardPreset preset); afx_msg LRESULT OnDPIChangedAfterParent(WPARAM, LPARAM); afx_msg void UpdateDialog(); @@ -135,7 +137,9 @@ class COptionsKeyboard: public CPropertyPage afx_msg void OnRestoreKeyChoice(); afx_msg void OnLoad(); afx_msg void OnSave(); - afx_msg void OnRestoreDefaultKeymap(); + afx_msg void OnRestoreDefaultKeymap() { RestoreKeymap(KeyboardPreset::MPT); } + afx_msg void OnRestoreITKeymap() { RestoreKeymap(KeyboardPreset::IT); } + afx_msg void OnRestoreFT2Keymap() { RestoreKeymap(KeyboardPreset::FT2); } afx_msg void OnClearHotKey(); afx_msg void OnClearSearch(); afx_msg void OnEnableFindHotKey(); diff --git a/mptrack/mptrack.rc b/mptrack/mptrack.rc index 0e09d0fb3fb..9fdc4686c0b 100644 --- a/mptrack/mptrack.rc +++ b/mptrack/mptrack.rc @@ -1273,7 +1273,8 @@ BEGIN EDITTEXT IDC_CHORDDETECTWAITTIME,252,246,30,12,ES_AUTOHSCROLL | ES_NUMBER PUSHBUTTON "&Import Key Map...",IDC_LOAD,6,264,72,13 PUSHBUTTON "&Export Key Map...",IDC_SAVE,84,264,72,13 - PUSHBUTTON "Restore default &configuration",IDC_RESTORE_KEYMAP,162,264,120,12 + CONTROL "Restore default &configuration",IDC_RESTORE_KEYMAP, + "Button",BS_SPLITBUTTON | WS_TABSTOP,162,264,120,12 END IDD_OPTIONS_COLORS DIALOGEX 0, 0, 286, 282 diff --git a/mptrack/resource.h b/mptrack/resource.h index 04adb5537a7..3cfdb39daa4 100644 --- a/mptrack/resource.h +++ b/mptrack/resource.h @@ -1179,6 +1179,8 @@ #define ID_MAINBAR_SHOW_GLOBALVOLUME 36041 #define ID_MAINBAR_SHOW_VUMETER 36042 #define ID_TREEVIEW_ON_LEFT 36043 +#define ID_KEYPRESET_IT 36044 +#define ID_KEYPRESET_FT2 36045 #define ID_SELECTINST 36100 // From here: Command range [ID_SELECTINST, ID_SELECTINST + MAX_INSTRUMENTS] #define ID_PLUG_RECORDAUTOMATION 37003