Skip to content

Commit

Permalink
Make "assign to" in fx menu work in sample track.
Browse files Browse the repository at this point in the history
  • Loading branch information
PhysSong committed Oct 10, 2017
1 parent 58d13f7 commit 3aebfc9
Show file tree
Hide file tree
Showing 7 changed files with 104 additions and 19 deletions.
10 changes: 7 additions & 3 deletions include/FxLineLcdSpinBox.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,26 @@

#include "LcdSpinBox.h"

class InstrumentTrackWindow;
class TrackView;


class FxLineLcdSpinBox : public LcdSpinBox
{
Q_OBJECT
public:
FxLineLcdSpinBox(int numDigits, QWidget * parent, const QString& name) :
LcdSpinBox(numDigits, parent, name)
FxLineLcdSpinBox(int numDigits, QWidget * parent, const QString& name, TrackView * tv = NULL) :
LcdSpinBox(numDigits, parent, name), m_tv( tv )
{}
virtual ~FxLineLcdSpinBox() {}


protected:
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void contextMenuEvent(QContextMenuEvent* event);

private:
TrackView * m_tv;

};

#endif
11 changes: 8 additions & 3 deletions include/SampleTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ class SampleTrackView : public TrackView
}


virtual QMenu * createFxMenu( QString title, QString newFxLabel );


public slots:
void showEffects();

Expand All @@ -217,13 +220,15 @@ public slots:
}


private slots:
void assignFxLine( int channelIndex );
void createFxLine();


private:
EffectRackView * m_effectRack;
QWidget * m_effWindow;
SampleTrackWindow * m_window;
Knob * m_volumeKnob;
Knob * m_panningKnob;
LcdSpinBox * m_effectChannelNumber;

TrackLabelButton * m_tlb;

Expand Down
4 changes: 4 additions & 0 deletions include/Track.h
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,10 @@ class TrackView : public QWidget, public ModelView, public JournallingObject

virtual void update();

// Create a menu for assigning/creating channels for this track
// Currently instrument track and sample track supports it
virtual QMenu * createFxMenu( QString title, QString newFxLabel );


public slots:
virtual bool close();
Expand Down
21 changes: 18 additions & 3 deletions src/core/Track.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1874,13 +1874,15 @@ void TrackOperationsWidget::updateMenu()
{
toMenu->addAction( tr( "Clear this track" ), this, SLOT( clearTrack() ) );
}
if( InstrumentTrackView * trackView = dynamic_cast<InstrumentTrackView *>( m_trackView ) )
if(QMenu *fxMenu = m_trackView->createFxMenu(tr("FX %1: %2"), tr("Assign to new FX Channel")))
{
QMenu *fxMenu = trackView->createFxMenu( tr( "FX %1: %2" ), tr( "Assign to new FX Channel" ));
toMenu->addMenu(fxMenu);
}

if(InstrumentTrackView * trackView = dynamic_cast<InstrumentTrackView *>(m_trackView))
{
toMenu->addSeparator();
toMenu->addMenu( trackView->midiMenu() );
toMenu->addMenu(trackView->midiMenu());
}
if( dynamic_cast<AutomationTrackView *>( m_trackView ) )
{
Expand Down Expand Up @@ -2629,6 +2631,19 @@ void TrackView::update()



/*! \brief Create a menu for assigning/creating channels for this track.
*
*/
QMenu * TrackView::createFxMenu( QString title, QString newFxLabel )
{
Q_UNUSED(title)
Q_UNUSED(newFxLabel)
return NULL;
}




/*! \brief Close this track View.
*
*/
Expand Down
11 changes: 3 additions & 8 deletions src/gui/widgets/FxLineLcdSpinBox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#include "CaptionMenu.h"
#include "FxMixerView.h"
#include "GuiApplication.h"
#include "InstrumentTrack.h"
#include "Track.h"


void FxLineLcdSpinBox::mouseDoubleClickEvent(QMouseEvent* event)
Expand All @@ -50,14 +50,9 @@ void FxLineLcdSpinBox::contextMenuEvent(QContextMenuEvent* event)

QPointer<CaptionMenu> contextMenu = new CaptionMenu(model()->displayName(), this);

// This condition is here just as a safety check, fxLineLcdSpinBox is aways
// created inside a TabWidget inside an InstrumentTrackWindow
// FIXME this won't necessarily be true anymore
if (InstrumentTrackWindow* window =
dynamic_cast<InstrumentTrackWindow*>((QWidget*)this->parent()->parent()))
if ( QMenu *fxMenu = m_tv->createFxMenu(
tr( "Assign to:" ), tr( "New FX Channel" ) ) )
{
QMenu *fxMenu = window->instrumentTrackView()->createFxMenu(
tr("Assign to:"), tr("New FX Channel"));
contextMenu->addMenu(fxMenu);

contextMenu->addSeparator();
Expand Down
2 changes: 1 addition & 1 deletion src/tracks/InstrumentTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1367,7 +1367,7 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) :


// setup spinbox for selecting FX-channel
m_effectChannelNumber = new FxLineLcdSpinBox( 2, NULL, tr( "FX channel" ) );
m_effectChannelNumber = new FxLineLcdSpinBox( 2, NULL, tr( "FX channel" ), m_itv );

basicControlsLayout->addWidget( m_effectChannelNumber, 0, 6 );
basicControlsLayout->setAlignment( m_effectChannelNumber, widgetAlignment );
Expand Down
64 changes: 63 additions & 1 deletion src/tracks/SampleTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "MainWindow.h"
#include "Mixer.h"
#include "EffectRackView.h"
#include "FxMixerView.h"
#include "TabWidget.h"
#include "TrackLabelButton.h"

Expand Down Expand Up @@ -818,6 +819,44 @@ SampleTrackView::~SampleTrackView()



QMenu * SampleTrackView::createFxMenu(QString title, QString newFxLabel)
{
int channelIndex = model()->effectChannelModel()->value();

FxChannel *fxChannel = Engine::fxMixer()->effectChannel( channelIndex );

// If title allows interpolation, pass channel index and name
if ( title.contains( "%2" ) )
{
title = title.arg( channelIndex ).arg( fxChannel->m_name );
}

QMenu *fxMenu = new QMenu( title );

QSignalMapper * fxMenuSignalMapper = new QSignalMapper(fxMenu);

fxMenu->addAction( newFxLabel, this, SLOT( createFxLine() ) );
fxMenu->addSeparator();

for (int i = 0; i < Engine::fxMixer()->numChannels(); ++i)
{
FxChannel * currentChannel = Engine::fxMixer()->effectChannel( i );

if ( currentChannel != fxChannel )
{
QString label = tr( "FX %1: %2" ).arg( currentChannel->m_channelIndex ).arg( currentChannel->m_name );
QAction * action = fxMenu->addAction( label, fxMenuSignalMapper, SLOT( map() ) );
fxMenuSignalMapper->setMapping(action, currentChannel->m_channelIndex);
}
}

connect(fxMenuSignalMapper, SIGNAL(mapped(int)), this, SLOT(assignFxLine(int)));

return fxMenu;
}




void SampleTrackView::showEffects()
{
Expand Down Expand Up @@ -914,7 +953,7 @@ SampleTrackWindow::SampleTrackWindow(SampleTrackView * _stv) :


// setup spinbox for selecting FX-channel
m_effectChannelNumber = new FxLineLcdSpinBox(2, NULL, tr("FX channel"));
m_effectChannelNumber = new FxLineLcdSpinBox(2, NULL, tr("FX channel"), m_stv);

basicControlsLayout->addWidget(m_effectChannelNumber, 0, 3);
basicControlsLayout->setAlignment(m_effectChannelNumber, widgetAlignment);
Expand Down Expand Up @@ -992,6 +1031,29 @@ void SampleTrackWindow::modelChanged()



/*! \brief Create and assign a new FX Channel for this track */
void SampleTrackView::createFxLine()
{
int channelIndex = gui->fxMixerView()->addNewChannel();

Engine::fxMixer()->effectChannel( channelIndex )->m_name = getTrack()->name();

assignFxLine(channelIndex);
}




/*! \brief Assign a specific FX Channel for this track */
void SampleTrackView::assignFxLine(int channelIndex)
{
model()->effectChannelModel()->setValue( channelIndex );

gui->fxMixerView()->setCurrentFxLine( channelIndex );
}



void SampleTrackWindow::updateName()
{
setWindowTitle(m_track->name().length() > 25 ? (m_track->name().left(24) + "...") : m_track->name());
Expand Down

0 comments on commit 3aebfc9

Please sign in to comment.