Source code for arthropod_describer.label_editor.computation_widget

from typing import Optional, Union

from PySide2.QtCore import Signal, QSortFilterProxyModel, Qt, QItemSelection
from PySide2.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QMenu, QAction

from arthropod_describer.common.plugin import PropertyComputation, RegionComputation
from arthropod_describer.common.state import State
from arthropod_describer.common.user_params import UserParamWidgetBinding, create_params_widget
from arthropod_describer.label_editor.ui_computation import Ui_Computations
from arthropod_describer.plugin_manager import RegionCompsListModel, ProcessType


[docs]class ComputationWidget(QWidget): apply_computation = Signal([RegionComputation, ProcessType]) def __init__(self, state: State, parent: Optional[QWidget] = None): QWidget.__init__(self, parent) self.settings_group_shown:bool = True self.restrict_group_shown: bool = True self._current_colormap_model = None self.ui = Ui_Computations() self.ui.setupUi(self) self.ui.grpRegionSettings.setLayout(QVBoxLayout()) # self.ui.scrollSettings.setLayout(QVBoxLayout()) self.state = state self.state.update_used_label_list.connect(self._update_region_restrict_model) self.computations_model = RegionCompsListModel() self.current_computation_idx: int = -1 self.ui.cmbRegComps.setModel(self.computations_model) self.ui.cmbRegComps.currentIndexChanged.connect(self._handle_computation_selected) self._comp_param_widget: QWidget = QWidget() self._current_reg_comp: Optional[RegionComputation] = None self._param_binding: Optional[UserParamWidgetBinding] = UserParamWidgetBinding(self.state) self.ui.btnRegApply.clicked.connect(self.handle_apply_clicked) self.ui.btnRegApplyAll.clicked.connect(self.handle_apply_all_clicked) self._btnRegApplyAllMenu = QMenu() self.action_applyToUnsegmented = QAction('Apply to all unsegmented') self.action_applyToUnsegmented.triggered.connect(self.handle_apply_all_unseg_clicked) self._btnRegApplyAllMenu.addAction(self.action_applyToUnsegmented) self.ui.btnRegApplyAll.setMenu(self._btnRegApplyAllMenu) # self.ui.btnRegApplyAllUnseg.clicked.connect(self.handle_apply_all_unseg_clicked) self.region_restrict_model = QSortFilterProxyModel() # FIXME set a correct color model #self.region_restrict_model.setSourceModel(self.state.colormap) self.ui.regRestrictView.setModel(self.region_restrict_model) self.region_restrict_model.setFilterRole(Qt.UserRole + 3) self.region_restrict_model.setFilterFixedString('used') self.selected_regions = [] self.region_sel_model: QItemSelection = self.ui.regRestrictView.selectionModel() self.region_sel_model.selectionChanged.connect(self._handle_label_selection_changed)
[docs] def handle_apply_clicked(self, chkd: bool): self.apply_computation.emit(self.computations_model.region_comps[self.current_computation_idx], ProcessType.SELECTED_PHOTOS)
[docs] def handle_apply_all_clicked(self, chkd: bool): self.apply_computation.emit(self.computations_model.region_comps[self.current_computation_idx], ProcessType.ALL_PHOTOS)
[docs] def handle_apply_all_unseg_clicked(self, chkd: bool): self.apply_computation.emit(self.computations_model.region_comps[self.current_computation_idx], ProcessType.ALL_UNSEGMENTED)
[docs] def register_computation(self, computation: Union[RegionComputation, PropertyComputation]): self.computations_model.add_computation(computation) if self.current_computation_idx < 0: self.ui.cmbRegComps.setCurrentIndex(0)
def _handle_computation_selected(self, idx: int): self.current_computation_idx = idx computation = self.computations_model.region_comps[self.current_computation_idx] self.ui.lblRegDesc.setText(computation.info.description) # self.ui.lblCompDesc.setText(computation.info.description) if self._comp_param_widget is not None: self.ui.grpRegionSettings.layout().removeWidget(self._comp_param_widget) # self.ui.scrollSettings.layout().removeWidget(self._comp_param_widget) self._param_binding.param_widget = None self._param_binding.user_params = dict() self._comp_param_widget.deleteLater() self._comp_param_widget = None if len(computation.user_params) > 0: self._comp_param_widget = create_params_widget(computation.user_params, self.state) self._param_binding.bind(computation.user_params, self._comp_param_widget) self.ui.grpRegionSettings.layout().addWidget(self._comp_param_widget) # self.ui.scrollSettings.layout().addWidget(self._comp_param_widget) self.ui.grpRegionSettings.setVisible(self.settings_group_shown and True) # self.ui.scrollSettings.setVisible(self.settings_group_shown and True) else: self.ui.grpRegionSettings.setVisible(False) # self.ui.scrollSettings.setVisible(False) # self.ui.grpRegRestrict.setVisible(self.restrict_group_shown and computation.region_restricted) self.ui.grpRegRestrict.setVisible(False) # self.ui.pgRegionRestriction.setVisible(self.restrict_group_shown and computation.region_restricted) # self.ui.scrollRegionRestrictions.update() # self.ui.pgRegionRestriction.update() self.ui.grpRegionSettings.update() if computation.region_restricted: self.region_restrict_model.setSourceModel(self._current_colormap_model) self.region_restrict_model.setFilterFixedString('used') self.ui.regRestrictView.setModel(self.region_restrict_model) else: self.region_restrict_model.setFilterFixedString('') self.ui.regRestrictView.setVisible(self.restrict_group_shown and computation.region_restricted) def _handle_label_selection_changed(self, selection: QItemSelection): indexes = self.region_sel_model.selectedIndexes() self.selected_regions.clear() for index in indexes: self.selected_regions.append(self.region_restrict_model.data(index, Qt.UserRole)) def _update_region_restrict_model(self): self.region_restrict_model.setSourceModel(self._current_colormap_model) self.ui.regRestrictView.update()
[docs] def set_restrict_group_shown(self, shown: bool): self.restrict_group_shown = shown # self.ui.pgRegionRestriction.setHidden(not shown) self.ui.grpRegRestrict.setHidden(not shown)
[docs] def set_settings_group_shown(self, shown: bool): self.settings_group_shown = shown self.ui.grpRegionSettings.setHidden(not shown)
# self.ui.pgSettings.setHidden(not shown) # if not shown: # self.ui.toolBox.removeItem(1)