Ejemplo n.º 1
0
class MainController:
    event_is_exec = False  # Fix double messege shows

    def __init__(self, model):
        super().__init__()
        self.model = model
        self.data_loader = DataLoader()
        self.tranlator = Translator.get_translator('main')
        self.logger = logging.getLogger(LOGGER_NAME)
        CrossEvent.reload_scenarios_event += self.reload_scenarios
        CrossEvent.locale_changed_event += self.reloads

    def exec(self):
        self.reload_modules()
        self.reload_scenarios()
        self.model.set_locales(Locales.get_locales())
        self.model.is_options_enabled = self.data_loader.get_config_param(
            Constants.OPTIONS_ENABLED_PARAM) or False
        self.reload_setting()

    def reload_modules(self):
        self.data_loader.load_modules()
        self.model.update_modules()

    def reload_scenarios(self):
        self.data_loader.load_scenarios()
        self.model.update_scenarios()

    def start_scenario(self, scenario, opt_enb):
        self.logger.debug(f'Start {scenario.name}')
        check_mod = all(r_mod.is_enabled
                        for r_mod in scenario.required_modules)
        if not check_mod:
            title = self.tranlator.translate('WARNING_TEXT')
            msg = self.tranlator.translate('REQ_MODS_NOT_ENB_TEXT')
            self.logger.debug(msg)
            CrossEvent.show_message_event.emit(MsgType.WARN, title, msg)
            return

        CrossEvent.load_scenario_event.emit(scenario, opt_enb)
        CrossEvent.change_screen_event.emit(ScI.SCENARIO)

    def set_editor_mode(self, value):
        self.model.editor_mode = value

    @staticmethod
    def start_editor(mode, *args):
        CrossEvent.start_editor_event.emit(mode, *args)
        CrossEvent.change_screen_event.emit(ScI.EDITOR)

    def delete_scenarios(self, scenarios):
        def _action():
            [self.data_loader.remove_scenario(sc) for sc in scenarios]
            self.reload_scenarios()

        title = self.tranlator.translate('QUESTION_TITLE')
        msg = self.tranlator.translate('REMOVE_SELECTED_TEXT')
        CrossEvent.show_question_event.emit(title, msg, _action)

    def reloads(self):
        self.reload_modules()
        self.reload_scenarios()

    def set_is_options_enabled(self, value):
        self.model.is_options_enabled = value
        self.data_loader.set_config_param(Constants.OPTIONS_ENABLED_PARAM,
                                          value)

    def select_locale(self, value):
        self.model.current_locale = value

    def show_dir_warning(self):
        if self.event_is_exec:
            return
        self.event_is_exec = True
        title = self.tranlator.translate('WARNING_TEXT')
        msg = self.tranlator.translate('DIR_NOT_FOUND_TEXT')
        CrossEvent.show_message_event.emit(MsgType.WARN, title, msg)
        self.event_is_exec = False

    def set_modules_dir(self, value):
        if not os.path.isdir(value):
            self.show_dir_warning()
            return
        self.model.modules_dir = value

    def set_scenario_dir(self, value):
        if not os.path.isdir(value):
            self.show_dir_warning()
            return
        self.model.scenarios_dir = value

    def apply_settings(self):
        self.data_loader.set_config_param(Constants.MODULES_DIR,
                                          self.model.modules_dir)
        self.reload_modules()
        self.data_loader.set_config_param(Constants.SCENARIOS_DIR,
                                          self.model.scenarios_dir)
        self.reload_scenarios()
        self.data_loader.set_config_param(Constants.LOCALE,
                                          self.model.current_locale)
        Translator.set_locale(self.model.current_locale)
        self.model.is_applied_settings = True

    def reload_setting(self):
        self.model.modules_dir = self.data_loader.modules_dir
        self.model.scenarios_dir = self.data_loader.scenarios_dir
        self.model.current_locale = Translator.get_locale()
        self.model.is_applied_settings = True
Ejemplo n.º 2
0
class EditorController:

    WIDGETS = {}
    MODS = {}

    _save_index = -1

    def __init__(self, model):
        self.model = model
        self.data_loader = DataLoader()
        self.tranlator = Translator.get_translator('main')
        CrossWidgetEvents.start_editor_event += self.start_editor_handler
        self.memento_manager = MementoManager()
        self.memento_manager.can_undo_changed += self.model.can_undo_changed.emit
        self.memento_manager.can_redo_changed += self.model.can_redo_changed.emit
        self.memento_manager.index_changed += \
            lambda x: self.model.can_save_changed.emit(self.can_save)

    @property
    def can_save(self):
        return self._save_index != self.memento_manager.index

    def load_modules(self):
        self.model.blocks = [
            m for m in self.data_loader.modules.values() if m.is_enabled
        ]

    # region start editor methods

    def start_editor_handler(self, mode, *args):
        if mode == eMode.CREATE_NEW:
            self.create_new_scenario()
        elif mode == eMode.CREATE_FROM:
            self.create_from_scenarios(*args)
        elif mode == eMode.LOAD:
            self.load_scenario(*args)
        else:
            raise ValueError('Inccorect editor mode')
        self.memento_manager.set_subject(self.model.scenario)
        self.load_modules()
        self._save_index = -1

    def create_new_scenario(self):
        def_name = self.tranlator.translate('UNTITLED_TEXT')
        self.model.scenario = Scenario(f'<{def_name}>')

    def create_from_scenarios(self, scenarios):
        names = []
        req_mods = set()
        sc_data = []

        for sc in scenarios:
            names.append(sc.name)
            req_mods.update(sc.required_modules)
            sc_data.extend(sc.scenario_data)

        new_name = ', '.join(names)
        self.model.scenario = Scenario(new_name,
                                       required_modules=req_mods,
                                       scenario_data=sc_data)

    def load_scenario(self, scenario):
        self.model.scenario = scenario

    # endregion

    # region UI handlers

    def save_scenario(self):
        old_sc_name = next((name
                            for name, sc in self.data_loader.scenarios.items()
                            if sc == self.model.scenario), None)
        if old_sc_name:
            self.data_loader.remove_scenario(old_sc_name)
        self.data_loader.save_scenario(self.model.scenario)
        self._save_index = self.memento_manager.index
        self.model.can_save_changed.emit(self.can_save)

    def undo(self):
        self.memento_manager.undo()

    def redo(self):
        self.memento_manager.redo()

    def back_to_menu(self, *args):
        def _return_action():
            self.WIDGETS.clear()
            CrossWidgetEvents.reload_scenarios_event.emit()
            CrossWidgetEvents.change_screen_event.emit(ScI.MAIN)

        def _cancel_action():
            self.memento_manager.cancel()
            _return_action()

        if self.can_save:
            title = self.tranlator.translate('QUESTION_TITLE')
            msg = self.tranlator.translate('CANCEL_UNSAVED_TEXT')
            CrossWidgetEvents.show_question_event.emit(title, msg,
                                                       _cancel_action)
        else:
            _return_action()

    def set_sc_block_index(self, value):
        self.model.current_sc_block_index = value
        self.apply_sc_block()

    def apply_sc_block(self):
        curr_sc_block = self.model.get_current_sc_block()
        if curr_sc_block:
            mod_init = curr_sc_block.module.init
            q_types = mod_init.get_question_types()
            li_wid = mod_init.get_editor_listitem_widget_cls()
            bl_wid = mod_init.get_editor_block_widget()
        else:
            q_types, li_wid, bl_wid = None, None, None

        self.model.quest_types = q_types
        self.model.listitem_widget = li_wid
        self.model.block_widget = bl_wid
        self.model.send_sc_block()

    def set_data_index(self, value):
        self.model.current_data_index = value

    # endregion

    # region actions with record history
    def add_block(self, block):
        bl = ScenarioData.empty_init(block)
        self.model.append_scenario_data(bl)

    def remove_block(self, block):
        self.model.remove_scenario_data(block)

    def add_block_data(self):
        mod_init = self.model.get_current_sc_block().module.init
        self.model.append_block_data(mod_init.create_new_data_object())

    def remove_block_data(self, value):
        self.model.remove_block_data(value)

    def set_quest_type(self, value):
        if value:
            self.model.current_quest_type = value

    def change_scenarion_name(self, value):
        @ChangeMemento('name', self.model.update_scenario_name_event)
        def action():
            self.model.scenario.name = value

        action()