NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

side_navigation.py (12765B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\ui\window\page\achievements\navigation\side_navigation.py
      2 import eveicon
      3 import threadutils
      4 from achievement_system.client.api.error import DefinitionNotFoundError
      5 from achievement_system.client.api.repository import get_repository
      6 from achievement_system.client.model.definition.category.roots import AchievementCategoryRoot
      7 from achievement_system.client.qa import is_qa
      8 from achievement_system.client.qa.actions import qa_complete_all_achievements_in_category, qa_reset_all_achievements_in_category
      9 from achievement_system.client.ui.controller.category import AchievementCategoryController
     10 from achievement_system.client.ui.link.drag_data import CategoryDragData
     11 from achievement_system.client.ui.window.const import NavigationEntryID, TRANSITION_DURATION
     12 from achievement_system.client.ui.window.signal import on_category_selected, on_navigation_entry_selected
     13 from carbonui import Align, uiconst
     14 from carbonui.control.contextMenu.menuData import MenuData
     15 from carbonui.control.sideNavigation import SideNavigation, SideNavigationEntry, SideNavigationEntryInterface
     16 from carbonui.primitives.container import Container
     17 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     18 from carbonui.primitives.sprite import Sprite
     19 from carbonui.uianimations import animations
     20 from localization import GetByLabel
     21 
     22 class AchievementsNavigation(SideNavigation):
     23 
     24     def __init__(self, is_expanded_func, **kwargs):
     25         super(AchievementsNavigation, self).__init__(is_expanded_func, **kwargs)
     26         self.connect_signals()
     27 
     28     def Close(self):
     29         try:
     30             self.disconnect_signals()
     31         finally:
     32             super(AchievementsNavigation, self).Close()
     33 
     34     def connect_signals(self):
     35         on_navigation_entry_selected.connect(self.on_navigation_entry_selected)
     36         on_category_selected.connect(self.on_category_selected)
     37 
     38     def disconnect_signals(self):
     39         on_navigation_entry_selected.disconnect(self.on_navigation_entry_selected)
     40         on_category_selected.disconnect(self.on_category_selected)
     41 
     42     def reload(self):
     43         self.Flush()
     44         self._construct_body()
     45 
     46     def _construct_body(self):
     47         self.add_entry(entry_id=NavigationEntryID.OVERVIEW, icon=eveicon.house, text=GetByLabel('UI/Achievements/Window/SideNavigation/Overview'), on_click=self.on_entry_click)
     48         self.add_root_category(AchievementCategoryRoot.CHALLENGES)
     49         self.add_root_category(AchievementCategoryRoot.TIME_LIMITED)
     50         self.add_historic_category()
     51         self.set_entry_selected(NavigationEntryID.OVERVIEW)
     52 
     53     def add_root_category(self, root):
     54         main_category_attributes = self.get_root_category_attributes(root)
     55         if main_category_attributes is None or len(main_category_attributes.child_categories) == 0:
     56             return
     57         self.add_header(label=main_category_attributes.name_message.get_localized_text())
     58         for group_category_identifier in main_category_attributes.child_categories:
     59             group_category_attributes = self.get_category_attributes(group_category_identifier)
     60             child_category_data = []
     61             for child_category_identifier in group_category_attributes.child_categories:
     62                 child_category_attributes = self.get_category_attributes(child_category_identifier)
     63                 if child_category_attributes is None:
     64                     continue
     65                 child_category_data.append(SideNavigationGroupData(entry_id=child_category_identifier, icon=eveicon.get(child_category_attributes.icon_id), text=child_category_attributes.name_message.get_localized_text()))
     66 
     67             self.add_entry(entry_cls=SideNavigationGroupContainerEntry, entry_id=group_category_identifier, icon=eveicon.get(group_category_attributes.icon_id), text=group_category_attributes.name_message.get_localized_text(), on_click=self.on_entry_click, data=child_category_data)
     68 
     69     def add_historic_category(self):
     70         if len(get_repository().definitions.get_all_historic_achievement_entries()) > 0:
     71             self.add_header(label=GetByLabel('UI/Achievements/Window/SideNavigation/Historic'))
     72             self.add_entry(entry_id=NavigationEntryID.ARCHIVED, icon=eveicon.cup, text=GetByLabel('UI/Achievements/Window/SideNavigation/Archived'), on_click=self.on_entry_click)
     73 
     74     def on_entry_click(self, entry):
     75         on_navigation_entry_selected(entry.entry_id)
     76 
     77     def on_navigation_entry_selected(self, entry_id):
     78         self.set_entry_selected(entry_id)
     79 
     80     def on_category_selected(self, category_id):
     81         self.set_entry_selected(category_id)
     82 
     83     def get_root_category_attributes(self, root):
     84         try:
     85             category_identifier = get_repository().definitions.get_root_category(root)
     86             return self.get_category_attributes(category_identifier)
     87         except DefinitionNotFoundError as e:
     88             return None
     89 
     90     def get_category_attributes(self, category_identifier):
     91         try:
     92             return get_repository().definitions.get_category(category_identifier)
     93         except DefinitionNotFoundError as e:
     94             return None
     95 
     96 
     97 class SideNavigationGroupData(object):
     98 
     99     def __init__(self, entry_id, icon, text):
    100         self.entry_id = entry_id
    101         self.icon = icon
    102         self.text = text
    103 
    104 
    105 class SideNavigationGroupContainerEntry(ContainerAutoSize, SideNavigationEntryInterface):
    106     default_align = Align.TOTOP
    107 
    108     def __init__(self, entry_id, icon, text, on_click = None, data = None, *args, **kwargs):
    109         super(SideNavigationGroupContainerEntry, self).__init__(*args, **kwargs)
    110         self.entry_id = entry_id
    111         self.icon = icon
    112         self.text = text
    113         self.on_click = on_click
    114         self.data = [] if data is None else data
    115         self.sub_entries = {}
    116         self.construct_layout()
    117         self.connect_signals()
    118 
    119     def Close(self):
    120         try:
    121             self.disconnect_signals()
    122         finally:
    123             super(SideNavigationGroupContainerEntry, self).Close()
    124 
    125     def connect_signals(self):
    126         on_category_selected.connect(self.on_category_selected)
    127         on_navigation_entry_selected.connect(self.on_navigation_entry_selected)
    128 
    129     def disconnect_signals(self):
    130         on_category_selected.disconnect(self.on_category_selected)
    131         on_navigation_entry_selected.disconnect(self.on_navigation_entry_selected)
    132 
    133     def construct_layout(self):
    134         self.title_entry = SideNavigationTitleEntry(parent=self, align=Align.TOTOP, entry_id=self.entry_id, is_arrow_enabled=len(self.data) > 0, icon=self.icon, text=self.text, on_click=self.on_click)
    135         self.entry_container = Container(name='entry_container', parent=self, align=Align.TOTOP, height=0, clipChildren=True)
    136         for sub_entry_data in self.data:
    137             self.add_sub_entry(data=sub_entry_data, on_click=self.on_click)
    138 
    139     def add_sub_entry(self, data, on_click = None):
    140         entry = SideNavigationGroupEntry(parent=self.entry_container, align=Align.TOTOP, entry_id=data.entry_id, icon=data.icon, text=data.text, on_click=on_click)
    141         self.sub_entries[data.entry_id] = entry
    142 
    143     def expand_group(self):
    144         animations.MorphScalar(obj=self.entry_container, attrName='height', startVal=self.entry_container.height, endVal=SideNavigationEntry.default_height * len(self.sub_entries), duration=TRANSITION_DURATION * 2)
    145 
    146     def contract_group(self):
    147         animations.MorphScalar(obj=self.entry_container, attrName='height', startVal=self.entry_container.height, endVal=0, duration=TRANSITION_DURATION * 2)
    148 
    149     def on_category_selected(self, category_id):
    150         self.select_entry(category_id)
    151 
    152     def on_navigation_entry_selected(self, entry_id):
    153         self.select_entry(entry_id)
    154 
    155     def select_entry(self, entry_id):
    156         self.title_entry.selected = self.entry_id == entry_id
    157         for entry in self.sub_entries.values():
    158             entry.selected = entry.entry_id == entry_id
    159 
    160         if self.entry_id == entry_id or entry_id in self.sub_entries.keys():
    161             self.title_entry.hide_arrow()
    162             self.expand_group()
    163         else:
    164             self.title_entry.show_arrow()
    165             self.contract_group()
    166 
    167     def on_expanded_changed(self, expanded, animate = True):
    168         self.title_entry.on_expanded_changed(expanded, animate)
    169         for entry in self.sub_entries.values():
    170             entry.on_expanded_changed(expanded, animate)
    171 
    172     def set_expanded(self, animate = True):
    173         self.title_entry.set_expanded(animate)
    174         for entry in self.sub_entries.values():
    175             entry.set_expanded(animate)
    176 
    177     def set_collapsed(self, animate = True):
    178         self.title_entry.set_collapsed(animate)
    179         for entry in self.sub_entries.values():
    180             entry.set_collapsed(animate)
    181 
    182     def set_force_compact(self, force_compact):
    183         self.set_force_compact(force_compact)
    184         for entry in self.sub_entries.values():
    185             entry.set_force_compact(force_compact)
    186 
    187 
    188 class SideNavigationTitleEntry(SideNavigationEntry):
    189 
    190     def __init__(self, is_arrow_enabled = True, *args, **kwargs):
    191         super(SideNavigationTitleEntry, self).__init__(*args, **kwargs)
    192         self.is_arrow_enabled = is_arrow_enabled
    193         self.is_expanded = False
    194         self.controller = AchievementCategoryController(self.entry_id)
    195         self.MakeDragObject()
    196         self.GetDragData = lambda : CategoryDragData(self.entry_id)
    197         self.update()
    198 
    199     def construct_right_aligned_content(self):
    200         super(SideNavigationTitleEntry, self).construct_right_aligned_content()
    201         self.arrow_container = ContainerAutoSize(name='arrow_container', parent=self.content, align=Align.TORIGHT)
    202         Sprite(name='arrow', parent=self.arrow_container, align=Align.CENTERLEFT, state=uiconst.UI_DISABLED, texturePath=eveicon.caret_down, pos=(0, 0, 20, 20), opacity=0.5)
    203 
    204     @threadutils.highlander_threaded
    205     def update(self):
    206         if self.is_expanded:
    207             self.arrow_container.display = self.is_arrow_enabled
    208         else:
    209             self.arrow_container.display = False
    210         self.set_value(len(self.controller.achievement_entries_recursive))
    211 
    212     def show_arrow(self):
    213         animations.FadeIn(self.arrow_container, duration=TRANSITION_DURATION)
    214 
    215     def hide_arrow(self):
    216         animations.FadeOut(self.arrow_container, duration=TRANSITION_DURATION)
    217 
    218     def set_expanded(self, animate = True):
    219         super(SideNavigationTitleEntry, self).set_expanded(animate)
    220         self.is_expanded = True
    221         if self.is_arrow_enabled:
    222             self.arrow_container.display = True
    223 
    224     def set_collapsed(self, animate = True):
    225         super(SideNavigationTitleEntry, self).set_collapsed(animate)
    226         self.is_expanded = False
    227         if self.is_arrow_enabled:
    228             self.arrow_container.display = False
    229 
    230     def GetMenu(self):
    231         menu_data = MenuData()
    232         if is_qa():
    233             menu_data.AddEntry('QA: Complete Achievements', lambda : qa_complete_all_achievements_in_category(self.controller.category_id))
    234             menu_data.AddEntry('QA: Reset Achievements', lambda : qa_reset_all_achievements_in_category(self.controller.category_id))
    235         return menu_data
    236 
    237 
    238 class SideNavigationGroupEntry(SideNavigationEntry):
    239 
    240     def __init__(self, *args, **kwargs):
    241         super(SideNavigationGroupEntry, self).__init__(*args, **kwargs)
    242         self.controller = AchievementCategoryController(self.entry_id)
    243         self.MakeDragObject()
    244         self.GetDragData = lambda : CategoryDragData(self.entry_id)
    245         self.update()
    246 
    247     @threadutils.highlander_threaded
    248     def update(self):
    249         self.set_value(len(self.controller.achievement_entries_recursive))
    250 
    251     def set_expanded(self, animate = True):
    252         super(SideNavigationGroupEntry, self).set_expanded(animate)
    253         if animate:
    254             animations.MorphScalar(obj=self._icon_container, attrName='left', startVal=self._icon_container.left, endVal=16, duration=0.2)
    255         else:
    256             self._icon_container.left = 16
    257 
    258     def set_collapsed(self, animate = True):
    259         super(SideNavigationGroupEntry, self).set_collapsed(animate)
    260         if animate:
    261             animations.MorphScalar(obj=self._icon_container, attrName='left', startVal=self._icon_container.left, endVal=0, duration=0.2)
    262         else:
    263             self._icon_container.left = 0
    264 
    265     def GetMenu(self):
    266         menu_data = MenuData()
    267         if is_qa():
    268             menu_data.AddEntry('QA: Complete Achievements', lambda : qa_complete_all_achievements_in_category(self.controller.category_id))
    269             menu_data.AddEntry('QA: Reset Achievements', lambda : qa_reset_all_achievements_in_category(self.controller.category_id))
    270         return menu_data