Skip to content

Commit c964f93

Browse files
committed
Improved drag and drop behavior
1 parent 82666d6 commit c964f93

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

src/GUI.cpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -150,22 +150,8 @@ void GUI::GUILayersList() {
150150

151151
if (ImGui::BeginDragDropTarget()) {
152152
if (const auto payload = ImGui::AcceptDragDropPayload("APILayer*")) {
153-
const auto& dropped = *reinterpret_cast<APILayer*>(payload->Data);
154-
std::vector<APILayer> newLayers;
155-
for (const auto& it: mLayers) {
156-
if (it == dropped) {
157-
continue;
158-
}
159-
if (it == layer) {
160-
newLayers.push_back(dropped);
161-
}
162-
163-
newLayers.push_back(it);
164-
}
165-
assert(mLayers.size() == newLayers.size());
166-
if (SetAPILayers(newLayers)) {
167-
mLayerDataIsStale = true;
168-
}
153+
const auto source = *reinterpret_cast<APILayer*>(payload->Data);
154+
DragDropReorder(source, layer);
169155
}
170156
ImGui::EndDragDropTarget();
171157
}
@@ -634,4 +620,33 @@ void GUI::GUIRemoveLayerPopup() {
634620
}
635621
}
636622

623+
void GUI::DragDropReorder(const APILayer& source, const APILayer& target) {
624+
auto newLayers = mLayers;
625+
626+
auto sourceIt = std::ranges::find(newLayers, source);
627+
if (sourceIt == newLayers.end()) {
628+
return;
629+
}
630+
631+
auto targetIt = std::ranges::find(newLayers, target);
632+
if (targetIt == newLayers.end() || sourceIt == targetIt) {
633+
return;
634+
}
635+
636+
const auto insertBefore = sourceIt > targetIt;
637+
638+
newLayers.erase(sourceIt);
639+
targetIt = std::ranges::find(newLayers, target);
640+
assert(targetIt != newLayers.end());
641+
if (!insertBefore) {
642+
targetIt++;
643+
}
644+
newLayers.insert(targetIt, source);
645+
646+
assert(mLayers.size() == newLayers.size());
647+
if (SetAPILayers(newLayers)) {
648+
mLayerDataIsStale = true;
649+
}
650+
}
651+
637652
}// namespace FredEmmott::OpenXRLayers

src/GUI.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class GUI final : public PlatformGUI {
5656
void ReloadLayerDataNow();
5757

5858
void AddLayersClicked();
59+
void DragDropReorder(const APILayer& source, const APILayer& target);
5960
};
6061

6162
}// namespace FredEmmott::OpenXRLayers

0 commit comments

Comments
 (0)