Skip to content

Commit

Permalink
Use a helper function to combine keys and modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
messmerd committed Nov 10, 2024
1 parent 267307a commit 93ed53a
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 43 deletions.
27 changes: 27 additions & 0 deletions include/DeprecationHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
#ifndef LMMS_DEPRECATIONHELPER_H
#define LMMS_DEPRECATIONHELPER_H

#include <type_traits>

#include <QFontMetrics>
#include <QKeySequence>
#include <QWheelEvent>

namespace lmms
Expand Down Expand Up @@ -64,6 +67,30 @@ inline QPoint position(QWheelEvent *wheelEvent)
#endif
}


namespace detail
{

template<typename T>
inline constexpr bool IsKeyOrModifier = std::is_same_v<T, Qt::Key>
|| std::is_same_v<T, Qt::Modifier> || std::is_same_v<T, Qt::KeyboardModifier>;

} // namespace detail


/**
* @brief Combines Qt key and modifier arguments together,
* replacing A | B or A + B which was deprecated in C++20
* due to the enums being different types. (P1120R0)
* @param args Any number of Qt::Key, Qt::Modifier, or Qt::KeyboardModifier
* @return The combination of the given keys/modifiers as an int
*/
template<typename... Args, std::enable_if_t<(detail::IsKeyOrModifier<Args> && ...), bool> = true>
constexpr int combine(Args... args)
{
return (0 + ... + static_cast<int>(args));
}

} // namespace lmms

#endif // LMMS_DEPRECATIONHELPER_H
14 changes: 8 additions & 6 deletions src/gui/ControllerRackView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,22 @@
*
*/

#include "ControllerRackView.h"

#include <QApplication>
#include <QAction>
#include <QPushButton>
#include <QScrollArea>
#include <QMessageBox>
#include <QVBoxLayout>

#include "Song.h"
#include "ControllerView.h"
#include "DeprecationHelper.h"
#include "embed.h"
#include "GuiApplication.h"
#include "MainWindow.h"
#include "ControllerRackView.h"
#include "ControllerView.h"
#include "LfoController.h"
#include "MainWindow.h"
#include "Song.h"
#include "SubWindow.h"

namespace lmms::gui
Expand Down Expand Up @@ -167,13 +169,13 @@ void ControllerRackView::addController(Controller* controller)
connect(controllerView, &ControllerView::removedController, this, &ControllerRackView::deleteController, Qt::QueuedConnection);

auto moveUpAction = new QAction(controllerView);
moveUpAction->setShortcut(Qt::Key_Up | Qt::AltModifier);
moveUpAction->setShortcut(combine(Qt::Key_Up, Qt::AltModifier));
moveUpAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveUpAction, &QAction::triggered, controllerView, &ControllerView::moveUp);
controllerView->addAction(moveUpAction);

auto moveDownAction = new QAction(controllerView);
moveDownAction->setShortcut(Qt::Key_Down | Qt::AltModifier);
moveDownAction->setShortcut(combine(Qt::Key_Down, Qt::AltModifier));
moveDownAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveDownAction, &QAction::triggered, controllerView, &ControllerView::moveDown);
controllerView->addAction(moveDownAction);
Expand Down
8 changes: 5 additions & 3 deletions src/gui/EffectRackView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@
*
*/

#include "EffectRackView.h"

#include <QApplication>
#include <QAction>
#include <QPushButton>
#include <QScrollArea>
#include <QVBoxLayout>

#include "EffectRackView.h"
#include "DeprecationHelper.h"
#include "EffectSelectDialog.h"
#include "EffectView.h"
#include "GroupBox.h"
Expand Down Expand Up @@ -176,13 +178,13 @@ void EffectRackView::update()
connect(view, &EffectView::deletedPlugin, this, &EffectRackView::deletePlugin, Qt::QueuedConnection);

QAction* moveUpAction = new QAction(view);
moveUpAction->setShortcut(Qt::Key_Up | Qt::AltModifier);
moveUpAction->setShortcut(combine(Qt::Key_Up, Qt::AltModifier));
moveUpAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveUpAction, &QAction::triggered, view, &EffectView::moveUp);
view->addAction(moveUpAction);

QAction* moveDownAction = new QAction(view);
moveDownAction->setShortcut(Qt::Key_Down | Qt::AltModifier);
moveDownAction->setShortcut(combine(Qt::Key_Down, Qt::AltModifier));
moveDownAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveDownAction, &QAction::triggered, view, &EffectView::moveDown);
view->addAction(moveDownAction);
Expand Down
35 changes: 18 additions & 17 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "AboutDialog.h"
#include "AutomationEditor.h"
#include "ControllerRackView.h"
#include "DeprecationHelper.h"
#include "embed.h"
#include "Engine.h"
#include "ExportProjectDialog.h"
Expand Down Expand Up @@ -293,11 +294,11 @@ void MainWindow::finalize()
project_menu->addAction( embed::getIconPixmap( "project_save" ),
tr( "Save &As..." ),
this, SLOT(saveProjectAs()),
Qt::CTRL + Qt::SHIFT + Qt::Key_S );
combine(Qt::CTRL, Qt::SHIFT, Qt::Key_S));
project_menu->addAction( embed::getIconPixmap( "project_save" ),
tr( "Save as New &Version" ),
this, SLOT(saveProjectAsNewVersion()),
Qt::CTRL + Qt::ALT + Qt::Key_S );
combine(Qt::CTRL, Qt::ALT, Qt::Key_S));

project_menu->addAction( embed::getIconPixmap( "project_save" ),
tr( "Save as default template" ),
Expand All @@ -312,23 +313,23 @@ void MainWindow::finalize()
tr( "E&xport..." ),
this,
SLOT(onExportProject()),
Qt::CTRL + Qt::Key_E );
combine(Qt::CTRL, Qt::Key_E));
project_menu->addAction( embed::getIconPixmap( "project_export" ),
tr( "E&xport Tracks..." ),
this,
SLOT(onExportProjectTracks()),
Qt::CTRL + Qt::SHIFT + Qt::Key_E );
combine(Qt::CTRL, Qt::SHIFT, Qt::Key_E));

project_menu->addAction( embed::getIconPixmap( "midi_file" ),
tr( "Export &MIDI..." ),
this,
SLOT(onExportProjectMidi()),
Qt::CTRL + Qt::Key_M );
combine(Qt::CTRL, Qt::Key_M));

project_menu->addSeparator();
project_menu->addAction( embed::getIconPixmap( "exit" ), tr( "&Quit" ),
qApp, SLOT(closeAllWindows()),
Qt::CTRL + Qt::Key_Q );
combine(Qt::CTRL, Qt::Key_Q));

auto edit_menu = new QMenu(this);
menuBar()->addMenu( edit_menu )->setText( tr( "&Edit" ) );
Expand All @@ -341,13 +342,13 @@ void MainWindow::finalize()
this, SLOT(redo()),
QKeySequence::Redo );
// Ensure that both (Ctrl+Y) and (Ctrl+Shift+Z) activate redo shortcut regardless of OS defaults
if (QKeySequence(QKeySequence::Redo) != QKeySequence(Qt::CTRL + Qt::Key_Y))
if (QKeySequence(QKeySequence::Redo) != QKeySequence(combine(Qt::CTRL, Qt::Key_Y)))
{
new QShortcut( QKeySequence( Qt::CTRL + Qt::Key_Y ), this, SLOT(redo()));
new QShortcut(QKeySequence(combine(Qt::CTRL, Qt::Key_Y)), this, SLOT(redo()));
}
if (QKeySequence(QKeySequence::Redo) != QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Z ))
if (QKeySequence(QKeySequence::Redo) != QKeySequence(combine(Qt::CTRL, Qt::SHIFT, Qt::Key_Z)))
{
new QShortcut( QKeySequence( Qt::CTRL + Qt::SHIFT + Qt::Key_Z ), this, SLOT(redo()));
new QShortcut(QKeySequence(combine(Qt::CTRL, Qt::SHIFT, Qt::Key_Z)), this, SLOT(redo()));
}

edit_menu->addSeparator();
Expand Down Expand Up @@ -446,31 +447,31 @@ void MainWindow::finalize()
// window-toolbar
auto song_editor_window = new ToolButton(embed::getIconPixmap("songeditor"), tr("Song Editor") + " (Ctrl+1)", this,
SLOT(toggleSongEditorWin()), m_toolBar);
song_editor_window->setShortcut( Qt::CTRL + Qt::Key_1 );
song_editor_window->setShortcut(combine(Qt::CTRL, Qt::Key_1));

auto pattern_editor_window = new ToolButton(embed::getIconPixmap("pattern_track_btn"),
tr("Pattern Editor") + " (Ctrl+2)", this, SLOT(togglePatternEditorWin()), m_toolBar);
pattern_editor_window->setShortcut(Qt::CTRL + Qt::Key_2);
pattern_editor_window->setShortcut(combine(Qt::CTRL, Qt::Key_2));

auto piano_roll_window = new ToolButton(
embed::getIconPixmap("piano"), tr("Piano Roll") + " (Ctrl+3)", this, SLOT(togglePianoRollWin()), m_toolBar);
piano_roll_window->setShortcut( Qt::CTRL + Qt::Key_3 );
piano_roll_window->setShortcut(combine(Qt::CTRL, Qt::Key_3));

auto automation_editor_window = new ToolButton(embed::getIconPixmap("automation"),
tr("Automation Editor") + " (Ctrl+4)", this, SLOT(toggleAutomationEditorWin()), m_toolBar);
automation_editor_window->setShortcut( Qt::CTRL + Qt::Key_4 );
automation_editor_window->setShortcut(combine(Qt::CTRL, Qt::Key_4));

auto mixer_window = new ToolButton(
embed::getIconPixmap("mixer"), tr("Mixer") + " (Ctrl+5)", this, SLOT(toggleMixerWin()), m_toolBar);
mixer_window->setShortcut( Qt::CTRL + Qt::Key_5 );
mixer_window->setShortcut(combine(Qt::CTRL, Qt::Key_5));

auto controllers_window = new ToolButton(embed::getIconPixmap("controller"),
tr("Show/hide controller rack") + " (Ctrl+6)", this, SLOT(toggleControllerRack()), m_toolBar);
controllers_window->setShortcut( Qt::CTRL + Qt::Key_6 );
controllers_window->setShortcut(combine(Qt::CTRL, Qt::Key_6));

auto project_notes_window = new ToolButton(embed::getIconPixmap("project_notes"),
tr("Show/hide project notes") + " (Ctrl+7)", this, SLOT(toggleProjectNotesWin()), m_toolBar);
project_notes_window->setShortcut( Qt::CTRL + Qt::Key_7 );
project_notes_window->setShortcut(combine(Qt::CTRL, Qt::Key_7));

m_toolBarLayout->addWidget( song_editor_window, 1, 1 );
m_toolBarLayout->addWidget( pattern_editor_window, 1, 2 );
Expand Down
8 changes: 4 additions & 4 deletions src/gui/editors/AutomationEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2037,17 +2037,17 @@ AutomationEditorWindow::AutomationEditorWindow() :

auto editModeGroup = new ActionGroup(this);
m_drawAction = editModeGroup->addAction(embed::getIconPixmap("edit_draw"), tr("Draw mode (Shift+D)"));
m_drawAction->setShortcut(Qt::SHIFT | Qt::Key_D);
m_drawAction->setShortcut(combine(Qt::SHIFT, Qt::Key_D));
m_drawAction->setChecked(true);

m_eraseAction = editModeGroup->addAction(embed::getIconPixmap("edit_erase"), tr("Erase mode (Shift+E)"));
m_eraseAction->setShortcut(Qt::SHIFT | Qt::Key_E);
m_eraseAction->setShortcut(combine(Qt::SHIFT, Qt::Key_E));

m_drawOutAction = editModeGroup->addAction(embed::getIconPixmap("edit_draw_outvalue"), tr("Draw outValues mode (Shift+C)"));
m_drawOutAction->setShortcut(Qt::SHIFT | Qt::Key_C);
m_drawOutAction->setShortcut(combine(Qt::SHIFT, Qt::Key_C));

m_editTanAction = editModeGroup->addAction(embed::getIconPixmap("edit_tangent"), tr("Edit tangents mode (Shift+T)"));
m_editTanAction->setShortcut(Qt::SHIFT | Qt::Key_T);
m_editTanAction->setShortcut(combine(Qt::SHIFT, Qt::Key_T));
m_editTanAction->setEnabled(false);

m_flipYAction = new QAction(embed::getIconPixmap("flip_y"), tr("Flip vertically"), this);
Expand Down
5 changes: 3 additions & 2 deletions src/gui/editors/Editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include "Editor.h"

#include "DeprecationHelper.h"
#include "GuiApplication.h"
#include "MainWindow.h"
#include "Song.h"
Expand Down Expand Up @@ -118,8 +119,8 @@ Editor::Editor(bool record, bool stepRecord) :
connect(m_toggleStepRecordingAction, SIGNAL(triggered()), this, SLOT(toggleStepRecording()));
connect(m_stopAction, SIGNAL(triggered()), this, SLOT(stop()));
new QShortcut(Qt::Key_Space, this, SLOT(togglePlayStop()));
new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Space), this, SLOT(togglePause()));
new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F11), this, SLOT(toggleMaximize()));
new QShortcut(QKeySequence(combine(Qt::SHIFT, Qt::Key_Space)), this, SLOT(togglePause()));
new QShortcut(QKeySequence(combine(Qt::SHIFT, Qt::Key_F11)), this, SLOT(toggleMaximize()));

// Add actions to toolbar
addButton(m_playAction, "playButton");
Expand Down
22 changes: 11 additions & 11 deletions src/gui/editors/PianoRoll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4764,10 +4764,10 @@ PianoRollWindow::PianoRollWindow() :

drawAction->setChecked( true );

drawAction->setShortcut( Qt::SHIFT | Qt::Key_D );
eraseAction->setShortcut( Qt::SHIFT | Qt::Key_E );
selectAction->setShortcut( Qt::SHIFT | Qt::Key_S );
pitchBendAction->setShortcut( Qt::SHIFT | Qt::Key_T );
drawAction->setShortcut(combine(Qt::SHIFT, Qt::Key_D));
eraseAction->setShortcut(combine(Qt::SHIFT, Qt::Key_E));
selectAction->setShortcut(combine(Qt::SHIFT, Qt::Key_S));
pitchBendAction->setShortcut(combine(Qt::SHIFT, Qt::Key_T));

connect( editModeGroup, SIGNAL(triggered(int)), m_editor, SLOT(setEditMode(int)));

Expand Down Expand Up @@ -4826,9 +4826,9 @@ PianoRollWindow::PianoRollWindow() :

auto pasteAction = new QAction(embed::getIconPixmap("edit_paste"), tr("Paste (%1+V)").arg(UI_CTRL_KEY), this);

cutAction->setShortcut( Qt::CTRL | Qt::Key_X );
copyAction->setShortcut( Qt::CTRL | Qt::Key_C );
pasteAction->setShortcut( Qt::CTRL | Qt::Key_V );
cutAction->setShortcut(combine(Qt::CTRL, Qt::Key_X));
copyAction->setShortcut(combine(Qt::CTRL, Qt::Key_C));
pasteAction->setShortcut(combine(Qt::CTRL, Qt::Key_V));

connect( cutAction, SIGNAL(triggered()), m_editor, SLOT(cutSelectedNotes()));
connect( copyAction, SIGNAL(triggered()), m_editor, SLOT(copySelectedNotes()));
Expand All @@ -4849,19 +4849,19 @@ PianoRollWindow::PianoRollWindow() :

auto glueAction = new QAction(embed::getIconPixmap("glue"), tr("Glue"), noteToolsButton);
connect(glueAction, SIGNAL(triggered()), m_editor, SLOT(glueNotes()));
glueAction->setShortcut( Qt::SHIFT | Qt::Key_G );
glueAction->setShortcut(combine(Qt::SHIFT, Qt::Key_G));

auto knifeAction = new QAction(embed::getIconPixmap("edit_knife"), tr("Knife"), noteToolsButton);
connect(knifeAction, &QAction::triggered, m_editor, &PianoRoll::setKnifeAction);
knifeAction->setShortcut( Qt::SHIFT | Qt::Key_K );
knifeAction->setShortcut(combine(Qt::SHIFT, Qt::Key_K));

auto fillAction = new QAction(embed::getIconPixmap("fill"), tr("Fill"), noteToolsButton);
connect(fillAction, &QAction::triggered, [this](){ m_editor->fitNoteLengths(true); });
fillAction->setShortcut(Qt::SHIFT | Qt::Key_F);
fillAction->setShortcut(combine(Qt::SHIFT, Qt::Key_F));

auto cutOverlapsAction = new QAction(embed::getIconPixmap("cut_overlaps"), tr("Cut overlaps"), noteToolsButton);
connect(cutOverlapsAction, &QAction::triggered, [this](){ m_editor->fitNoteLengths(false); });
cutOverlapsAction->setShortcut(Qt::SHIFT | Qt::Key_C);
cutOverlapsAction->setShortcut(combine(Qt::SHIFT, Qt::Key_C));

auto minLengthAction = new QAction(embed::getIconPixmap("min_length"), tr("Min length as last"), noteToolsButton);
connect(minLengthAction, &QAction::triggered, [this](){ m_editor->constrainNoteLengths(false); });
Expand Down

0 comments on commit 93ed53a

Please sign in to comment.