Control play/pause buttons in slot of MainWindow via signal in Song class
The engine class as the component instance manager is the wrong place to control the play/pause buttons. Instead emit a signal in the Song class and update the buttons in a slot in MainWindow. This fixes problems with GUI/pixmap operations happening outside the GUI thread when exporting a project. Closes #435.
This commit is contained in:
@@ -107,6 +107,8 @@ public slots:
|
||||
void togglePianoRollWin();
|
||||
void toggleControllerRack();
|
||||
|
||||
void updatePlayPauseIcons();
|
||||
|
||||
void undo();
|
||||
void redo();
|
||||
|
||||
|
||||
@@ -147,8 +147,6 @@ public:
|
||||
return s_controllerRackView;
|
||||
}
|
||||
|
||||
static void updatePlayPauseIcons();
|
||||
|
||||
static float framesPerTick()
|
||||
{
|
||||
return s_framesPerTick;
|
||||
|
||||
@@ -360,6 +360,7 @@ private:
|
||||
|
||||
signals:
|
||||
void projectLoaded();
|
||||
void playbackStateChanged();
|
||||
void lengthChanged( int _tacts );
|
||||
void tempoChanged( bpm_t _new_bpm );
|
||||
void timeSignatureChanged( int _old_ticks_per_tact,
|
||||
|
||||
@@ -146,42 +146,6 @@ void engine::destroy()
|
||||
|
||||
|
||||
|
||||
void engine::updatePlayPauseIcons()
|
||||
{
|
||||
s_songEditor->setPauseIcon( false );
|
||||
s_automationEditor->setPauseIcon( false );
|
||||
s_bbEditor->setPauseIcon( false );
|
||||
s_pianoRoll->setPauseIcon( false );
|
||||
|
||||
if( s_song->isPlaying() )
|
||||
{
|
||||
switch( s_song->playMode() )
|
||||
{
|
||||
case song::Mode_PlaySong:
|
||||
s_songEditor->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayAutomationPattern:
|
||||
s_automationEditor->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayBB:
|
||||
s_bbEditor->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayPattern:
|
||||
s_pianoRoll->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void engine::updateFramesPerTick()
|
||||
{
|
||||
s_framesPerTick = s_mixer->processingSampleRate() * 60.0f * 4 /
|
||||
|
||||
@@ -404,10 +404,7 @@ void song::playSong()
|
||||
|
||||
savePos();
|
||||
|
||||
if( QApplication::type() != QApplication::Tty )
|
||||
{
|
||||
engine::updatePlayPauseIcons();
|
||||
}
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -447,7 +444,7 @@ void song::playTrack( track * _trackToPlay )
|
||||
|
||||
savePos();
|
||||
|
||||
engine::updatePlayPauseIcons();
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -468,7 +465,7 @@ void song::playBB()
|
||||
|
||||
savePos();
|
||||
|
||||
engine::updatePlayPauseIcons();
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -493,7 +490,7 @@ void song::playPattern( pattern * _patternToPlay, bool _loop )
|
||||
|
||||
savePos();
|
||||
|
||||
engine::updatePlayPauseIcons();
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -546,7 +543,7 @@ void song::togglePause()
|
||||
|
||||
m_vstSyncController.setPlaybackState( m_playing );
|
||||
|
||||
engine::updatePlayPauseIcons();
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -605,9 +602,7 @@ void song::stop()
|
||||
|
||||
m_playMode = Mode_None;
|
||||
|
||||
if(QApplication::type() != QApplication::Tty) {
|
||||
engine::updatePlayPauseIcons();
|
||||
}
|
||||
emit playbackStateChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -190,6 +190,9 @@ MainWindow::MainWindow() :
|
||||
connect(&m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(autoSave()));
|
||||
m_autoSaveTimer.start(1000 * 60); // 1 minute
|
||||
}
|
||||
|
||||
connect( engine::getSong(), SIGNAL( playbackStateChanged() ),
|
||||
this, SLOT( updatePlayPauseIcons() ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -926,6 +929,42 @@ void MainWindow::toggleControllerRack()
|
||||
|
||||
|
||||
|
||||
void MainWindow::updatePlayPauseIcons()
|
||||
{
|
||||
engine::songEditor()->setPauseIcon( false );
|
||||
engine::automationEditor()->setPauseIcon( false );
|
||||
engine::getBBEditor()->setPauseIcon( false );
|
||||
engine::pianoRoll()->setPauseIcon( false );
|
||||
|
||||
if( engine::getSong()->isPlaying() )
|
||||
{
|
||||
switch( engine::getSong()->playMode() )
|
||||
{
|
||||
case song::Mode_PlaySong:
|
||||
engine::songEditor()->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayAutomationPattern:
|
||||
engine::automationEditor()->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayBB:
|
||||
engine::getBBEditor()->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
case song::Mode_PlayPattern:
|
||||
engine::pianoRoll()->setPauseIcon( true );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void MainWindow::undo()
|
||||
{
|
||||
engine::projectJournal()->undo();
|
||||
|
||||
Reference in New Issue
Block a user