Ejemplo n.º 1
0
 def __init__(self,
              on_close: Callable[[], None] = CommonFunctionUtils.noop):
     from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
     super().__init__()
     self._on_close = on_close
     self.slider_application_service = CSFCustomSliderApplicationService()
     self._slider_query_utils = CSFSliderQueryUtils()
 def apply_to_sim(self, sim_info: SimInfo) -> bool:
     """Apply the template to a Sim."""
     from cncustomsliderframework.custom_slider_application_service import CSFCustomSliderApplicationService
     slider_application_service = CSFCustomSliderApplicationService()
     for (slider_identifier,
          amount) in self._slider_to_value_library.items():
         slider_application_service.apply_slider_by_identifier(
             sim_info, slider_identifier, amount)
     return True
Ejemplo n.º 3
0
def _csf_reset_slider(slider_name: str,
                      opt_sim: OptionalSimInfoParam = None,
                      _connection: int = None):
    output = CheatOutput(_connection)
    output('Resetting slider \'{}\'.'.format(slider_name))
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Resetting slider for \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
    custom_sliders = CSFSliderQueryUtils().get_sliders_by_name(
        sim_info, slider_name)
    if not custom_sliders:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    custom_slider = next(iter(custom_sliders))
    if custom_slider is not None:
        output('Slider found.')
    else:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    CSFCustomSliderApplicationService().reset_slider(sim_info, custom_slider)
    output('Success, Sliders reset.')
 def create_from_sim(cls, sim_info: SimInfo,
                     template_name: str) -> 'CSFSliderTemplate':
     """Create a template from a chosen Sim."""
     from cncustomsliderframework.custom_slider_application_service import CSFCustomSliderApplicationService
     slider_application_service = CSFCustomSliderApplicationService()
     slider_to_value_library: Dict[str, float] = dict()
     from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
     for slider in CSFSliderQueryUtils().get_sliders_for_sim(sim_info):
         slider_identifier = slider.unique_identifier
         if slider_identifier in slider_to_value_library:
             continue
         slider_value = slider_application_service.get_current_slider_value(
             sim_info, slider)
         slider_to_value_library[slider_identifier] = slider_value
     return cls(template_name, CommonSimNameUtils.get_full_name(sim_info),
                CommonAge.get_age(sim_info),
                CommonSpecies.get_species(sim_info),
                slider_to_value_library)
Ejemplo n.º 5
0
def _csf_reset_sliders(opt_sim: OptionalSimInfoParam = None,
                       _connection: int = None):
    output = CheatOutput(_connection)
    output('Resetting all sliders.')
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Resetting all sliders for \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    CSFCustomSliderApplicationService().reset_all_sliders(sim_info)
    output('Success, Sliders reset.')
Ejemplo n.º 6
0
def _csf_apply_slider(slider_name: str,
                      amount: float,
                      opt_sim: OptionalSimInfoParam = None,
                      _connection: int = None):
    output = CheatOutput(_connection)
    output('Applying slider \'{}\' with amount \'{}\''.format(
        slider_name, amount))
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Applying slider to \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    facial_attributes = PersistenceBlobs_pb2.BlobSimFacialCustomizationData()
    facial_attributes.MergeFromString(sim_info.facial_attributes)
    from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
    custom_sliders = CSFSliderQueryUtils().get_sliders_by_name(
        sim_info, slider_name)
    if not custom_sliders:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    custom_slider = next(iter(custom_sliders))
    if custom_slider is not None:
        output('Slider found.')
    else:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    # noinspection PyBroadException
    try:
        amount = float(amount)
    except:
        output('Amount must be a number! \'{}\''.format(amount))
        return False
    output('Applying Sim Attributes!')
    return CSFCustomSliderApplicationService().apply_slider(
        sim_info, custom_slider, amount)
Ejemplo n.º 7
0
class CSFCustomizeSlidersDialog(HasLog):
    """ A dialog for changing custom sliders. """
    def __init__(self,
                 on_close: Callable[[], None] = CommonFunctionUtils.noop):
        from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
        super().__init__()
        self._on_close = on_close
        self.slider_application_service = CSFCustomSliderApplicationService()
        self._slider_query_utils = CSFSliderQueryUtils()

    # noinspection PyMissingOrEmptyDocstring
    @property
    def mod_identity(self) -> CommonModIdentity:
        return ModInfo.get_identity()

    # noinspection PyMissingOrEmptyDocstring
    @property
    def log_identifier(self) -> str:
        return 'csf_customize_sliders_dialog'

    def open(self, sim_info: SimInfo, page: int = 1) -> None:
        """ Open the dialog. """
        self.log.format_with_message(
            'Opening customize sliders dialog for Sim.', sim=sim_info)

        def _on_close() -> None:
            self.log.debug('Customize Slider dialog closed.')
            if self._on_close is not None:
                self._on_close()

        option_dialog = CommonChooseObjectOptionDialog(
            CSFStringId.CUSTOMIZE_SLIDERS,
            CSFStringId.CHOOSE_SLIDERS_TO_MODIFY,
            mod_identity=self.mod_identity,
            on_close=_on_close,
            per_page=400)

        def _reopen_dialog() -> None:
            self.log.debug('Reopening customize sliders dialog.')
            self.open(sim_info, page=option_dialog.current_page)

        option_dialog.add_option(
            CommonDialogActionOption(
                CommonDialogOptionContext(
                    CSFStringId.SLIDER_TEMPLATES_NAME,
                    CSFStringId.SLIDER_TEMPLATES_DESCRIPTION,
                    tag_list=[
                        slider_category.name
                        for slider_category in CSFSliderCategory.values
                    ]),
                on_chosen=lambda *_, **__: CSFSliderTemplateDialog(
                    on_close=_reopen_dialog).open(sim_info),
                always_visible=True))

        def _on_reset_all_sliders() -> None:
            self.log.debug('Confirming all sliders reset.')

            def _on_confirm(_) -> None:
                self.log.debug('Resetting all sliders.')
                self.slider_application_service.reset_all_sliders(sim_info)
                _reopen_dialog()

            def _on_cancel(_) -> None:
                self.log.debug('Cancelled resetting of all sliders.')
                _reopen_dialog()

            CommonOkCancelDialog(
                CSFStringId.CONFIRMATION,
                CSFStringId.ARE_YOU_SURE_YOU_WANT_TO_RESET_ALL_SLIDERS,
                mod_identity=self.mod_identity).show(
                    on_ok_selected=_on_confirm, on_cancel_selected=_on_cancel)

        def _on_slider_changed(slider_unique_identifier: str, amount: float,
                               outcome: CommonChoiceOutcome):
            if slider_unique_identifier is None or amount is None or CommonChoiceOutcome.is_error_or_cancel(
                    outcome):
                self.log.debug(
                    'No slider chosen, dialog closed, or no amount specified.')
                _reopen_dialog()
                return
            self.log.debug('Slider changed, attempting to apply.')
            self.slider_application_service.apply_slider_by_identifier(
                sim_info, slider_unique_identifier, amount)
            _reopen_dialog()

        self.log.debug('Opening Customize Slider dialog.')

        option_dialog.add_option(
            CommonDialogActionOption(
                CommonDialogOptionContext(
                    CSFStringId.RESET_ALL_SLIDERS_NAME,
                    CSFStringId.RESET_ALL_SLIDERS_DESCRIPTION,
                    tag_list=[
                        slider_category.name
                        for slider_category in CSFSliderCategory.values
                    ]),
                on_chosen=lambda *_, **__: _on_reset_all_sliders(),
                always_visible=True))

        sliders: Tuple[
            CSFSlider] = self._slider_query_utils.get_sliders_for_sim(sim_info)

        if not sliders:
            from cncustomsliderframework.sliders.slider_query_registry import CSFSliderQueryRegistry
            if CSFSliderQueryRegistry()._collecting:
                CommonOkDialog(
                    CSFStringId.SLIDERS_ARE_STILL_LOADING,
                    CSFStringId.SLIDERS_ARE_STILL_LOADING_DESCRIPTION,
                    description_tokens=(
                        CSFStringId.FINISHED_LOADING_SLIDERS, ),
                    mod_identity=ModInfo.get_identity()).show()
            else:
                CommonOkDialog(CSFStringId.NO_SLIDERS_FOUND,
                               CSFStringId.NO_SLIDERS_FOUND,
                               mod_identity=ModInfo.get_identity()).show()
            _on_close()
            return

        self.log.debug('Adding slider count {}'.format(len(sliders)))
        sorted_sliders = sorted(sliders, key=lambda s: s.name)
        slider_categories: List[CSFSliderCategory] = list()
        object_categories: List[str] = list()
        for custom_slider in sorted_sliders:
            for slider_category in custom_slider.categories:
                if slider_category.name in object_categories:
                    continue
                slider_categories.append(slider_category)
                object_categories.append(slider_category.name)

        def _on_randomize_slider_category(category_name: str,
                                          category: CSFSliderCategory):
            self.log.debug(
                'Confirming reset of sliders in category {}.'.format(
                    category_name))

            def _on_confirm(_) -> None:
                self.log.debug(
                    'Randomizing all sliders in category {}.'.format(
                        category_name))
                for slider in sorted_sliders:
                    if category not in slider.categories:
                        continue
                    self.slider_application_service.apply_random(
                        sim_info, slider)
                _reopen_dialog()

            def _on_cancel(_) -> None:
                self.log.debug(
                    'Cancelled randomization of sliders in category {}.'.
                    format(category_name))
                _reopen_dialog()

            CommonOkCancelDialog(CSFStringId.CONFIRMATION,
                                 CSFStringId.RANDOMIZE_SLIDER_CONFIRMATION,
                                 mod_identity=self.mod_identity).show(
                                     on_ok_selected=_on_confirm,
                                     on_cancel_selected=_on_cancel)

        for slider_category in slider_categories:
            option_dialog.add_option(
                CommonDialogSelectOption(
                    slider_category.name,
                    slider_category,
                    CommonDialogOptionContext(
                        CSFStringId.RANDOMIZE_SLIDER_NAME,
                        CSFStringId.RANDOMIZE_SLIDER_DESCRIPTION,
                        title_tokens=(slider_category.name, ),
                        description_tokens=(slider_category.name, ),
                        tag_list=[
                            slider_category.name
                            for slider_category in CSFSliderCategory.values
                        ]),
                    on_chosen=_on_randomize_slider_category,
                    always_visible=True))

        for custom_slider in sorted_sliders:
            if custom_slider.description is not None:
                # noinspection PyTypeChecker
                option_description = CommonLocalizationUtils.create_localized_string(
                    custom_slider.description,
                    tokens=(str(0.0), str(custom_slider.minimum_value),
                            str(custom_slider.maximum_value)))
            else:
                # noinspection PyTypeChecker
                option_description = CommonLocalizationUtils.create_localized_string(
                    CSFStringId.CHANGE_THE_SLIDER,
                    tokens=(custom_slider.display_name, ))

            option_dialog.add_option(
                CommonDialogInputFloatOption(
                    custom_slider.unique_identifier,
                    self.slider_application_service.get_current_slider_value(
                        sim_info, custom_slider),
                    CommonDialogOptionContext(
                        custom_slider.display_name,
                        option_description,
                        icon=custom_slider.icon_id or None,
                        tag_list=tuple([
                            category.name
                            for category in custom_slider.categories
                        ])),
                    min_value=custom_slider.minimum_value,
                    max_value=custom_slider.maximum_value,
                    on_chosen=_on_slider_changed,
                    dialog_description_identifier=CSFStringId.DEFAULT_MIN_MAX,
                    dialog_description_tokens=(
                        option_description, str(0.0),
                        str(custom_slider.minimum_value),
                        str(custom_slider.maximum_value))))

        categories: List[CommonDialogObjectOptionCategory] = list()

        for category in object_categories:
            # noinspection PyTypeChecker
            categories.append(
                CommonDialogObjectOptionCategory(
                    category, icon=CommonIconId.S4CLIB_UNFILLED_CIRCLE_ICON))

        self.log.debug('Showing slider options.')

        option_dialog.show(sim_info=sim_info, page=page, categories=categories)