contribution.py (10229B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\ui\window\card\components\contribution.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.api.signal import on_achievement_completed, on_admin_achievement_reset, on_admin_achievement_reset_all 7 from achievement_system.client.model.definition.achievement.entry import AchievementDefinitionEntry 8 from achievement_system.client.model.definition.achievement.identifier import AchievementDefinitionIdentifier 9 from achievement_system.client.ui.controller.achievement_entry import AchievementEntryController 10 from achievement_system.client.ui.util import get_controller_for_configured_parameter 11 from carbonui import Align, TextColor, uiconst 12 from carbonui.control.attributeContainer import AttributeContainer 13 from carbonui.control.parametertypes.parameter_container import ParameterContainer 14 from carbonui.primitives.container import Container 15 from carbonui.primitives.containerAutoSize import ContainerAutoSize 16 from carbonui.primitives.flowcontainer import FlowContainer 17 from carbonui.primitives.frame import Frame 18 from carbonui.primitives.sprite import Sprite 19 from carbonui.primitives.transform import Transform 20 from carbonui.text.custom import TextCustom 21 from carbonui.text.styles import TextBody, TextDetail 22 from carbonui.uianimations import animations 23 from carbonui.uicore import uicore 24 from eve.client.script.ui import eveColor 25 from eve.client.script.ui.control.infoIcon import CheckMarkGlyphIcon 26 from localization import GetByLabel 27 28 class AchievementContribution(ContainerAutoSize): 29 30 def __init__(self, controller, *args, **kwargs): 31 super(AchievementContribution, self).__init__(*args, **kwargs) 32 self.controller = controller 33 self.construct_layout() 34 self.update() 35 36 def construct_layout(self): 37 self.construct_attributes() 38 self.construct_parameters() 39 40 def construct_attributes(self): 41 AttributeContainer(name='contribution_description', parent=self, align=Align.TOTOP, hint=self.controller.contribution_progress_text, text=self.controller.contribution_description, icon=self.controller.contribution_icon) 42 43 def construct_parameters(self): 44 for component_controller in self.controller.get_contribution_param_ui_controllers(): 45 ParameterContainer(parent=self, align=Align.TOTOP, controller=component_controller, padTop=16) 46 47 @threadutils.highlander_threaded 48 def update(self): 49 pass 50 51 52 class ChecklistContribution(ContainerAutoSize): 53 54 def __init__(self, controller, *args, **kwargs): 55 super(ChecklistContribution, self).__init__(*args, **kwargs) 56 self.controller = controller 57 self.construct_layout() 58 self.update() 59 self.connect_signals() 60 61 def Close(self): 62 try: 63 self.disconnect_signals() 64 finally: 65 super(ChecklistContribution, self).Close() 66 67 def connect_signals(self): 68 on_achievement_completed.connect(self.on_achievement_completed) 69 on_admin_achievement_reset.connect(self.on_achievement_reset) 70 on_admin_achievement_reset_all.connect(self.on_achievement_reset_all) 71 72 def disconnect_signals(self): 73 on_achievement_completed.disconnect(self.on_achievement_completed) 74 on_admin_achievement_reset.disconnect(self.on_achievement_reset) 75 on_admin_achievement_reset_all.disconnect(self.on_achievement_reset_all) 76 77 def construct_layout(self): 78 self.label = TextBody(name='label', parent=self, align=Align.TOTOP, color=TextColor.SECONDARY, text=GetByLabel('UI/Achievements/Window/Card/ListTitle')) 79 self.content_container = ContainerAutoSize(name='content_container', parent=self, align=Align.TOTOP, alignMode=Align.TOTOP, padTop=4) 80 self.construct_icon() 81 self.entry_container = FlowContainer(name='entry_container', parent=self.content_container, align=Align.TOTOP, contentSpacing=(8, 8), padLeft=40) 82 83 def construct_icon(self): 84 icon_container = Container(parent=self.content_container, align=Align.TOPLEFT, state=uiconst.UI_DISABLED, pos=(0, 0, 32, 32)) 85 Sprite(parent=icon_container, align=Align.CENTER, texturePath='res:/UI/Texture/classes/Achievements/card/checklist_frame.png', opacity=0.05, pos=(0, 0, 32, 32)) 86 Sprite(parent=icon_container, align=Align.CENTER, texturePath=eveicon.trophy, color=TextColor.SECONDARY, pos=(0, 0, 16, 16)) 87 88 def reconstruct_entries(self): 89 self.entry_container.Flush() 90 for param_entry, param_config in self.controller.parameters_to_display_as_list: 91 component_controller = get_controller_for_configured_parameter(definition=param_entry.get_ui_controller(), configuration=param_config.get_ui_controller()) 92 if component_controller is None: 93 continue 94 values = component_controller.values 95 if values and isinstance(values, list): 96 total_entries = len(values) 97 if total_entries == 0: 98 return 99 is_odd_number_of_entries = total_entries % 2 100 for index, entry in enumerate(values): 101 is_last_entry = index == total_entries - 1 102 if is_last_entry and is_odd_number_of_entries: 103 width = self.entry_max_width 104 else: 105 width = ChecklistEntry.default_width 106 entry_controller = self.get_achievement_controller_for_entry(entry) 107 if entry_controller is None: 108 continue 109 ChecklistEntry(parent=self.entry_container, controller=entry_controller, width=width) 110 111 def get_achievement_controller_for_entry(self, entry): 112 achievement_id = AchievementDefinitionIdentifier(entry) 113 if achievement_id is None: 114 return 115 try: 116 achievement_attributes = get_repository().definitions.get_achievement(achievement_id) 117 except DefinitionNotFoundError: 118 return 119 120 achievement_entry = AchievementDefinitionEntry(achievement_id, achievement_attributes) 121 return AchievementEntryController(achievement_entry) 122 123 @property 124 def entry_max_width(self): 125 return self.entry_container.contentSpacing[0] + ChecklistEntry.default_width * 2 126 127 @threadutils.highlander_threaded 128 def update(self): 129 self.reconstruct_entries() 130 131 def on_achievement_completed(self, achievement_id): 132 if achievement_id == self.controller.achievement_entry.identifier: 133 self.update() 134 135 def on_achievement_reset(self, achievement_id): 136 if achievement_id == self.controller.achievement_entry.identifier: 137 self.update() 138 139 def on_achievement_reset_all(self): 140 self.update() 141 142 143 class ChecklistEntry(Container): 144 default_width = 208 145 default_height = 48 146 default_state = uiconst.UI_NORMAL 147 148 def __init__(self, controller, *args, **kwargs): 149 super(ChecklistEntry, self).__init__(*args, **kwargs) 150 self.controller = controller 151 self.is_hovered = False 152 self.construct_layout() 153 self.update(animate=False) 154 155 def construct_layout(self): 156 self.completed_glyph = CheckMarkGlyphIcon(parent=self, align=Align.TOPRIGHT, state=uiconst.UI_DISABLED, pos=(4, 4, 16, 16)) 157 self.content_container = Container(name='content_container', parent=self, padding=(8, 8, 8, 8)) 158 self.construct_icon() 159 self.construct_labels() 160 self.construct_background() 161 162 def construct_icon(self): 163 icon_container = Container(name='icon_container', parent=self.content_container, align=Align.TOLEFT, width=32) 164 self.icon = Sprite(name='icon', parent=icon_container, align=Align.CENTER, color=TextColor.SECONDARY, pos=(0, 0, 32, 32)) 165 166 def construct_labels(self): 167 label_container = ContainerAutoSize(name='label_container', parent=self.content_container, align=Align.VERTICALLY_CENTERED, padLeft=8) 168 self.description_label = TextDetail(name='description_label', parent=label_container, align=Align.TOTOP, text=GetByLabel('UI/Achievements/Window/Card/ChecklistAchievementDescription'), color=TextColor.SECONDARY) 169 self.name_wrapper = Container(name='name_wrapper', parent=label_container, align=Align.TOTOP) 170 self.name_label = TextCustom(name='name_label', parent=self.name_wrapper, align=Align.TOLEFT, color=TextColor.HIGHLIGHT, fontSize=16, maxLines=1, autoFadeSides=16) 171 172 def construct_background(self): 173 frame_transform = Transform(name='frame_transform', parent=self, align=Align.TOALL, scalingCenter=(0.5, 0.5), scale=(-1.0, 1.0)) 174 self.frame = Frame(parent=frame_transform, align=Align.TOALL, texturePath='res:/UI/Texture/classes/Achievements/card/checklist_frame.png', cornerSize=16, uiScaleVertices=True) 175 176 @threadutils.highlander_threaded 177 def update(self, animate = True): 178 is_completed = self.controller.is_completed 179 self.frame.color = eveColor.SUCCESS_GREEN if is_completed else eveColor.WHITE 180 self.update_frame_opacity(animate) 181 self.icon.texturePath = eveicon.trophy 182 self.update_labels() 183 self.completed_glyph.display = is_completed 184 185 def update_frame_opacity(self, animate = True): 186 target_opacity = 0.2 if self.is_hovered else 0.1 187 if animate: 188 animations.MorphScalar(obj=self.frame, attrName='opacity', startVal=self.frame.opacity, endVal=target_opacity, duration=0.25) 189 else: 190 self.frame.opacity = target_opacity 191 192 def update_labels(self): 193 _, h = TextCustom.MeasureTextSize('0', fontSize=16) 194 self.name_wrapper.height = h 195 self.name_label.text = self.controller.name 196 197 def OnClick(self, *args): 198 uicore.cmd.OpenAchievement(self.controller.achievement_entry.identifier) 199 200 def OnMouseEnter(self, *args): 201 self.is_hovered = True 202 self.update_frame_opacity() 203 204 def OnMouseExit(self, *args): 205 self.is_hovered = False 206 self.update_frame_opacity()