From a407971f91011e2134e27f0f0e77a5e8b8a24e73 Mon Sep 17 00:00:00 2001 From: xtaodada Date: Wed, 25 Oct 2023 15:03:53 +0800 Subject: [PATCH] feat: support add more skills --- src/damage/data.py | 31 +------- src/damage/page.py | 167 ++++++++++++++++++++++++++------------- src/damage/skill_data.py | 90 +++++++++++++++++++++ 3 files changed, 204 insertions(+), 84 deletions(-) create mode 100644 src/damage/skill_data.py diff --git a/src/damage/data.py b/src/damage/data.py index b3c76c0..1eae9f5 100644 --- a/src/damage/data.py +++ b/src/damage/data.py @@ -3,6 +3,7 @@ from typing import Dict, Any from .character import character from .models import CharacterDamage, CharacterSkill, CharacterConfig, WeaponConfig +from .skill_data import SkillData class Data: @@ -88,35 +89,6 @@ class Data: return del self.file_data[character_name] - def get_skill_value(self, character_name: str, skill: CharacterSkill) -> bool: - if not self.file_data.get(character_name): - return False - skill_id = skill.index - for i in self.file_data[character_name].skills: - if i.index == skill_id: - return True - return False - - def set_skill_value(self, character_name: str, skill: CharacterSkill, enable: bool): - self.first_init(character_name) - in_data = None - for i in self.file_data[character_name].skills: - if i.index == skill.index: - in_data = i - break - if enable: - if not in_data: - self.file_data[character_name].skills.append(skill.to_data()) - else: - in_data.name = skill.custom_name or skill.show_name - in_data.damage_key = skill.damage_key - in_data.transformative_damage_key = skill.transformative_damage_key - else: - if in_data: - self.file_data[character_name].skills.remove(in_data) - self.file_data[character_name].skills.sort(key=lambda x: x.index) - self.last_close(character_name) - def get_character_config_value( self, character_name: str, config_: CharacterConfig ) -> Any: @@ -245,3 +217,4 @@ class Data: data = Data() +skill_data = SkillData(data.file_data) diff --git a/src/damage/page.py b/src/damage/page.py index 1421d2d..a509a7f 100644 --- a/src/damage/page.py +++ b/src/damage/page.py @@ -1,23 +1,23 @@ from typing import List -from flet_core import MainAxisAlignment - import flet as ft +from flet_core import MainAxisAlignment from src.data import Page from .artifact import artifact from .character import character -from .data import data +from .data import data, skill_data from .models import ( - CharacterSkill, CharacterDamageSkillDamageKey, CharacterDamageSkillTransformativeDamageKey, CharacterConfig, Weapon as WeaponModel, Element4OP, Element8OP, + CharacterDamageSkill, ) from .weapon import weapon +from ..components import show_snack_bar def edit_damage_view(page: "Page"): @@ -62,37 +62,107 @@ def edit_damage_view(page: "Page"): ch_name = character.current_name skill_list.controls.clear() - def search_skills(e: ft.ControlEvent = None): - temp = skill_list.controls[0] - skill_list.controls.clear() - skill_list.controls.append(temp) - for con in skill_list_data: - con: "ft.Container" - cb: "ft.Checkbox" = con.content # noqa - if e is None or e.data in cb.label: - skill_list.controls.append(con) + def add_new_skill(_: ft.ControlEvent = None): + skill_data.create_first(ch_name) + + def skill_key_change_to_transformative(e_: ft.ControlEvent = None): + value = e_.data == "true" + if value: + normal_skill_ft.visible = False + transformative_skill_ft.visible = True + else: + normal_skill_ft.visible = True + transformative_skill_ft.visible = False + page.update() + + def create_confirm(_): + result = skill_data.create_confirm() + bs.open = False + choose_character() + if not result: + show_snack_bar(page, "添加失败,请确认数据已填写完毕", ft.colors.RED) + + normal_skill_ft = ft.Dropdown( + label="输出数据", + options=[ + ft.dropdown.Option(key=v, text=k) + for k, v in CharacterDamageSkillDamageKey.normal.data_map.items() + ], + value="", + on_change=skill_data.create_handle_damage_key, + ) + transformative_skill_ft = ft.Dropdown( + label="输出数据", + options=[ + ft.dropdown.Option(key=v, text=k) + for k, v in CharacterDamageSkillTransformativeDamageKey.swirl_cryo.data_map.items() + ], + value="", + on_change=skill_data.create_handle_transformative_damage_key, + visible=False, + ) + bs = ft.BottomSheet( + ft.Container( + ft.Column( + [ + ft.Dropdown( + label="技能名称", + options=skill_data.get_dropdown_options(ch_name), + value="", + on_change=skill_data.create_handle_index, + ), + ft.TextField( + label="自定义显示名称", + value="", + on_change=skill_data.create_handle_name, + ), + ft.Switch( + label="剧变反应伤害", + value=False, + on_change=skill_key_change_to_transformative, + ), + normal_skill_ft, + transformative_skill_ft, + ft.ElevatedButton( + "确定添加", + icon=ft.icons.DONE, + on_click=create_confirm, + ), + ], + tight=True, + ), + padding=10, + ), + open=True, + ) + page.overlay.append(bs) page.update() + bs.update() skill_list.controls.append( ft.Container( - content=ft.TextField( - label="技能配置", - on_change=search_skills, + content=ft.Row( + [ + ft.Text("技能配置"), + ft.IconButton( + icon=ft.icons.ADD_BOX, + on_click=add_new_skill, + ), + ] ), ) ) - for i in character.skills_map[ch_name]: + for i in skill_data.get(ch_name): container = ft.Container( content=ft.Checkbox( - label=i.show_name, - value=data.get_skill_value(ch_name, i), + label=i.name, + value=True, disabled=True, data=i, ), on_click=choose_skill, ) skill_list.controls.append(container) - skill_list_data = skill_list.controls[1:] def update_weapon_component(): ch_name = character.current_name @@ -273,44 +343,27 @@ def edit_damage_view(page: "Page"): def choose_skill(e: ft.ControlEvent = None): checkbox: ft.Checkbox = e.control.content - skill: CharacterSkill = checkbox.data + skill: CharacterDamageSkill = checkbox.data + skill_data.temp = skill + skill_data.init_temp_index(character.current_name) page.overlay.clear() - def skill_status_change(e_: ft.ControlEvent = None): - value = e_.data == "true" - data.set_skill_value(character.current_name, skill, value) - - def skill_custom_name_change(e_: ft.ControlEvent = None): - skill.custom_name = e_.data - data.set_skill_value(character.current_name, skill, True) - - def skill_key_change(e_: ft.ControlEvent = None): - skill.damage_key = CharacterDamageSkillDamageKey(e_.data) - data.set_skill_value(character.current_name, skill, True) - - def skill_transformative_key_change(e_: ft.ControlEvent = None): - skill.transformative_damage_key = ( - CharacterDamageSkillTransformativeDamageKey(e_.data) - ) - data.set_skill_value(character.current_name, skill, True) - def skill_key_change_to_transformative(e_: ft.ControlEvent = None): value = e_.data == "true" if value: - skill.transformative_damage_key = ( - CharacterDamageSkillTransformativeDamageKey.swirl_cryo - ) - skill.damage_key = None normal_skill_ft.visible = False transformative_skill_ft.visible = True else: - skill.transformative_damage_key = None - skill.damage_key = CharacterDamageSkillDamageKey.normal normal_skill_ft.visible = True transformative_skill_ft.visible = False - data.set_skill_value(character.current_name, skill, True) page.update() + def delete(_): + skill_data.delete_skill() + data.last_close(character.current_name) + bs.open = False + choose_character() + normal_skill_ft = ft.Dropdown( label="输出数据", options=[ @@ -318,7 +371,7 @@ def edit_damage_view(page: "Page"): for k, v in CharacterDamageSkillDamageKey.normal.data_map.items() ], value=skill.damage_key.value if skill.damage_key else "", - on_change=skill_key_change, + on_change=skill_data.create_handle_damage_key, visible=not bool(skill.transformative_damage_key), ) transformative_skill_ft = ft.Dropdown( @@ -330,7 +383,7 @@ def edit_damage_view(page: "Page"): value=skill.transformative_damage_key.value if skill.transformative_damage_key else "", - on_change=skill_transformative_key_change, + on_change=skill_data.create_handle_transformative_damage_key, visible=bool(skill.transformative_damage_key), ) @@ -338,16 +391,15 @@ def edit_damage_view(page: "Page"): ft.Container( ft.Column( [ - ft.Text(skill.show_name), - ft.Switch( - label="显示此数值", - value=checkbox.value, - on_change=skill_status_change, + ft.Text( + skill_data.get_skill_show_name( + character.current_name, skill + ) ), ft.TextField( label="自定义显示名称", - value=skill.custom_name or skill.show_name, - on_change=skill_custom_name_change, + value=skill.name, + on_change=skill_data.create_handle_name, ), ft.Switch( label="剧变反应伤害", @@ -356,6 +408,11 @@ def edit_damage_view(page: "Page"): ), normal_skill_ft, transformative_skill_ft, + ft.ElevatedButton( + "删除", + icon=ft.icons.DELETE_SWEEP, + on_click=delete, + ), ], tight=True, ), diff --git a/src/damage/skill_data.py b/src/damage/skill_data.py new file mode 100644 index 0000000..9c6c77b --- /dev/null +++ b/src/damage/skill_data.py @@ -0,0 +1,90 @@ +import flet as ft +from typing import Dict, List, Optional + +from src.damage.character import character +from src.damage.models import ( + CharacterDamage, + CharacterDamageSkill, + CharacterSkill, + CharacterDamageSkillDamageKey, + CharacterDamageSkillTransformativeDamageKey, +) + + +class SkillData: + def __init__(self, file_data: Dict[str, CharacterDamage]): + self.file_data = file_data + self.temp: Optional[CharacterDamageSkill] = None + self.temp_index: Dict[int, CharacterSkill] = {} + + def get(self, character_name: str) -> List[CharacterDamageSkill]: + if character_name not in self.file_data: + return [] + return self.file_data[character_name].skills + + def delete_skill(self): + if self.temp and self.temp in self.file_data[character.current_name].skills: + self.file_data[character.current_name].skills.remove(self.temp) + self.temp = None + self.temp_index.clear() + + @staticmethod + def get_skill_show_name(character_name: str, skill: CharacterDamageSkill) -> str: + for i in character.skills_map[character_name]: + if i.index == skill.index: + return i.show_name + return skill.name + + @staticmethod + def get_dropdown_options(character_name: str) -> List[ft.dropdown.Option]: + skills = [] + for skill in character.skills_map[character_name]: + skills.append( + ft.dropdown.Option( + key=skill.index, + text=skill.show_name, + ) + ) + return skills + + def init_temp_index(self, character_name: str): + self.temp_index.clear() + for skill in character.skills_map[character_name]: + self.temp_index[skill.index] = skill + + def create_first(self, character_name: str): + self.temp = CharacterDamageSkill(name="", index=-1) + self.init_temp_index(character_name) + + def create_handle_index(self, e: ft.ControlEvent = None): + index = int(e.data) + self.temp.index = index + self.temp.name = self.temp_index[index].show_name + + def create_handle_name(self, e: ft.ControlEvent = None): + if e.data == "": + self.temp.name = self.temp_index[self.temp.index].show_name + else: + self.temp.name = e.data + + def create_handle_damage_key(self, e: ft.ControlEvent = None): + self.temp.damage_key = CharacterDamageSkillDamageKey(e.data) + self.temp.transformative_damage_key = None + + def create_handle_transformative_damage_key(self, e: ft.ControlEvent = None): + self.temp.transformative_damage_key = ( + CharacterDamageSkillTransformativeDamageKey(e.data) + ) + self.temp.damage_key = None + + def create_confirm(self) -> bool: + if self.temp.index == -1: + return False + if not self.temp.damage_key and not self.temp.transformative_damage_key: + return False + if not self.file_data.get(character.current_name): + self.file_data[character.current_name] = CharacterDamage(skills=[]) + self.file_data[character.current_name].skills.append(self.temp) + self.temp = None + self.temp_index.clear() + return True