Add menu option and hotkeys to move controllers/effects (#7139)

* added controller rack modules

* remove this-> from setFocusPolicy() and obsolete comment

Co-authored-by: saker <sakertooth@gmail.com>

* Use std::swap

Co-authored-by: saker <sakertooth@gmail.com>

* some more cleanup

Co-authored-by: saker <sakertooth@gmail.com>

* Replace slots with function pointers

Co-authored-by: saker <sakertooth@gmail.com>

* Apply fixes

---------

Co-authored-by: ejaaskel <esa.jaaskela@suomi24.fi>
Co-authored-by: saker <sakertooth@gmail.com>
This commit is contained in:
Rossmaxx
2024-05-23 17:38:47 +05:30
committed by GitHub
parent bd2362a8c0
commit b803e92d63
8 changed files with 91 additions and 37 deletions

View File

@@ -65,9 +65,11 @@ public:
public slots:
void deleteController( lmms::gui::ControllerView * _view );
void onControllerAdded( lmms::Controller * );
void onControllerRemoved( lmms::Controller * );
void deleteController(ControllerView* view);
void moveUp(ControllerView* view);
void moveDown(ControllerView* view);
void addController(Controller* controller);
void removeController(Controller* controller);
protected:
void closeEvent( QCloseEvent * _ce ) override;

View File

@@ -63,12 +63,16 @@ public:
public slots:
void editControls();
void deleteController();
void removeController();
void closeControls();
void renameController();
void moveUp();
void moveDown();
signals:
void deleteController( lmms::gui::ControllerView * _view );
void movedUp(ControllerView* view);
void movedDown(ControllerView* view);
void removedController(ControllerView* view);
protected:

View File

@@ -53,10 +53,9 @@ public:
public slots:
void clearViews();
void moveUp( lmms::gui::EffectView* view );
void moveDown( lmms::gui::EffectView* view );
void deletePlugin( lmms::gui::EffectView* view );
void moveUp(EffectView* view);
void moveDown(EffectView* view);
void deletePlugin(EffectView* view);
private slots:
virtual void update();

View File

@@ -77,10 +77,9 @@ public slots:
signals:
void moveUp( lmms::gui::EffectView * _plugin );
void moveDown( lmms::gui::EffectView * _plugin );
void deletePlugin( lmms::gui::EffectView * _plugin );
void movedUp(EffectView* view);
void movedDown(EffectView* view);
void deletedPlugin(EffectView* view);
protected:
void contextMenuEvent( QContextMenuEvent * _me ) override;

View File

@@ -24,6 +24,7 @@
*/
#include <QApplication>
#include <QAction>
#include <QPushButton>
#include <QScrollArea>
#include <QMessageBox>
@@ -68,8 +69,8 @@ ControllerRackView::ControllerRackView() :
this, SLOT(addController()));
Song * song = Engine::getSong();
connect( song, SIGNAL(controllerAdded(lmms::Controller*)), SLOT(onControllerAdded(lmms::Controller*)));
connect( song, SIGNAL(controllerRemoved(lmms::Controller*)), SLOT(onControllerRemoved(lmms::Controller*)));
connect(song, &Song::controllerAdded, this, qOverload<Controller*>(&ControllerRackView::addController));
connect(song, &Song::controllerRemoved, this, &ControllerRackView::removeController);
auto layout = new QVBoxLayout();
layout->addWidget( m_scrollArea );
@@ -132,17 +133,51 @@ void ControllerRackView::deleteController( ControllerView * _view )
song->removeController( c );
}
void ControllerRackView::moveUp(ControllerView* view)
{
if (view == m_controllerViews.first()) { return; }
const auto storedView = std::find(m_controllerViews.begin(), m_controllerViews.end(), view);
assert(storedView != m_controllerViews.end());
const auto index = std::distance(m_controllerViews.begin(), storedView);
void ControllerRackView::onControllerAdded( Controller * controller )
std::swap(m_controllerViews[index - 1], m_controllerViews[index]);
m_scrollAreaLayout->removeWidget(view);
m_scrollAreaLayout->insertWidget(index - 1, view);
}
void ControllerRackView::moveDown(ControllerView* view)
{
if (view == m_controllerViews.last()) { return; }
const auto storedView = std::find(m_controllerViews.begin(), m_controllerViews.end(), view);
assert(storedView != m_controllerViews.end());
moveUp(*std::next(storedView));
}
void ControllerRackView::addController(Controller* controller)
{
QWidget * scrollAreaWidget = m_scrollArea->widget();
auto controllerView = new ControllerView(controller, scrollAreaWidget);
connect( controllerView, SIGNAL(deleteController(lmms::gui::ControllerView*)),
this, SLOT(deleteController(lmms::gui::ControllerView*)), Qt::QueuedConnection );
connect(controllerView, &ControllerView::movedUp, this, &ControllerRackView::moveUp);
connect(controllerView, &ControllerView::movedDown, this, &ControllerRackView::moveDown);
connect(controllerView, &ControllerView::removedController, this, &ControllerRackView::deleteController, Qt::QueuedConnection);
auto moveUpAction = new QAction(controllerView);
moveUpAction->setShortcut(Qt::Key_Up | Qt::AltModifier);
moveUpAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveUpAction, &QAction::triggered, controllerView, &ControllerView::moveUp);
controllerView->addAction(moveUpAction);
auto moveDownAction = new QAction(controllerView);
moveDownAction->setShortcut(Qt::Key_Down | Qt::AltModifier);
moveDownAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveDownAction, &QAction::triggered, controllerView, &ControllerView::moveDown);
controllerView->addAction(moveDownAction);
m_controllerViews.append( controllerView );
m_scrollAreaLayout->insertWidget( m_nextIndex, controllerView );
@@ -153,7 +188,7 @@ void ControllerRackView::onControllerAdded( Controller * controller )
void ControllerRackView::onControllerRemoved( Controller * removedController )
void ControllerRackView::removeController(Controller* removedController)
{
ControllerView * viewOfRemovedController = 0;

View File

@@ -53,6 +53,7 @@ ControllerView::ControllerView( Controller * _model, QWidget * _parent ) :
{
this->setFrameStyle( QFrame::StyledPanel );
this->setFrameShadow( QFrame::Raised );
setFocusPolicy(Qt::StrongFocus);
auto vBoxLayout = new QVBoxLayout(this);
@@ -132,11 +133,11 @@ void ControllerView::closeControls()
m_show = true;
}
void ControllerView::moveUp() { emit movedUp(this); }
void ControllerView::deleteController()
{
emit( deleteController( this ) );
}
void ControllerView::moveDown() { emit movedDown(this); }
void ControllerView::removeController() { emit removedController(this); }
void ControllerView::renameController()
{
@@ -173,10 +174,13 @@ void ControllerView::modelChanged()
void ControllerView::contextMenuEvent( QContextMenuEvent * )
{
QPointer<CaptionMenu> contextMenu = new CaptionMenu( model()->displayName(), this );
contextMenu->addAction( embed::getIconPixmap( "cancel" ),
tr( "&Remove this controller" ),
this, SLOT(deleteController()));
Controller* c = castModel<Controller>();
QPointer<CaptionMenu> contextMenu = new CaptionMenu(c->name(), this);
contextMenu->addAction(embed::getIconPixmap("arp_up"), tr("Move &up"), this, &ControllerView::moveUp);
contextMenu->addAction(embed::getIconPixmap("arp_down"), tr("Move &down"), this, &ControllerView::moveDown);
contextMenu->addSeparator();
contextMenu->addAction(
embed::getIconPixmap("cancel"), tr("&Remove this controller"), this, &ControllerView::removeController);
contextMenu->addAction( tr("Re&name this controller"), this, SLOT(renameController()));
contextMenu->addSeparator();
contextMenu->exec( QCursor::pos() );

View File

@@ -24,6 +24,7 @@
*/
#include <QApplication>
#include <QAction>
#include <QPushButton>
#include <QScrollArea>
#include <QVBoxLayout>
@@ -170,13 +171,22 @@ void EffectRackView::update()
if( i >= m_effectViews.size() )
{
auto view = new EffectView(effect, w);
connect( view, SIGNAL(moveUp(lmms::gui::EffectView*)),
this, SLOT(moveUp(lmms::gui::EffectView*)));
connect( view, SIGNAL(moveDown(lmms::gui::EffectView*)),
this, SLOT(moveDown(lmms::gui::EffectView*)));
connect( view, SIGNAL(deletePlugin(lmms::gui::EffectView*)),
this, SLOT(deletePlugin(lmms::gui::EffectView*)),
Qt::QueuedConnection );
connect(view, &EffectView::movedUp, this, &EffectRackView::moveUp);
connect(view, &EffectView::movedDown, this, &EffectRackView::moveDown);
connect(view, &EffectView::deletedPlugin, this, &EffectRackView::deletePlugin, Qt::QueuedConnection);
QAction* moveUpAction = new QAction(view);
moveUpAction->setShortcut(Qt::Key_Up | Qt::AltModifier);
moveUpAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveUpAction, &QAction::triggered, view, &EffectView::moveUp);
view->addAction(moveUpAction);
QAction* moveDownAction = new QAction(view);
moveDownAction->setShortcut(Qt::Key_Down | Qt::AltModifier);
moveDownAction->setShortcutContext(Qt::WidgetShortcut);
connect(moveDownAction, &QAction::triggered, view, &EffectView::moveDown);
view->addAction(moveDownAction);
view->show();
m_effectViews.append( view );
if( i < view_map.size() )

View File

@@ -53,6 +53,7 @@ EffectView::EffectView( Effect * _model, QWidget * _parent ) :
m_dragging(false)
{
setFixedSize(EffectView::DEFAULT_WIDTH, EffectView::DEFAULT_HEIGHT);
setFocusPolicy(Qt::StrongFocus);
// Disable effects that are of type "DummyEffect"
bool isEnabled = !dynamic_cast<DummyEffect *>( effect() );
@@ -162,7 +163,7 @@ void EffectView::editControls()
void EffectView::moveUp()
{
emit moveUp( this );
emit movedUp(this);
}
@@ -170,14 +171,14 @@ void EffectView::moveUp()
void EffectView::moveDown()
{
emit moveDown( this );
emit movedDown(this);
}
void EffectView::deletePlugin()
{
emit deletePlugin( this );
emit deletedPlugin(this);
}