Global Spacebar Play (#7762)

This PR refactors how the spacebar is handled by the editors and the MainWindow to allow it to play/stop (Shift+Space for play/pause) the last played editor, no matter if it is in focus or not.

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
This commit is contained in:
regulus79
2025-04-26 18:26:26 -04:00
committed by GitHub
parent 8b5297f914
commit 510fbf6ffc
13 changed files with 66 additions and 29 deletions

View File

@@ -57,6 +57,13 @@ protected:
DropToolBar * addDropToolBar(QWidget * parent, Qt::ToolBarArea whereToAdd, QString const & windowTitle);
void closeEvent(QCloseEvent * event) override;
void keyPressEvent(QKeyEvent *ke) override;
public slots:
//! Called by pressing the space key. Plays or stops.
void togglePlayStop();
//! Called by pressing shift+space. Toggles pause state.
void togglePause();
protected slots:
virtual void play() {}
virtual void record() {}
@@ -65,12 +72,6 @@ protected slots:
virtual void stop() {}
private slots:
/// Called by pressing the space key. Plays or stops.
void togglePlayStop();
/// Called by pressing shift+space. Toggles pause state.
void togglePause();
void toggleMaximize();
signals:

View File

@@ -61,7 +61,7 @@ public:
void contextMenuEvent(QContextMenuEvent*) override;
void mousePressEvent(QMouseEvent*) override;
void mouseDoubleClickEvent(QMouseEvent*) override;
bool eventFilter(QObject* dist, QEvent* event) override;
void keyPressEvent(QKeyEvent* ke) override;
void reset();
int channelIndex() const { return m_channelIndex; }

View File

@@ -257,6 +257,7 @@ public:
return m_playMode;
}
PlayMode lastPlayMode() const { return m_lastPlayMode; }
inline PlayPos & getPlayPos( PlayMode pm )
{
return m_playPos[static_cast<std::size_t>(pm)];
@@ -492,6 +493,7 @@ private:
std::array<Timeline, PlayModeCount> m_timelines;
PlayMode m_playMode;
PlayMode m_lastPlayMode;
PlayPos m_playPos[PlayModeCount];
bar_t m_length;

View File

@@ -493,6 +493,7 @@ void Song::playSong()
}
m_playMode = PlayMode::Song;
m_lastPlayMode = m_playMode;
m_playing = true;
m_paused = false;
@@ -532,6 +533,7 @@ void Song::playPattern()
}
m_playMode = PlayMode::Pattern;
m_lastPlayMode = m_playMode;
m_playing = true;
m_paused = false;
@@ -558,6 +560,7 @@ void Song::playMidiClip( const MidiClip* midiClipToPlay, bool loop )
if( m_midiClipToPlay != nullptr )
{
m_playMode = PlayMode::MidiClip;
m_lastPlayMode = m_playMode;
m_playing = true;
m_paused = false;
}

View File

@@ -65,6 +65,7 @@ EffectRackView::EffectRackView( EffectChain* model, QWidget* parent ) :
auto addButton = new QPushButton;
addButton->setText( tr( "Add effect" ) );
addButton->setFocusPolicy(Qt::NoFocus);
effectsLayout->addWidget( addButton );

View File

@@ -93,6 +93,7 @@ EffectView::EffectView( Effect * _model, QWidget * _parent ) :
QFont f = ctls_btn->font();
ctls_btn->setFont(adjustedToPixelSize(f, DEFAULT_FONT_SIZE));
ctls_btn->setGeometry( 150, 14, 50, 20 );
ctls_btn->setFocusPolicy(Qt::NoFocus);
connect( ctls_btn, SIGNAL(clicked()),
this, SLOT(editControls()));

View File

@@ -1287,6 +1287,31 @@ void MainWindow::keyPressEvent( QKeyEvent * _ke )
case Qt::Key_Control: m_keyMods.m_ctrl = true; break;
case Qt::Key_Shift: m_keyMods.m_shift = true; break;
case Qt::Key_Alt: m_keyMods.m_alt = true; break;
case Qt::Key_Space:
{
Editor* lastEditor = nullptr;
switch (Engine::getSong()->lastPlayMode())
{
case Song::PlayMode::Song:
lastEditor = getGUI()->songEditor();
break;
case Song::PlayMode::MidiClip:
lastEditor = getGUI()->pianoRoll();
break;
case Song::PlayMode::Pattern:
lastEditor = getGUI()->patternEditor();
break;
case Song::PlayMode::AutomationClip:
lastEditor = getGUI()->automationEditor();
break;
default:
lastEditor = getGUI()->songEditor();
break;
}
if (m_keyMods.m_shift) { lastEditor->togglePause(); }
else { lastEditor->togglePlayStop(); }
break;
}
default:
{
InstrumentTrackWindow * w =

View File

@@ -147,6 +147,8 @@ MixerChannelView::MixerChannelView(QWidget* parent, MixerView* mixerView, int ch
mainLayout->addWidget(m_fader, 1, Qt::AlignHCenter);
connect(m_renameLineEdit, &QLineEdit::editingFinished, this, &MixerChannelView::renameFinished);
setFocusPolicy(Qt::StrongFocus);
}
void MixerChannelView::contextMenuEvent(QContextMenuEvent*)
@@ -220,23 +222,19 @@ void MixerChannelView::mouseDoubleClickEvent(QMouseEvent*)
renameChannel();
}
bool MixerChannelView::eventFilter(QObject*, QEvent* event)
void MixerChannelView::keyPressEvent(QKeyEvent* ke)
{
// If we are in a rename, capture the enter/return events and handle them
if (event->type() == QEvent::KeyPress)
if (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return)
{
auto keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return)
if (m_inRename)
{
if (m_inRename)
{
renameFinished();
event->accept(); // Stop the event from propagating
return true;
}
renameFinished();
}
}
return false;
else if (ke->key() == Qt::Key_Space)
{
m_fader->adjustByDialog();
}
}
void MixerChannelView::setChannelIndex(int index)

View File

@@ -536,15 +536,8 @@ void MixerView::keyPressEvent(QKeyEvent * e)
case Qt::Key_F2:
renameChannel(m_currentMixerChannel->channelIndex());
break;
case Qt::Key_Space:
{
auto* mixerChannel = currentMixerChannel();
if (mixerChannel)
{
mixerChannel->fader()->adjustByDialog();
}
}
default:
e->ignore();
break;
}
}

View File

@@ -287,6 +287,7 @@ void AutomationEditor::keyPressEvent(QKeyEvent * ke )
break;
default:
ke->ignore();
break;
}
}

View File

@@ -118,7 +118,6 @@ Editor::Editor(bool record, bool stepRecord) :
connect(m_recordAccompanyAction, SIGNAL(triggered()), this, SLOT(recordAccompany()));
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(combine(Qt::SHIFT, Qt::Key_Space)), this, SLOT(togglePause()));
new QShortcut(QKeySequence(combine(Qt::SHIFT, Qt::Key_F11)), this, SLOT(toggleMaximize()));
@@ -155,6 +154,16 @@ void Editor::closeEvent(QCloseEvent * event)
event->ignore();
}
void Editor::keyPressEvent(QKeyEvent *ke)
{
if (ke->key() == Qt::Key_Space)
{
togglePlayStop();
return;
}
ke->ignore();
}
DropToolBar::DropToolBar(QWidget* parent) : QToolBar(parent)
{
setAcceptDrops(true);

View File

@@ -49,6 +49,8 @@ PatternEditor::PatternEditor(PatternStore* ps) :
m_ps(ps)
{
setModel(ps);
setFocusPolicy(Qt::StrongFocus);
setFocus();
}

View File

@@ -1505,6 +1505,7 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke)
}
break;
default:
ke->ignore();
break;
}