InstrumentTrackView: added one-window-mode + global piano focus

Added a one-window-mode which allows to have only one instrument track
window open at a time. The content of this window is replaced each time
you open a different track.

Furthermore added global reception and forwarding of key events to the
piano widget of the top-most instrument track window. This for example
enables the user to play test sounds while tweaking some effects in a
different subwindow.
This commit is contained in:
Tobias Doerffel
2010-08-06 22:59:43 +02:00
parent 1320741feb
commit 93681760d2
10 changed files with 177 additions and 110 deletions

View File

@@ -2,7 +2,7 @@
* InstrumentTrack.h - declaration of class InstrumentTrack, a track + window
* which holds an instrument-plugin
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -41,6 +41,7 @@
class QLineEdit;
template<class T> class QQueue;
template<class T> class QStack;
class ArpeggiatorView;
class ChordCreatorView;
class EffectRackView;
@@ -259,6 +260,10 @@ public:
return castModel<InstrumentTrack>();
}
static InstrumentTrackWindow * topLevelInstrumentTrackWindow()
{
return s_windowStack.isEmpty() ? NULL : s_windowStack.top();
}
QMenu * midiMenu()
{
@@ -267,7 +272,7 @@ public:
void freeInstrumentTrackWindow();
static void cleanupWindowPool();
static void cleanupWindowCache();
protected:
@@ -288,7 +293,8 @@ private slots:
private:
InstrumentTrackWindow * m_window;
static QQueue<InstrumentTrackWindow *> s_windows;
static QQueue<InstrumentTrackWindow *> s_windowCache;
static QStack<InstrumentTrackWindow *> s_windowStack;
// widgets in track-settings-widget
trackLabelButton * m_tlb;
@@ -335,9 +341,11 @@ public:
return castModel<InstrumentTrack>();
}
void setInstrumentTrackView( InstrumentTrackView * _tv )
void setInstrumentTrackView( InstrumentTrackView * _tv );
PianoView * pianoView()
{
m_itv = _tv;
return m_pianoView;
}
static void dragEnterEventGeneric( QDragEnterEvent * _dee );

View File

@@ -1,7 +1,7 @@
/*
* PianoView.h - declaration of PianoView, an interactive piano/keyboard-widget
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -43,10 +43,13 @@ public:
static int getKeyFromKeyEvent( QKeyEvent * _ke );
protected:
virtual void modelChanged();
public:
virtual void keyPressEvent( QKeyEvent * ke );
virtual void keyReleaseEvent( QKeyEvent * ke );
protected:
virtual void modelChanged();
virtual void contextMenuEvent( QContextMenuEvent * _me );
virtual void paintEvent( QPaintEvent * );
virtual void mousePressEvent( QMouseEvent * me );

View File

@@ -1,7 +1,7 @@
/*
* setup_dialog.h - dialog for setting up LMMS
*
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -115,6 +115,7 @@ private slots:
void toggleDisableChActInd( bool _disabled );
void toggleManualChPiano( bool _enabled );
void toggleOneInstrumentTrackWindow( bool _enabled );
void toggleMCLEnabled( bool _enabled );
void toggleMCLControlKey( bool _enabled );
@@ -170,6 +171,7 @@ private:
bool m_disableChActInd;
bool m_manualChPiano;
bool m_oneInstrumentTrackWindow;
typedef QMap<QString, AudioBackend::setupWidget *> AswMap;
typedef QMap<QString, MidiClient::setupWidget *> MswMap;

View File

@@ -160,7 +160,7 @@ void engine::destroy()
deleteHelper( &s_automationEditor );
deleteHelper( &s_fxMixerView );
InstrumentTrackView::cleanupWindowPool();
InstrumentTrackView::cleanupWindowCache();
s_song->clearProject();

View File

@@ -1,7 +1,7 @@
/*
* MainWindow.cpp - implementation of LMMS' main window
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -50,6 +50,8 @@
#include "embed.h"
#include "engine.h"
#include "FxMixerView.h"
#include "InstrumentTrack.h"
#include "PianoView.h"
#include "AboutDialog.h"
#include "PreferencesDialog.h"
#include "ControllerRackView.h"
@@ -1241,7 +1243,15 @@ void MainWindow::keyPressEvent( QKeyEvent * _ke )
case Qt::Key_Shift: m_keyMods.m_shift = true; break;
case Qt::Key_Alt: m_keyMods.m_alt = true; break;
default:
QMainWindow::keyPressEvent( _ke );
if( InstrumentTrackView::topLevelInstrumentTrackWindow() )
{
InstrumentTrackView::topLevelInstrumentTrackWindow()->
pianoView()->keyPressEvent( _ke );
}
if( !_ke->isAccepted() )
{
QMainWindow::keyPressEvent( _ke );
}
}
}
@@ -1403,7 +1413,15 @@ void MainWindow::keyReleaseEvent( QKeyEvent * _ke )
case Qt::Key_Shift: m_keyMods.m_shift = false; break;
case Qt::Key_Alt: m_keyMods.m_alt = false; break;
default:
QMainWindow::keyReleaseEvent( _ke );
if( InstrumentTrackView::topLevelInstrumentTrackWindow() )
{
InstrumentTrackView::topLevelInstrumentTrackWindow()->
pianoView()->keyReleaseEvent( _ke );
}
if( !_ke->isAccepted() )
{
QMainWindow::keyReleaseEvent( _ke );
}
}
}

View File

@@ -2,7 +2,7 @@
* Piano.cpp - implementation of piano-widget used in instrument-track-window
* for testing + according model class
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -644,6 +644,7 @@ void PianoView::keyPressEvent( QKeyEvent * _ke )
if( m_piano != NULL )
{
m_piano->handleKeyPress( key_num );
_ke->accept();
update();
}
}
@@ -671,6 +672,7 @@ void PianoView::keyReleaseEvent( QKeyEvent * _ke )
if( m_piano != NULL )
{
m_piano->handleKeyRelease( key_num );
_ke->accept();
update();
}
}

View File

@@ -2,7 +2,7 @@
* automation_editor.cpp - implementation of automationEditor which is used for
* actual setting of dynamic values
*
* Copyright (c) 2008-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2008-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
@@ -510,37 +510,35 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
case Qt::Key_Up:
m_topBottomScroll->setValue(
m_topBottomScroll->value() - 1 );
_ke->accept();
break;
case Qt::Key_Down:
m_topBottomScroll->setValue(
m_topBottomScroll->value() + 1 );
_ke->accept();
break;
case Qt::Key_Left:
{
if( ( m_timeLine->pos() -= 16 ) < 0 )
{
m_timeLine->pos().setTicks( 0 );
}
m_timeLine->updatePosition();
_ke->accept();
break;
}
case Qt::Key_Right:
{
m_timeLine->pos() += 16;
m_timeLine->updatePosition();
_ke->accept();
break;
}
case Qt::Key_C:
if( _ke->modifiers() & Qt::ControlModifier )
{
copySelectedValues();
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -548,10 +546,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ControlModifier )
{
cutSelectedValues();
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -559,10 +554,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ControlModifier )
{
pasteValues();
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -572,10 +564,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
m_selectButton->setChecked( true );
selectAll();
update();
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -583,10 +572,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ShiftModifier )
{
m_drawButton->setChecked( true );
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -594,10 +580,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ShiftModifier )
{
m_eraseButton->setChecked( true );
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -605,10 +588,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ShiftModifier )
{
m_selectButton->setChecked( true );
}
else
{
_ke->ignore();
_ke->accept();
}
break;
@@ -616,15 +596,13 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() & Qt::ShiftModifier )
{
m_moveButton->setChecked( true );
}
else
{
_ke->ignore();
_ke->accept();
}
break;
case Qt::Key_Delete:
deleteSelectedValues();
_ke->accept();
break;
case Qt::Key_Space:
@@ -636,15 +614,16 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke )
{
play();
}
_ke->accept();
break;
case Qt::Key_Home:
m_timeLine->pos().setTicks( 0 );
m_timeLine->updatePosition();
_ke->accept();
break;
default:
_ke->ignore();
break;
}
}

View File

@@ -2,7 +2,7 @@
* piano_roll.cpp - implementation of piano-roll which is used for actual
* writing of melodies
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2008 Andrew Kelley <superjoe30/at/gmail/dot/com>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
@@ -908,6 +908,7 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
{
m_pattern->instrumentTrack()->
pianoModel()->handleKeyPress( key_num );
_ke->accept();
}
}
@@ -938,7 +939,9 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
Qt::AltModifier );
}
}
_ke->accept();
break;
case Qt::Key_Down:
if( _ke->modifiers() & Qt::ControlModifier
&& m_action == ActionNone )
@@ -964,10 +967,10 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
Qt::AltModifier );
}
}
_ke->accept();
break;
case Qt::Key_Left:
{
if( _ke->modifiers() & Qt::ControlModifier &&
m_action == ActionNone )
{
@@ -1005,10 +1008,10 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
}
}
_ke->accept();
break;
}
case Qt::Key_Right:
{
if( _ke->modifiers() & Qt::ControlModifier
&& m_action == ActionNone)
{
@@ -1043,103 +1046,78 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
}
}
_ke->accept();
break;
}
case Qt::Key_C:
if( _ke->modifiers() & Qt::ControlModifier )
{
_ke->accept();
copySelectedNotes();
}
else
{
_ke->ignore();
}
break;
case Qt::Key_X:
if( _ke->modifiers() & Qt::ControlModifier )
{
_ke->accept();
cutSelectedNotes();
}
else
{
_ke->ignore();
}
break;
case Qt::Key_V:
if( _ke->modifiers() & Qt::ControlModifier )
{
_ke->accept();
pasteNotes();
}
else
{
_ke->ignore();
}
break;
case Qt::Key_A:
if( _ke->modifiers() & Qt::ControlModifier )
{
_ke->accept();
m_selectButton->setChecked( true );
selectAll();
update();
}
else
{
_ke->ignore();
}
break;
case Qt::Key_D:
if( _ke->modifiers() & Qt::ShiftModifier )
{
_ke->accept();
m_drawButton->setChecked( true );
}
else
{
_ke->ignore();
}
break;
case Qt::Key_E:
if( _ke->modifiers() & Qt::ShiftModifier )
{
_ke->accept();
m_eraseButton->setChecked( true );
}
else
{
_ke->ignore();
}
break;
case Qt::Key_S:
if( _ke->modifiers() & Qt::ShiftModifier )
{
_ke->accept();
m_selectButton->setChecked( true );
}
else
{
_ke->ignore();
}
break;
case Qt::Key_T:
if( _ke->modifiers() & Qt::ShiftModifier )
{
_ke->accept();
m_detuneButton->setChecked( true );
}
else
{
_ke->ignore();
}
break;
case Qt::Key_Delete:
deleteSelectedNotes();
_ke->accept();
break;
case Qt::Key_Space:
@@ -1151,11 +1129,13 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
{
play();
}
_ke->accept();
break;
case Qt::Key_Home:
m_timeLine->pos().setTicks( 0 );
m_timeLine->updatePosition();
_ke->accept();
break;
case Qt::Key_0:
@@ -1175,11 +1155,13 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
if( _ke->modifiers() &
( Qt::ControlModifier | Qt::KeypadModifier ) )
{
m_noteLenModel.setValue( len );
m_noteLenModel.setValue( len );
_ke->accept();
}
else if( _ke->modifiers() & Qt::AltModifier )
{
m_quantizeModel.setValue( len );
m_quantizeModel.setValue( len );
_ke->accept();
}
break;
}
@@ -1192,10 +1174,11 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
QApplication::changeOverrideCursor(
QCursor( Qt::ArrowCursor ) );
update();
_ke->accept();
}
break;
default:
_ke->ignore();
break;
}
}
@@ -1214,6 +1197,7 @@ void pianoRoll::keyReleaseEvent( QKeyEvent * _ke )
{
m_pattern->instrumentTrack()->
pianoModel()->handleKeyRelease( key_num );
_ke->accept();
}
}
switch( _ke->key() )
@@ -1225,7 +1209,6 @@ void pianoRoll::keyReleaseEvent( QKeyEvent * _ke )
update();
break;
}
_ke->ignore();
}

View File

@@ -1,7 +1,7 @@
/*
* setup_dialog.cpp - dialog for setting up LMMS
*
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -119,6 +119,8 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) :
"disablechannelactivityindicators" ).toInt() ),
m_manualChPiano( configManager::inst()->value( "ui",
"manualchannelpiano" ).toInt() ),
m_oneInstrumentTrackWindow( configManager::inst()->value( "ui",
"oneinstrumenttrackwindow" ).toInt() ),
m_mclEnabled( engine::getMidiControlListener()->getEnabled() ),
m_mclChannel( engine::getMidiControlListener()->getChannel() ),
m_mclUseControlKey( engine::getMidiControlListener()->getUseControlKey() ),
@@ -198,7 +200,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) :
tabWidget * misc_tw = new tabWidget( tr( "MISC" ), general );
misc_tw->setFixedHeight( 120 );
misc_tw->setFixedHeight( 138 );
ledCheckBox * enable_tooltips = new ledCheckBox(
tr( "Enable tooltips" ),
@@ -234,10 +236,18 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) :
connect( mmpz, SIGNAL( toggled( bool ) ),
this, SLOT( toggleMMPZ( bool ) ) );
ledCheckBox * oneitw = new ledCheckBox(
tr( "One instrument track window mode" ),
misc_tw );
oneitw->move( 10, 90 );
oneitw->setChecked( m_oneInstrumentTrackWindow );
connect( oneitw, SIGNAL( toggled( bool ) ),
this, SLOT( toggleOneInstrumentTrackWindow( bool ) ) );
ledCheckBox * hqaudio = new ledCheckBox(
tr( "HQ-mode for output audio-device" ),
misc_tw );
hqaudio->move( 10, 90 );
hqaudio->move( 10, 108 );
hqaudio->setChecked( m_hqAudioDev );
connect( hqaudio, SIGNAL( toggled( bool ) ),
this, SLOT( toggleHQAudioDev( bool ) ) );
@@ -917,6 +927,8 @@ void setupDialog::accept()
QString::number( m_disableChActInd ) );
configManager::inst()->setValue( "ui", "manualchannelpiano",
QString::number( m_manualChPiano ) );
configManager::inst()->setValue( "ui", "oneinstrumenttrackwindow",
QString::number( m_oneInstrumentTrackWindow ) );
configManager::inst()->setWorkingDir( m_workingDir );
configManager::inst()->setVSTDir( m_vstDir );
@@ -1088,6 +1100,15 @@ void setupDialog::toggleManualChPiano( bool _enabled )
void setupDialog::toggleOneInstrumentTrackWindow( bool _enabled )
{
m_oneInstrumentTrackWindow = _enabled;
}
void setupDialog::openWorkingDir()
{
QString new_dir = QFileDialog::getExistingDirectory( this,

View File

@@ -2,7 +2,7 @@
* InstrumentTrack.cpp - implementation of instrument-track-class
* (window + data-structures)
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -26,6 +26,7 @@
#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QQueue>
#include <QtCore/QStack>
#include <QtGui/QApplication>
#include <QtGui/QCloseEvent>
#include <QtGui/QFileDialog>
@@ -874,7 +875,8 @@ Instrument * InstrumentTrack::loadInstrument( const QString & _plugin_name )
// #### ITV:
QQueue<InstrumentTrackWindow *> InstrumentTrackView::s_windows;
QQueue<InstrumentTrackWindow *> InstrumentTrackView::s_windowCache;
QStack<InstrumentTrackWindow *> InstrumentTrackView::s_windowStack;
@@ -992,16 +994,26 @@ void InstrumentTrackView::freeInstrumentTrackWindow()
{
if( m_window != NULL )
{
if( qFind( s_windowStack.begin(), s_windowStack.end(), m_window ) !=
s_windowStack.end() )
{
s_windowStack.erase(
qFind( s_windowStack.begin(), s_windowStack.end(), m_window ) );
}
m_lastPos = m_window->parentWidget()->pos();
if( s_windows.count() < INSTRUMENT_WINDOW_CACHE_SIZE )
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->setModel(
engine::dummyTrackContainer()->
dummyInstrumentTrack() );
m_window->updateInstrumentView();
s_windows.enqueue( m_window );
s_windowCache << m_window;
}
else
{
@@ -1015,11 +1027,11 @@ void InstrumentTrackView::freeInstrumentTrackWindow()
void InstrumentTrackView::cleanupWindowPool()
void InstrumentTrackView::cleanupWindowCache()
{
while( s_windows.count() )
while( !s_windowCache.isEmpty() )
{
delete s_windows.dequeue();
delete s_windowCache.dequeue();
}
}
@@ -1031,16 +1043,21 @@ InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow()
if( m_window != NULL )
{
}
else if( !s_windows.isEmpty() )
else if( !s_windowCache.isEmpty() )
{
m_window = s_windows.dequeue();
m_window = s_windowCache.dequeue();
m_window->setInstrumentTrackView( this );
m_window->setModel( model() );
m_window->updateInstrumentView();
model()->setHook( m_window );
if( m_lastPos.x() > 0 || m_lastPos.y() > 0 )
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 );
}
@@ -1048,6 +1065,12 @@ InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow()
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;
@@ -1079,12 +1102,23 @@ void InstrumentTrackView::dropEvent( QDropEvent * _de )
void InstrumentTrackView::toggleInstrumentWindow( bool _on )
{
getInstrumentTrackWindow()->toggleVisibility( _on );
InstrumentTrackWindow * w = getInstrumentTrackWindow();
w->toggleVisibility( _on );
if( !_on )
{
freeInstrumentTrackWindow();
}
else
{
if( qFind( s_windowStack.begin(), s_windowStack.end(), w ) !=
s_windowStack.end() )
{
s_windowStack.erase(
qFind( s_windowStack.begin(), s_windowStack.end(), w ) );
}
s_windowStack.push( w );
}
}
@@ -1166,6 +1200,8 @@ protected:
// #### ITW:
InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) :
QWidget(),
@@ -1270,7 +1306,7 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) :
m_tabWidget->addTab( m_midiView, tr( "MIDI" ), 4 );
// setup piano-widget
m_pianoView= new PianoView( this );
m_pianoView = new PianoView( this );
vlayout->addWidget( m_generalSettingsWidget );
vlayout->addWidget( m_tabWidget );
@@ -1300,7 +1336,10 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) :
InstrumentTrackWindow::~InstrumentTrackWindow()
{
InstrumentTrackView::s_windowCache.removeAll( this );
delete m_instrumentView;
if( engine::mainWindow()->workspace() )
{
parentWidget()->hide();
@@ -1311,6 +1350,18 @@ InstrumentTrackWindow::~InstrumentTrackWindow()
void InstrumentTrackWindow::setInstrumentTrackView( InstrumentTrackView * _tv )
{
if( m_itv && _tv )
{
m_itv->m_tlb->setChecked( false );
}
m_itv = _tv;
}
void InstrumentTrackWindow::modelChanged()
{
m_track = castModel<InstrumentTrack>();