66 - Drag within the tree to reorder and reparent items
77 - Drop files from Finder/Explorer onto the tree to insert new nodes
88-->
9- <window title="TreeWidget drag/drop + external drops" :size="[800, 600]">
10- <widget :layout="{'type': 'Box', 'direction': 'TopToBottom'}">
11- <label
12- text="Drag nodes to reorder/reparent. Drop files from your OS to insert them into the tree."
13- />
149
10+ <window
11+ :size="[800, 600]"
12+ title="TreeWidget drag/drop + external drops"
13+ >
14+ <widget :layout="{'type': 'Box', 'direction': 'TopToBottom'}">
15+ <label text="Drag nodes to reorder/reparent. Drop files from your OS to insert them into the tree." />
1516 <drag-drop-treewidget
16- object-name="tree"
1717 :column-count="1"
1818 :header-labels="['Name']"
19+ object-name="tree"
1920 :selection-mode="QtWidgets.QAbstractItemView.SingleSelection"
2021 >
2122 <Node
2425 :node="node"
2526 />
2627 </drag-drop-treewidget>
27-
2828 <label :text="status" />
2929 </widget>
3030</window>
@@ -34,11 +34,10 @@ import os
3434import uuid
3535
3636import collagraph as cg
37+ from examples.pyside.treewidget_drag_drop_node import Node
3738from observ import reactive
3839from PySide6 import QtCore, QtWidgets
3940
40- from examples.pyside.treewidget_drag_drop_node import Node
41-
4241
4342class DragDropTreeWidget(QtWidgets.QTreeWidget):
4443 """QTreeWidget that (1) accepts external file drops and (2) notifies on internal moves."""
@@ -56,13 +55,16 @@ class DragDropTreeWidget(QtWidgets.QTreeWidget):
5655 self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
5756
5857 def dragEnterEvent(self, event): # noqa: N802
59- if event.source() is self or event.mimeData().hasUrls():
58+ # Don't short-circuit internal drags: QAbstractItemView updates the
59+ # drop indicator during its drag handlers.
60+ if event.source() is not self and event.mimeData().hasUrls():
6061 event.acceptProposedAction()
6162 return
6263 super().dragEnterEvent(event)
6364
6465 def dragMoveEvent(self, event): # noqa: N802
65- if event.source() is self or event.mimeData().hasUrls():
66+ # Same here: delegate internal drags so the indicator is updated.
67+ if event.source() is not self and event.mimeData().hasUrls():
6668 event.acceptProposedAction()
6769 return
6870 super().dragMoveEvent(event)
@@ -122,7 +124,9 @@ class DragDropTreeWidget(QtWidgets.QTreeWidget):
122124cg.PySideRenderer.register_element("drag-drop-treewidget", DragDropTreeWidget)
123125
124126
125- def make_node(name: str, *, path: str | None = None, node_id: str | None = None, children=None):
127+ def make_node(
128+ name: str, *, path: str | None = None, node_id: str | None = None, children=None
129+ ):
126130 return reactive(
127131 {
128132 "id": node_id or uuid.uuid4().hex,
@@ -141,10 +145,15 @@ class TreeWidgetDragDropReparent(cg.Component):
141145 "Project",
142146 children=[
143147 make_node("README.md"),
144- make_node("src", children=[make_node("main.py"), make_node("utils.py")]),
148+ make_node(
149+ "src",
150+ children=[make_node("main.py"), make_node("utils.py")],
151+ ),
145152 ],
146153 ),
147- make_node("Assets", children=[make_node("logo.png"), make_node("styles.css")]),
154+ make_node(
155+ "Assets", children=[make_node("logo.png"), make_node("styles.css")]
156+ ),
148157 ]
149158 )
150159 self.state["status"] = "Ready"
@@ -221,3 +230,4 @@ class TreeWidgetDragDropReparent(cg.Component):
221230 parent = find(self.state["nodes"])
222231 return parent["children"] if parent else self.state["nodes"]
223232</script>
233+
0 commit comments