From 0aeddf27ff5bf309f8ffff59f394c4c664298db3 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Fri, 6 Jun 2008 06:15:17 +0000 Subject: [PATCH] add model.displayName and add midi-seq support to midiController git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1078 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 29 +++++ include/automatable_button.h | 6 +- include/automatable_model.h | 23 +++- include/automatable_model_view.h | 2 + include/automatable_slider.h | 2 +- include/controller_connection.h | 13 ++- include/controller_connection_dialog.h | 8 +- include/knob.h | 2 +- include/midi_controller.h | 15 ++- include/mv_base.h | 7 +- include/pixmap_button.h | 2 +- include/tempo_sync_knob.h | 5 +- include/volume_knob.h | 2 +- src/core/automatable_model.cpp | 4 +- src/core/controller_connection.cpp | 10 ++ src/core/midi/midi_controller.cpp | 88 ++++++++++++++- src/gui/automatable_model_view.cpp | 14 ++- src/gui/controller_connection_dialog.cpp | 133 ++++++++++++++++++----- src/gui/widgets/automatable_button.cpp | 9 +- src/gui/widgets/automatable_slider.cpp | 4 +- src/gui/widgets/group_box.cpp | 2 +- src/gui/widgets/knob.cpp | 7 +- src/gui/widgets/lcd_spinbox.cpp | 6 +- src/gui/widgets/tempo_sync_knob.cpp | 5 +- 24 files changed, 327 insertions(+), 71 deletions(-) diff --git a/ChangeLog b/ChangeLog index 652e8f514..44095f351 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2008-06-05 Paul Giblock + + * include/knob.h: + * include/automatable_slider.h: + * include/controller_connection.h: + * include/midi_controller.h: + * include/automatable_model.h: + * include/automatable_button.h: + * include/tempo_sync_knob.h: + * include/controller_connection_dialog.h: + * include/pixmap_button.h: + * include/automatable_model_view.h: + * include/mv_base.h: + * include/volume_knob.h: + * src/gui/automatable_model_view.cpp: + * src/gui/controller_connection_dialog.cpp: + * src/gui/widgets/knob.cpp: + * src/gui/widgets/automatable_slider.cpp: + * src/gui/widgets/group_box.cpp: + * src/gui/widgets/lcd_spinbox.cpp: + * src/gui/widgets/tempo_sync_knob.cpp: + * src/gui/widgets/automatable_button.cpp: + * src/core/midi/midi_controller.cpp: + * src/core/automatable_model.cpp: + * src/core/controller_connection.cpp: + - add support for sequenced midi in midi-controllers + - add displayName field to model / autoModel for descriptive model trees + - use displayName for midiController and contextMenus + 2008-06-05 Tobias Doerffel * include/track.h: diff --git a/include/automatable_button.h b/include/automatable_button.h index 23300dce6..33d2bd5e5 100644 --- a/include/automatable_button.h +++ b/include/automatable_button.h @@ -38,7 +38,8 @@ class EXPORT automatableButton : public QPushButton, public boolModelView { Q_OBJECT public: - automatableButton( QWidget * _parent, const QString & _name ); + automatableButton( QWidget * _parent, const QString & _name + = QString::null ); virtual ~automatableButton(); inline void setCheckable( bool _on ) @@ -82,7 +83,8 @@ class EXPORT automatableButtonGroup : public QWidget, public intModelView { Q_OBJECT public: - automatableButtonGroup( QWidget * _parent, const QString & _name ); + automatableButtonGroup( QWidget * _parent, const QString & _name + = QString::null ); virtual ~automatableButtonGroup(); void addButton( automatableButton * _btn ); diff --git a/include/automatable_model.h b/include/automatable_model.h index fbc7a38df..0cbd451ef 100644 --- a/include/automatable_model.h +++ b/include/automatable_model.h @@ -35,6 +35,7 @@ #include #include +#include class track; @@ -84,6 +85,7 @@ public: const float _max = 0, const float _step = 0, ::model * _parent = NULL, + const QString & _display_name = QString::null, bool _default_constructed = FALSE ); virtual ~automatableModel(); @@ -248,6 +250,17 @@ public: return( 0 ); }*/ + virtual QString displayName( void ) const + { + return m_displayName; + } + + virtual void setDisplayName( const QString & _display_name ) + { + m_displayName = _display_name; + } + + public slots: virtual void reset( void ); @@ -275,6 +288,7 @@ private: // most objects will need this temporarily float m_oldValue; bool m_journalEntryReady; + QString m_displayName; typedef QVector autoModelVector; autoModelVector m_linkedModels; @@ -320,9 +334,10 @@ class floatModel : public automatableModel public: floatModel( float _val = 0, float _min = 0, float _max = 0, float _step = 0, ::model * _parent = NULL, + const QString & _display_name = QString::null, bool _default_constructed = FALSE ) : automatableModel( Float, _val, _min, _max, _step, - _parent, _default_constructed ) + _parent, _display_name, _default_constructed ) { } @@ -336,9 +351,10 @@ class intModel : public automatableModel public: intModel( int _val = 0, int _min = 0, int _max = 0, ::model * _parent = NULL, + const QString & _display_name = QString::null, bool _default_constructed = FALSE ) : automatableModel( Integer, _val, _min, _max, 1, - _parent, _default_constructed ) + _parent, _display_name, _default_constructed ) { } @@ -352,9 +368,10 @@ class boolModel : public automatableModel public: boolModel( const bool _val = FALSE, ::model * _parent = NULL, + const QString & _display_name = QString::null, bool _default_constructed = FALSE ) : automatableModel( Bool, _val, FALSE, TRUE, 1, - _parent, _default_constructed ) + _parent, _display_name, _default_constructed ) { } diff --git a/include/automatable_model_view.h b/include/automatable_model_view.h index 5cc7894cb..5c00645b9 100644 --- a/include/automatable_model_view.h +++ b/include/automatable_model_view.h @@ -55,6 +55,8 @@ public: return( castModel() ); } + virtual void setModel( model * _model, bool _old_model_valid = TRUE ); + template inline T value( void ) const { diff --git a/include/automatable_slider.h b/include/automatable_slider.h index ba6a404ff..df73ef483 100644 --- a/include/automatable_slider.h +++ b/include/automatable_slider.h @@ -37,7 +37,7 @@ class automatableSlider : public QSlider, public intModelView { Q_OBJECT public: - automatableSlider( QWidget * _parent, const QString & _name ); + automatableSlider( QWidget * _parent, const QString & _name = QString::null ); virtual ~automatableSlider(); bool showStatus( void ) diff --git a/include/controller_connection.h b/include/controller_connection.h index bb68f7b5c..634a70bc4 100644 --- a/include/controller_connection.h +++ b/include/controller_connection.h @@ -38,6 +38,7 @@ #include "journalling_object.h" class controllerConnection; +class QString; typedef QVector controllerConnectionVector; @@ -65,6 +66,13 @@ public: return m_controller->currentValue( _offset ); } + inline void setTargetName( const QString & _name ); + + inline QString targetName( void ) const + { + return m_targetName; + } + inline bool isFinalized( void ) { return m_controllerId < 0; @@ -78,9 +86,10 @@ public: protected: //virtual controllerDialog * createDialog( QWidget * _parent ); - controller * m_controller; - int m_controllerId; + QString m_targetName; + int m_controllerId; + bool m_ownsController; static controllerConnectionVector s_connections; diff --git a/include/controller_connection_dialog.h b/include/controller_connection_dialog.h index d88d1d2e7..2990f11b0 100644 --- a/include/controller_connection_dialog.h +++ b/include/controller_connection_dialog.h @@ -51,7 +51,7 @@ class controllerConnectionDialog : public QDialog Q_OBJECT public: controllerConnectionDialog( QWidget * _parent, - controllerConnection * _connection = NULL ); + const automatableModel * _target_model ); virtual ~controllerConnectionDialog(); controller * chosenController( void ) @@ -66,8 +66,12 @@ public slots: void userToggled( void ); void autoDetectToggled( void ); +protected slots: void midiValueChanged( void ); + void activatedReadablePort( QAction * _item ); + void updateReadablePortsMenu( void ); + private: groupBox * m_midiGroupBox; @@ -75,6 +79,7 @@ private: lcdSpinBox * m_midiControllerSpinBox; ledCheckBox * m_midiAutoDetectCheckBox; boolModel m_midiAutoDetect; + QMenu * m_readablePorts; groupBox * m_userGroupBox; comboBox * m_userController; @@ -82,6 +87,7 @@ private: QLineEdit * m_mappingFunction; controller * m_controller; + const automatableModel * m_targetModel; // Temporary midiController autoDetectMidiController * m_midiController; diff --git a/include/knob.h b/include/knob.h index efaeaec8a..e6d11ce1c 100644 --- a/include/knob.h +++ b/include/knob.h @@ -63,7 +63,7 @@ class EXPORT knob : public QWidget, public floatModelView Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) public: - knob( int _knob_num, QWidget * _parent, const QString & _name ); + knob( int _knob_num, QWidget * _parent, const QString & _name = QString::null ); virtual ~knob(); // TODO: remove diff --git a/include/midi_controller.h b/include/midi_controller.h index 34785afde..855077dc2 100644 --- a/include/midi_controller.h +++ b/include/midi_controller.h @@ -26,6 +26,7 @@ #define _MIDI_CONTROLLER_H #include +#include #include "mv_base.h" #include "automatable_model.h" @@ -41,6 +42,8 @@ class midiController : public controller, public midiEventProcessor { Q_OBJECT public: + typedef QMap midiPortMap; + midiController( model * _parent ); virtual ~midiController(); @@ -76,10 +79,18 @@ public: return &m_midiController; } + virtual midiPort * getMidiPort( void ) + { + return m_midiPort; + } + + // Used by controllerConnectionDialog to copy + virtual void setReadablePorts( const midiPortMap & _map ); public slots: virtual controllerDialog * createDialog( QWidget * _parent ); - void updateMidiPort(); + void updateMidiPort( void ); + void updateReadablePorts( void ); protected: @@ -90,9 +101,11 @@ protected: intModel m_midiController; midiPort * m_midiPort; + midiPortMap m_readablePorts; float m_lastValue; + friend class controllerConnectionDialog; }; diff --git a/include/mv_base.h b/include/mv_base.h index c73289eac..774830c85 100644 --- a/include/mv_base.h +++ b/include/mv_base.h @@ -55,21 +55,16 @@ public: virtual QString displayName( void ) const { - printf("displayName() Returned: %s\n", qPrintable(m_displayName) ); - return m_displayName; + return QString(); } void setDisplayName( const QString & _displayName ) { - printf("setDisplayName() 1: %s ", qPrintable(_displayName)); - m_displayName = _displayName; - printf("setDisplayName() 2: %s\n", qPrintable(m_displayName)); } private: bool m_defaultConstructed; - QString m_displayName; signals: // emitted if actual data of the model (e.g. values) have changed diff --git a/include/pixmap_button.h b/include/pixmap_button.h index 2ff44212a..a93e8ced4 100644 --- a/include/pixmap_button.h +++ b/include/pixmap_button.h @@ -35,7 +35,7 @@ class EXPORT pixmapButton : public automatableButton { Q_OBJECT public: - pixmapButton( QWidget * _parent, const QString & _name ); + pixmapButton( QWidget * _parent, const QString & _name = QString::null ); virtual ~pixmapButton(); void setActiveGraphic( const QPixmap & _pm ); diff --git a/include/tempo_sync_knob.h b/include/tempo_sync_knob.h index 4196d57c2..4e2a38f48 100644 --- a/include/tempo_sync_knob.h +++ b/include/tempo_sync_knob.h @@ -57,7 +57,8 @@ public: tempoSyncKnobModel( const float _val, const float _min, const float _max, const float _step, - const float _scale, ::model * _parent ); + const float _scale, ::model * _parent, + const QString & _display_name = QString::null ); virtual ~tempoSyncKnobModel(); virtual void saveSettings( QDomDocument & _doc, @@ -106,7 +107,7 @@ class tempoSyncKnob : public knob Q_OBJECT public: tempoSyncKnob( int _knob_num, QWidget * _parent, - const QString & _name ); + const QString & _name = QString::null ); virtual ~tempoSyncKnob(); const QString & getSyncDescription( void ); diff --git a/include/volume_knob.h b/include/volume_knob.h index 94941865a..7302339c2 100644 --- a/include/volume_knob.h +++ b/include/volume_knob.h @@ -34,7 +34,7 @@ class EXPORT volumeKnob : public knob { Q_OBJECT public: - volumeKnob( int _knob_num, QWidget * _parent, const QString & _name ); + volumeKnob( int _knob_num, QWidget * _parent, const QString & _name = QString::null ); virtual ~volumeKnob(); diff --git a/src/core/automatable_model.cpp b/src/core/automatable_model.cpp index 3f4cef66b..922477d56 100644 --- a/src/core/automatable_model.cpp +++ b/src/core/automatable_model.cpp @@ -50,6 +50,7 @@ automatableModel::automatableModel( DataType _type, const float _max, const float _step, ::model * _parent, + const QString & _display_name, bool _default_constructed ) : model( _parent, _default_constructed ), m_dataType( _type ), @@ -59,6 +60,7 @@ automatableModel::automatableModel( DataType _type, m_maxValue( _max ), m_step( _step ), m_range( _max - _min ), + m_displayName( _display_name ), m_journalEntryReady( FALSE ), m_controllerConnection( NULL ), m_automationPattern( NULL ), @@ -157,9 +159,9 @@ void automatableModel::loadSettings( const QDomElement & _this, node = node.namedItem( _name ); if( node.isElement() ) { - //m_controllerConnection = new controllerConnection( (controller*)NULL ); setControllerConnection( new controllerConnection( (controller*)NULL ) ); m_controllerConnection->loadSettings( node.toElement() ); + //m_controllerConnection->setTargetName( displayName() ); } } diff --git a/src/core/controller_connection.cpp b/src/core/controller_connection.cpp index cafca5da5..f8bac3bb7 100644 --- a/src/core/controller_connection.cpp +++ b/src/core/controller_connection.cpp @@ -117,6 +117,16 @@ void controllerConnection::setController( controller * _controller ) +inline void controllerConnection::setTargetName( const QString & _name ) +{ + m_targetName = _name; + if( m_controller ) + { + // m_controller->getMidiPort()->setName( _name ); + } +} + + /* * A connection may not be finalized. This means, the connection should exist, diff --git a/src/core/midi/midi_controller.cpp b/src/core/midi/midi_controller.cpp index cca192a61..06a600633 100644 --- a/src/core/midi/midi_controller.cpp +++ b/src/core/midi/midi_controller.cpp @@ -45,10 +45,17 @@ midiController::midiController( model * _parent ) : m_midiChannel( 0, 0, MIDI_CHANNEL_COUNT, this ), m_midiController( 0, 0, MIDI_CONTROLLER_COUNT, this ), m_midiPort( engine::getMixer()->getMIDIClient()->addPort( - this, tr( "unnamed_channel" ) ) ), + this, tr( "unnamed_midi_controller" ) ) ), m_lastValue( 0.0f ) { m_midiPort->setMode( midiPort::Input ); + + midiClient * mc = engine::getMixer()->getMIDIClient(); + if( mc->isRaw() == FALSE ) + { + updateReadablePorts(); + } + connect( &m_midiChannel, SIGNAL( dataChanged() ), this, SLOT( updateMidiPort() ) ); connect( &m_midiController, SIGNAL( dataChanged() ), @@ -117,12 +124,73 @@ void midiController::processInEvent( const midiEvent & _me, +void midiController::setReadablePorts( const midiPortMap & _map ) +{ + m_readablePorts.clear(); + + for( midiPortMap::const_iterator it = _map.constBegin(); + it != _map.constEnd(); ++it ) + { + engine::getMixer()->getMIDIClient()->subscribeReadablePort( + m_midiPort, it.key(), !( *it ) ); + } + + m_readablePorts = _map; +} + + +void midiController::updateReadablePorts( void ) +{ + // first save all selected ports + QStringList selected_ports; + + for( midiPortMap::const_iterator i = m_readablePorts.constBegin(); + i != m_readablePorts.constEnd(); ++i ) + { + selected_ports.push_back( i.key() ); + ++i; + } + + m_readablePorts.clear(); + const QStringList & wp = engine::getMixer()->getMIDIClient()-> + readablePorts(); + + // now insert new ports and restore selections + for( QStringList::const_iterator it = wp.begin(); it != wp.end(); ++it ) + { + m_readablePorts[ *it ] = ( selected_ports.indexOf( *it ) != -1 ); + } + //emit readablePortsChanged(); +} + + + + void midiController::saveSettings( QDomDocument & _doc, QDomElement & _this ) { controller::saveSettings( _doc, _this ); m_midiChannel.saveSettings( _doc, _this, "channel" ); m_midiController.saveSettings( _doc, _this, "controller" ); + + if( m_readablePorts.size() ) + { + QString rp; + for( midiPortMap::const_iterator it = m_readablePorts.constBegin(); + it != m_readablePorts.constEnd(); ++it ) + { + if( *it ) + { + rp += it.key() + ","; + } + } + // cut off comma + if( rp.length() > 0 ) + { + rp.truncate( rp.length() - 1 ); + } + _this.setAttribute( "inports", rp ); + } } @@ -135,6 +203,24 @@ void midiController::loadSettings( const QDomElement & _this ) m_midiChannel.loadSettings( _this, "channel" ); m_midiController.loadSettings( _this, "controller" ); + midiClient * mc = engine::getMixer()->getMIDIClient(); + if( mc->isRaw() == FALSE ) + { + //updateReadablePorts(); + + QStringList rp = _this.attribute( "inports" ).split( ',' ); + for( midiPortMap::iterator it = m_readablePorts.begin(); + it != m_readablePorts.end(); ++it ) + { + if( rp.indexOf( it.key() ) != -1 ) + { + *it = TRUE; + + engine::getMixer()->getMIDIClient()->subscribeReadablePort( + m_midiPort, it.key(), !( *it ) ); + } + } + } updateMidiPort(); } diff --git a/src/gui/automatable_model_view.cpp b/src/gui/automatable_model_view.cpp index 9a706ac96..58a282b79 100644 --- a/src/gui/automatable_model_view.cpp +++ b/src/gui/automatable_model_view.cpp @@ -38,7 +38,6 @@ void automatableModelView::addDefaultActions( QMenu * _menu ) { automatableModel * _model = modelUntyped(); - printf( "addDefaultActions for %s\n", qPrintable(_model->displayName()) ); automatableModelViewSlots * amvSlots = new automatableModelViewSlots( this, _menu ); @@ -112,6 +111,15 @@ void automatableModelView::addDefaultActions( QMenu * _menu ) +void automatableModelView::setModel( model * _model, bool _old_model_valid ) +{ + modelView::setModel( _model, _old_model_valid ); + //setAccessibleName( _model->displayName(); +} + + + + automatableModelViewSlots::automatableModelViewSlots( automatableModelView * _amv, QObject * _parent ) : @@ -134,9 +142,7 @@ void automatableModelViewSlots::execConnectionDialog( void ) m->displayName(); controllerConnectionDialog * d = new controllerConnectionDialog( - (QWidget*)engine::getMainWindow(), - /* m->displayName(), */ - m->getControllerConnection() ); + (QWidget*)engine::getMainWindow(), m ); d->exec(); diff --git a/src/gui/controller_connection_dialog.cpp b/src/gui/controller_connection_dialog.cpp index d0ed828f4..01410a177 100644 --- a/src/gui/controller_connection_dialog.cpp +++ b/src/gui/controller_connection_dialog.cpp @@ -38,8 +38,11 @@ #include "combobox.h" #include "group_box.h" #include "midi_controller.h" +#include "midi_client.h" +#include "midi_port.h" #include "midi.h" #include "song.h" +#include "tool_button.h" #include "gui_templates.h" #include "embed.h" @@ -86,6 +89,7 @@ public: midiController * c = new midiController( _parent ); c->midiChannelModel()->setValue( m_midiChannel.value() ); c->midiControllerModel()->setValue( m_midiController.value() ); + c->setReadablePorts( m_readablePorts ); return c; } @@ -111,12 +115,14 @@ public slots: controllerConnectionDialog::controllerConnectionDialog( QWidget * _parent, - controllerConnection * _connection + const automatableModel * _target_model ) : QDialog( _parent ), m_controller( NULL ), m_midiController( NULL ), - m_midiAutoDetect( FALSE ) + m_readablePorts( NULL ), + m_midiAutoDetect( FALSE ), + m_targetModel( _target_model ) { setWindowIcon( embed::getIconPixmap( "setup_audio" ) ); setWindowTitle( tr( "Connection Settings" ) ); @@ -154,6 +160,26 @@ controllerConnectionDialog::controllerConnectionDialog( QWidget * _parent, connect( &m_midiAutoDetect, SIGNAL( dataChanged() ), this, SLOT( autoDetectToggled() ) ); + // when using with non-raw-clients we can provide buttons showing + // our port-menus when being clicked + midiClient * mc = engine::getMixer()->getMIDIClient(); + if( mc->isRaw() == FALSE ) + { + m_readablePorts = new QMenu( this ); + m_readablePorts->setFont( pointSize<9>( + m_readablePorts->font() ) ); + connect( m_readablePorts, SIGNAL( triggered( QAction * ) ), + this, SLOT( activatedReadablePort( QAction * ) ) ); + + toolButton * rp_btn = new toolButton( m_midiGroupBox ); + rp_btn->setText( tr( "MIDI-devices to receive " + "MIDI-events from" ) ); + rp_btn->setIcon( embed::getIconPixmap( "midi_in" ) ); + rp_btn->setGeometry( 200, 24, 40, 40 ); + rp_btn->setMenu( m_readablePorts ); + rp_btn->setPopupMode( QToolButton::InstantPopup ); + } + // User stuff m_userGroupBox = new groupBox( tr( "USER CONTROLLER" ), this ); @@ -207,40 +233,51 @@ controllerConnectionDialog::controllerConnectionDialog( QWidget * _parent, // TODO, handle by making this a model for the Dialog "view" - if( _connection && _connection->getController()->type() != - controller::DummyController && engine::getSong() ) + controllerConnection * cc = NULL; + if( m_targetModel ) { - if ( _connection->getController()->type() == - controller::MidiController ) - { - m_midiGroupBox->model()->setValue( TRUE ); - // ensure controller is created - midiToggled(); - - midiController * cont = - (midiController*)( _connection->getController() ); - m_midiChannelSpinBox->model()->setValue( - cont->midiChannelModel()->value() ); - m_midiControllerSpinBox->model()->setValue( - cont->midiControllerModel()->value() ); - } - else - { - int idx = engine::getSong()->controllers().indexOf( - _connection->getController() ); + cc = m_targetModel->getControllerConnection(); - if( idx >= 0 ) + if( cc && cc->getController()->type() != + controller::DummyController && engine::getSong() ) + { + if ( cc->getController()->type() == + controller::MidiController ) { - m_userGroupBox->model()->setValue( TRUE ); - m_userController->model()->setValue( idx ); + m_midiGroupBox->model()->setValue( TRUE ); + // ensure controller is created + midiToggled(); + + midiController * cont = + (midiController*)( cc->getController() ); + m_midiChannelSpinBox->model()->setValue( + cont->midiChannelModel()->value() ); + m_midiControllerSpinBox->model()->setValue( + cont->midiControllerModel()->value() ); + + // update menuupdateReadablePortsMenu + m_midiController->setReadablePorts( static_cast( cc->getController() )->m_readablePorts ); + updateReadablePortsMenu(); + } + else + { + int idx = engine::getSong()->controllers().indexOf( + cc->getController() ); + + if( idx >= 0 ) + { + m_userGroupBox->model()->setValue( TRUE ); + m_userController->model()->setValue( idx ); + } } } } - else { + + if( !cc ) + { m_midiGroupBox->model()->setValue( TRUE ); } - show(); } @@ -262,8 +299,11 @@ void controllerConnectionDialog::selectController( void ) { if( m_midiControllerSpinBox->model()->value() > 0 ) { - m_controller = m_midiController->copyToMidiController( + midiController * mc; + mc = m_midiController->copyToMidiController( engine::getSong() ); + mc->getMidiPort()->setName( m_targetModel->displayName() ); + m_controller = mc; } } else @@ -299,8 +339,11 @@ void controllerConnectionDialog::midiToggled( void ) m_midiControllerSpinBox->setModel( m_midiController->midiControllerModel() ); + connect( m_midiController, SIGNAL( valueChanged() ), this, SLOT( midiValueChanged() ) ); + + updateReadablePortsMenu(); } } else @@ -353,6 +396,40 @@ void controllerConnectionDialog::midiValueChanged( void ) + +void controllerConnectionDialog::activatedReadablePort( QAction * _item ) +{ + // make sure, MIDI-port is configured for input + if( _item->isChecked() == TRUE && + m_midiController->m_midiPort->mode() != midiPort::Input && + m_midiController->m_midiPort->mode() != midiPort::Duplex ) + { + //mio->m_receiveEnabledModel.setValue( TRUE ); + } + engine::getMixer()->getMIDIClient()->subscribeReadablePort( + m_midiController->m_midiPort, _item->text(), !_item->isChecked() ); + m_midiController->m_readablePorts[_item->text()] = _item->isChecked(); +} + + + + +void controllerConnectionDialog::updateReadablePortsMenu( void ) +{ + if( m_readablePorts ) + { + m_readablePorts->clear(); + for( midiController::midiPortMap::const_iterator it = + m_midiController->m_readablePorts.begin(); + it != m_midiController->m_readablePorts.end(); ++it ) + { + QAction * a = m_readablePorts->addAction( it.key() ); + a->setCheckable( TRUE ); + a->setChecked( *it ); + } + } +} + #include "controller_connection_dialog.moc" #endif diff --git a/src/gui/widgets/automatable_button.cpp b/src/gui/widgets/automatable_button.cpp index 770cae271..5be63f75f 100644 --- a/src/gui/widgets/automatable_button.cpp +++ b/src/gui/widgets/automatable_button.cpp @@ -40,7 +40,7 @@ automatableButton::automatableButton( QWidget * _parent, const QString & _name ) : QPushButton( _parent ), - boolModelView( new boolModel( FALSE, NULL, TRUE ) ), + boolModelView( new boolModel( FALSE, NULL, _name, TRUE ) ), m_group( NULL ) { setAccessibleName( _name ); @@ -100,19 +100,22 @@ void automatableButton::contextMenuEvent( QContextMenuEvent * _me ) mouseReleaseEvent( NULL ); QWidget * target; + QString targetName; automationPattern * pattern; if ( m_group != NULL ) { target = m_group; + targetName = target->accessibleName(); pattern = m_group->model()->getAutomationPattern(); } else { target = this; + targetName = model()->displayName(); pattern = model()->getAutomationPattern(); } - captionMenu contextMenu( target->accessibleName() ); + captionMenu contextMenu( targetName ); addDefaultActions( &contextMenu ); contextMenu.exec( QCursor::pos() ); } @@ -174,7 +177,7 @@ void automatableButton::toggle( void ) automatableButtonGroup::automatableButtonGroup( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - intModelView( new intModel( 0, 0, 0, NULL, TRUE ) ) + intModelView( new intModel( 0, 0, 0, NULL, _name, TRUE ) ) { hide(); setAccessibleName( _name ); diff --git a/src/gui/widgets/automatable_slider.cpp b/src/gui/widgets/automatable_slider.cpp index 12e13c7b6..54da9e28f 100644 --- a/src/gui/widgets/automatable_slider.cpp +++ b/src/gui/widgets/automatable_slider.cpp @@ -40,7 +40,7 @@ automatableSlider::automatableSlider( QWidget * _parent, const QString & _name ) : QSlider( _parent ), - intModelView( new intModel( 0, 0, 0, NULL, TRUE ) ), + intModelView( new intModel( 0, 0, 0, NULL, _name, TRUE ) ), m_showStatus( FALSE ) { setAccessibleName( _name ); @@ -63,7 +63,7 @@ automatableSlider::~automatableSlider() void automatableSlider::contextMenuEvent( QContextMenuEvent * _me ) { - captionMenu contextMenu( accessibleName() ); + captionMenu contextMenu( model()->displayName() ); addDefaultActions( &contextMenu ); contextMenu.exec( QCursor::pos() ); } diff --git a/src/gui/widgets/group_box.cpp b/src/gui/widgets/group_box.cpp index 357706ec4..0ef40903b 100644 --- a/src/gui/widgets/group_box.cpp +++ b/src/gui/widgets/group_box.cpp @@ -63,7 +63,7 @@ groupBox::groupBox( const QString & _caption, QWidget * _parent ) : m_led->setActiveGraphic( embed::getIconPixmap( "led_green" ) ); m_led->setInactiveGraphic( embed::getIconPixmap( "led_off" ) ); - setModel( new boolModel( FALSE, NULL, FALSE ) ); + setModel( new boolModel( FALSE, NULL, _caption, FALSE ) ); setAutoFillBackground( TRUE ); } diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index c9562d39c..76fdb4f70 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -62,7 +62,7 @@ textFloat * knob::s_textFloat = NULL; knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - floatModelView( new knobModel( 0, 0, 0, 1, NULL, TRUE ) ), + floatModelView( new knobModel( 0, 0, 0, 1, NULL, _name, TRUE ) ), m_mouseOffset( 0.0f ), m_buttonPressed( FALSE ), m_knobPixmap( NULL ), @@ -78,9 +78,6 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : setAcceptDrops( TRUE ); setAccessibleName( _name ); - printf("knob's Display name: %s\n", qPrintable(_name)); - model()->setDisplayName( _name ); - printf("knob-model's Display name: %s\n", qPrintable( model()->displayName() )); if( m_knobNum != knobStyled ) { m_knobPixmap = new QPixmap( embed::getIconPixmap( QString( "knob0" + @@ -400,7 +397,7 @@ void knob::contextMenuEvent( QContextMenuEvent * ) // an QApplication::restoreOverrideCursor()-call... mouseReleaseEvent( NULL ); - captionMenu contextMenu( accessibleName() ); + captionMenu contextMenu( model()->displayName() ); addDefaultActions( &contextMenu ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "help" ), tr( "&Help" ), diff --git a/src/gui/widgets/lcd_spinbox.cpp b/src/gui/widgets/lcd_spinbox.cpp index 10b92c9b6..a7e9137d2 100644 --- a/src/gui/widgets/lcd_spinbox.cpp +++ b/src/gui/widgets/lcd_spinbox.cpp @@ -44,7 +44,7 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - intModelView( new intModel( 0, 0, 0, NULL, TRUE ) ), + intModelView( new intModel( 0, 0, 0, NULL, _name, TRUE ) ), m_label(), m_numDigits( _num_digits ), m_origMousePos() @@ -69,7 +69,7 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, lcdSpinBox::lcdSpinBox( int _num_digits, const QString & _lcd_style, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - intModelView( new intModel( 0, 0, 0, NULL, TRUE ) ), + intModelView( new intModel( 0, 0, 0, NULL, _name, TRUE ) ), m_label(), m_numDigits( _num_digits ), m_origMousePos() @@ -276,7 +276,7 @@ void lcdSpinBox::contextMenuEvent( QContextMenuEvent * _me ) // an QApplication::restoreOverrideCursor()-call... mouseReleaseEvent( NULL ); - captionMenu contextMenu( accessibleName() ); + captionMenu contextMenu( model()->displayName() ); addDefaultActions( &contextMenu ); contextMenu.exec( QCursor::pos() ); } diff --git a/src/gui/widgets/tempo_sync_knob.cpp b/src/gui/widgets/tempo_sync_knob.cpp index 9badfa218..492797875 100644 --- a/src/gui/widgets/tempo_sync_knob.cpp +++ b/src/gui/widgets/tempo_sync_knob.cpp @@ -41,8 +41,9 @@ tempoSyncKnobModel::tempoSyncKnobModel( const float _val, const float _min, const float _max, const float _step, - const float _scale, ::model * _parent ) : - knobModel( _val, _min, _max, _step, _parent ), + const float _scale, ::model * _parent, + const QString & _display_name = QString::null ) : + knobModel( _val, _min, _max, _step, _parent, _display_name ), m_tempoSyncMode( SyncNone ), m_tempoLastSyncMode( SyncNone ), m_scale( _scale ),