From ed19009d29c4a895259bd97328c75fd1d5b2cee8 Mon Sep 17 00:00:00 2001 From: Vesa Date: Thu, 1 May 2014 18:10:05 +0300 Subject: [PATCH] FXLine: add context menu with options to remove, move & rename FX channels - Uses existing functionality in FxMixer & FxMixerView to manipulate channels - Instruments sending to the manipulated channels get automatically updated - In the future I hope to implement a drag/drop functionality instead of the clunky context menu but this is a good first step until then - Also added in a little QWhatsThis help message for the FX line, also accessible from context menu That lmms_math thing got mixed in accidentally, but it's also a good change: always include math.h in lmms_math - that way, other parts of the software can just #include lmms_math, and won't have to #include both math.h and lmms_math, also the yet unused sinc function in it seems to need it so this prevents problems down the line --- include/FxLine.h | 16 +++++--- include/lmms_math.h | 4 +- src/gui/widgets/FxLine.cpp | 84 +++++++++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/include/FxLine.h b/include/FxLine.h index 40af96a90..5ee4d2ec2 100644 --- a/include/FxLine.h +++ b/include/FxLine.h @@ -23,8 +23,8 @@ * */ -#ifndef _FX_LINE_H -#define _FX_LINE_H +#ifndef FX_LINE_H +#define FX_LINE_H #include #include @@ -46,6 +46,7 @@ public: virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseDoubleClickEvent( QMouseEvent * ); + virtual void contextMenuEvent( QContextMenuEvent * ); inline int channelIndex() { return m_channelIndex; } void setChannelIndex(int index); @@ -56,11 +57,16 @@ public: private: FxMixerView * m_mv; LcdWidget* m_lcd; - - int m_channelIndex; -} ; +private slots: + void renameChannel(); + void removeChannel(); + void moveChannelLeft(); + void moveChannelRight(); + void displayHelp(); + +}; #endif // FXLINE_H diff --git a/include/lmms_math.h b/include/lmms_math.h index 36656101a..94d13b161 100644 --- a/include/lmms_math.h +++ b/include/lmms_math.h @@ -29,10 +29,10 @@ #include #include "lmms_constants.h" -#ifdef __INTEL_COMPILER - #include +#ifdef __INTEL_COMPILER + static inline float absFraction( const float _x ) { return( _x - ( _x >= 0.0f ? floorf( _x ) : floorf( _x ) - 1 ) ); diff --git a/src/gui/widgets/FxLine.cpp b/src/gui/widgets/FxLine.cpp index 87b929bbb..c200c1001 100644 --- a/src/gui/widgets/FxLine.cpp +++ b/src/gui/widgets/FxLine.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "FxMixer.h" #include "FxMixerView.h" @@ -36,6 +37,8 @@ #include "engine.h" #include "SendButtonIndicator.h" #include "gui_templates.h" +#include "caption_menu.h" + FxLine::FxLine( QWidget * _parent, FxMixerView * _mv, int _channelIndex) : QWidget( _parent ), @@ -61,8 +64,23 @@ FxLine::FxLine( QWidget * _parent, FxMixerView * _mv, int _channelIndex) : m_lcd->setValue( m_channelIndex ); m_lcd->move( 4, 58 ); m_lcd->setMarginWidth( 1 ); + + setWhatsThis( tr( + "The FX channel receives input from one or more instrument tracks.\n " + "It in turn can be routed to multiple other FX channels. LMMS automatically " + "takes care of preventing infinite loops for you and doesn't allow making " + "a connection that would result in an infinite loop.\n\n" + + "In order to route the channel to another channel, select the FX channel " + "and click on the \"send\" button on the channel you want to send to. " + "The knob under the send button controls the level of signal that is sent " + "to the channel.\n\n" + + "You can remove and move FX channels in the context menu, which is accessed " + "by right-clicking the FX channel.\n") ); } + FxLine::~FxLine() { delete m_sendKnob; @@ -125,6 +143,7 @@ static void drawFxLine( QPainter* p, const QWidget *fxLine, const QString& name, } + void FxLine::paintEvent( QPaintEvent * ) { FxMixer * mix = engine::fxMixer(); @@ -138,12 +157,47 @@ void FxLine::paintEvent( QPaintEvent * ) painter.end(); } + void FxLine::mousePressEvent( QMouseEvent * ) { m_mv->setCurrentFxLine( this ); } + void FxLine::mouseDoubleClickEvent( QMouseEvent * ) +{ + renameChannel(); +} + + +void FxLine::contextMenuEvent( QContextMenuEvent * ) +{ + FxMixer * mix = engine::fxMixer(); + QPointer contextMenu = new captionMenu( mix->effectChannel( m_channelIndex )->m_name ); + if( m_channelIndex != 0 ) // no move-options in master + { + contextMenu->addAction( tr( "Move &left" ), this, SLOT( moveChannelLeft() ) ); + contextMenu->addAction( tr( "Move &right" ), this, SLOT( moveChannelRight() ) ); + } + contextMenu->addAction( tr( "Rename &channel" ), this, SLOT( renameChannel() ) ); + contextMenu->addSeparator(); + + if( m_channelIndex != 0 ) // no remove-option in master + { + contextMenu->addAction( embed::getIconPixmap( "cancel" ), tr( "R&emove channel" ), + this, SLOT( removeChannel() ) ); + contextMenu->addSeparator(); + } + + contextMenu->addAction( embed::getIconPixmap( "help" ), + tr( "&Help" ), + this, SLOT( displayHelp() ) ); + contextMenu->exec( QCursor::pos() ); + delete contextMenu; +} + + +void FxLine::renameChannel() { bool ok; FxMixer * mix = engine::fxMixer(); @@ -154,10 +208,38 @@ void FxLine::mouseDoubleClickEvent( QMouseEvent * ) QLineEdit::Normal, mix->effectChannel(m_channelIndex)->m_name, &ok ); if( ok && !new_name.isEmpty() ) { - mix->effectChannel(m_channelIndex)->m_name = new_name; + mix->effectChannel( m_channelIndex )->m_name = new_name; update(); } } + +void FxLine::removeChannel() +{ + FxMixerView * mix = engine::fxMixerView(); + mix->deleteChannel( m_channelIndex ); +} + + +void FxLine::moveChannelLeft() +{ + FxMixerView * mix = engine::fxMixerView(); + mix->moveChannelLeft( m_channelIndex ); +} + + +void FxLine::moveChannelRight() +{ + FxMixerView * mix = engine::fxMixerView(); + mix->moveChannelRight( m_channelIndex ); +} + + +void FxLine::displayHelp() +{ + QWhatsThis::showText( mapToGlobal( rect().bottomRight() ), + whatsThis() ); +} + #include "moc_FxLine.cxx"