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

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