diff --git a/include/ControllerRackView.h b/include/ControllerRackView.h index 303cc2b401f..93d1e84380c 100644 --- a/include/ControllerRackView.h +++ b/include/ControllerRackView.h @@ -65,9 +65,11 @@ class ControllerRackView : public QWidget, public SerializingObject 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; diff --git a/include/ControllerView.h b/include/ControllerView.h index d1ba533a1a0..9b442672d94 100644 --- a/include/ControllerView.h +++ b/include/ControllerView.h @@ -63,12 +63,16 @@ class ControllerView : public QFrame, public ModelView 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: diff --git a/include/EffectRackView.h b/include/EffectRackView.h index a1e21be0985..4a90c6b7a78 100644 --- a/include/EffectRackView.h +++ b/include/EffectRackView.h @@ -53,10 +53,9 @@ class EffectRackView : public QWidget, public ModelView 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(); diff --git a/include/EffectView.h b/include/EffectView.h index e90700952c7..805e4a4279c 100644 --- a/include/EffectView.h +++ b/include/EffectView.h @@ -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; diff --git a/src/gui/ControllerRackView.cpp b/src/gui/ControllerRackView.cpp index 54c325dc660..e7d2efebd06 100644 --- a/src/gui/ControllerRackView.cpp +++ b/src/gui/ControllerRackView.cpp @@ -24,6 +24,7 @@ */ #include +#include #include #include #include @@ -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(&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); + + 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::onControllerAdded( Controller * controller ) +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; diff --git a/src/gui/ControllerView.cpp b/src/gui/ControllerView.cpp index d32e8d49c09..7f7c4729c67 100644 --- a/src/gui/ControllerView.cpp +++ b/src/gui/ControllerView.cpp @@ -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 contextMenu = new CaptionMenu( model()->displayName(), this ); - contextMenu->addAction( embed::getIconPixmap( "cancel" ), - tr( "&Remove this controller" ), - this, SLOT(deleteController())); + Controller* c = castModel(); + QPointer 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() ); diff --git a/src/gui/EffectRackView.cpp b/src/gui/EffectRackView.cpp index aa790d74dfc..478e117fe80 100644 --- a/src/gui/EffectRackView.cpp +++ b/src/gui/EffectRackView.cpp @@ -24,6 +24,7 @@ */ #include +#include #include #include #include @@ -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() ) diff --git a/src/gui/EffectView.cpp b/src/gui/EffectView.cpp index 76010232a30..6f2b984c32a 100644 --- a/src/gui/EffectView.cpp +++ b/src/gui/EffectView.cpp @@ -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( 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); }