achievement_banner.py (9010B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\theatersOfWar\campaigns\panels\achievement_banner.py 2 import evetypes 3 from achievement_system.client.api.repository import get_repository as achievement_repository 4 from achievement_system.client.model.definition.achievement.identifier import AchievementDefinitionIdentifier 5 from achievement_system.client.model.definition.reward.type import RewardType 6 from achievement_system.client.ui.controller.achievement_entry import AchievementEntryController 7 from achievement_system.client.ui.controller.reward import AchievementRewardController, RewardData 8 from achievement_system.client.ui.window.card.components.icon import AchievementIcon 9 from achievement_system.client.ui.window.card.components.milestones import BarAchievementMilestones 10 from achievement_system.client.ui.window.const import REWARD_ICON_BY_TYPE 11 from achievement_system.client.ui.window.window import AchievementsWindow 12 from carbon.common.script.util.format import FmtAmt 13 from carbonui import Align, TextAlign, PickState, TextColor 14 from carbonui.primitives.container import Container 15 from carbonui.primitives.containerAutoSize import ContainerAutoSize 16 from carbonui.primitives.layoutGrid import LayoutGrid 17 from carbonui.primitives.sprite import Sprite 18 from carbonui.text.styles import TextBody, TextHeader, TextDisplay, TextDetail 19 from collections import OrderedDict 20 from cosmetics.client.character.title.api.error import DefinitionNotFoundError 21 from cosmetics.client.character.title.api.repository import get_repository as title_repository 22 from eve.client.script.ui.control.gaugeCircular import GaugeCircular 23 from eve.client.script.ui.control.loadingContainer import LoadingContainer 24 from evelink.client import type_link 25 from localization import GetByLabel 26 27 class AchievementBanner(Container): 28 default_bgColor = (0.0, 0, 0, 0.25) 29 30 def ApplyAttributes(self, attributes): 31 super(AchievementBanner, self).ApplyAttributes(attributes) 32 self.campaignPanelController = attributes.campaignPanelController 33 self._construct_ui() 34 self.loading_container.LoadContent(self._load_async) 35 36 def _construct_ui(self): 37 self.loading_container = LoadingContainer(name='loading_container', parent=self, failureStateMessage=GetByLabel('UI/Sovereignty/SovHub/HubWnd/FailedToFetchData'), retryBtnLabel=GetByLabel('UI/Personalization/PaintTool/ErrorRetry'), align=Align.TOALL) 38 content_cont = ContainerAutoSize(name='content_cont', parent=self.loading_container, align=Align.VERTICALLY_CENTERED) 39 self.header_label = TextHeader(name='self.header_label', parent=content_cont, align=Align.TOTOP, textAlign=TextAlign.CENTER, uppercase=True) 40 self.icon_cont = Container(parent=content_cont, align=Align.TOTOP, height=160, pickState=PickState.ON, top=32) 41 self.progress_gauge = GaugeCircular(parent=self.icon_cont, showMarker=False, radius=80, lineWidth=4.0, align=Align.CENTER, pickState=PickState.OFF) 42 self.desc_label = TextBody(name='desc_label', parent=content_cont, align=Align.TOTOP, textAlign=TextAlign.CENTER, top=40, padding=(16, 0, 16, 0)) 43 self.progress_label = TextDisplay(parent=content_cont, align=Align.TOTOP, textAlign=TextAlign.CENTER, top=16) 44 self.reward_cont = ContainerAutoSize(name='reward_cont', parent=content_cont, align=Align.TOTOP, top=32) 45 self.reward_grid = LayoutGrid(parent=self.reward_cont, columns=2, cellSpacing=(8, 0), align=Align.CENTER) 46 self.milestones_container = Container(name='milestones_container', parent=content_cont, align=Align.TOTOP, height=BarAchievementMilestones.default_height, padTop=16) 47 48 def _get_achievement_for_campaign(self): 49 selected_campaign_controller = self.campaignPanelController.selected_campaign_controller 50 entry = selected_campaign_controller.achievement 51 return entry 52 53 def _load_async(self): 54 self.reward_grid.Flush() 55 entry = self._get_achievement_for_campaign() 56 if not entry: 57 return 58 controller = AchievementEntryController(entry) 59 self.header_label.SetText(controller.name) 60 self.desc_label.SetText(controller.description) 61 text = '%s / %s' % (FmtAmt(controller.progress), FmtAmt(controller.selected_milestone_target)) 62 progress_perentage = controller.percent_progress_towards_selected_milestone 63 self.progress_gauge.SetValue(progress_perentage) 64 self.progress_label.SetText(text) 65 AchievementIcon(name='icon', parent=self.icon_cont, align=Align.CENTER, pickState=PickState.OFF, controller=controller) 66 self.icon_cont.OnClick = lambda *args: self.open_achievement(controller.id) 67 self._load_rewards(controller) 68 self._load_milestones(controller) 69 70 def _load_rewards(self, achievement_entry_controller): 71 reward_ids = [ entry.identifier for entry in achievement_entry_controller.selected_milestone_rewards ] 72 reward_controller = AchievementRewardController(identifier=achievement_entry_controller.achievement_entry.identifier, milestone_id=achievement_entry_controller.selected_milestone_id, rewards=reward_ids) 73 reward_data_dict = get_reward_data_dict_for_controller(reward_controller) 74 if reward_data_dict: 75 reward_header_label = TextBody(text=GetByLabel('UI/Campaigns/AchievementRewards'), align=Align.CENTER, padBottom=8, color=TextColor.SECONDARY) 76 self.reward_grid.AddCell(reward_header_label, colSpan=self.reward_grid.columns) 77 maxWidth = self.width - 32 - 40 78 for reward_id, data in reward_data_dict.iteritems(): 79 sprite_cont = Container(align=Align.CENTERLEFT, pos=(0, 0, 40, 40), bgColor=(1, 1, 1, 0.2)) 80 Sprite(name='icon', parent=sprite_cont, align=Align.CENTER, width=32, height=32, texturePath=data.icon, pickState=PickState.OFF) 81 self.reward_grid.AddCell(sprite_cont, rowSpan=2) 82 TextDetail(parent=self.reward_grid, text=data.hint, align=Align.CENTERLEFT, color=TextColor.SECONDARY, maxWidth=maxWidth) 83 TextBody(parent=self.reward_grid, text=data.text, align=Align.CENTERLEFT, maxWidth=maxWidth, pickState=PickState.ON) 84 self.reward_grid.FillRow() 85 self.reward_grid.AddCell(Container(align=Align.TOPLEFT, height=16), colSpan=self.reward_grid.columns) 86 87 def _load_milestones(self, controller): 88 self.milestones_container.Flush() 89 milestones = BarAchievementMilestones(name='milestones', parent=self.milestones_container, align=Align.CENTERTOP, controller=controller) 90 milestones.back_button_container.Hide() 91 milestones.right_button_container.Hide() 92 93 def open_achievement(self, achievement_uuid): 94 achievement_id = AchievementDefinitionIdentifier(achievement_uuid) 95 AchievementsWindow.open_achievement(achievement_id) 96 wnd = AchievementsWindow.GetIfOpen() 97 if wnd: 98 wnd.Maximize() 99 100 def on_achievement_progressed(self, achievement_id, achievement_state): 101 entry = self._get_achievement_for_campaign() 102 if not entry or entry.identifier != achievement_id: 103 return 104 self._load_async() 105 106 107 def get_reward_data_dict_for_controller(reward_controller): 108 result = OrderedDict() 109 for reward_id in reward_controller.rewards: 110 reward_attributes = reward_controller.get_reward_attributes(reward_controller.milestone_id, reward_id) 111 if reward_attributes is None: 112 continue 113 reward_type = reward_attributes.reward_type 114 icon = REWARD_ICON_BY_TYPE[reward_attributes.reward_type] 115 hint = '' 116 text = reward_controller.get_reward_text(reward_attributes) 117 if reward_type == RewardType.TITLE: 118 hint = GetByLabel('UI/Achievements/Window/Rewards/Title') 119 if title_repository().definitions is None: 120 continue 121 try: 122 text = title_repository().definitions.get_title(reward_attributes.title_identifier).localized_name 123 except DefinitionNotFoundError: 124 continue 125 126 elif reward_type == RewardType.ITEM: 127 hint = evetypes.GetCategoryName(reward_attributes.type_id) 128 text = '%sx %s' % (reward_attributes.amount, evetypes.GetName(reward_attributes.type_id)) 129 text = type_link(reward_attributes.type_id, link_text=text) 130 elif reward_type == RewardType.SP: 131 hint = GetByLabel('UI/Common/SkillPoints') 132 elif reward_type == RewardType.ISK: 133 hint = GetByLabel('UI/Common/ISK') 134 is_granted = reward_controller.is_milestone_reached 135 is_claimed = achievement_repository().is_reward_claimed_for_achievement_milestone(reward_controller.identifier, reward_controller.milestone_id, reward_id) 136 reward_data = RewardData(reward_type=reward_type, is_granted=is_granted, is_claimed=is_claimed, icon=icon, text=text, hint=hint) 137 result[reward_id] = reward_data 138 139 return result