fixed keeping pointer to selected widget which can cause c++ issues

This commit is contained in:
iLLiCiTiT 2021-09-14 14:53:50 +02:00
parent da17d312ac
commit 773b011b8a

View file

@ -21,7 +21,7 @@ from ..constants import (
class FamilyWidget(QtWidgets.QWidget):
selected = QtCore.Signal(str, str)
active_changed = QtCore.Signal()
removed = QtCore.Signal(str)
removed_selected = QtCore.Signal()
def __init__(self, family, family_icon, parent):
super(FamilyWidget, self).__init__(parent)
@ -59,6 +59,12 @@ class FamilyWidget(QtWidgets.QWidget):
for widget in self._widgets_by_id.values():
widget.update_instance_values()
def confirm_remove_instance_id(self, instance_id):
widget = self._widgets_by_id.pop(instance_id)
widget.setVisible(False)
self._content_layout.removeWidget(widget)
widget.deleteLater()
def update_instances(self, instances):
instances_by_id = {}
instances_by_subset_name = collections.defaultdict(list)
@ -72,8 +78,10 @@ class FamilyWidget(QtWidgets.QWidget):
continue
widget = self._widgets_by_id.pop(instance_id)
if widget.is_selected:
self.removed_selected.emit()
widget.setVisible(False)
self.removed.emit(instance_id)
self._content_layout.removeWidget(widget)
widget.deleteLater()
@ -105,6 +113,10 @@ class CardWidget(ClickableFrame):
self._selected = False
self._id = None
@property
def is_selected(self):
return self._selected
def set_selected(self, selected):
if selected == self._selected:
return
@ -292,11 +304,10 @@ class InstanceCardView(AbstractInstanceView):
self._content_widget = content_widget
self._widgets_by_family = {}
self._family_widgets_by_name = {}
self._context_widget = None
self._selected_widget = None
self._selected_widget_id = None
self._selected_instance_family = None
self._selected_instance_id = None
self.setSizePolicy(
QtWidgets.QSizePolicy.Minimum,
@ -315,16 +326,33 @@ class InstanceCardView(AbstractInstanceView):
result.setWidth(width)
return result
def _get_selected_widget(self):
if self._selected_instance_id == CONTEXT_ID:
return self._context_widget
family_widget = self._widgets_by_family.get(
self._selected_instance_family
)
if family_widget is not None:
widget = family_widget.get_widget_by_instance_id(
self._selected_instance_id
)
if widget is not None:
return widget
return None
def refresh(self):
if not self._context_widget:
if self._context_widget is None:
widget = ContextCardWidget(self._content_widget)
widget.selected.connect(self._on_widget_selection)
widget.set_selected(True)
self._context_widget = widget
self.selection_changed.emit()
self._content_layout.insertWidget(0, widget)
self._context_widget = widget
self._selected_widget = widget
self._selected_widget_id = CONTEXT_ID
self.select_item(CONTEXT_ID, None)
instances_by_family = collections.defaultdict(list)
for instance in self.controller.instances:
@ -335,6 +363,8 @@ class InstanceCardView(AbstractInstanceView):
if family in instances_by_family:
continue
if family == self._selected_instance_family:
self._on_remove_selected()
widget = self._widgets_by_family.pop(family)
widget.setVisible(False)
self._content_layout.removeWidget(widget)
@ -350,7 +380,9 @@ class InstanceCardView(AbstractInstanceView):
)
family_widget.active_changed.connect(self._on_active_changed)
family_widget.selected.connect(self._on_widget_selection)
family_widget.removed.connect(self._on_remove)
family_widget.removed_selected.connect(
self._on_remove_selected
)
self._content_layout.insertWidget(widget_idx, family_widget)
self._widgets_by_family[family] = family_widget
else:
@ -365,42 +397,44 @@ class InstanceCardView(AbstractInstanceView):
def _on_active_changed(self):
self.active_changed.emit()
def _on_widget_selection(self, widget_id, family):
if widget_id == CONTEXT_ID:
def _on_widget_selection(self, instance_id, family):
self.select_item(instance_id, family)
def select_item(self, instance_id, family):
if instance_id == CONTEXT_ID:
new_widget = self._context_widget
else:
family_widget = self._widgets_by_family[family]
new_widget = family_widget.get_widget_by_instance_id(widget_id)
new_widget = family_widget.get_widget_by_instance_id(instance_id)
if new_widget is self._selected_widget:
selected_widget = self._get_selected_widget()
if new_widget is selected_widget:
return
if self._selected_widget is not None:
self._selected_widget.set_selected(False)
if selected_widget is not None:
selected_widget.set_selected(False)
self._selected_widget_id = widget_id
self._selected_widget = new_widget
self._selected_instance_id = instance_id
self._selected_instance_family = family
if new_widget is not None:
new_widget.set_selected(True)
self.selection_changed.emit()
def _on_remove(self, widget_id):
if widget_id != self._selected_widget_id:
return
self._selected_widget = self._context_widget
self._selected_widget_id = CONTEXT_ID
self._context_widget.set_selected(True)
def _on_remove_selected(self):
selected_widget = self._get_selected_widget()
if selected_widget is None:
self._on_widget_selection(CONTEXT_ID, None)
def get_selected_items(self):
instances = []
context_selected = False
if self._selected_widget is self._context_widget:
selected_widget = self._get_selected_widget()
if selected_widget is self._context_widget:
context_selected = True
elif self._selected_widget is not None:
instances.append(self._selected_widget.instance)
elif selected_widget is not None:
instances.append(selected_widget.instance)
return instances, context_selected