void FxMixerView::keyPressEvent(QKeyEvent * e) { switch(e->key()) { case Qt::Key_Delete: deleteChannel(m_currentFxLine->channelIndex()); break; case Qt::Key_Left: if( e->modifiers() & Qt::AltModifier ) { moveChannelLeft( m_currentFxLine->channelIndex() ); } else { // select channel to the left setCurrentFxLine( m_currentFxLine->channelIndex()-1 ); } break; case Qt::Key_Right: if( e->modifiers() & Qt::AltModifier ) { moveChannelRight( m_currentFxLine->channelIndex() ); } else { // select channel to the right setCurrentFxLine( m_currentFxLine->channelIndex()+1 ); } break; } }
void FxMixerView::setCurrentFxLine( int _line ) { if( _line >= 0 && _line < m_fxChannelViews.size() ) { setCurrentFxLine( m_fxChannelViews[_line]->m_fxLine ); } }
void FxMixerView::refreshDisplay() { // delete all views and re-add them for( int i = 1; i<m_fxChannelViews.size(); ++i ) { chLayout->removeWidget(m_fxChannelViews[i]->m_fxLine); delete m_fxChannelViews[i]->m_fader; delete m_fxChannelViews[i]->m_muteBtn; delete m_fxChannelViews[i]->m_soloBtn; delete m_fxChannelViews[i]->m_fxLine; delete m_fxChannelViews[i]; m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView ); } m_channelAreaWidget->adjustSize(); // re-add the views m_fxChannelViews.resize(engine::fxMixer()->numChannels()); for( int i = 1; i < m_fxChannelViews.size(); ++i ) { m_fxChannelViews[i] = new FxChannelView(m_channelAreaWidget, this, i); chLayout->addWidget(m_fxChannelViews[i]->m_fxLine); m_racksLayout->addWidget( m_fxChannelViews[i]->m_rackView ); } // set selected fx line to 0 setCurrentFxLine( 0 ); // update all fx lines for( int i = 0; i < m_fxChannelViews.size(); ++i ) { updateFxLine( i ); } updateMaxChannelSelector(); }
void FxMixerView::deleteChannel(int index) { // can't delete master if( index == 0 ) return; // remember selected line int selLine = m_currentFxLine->channelIndex(); // in case the deleted channel is soloed or the remaining // channels will be left in a muted state Engine::fxMixer()->clearChannel(index); // delete the real channel Engine::fxMixer()->deleteChannel(index); // delete the view chLayout->removeWidget(m_fxChannelViews[index]->m_fxLine); m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView ); delete m_fxChannelViews[index]->m_fader; delete m_fxChannelViews[index]->m_muteBtn; delete m_fxChannelViews[index]->m_soloBtn; // delete fxLine later to prevent a crash when deleting from context menu m_fxChannelViews[index]->m_fxLine->hide(); m_fxChannelViews[index]->m_fxLine->deleteLater(); delete m_fxChannelViews[index]->m_rackView; delete m_fxChannelViews[index]; m_channelAreaWidget->adjustSize(); // make sure every channel knows what index it is for(int i=0; i<m_fxChannelViews.size(); ++i) { if( i > index ) { m_fxChannelViews[i]->m_fxLine->setChannelIndex(i-1); } } m_fxChannelViews.remove(index); // select the next channel if( selLine >= m_fxChannelViews.size() ) { selLine = m_fxChannelViews.size()-1; } setCurrentFxLine(selLine); updateMaxChannelSelector(); }
void FxMixerView::moveChannelLeft(int index, int focusIndex) { // can't move master or first channel left or last channel right if( index <= 1 || index >= m_fxChannelViews.size() ) return; FxMixer *m = Engine::fxMixer(); // Move instruments channels m->moveChannelLeft( index ); // Update widgets models m_fxChannelViews[index]->setChannelIndex( index ); m_fxChannelViews[index - 1]->setChannelIndex( index - 1 ); // Focus on new position setCurrentFxLine( focusIndex ); }
void FxMixerView::deleteChannel(int index) { // can't delete master if( index == 0 ) return; // remember selected line int selLine = m_currentFxLine->channelIndex(); // delete the real channel engine::fxMixer()->deleteChannel(index); // delete the view chLayout->removeWidget(m_fxChannelViews[index]->m_fxLine); delete m_fxChannelViews[index]->m_fader; delete m_fxChannelViews[index]->m_muteBtn; delete m_fxChannelViews[index]->m_soloBtn; delete m_fxChannelViews[index]->m_fxLine; delete m_fxChannelViews[index]; m_channelAreaWidget->adjustSize(); // delete the fx rack m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView ); // make sure every channel knows what index it is for(int i=0; i<m_fxChannelViews.size(); ++i) { if( i > index ) { m_fxChannelViews[i]->m_fxLine->setChannelIndex(i-1); } } m_fxChannelViews.remove(index); // select the next channel if( selLine >= m_fxChannelViews.size() ) { selLine = m_fxChannelViews.size()-1; } setCurrentFxLine(selLine); updateMaxChannelSelector(); }
void FxMixerView::moveChannelLeft(int index) { // can't move master or first channel left or last channel right if( index <= 1 || index >= m_fxChannelViews.size() ) return; int selIndex = m_currentFxLine->channelIndex(); FxMixer * mix = engine::fxMixer(); mix->moveChannelLeft(index); // refresh the two mixer views for( int i = index-1; i <= index; ++i ) { // delete the mixer view int replaceIndex = chLayout->indexOf(m_fxChannelViews[i]->m_fxLine); chLayout->removeWidget(m_fxChannelViews[i]->m_fxLine); m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView ); delete m_fxChannelViews[i]->m_fader; delete m_fxChannelViews[i]->m_muteBtn; delete m_fxChannelViews[i]->m_soloBtn; delete m_fxChannelViews[i]->m_fxLine; delete m_fxChannelViews[i]; // add it again m_fxChannelViews[i] = new FxChannelView( m_channelAreaWidget, this, i ); chLayout->insertWidget( replaceIndex, m_fxChannelViews[i]->m_fxLine ); m_racksLayout->insertWidget( replaceIndex, m_fxChannelViews[i]->m_rackView ); } // keep selected channel if( selIndex == index ) { selIndex = index-1; } else if( selIndex == index - 1 ) { selIndex = index; } setCurrentFxLine(selIndex); }
FxMixerView::FxMixerView() : QWidget(), ModelView( NULL, this ), SerializingObjectHook() { FxMixer * m = Engine::fxMixer(); m->setHook( this ); //QPalette pal = palette(); //pal.setColor( QPalette::Background, QColor( 72, 76, 88 ) ); //setPalette( pal ); setAutoFillBackground( true ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ); setWindowTitle( tr( "FX-Mixer" ) ); setWindowIcon( embed::getIconPixmap( "fx_mixer" ) ); // main-layout QHBoxLayout * ml = new QHBoxLayout; // Set margins ml->setContentsMargins( 0, 4, 0, 0 ); // Channel area m_channelAreaWidget = new QWidget; chLayout = new QHBoxLayout( m_channelAreaWidget ); chLayout->setSizeConstraint( QLayout::SetMinimumSize ); chLayout->setSpacing( 0 ); chLayout->setMargin( 0 ); m_channelAreaWidget->setLayout(chLayout); // create rack layout before creating the first channel m_racksWidget = new QWidget; m_racksLayout = new QStackedLayout( m_racksWidget ); m_racksLayout->setContentsMargins( 0, 0, 0, 0 ); m_racksWidget->setLayout( m_racksLayout ); // add master channel m_fxChannelViews.resize( m->numChannels() ); m_fxChannelViews[0] = new FxChannelView( this, this, 0 ); m_racksLayout->addWidget( m_fxChannelViews[0]->m_rackView ); FxChannelView * masterView = m_fxChannelViews[0]; ml->addWidget( masterView->m_fxLine, 0, Qt::AlignTop ); QSize fxLineSize = masterView->m_fxLine->size(); // add mixer channels for( int i = 1; i < m_fxChannelViews.size(); ++i ) { m_fxChannelViews[i] = new FxChannelView(m_channelAreaWidget, this, i); chLayout->addWidget( m_fxChannelViews[i]->m_fxLine ); } // add the scrolling section to the main layout // class solely for scroll area to pass key presses down class ChannelArea : public QScrollArea { public: ChannelArea( QWidget * parent, FxMixerView * mv ) : QScrollArea( parent ), m_mv( mv ) {} ~ChannelArea() {} virtual void keyPressEvent( QKeyEvent * e ) { m_mv->keyPressEvent( e ); } private: FxMixerView * m_mv; }; channelArea = new ChannelArea( this, this ); channelArea->setWidget( m_channelAreaWidget ); channelArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); channelArea->setFrameStyle( QFrame::NoFrame ); channelArea->setMinimumWidth( fxLineSize.width() * 6 ); channelArea->setFixedHeight( fxLineSize.height() + style()->pixelMetric( QStyle::PM_ScrollBarExtent ) ); ml->addWidget( channelArea, 1, Qt::AlignTop ); // show the add new effect channel button QPushButton * newChannelBtn = new QPushButton( embed::getIconPixmap( "new_channel" ), QString::null, this ); newChannelBtn->setObjectName( "newChannelBtn" ); newChannelBtn->setFixedSize( fxLineSize ); connect( newChannelBtn, SIGNAL( clicked() ), this, SLOT( addNewChannel() ) ); ml->addWidget( newChannelBtn, 0, Qt::AlignTop ); // add the stacked layout for the effect racks of fx channels ml->addWidget( m_racksWidget, 0, Qt::AlignTop | Qt::AlignRight ); setCurrentFxLine( m_fxChannelViews[0]->m_fxLine ); setLayout( ml ); updateGeometry(); // timer for updating faders connect( gui->mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( updateFaders() ) ); // add ourself to workspace QMdiSubWindow * subWin = gui->mainWindow()->addWindowedWidget( this ); Qt::WindowFlags flags = subWin->windowFlags(); flags &= ~Qt::WindowMaximizeButtonHint; subWin->setWindowFlags( flags ); layout()->setSizeConstraint( QLayout::SetMinimumSize ); subWin->layout()->setSizeConstraint( QLayout::SetMinAndMaxSize ); parentWidget()->setAttribute( Qt::WA_DeleteOnClose, false ); parentWidget()->move( 5, 310 ); // we want to receive dataChanged-signals in order to update setModel( m ); }