Skip to content

Commit e52a8bc

Browse files
authored
fix: fix splitting logic and deduplicate code in Groups Presets Widgets (#365)
* fix: fix splitting logic and deduplicate code * remove conditionals
1 parent 2c7aa1a commit e52a8bc

File tree

4 files changed

+69
-127
lines changed

4 files changed

+69
-127
lines changed

src/pymmcore_widgets/_group_preset_widget/_add_first_preset_widget.py

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
from pymmcore_plus import CMMCorePlus
4-
from qtpy.QtCore import Qt
54
from qtpy.QtWidgets import (
65
QDialog,
76
QGroupBox,
@@ -11,15 +10,14 @@
1110
QPushButton,
1211
QSizePolicy,
1312
QSpacerItem,
14-
QTableWidget,
15-
QTableWidgetItem,
1613
QVBoxLayout,
1714
QWidget,
1815
)
1916

20-
from pymmcore_widgets._property_widget import PropertyWidget
2117
from pymmcore_widgets._util import block_core
2218

19+
from ._cfg_table import _CfgTable
20+
2321

2422
class AddFirstPresetWidget(QDialog):
2523
"""A widget to create the first specified group's preset."""
@@ -39,7 +37,7 @@ def __init__(
3937

4038
self._create_gui()
4139

42-
self._populate_table()
40+
self.table.populate_table(self._dev_prop_val_list)
4341

4442
def _create_gui(self) -> None:
4543
self.setWindowTitle(f"Add the first Preset to the new '{self._group}' Group")
@@ -58,7 +56,7 @@ def _create_gui(self) -> None:
5856
top_wdg = self._create_top_wdg()
5957
wdg_layout.addWidget(top_wdg)
6058

61-
self.table = _Table()
59+
self.table = _CfgTable()
6260
wdg_layout.addWidget(self.table)
6361

6462
bottom_wdg = self._create_bottom_wdg()
@@ -121,26 +119,8 @@ def _create_bottom_wdg(self) -> QWidget:
121119

122120
return wdg
123121

124-
def _populate_table(self) -> None:
125-
self.table.clearContents()
126-
127-
self.table.setRowCount(len(self._dev_prop_val_list))
128-
for idx, (dev, prop, _) in enumerate(self._dev_prop_val_list):
129-
item = QTableWidgetItem(f"{dev}-{prop}")
130-
wdg = PropertyWidget(dev, prop, mmcore=self._mmc)
131-
wdg._value_widget.valueChanged.disconnect() # type: ignore
132-
self.table.setItem(idx, 0, item)
133-
self.table.setCellWidget(idx, 1, wdg)
134-
135122
def _create_first_preset(self) -> None:
136-
dev_prop_val = []
137-
for row in range(self.table.rowCount()):
138-
device_property = self.table.item(row, 0).text()
139-
dev = device_property.split("-")[0]
140-
prop = device_property.split("-")[1]
141-
value = str(self.table.cellWidget(row, 1).value())
142-
dev_prop_val.append((dev, prop, value))
143-
123+
dev_prop_val = self.table.get_state()
144124
preset = self.preset_name_lineedit.text()
145125
if not preset:
146126
preset = self.preset_name_lineedit.placeholderText()
@@ -153,20 +133,3 @@ def _create_first_preset(self) -> None:
153133

154134
self.close()
155135
self.parent().close()
156-
157-
158-
class _Table(QTableWidget):
159-
"""Set table properties for EditPresetWidget."""
160-
161-
def __init__(self) -> None:
162-
super().__init__()
163-
hdr = self.horizontalHeader()
164-
hdr.setSectionResizeMode(hdr.ResizeMode.Stretch)
165-
hdr.setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter)
166-
vh = self.verticalHeader()
167-
vh.setVisible(False)
168-
vh.setSectionResizeMode(vh.ResizeMode.Fixed)
169-
vh.setDefaultSectionSize(24)
170-
self.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
171-
self.setColumnCount(2)
172-
self.setHorizontalHeaderLabels(["Device-Property", "Value"])

src/pymmcore_widgets/_group_preset_widget/_add_preset_widget.py

Lines changed: 8 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import warnings
44

55
from pymmcore_plus import CMMCorePlus
6-
from qtpy.QtCore import Qt
76
from qtpy.QtWidgets import (
87
QDialog,
98
QGroupBox,
@@ -13,15 +12,14 @@
1312
QPushButton,
1413
QSizePolicy,
1514
QSpacerItem,
16-
QTableWidget,
17-
QTableWidgetItem,
1815
QVBoxLayout,
1916
QWidget,
2017
)
2118

22-
from pymmcore_widgets._property_widget import PropertyWidget
2319
from pymmcore_widgets._util import block_core
2420

21+
from ._cfg_table import _CfgTable
22+
2523

2624
class AddPresetWidget(QDialog):
2725
"""A widget to add presets to a specified group."""
@@ -53,7 +51,7 @@ def _create_gui(self) -> None:
5351
top_wdg = self._create_top_wdg()
5452
wdg_layout.addWidget(top_wdg)
5553

56-
self.table = _Table()
54+
self.table = _CfgTable()
5755
wdg_layout.addWidget(self.table)
5856

5957
bottom_wdg = self._create_bottom_wdg()
@@ -114,8 +112,6 @@ def _create_bottom_wdg(self) -> QWidget:
114112
return wdg
115113

116114
def _populate_table(self) -> None:
117-
self.table.clearContents()
118-
119115
dev_prop = []
120116
for preset in self._mmc.getAvailableConfigs(self._group):
121117
dev_prop.extend(
@@ -125,14 +121,7 @@ def _populate_table(self) -> None:
125121
if (k[0], k[1]) not in dev_prop
126122
]
127123
)
128-
129-
self.table.setRowCount(len(dev_prop))
130-
for idx, (dev, prop) in enumerate(dev_prop):
131-
item = QTableWidgetItem(f"{dev}-{prop}")
132-
wdg = PropertyWidget(dev, prop, mmcore=self._mmc)
133-
wdg._value_widget.valueChanged.disconnect() # type: ignore
134-
self.table.setItem(idx, 0, item)
135-
self.table.setCellWidget(idx, 1, wdg)
124+
self.table.populate_table(dev_prop)
136125

137126
def _add_preset(self) -> None:
138127
preset_name = self.preset_name_lineedit.text()
@@ -148,14 +137,7 @@ def _add_preset(self) -> None:
148137
if not preset_name:
149138
preset_name = self.preset_name_lineedit.placeholderText()
150139

151-
dev_prop_val = []
152-
for row in range(self.table.rowCount()):
153-
device_property = self.table.item(row, 0).text()
154-
dev = device_property.split("-")[0]
155-
prop = device_property.split("-")[1]
156-
value = str(self.table.cellWidget(row, 1).value())
157-
dev_prop_val.append((dev, prop, value))
158-
140+
dev_prop_val = self.table.get_state()
159141
for p in self._mmc.getAvailableConfigs(self._group):
160142
dpv_preset = [
161143
(k[0], k[1], k[2]) for k in self._mmc.getConfigData(self._group, p)
@@ -171,28 +153,11 @@ def _add_preset(self) -> None:
171153
return
172154

173155
with block_core(self._mmc.events):
174-
for d, p, v in dev_prop_val:
175-
self._mmc.defineConfig(self._group, preset_name, d, p, v)
156+
for dev, prop, val in dev_prop_val:
157+
self._mmc.defineConfig(self._group, preset_name, dev, prop, val)
176158

177-
self._mmc.events.configDefined.emit(self._group, preset_name, d, p, v)
159+
self._mmc.events.configDefined.emit(self._group, preset_name, dev, prop, val)
178160

179161
self.info_lbl.setStyleSheet("")
180162
self.info_lbl.setText(f"'{preset_name}' has been added!")
181163
self.preset_name_lineedit.setPlaceholderText(self._get_placeholder_name())
182-
183-
184-
class _Table(QTableWidget):
185-
"""Set table properties for EditPresetWidget."""
186-
187-
def __init__(self) -> None:
188-
super().__init__()
189-
hdr = self.horizontalHeader()
190-
hdr.setSectionResizeMode(hdr.ResizeMode.Stretch)
191-
hdr.setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter)
192-
vh = self.verticalHeader()
193-
vh.setVisible(False)
194-
vh.setSectionResizeMode(vh.ResizeMode.Fixed)
195-
vh.setDefaultSectionSize(24)
196-
self.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
197-
self.setColumnCount(2)
198-
self.setHorizontalHeaderLabels(["Device-Property", "Value"])
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from __future__ import annotations
2+
3+
from typing import Any, Sequence, cast
4+
5+
from qtpy.QtCore import Qt
6+
from qtpy.QtWidgets import QTableWidget, QTableWidgetItem
7+
8+
from pymmcore_widgets._property_widget import PropertyWidget
9+
10+
DEV_PROP_ROLE = Qt.ItemDataRole.UserRole + 1
11+
12+
13+
class _CfgTable(QTableWidget):
14+
"""Set table properties for EditPresetWidget."""
15+
16+
def __init__(self) -> None:
17+
super().__init__()
18+
hdr = self.horizontalHeader()
19+
hdr.setSectionResizeMode(hdr.ResizeMode.Stretch)
20+
hdr.setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter)
21+
vh = self.verticalHeader()
22+
vh.setVisible(False)
23+
vh.setSectionResizeMode(vh.ResizeMode.Fixed)
24+
vh.setDefaultSectionSize(24)
25+
self.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
26+
self.setColumnCount(2)
27+
self.setHorizontalHeaderLabels(["Device-Property", "Value"])
28+
29+
def populate_table(self, dev_prop_val: Sequence[Sequence[Any]]) -> None:
30+
self.clearContents()
31+
self.setRowCount(len(dev_prop_val))
32+
for idx, (dev, prop, *_) in enumerate(dev_prop_val):
33+
item = QTableWidgetItem(f"{dev}-{prop}")
34+
item.setData(DEV_PROP_ROLE, (dev, prop))
35+
wdg = PropertyWidget(dev, prop, connect_core=False)
36+
self.setItem(idx, 0, item)
37+
self.setCellWidget(idx, 1, wdg)
38+
39+
def get_state(self) -> list[tuple[str, str, str]]:
40+
dev_prop_val = []
41+
for row in range(self.rowCount()):
42+
if (dev_prop_item := self.item(row, 0)) and (
43+
wdg := cast("PropertyWidget", self.cellWidget(row, 1))
44+
):
45+
dev, prop = dev_prop_item.data(DEV_PROP_ROLE)
46+
dev_prop_val.append((dev, prop, str(wdg.value())))
47+
return dev_prop_val

src/pymmcore_widgets/_group_preset_widget/_edit_preset_widget.py

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import warnings
44

55
from pymmcore_plus import CMMCorePlus
6-
from qtpy.QtCore import Qt
76
from qtpy.QtWidgets import (
87
QComboBox,
98
QDialog,
@@ -14,16 +13,15 @@
1413
QPushButton,
1514
QSizePolicy,
1615
QSpacerItem,
17-
QTableWidget,
18-
QTableWidgetItem,
1916
QVBoxLayout,
2017
QWidget,
2118
)
2219
from superqt.utils import signals_blocked
2320

24-
from pymmcore_widgets._property_widget import PropertyWidget
2521
from pymmcore_widgets._util import block_core
2622

23+
from ._cfg_table import _CfgTable
24+
2725

2826
class EditPresetWidget(QDialog):
2927
"""A widget to edit a specified group's presets."""
@@ -60,7 +58,7 @@ def _create_gui(self) -> None: # sourcery skip: class-extract-method
6058
top_wdg = self._create_top_wdg()
6159
wdg_layout.addWidget(top_wdg)
6260

63-
self.table = _Table()
61+
self.table = _CfgTable()
6462
wdg_layout.addWidget(self.table)
6563

6664
bottom_wdg = self._create_bottom_wdg()
@@ -151,20 +149,12 @@ def _resize_combo_height(self, max_items: int) -> None:
151149
def _populate_table_and_combo(self) -> None:
152150
self._update_combo()
153151

154-
self.table.clearContents()
155-
156152
dev_prop_val = [
157153
(k[0], k[1], k[2])
158154
for k in self._mmc.getConfigData(self._group, self._preset)
159155
]
160-
self.table.setRowCount(len(dev_prop_val))
161-
for idx, (dev, prop, val) in enumerate(dev_prop_val):
162-
item = QTableWidgetItem(f"{dev}-{prop}")
163-
wdg = PropertyWidget(dev, prop, mmcore=self._mmc)
164-
wdg._value_widget.valueChanged.disconnect() # type: ignore
165-
wdg.setValue(val)
166-
self.table.setItem(idx, 0, item)
167-
self.table.setCellWidget(idx, 1, wdg)
156+
157+
self.table.populate_table(dev_prop_val)
168158

169159
def _on_combo_changed(self, preset: str) -> None:
170160
self._preset = preset
@@ -173,13 +163,7 @@ def _on_combo_changed(self, preset: str) -> None:
173163
self._populate_table_and_combo()
174164

175165
def _apply_changes(self) -> None:
176-
dev_prop_val = []
177-
for row in range(self.table.rowCount()):
178-
device_property = self.table.item(row, 0).text()
179-
dev = device_property.split("-")[0]
180-
prop = device_property.split("-")[1]
181-
value = str(self.table.cellWidget(row, 1).value())
182-
dev_prop_val.append((dev, prop, value))
166+
dev_prop_val = self.table.get_state()
183167

184168
for p in self._mmc.getAvailableConfigs(self._group):
185169
dpv_preset = [
@@ -205,29 +189,12 @@ def _apply_changes(self) -> None:
205189
self._preset = self.preset_name_lineedit.text()
206190

207191
with block_core(self._mmc.events):
208-
for d, p, v in dev_prop_val:
209-
self._mmc.defineConfig(self._group, self._preset, d, p, v)
192+
for dev, prop, val in dev_prop_val:
193+
self._mmc.defineConfig(self._group, self._preset, dev, prop, val)
210194

211-
self._mmc.events.configDefined.emit(self._group, self._preset, d, p, v)
195+
self._mmc.events.configDefined.emit(self._group, self._preset, dev, prop, val)
212196

213197
self._update_combo()
214198

215199
self.info_lbl.setStyleSheet("")
216200
self.info_lbl.setText(f"'{self._preset}' has been modified!")
217-
218-
219-
class _Table(QTableWidget):
220-
"""Set table properties for EditPresetWidget."""
221-
222-
def __init__(self) -> None:
223-
super().__init__()
224-
hdr = self.horizontalHeader()
225-
hdr.setSectionResizeMode(hdr.ResizeMode.Stretch)
226-
hdr.setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter)
227-
vh = self.verticalHeader()
228-
vh.setVisible(False)
229-
vh.setSectionResizeMode(vh.ResizeMode.Fixed)
230-
vh.setDefaultSectionSize(24)
231-
self.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
232-
self.setColumnCount(2)
233-
self.setHorizontalHeaderLabels(["Device-Property", "Value"])

0 commit comments

Comments
 (0)