@@ -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
0 commit comments