diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui
index 730f75ac..a46e25e8 100644
--- a/forms/advanced-scene-switcher.ui
+++ b/forms/advanced-scene-switcher.ui
@@ -584,6 +584,15 @@
0
+
+ true
+
+
+ QAbstractItemView::InternalMove
+
+
+ Qt::MoveAction
+
false
diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp
index 665d2e8c..e401898a 100644
--- a/src/headers/advanced-scene-switcher.hpp
+++ b/src/headers/advanced-scene-switcher.hpp
@@ -154,6 +154,7 @@ public slots:
void MoveMacroConditionUp(int idx);
void MoveMacroConditionDown(int idx);
void HighlightMatchedMacros();
+ void MacroDragDropReorder(QModelIndex, int, int, QModelIndex, int);
void on_screenRegionSwitches_currentRowChanged(int idx);
void on_showFrame_clicked();
diff --git a/src/macro-tab.cpp b/src/macro-tab.cpp
index ff20f6a3..3721c63e 100644
--- a/src/macro-tab.cpp
+++ b/src/macro-tab.cpp
@@ -384,6 +384,25 @@ void AdvSceneSwitcher::on_macros_currentRowChanged(int idx)
}
}
+void AdvSceneSwitcher::MacroDragDropReorder(QModelIndex, int from, int,
+ QModelIndex, int to)
+{
+ std::lock_guard lock(switcher->m);
+ if (from > to) {
+ std::rotate(switcher->macros.rend() - from - 1,
+ switcher->macros.rend() - from,
+ switcher->macros.rend() - to);
+ } else {
+ std::rotate(switcher->macros.begin() + from,
+ switcher->macros.begin() + from + 1,
+ switcher->macros.begin() + to);
+ }
+
+ for (auto &m : switcher->macros) {
+ m->ResolveMacroRef();
+ }
+}
+
void AdvSceneSwitcher::setupMacroTab()
{
const QSignalBlocker signalBlocker(ui->macros);
@@ -401,6 +420,12 @@ void AdvSceneSwitcher::setupMacroTab()
ui->macroHelp->setVisible(false);
}
+ connect(ui->macros->model(),
+ SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)),
+ this,
+ SLOT(MacroDragDropReorder(QModelIndex, int, int, QModelIndex,
+ int)));
+
delete conditionsList;
conditionsList = new MacroSegmentList(this);
conditionsList->SetHelpMsg(