def __init__()

in src/open_vp_cal/widgets/project_settings_widget.py [0:0]


    def __init__(self,
                 project_settings_view,
                 led_settings_view,
                 led_analysis_settings_view,
                 plate_settings_view, model, parent=None):
        """
        Constructs all the necessary attributes for the Controller object.

        Parameters
        ----------
        project_settings_view: View
            instance of the View class
        model: Model
            instance of the Model class
        parent: QWidget, optional
            parent widget (default is None)
        """
        super().__init__(parent)
        self.project_settings_view = project_settings_view
        self.led_settings_view = led_settings_view
        self.led_analysis_settings_view = led_analysis_settings_view
        self.plate_settings_view = plate_settings_view
        self.model = model
        self.reference_wall_widget = self.plate_settings_view.reference_wall
        self.match_reference_wall_widget = self.plate_settings_view.match_reference_wall
        self.use_white_point_offset_widget = self.plate_settings_view.use_white_point_offset
        self.white_point_offset_source_widget = self.plate_settings_view.white_point_offset_source
        self.white_point_offset_source_button_widget = self.plate_settings_view.white_point_offset_source_button

        self.reference_wall_widget.setEnabled(
            self.match_reference_wall_widget.checkState() == Qt.Checked
        )

        # Connect view signals to model slots
        self.led_settings_view.target_gamut.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.TARGET_GAMUT, self.led_settings_view.target_gamut.currentText())
        )
        self.led_settings_view.target_eotf.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.TARGET_EOTF, self.led_settings_view.target_eotf.currentText())
        )
        self.led_settings_view.target_max_lum_nits.valueChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.TARGET_MAX_LUM_NITS, self.led_settings_view.target_max_lum_nits.value())
        )
        self.led_settings_view.primaries_saturation.valueChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.PRIMARIES_SATURATION, self.led_settings_view.primaries_saturation.value())
        )
        self.led_settings_view.num_grey_patches.valueChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.NUM_GREY_PATCHES, self.led_settings_view.num_grey_patches.value()))

        self.project_settings_view.frames_per_patch.valueChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.FRAMES_PER_PATCH, self.project_settings_view.frames_per_patch.value())
        )
        self.project_settings_view.frame_rate.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.FRAME_RATE, float(self.project_settings_view.frame_rate.currentText()))
        )
        self.project_settings_view.export_lut_for_aces_cct.stateChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.EXPORT_LUT_FOR_ACES_CCT,
                self.project_settings_view.export_lut_for_aces_cct.isChecked())
        )
        self.project_settings_view.export_lut_for_aces_cct_in_target_out.stateChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.EXPORT_LUT_FOR_ACES_CCT_IN_TARGET_OUT,
                self.project_settings_view.export_lut_for_aces_cct_in_target_out.isChecked())
        )
        self.led_analysis_settings_view.export_lut_for_aces_cct.stateChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.EXPORT_LUT_FOR_ACES_CCT,
                self.led_analysis_settings_view.export_lut_for_aces_cct.isChecked())
        )
        self.led_analysis_settings_view.export_lut_for_aces_cct_in_target_out.stateChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.EXPORT_LUT_FOR_ACES_CCT_IN_TARGET_OUT,
                self.led_analysis_settings_view.export_lut_for_aces_cct_in_target_out.isChecked())
        )
        self.project_settings_view.output_folder.textChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.OUTPUT_FOLDER, self.project_settings_view.output_folder.text()))
        self.project_settings_view.file_format.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.FILE_FORMAT, self.project_settings_view.file_format.currentText()))
        self.project_settings_view.resolution_width.valueChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.RESOLUTION_WIDTH, self.project_settings_view.resolution_width.value()))
        self.project_settings_view.resolution_height.valueChanged.connect(
            lambda: self.model.set_data(
                constants.ProjectSettingsKeys.RESOLUTION_HEIGHT, self.project_settings_view.resolution_height.value()))
        self.plate_settings_view.input_plate_gamut.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.INPUT_PLATE_GAMUT, self.plate_settings_view.input_plate_gamut.currentText()))
        self.plate_settings_view.native_camera_gamut.currentIndexChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.NATIVE_CAMERA_GAMUT,
                                        self.plate_settings_view.native_camera_gamut.currentText()))
        self.plate_settings_view.match_reference_wall.stateChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.MATCH_REFERENCE_WALL,
                self.plate_settings_view.match_reference_wall.isChecked()))
        self.plate_settings_view.reference_wall.currentIndexChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.REFERENCE_WALL, self.plate_settings_view.reference_wall.currentText()))
        self.plate_settings_view.use_white_point_offset.stateChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.USE_WHITE_POINT_OFFSET,
                self.plate_settings_view.use_white_point_offset.isChecked()))
        self.plate_settings_view.white_point_offset_source.textChanged.connect(
            lambda: self.model.set_data(
                constants.LedWallSettingsKeys.WHITE_POINT_OFFSET_SOURCE,
                self.plate_settings_view.white_point_offset_source.text()))
        self.led_analysis_settings_view.target_to_screen_cat.currentIndexChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.TARGET_TO_SCREEN_CAT,
                                        self.led_analysis_settings_view.target_to_screen_cat.currentText()))
        self.led_analysis_settings_view.reference_to_target_cat.currentIndexChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.REFERENCE_TO_TARGET_CAT,
                                        self.led_analysis_settings_view.reference_to_target_cat.currentText()))
        self.plate_settings_view.auto_wb_source.stateChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.AUTO_WB_SOURCE,
                                        self.plate_settings_view.auto_wb_source.isChecked()))
        self.led_analysis_settings_view.enable_gamut_compression.stateChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.ENABLE_GAMUT_COMPRESSION,
                                        self.led_analysis_settings_view.enable_gamut_compression.isChecked()))
        self.led_analysis_settings_view.avoid_clipping.stateChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.AVOID_CLIPPING,
                                        self.led_analysis_settings_view.avoid_clipping.isChecked()))
        self.led_analysis_settings_view.enable_eotf_correction.stateChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.ENABLE_EOTF_CORRECTION,
                                        self.led_analysis_settings_view.enable_eotf_correction.isChecked()))
        self.led_analysis_settings_view.calculation_order.currentIndexChanged.connect(
            lambda: self.model.set_data(constants.LedWallSettingsKeys.CALCULATION_ORDER,
                                        self.led_analysis_settings_view.calculation_order.currentText()))
        self.project_settings_view.custom_logo_path.textChanged.connect(
            lambda: self.model.set_data(constants.ProjectSettingsKeys.CUSTOM_LOGO_PATH,
                                        self.project_settings_view.custom_logo_path.text()))

        self.led_settings_view.gamut_dialog_button.clicked.connect(self.open_custom_gamut_dialog)
        self.project_settings_view.output_folder_button.clicked.connect(self.open_folder_select_dialog)
        self.project_settings_view.custom_logo_button.clicked.connect(self.open_logo_select_dialog)
        self.plate_settings_view.white_point_offset_source_button.clicked.connect(
            self.open_white_point_source_dialog)

        self.match_reference_wall_widget.stateChanged.connect(self.on_match_reference_wall_changed)
        self.model.led_wall_removed.connect(self.on_led_wall_removed)
        self.model.led_wall_added.connect(self.on_led_wall_added)
        self.model.register_custom_gamut_from_load.connect(self.add_custom_gamut_to_ui)

        # Connect model signals to view slots
        self.model.data_changed.connect(self.on_model_data_changed)

        for view in self.get_views():
            for key, widget in view.__dict__.items():
                self.update_widgets(key, widget)

        if not self.model.current_wall:
            for view in self.get_views():
                view.disable()