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