Remove instrument track window caching to fix related bugs (#5808)

This commit is contained in:
Hyunjin Song
2020-12-01 11:03:58 +09:00
committed by GitHub
parent aff2ebcce0
commit d73ede58a3
4 changed files with 27 additions and 97 deletions

View File

@@ -42,7 +42,6 @@
class QLineEdit;
template<class T> class QQueue;
class InstrumentFunctionArpeggioView;
class InstrumentFunctionNoteStackingView;
class EffectRackView;
@@ -324,10 +323,6 @@ public:
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<InstrumentTrackWindow *> s_windowCache;
// widgets in track-settings-widget
TrackLabelButton * m_tlb;
Knob * m_volumeKnob;
@@ -482,6 +477,7 @@ private:
PianoView * m_pianoView;
friend class InstrumentView;
friend class InstrumentTrackView;
} ;

View File

@@ -884,8 +884,6 @@ void Song::clearProject()
Engine::projectJournal()->clearJournal();
Engine::projectJournal()->setJournalling( true );
InstrumentTrackView::cleanupWindowCache();
}

View File

@@ -163,7 +163,6 @@ GuiApplication::GuiApplication()
GuiApplication::~GuiApplication()
{
InstrumentTrackView::cleanupWindowCache();
s_instance = nullptr;
}

View File

@@ -25,7 +25,6 @@
#include "InstrumentTrack.h"
#include <QDir>
#include <QQueue>
#include <QApplication>
#include <QCloseEvent>
#include <QLabel>
@@ -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<InstrumentTrackWindow *> 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,88 +1118,25 @@ 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()
{
if( m_window != NULL )
{
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;
}
}
void InstrumentTrackView::cleanupWindowCache()
{
while( !s_windowCache.isEmpty() )
{
delete s_windowCache.dequeue();
}
}
InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow()
{
if( m_window != NULL )
if (!m_window)
{
}
else if( !s_windowCache.isEmpty() )
{
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 );
}
}
else
{
m_window = new InstrumentTrackWindow( this );
if( ConfigManager::inst()->
value( "ui", "oneinstrumenttrackwindow" ).toInt() )
{
// first time, an InstrumentTrackWindow is opened
s_windowCache << m_window;
}
m_window = new InstrumentTrackWindow(this);
}
return m_window;
}
void InstrumentTrackView::handleConfigChange(QString cls, QString attr, QString value)
{
// When one instrument track window mode is turned on,
// close windows except last opened one.
if (cls == "ui" && attr == "oneinstrumenttrackwindow" && value.toInt())
{
m_tlb->setChecked(m_window && m_window == topLevelInstrumentTrackWindow());
}
}
void InstrumentTrackView::dragEnterEvent( QDragEnterEvent * _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();