Add drag-and-drop reordering of sibling elements in the tree panel
Elements can now be reordered within the same container by dragging a row above or below another in the left-hand element tree.
This commit is contained in:
@@ -75,6 +75,7 @@ from .elements.get_element import get_element
|
||||
from .elements.add_element import add_element
|
||||
from .elements.add_tab import add_tab
|
||||
from .elements.update_element_geometry import update_element_geometry
|
||||
from .elements.reorder_element import reorder_element
|
||||
from .elements.save_element_controls import save_element_controls
|
||||
from .elements.delete_element import delete_element
|
||||
from .elements.duplicate_element import duplicate_element
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import db
|
||||
|
||||
|
||||
def reorder_element(slug, screen_id, element_id, target_id, position):
|
||||
"""Déplace element_id juste avant ("before") ou juste après ("after")
|
||||
target_id, DANS LE MÊME CONTENEUR (les deux doivent avoir le même
|
||||
parent_id — sinon on ne touche à rien, pour ne jamais reparenter par
|
||||
erreur via le glisser-déposer de l'arborescence). L'ordre est porté par
|
||||
z_index, partagé par tous les éléments de l'écran (pas juste les frères
|
||||
et sœurs) : on renumérote donc l'écran entier à partir de l'ordre actuel
|
||||
(z_index, id) pour rester cohérent partout, pas seulement dans ce
|
||||
conteneur."""
|
||||
conn = db.connect(slug)
|
||||
rows = conn.execute(
|
||||
"SELECT id, parent_id FROM _screen_elements WHERE screen_id = ? ORDER BY z_index, id",
|
||||
(screen_id,),
|
||||
).fetchall()
|
||||
by_id = {r["id"]: r["parent_id"] for r in rows}
|
||||
if element_id not in by_id or target_id not in by_id:
|
||||
conn.close()
|
||||
return
|
||||
if by_id[element_id] != by_id[target_id]:
|
||||
conn.close()
|
||||
return
|
||||
|
||||
order = [r["id"] for r in rows]
|
||||
order.remove(element_id)
|
||||
target_index = order.index(target_id)
|
||||
insert_at = target_index + 1 if position == "after" else target_index
|
||||
order.insert(insert_at, element_id)
|
||||
|
||||
conn.executemany(
|
||||
"UPDATE _screen_elements SET z_index = ? WHERE id = ?",
|
||||
[(i + 1, eid) for i, eid in enumerate(order)],
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user