Skip to content

Commit fc51137

Browse files
Fix a problem with using form layouts (#125)
* Fix a problem with using form layouts * Bump version
1 parent 386be64 commit fc51137

3 files changed

Lines changed: 78 additions & 5 deletions

File tree

collagraph/renderers/pyside/objects/layouts.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,15 @@ def remove_layout(self, el):
5959

6060
@PySideRenderer.register_remove(QFormLayout)
6161
def remove_form(self, el):
62-
# Layout also deletes 'el' so no need to unset parent
63-
self.removeRow(el)
62+
# Don't use removeRow, even though it should theoratically work
63+
# In reality it causes a hard crash...
64+
# Instead, take the row, and then unset the parents of the
65+
# associated widgets of the return layout item
66+
layout_item = self.takeRow(el)
67+
if layout_item:
68+
layout_item.labelItem.widget().setParent(None)
69+
layout_item.fieldItem.widget().setParent(None)
70+
el.setParent(None)
6471

6572

6673
@PySideRenderer.register_set_attr(QLayout)
@@ -105,12 +112,31 @@ def set_grid_index(self, attr, value):
105112
layout.addWidget(self, *value)
106113

107114

108-
@PySideRenderer.register_custom_attribute("form_label", "form_index")
115+
@PySideRenderer.register_custom_attribute("form_label")
116+
def set_form_label(self, attr, value):
117+
setattr(self, attr, value)
118+
index = getattr(self, "form_index", None)
119+
if parent := self.parent():
120+
layout = parent.layout()
121+
if index is not None:
122+
label_item = layout.itemAt(index, QFormLayout.LabelRole)
123+
label_item.widget().setText(value)
124+
125+
126+
@PySideRenderer.register_custom_attribute("form_index")
109127
def set_form_index(self, attr, value):
128+
old_index = getattr(self, "form_index", None)
110129
setattr(self, attr, value)
111130
if parent := self.parent():
112131
layout = parent.layout()
132+
label_widget = None
133+
if old_index is not None:
134+
layout_item = layout.takeRow(old_index)
135+
label_widget = layout_item.labelItem.widget()
136+
assert layout_item.fieldItem.widget() is self
113137
if hasattr(self, "form_label") and hasattr(self, "form_index"):
114-
layout.insertRow(self.form_index, self.form_label, self)
138+
layout.insertRow(
139+
self.form_index, label_widget if label_widget else self.form_label, self
140+
)
115141
elif hasattr(self, "form_label"):
116142
layout.addRow(self.form_label, self)

examples/pyside/list_and_form.cgx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<widget>
2+
<qsplitter>
3+
<treewidget
4+
object-name="tree-widget"
5+
:header-labels="['content']"
6+
:column-count="1"
7+
:selection-mode="QtWidgets.QTreeView.ExtendedSelection"
8+
@item-selection-changed="selection_changed"
9+
>
10+
<treewidgetitem
11+
v-for="item in items"
12+
:content="{0: item['name']}"
13+
:obj_id="item['id']"
14+
/>
15+
</treewidget>
16+
<widget :layout="{'type': 'form'}">
17+
<label v-for="item in selected_items()" v-bind="item" />
18+
</widget>
19+
</qsplitter>
20+
</widget>
21+
22+
<script>
23+
import collagraph as cg
24+
from PySide6 import QtWidgets
25+
26+
class App(cg.Component):
27+
def __init__(self, *args, **kwargs):
28+
super().__init__(*args, **kwargs)
29+
self.state["items"] = [{"id": 0, "name": "first"}, {"id": 1, "name":"second"}]
30+
self.state["selected"] = []
31+
32+
def selection_changed(self):
33+
if not self.element:
34+
return
35+
36+
tree_widget = self.element.findChild(QtWidgets.QTreeWidget, "tree-widget")
37+
selected_items = tree_widget.selectedItems()
38+
selected_ids = list([item.obj_id for item in selected_items])
39+
self.state["selected"] = selected_ids
40+
41+
def selected_items(self):
42+
result = [
43+
{'text': self.state['items'][idx]["name"], 'form_label': f'Type {idx}:', 'form_index': 0}
44+
for idx in self.state['selected']]
45+
return result
46+
47+
</script>

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "collagraph"
3-
version = "0.8.2"
3+
version = "0.8.3"
44
description = "Reactive user interfaces"
55
authors = [
66
{ name = "Berend Klein Haneveld", email = "berendkleinhaneveld@gmail.com" },

0 commit comments

Comments
 (0)