diff --git a/CHANGELOG.md b/CHANGELOG.md index 21f8e79768..54ad765b77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed +* Updated `ViewerSceneObject` with hash ability in order to catch the update from `settings`. ### Removed diff --git a/src/compas_viewer/components/color.py b/src/compas_viewer/components/color.py index 48b4b7a7af..82a8f0d0e3 100644 --- a/src/compas_viewer/components/color.py +++ b/src/compas_viewer/components/color.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING +from PySide6.QtCore import Qt from PySide6.QtGui import QColor from PySide6.QtWidgets import QColorDialog from PySide6.QtWidgets import QPushButton @@ -180,8 +181,10 @@ def __init__( default_color = QColor(*remap_rgb(default_color, to_range_one=False)) self.color_button = QPushButton(self) + self.color_button.setMaximumSize(70, 25) self.layout = QVBoxLayout(self) self.layout.addWidget(self.color_button) + self.layout.setAlignment(Qt.AlignCenter) self.color_button.clicked.connect(self.open_color_dialog) self.set_button_color(default_color) diff --git a/src/compas_viewer/components/sceneform.py b/src/compas_viewer/components/sceneform.py index 76f39c0356..7abe68a629 100644 --- a/src/compas_viewer/components/sceneform.py +++ b/src/compas_viewer/components/sceneform.py @@ -67,7 +67,8 @@ def scene(self): return self.viewer.scene def update(self): - if list(self.scene.objects) == self._sceneobjects: + current_scene_objects = [hash(obj) for obj in self.scene.objects] + if current_scene_objects == self._sceneobjects: for node in self.scene.traverse("breadthfirst"): widget = node.attributes.get("widget") if widget: @@ -77,7 +78,7 @@ def update(self): self.scrollToItem(widget) else: - self._sceneobjects = list(self.scene.objects) + self._sceneobjects = [hash(obj) for obj in self.scene.objects] self.clear() self.checkbox_columns = {} diff --git a/src/compas_viewer/components/slider.py b/src/compas_viewer/components/slider.py index 1b085f9102..cd6670fe52 100644 --- a/src/compas_viewer/components/slider.py +++ b/src/compas_viewer/components/slider.py @@ -99,11 +99,11 @@ def __init__( self._min_label = QLabel(str(self.min_val), alignment=Qt.AlignLeft) self._max_label = QLabel(str(self.max_val), alignment=Qt.AlignRight) self.value_label = QLabel(f"{self.title}:") - self.text_edit = TextEdit(str(self.starting_val)) - self.text_edit.text_edit.textChanged.connect(self.text_update) + self.text_widget = TextEdit(str(self.starting_val)) + self.text_widget.text_edit.textChanged.connect(self.text_update) self._text_layout.addWidget(self.value_label) - self._text_layout.addWidget(self.text_edit.text_edit) + self._text_layout.addWidget(self.text_widget.text_edit) # Add widgets to layout self._domain_layout.addWidget(self._min_label) @@ -135,7 +135,7 @@ def on_value_changed(self, value): return self._updating = True scaled_value = round(value * self.step, 2) - self.text_edit.text_edit.setText(str(scaled_value)) + self.text_widget.text = str(scaled_value) if self.action: self.action(self, scaled_value) self._updating = False @@ -145,7 +145,7 @@ def text_update(self): return self._updating = True try: - value = float(self.text_edit.text_edit.toPlainText()) / self.step + value = float(self.text_widget.text) / self.step self.slider.setValue(value) if self.action: self.action(self, value * self.step) diff --git a/src/compas_viewer/components/textedit.py b/src/compas_viewer/components/textedit.py index bf34df8171..f2571c929f 100644 --- a/src/compas_viewer/components/textedit.py +++ b/src/compas_viewer/components/textedit.py @@ -20,15 +20,24 @@ def __init__( self.text_edit = QTextEdit() self.text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.text_edit.setMaximumSize(85, 25) + self.text_edit.setMaximumSize(70, 25) self.text_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) - self.text_edit.setText(text) + self.text = text self.layout = self.default_layout self.layout.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.text_edit) self.setLayout(self.layout) + @property + def text(self) -> str: + return self.text_edit.toPlainText() + + @text.setter + def text(self, text: str) -> None: + self.text_edit.setText(text) + self.text_edit.setAlignment(Qt.AlignRight) + @property def default_layout(self): if self._default_layout is None: diff --git a/src/compas_viewer/scene/sceneobject.py b/src/compas_viewer/scene/sceneobject.py index b7d1d7f543..e56df0da13 100644 --- a/src/compas_viewer/scene/sceneobject.py +++ b/src/compas_viewer/scene/sceneobject.py @@ -95,6 +95,7 @@ def __init__( ): # Basic super().__init__(**kwargs) + self.kwargs = kwargs self.show = show self.show_points = show_points if show_points is not None else False self.show_lines = show_lines if show_lines is not None else True @@ -128,6 +129,11 @@ def __init__( self._inited = False + def __hash__(self): + # Convert self.settings.items() to a hashable type (e.g., frozenset) but convert Color objects to tuples + hashable_settings = frozenset((key, (value.rgb255 if isinstance(value, Color) else value)) for key, value in self.settings.items()) + return hash(hashable_settings) + @property def bounding_box(self): return self._bounding_box