Skip to content

Commit a80443e

Browse files
committed
Panels: __len__, __getitem__, __iter__
1 parent 9381495 commit a80443e

File tree

4 files changed

+32
-25
lines changed

4 files changed

+32
-25
lines changed

cdl/core/gui/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ def calc(self, name: str, param: gds.DataSet | None = None) -> None:
10131013
# ------GUI refresh
10141014
def has_objects(self) -> bool:
10151015
"""Return True if sig/ima panels have any object"""
1016-
return sum(panel.object_number for panel in self.panels) > 0
1016+
return sum(len(panel) for panel in self.panels) > 0
10171017

10181018
def set_modified(self, state: bool = True) -> None:
10191019
"""Set mainwindow modified state"""
@@ -1365,7 +1365,7 @@ def __edit_settings(self) -> None:
13651365
widget = dock.widget()
13661366
if isinstance(widget, DockablePlotWidget):
13671367
widget.update_toolbar_position()
1368-
if option == "ima_defaults" and self.imagepanel.object_number > 0:
1368+
if option == "ima_defaults" and len(self.imagepanel) > 0:
13691369
answer = QW.QMessageBox.question(
13701370
self,
13711371
_("Visualization settings"),

cdl/core/gui/panel/base.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ class AbstractPanel(QW.QSplitter, metaclass=AbstractPanelMeta):
185185
def __init__(self, parent):
186186
super().__init__(QC.Qt.Vertical, parent)
187187
self.setObjectName(self.__class__.__name__[0].lower())
188+
# Check if the class implements __len__, __getitem__ and __iter__
189+
for method in ("__len__", "__getitem__", "__iter__"):
190+
if not hasattr(self, method):
191+
raise NotImplementedError(
192+
f"Class {self.__class__.__name__} must implement method {method}"
193+
)
188194

189195
# pylint: disable=unused-argument
190196
def get_serializable_name(self, obj: ObjItf) -> str:
@@ -217,11 +223,6 @@ def serialize_to_hdf5(self, writer: NativeH5Writer) -> None:
217223
def deserialize_from_hdf5(self, reader: NativeH5Reader) -> None:
218224
"""Deserialize whole panel from a HDF5 file"""
219225

220-
@property
221-
@abc.abstractmethod
222-
def object_number(self):
223-
"""Return object number"""
224-
225226
@abc.abstractmethod
226227
def create_object(self) -> ObjItf:
227228
"""Create and return object"""
@@ -296,15 +297,18 @@ def deserialize_from_hdf5(self, reader: NativeH5Reader) -> None:
296297
self.add_object(obj, group.uuid, set_current=False)
297298
self.selection_changed()
298299

299-
@property
300-
def object_number(self) -> int:
301-
"""Return number of objects in panel
302-
303-
Returns:
304-
number of objects (signals or images)
305-
"""
300+
def __len__(self) -> int:
301+
"""Return number of objects"""
306302
return len(self.objmodel)
307303

304+
def __getitem__(self, nb: int) -> SignalObj | ImageObj:
305+
"""Return object from its number (1 to N)"""
306+
return self.objmodel.get_object_from_number(nb)
307+
308+
def __iter__(self):
309+
"""Iterate over objects"""
310+
return iter(self.objmodel)
311+
308312
def create_object(self) -> SignalObj | ImageObj:
309313
"""Create object (signal or image)
310314
@@ -481,7 +485,7 @@ def remove_object(self) -> None:
481485

482486
def delete_all_objects(self) -> None: # pragma: no cover
483487
"""Confirm before removing all objects"""
484-
if self.object_number == 0:
488+
if len(self) == 0:
485489
return
486490
answer = QW.QMessageBox.warning(
487491
self,

cdl/core/gui/panel/macro.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,18 @@ def deserialize_from_hdf5(self, reader: NativeH5Reader) -> None:
151151
obj = self.deserialize_object_from_hdf5(reader, name)
152152
self.add_object(obj)
153153

154-
@property
155-
def object_number(self) -> int:
156-
"""Return object number
157-
158-
Returns:
159-
int: Number of objects
160-
"""
154+
def __len__(self) -> int:
155+
"""Return number of objects"""
161156
return len(self.__macros)
162157

158+
def __getitem__(self, nb: int) -> Macro:
159+
"""Return object from its number (1 to N)"""
160+
return self.__macros[nb - 1]
161+
162+
def __iter__(self):
163+
"""Iterate over objects"""
164+
return iter(self.__macros)
165+
163166
def create_object(self) -> Macro:
164167
"""Create object.
165168

cdl/tests/scenarios/common.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def __compute_11_operations(panel: SignalPanel | ImagePanel, number: int) -> Non
3434
"""Test compute_11 type operations on a signal or image
3535
3636
Requires that one signal or image has been added at index."""
37-
assert panel.object_number >= number - 1
37+
assert len(panel) >= number - 1
3838
panel.objview.select_objects((number,))
3939
panel.processor.compute_gaussian_filter(dlp.GaussianParam())
4040
panel.processor.compute_moving_average(dlp.MovingAverageParam())
@@ -56,10 +56,10 @@ def compute_common_operations(panel: SignalPanel | ImagePanel) -> None:
5656
First signal/image is supposed to be always the same (reference)
5757
Second signal/image is the tested object
5858
"""
59-
assert panel.object_number == 2
59+
assert len(panel) == 2
6060

6161
panel.objview.select_objects((2,))
62-
panel.processor.compute_difference() # difference with itself
62+
panel.processor.compute_difference(panel[1]) # difference with obj #1
6363
panel.remove_object()
6464
panel.objview.select_objects((2,))
6565
panel.processor.compute_quadratic_difference() # quadratic difference with itself

0 commit comments

Comments
 (0)