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

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