rewards.py (13759B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\ui\window\card\components\rewards.py 2 import threadutils 3 from achievement_system.client.api.signal import on_achievement_completed, on_achievement_progressed, on_achievement_milestone_reached, on_admin_achievement_reset, on_admin_achievement_reset_all 4 from achievement_system.client.model.definition.reward.type import RewardType 5 from achievement_system.client.ui.controller.reward import AchievementRewardController 6 from achievement_system.client.ui.window.card.components.claimed_icon import ClaimedIcon 7 from achievement_system.client.ui.window.card.components.score_icon import ScoreIcon 8 from carbonui import Align, AxisAlignment, uiconst, TextColor, TextAlign 9 from carbonui.primitives.container import Container 10 from carbonui.primitives.containerAutoSize import ContainerAutoSize 11 from carbonui.primitives.fill import Fill 12 from carbonui.primitives.flowcontainer import FlowContainer 13 from carbonui.primitives.gradientSprite import GradientSprite 14 from carbonui.primitives.sprite import Sprite 15 from carbonui.text.styles import TextDetail, TextBody 16 from eve.client.script.ui import eveColor, eveThemeColor 17 from eveicon import IconData 18 from localization import GetByLabel 19 20 class AchievementRewardsBase(ContainerAutoSize): 21 default_alignMode = Align.TOTOP 22 23 def __init__(self, controller, *args, **kwargs): 24 super(AchievementRewardsBase, self).__init__(*args, **kwargs) 25 self.controller = controller 26 self.construct_layout() 27 self.update() 28 self.connect_signals() 29 self.on_size_changed_signal(*self.GetAbsoluteSize()) 30 31 def Close(self): 32 try: 33 self.disconnect_signals() 34 finally: 35 super(AchievementRewardsBase, self).Close() 36 37 def connect_signals(self): 38 on_achievement_completed.connect(self.on_achievement_completed) 39 on_achievement_progressed.connect(self.on_achievement_progressed) 40 on_achievement_milestone_reached.connect(self.on_achievement_milestone_reached) 41 on_admin_achievement_reset.connect(self.on_achievement_reset) 42 on_admin_achievement_reset_all.connect(self.on_achievement_reset_all) 43 self.on_size_changed.connect(self.on_size_changed_signal) 44 45 def disconnect_signals(self): 46 on_achievement_completed.disconnect(self.on_achievement_completed) 47 on_achievement_progressed.disconnect(self.on_achievement_progressed) 48 on_achievement_milestone_reached.disconnect(self.on_achievement_milestone_reached) 49 on_admin_achievement_reset.disconnect(self.on_achievement_reset) 50 on_admin_achievement_reset_all.disconnect(self.on_achievement_reset_all) 51 self.on_size_changed.disconnect(self.on_size_changed_signal) 52 53 def construct_layout(self): 54 raise NotImplementedError 55 56 @threadutils.highlander_threaded 57 def update(self): 58 raise NotImplementedError 59 60 def on_achievement_completed(self, achievement_id): 61 if achievement_id == self.controller.achievement_entry.identifier: 62 self.update() 63 64 def on_achievement_progressed(self, achievement_id, achievement_state): 65 if achievement_id == self.controller.achievement_entry.identifier: 66 self.update() 67 68 def on_achievement_milestone_reached(self, achievement_id, milestone_id): 69 if achievement_id == self.controller.achievement_entry.identifier: 70 self.update() 71 72 def on_achievement_reset(self, achievement_id): 73 if achievement_id == self.controller.achievement_entry.identifier: 74 self.update() 75 76 def on_achievement_reset_all(self): 77 self.update() 78 79 def on_size_changed_signal(self, width, height): 80 pass 81 82 83 class AchievementRewardsHover(AchievementRewardsBase): 84 85 def construct_layout(self): 86 content_container = ContainerAutoSize(name='content_container', parent=self, align=Align.TOTOP, padding=(8, 4, 8, 8)) 87 TextDetail(name='label', parent=content_container, align=Align.TOTOP, text=GetByLabel('UI/Achievements/Window/Card/Rewards'), textAlign=TextAlign.CENTER, color=TextColor.SECONDARY) 88 self.flow_container = FlowContainer(name='flow_container', parent=content_container, align=Align.TOTOP, contentSpacing=(12, 0), contentAlignment=AxisAlignment.CENTER, crossAxisAlignment=AxisAlignment.CENTER, padTop=8) 89 self.background_plate = SolidBackground(name='background_plate', parent=self, align=Align.CENTERTOP) 90 91 @threadutils.highlander_threaded 92 def update(self): 93 self.flow_container.Flush() 94 rewards = self.controller.selected_milestone_rewards 95 reward_ids = [ entry.identifier for entry in rewards ] 96 reward_controller = AchievementRewardController(identifier=self.controller.achievement_entry.identifier, milestone_id=self.controller.selected_milestone_id, rewards=reward_ids) 97 reward_data = reward_controller.reward_data 98 for data in reward_data: 99 RewardEntry(name='reward_entry_container', parent=self.flow_container, pickState=uiconst.TR2_SPS_ON, reward_data=data) 100 101 ScoreIcon(name='score_icon', parent=self.flow_container, controller=self.controller) 102 103 def on_size_changed_signal(self, width, height): 104 self.background_plate.width = width 105 self.background_plate.height = height 106 107 108 class AchievementRewardsExpanded(AchievementRewardsBase): 109 110 def construct_layout(self): 111 content_container = ContainerAutoSize(name='content_container', parent=self, align=Align.TOTOP, padding=(8, 8, 8, 8)) 112 TextBody(name='label', parent=content_container, align=Align.TOTOP, text=GetByLabel('UI/Achievements/Window/Card/Rewards'), color=TextColor.SECONDARY) 113 self.flow_container = FlowContainer(name='flow_container', parent=content_container, align=Align.TOTOP, contentSpacing=(8, 8), padTop=4) 114 self.background_plate = SolidBackground(name='background_plate', parent=self, align=Align.CENTERTOP) 115 116 @threadutils.highlander_threaded 117 def update(self): 118 self.flow_container.Flush() 119 rewards = self.controller.selected_milestone_rewards 120 reward_ids = [ entry.identifier for entry in rewards ] 121 reward_controller = AchievementRewardController(identifier=self.controller.achievement_entry.identifier, milestone_id=self.controller.selected_milestone_id, rewards=reward_ids) 122 reward_data = reward_controller.reward_data 123 total_rewards = len(reward_data) 124 has_score_reward = self.controller.selected_milestone_score > 0 125 if has_score_reward: 126 total_rewards += 1 127 if total_rewards == 0: 128 return 129 is_odd_number_of_rewards = total_rewards % 2 == 1 130 for index, data in enumerate(reward_data): 131 is_last_entry = index == total_rewards - 1 132 use_full_width = is_last_entry and is_odd_number_of_rewards 133 self.add_reward(RewardEntryExpanded, data, use_full_width) 134 135 if not has_score_reward: 136 return 137 use_full_width = is_odd_number_of_rewards 138 self.add_reward(RewardScoreExpanded, None, use_full_width) 139 140 def add_reward(self, component_class, reward_data, use_full_width): 141 if use_full_width: 142 width = self.reward_max_width 143 else: 144 width = RewardEntryExpanded.default_width 145 component_class(name='reward_entry', parent=self.flow_container, controller=self.controller, reward_data=reward_data, is_full_width=use_full_width, width=width) 146 147 @property 148 def reward_max_width(self): 149 return self.flow_container.contentSpacing[0] + RewardEntryExpanded.default_width * 2 150 151 def on_size_changed_signal(self, width, height): 152 self.background_plate.width = width 153 self.background_plate.height = height 154 155 156 class SolidBackground(Container): 157 default_state = uiconst.UI_DISABLED 158 default_opacity = 0.1 159 160 def __init__(self, *args, **kwargs): 161 super(SolidBackground, self).__init__(*args, **kwargs) 162 self.update() 163 164 @threadutils.highlander_threaded 165 def update(self): 166 self.Flush() 167 Fill(parent=self, color=eveThemeColor.THEME_FOCUS.rgba) 168 169 def OnColorThemeChanged(self): 170 super(SolidBackground, self).OnColorThemeChanged() 171 self.update() 172 173 174 class GradientBackground(Container): 175 default_state = uiconst.UI_DISABLED 176 default_opacity = 0.1 177 178 def __init__(self, *args, **kwargs): 179 super(GradientBackground, self).__init__(*args, **kwargs) 180 self.update() 181 182 @threadutils.highlander_threaded 183 def update(self): 184 self.Flush() 185 DividerGradient(parent=self, align=Align.TOTOP, height=1) 186 DividerGradient(parent=self, align=Align.TOBOTTOM, height=1) 187 GradientSprite(parent=self, align=Align.TOALL, rgbData=[(0.0, eveThemeColor.THEME_FOCUS[:3]), (1.0, eveThemeColor.THEME_FOCUS[:3])], alphaData=[(0.0, 0.0), 188 (0.1, 1.0), 189 (0.9, 1.0), 190 (1.0, 0.0)]) 191 192 def OnColorThemeChanged(self): 193 super(GradientBackground, self).OnColorThemeChanged() 194 self.update() 195 196 197 class DividerGradient(GradientSprite): 198 default_rgbData = [(0.0, eveColor.WHITE[:3]), (1.0, eveColor.WHITE[:3])] 199 default_alphaData = [(0.0, 0.0), 200 (0.1, 1.0), 201 (0.9, 1.0), 202 (1.0, 0.0)] 203 204 205 class RewardEntry(Container): 206 default_state = uiconst.UI_NORMAL 207 default_height = 40 208 default_width = 40 209 claimed_icon_offset = -2 210 211 def __init__(self, reward_data, *args, **kwargs): 212 super(RewardEntry, self).__init__(*args, **kwargs) 213 self.reward_data = reward_data 214 self.construct_layout() 215 self.update() 216 217 def construct_layout(self): 218 self.claimed_icon = ClaimedIcon(name='claimed_icon', parent=self, align=Align.TOPRIGHT, pos=(self.claimed_icon_offset, 219 self.claimed_icon_offset, 220 16, 221 16)) 222 Sprite(name='icon', parent=self, align=Align.CENTER, state=uiconst.UI_DISABLED, texturePath=self.reward_data.icon, pos=(0, 223 0, 224 self.icon_size, 225 self.icon_size)) 226 self.background_icon = Sprite(name='background_icon', parent=self, align=Align.CENTER, state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/classes/Achievements/reward_background.png', pos=(0, 227 0, 228 self.default_width, 229 self.default_height)) 230 231 @threadutils.highlander_threaded 232 def update(self): 233 self.claimed_icon.display = self.reward_data.is_claimed 234 if self.reward_data.is_granted: 235 self.background_icon.color = eveColor.SUCCESS_GREEN 236 else: 237 self.background_icon.color = eveThemeColor.THEME_FOCUSDARK 238 239 def LoadTooltipPanel(self, tooltipPanel, *args): 240 label_text = self.reward_data.hint 241 if label_text is None: 242 return 243 tooltipPanel.LoadStandardSpacing() 244 tooltipPanel.columns = 2 245 if isinstance(self.reward_data.icon, IconData): 246 icon = self.reward_data.icon.resolve(16) 247 else: 248 icon = self.reward_data.icon 249 _, labelObj = tooltipPanel.AddIconLabel(icon=icon, iconSize=self.icon_size, iconColor=TextColor.HIGHLIGHT, label=label_text, bold=False) 250 if self.reward_data.is_item: 251 tooltipPanel.state = uiconst.UI_NORMAL 252 labelObj.state = uiconst.UI_NORMAL 253 254 @property 255 def icon_size(self): 256 if self.reward_data.reward_type == RewardType.SP: 257 return 20 258 return 16 259 260 def OnColorThemeChanged(self): 261 super(RewardEntry, self).OnColorThemeChanged() 262 self.update() 263 264 265 class RewardEntryExpanded(Container): 266 default_height = 40 267 default_width = 212 268 269 def __init__(self, controller, reward_data, is_full_width, *args, **kwargs): 270 super(RewardEntryExpanded, self).__init__(*args, **kwargs) 271 self.controller = controller 272 self.reward_data = reward_data 273 self.is_full_width = is_full_width 274 self.construct_layout() 275 self.update() 276 277 def construct_layout(self): 278 self.construct_icon() 279 label_container = Container(name='label_container', parent=self, align=Align.VERTICALLY_CENTERED, height=20, padLeft=8) 280 self.label = TextBody(name='label', parent=label_container, align=Align.TOLEFT, state=uiconst.UI_NORMAL, maxLines=1, autoFadeSides=16) 281 282 def construct_icon(self): 283 self.icon = RewardEntry(name='icon', parent=self, align=Align.TOLEFT, state=uiconst.UI_DISABLED, reward_data=self.reward_data) 284 285 @threadutils.highlander_threaded 286 def update(self): 287 self.label.text = self.reward_data.text 288 if self.reward_data.is_item: 289 if self.is_full_width: 290 self.label.state = uiconst.UI_NORMAL 291 else: 292 self.label.state = uiconst.UI_DISABLED 293 self.state = uiconst.UI_NORMAL 294 self.LoadTooltipPanel = lambda tooltipPanel, *args: ItemTooltipPanel(tooltipPanel, self.reward_data) 295 296 297 class RewardScoreExpanded(RewardEntryExpanded): 298 299 def construct_icon(self): 300 self.icon = ScoreIcon(name='icon', parent=self, align=Align.TOLEFT, state=uiconst.UI_DISABLED, controller=self.controller) 301 302 @threadutils.highlander_threaded 303 def update(self): 304 self.label.text = GetByLabel('UI/Achievements/Window/Card/AchievementPointsHint') 305 306 307 def ItemTooltipPanel(tooltipPanel, reward_data, *args): 308 tooltipPanel.LoadStandardSpacing() 309 tooltipPanel.columns = 2 310 if isinstance(reward_data.icon, IconData): 311 icon = reward_data.icon.resolve(16) 312 else: 313 icon = reward_data.icon 314 _, labelObj = tooltipPanel.AddIconLabel(icon=icon, iconSize=16, label=reward_data.hint) 315 tooltipPanel.state = uiconst.UI_NORMAL 316 labelObj.state = uiconst.UI_NORMAL