diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 944791552dd..5a8024d0e20 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -42,7 +42,6 @@ class QLineEdit; -template class QQueue; class InstrumentFunctionArpeggioView; class InstrumentFunctionNoteStackingView; class EffectRackView; @@ -324,10 +323,6 @@ class InstrumentTrackView : public TrackView return m_midiMenu; } - void freeInstrumentTrackWindow(); - - static void cleanupWindowCache(); - // Create a menu for assigning/creating channels for this track QMenu * createFxMenu( QString title, QString newFxLabel ) override; @@ -349,12 +344,12 @@ private slots: void assignFxLine( int channelIndex ); void createFxLine(); + void handleConfigChange(QString cls, QString attr, QString value); + private: InstrumentTrackWindow * m_window; - static QQueue s_windowCache; - // widgets in track-settings-widget TrackLabelButton * m_tlb; Knob * m_volumeKnob; @@ -482,6 +477,7 @@ protected slots: PianoView * m_pianoView; friend class InstrumentView; + friend class InstrumentTrackView; } ; diff --git a/src/core/Song.cpp b/src/core/Song.cpp index bb2e937d086..35eebb6cb37 100644 --- a/src/core/Song.cpp +++ b/src/core/Song.cpp @@ -884,8 +884,6 @@ void Song::clearProject() Engine::projectJournal()->clearJournal(); Engine::projectJournal()->setJournalling( true ); - - InstrumentTrackView::cleanupWindowCache(); } diff --git a/src/gui/GuiApplication.cpp b/src/gui/GuiApplication.cpp index dbd95cdfc25..5170ffb8c44 100644 --- a/src/gui/GuiApplication.cpp +++ b/src/gui/GuiApplication.cpp @@ -163,7 +163,6 @@ GuiApplication::GuiApplication() GuiApplication::~GuiApplication() { - InstrumentTrackView::cleanupWindowCache(); s_instance = nullptr; } diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a4b4d0231d1..c3b97578266 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -25,7 +25,6 @@ #include "InstrumentTrack.h" #include -#include #include #include #include @@ -79,7 +78,6 @@ const int INSTRUMENT_WIDTH = 254; const int INSTRUMENT_HEIGHT = INSTRUMENT_WIDTH; const int PIANO_HEIGHT = 80; -const int INSTRUMENT_WINDOW_CACHE_SIZE = 8; // #### IT: @@ -951,9 +949,6 @@ void InstrumentTrack::autoAssignMidiDevice(bool assign) // #### ITV: -QQueue InstrumentTrackView::s_windowCache; - - InstrumentTrackView::InstrumentTrackView( InstrumentTrack * _it, TrackContainerView* tcv ) : TrackView( _it, tcv ), @@ -975,6 +970,9 @@ InstrumentTrackView::InstrumentTrackView( InstrumentTrack * _it, TrackContainerV connect( _it, SIGNAL( nameChanged() ), m_tlb, SLOT( update() ) ); + connect(ConfigManager::inst(), SIGNAL(valueChanged(QString, QString, QString)), + this, SLOT(handleConfigChange(QString, QString, QString))); + // creation of widgets for track-settings-widget int widgetWidth; if( ConfigManager::inst()->value( "ui", @@ -1066,7 +1064,8 @@ InstrumentTrackView::InstrumentTrackView( InstrumentTrack * _it, TrackContainerV InstrumentTrackView::~InstrumentTrackView() { - freeInstrumentTrackWindow(); + delete m_window; + m_window = nullptr; delete model()->m_midiPort.m_readablePortsMenu; delete model()->m_midiPort.m_writablePortsMenu; @@ -1119,89 +1118,26 @@ void InstrumentTrackView::assignFxLine(int channelIndex) -// TODO: Add windows to free list on freeInstrumentTrackWindow. -// But, don't NULL m_window or disconnect signals. This will allow windows -// that are being show/hidden frequently to stay connected. -void InstrumentTrackView::freeInstrumentTrackWindow() +InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow() { - if( m_window != NULL ) + if (!m_window) { - m_lastPos = m_window->parentWidget()->pos(); - - if( ConfigManager::inst()->value( "ui", - "oneinstrumenttrackwindow" ).toInt() || - s_windowCache.count() < INSTRUMENT_WINDOW_CACHE_SIZE ) - { - model()->setHook( NULL ); - m_window->setInstrumentTrackView( NULL ); - m_window->parentWidget()->hide(); - m_window->updateInstrumentView(); - s_windowCache << m_window; - } - else - { - delete m_window; - } - - m_window = NULL; + m_window = new InstrumentTrackWindow(this); } -} - - - -void InstrumentTrackView::cleanupWindowCache() -{ - while( !s_windowCache.isEmpty() ) - { - delete s_windowCache.dequeue(); - } + return m_window; } - - - -InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow() +void InstrumentTrackView::handleConfigChange(QString cls, QString attr, QString value) { - if( m_window != NULL ) - { - } - else if( !s_windowCache.isEmpty() ) + // When one instrument track window mode is turned on, + // close windows except last opened one. + if (cls == "ui" && attr == "oneinstrumenttrackwindow" && value.toInt()) { - m_window = s_windowCache.dequeue(); - - m_window->setInstrumentTrackView( this ); - m_window->setModel( model() ); - m_window->updateInstrumentView(); - model()->setHook( m_window ); - - if( ConfigManager::inst()-> - value( "ui", "oneinstrumenttrackwindow" ).toInt() ) - { - s_windowCache << m_window; - } - else if( m_lastPos.x() > 0 || m_lastPos.y() > 0 ) - { - m_window->parentWidget()->move( m_lastPos ); - } + m_tlb->setChecked(m_window && m_window == topLevelInstrumentTrackWindow()); } - else - { - m_window = new InstrumentTrackWindow( this ); - if( ConfigManager::inst()-> - value( "ui", "oneinstrumenttrackwindow" ).toInt() ) - { - // first time, an InstrumentTrackWindow is opened - s_windowCache << m_window; - } - } - - return m_window; } - - - void InstrumentTrackView::dragEnterEvent( QDragEnterEvent * _dee ) { InstrumentTrackWindow::dragEnterEventGeneric( _dee ); @@ -1225,12 +1161,15 @@ void InstrumentTrackView::dropEvent( QDropEvent * _de ) void InstrumentTrackView::toggleInstrumentWindow( bool _on ) { - getInstrumentTrackWindow()->toggleVisibility( _on ); - - if( !_on ) + if (_on && ConfigManager::inst()->value("ui", "oneinstrumenttrackwindow").toInt()) { - freeInstrumentTrackWindow(); + if (topLevelInstrumentTrackWindow()) + { + topLevelInstrumentTrackWindow()->m_itv->m_tlb->setChecked(false); + } } + + getInstrumentTrackWindow()->toggleVisibility( _on ); } @@ -1547,11 +1486,9 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : InstrumentTrackWindow::~InstrumentTrackWindow() { - InstrumentTrackView::s_windowCache.removeAll( this ); - delete m_instrumentView; - if( gui->mainWindow()->workspace() ) + if (parentWidget()) { parentWidget()->hide(); parentWidget()->deleteLater();