Я видел несколько вопросов о простой замене двух перетаскиваемых элементов при перетаскивании, но моя ситуация немного другая.
По сути, у меня есть набор перетаскиваемых элементов, размещенных в (нелинейной) сетке. Сетка во многих случаях будет полностью заполнена данными. Мы хотим, чтобы пользователи могли легко переупорядочивать элементы сетки, но поскольку сетка нелинейна, использование функции сортировки не является вариантом. И поскольку сетка полностью заполнена, прямая замена двух позиций сетки, когда одна перетаскивается на другую, не является идеальным решением (поскольку мы не пытаемся превратить перестановку всего трех позиций в какую-то головоломку).
Нам бы ХОТЕЛОСЬ, чтобы при перетаскивании элемента сетки выполнялась обычная операция перетаскивания (назовите ее A), но когда элемент затем перетаскивается в желаемое место назначения (в котором уже есть другой элемент сетки, назовите его B). , то A должен занять место B, а затем B должен привязаться к курсору мыши, как если бы пользователь щелкнул и перетащил его. Это, очевидно, немного портит взаимодействие с мышью, потому что теперь у пользователя нет нажатых кнопок мыши, но он перетаскивает элемент, поэтому, чтобы освободить элемент, он либо щелкнет пустую ячейку, из которой пришел A, либо щелкнет другой элемент сетки C. , после чего B займет место C, а C теперь будет прикреплен к курсору мыши.
Я подробно изучил документацию и исходный код Draggable, и, похоже, нет способа настроить его именно так, как я хочу, из коробки, но я почти уверен, что могу расширить перетаскиваемый виджет и перезаписать пару его методы для достижения того, что я хочу, вместо того, чтобы писать собственное решение с нуля. Если это упростит задачу, для меня действительно не имеет значения, является ли событие мыши, используемое для запуска перетаскивания, в первую очередь щелчком по сравнению с событием перетаскивания.
Чтобы было ясно, это своего рода диаграмма взаимодействия того, что я ищу:
Original Setup - ^ is mouse cursor
[A] ^ [C]
[B] [D]
Now click and drag on A. Result is:
[ ]^A [C]
[B] [D]
Now drag over B and release. Result is:
[ ] [C]
[A]^B [D]
B is now acting as if it's being dragged, but mouse button is not held down. Move
cursor over C and click mouse button. Result is:
[ ] [B] ^C
[A] [D]
B has taken C's place, and C is now following the mouse cursor. Again, mouse
button is not being held down. Move cursor over empty cell and click mouse
button. Result is:
[C] ^ [B]
[A] [D]
Now there is nothing attached to the mouse cursor.