diff options
author | Jan Holthuis <jan.holthuis@ruhr-uni-bochum.de> | 2020-10-25 15:33:24 +0100 |
---|---|---|
committer | Jan Holthuis <jan.holthuis@ruhr-uni-bochum.de> | 2020-10-25 15:33:24 +0100 |
commit | fdc1b068844bce59040e78b84330a2bc29986ea7 (patch) | |
tree | eb804d456fd4fe3a61e197788b01c7838eebf4f1 | |
parent | ac38a04eb609c4a3959d22a5d0fc67b9102c6c43 (diff) | |
parent | a4d5c8ff136d22666833160081aa541a8ff63358 (diff) |
Merge branch '2.3' of github.com:mixxxdj/mixxx into main
-rw-r--r-- | src/controllers/controlpickermenu.cpp | 742 |
1 files changed, 495 insertions, 247 deletions
diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp index 1d03cb0ddb..79075386e1 100644 --- a/src/controllers/controlpickermenu.cpp +++ b/src/controllers/controlpickermenu.cpp @@ -20,34 +20,150 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) m_auxStr = tr("Auxiliary %1"); m_resetStr = tr("Reset to default"); m_effectRackStr = tr("Effect Rack %1"); - m_effectUnitStr = tr("Unit %1"); + m_effectUnitStr = tr("Effect Unit %1"); m_effectStr = tr("Slot %1"); m_parameterStr = tr("Parameter %1"); m_libraryStr = tr("Library"); - // Master Controls + // Mixer Controls QMenu* mixerMenu = addSubmenu(tr("Mixer")); - addControl("[Master]", "balance", tr("Main Output Balance"), tr("Main output balance"), mixerMenu, true); - addControl("[Master]", "delay", tr("Main Output Delay"), tr("Main output delay"), mixerMenu, true); - addControl("[Master]", "crossfader", tr("Crossfader"), tr("Crossfader"), mixerMenu, true); - addControl("[Master]", "gain", tr("Main Output Gain"), tr("Main output gain"), mixerMenu, true); - addControl("[Master]", "headGain", tr("Headphone Gain"), tr("Headphone gain"), mixerMenu, true); - addControl("[Master]", "headMix", tr("Headphone Mix"), tr("Headphone mix (pre/main)"), mixerMenu, true); - addControl("[Master]", "headSplit", tr("Headphone Split Cue"), tr("Toggle headphone split cueing"), mixerMenu); - addControl("[Master]", "headDelay", tr("Headphone Delay"), tr("Headphone delay"), mixerMenu, true); - addDeckAndSamplerControl("orientation", tr("Orientation"), - tr("Mix orientation (e.g. left, right, center)"), mixerMenu); - addDeckAndSamplerControl("orientation_left", tr("Orient Left"), - tr("Set mix orientation to left"), mixerMenu); - addDeckAndSamplerControl("orientation_center", tr("Orient Center"), - tr("Set mix orientation to center"), mixerMenu); - addDeckAndSamplerControl("orientation_right", tr("Orient Right"), - tr("Set mix orientation to right"), mixerMenu); + // Crossfader / Orientation + QMenu* crossfaderMenu = addSubmenu(tr("Crossfader / Orientation"), mixerMenu); + addControl("[Master]", + "crossfader", + tr("Crossfader"), + tr("Crossfader"), + crossfaderMenu, + true); + addDeckAndSamplerControl("orientation", + tr("Orientation"), + tr("Mix orientation (e.g. left, right, center)"), + crossfaderMenu); + addDeckAndSamplerControl("orientation_left", + tr("Orient Left"), + tr("Set mix orientation to left"), + crossfaderMenu); + addDeckAndSamplerControl("orientation_center", + tr("Orient Center"), + tr("Set mix orientation to center"), + crossfaderMenu); + addDeckAndSamplerControl("orientation_right", + tr("Orient Right"), + tr("Set mix orientation to right"), + crossfaderMenu); + // Main Output + QMenu* mainOutputMenu = addSubmenu(tr("Main Output"), mixerMenu); + addControl("[Master]", + "gain", + tr("Main Output Gain"), + tr("Main Output gain"), + mainOutputMenu, + true); + addControl("[Master]", + "balance", + tr("Main Output Balance"), + tr("Main Output balance"), + mainOutputMenu, + true); + addControl("[Master]", + "delay", + tr("Main Output Delay"), + tr("Main Output delay"), + mainOutputMenu, + true); + // Headphone + QMenu* headphoneMenu = addSubmenu(tr("Headphone"), mixerMenu); + addControl("[Master]", + "headGain", + tr("Headphone Gain"), + tr("Headphone gain"), + headphoneMenu, + true); + addControl("[Master]", + "headMix", + tr("Headphone Mix"), + tr("Headphone mix (pre/main)"), + headphoneMenu, + true); + addControl("[Master]", + "headSplit", + tr("Headphone Split Cue"), + tr("Toggle headphone split cueing"), + headphoneMenu); + addControl("[Master]", + "headDelay", + tr("Headphone Delay"), + tr("Headphone delay"), + headphoneMenu, + true); + mixerMenu->addSeparator(); + // EQs + QMenu* eqMenu = addSubmenu(tr("Equalizers"), mixerMenu); + constexpr int kNumEqRacks = 1; + const int iNumDecks = static_cast<int>(ControlObject::get(ConfigKey("[Master]", "num_decks"))); + for (int iRackNumber = 0; iRackNumber < kNumEqRacks; ++iRackNumber) { + // TODO: Although there is a mode with 4-band EQs, it's not feasible + // right now to add support for learning both it and regular 3-band eqs. + // Since 3-band is by far the most common, stick with that. + const int kMaxEqs = 3; + QList<QString> eqNames; + eqNames.append(tr("Low EQ")); + eqNames.append(tr("Mid EQ")); + eqNames.append(tr("High EQ")); + for (int deck = 1; deck <= iNumDecks; ++deck) { + QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu); + for (int effect = kMaxEqs - 1; effect >= 0; --effect) { + const QString group = EqualizerRack::formatEffectSlotGroupString( + iRackNumber, 0, QString("[Channel%1]").arg(deck)); + QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu); + QString control = "parameter%1"; + addControl(group, + control.arg(effect + 1), + tr("Adjust %1").arg(eqNames[effect]), + tr("Adjust %1").arg(eqNames[effect]), + bandMenu, + true, + tr("Deck %1").arg(deck)); + + control = "button_parameter%1"; + addControl(group, + control.arg(effect + 1), + tr("Kill %1").arg(eqNames[effect]), + tr("Kill %1").arg(eqNames[effect]), + bandMenu, + false, + tr("Deck %1").arg(deck)); + } + } + } + mixerMenu->addSeparator(); + // Volume / Pfl controls + addDeckAndSamplerControl("volume", tr("Volume"), tr("Volume Fader"), mixerMenu, true); + addDeckAndSamplerControl("volume_set_one", + tr("Full Volume"), + tr("Set to full volume"), + mixerMenu); + addDeckAndSamplerControl("volume_set_zero", + tr("Zero Volume"), + tr("Set to zero volume"), + mixerMenu); + addDeckAndSamplerAndPreviewDeckControl("pregain", + tr("Track Gain"), + tr("Track Gain knob"), + mixerMenu, + true); + addDeckAndSamplerControl("mute", tr("Mute"), tr("Mute button"), mixerMenu); + mixerMenu->addSeparator(); + addDeckAndSamplerControl("pfl", + tr("Headphone Listen"), + tr("Headphone listen (pfl) button"), + mixerMenu); + + addSeparator(); // Transport QMenu* transportMenu = addSubmenu(tr("Transport")); addDeckAndSamplerAndPreviewDeckControl("play", tr("Play"), tr("Play button"), transportMenu); - // Preview deck does not go to master so volume does not matter. addDeckAndSamplerAndPreviewDeckControl("back", tr("Fast Rewind"), tr("Fast Rewind button"), transportMenu); addDeckAndSamplerAndPreviewDeckControl("fwd", tr("Fast Forward"), tr("Fast Forward button"), transportMenu); addDeckAndSamplerAndPreviewDeckControl("playposition", tr("Strip Search"), @@ -62,24 +178,20 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) addDeckAndSamplerAndPreviewDeckControl("start_stop", tr("Stop And Jump To Start"), tr("Stop playback and jump to start of track"), transportMenu); addDeckAndSamplerAndPreviewDeckControl("end", tr("Jump To End"), tr("Jump to end of track"), transportMenu); - addDeckAndSamplerControl("volume", tr("Volume"), tr("Volume Fader"), transportMenu, true); - addDeckAndSamplerControl("volume_set_one", tr("Full Volume"), tr("Set to full volume"), transportMenu); - addDeckAndSamplerControl("volume_set_zero", tr("Zero Volume"), tr("Set to zero volume"), transportMenu); - addDeckAndSamplerAndPreviewDeckControl("pregain", tr("Track Gain"), tr("Track Gain knob"), transportMenu, true); - addDeckAndSamplerControl("mute", tr("Mute"), tr("Mute button"), transportMenu); + transportMenu->addSeparator(); addDeckAndSamplerAndPreviewDeckControl("eject", tr("Eject"), tr("Eject track"), transportMenu); - addDeckAndSamplerControl("pfl", tr("Headphone Listen"), tr("Headphone listen (pfl) button"), transportMenu); addDeckAndSamplerControl("repeat", tr("Repeat Mode"), tr("Toggle repeat mode"), transportMenu); addDeckAndSamplerControl("slip_enabled", tr("Slip Mode"), tr("Toggle slip mode"), transportMenu); - // BPM & Sync - QMenu* bpmMenu = addSubmenu(tr("BPM")); + // BPM / Beatgrid + QMenu* bpmMenu = addSubmenu(tr("BPM / Beatgrid")); addDeckAndSamplerControl("bpm", tr("BPM"), tr("BPM"), bpmMenu, true); addDeckAndSamplerControl("bpm_up", tr("BPM +1"), tr("Increase BPM by 1"), bpmMenu); addDeckAndSamplerControl("bpm_down", tr("BPM -1"), tr("Decrease BPM by 1"), bpmMenu); addDeckAndSamplerControl("bpm_up_small", tr("BPM +0.1"), tr("Increase BPM by 0.1"), bpmMenu); addDeckAndSamplerControl("bpm_down_small", tr("BPM -0.1"), tr("Decrease BPM by 0.1"), bpmMenu); addDeckAndSamplerControl("bpm_tap", tr("BPM Tap"), tr("BPM tap button"), bpmMenu); + bpmMenu->addSeparator(); addDeckAndSamplerControl("beats_adjust_faster", tr("Adjust Beatgrid Faster +.01"), tr("Increase track's average BPM by 0.01"), bpmMenu); addDeckAndSamplerControl("beats_adjust_slower", tr("Adjust Beatgrid Slower -.01"), tr("Decrease track's average BPM by 0.01"), bpmMenu); addDeckAndSamplerControl("beats_translate_earlier", tr("Move Beatgrid Earlier"), tr("Adjust the beatgrid to the left"), bpmMenu); @@ -88,11 +200,28 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Align beatgrid to current position"), bpmMenu); addDeckControl("beats_translate_match_alignment", tr("Adjust Beatgrid - Match Alignment"), tr("Adjust beatgrid to match another playing deck."), bpmMenu); + bpmMenu->addSeparator(); addDeckAndSamplerControl("quantize", tr("Quantize Mode"), tr("Toggle quantize mode"), bpmMenu); QMenu* syncMenu = addSubmenu(tr("Sync")); - addDeckAndSamplerControl("sync_enabled", tr("Sync Mode"), - tr("Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync"), syncMenu); + addDeckAndSamplerControl("sync_enabled", + tr("Sync / Sync Lock"), + tr("Tap to sync tempo (and phase with quantize enabled), hold to " + "enable permanent sync"), + syncMenu); + addDeckAndSamplerControl("beatsync", + tr("Beat Sync One-Shot"), + tr("One-time beat sync tempo (and phase with quantize enabled)"), + syncMenu); + addDeckAndSamplerControl("beatsync_tempo", + tr("Sync Tempo One-Shot"), + tr("One-time beat sync (tempo only)"), + syncMenu); + addDeckAndSamplerControl("beatsync_phase", + tr("Sync Phase One-Shot"), + tr("One-time beat sync (phase only)"), + syncMenu); + syncMenu->addSeparator(); addControl("[InternalClock]", "sync_master", tr("Internal Sync Master"), tr("Toggle Internal Sync Master"), syncMenu); addControl("[InternalClock]", "bpm", tr("Internal Master BPM"), @@ -107,36 +236,16 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Increase internal master BPM by 0.1"), syncMenu); addControl("[InternalClock]", "bpm_down_small", tr("Internal Master BPM -0.1"), tr("Decrease internal master BPM by 0.1"), syncMenu); + syncMenu->addSeparator(); addDeckAndSamplerControl("sync_master", tr("Sync Master"), tr("Toggle sync master"), syncMenu); addDeckAndSamplerControl("sync_mode", tr("Sync Mode"), tr("Sync mode 3-state toggle (OFF, FOLLOWER, MASTER)"), syncMenu); - addDeckAndSamplerControl("beatsync", tr("Beat Sync One-Shot"), - tr("One-time beat sync tempo (and phase with quantize enabled)"), syncMenu); - addDeckAndSamplerControl("beatsync_tempo", tr("Sync Tempo One-Shot"), - tr("One-time beat sync (tempo only)"), syncMenu); - addDeckAndSamplerControl("beatsync_phase", tr("Sync Phase One-Shot"), - tr("One-time beat sync (phase only)"), syncMenu); // Speed - QMenu* speedMenu = addSubmenu(tr("Speed (Pitch/Tempo)")); - addDeckAndSamplerControl("keylock", tr("Keylock Mode"), - tr("Toggle keylock mode"), speedMenu); + QMenu* speedMenu = addSubmenu(tr("Speed")); addDeckAndSamplerControl("rate", tr("Playback Speed"), tr("Playback speed control (Vinyl \"Pitch\" slider)"), speedMenu, true); - addDeckAndSamplerControl("pitch", tr("Pitch (Musical key)"), - tr("Pitch control (does not affect tempo), center is original pitch"), speedMenu, true); - addDeckAndSamplerControl("pitch_up", tr("Increase Pitch"), - tr("Increases the pitch by one semitone"), speedMenu); - addDeckAndSamplerControl("pitch_up_small", tr("Increase Pitch (Fine)"), - tr("Increases the pitch by 10 cents"), speedMenu); - addDeckAndSamplerControl("pitch_down", tr("Decrease Pitch"), - tr("Decreases the pitch by one semitone"), speedMenu); - addDeckAndSamplerControl("pitch_down_small", tr("Decrease Pitch (Fine)"), - tr("Decreases the pitch by 10 cents"), speedMenu); - addDeckAndSamplerControl("pitch_adjust", tr("Pitch Adjust"), - tr("Adjust pitch from speed slider pitch"), speedMenu, true); - addDeckAndSamplerControl("sync_key", tr("Match Key"), tr("Match musical key"), speedMenu); - addDeckAndSamplerControl("reset_key", tr("Reset Key"), tr("Resets key to original"), speedMenu); + speedMenu->addSeparator(); addDeckAndSamplerControl("rate_perm_up", tr("Increase Speed"), tr("Adjust speed faster (coarse)"), speedMenu); addDeckAndSamplerControl("rate_perm_up_small", tr("Increase Speed (Fine)"), @@ -145,6 +254,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Adjust speed slower (coarse)"), speedMenu); addDeckAndSamplerControl("rate_perm_down_small", tr("Increase Speed (Fine)"), tr("Adjust speed slower (fine)"), speedMenu); + speedMenu->addSeparator(); addDeckAndSamplerControl("rate_temp_up", tr("Temporarily Increase Speed"), tr("Temporarily increase speed (coarse)"), speedMenu); addDeckAndSamplerControl("rate_temp_up_small", tr("Temporarily Increase Speed (Fine)"), @@ -153,40 +263,39 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Temporarily decrease speed (coarse)"), speedMenu); addDeckAndSamplerControl("rate_temp_down_small", tr("Temporarily Decrease Speed (Fine)"), tr("Temporarily decrease speed (fine)"), speedMenu); - - // EQs - QMenu* eqMenu = addSubmenu(tr("Equalizers")); - constexpr int kNumEqRacks = 1; - const int iNumDecks = static_cast<int>(ControlObject::get(ConfigKey("[Master]", "num_decks"))); - for (int iRackNumber = 0; iRackNumber < kNumEqRacks; ++iRackNumber) { - // TODO: Although there is a mode with 4-band EQs, it's not feasible - // right now to add support for learning both it and regular 3-band eqs. - // Since 3-band is by far the most common, stick with that. - const int kMaxEqs = 3; - QList<QString> eqNames; - eqNames.append(tr("Low EQ")); - eqNames.append(tr("Mid EQ")); - eqNames.append(tr("High EQ")); - for (int deck = 1; deck <= iNumDecks; ++deck) { - QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu); - for (int effect = kMaxEqs - 1; effect >= 0; --effect) { - const QString group = EqualizerRack::formatEffectSlotGroupString( - iRackNumber, 0, QString("[Channel%1]").arg(deck)); - QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu); - QString control = "parameter%1"; - addControl(group, control.arg(effect+1), - tr("Adjust %1").arg(eqNames[effect]), - tr("Adjust %1").arg(eqNames[effect]), - bandMenu, true, tr("Deck %1").arg(deck)); - - control = "button_parameter%1"; - addControl(group, control.arg(effect+1), - tr("Kill %1").arg(eqNames[effect]), - tr("Kill %1").arg(eqNames[effect]), - bandMenu, false, tr("Deck %1").arg(deck)); - } - } - } + // Pitch (Musical Key) + QMenu* pitchMenu = addSubmenu(tr("Pitch (Musical Key)")); + addDeckAndSamplerControl("pitch", + tr("Pitch (Musical key)"), + tr("Pitch control (does not affect tempo), center is original " + "pitch"), + pitchMenu, + true); + addDeckAndSamplerControl("pitch_up", + tr("Increase Pitch"), + tr("Increases the pitch by one semitone"), + pitchMenu); + addDeckAndSamplerControl("pitch_up_small", + tr("Increase Pitch (Fine)"), + tr("Increases the pitch by 10 cents"), + pitchMenu); + addDeckAndSamplerControl("pitch_down", + tr("Decrease Pitch"), + tr("Decreases the pitch by one semitone"), + pitchMenu); + addDeckAndSamplerControl("pitch_down_small", + tr("Decrease Pitch (Fine)"), + tr("Decreases the pitch by 10 cents"), + pitchMenu); + addDeckAndSamplerControl("pitch_adjust", + tr("Pitch Adjust"), + tr("Adjust pitch from speed slider pitch"), + pitchMenu, + true); + pitchMenu->addSeparator(); + addDeckAndSamplerControl("sync_key", tr("Match Key"), tr("Match musical key"), pitchMenu); + addDeckAndSamplerControl("reset_key", tr("Reset Key"), tr("Resets key to original"), pitchMenu); + addDeckAndSamplerControl("keylock", tr("Keylock"), tr("Toggle keylock mode"), pitchMenu); // Vinyl Control QMenu* vinylControlMenu = addSubmenu(tr("Vinyl Control")); @@ -220,7 +329,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Go to cue point and play after release"), cueMenu); // Hotcues - QMenu* hotcueMenu = addSubmenu(tr("Hotcues")); + QMenu* hotcueMainMenu = addSubmenu(tr("Hotcues")); QString hotcueActivateTitle = tr("Hotcue %1"); QString hotcueClearTitle = tr("Clear Hotcue %1"); QString hotcueSetTitle = tr("Set Hotcue %1"); @@ -235,8 +344,25 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) QString hotcueGotoAndStopDescription = tr("Jump to hotcue %1 and stop"); QString hotcueGotoAndPlayDescription = tr("Jump to hotcue %1 and play"); QString hotcuePreviewDescription = tr("Preview from hotcue %1"); + // add menus for hotcues 1-16. + // though, keep the menu small put additional hotcues in a separate menu, + // but don't create that submenu for less than 4 additional hotcues. + int preferredHotcuesVisible = 16; + int moreMenuThreshold = 4; + QMenu* parentMenu = hotcueMainMenu; + QMenu* hotcueMoreMenu = nullptr; + bool moreHotcues = NUM_HOT_CUES >= preferredHotcuesVisible + moreMenuThreshold; + if (moreHotcues) { + // populate menu here, add it below #preferredHotcuesVisible + hotcueMoreMenu = new QMenu( + tr("Hotcues %1-%2").arg(preferredHotcuesVisible + 1).arg(NUM_HOT_CUES), + hotcueMainMenu); + } for (int i = 1; i <= NUM_HOT_CUES; ++i) { - QMenu* hotcueSubMenu = addSubmenu(tr("Hotcue %1").arg(QString::number(i)), hotcueMenu); + if (moreHotcues && i > preferredHotcuesVisible) { + parentMenu = hotcueMoreMenu; + } + QMenu* hotcueSubMenu = addSubmenu(tr("Hotcue %1").arg(QString::number(i)), parentMenu); addDeckAndSamplerControl(QString("hotcue_%1_activate").arg(i), hotcueActivateTitle.arg(QString::number(i)), hotcueActivateDescription.arg(QString::number(i)), @@ -266,6 +392,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) hotcuePreviewDescription.arg(QString::number(i)), hotcueSubMenu); } + if (moreHotcues) { + hotcueMainMenu->addSeparator(); + hotcueMainMenu->addMenu(hotcueMoreMenu); + } // Loops QMenu* loopMenu = addSubmenu(tr("Looping")); @@ -275,16 +405,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) QString beatloopActivateDescription = tr("Create a beat loop of selected beat size"); QString beatloopRollActivateTitle = tr("Loop Roll Selected Beats"); QString beatloopRollActivateDescription = tr("Create a rolling beat loop of selected beat size"); - - addDeckControl("loop_in", tr("Loop In"), tr("Loop In button"), loopMenu); - addDeckControl("loop_out", tr("Loop Out"), tr("Loop Out button"), loopMenu); - addDeckControl("loop_exit", tr("Loop Exit"), tr("Loop Exit button"), loopMenu); - addDeckControl("reloop_toggle", tr("Reloop/Exit Loop"), tr("Toggle loop on/off and jump to Loop In point if loop is behind play position"), loopMenu); - addDeckControl("reloop_andstop", tr("Reloop And Stop"), tr("Enable loop, jump to Loop In point, and stop"), loopMenu); - addDeckControl("loop_halve", tr("Loop Halve"), tr("Halve the loop length"), loopMenu); - addDeckControl("loop_double", tr("Loop Double"), tr("Double the loop length"), loopMenu); - addDeckControl("beatloop_activate", beatloopActivateTitle, beatloopActivateDescription, loopMenu); - addDeckControl("beatlooproll_activate", beatloopRollActivateTitle, beatloopRollActivateDescription, loopMenu); + QString beatLoopTitle = tr("Loop %1 Beats"); + QString beatLoopRollTitle = tr("Loop Roll %1 Beats"); + QString beatLoopDescription = tr("Create %1-beat loop"); + QString beatLoopRollDescription = tr("Create temporary %1-beat loop roll"); QList<double> beatSizes = LoopingControl::getBeatSizes(); @@ -302,50 +426,51 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) humanBeatSizes[32] = tr("32"); humanBeatSizes[64] = tr("64"); - // Loop moving - QString loopMoveForwardTitle = tr("Move Loop +%1 Beats"); - QString loopMoveBackwardTitle = tr("Move Loop -%1 Beats"); - QString loopMoveForwardDescription = tr("Move loop forward by %1 beats"); - QString loopMoveBackwardDescription = tr("Move loop backward by %1 beats"); - - foreach (double beats, beatSizes) { - QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); - addDeckControl(QString("loop_move_%1_forward").arg(beats), - loopMoveForwardTitle.arg(humanBeats), - loopMoveForwardDescription.arg(humanBeats), loopMenu); - } - - foreach (double beats, beatSizes) { - QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); - addDeckControl(QString("loop_move_%1_backward").arg(beats), - loopMoveBackwardTitle.arg(humanBeats), - loopMoveBackwardDescription.arg(humanBeats), loopMenu); - } - // Beatloops - QMenu* beatLoopMenu = addSubmenu(tr("Beat-Looping")); - QString beatLoopTitle = tr("Loop %1 Beats"); - QString beatLoopRollTitle = tr("Loop Roll %1 Beats"); - QString beatLoopDescription = tr("Create %1-beat loop"); - QString beatLoopRollDescription = tr("Create temporary %1-beat loop roll"); - - addDeckControl("beatloop_activate", beatloopActivateTitle, beatloopActivateDescription, beatLoopMenu); - addDeckControl("beatlooproll_activate", beatloopRollActivateTitle, beatloopRollActivateDescription, beatLoopMenu); + addDeckControl("beatloop_activate", + beatloopActivateTitle, + beatloopActivateDescription, + loopMenu); + QMenu* loopActivateMenu = addSubmenu(tr("Loop Beats"), loopMenu); foreach (double beats, beatSizes) { QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); addDeckControl(QString("beatloop_%1_toggle").arg(beats), - beatLoopTitle.arg(humanBeats), - beatLoopDescription.arg(humanBeats), beatLoopMenu); + beatLoopTitle.arg(humanBeats), + beatLoopDescription.arg(humanBeats), + loopActivateMenu); } + loopMenu->addSeparator(); + addDeckControl("beatlooproll_activate", + beatloopRollActivateTitle, + beatloopRollActivateDescription, + loopMenu); + QMenu* looprollActivateMenu = addSubmenu(tr("Loop Roll Beats"), loopMenu); foreach (double beats, beatSizes) { QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); addDeckControl(QString("beatlooproll_%1_activate").arg(beats), - beatLoopRollTitle.arg(humanBeats), - beatLoopRollDescription.arg(humanBeats), beatLoopMenu); + beatLoopRollTitle.arg(humanBeats), + beatLoopRollDescription.arg(humanBeats), + looprollActivateMenu); } + loopMenu->addSeparator(); - // Beat jumping + addDeckControl("loop_in", tr("Loop In"), tr("Loop In button"), loopMenu); + addDeckControl("loop_out", tr("Loop Out"), tr("Loop Out button"), loopMenu); + addDeckControl("loop_exit", tr("Loop Exit"), tr("Loop Exit button"), loopMenu); + addDeckControl("reloop_toggle", + tr("Reloop/Exit Loop"), + tr("Toggle loop on/off and jump to Loop In point if loop is behind " + "play position"), + loopMenu); + addDeckControl("reloop_andstop", + tr("Reloop And Stop"), + tr("Enable loop, jump to Loop In point, and stop"), + loopMenu); + addDeckControl("loop_halve", tr("Loop Halve"), tr("Halve the loop length"), loopMenu); + addDeckControl("loop_double", tr("Loop Double"), tr("Double the loop length"), loopMenu); + + // Beat Jump / Loop Move QMenu* beatJumpMenu = addSubmenu(tr("Beat Jump / Loop Move")); QString beatJumpForwardTitle = tr("Jump / Move Loop Forward %1 Beats"); QString beatJumpBackwardTitle = tr("Jump / Move Loop Backward %1 Beats"); @@ -353,75 +478,160 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) QString beatJumpBackwardDescription = tr("Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats"); addDeckControl("beatjump_forward", tr("Beat Jump / Loop Move Forward Selected Beats"), tr("Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats"), beatJumpMenu); addDeckControl("beatjump_backward", tr("Beat Jump / Loop Move Backward Selected Beats"), tr("Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats"), beatJumpMenu); + beatJumpMenu->addSeparator(); + QMenu* beatjumpFwdSubmenu = addSubmenu(tr("Beat Jump / Loop Move Forward"), beatJumpMenu); foreach (double beats, beatSizes) { QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); addDeckControl(QString("beatjump_%1_forward").arg(beats), - beatJumpForwardTitle.arg(humanBeats), - beatJumpForwardDescription.arg(humanBeats), beatJumpMenu); + beatJumpForwardTitle.arg(humanBeats), + beatJumpForwardDescription.arg(humanBeats), + beatjumpFwdSubmenu); } + QMenu* beatjumpBwdSubmenu = addSubmenu(tr("Beat Jump / Loop Move Backward"), beatJumpMenu); foreach (double beats, beatSizes) { QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); addDeckControl(QString("beatjump_%1_backward").arg(beats), - beatJumpBackwardTitle.arg(humanBeats), - beatJumpBackwardDescription.arg(humanBeats), beatJumpMenu); + beatJumpBackwardTitle.arg(humanBeats), + beatJumpBackwardDescription.arg(humanBeats), + beatjumpBwdSubmenu); } + // Loop moving + QString loopMoveForwardTitle = tr("Move Loop +%1 Beats"); + QString loopMoveBackwardTitle = tr("Move Loop -%1 Beats"); + QString loopMoveForwardDescription = tr("Move loop forward by %1 beats"); + QString loopMoveBackwardDescription = tr("Move loop backward by %1 beats"); + + QMenu* loopmoveFwdSubmenu = addSubmenu(tr("Loop Move Forward"), beatJumpMenu); + foreach (double beats, beatSizes) { + QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); + addDeckControl(QString("loop_move_%1_forward").arg(beats), + loopMoveForwardTitle.arg(humanBeats), + loopMoveForwardDescription.arg(humanBeats), + loopmoveFwdSubmenu); + } + + QMenu* loopmoveBwdSubmenu = addSubmenu(tr("Loop Move Backward"), beatJumpMenu); + foreach (double beats, beatSizes) { + QString humanBeats = humanBeatSizes.value(beats, QString::number(beats)); + addDeckControl(QString("loop_move_%1_backward").arg(beats), + loopMoveBackwardTitle.arg(humanBeats), + loopMoveBackwardDescription.arg(humanBeats), + loopmoveBwdSubmenu); + } + + addSeparator(); + // Library Controls QMenu* libraryMenu = addSubmenu(tr("Library")); - addControl("[Library]", "MoveUp", - tr("Move up"), - tr("Equivalent to pressing the UP key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveDown", - tr("Move down"), - tr("Equivalent to pressing the DOWN key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveVertical", - tr("Move up/down"), - tr("Move vertically in either direction using a knob, as if pressing UP/DOWN keys"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "ScrollUp", - tr("Scroll Up"), - tr("Equivalent to pressing the PAGE UP key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "ScrollDown", - tr("Scroll Down"), - tr("Equivalent to pressing the PAGE DOWN key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "ScrollVertical", - tr("Scroll up/down"), - tr("Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveLeft", - tr("Move left"), - tr("Equivalent to pressing the LEFT key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveRight", - tr("Move right"), - tr("Equivalent to pressing the RIGHT key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveHorizontal", - tr("Move left/right"), - tr("Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveFocusForward", - tr("Move focus to right pane"), - tr("Equivalent to pressing the TAB key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveFocusBackward", - tr("Move focus to left pane"), - tr("Equivalent to pressing the SHIFT+TAB key on the keyboard"), - libraryMenu, false, m_libraryStr); - addControl("[Library]", "MoveFocus", - tr("Move focus to right/left pane"), - tr("Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys"), - libraryMenu, false, m_libraryStr); + QMenu* navigationMenu = addSubmenu(tr("Navigation"), libraryMenu); + addControl("[Library]", + "MoveUp", + tr("Move up"), + tr("Equivalent to pressing the UP key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveDown", + tr("Move down"), + tr("Equivalent to pressing the DOWN key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveVertical", + tr("Move up/down"), + tr("Move vertically in either direction using a knob, as if " + "pressing UP/DOWN keys"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "ScrollUp", + tr("Scroll Up"), + tr("Equivalent to pressing the PAGE UP key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "ScrollDown", + tr("Scroll Down"), + tr("Equivalent to pressing the PAGE DOWN key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "ScrollVertical", + tr("Scroll up/down"), + tr("Scroll vertically in either direction using a knob, as if " + "pressing PGUP/PGDOWN keys"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveLeft", + tr("Move left"), + tr("Equivalent to pressing the LEFT key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveRight", + tr("Move right"), + tr("Equivalent to pressing the RIGHT key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveHorizontal", + tr("Move left/right"), + tr("Move horizontally in either direction using a knob, as if " + "pressing LEFT/RIGHT keys"), + navigationMenu, + false, + m_libraryStr); + navigationMenu->addSeparator(); + addControl("[Library]", + "MoveFocusForward", + tr("Move focus to right pane"), + tr("Equivalent to pressing the TAB key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveFocusBackward", + tr("Move focus to left pane"), + tr("Equivalent to pressing the SHIFT+TAB key on the keyboard"), + navigationMenu, + false, + m_libraryStr); + addControl("[Library]", + "MoveFocus", + tr("Move focus to right/left pane"), + tr("Move focus one pane to right or left using a knob, as if " + "pressing TAB/SHIFT+TAB keys"), + navigationMenu, + false, + m_libraryStr); + libraryMenu->addSeparator(); addControl("[Library]", "GoToItem", tr("Go to the currently selected item"), tr("Choose the currently selected item and advance forward one pane if appropriate"), libraryMenu, false, m_libraryStr); + // Load track (these can be loaded into any channel) + addDeckAndSamplerControl("LoadSelectedTrack", + tr("Load Track"), + tr("Load selected track"), + libraryMenu); + addDeckAndSamplerAndPreviewDeckControl("LoadSelectedTrackAndPlay", + tr("Load Track and Play"), + tr("Load selected track and play"), + libraryMenu); + libraryMenu->addSeparator(); + // Auto DJ addControl("[Library]", "AutoDjAddBottom", tr("Add to Auto DJ Queue (bottom)"), tr("Append the selected track to the Auto DJ Queue"), @@ -434,15 +644,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Add to Auto DJ Queue (replace)"), tr("Replace Auto DJ Queue with selected tracks"), libraryMenu, false, m_libraryStr); - - - // Load track (these can be loaded into any channel) - addDeckAndSamplerControl("LoadSelectedTrack", - tr("Load Track"), - tr("Load selected track"), libraryMenu); - addDeckAndSamplerAndPreviewDeckControl("LoadSelectedTrackAndPlay", tr("Track Load and Play"), - tr("Load selected track and play"), libraryMenu); - + libraryMenu->addSeparator(); addControl("[Recording]", "toggle_recording", tr("Record Mix"), tr("Toggle mix recording"), @@ -464,17 +666,16 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) quickEffectMenu, false, tr("Quick Effect")); } + effectsMenu->addSeparator(); + + // When kNumEffectRacks is changed to >1 put effect unit actions into + // separate "Effect Rack N" submenus. const int kNumEffectRacks = 1; for (int iRackNumber = 1; iRackNumber <= kNumEffectRacks; ++iRackNumber) { const QString rackGroup = StandardEffectRack::formatGroupString( iRackNumber - 1); - QMenu* rackMenu = addSubmenu(m_effectRackStr.arg(iRackNumber), effectsMenu); QString descriptionPrefix = m_effectRackStr.arg(iRackNumber); - addControl(rackGroup, "clear", - tr("Clear Effect Rack"), tr("Clear effect rack"), - rackMenu, false, descriptionPrefix); - const int numEffectUnits = static_cast<int>(ControlObject::get( ConfigKey(rackGroup, "num_effectunits"))); for (int iEffectUnitNumber = 1; iEffectUnitNumber <= numEffectUnits; @@ -483,11 +684,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) StandardEffectRack::formatEffectChainSlotGroupString( iRackNumber - 1, iEffectUnitNumber - 1); - descriptionPrefix = QString("%1, %2").arg(m_effectRackStr.arg(iRackNumber), - m_effectUnitStr.arg(iEffectUnitNumber)); + descriptionPrefix = QString("%1").arg(m_effectUnitStr.arg(iEffectUnitNumber)); QMenu* effectUnitMenu = addSubmenu(m_effectUnitStr.arg(iEffectUnitNumber), - rackMenu); + effectsMenu); addControl(effectUnitGroup, "clear", tr("Clear Unit"), tr("Clear effect unit"), @@ -525,33 +725,39 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) |