winamp/Src/external_dependencies/openmpt-trunk/mptrack/CommandSet.h
2024-09-24 14:54:57 +02:00

1092 lines
26 KiB
C++

/*
* CommandSet.h
* ------------
* Purpose: Header file for custom key handling: List of supported keyboard shortcuts and class for them.
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
#include <string>
#include "openmpt/base/FlagSet.hpp"
#include <map>
#include <bitset>
OPENMPT_NAMESPACE_BEGIN
#define HOTKEYF_MIDI 0x10 // modifier mask for MIDI CCs
#define HOTKEYF_RSHIFT 0x20 // modifier mask for right Shift key
#define HOTKEYF_RCONTROL 0x40 // modifier mask for right Ctrl key
#define HOTKEYF_RALT 0x80 // modifier mask for right Alt key
enum InputTargetContext : int8
{
kCtxUnknownContext = -1,
kCtxAllContexts = 0,
kCtxViewGeneral,
kCtxViewPatterns,
kCtxViewPatternsNote,
kCtxViewPatternsIns,
kCtxViewPatternsVol,
kCtxViewPatternsFX,
kCtxViewPatternsFXparam,
kCtxViewSamples,
kCtxViewInstruments,
kCtxViewComments,
kCtxViewTree,
kCtxInsNoteMap,
kCtxVSTGUI,
kCtxCtrlGeneral,
kCtxCtrlPatterns,
kCtxCtrlSamples,
kCtxCtrlInstruments,
kCtxCtrlComments,
kCtxCtrlOrderlist,
kCtxChannelSettings,
kCtxMaxInputContexts
};
enum KeyEventType : int8
{
kKeyEventNone = 0,
kKeyEventDown = 1 << 0,
kKeyEventUp = 1 << 1,
kKeyEventRepeat = 1 << 2,
kNumKeyEvents = 1 << 3
};
DECLARE_FLAGSET(KeyEventType)
enum CommandID
{
kcCommandSetNumNotes = 33, // kcVPEndNotes - kcVPStartNotes
kcNull = -1,
kcFirst,
//Global
kcGlobalStart = kcFirst,
kcStartFile = kcGlobalStart,
kcFileNew = kcGlobalStart,
kcFileOpen,
kcFileAppend,
kcFileClose,
kcFileCloseAll,
kcFileSave,
kcFileSaveAs,
kcFileSaveCopy,
kcFileSaveTemplate,
kcFileSaveAsWave,
kcFileSaveAsMP3,
kcFileSaveMidi,
kcFileSaveOPL,
kcFileExportCompat,
kcPrevDocument,
kcNextDocument,
kcFileImportMidiLib,
kcFileAddSoundBank,
kcEndFile = kcFileAddSoundBank,
kcStartPlayCommands,
kcPlayPauseSong = kcStartPlayCommands,
kcPauseSong,
kcStopSong,
kcPlaySongFromStart,
kcPlaySongFromCursor,
kcPlaySongFromPattern,
kcPlayPatternFromStart,
kcPlayPatternFromCursor,
kcToggleLoopSong,
kcPanic,
kcEstimateSongLength,
kcApproxRealBPM,
kcMidiRecord,
kcTempoIncrease,
kcTempoDecrease,
kcTempoIncreaseFine,
kcTempoDecreaseFine,
kcSpeedIncrease,
kcSpeedDecrease,
kcEndPlayCommands = kcSpeedDecrease,
kcStartEditCommands,
kcEditUndo = kcStartEditCommands,
kcEditRedo,
kcEditCut,
kcEditCopy,
kcEditPaste,
kcEditMixPaste,
kcEditMixPasteITStyle,
kcEditPasteFlood,
kcEditPushForwardPaste,
kcEditSelectAll,
kcEditFind,
kcEditFindNext,
kcEndEditCommands = kcEditFindNext,
/*
kcWindowNew,
kcWindowCascade,
kcWindowTileHorz,
kcWindowTileVert,
*/
kcStartView,
kcViewGeneral = kcStartView,
kcViewPattern,
kcViewSamples,
kcViewInstruments,
kcViewComments,
kcViewGraph,
kcViewMain,
kcViewTree,
kcViewOptions,
kcViewChannelManager,
kcViewAddPlugin,
kcViewSongProperties,
kcViewTempoSwing,
kcShowMacroConfig,
kcViewMIDImapping,
kcViewEditHistory,
kcViewToggle,
kcSwitchToInstrLibrary,
kcHelp,
kcEndView = kcHelp,
kcStartMisc,
kcPrevInstrument = kcStartMisc,
kcNextInstrument,
kcPrevOctave,
kcNextOctave,
kcPrevOrder,
kcNextOrder,
kcEndMisc = kcNextOrder,
kcDummyShortcut,
kcGlobalEnd = kcDummyShortcut,
//Pattern Navigation
kcStartPatNavigation,
kcStartJumpSnap = kcStartPatNavigation,
kcPatternJumpDownh1 = kcStartJumpSnap,
kcPatternJumpUph1,
kcPatternJumpDownh2,
kcPatternJumpUph2,
kcPatternSnapDownh1,
kcPatternSnapUph1,
kcPatternSnapDownh2,
kcPatternSnapUph2,
kcPrevEntryInColumn,
kcNextEntryInColumn,
kcEndJumpSnap = kcNextEntryInColumn,
kcStartPlainNavigate,
kcNavigateDown = kcStartPlainNavigate,
kcNavigateUp,
kcNavigateDownBySpacing,
kcNavigateUpBySpacing,
kcNavigateLeft,
kcNavigateRight,
kcNavigateNextChan,
kcNavigatePrevChan,
kcEndPlainNavigate = kcNavigatePrevChan,
kcStartHomeEnd,
kcHomeHorizontal = kcStartHomeEnd,
kcHomeVertical,
kcHomeAbsolute,
kcEndHorizontal,
kcEndVertical,
kcEndAbsolute,
kcEndHomeEnd = kcEndAbsolute,
kcEndPatNavigation = kcEndHomeEnd,
// with select. Order must match above.
kcStartPatNavigationSelect,
kcPatternJumpDownh1Select = kcStartPatNavigationSelect,
kcPatternJumpUph1Select,
kcPatternJumpDownh2Select,
kcPatternJumpUph2Select,
kcPatternSnapDownh1Select,
kcPatternSnapUph1Select,
kcPatternSnapDownh2Select,
kcPatternSnapUph2Select,
kcPrevEntryInColumnSelect,
kcNextEntryInColumnSelect,
kcNavigateDownSelect,
kcNavigateUpSelect,
kcNavigateDownBySpacingSelect,
kcNavigateUpBySpacingSelect,
kcNavigateLeftSelect,
kcNavigateRightSelect,
kcNavigateNextChanSelect,
kcNavigatePrevChanSelect,
kcHomeHorizontalSelect,
kcHomeVerticalSelect,
kcHomeAbsoluteSelect,
kcEndHorizontalSelect,
kcEndVerticalSelect,
kcEndAbsoluteSelect,
kcEndPatNavigationSelect = kcEndAbsoluteSelect,
//Pattern Editing
kcStartPatternEditing,
kcStartSelect = kcStartPatternEditing,
kcSelect = kcStartSelect,
kcSelectWithNav,
kcSelectOff,
kcSelectOffWithNav,
kcSelectWithCopySelect,
kcSelectOffWithCopySelect,
kcCopySelect,
kcCopySelectOff,
kcCopySelectWithNav,
kcCopySelectOffWithNav,
kcCopySelectWithSelect,
kcCopySelectOffWithSelect,
kcSelectChannel,
kcSelectColumn,
kcSelectRow,
kcSelectEvent,
kcSelectBeat,
kcSelectMeasure,
kcLoseSelection,
kcCopyAndLoseSelection,
kcEndSelect = kcCopyAndLoseSelection,
kcStartPatternClipboard,
kcCutPatternChannel = kcStartPatternClipboard,
kcCutPattern,
kcCopyPatternChannel,
kcCopyPattern,
kcPastePatternChannel,
kcPastePattern,
kcToggleClipboardManager,
kcClipboardPrev,
kcClipboardNext,
kcEndPatternClipboard = kcClipboardNext,
kcStartPatternEditMisc,
kcToggleFollowSong = kcStartPatternEditMisc,
kcCursorCopy,
kcCursorPaste,
kcFindInstrument,
kcPatternRecord,
kcPatternPlayRow,
kcSetSpacing,
kcSetSpacing0,
kcSetSpacing1,
kcSetSpacing2,
kcSetSpacing3,
kcSetSpacing4,
kcSetSpacing5,
kcSetSpacing6,
kcSetSpacing7,
kcSetSpacing8,
kcSetSpacing9,
kcIncreaseSpacing,
kcDecreaseSpacing,
kcSwitchToOrderList,
kcNewPattern,
kcDuplicatePattern,
kcSplitPattern,
kcPatternEditPCNotePlugin,
kcTogglePluginEditor,
kcShowNoteProperties,
kcShowPatternProperties,
kcShowSplitKeyboardSettings,
kcChordEditor,
kcChangeLoopStatus,
kcShowEditMenu,
kcShowChannelCtxMenu,
kcShowChannelPluginCtxMenu,
kcTimeAtRow,
kcLockPlaybackToRows,
kcQuantizeSettings,
kcTogglePatternPlayRow,
kcToggleOverflowPaste,
kcToggleNoteOffRecordPC,
kcToggleNoteOffRecordMIDI,
kcEndPatternEditMisc = kcToggleNoteOffRecordMIDI,
kcStartChannelKeys,
kcChannelMute = kcStartChannelKeys,
kcChannelSolo,
kcChannelUnmuteAll,
kcToggleChanMuteOnPatTransition,
kcUnmuteAllChnOnPatTransition,
kcSoloChnOnPatTransition,
kcChannelRecordSelect,
kcChannelSplitRecordSelect,
kcChannelReset,
kcChannelTranspose,
kcChannelDuplicate,
kcChannelAddBefore,
kcChannelAddAfter,
kcChannelRemove,
kcChannelMoveLeft,
kcChannelMoveRight,
kcChannelSettings,
kcEndChannelKeys = kcChannelSettings,
kcBeginTranspose,
kcTransposeUp = kcBeginTranspose,
kcTransposeDown,
kcTransposeOctUp,
kcTransposeOctDown,
kcTransposeCustom,
kcTransposeCustomQuick,
kcDataEntryUp,
kcDataEntryDown,
kcDataEntryUpCoarse,
kcDataEntryDownCoarse,
kcEndTranspose = kcDataEntryDownCoarse,
kcPatternAmplify,
kcPatternInterpolateNote,
kcPatternInterpolateInstr,
kcPatternInterpolateVol,
kcPatternInterpolateEffect,
kcPatternVisualizeEffect,
kcPatternOpenRandomizer,
kcPatternGoto,
kcPatternSetInstrument,
kcPatternSetInstrumentNotEmpty,
kcPatternGrowSelection,
kcPatternShrinkSelection,
// kcClearSelection,
kcClearRow,
kcClearField,
kcClearFieldITStyle,
kcClearRowStep,
kcClearFieldStep,
kcClearFieldStepITStyle,
kcDeleteRow,
kcDeleteWholeRow,
kcDeleteRowGlobal,
kcDeleteWholeRowGlobal,
kcInsertRow,
kcInsertWholeRow,
kcInsertRowGlobal,
kcInsertWholeRowGlobal,
kcPrevPattern,
kcNextPattern,
kcPrevSequence,
kcNextSequence,
kcEndPatternEditing = kcNextSequence,
//Notes
kcVPStartNotes,
kcVPNoteC_0 = kcVPStartNotes,
kcVPNoteCS0,
kcVPNoteD_0,
kcVPNoteDS0,
kcVPNoteE_0,
kcVPNoteF_0,
kcVPNoteFS0,
kcVPNoteG_0,
kcVPNoteGS0,
kcVPNoteA_1,
kcVPNoteAS1,
kcVPNoteB_1,
kcVPNoteC_1,
kcVPNoteCS1,
kcVPNoteD_1,
kcVPNoteDS1,
kcVPNoteE_1,
kcVPNoteF_1,
kcVPNoteFS1,
kcVPNoteG_1,
kcVPNoteGS1,
kcVPNoteA_2,
kcVPNoteAS2,
kcVPNoteB_2,
kcVPNoteC_2,
kcVPNoteCS2,
kcVPNoteD_2,
kcVPNoteDS2,
kcVPNoteE_2,
kcVPNoteF_2,
kcVPNoteFS2,
kcVPNoteG_2,
kcVPNoteGS2,
kcVPNoteA_3,
kcVPEndNotes = kcVPNoteA_3,
//Note stops
kcVPStartNoteStops,
kcVPNoteStopC_0 = kcVPStartNoteStops,
kcVPNoteStopCS0,
kcVPNoteStopD_0,
kcVPNoteStopDS0,
kcVPNoteStopE_0,
kcVPNoteStopF_0,
kcVPNoteStopFS0,
kcVPNoteStopG_0,
kcVPNoteStopGS0,
kcVPNoteStopA_1,
kcVPNoteStopAS1,
kcVPNoteStopB_1,
kcVPNoteStopC_1,
kcVPNoteStopCS1,
kcVPNoteStopD_1,
kcVPNoteStopDS1,
kcVPNoteStopE_1,
kcVPNoteStopF_1,
kcVPNoteStopFS1,
kcVPNoteStopG_1,
kcVPNoteStopGS1,
kcVPNoteStopA_2,
kcVPNoteStopAS2,
kcVPNoteStopB_2,
kcVPNoteStopC_2,
kcVPNoteStopCS2,
kcVPNoteStopD_2,
kcVPNoteStopDS2,
kcVPNoteStopE_2,
kcVPNoteStopF_2,
kcVPNoteStopFS2,
kcVPNoteStopG_2,
kcVPNoteStopGS2,
kcVPNoteStopA_3,
kcVPEndNoteStops = kcVPNoteStopA_3,
//Chords
kcVPStartChords,
kcVPChordC_0 = kcVPStartChords,
kcVPChordCS0,
kcVPChordD_0,
kcVPChordDS0,
kcVPChordE_0,
kcVPChordF_0,
kcVPChordFS0,
kcVPChordG_0,
kcVPChordGS0,
kcVPChordA_1,
kcVPChordAS1,
kcVPChordB_1,
kcVPChordC_1,
kcVPChordCS1,
kcVPChordD_1,
kcVPChordDS1,
kcVPChordE_1,
kcVPChordF_1,
kcVPChordFS1,
kcVPChordG_1,
kcVPChordGS1,
kcVPChordA_2,
kcVPChordAS2,
kcVPChordB_2,
kcVPChordC_2,
kcVPChordCS2,
kcVPChordD_2,
kcVPChordDS2,
kcVPChordE_2,
kcVPChordF_2,
kcVPChordFS2,
kcVPChordG_2,
kcVPChordGS2,
kcVPChordA_3,
kcVPEndChords = kcVPChordA_3,
//Chord Stops
kcVPStartChordStops,
kcVPChordStopC_0 = kcVPStartChordStops,
kcVPChordStopCS0,
kcVPChordStopD_0,
kcVPChordStopDS0,
kcVPChordStopE_0,
kcVPChordStopF_0,
kcVPChordStopFS0,
kcVPChordStopG_0,
kcVPChordStopGS0,
kcVPChordStopA_1,
kcVPChordStopAS1,
kcVPChordStopB_1,
kcVPChordStopC_1,
kcVPChordStopCS1,
kcVPChordStopD_1,
kcVPChordStopDS1,
kcVPChordStopE_1,
kcVPChordStopF_1,
kcVPChordStopFS1,
kcVPChordStopG_1,
kcVPChordStopGS1,
kcVPChordStopA_2,
kcVPChordStopAS2,
kcVPChordStopB_2,
kcVPChordStopC_2,
kcVPChordStopCS2,
kcVPChordStopD_2,
kcVPChordStopDS2,
kcVPChordStopE_2,
kcVPChordStopF_2,
kcVPChordStopFS2,
kcVPChordStopG_2,
kcVPChordStopGS2,
kcVPChordStopA_3,
kcVPEndChordStops = kcVPChordStopA_3,
//Set octave from note column
kcSetOctave0,
kcSetOctave1,
kcSetOctave2,
kcSetOctave3,
kcSetOctave4,
kcSetOctave5,
kcSetOctave6,
kcSetOctave7,
kcSetOctave8,
kcSetOctave9,
// Release set octave key
kcSetOctaveStop0,
kcSetOctaveStop1,
kcSetOctaveStop2,
kcSetOctaveStop3,
kcSetOctaveStop4,
kcSetOctaveStop5,
kcSetOctaveStop6,
kcSetOctaveStop7,
kcSetOctaveStop8,
kcSetOctaveStop9,
//Note Misc
kcStartNoteMisc,
kcChordModifier = kcStartNoteMisc,
kcNoteCutOld,
kcNoteOffOld,
kcNoteFadeOld,
kcNoteCut,
kcNoteOff,
kcNoteFade,
kcNotePC,
kcNotePCS,
kcEndNoteMisc = kcNotePCS,
//Set instruments
kcSetIns0,
kcSetIns1,
kcSetIns2,
kcSetIns3,
kcSetIns4,
kcSetIns5,
kcSetIns6,
kcSetIns7,
kcSetIns8,
kcSetIns9,
//Volume stuff
kcSetVolumeStart,
kcSetVolume0 = kcSetVolumeStart,
kcSetVolume1,
kcSetVolume2,
kcSetVolume3,
kcSetVolume4,
kcSetVolume5,
kcSetVolume6,
kcSetVolume7,
kcSetVolume8,
kcSetVolume9,
kcSetVolumeVol, //v
kcSetVolumePan, //p
kcSetVolumeVolSlideUp, //c
kcSetVolumeVolSlideDown, //d
kcSetVolumeFineVolUp, //a
kcSetVolumeFineVolDown, //b
kcSetVolumeVibratoSpd, //u
kcSetVolumeVibrato, //h
kcSetVolumeXMPanLeft, //l
kcSetVolumeXMPanRight, //r
kcSetVolumePortamento, //g
kcSetVolumeITPortaUp, //f
kcSetVolumeITPortaDown, //e
kcSetVolumeITUnused, //:
kcSetVolumeITOffset, //o
kcSetVolumeEnd = kcSetVolumeITOffset,
//Effect params
kcSetFXParam0,
kcSetFXParam1,
kcSetFXParam2,
kcSetFXParam3,
kcSetFXParam4,
kcSetFXParam5,
kcSetFXParam6,
kcSetFXParam7,
kcSetFXParam8,
kcSetFXParam9,
kcSetFXParamA,
kcSetFXParamB,
kcSetFXParamC,
kcSetFXParamD,
kcSetFXParamE,
kcSetFXParamF,
//Effect commands. ORDER IS CRUCIAL.
kcSetFXStart,
kcFixedFXStart = kcSetFXStart,
kcSetFXarp = kcSetFXStart, //0,j
kcSetFXportUp, //1,f
kcSetFXportDown, //2,e
kcSetFXport, //3,g
kcSetFXvibrato, //4,h
kcSetFXportSlide, //5,l
kcSetFXvibSlide, //6,k
kcSetFXtremolo, //7,r
kcSetFXpan, //8,x
kcSetFXoffset, //9,o
kcSetFXvolSlide, //a,d
kcSetFXgotoOrd, //b,b
kcSetFXsetVol, //c,?
kcSetFXgotoRow, //d,c
kcSetFXretrig, //r,q
kcSetFXspeed, //?,a
kcSetFXtempo, //f,t
kcSetFXtremor, //t,i
kcSetFXextendedMOD, //e,?
kcSetFXextendedS3M, //?,s
kcSetFXchannelVol, //?,m
kcSetFXchannelVols, //?,n
kcSetFXglobalVol, //g,v
kcSetFXglobalVols, //h,w
kcSetFXkeyoff, //k,?
kcSetFXfineVib, //?,u
kcSetFXpanbrello, //y,y
kcSetFXextendedXM, //x,?
kcSetFXpanSlide, //p,p
kcSetFXsetEnvPos, //l,?
kcSetFXmacro, //z,z
kcFixedFXend = kcSetFXmacro,
kcSetFXmacroSlide, //?,\ ,
kcSetFXdelaycut, //?,:
kcSetFXextension, //?,#
kcSetFXFinetune, //?,+
kcSetFXFinetuneSmooth, //?,*
kcSetFXEnd = kcSetFXFinetuneSmooth,
kcStartInstrumentMisc,
kcInstrumentLoad = kcStartInstrumentMisc,
kcInstrumentSave,
kcInstrumentNew,
kcInstrumentEnvelopeLoad,
kcInstrumentEnvelopeSave,
kcInstrumentEnvelopeZoomIn,
kcInstrumentEnvelopeZoomOut,
kcInstrumentEnvelopeScale,
kcInstrumentEnvelopeSwitchToVolume,
kcInstrumentEnvelopeSwitchToPanning,
kcInstrumentEnvelopeSwitchToPitch,
kcInstrumentEnvelopeToggleVolume,
kcInstrumentEnvelopeTogglePanning,
kcInstrumentEnvelopeTogglePitch,
kcInstrumentEnvelopeToggleFilter,
kcInstrumentEnvelopeToggleLoop,
kcInstrumentEnvelopeSelectLoopStart,
kcInstrumentEnvelopeSelectLoopEnd,
kcInstrumentEnvelopeToggleSustain,
kcInstrumentEnvelopeSelectSustainStart,
kcInstrumentEnvelopeSelectSustainEnd,
kcInstrumentEnvelopeToggleCarry,
kcInstrumentEnvelopePointPrev,
kcInstrumentEnvelopePointNext,
kcInstrumentEnvelopePointMoveLeft,
kcInstrumentEnvelopePointMoveRight,
kcInstrumentEnvelopePointMoveLeftCoarse,
kcInstrumentEnvelopePointMoveRightCoarse,
kcInstrumentEnvelopePointMoveUp,
kcInstrumentEnvelopePointMoveUp8,
kcInstrumentEnvelopePointMoveDown,
kcInstrumentEnvelopePointMoveDown8,
kcInstrumentEnvelopePointInsert,
kcInstrumentEnvelopePointRemove,
kcInstrumentEnvelopeSetLoopStart,
kcInstrumentEnvelopeSetLoopEnd,
kcInstrumentEnvelopeSetSustainLoopStart,
kcInstrumentEnvelopeSetSustainLoopEnd,
kcInstrumentEnvelopeToggleReleaseNode,
kcEndInstrumentMisc = kcInstrumentEnvelopeToggleReleaseNode,
kcStartInstrumentCtrlMisc,
kcInstrumentCtrlLoad = kcStartInstrumentCtrlMisc,
kcInstrumentCtrlSave,
kcInstrumentCtrlNew,
kcInstrumentCtrlDuplicate,
kcInsNoteMapEditSampleMap,
kcInsNoteMapEditSample,
kcInsNoteMapCopyCurrentNote,
kcInsNoteMapCopyCurrentSample,
kcInsNoteMapReset,
kcInsNoteMapTransposeSamples,
kcInsNoteMapRemove,
kcInsNoteMapTransposeUp,
kcInsNoteMapTransposeDown,
kcInsNoteMapTransposeOctUp,
kcInsNoteMapTransposeOctDown,
kcEndInstrumentCtrlMisc = kcInsNoteMapTransposeOctDown,
kcStartSampleMisc,
kcSampleLoad = kcStartSampleMisc,
kcSampleLoadRaw,
kcSampleSave,
kcSampleNew,
kcSampleDuplicate,
kcSampleInitializeOPL,
kcSampleTransposeUp,
kcSampleTransposeDown,
kcSampleTransposeOctUp,
kcSampleTransposeOctDown,
kcEndSampleMisc = kcSampleTransposeOctDown,
kcStartSampleEditing,
kcSampleTrim = kcStartSampleEditing,
kcSampleTrimToLoopEnd,
kcSampleSilence,
kcSampleNormalize,
kcSampleAmplify,
kcSampleReverse,
kcSampleDelete,
kcSampleToggleDrawing,
kcSampleResize,
kcSampleGrid,
kcSampleZoomUp,
kcSampleZoomDown,
kcSampleZoomSelection,
kcSampleCenterSampleStart,
kcSampleCenterSampleEnd,
kcSampleCenterLoopStart,
kcSampleCenterLoopEnd,
kcSampleCenterSustainStart,
kcSampleCenterSustainEnd,
kcSampleConvertPingPongLoop,
kcSampleConvertPingPongSustain,
kcSample8Bit,
kcSampleMonoMix,
kcSampleMonoLeft,
kcSampleMonoRight,
kcSampleMonoSplit,
kcSampleStereoSep,
kcSampleUpsample,
kcSampleDownsample,
kcSampleResample,
kcSampleInvert,
kcSampleSignUnsign,
kcSampleRemoveDCOffset,
kcSampleQuickFade,
kcSampleXFade,
kcSampleAutotune,
kcEndSampleEditing = kcSampleAutotune,
kcStartSampleCues,
kcEndSampleCues = kcStartSampleCues + 8,
kcSampleSlice,
kcEndSampleCueGroup = kcSampleSlice,
kcSampStartNotes,
kcSampEndNotes = kcSampStartNotes + kcCommandSetNumNotes,
kcSampStartNoteStops,
kcSampEndNoteStops = kcSampStartNoteStops + kcCommandSetNumNotes,
kcInstrumentStartNotes,
kcInstrumentEndNotes = kcInstrumentStartNotes + kcCommandSetNumNotes,
kcInstrumentStartNoteStops,
kcInstrumentEndNoteStops = kcInstrumentStartNoteStops + kcCommandSetNumNotes,
kcTreeViewStartNotes,
kcTreeViewEndNotes = kcTreeViewStartNotes + kcCommandSetNumNotes,
kcTreeViewStartNoteStops,
kcTreeViewEndNoteStops = kcTreeViewStartNoteStops + kcCommandSetNumNotes,
kcInsNoteMapStartNotes,
kcInsNoteMapEndNotes = kcInsNoteMapStartNotes + kcCommandSetNumNotes,
kcInsNoteMapStartNoteStops,
kcInsNoteMapEndNoteStops = kcInsNoteMapStartNoteStops + kcCommandSetNumNotes,
kcVSTGUIStartNotes,
kcVSTGUIEndNotes = kcVSTGUIStartNotes + kcCommandSetNumNotes,
kcVSTGUIStartNoteStops,
kcVSTGUIEndNoteStops = kcVSTGUIStartNoteStops + kcCommandSetNumNotes,
kcCommentsStartNotes,
kcCommentsEndNotes = kcCommentsStartNotes + kcCommandSetNumNotes,
kcCommentsStartNoteStops,
kcCommentsEndNoteStops = kcCommentsStartNoteStops + kcCommandSetNumNotes,
kcTreeViewStopPreview,
kcStartVSTGUICommands,
kcVSTGUIPrevPreset = kcStartVSTGUICommands,
kcVSTGUINextPreset,
kcVSTGUIPrevPresetJump,
kcVSTGUINextPresetJump,
kcVSTGUIRandParams,
kcVSTGUIToggleRecordParams,
kcVSTGUIToggleRecordMIDIOut,
kcVSTGUIToggleSendKeysToPlug,
kcVSTGUIBypassPlug,
kcEndVSTGUICommands = kcVSTGUIBypassPlug,
kcStartOrderlistCommands,
// Orderlist edit
kcStartOrderlistEdit = kcStartOrderlistCommands,
kcOrderlistEditDelete = kcStartOrderlistEdit,
kcOrderlistEditInsert,
kcOrderlistEditInsertSeparator,
kcOrderlistEditCopyOrders,
kcMergePatterns,
kcOrderlistEditPattern,
kcOrderlistSwitchToPatternView,
kcEndOrderlistEdit = kcOrderlistSwitchToPatternView,
// Orderlist navigation
kcStartOrderlistNavigation,
kcOrderlistNavigateLeft = kcStartOrderlistNavigation,
kcOrderlistNavigateRight,
kcOrderlistNavigateFirst,
kcOrderlistNavigateLast,
kcEndOrderlistNavigation = kcOrderlistNavigateLast,
// with selection key(must match order above)
kcStartOrderlistNavigationSelect,
kcOrderlistNavigateLeftSelect = kcStartOrderlistNavigationSelect,
kcOrderlistNavigateRightSelect,
kcOrderlistNavigateFirstSelect,
kcOrderlistNavigateLastSelect,
kcEndOrderlistNavigationSelect = kcOrderlistNavigateLastSelect,
// Orderlist pattern list edit
kcStartOrderlistNum,
kcOrderlistPat0 = kcStartOrderlistNum,
kcOrderlistPat1,
kcOrderlistPat2,
kcOrderlistPat3,
kcOrderlistPat4,
kcOrderlistPat5,
kcOrderlistPat6,
kcOrderlistPat7,
kcOrderlistPat8,
kcOrderlistPat9,
kcOrderlistPatPlus,
kcOrderlistPatMinus,
kcOrderlistPatIgnore,
kcOrderlistPatInvalid,
kcEndOrderlistNum = kcOrderlistPatInvalid,
// Playback lock
kcStartOrderlistLock,
kcOrderlistLockPlayback = kcStartOrderlistLock,
kcOrderlistUnlockPlayback,
kcEndOrderlistLock = kcOrderlistUnlockPlayback,
kcEndOrderlistCommands = kcEndOrderlistLock,
kcStartChnSettingsCommands,
kcChnSettingsPrev = kcStartChnSettingsCommands,
kcChnSettingsNext,
kcChnColorFromPrev,
kcChnColorFromNext,
kcChnSettingsClose,
kcEndChnSettingsCommands = kcChnSettingsClose,
kcStartCommentsCommands,
kcToggleSmpInsList = kcStartCommentsCommands,
kcExecuteSmpInsListItem,
kcRenameSmpInsListItem,
kcEndCommentsCommands = kcRenameSmpInsListItem,
kcNumCommands,
};
enum Modifiers : uint8
{
ModNone = 0,
ModShift = HOTKEYF_SHIFT,
ModCtrl = HOTKEYF_CONTROL,
ModAlt = HOTKEYF_ALT,
ModWin = HOTKEYF_EXT,
ModMidi = HOTKEYF_MIDI,
ModRShift = HOTKEYF_RSHIFT,
ModRCtrl = HOTKEYF_RCONTROL,
ModRAlt = HOTKEYF_RALT,
MaxMod = ModShift | ModCtrl | ModAlt | ModWin | ModMidi | ModRShift | ModRCtrl | ModRAlt,
};
DECLARE_FLAGSET(Modifiers)
struct KeyCombination
{
protected:
InputTargetContext ctx; // TODO: This should probably rather be a member of CommandStruct and not of the individual key combinations for consistency's sake.
FlagSet<Modifiers> mod;
uint8 code;
FlagSet<KeyEventType> event;
constexpr uint32 AsUint32() const
{
static_assert(sizeof(KeyCombination) == sizeof(uint32));
return (static_cast<uint32>(ctx) << 0) |
(static_cast<uint32>(mod.GetRaw()) << 8) |
(static_cast<uint32>(code) << 16) |
(static_cast<uint32>(event.GetRaw()) << 24);
}
public:
KeyCombination(InputTargetContext context = kCtxAllContexts, FlagSet<Modifiers> modifier = ModNone, UINT key = 0, FlagSet<KeyEventType> type = kKeyEventNone)
: ctx(context)
, mod(modifier)
, code(static_cast<uint8>(key))
, event(type)
{
}
constexpr bool operator==(const KeyCombination &other) const
{
return ctx == other.ctx && mod == other.mod && code == other.code && event == other.event;
}
constexpr bool operator<(const KeyCombination &kc) const
{
return AsUint32() < kc.AsUint32();
}
// Getters / Setters
void Context(InputTargetContext context) { ctx = context; }
constexpr InputTargetContext Context() const { return ctx; }
void Modifier(FlagSet<Modifiers> modifier) { mod = modifier; }
constexpr FlagSet<Modifiers> Modifier() const { return mod; }
void Modifier(const KeyCombination &other) { mod = other.mod; }
void AddModifier(FlagSet<Modifiers> modifier) { mod |= modifier; }
void AddModifier(const KeyCombination &other) { mod |= other.mod; }
void KeyCode(UINT key) { code = static_cast<uint8>(key); }
constexpr UINT KeyCode() const { return code; }
void EventType(FlagSet<KeyEventType> type) { event = type; }
constexpr FlagSet<KeyEventType> EventType() const { return event; }
static KeyCombination FromLPARAM(LPARAM lParam)
{
return KeyCombination(
static_cast<InputTargetContext>((lParam >> 0) & 0xFF),
static_cast<Modifiers>((lParam >> 8) & 0xFF),
static_cast<UINT>((lParam >> 16) & 0xFF),
static_cast<KeyEventType>((lParam >> 24) & 0xFF));
}
LPARAM AsLPARAM() const { return AsUint32(); }
// Key combination to string
static CString GetContextText(InputTargetContext ctx);
CString GetContextText() const { return GetContextText(Context()); }
static CString GetModifierText(FlagSet<Modifiers> mod);
CString GetModifierText() const { return GetModifierText(Modifier()); }
static CString GetKeyText(FlagSet<Modifiers> mod, UINT code);
CString GetKeyText() const { return GetKeyText(Modifier(), KeyCode()); }
static CString GetKeyEventText(FlagSet<KeyEventType> event);
CString GetKeyEventText() const { return GetKeyEventText(EventType()); }
static bool IsExtended(UINT code);
};
using KeyMap = std::multimap<KeyCombination, CommandID>;
using KeyMapRange = std::pair<KeyMap::const_iterator, KeyMap::const_iterator>;
//KeyMap
struct KeyCommand
{
static constexpr uint32 Dummy = 1u << 31;
static constexpr uint32 Hidden = 1u << 30;
static constexpr uint32 UIDMask = Hidden - 1u;
std::vector<KeyCombination> kcList;
CString Message;
protected:
uint32 UID = 0;
public:
KeyCommand() = default;
KeyCommand(uint32 uid, const TCHAR *message = _T(""), std::vector<KeyCombination> keys = {});
// Unique ID for on-disk keymap format.
// Note that hidden commands do not have a unique ID, because they are never written to keymap files.
uint32 ID() const noexcept { return UID & UIDMask; }
// e.g. Chord modifier is a dummy command, which serves only to automatically
// generate a set of key combinations for chords
bool IsDummy() const noexcept { return (UID & Dummy) != 0; }
// Hidden commands are not configurable by the user (e.g. derived from dummy commands or note entry keys duplicated into other contexts)
bool IsHidden() const noexcept { return (UID & Hidden) != 0; }
};
enum RuleID
{
krPreventDuplicate,
krDeleteOldOnConflict,
krAllowNavigationWithSelection,
krAllowSelectionWithNavigation,
krAutoSelectOff,
krAllowSelectCopySelectCombos,
krLockNotesToChords,
krNoteOffOnKeyRelease,
krPropagateNotes,
krReassignDigitsToOctaves,
krAutoSpacing,
krCheckModifiers,
krPropagateSampleManipulation,
kNumRules
};
struct CModSpecifications;
class CCommandSet
{
protected:
//util
void SetupCommands();
void SetupContextHierarchy();
CString EnforceAll(KeyCombination kc, CommandID cmd, bool adding);
CommandID FindCmd(uint32 uid) const;
bool KeyCombinationConflict(KeyCombination kc1, KeyCombination kc2, bool checkEventConflict = true) const;
const CModSpecifications *m_oldSpecs = nullptr;
KeyCommand m_commands[kcNumCommands];
std::bitset<kCtxMaxInputContexts> m_isParentContext[kCtxMaxInputContexts];
std::bitset<kNumRules> m_enforceRule;
public:
CCommandSet();
// Population
CString Add(KeyCombination kc, CommandID cmd, bool overwrite, int pos = -1, bool checkEventConflict = true);
CString Remove(KeyCombination kc, CommandID cmd);
CString Remove(int pos, CommandID cmd);
std::pair<CommandID, KeyCombination> IsConflicting(KeyCombination kc, CommandID cmd, bool checkEventConflict = true) const;
bool IsCrossContextConflict(KeyCombination kc1, KeyCombination kc2) const;
// Tranformation
bool QuickChange_SetEffects(const CModSpecifications &modSpecs);
bool QuickChange_NotesRepeat(bool repeat);
// Communication
KeyCombination GetKey(CommandID cmd, UINT key) const { return m_commands[cmd].kcList[key]; }
bool isHidden(UINT c) const { return m_commands[c].IsHidden(); }
int GetKeyListSize(CommandID cmd) const { return (cmd != kcNull) ? static_cast<int>(m_commands[cmd].kcList.size()) : 0; }
CString GetCommandText(CommandID cmd) const { return m_commands[cmd].Message; }
CString GetKeyTextFromCommand(CommandID c, UINT key) const;
// Pululation ;)
void Copy(const CCommandSet *source); // Copy the contents of a commandset into this command set
void GenKeyMap(KeyMap &km); // Generate a keymap from this command set
bool SaveFile(const mpt::PathString &filename);
bool LoadFile(const mpt::PathString &filename);
bool LoadFile(std::istream &iStrm, const mpt::ustring &filenameDescription, const bool fillExistingSet = false);
bool LoadDefaultKeymap();
};
OPENMPT_NAMESPACE_END