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

globalProgress.py (21584B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\careerPortal\globalProgress.py
      2 import eveicon
      3 from carbon.common.script.sys.serviceConst import ROLE_GML
      4 from carbonui import Align, PickState, uiconst
      5 from carbonui.text.styles import TextBody
      6 from carbonui.primitives.container import Container
      7 from carbonui.primitives.gradientSprite import GradientSprite
      8 from carbonui.primitives.sprite import Sprite
      9 from carbonui.primitives.stretchspritehorizontal import StretchSpriteHorizontal
     10 from carbonui.uianimations import animations
     11 from careergoals.client.career_goal_svc import get_career_goals_svc
     12 from careergoals.client.const import RewardLabel
     13 from careergoals.client.signal import on_goal_progress_changed, on_goal_completed, on_reward_claimed, on_reward_claimed_failed
     14 from eve.client.script.ui import eveColor
     15 from eve.client.script.ui.shared.careerPortal import careerConst
     16 from eve.client.script.ui.shared.careerPortal.progressHint import ProgressHint
     17 from eve.client.script.ui.shared.careerPortal.rewards.rewardsTooltip import GlobalProgressAlphaRewardTooltip, GlobalProgressOmegaRewardTooltip
     18 from eve.client.script.ui.shared.careerPortal.util import get_overall_progress_goals_description, get_skill_point_icon_for_reward
     19 from eve.client.script.ui.tooltips.tooltipsWrappers import TooltipHeaderDescriptionWrapper
     20 from eve.client.script.ui.util.uix import QtyPopup
     21 from localization import GetByLabel
     22 from omega.client.clone_grade_svc import get_clone_grade_svc
     23 
     24 class GlobalProgress(Container):
     25     default_height = 144
     26 
     27     def __init__(self, *args, **kwargs):
     28         super(GlobalProgress, self).__init__(*args, **kwargs)
     29         self.controller = get_career_goals_svc().get_goal_data_controller()
     30         self.last_overall_progress = self.controller.get_overall_progress()
     31         self.goal_markers_by_goal_id = []
     32         self.construct_layout()
     33         self.update()
     34         self.connect_signals()
     35 
     36     def Close(self):
     37         try:
     38             self.disconnect_signals()
     39         finally:
     40             super(GlobalProgress, self).Close()
     41 
     42     def connect_signals(self):
     43         self.progress_container.on_size_changed.connect(self.on_progress_size_change)
     44         on_goal_progress_changed.connect(self.on_goal_progress_changed)
     45         on_goal_completed.connect(self.on_goal_completed)
     46 
     47     def disconnect_signals(self):
     48         self.progress_container.on_size_changed.disconnect(self.on_progress_size_change)
     49         on_goal_progress_changed.disconnect(self.on_goal_progress_changed)
     50         on_goal_completed.disconnect(self.on_goal_completed)
     51 
     52     def construct_layout(self):
     53         self.marker_container = Container(name='marker_container', parent=self, align=Align.TOBOTTOM_NOPUSH, height=120, padLeft=106, top=13)
     54         OmegaRewardTrack(name='omega_reward_track', parent=self, align=Align.TOTOP, opacity=1.0)
     55         self.construct_progress_bar()
     56         AlphaRewardTrack(name='alpha_reward_track', parent=self, align=Align.TOTOP)
     57         self.construct_label()
     58         self.construct_markers()
     59 
     60     def construct_progress_bar(self):
     61         self.progress_container = Container(name='progress_container', parent=self, align=Align.TOTOP, height=14, padLeft=106)
     62         self.progress_bar = ProgressBar(name='progress_bar', parent=self.progress_container, align=Align.TOTOP)
     63 
     64     def construct_label(self):
     65         label_container = Container(name='label_container', parent=self, align=Align.CENTERLEFT, pos=(32, -1, 1, 1))
     66         TextBody(name='label', parent=label_container, align=Align.CENTER, text=GetByLabel('UI/CareerPortal/OverallProgress'))
     67 
     68     def construct_markers(self):
     69         for goal in self.controller.get_overall_goals():
     70             rewards = goal.definition.rewards
     71             if not rewards:
     72                 continue
     73             marker = GoalMarker(parent=self.marker_container, align=Align.TOLEFT_NOPUSH, goal=goal, ratio=float(goal.definition.target_value) / self.overall_target)
     74             self.goal_markers_by_goal_id.append(marker)
     75             self.goal_markers_by_goal_id = sorted(self.goal_markers_by_goal_id, key=lambda v: v.ratio)
     76 
     77     def update(self):
     78         unseen_career_points = self.controller.get_local_completed_career_points()
     79         if unseen_career_points > 0:
     80             self.update_fanfare(unseen_career_points)
     81         else:
     82             self.update_instant()
     83 
     84     def update_fanfare(self, unseen_career_points):
     85         end_progress = self.controller.get_overall_progress()
     86         end_ratio = end_progress / self.overall_target
     87         start_progress = end_progress - unseen_career_points
     88         start_ratio = start_progress / self.overall_target
     89         diff_ratio = end_ratio - start_ratio
     90         self.progress_bar.set_progress(ratio=start_ratio, animate=False)
     91         animations.MorphScalar(obj=self.progress_bar, attrName='progress', startVal=start_ratio, endVal=end_ratio, duration=careerConst.FANFARE_PROGRESS_DURATION, timeOffset=careerConst.FANFARE_START_DELAY)
     92         self.progress_bar.show_progress_hint(progress=unseen_career_points, duration=careerConst.FANFARE_PROGRESS_DURATION, offset=careerConst.FANFARE_START_DELAY)
     93         self.last_overall_progress = end_progress
     94         for marker in self.goal_markers_by_goal_id:
     95             if not marker.goal.is_completed():
     96                 continue
     97             if marker.ratio <= start_ratio:
     98                 self.progress_bar.set_milestone(marker.ratio, animate=False)
     99                 marker.complete(animate=False)
    100                 continue
    101             if start_ratio < marker.ratio <= end_ratio:
    102                 animations.MorphScalar(obj=self.progress_bar, attrName='milestone', startVal=start_ratio, endVal=marker.ratio, duration=careerConst.FANFARE_PROGRESS_DURATION, timeOffset=careerConst.FANFARE_START_DELAY)
    103                 marker.complete(time_offset=careerConst.FANFARE_START_DELAY + careerConst.FANFARE_PROGRESS_DURATION)
    104 
    105     def update_instant(self):
    106         if self.controller.are_all_overall_goals_completed():
    107             self.progress_bar.set_milestone(ratio=1.0, animate=False)
    108         else:
    109             self.progress_bar.set_progress(ratio=self.controller.get_overall_progress() / self.overall_target, animate=False)
    110         for marker in self.goal_markers_by_goal_id:
    111             if marker.goal.is_completed():
    112                 self.progress_bar.set_milestone(marker.ratio, animate=False)
    113                 marker.complete(animate=False)
    114 
    115     def on_progress_size_change(self, width, height):
    116         for marker in self.goal_markers_by_goal_id:
    117             marker.left = width * marker.ratio - marker.width * 0.5
    118 
    119     def on_goal_progress_changed(self, goal_id, progress):
    120         if not self.controller.is_overall_goal(goal_id):
    121             return
    122         self.progress_bar.set_progress(ratio=float(progress) / self.overall_target)
    123         self.progress_bar.show_progress_hint(progress=progress - self.last_overall_progress, duration=careerConst.FANFARE_PROGRESS_DURATION)
    124         self.last_overall_progress = progress
    125 
    126     def on_goal_completed(self, goal_id):
    127         if not self.controller.is_overall_goal(goal_id):
    128             return
    129         goal = self.controller.get_goal(goal_id)
    130         self.progress_bar.set_milestone(ratio=float(goal.definition.target_value) / self.overall_target)
    131 
    132     @property
    133     def overall_target(self):
    134         return float(self.controller.get_max_overall_target())
    135 
    136 
    137 class OmegaRewardTrack(Container):
    138     default_height = 64
    139     background_color = eveColor.OMEGA_YELLOW
    140     background_bend_align = Align.BOTTOMLEFT
    141     background_bend_height = 40
    142     background_bend_top = 0
    143     background_gradient_align = Align.TOBOTTOM
    144     icon_texture = eveicon.omega
    145     icon_offset = 2
    146     opacity_min = 0.1
    147     opacity_max = 0.3
    148 
    149     def __init__(self, *args, **kwargs):
    150         super(OmegaRewardTrack, self).__init__(*args, **kwargs)
    151         self.construct_layout()
    152 
    153     def construct_layout(self):
    154         self.construct_icon()
    155         self.construct_background()
    156 
    157     def construct_background(self):
    158         background_container = Container(name='background_container', parent=self, padLeft=32)
    159         Sprite(name='background_bend', parent=background_container, align=self.background_bend_align, texturePath='res:/UI/Texture/classes/careerPortal/track_bend.png', color=self.background_color, opacity=self.opacity_min, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pickState=PickState.OFF, width=80, height=self.background_bend_height, top=self.background_bend_top)
    160         GradientSprite(name='background_gradient', align=self.background_gradient_align, parent=background_container, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pickState=PickState.OFF, rgbData=((0.0, self.background_color[:3]), (1.0, self.background_color[:3])), alphaData=((0.0, self.opacity_min), (0.5, self.opacity_max), (1.0, self.opacity_min)), height=21, padLeft=80)
    161 
    162     def construct_icon(self):
    163         Sprite(name='icon', parent=self, align=Align.CENTERLEFT, pickState=PickState.OFF, texturePath=self.icon_texture, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0,
    164          self.icon_offset,
    165          64,
    166          64))
    167 
    168 
    169 class AlphaRewardTrack(OmegaRewardTrack):
    170     background_color = eveColor.CRYO_BLUE
    171     background_bend_align = Align.TOPLEFT
    172     background_bend_height = -40
    173     background_bend_top = 40
    174     background_gradient_align = Align.TOTOP
    175     icon_texture = eveicon.alpha
    176     icon_offset = -4
    177 
    178 
    179 class ProgressBar(Container):
    180     default_state = uiconst.UI_NORMAL
    181     default_height = 14
    182 
    183     def __init__(self, *args, **kwargs):
    184         super(ProgressBar, self).__init__(*args, **kwargs)
    185         self.controller = get_career_goals_svc().get_goal_data_controller()
    186         self.progress_hint = None
    187         self.construct_layout()
    188 
    189     def construct_layout(self):
    190         self.milestone_arrow = StretchArrow(name='milestone_arrow', parent=self, arrow_color=eveColor.SUCCESS_GREEN, arrow_opacity=1.0, top=4)
    191         self.progress_arrow = StretchArrow(name='progress_arrow', parent=self, arrow_color=eveColor.CRYO_BLUE, arrow_opacity=1.0, top=4)
    192         self.background_arrow = StretchArrow(name='background_arrow', parent=self, top=4)
    193         self.set_progress(0.0, animate=False)
    194         self.set_milestone(0.0, animate=False)
    195         self.tooltipPanelClassInfo = TooltipHeaderDescriptionWrapper(header=self.tooltip_title, description=self.tooltip_description)
    196 
    197     def set_progress(self, ratio, animate = True):
    198         self.progress_arrow.set_arrow_width(ratio, animate)
    199         self.update_tooltip()
    200 
    201     def set_milestone(self, ratio, animate = True):
    202         self.milestone_arrow.set_arrow_width(ratio, animate)
    203         self.update_tooltip()
    204 
    205     def update_tooltip(self):
    206         if self.tooltipPanelClassInfo:
    207             self.tooltipPanelClassInfo.headerText = self.tooltip_title
    208             self.tooltipPanelClassInfo.descriptionText = self.tooltip_description
    209 
    210     def show_progress_hint(self, progress, duration = 1.0, offset = 0.0):
    211         if self.progress_hint:
    212             self.progress_hint.Close()
    213         self.progress_hint = ProgressHint(name='progress_hint', parent=self.progress_arrow, align=Align.TOLEFT, start_value=0, end_value=progress, duration=duration, offset=offset, left=self.progress_arrow.arrow.width - 70, top=-12, padTop=-10)
    214 
    215     def qa_progress_goal(self):
    216         qty_popup = QtyPopup(minvalue=0, setvalue=1)
    217         if qty_popup and 'qty' in qty_popup:
    218             for goal in self.controller.get_overall_goals():
    219                 self.controller.admin_progress_goal(goal.goal_id, qty_popup['qty'])
    220 
    221     def GetMenu(self):
    222         if session and session.role & ROLE_GML:
    223             return [['QA: Progress', self.qa_progress_goal]]
    224 
    225     @property
    226     def progress(self):
    227         return self.progress_arrow.progress
    228 
    229     @progress.setter
    230     def progress(self, value):
    231         self.progress_arrow.progress = value
    232 
    233     @property
    234     def milestone(self):
    235         return self.milestone_arrow.progress
    236 
    237     @milestone.setter
    238     def milestone(self, value):
    239         self.milestone_arrow.progress = value
    240 
    241     @property
    242     def tooltip_title(self):
    243         return GetByLabel('UI/CareerPortal/OverallCareerPoints', currentPoints=self.controller.get_overall_progress(), totalPoints=float(self.controller.get_max_overall_target()))
    244 
    245     @property
    246     def tooltip_description(self):
    247         return get_overall_progress_goals_description()
    248 
    249 
    250 class StretchArrow(Container):
    251     default_align = Align.TOTOP_NOPUSH
    252     default_height = 6
    253 
    254     def __init__(self, arrow_color = eveColor.WHITE, arrow_opacity = 0.2, *args, **kwargs):
    255         super(StretchArrow, self).__init__(*args, **kwargs)
    256         self.arrow_color = arrow_color
    257         self.arrow_opacity = arrow_opacity
    258         self.construct_layout()
    259 
    260     def construct_layout(self):
    261         self.arrow = StretchSpriteHorizontal(name='arrow', parent=self, align=Align.TOLEFT_PROP, pickState=PickState.OFF, texturePath='res:/UI/Texture/classes/careerPortal/progress_arrow.png', color=self.arrow_color, opacity=self.arrow_opacity, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, leftEdgeSize=4, rightEdgeSize=4, width=1.0, height=self.default_height)
    262 
    263     def set_arrow_width(self, value, animate = True):
    264         self.arrow.display = value > 0
    265         if animate:
    266             animations.MorphScalar(self.arrow, 'width', startVal=self.arrow.width, endVal=value, duration=0.3)
    267         else:
    268             self.arrow.width = value
    269 
    270     @property
    271     def progress(self):
    272         return self.arrow.width
    273 
    274     @progress.setter
    275     def progress(self, value):
    276         self.arrow.width = value
    277 
    278 
    279 class GoalMarker(Container):
    280     default_width = 40
    281     default_height = 120
    282 
    283     def __init__(self, goal, ratio, *args, **kwargs):
    284         super(GoalMarker, self).__init__(*args, **kwargs)
    285         self.goal = goal
    286         self.ratio = ratio
    287         self.construct_layout()
    288 
    289     def construct_layout(self):
    290         self.checkmark_icon = Sprite(name='checkmark_icon', parent=self, align=Align.CENTER, texturePath='res:/UI/Texture/classes/careerPortal/diamond_checkmark.png', glowBrightness=0.5, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, opacity=0, pos=(0, 0, 21, 20))
    291         self.marker_icon = Sprite(name='marker_icon', parent=self, align=Align.CENTER, texturePath='res:/UI/Texture/classes/careerPortal/diamond_marker.png', color=eveColor.CRYO_BLUE, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0, 0, 20, 20))
    292         omega_rewards = self.goal.definition.omega_rewards
    293         if len(omega_rewards) > 0:
    294             OmegaGoalReward(name='omega_goal_reward', parent=self, goal=self.goal, top=-38)
    295         alpha_rewards = self.goal.definition.alpha_rewards
    296         if len(alpha_rewards) > 0:
    297             AlphaGoalReward(name='alpha_goal_reward', parent=self, goal=self.goal, top=38)
    298 
    299     def complete(self, animate = True, time_offset = 0.0):
    300         if animate:
    301             animations.FadeIn(obj=self.checkmark_icon, duration=0.3, timeOffset=time_offset)
    302             color = self.marker_icon.color
    303             current_color = (color.r,
    304              color.g,
    305              color.b,
    306              color.a)
    307             animations.SpColorMorphTo(obj=self.marker_icon, attrName='color', startColor=current_color, endColor=eveColor.SUCCESS_GREEN, duration=0.3, timeOffset=time_offset)
    308         else:
    309             self.checkmark_icon.opacity = 1.0
    310             self.marker_icon.color = eveColor.SUCCESS_GREEN
    311 
    312 
    313 class OmegaGoalReward(Container):
    314     default_align = Align.CENTER
    315     default_state = uiconst.UI_NORMAL
    316     default_width = 36
    317     default_height = 40
    318     reward_label = RewardLabel.OMEGA
    319     background_icon = 'res:/UI/Texture/classes/careerPortal/reward_omega_bg.png'
    320     highlight_color = eveColor.OMEGA_YELLOW
    321     __notifyevents__ = ['OnSubscriptionChanged']
    322 
    323     def __init__(self, goal, *args, **kwargs):
    324         super(OmegaGoalReward, self).__init__(*args, **kwargs)
    325         self.goal = goal
    326         self.tooltipPanelClassInfo = None
    327         self._set_tooltip_panel_class()
    328         self.construct_layout()
    329         self.update(animate=False)
    330         self.connect_signals()
    331 
    332     def _set_tooltip_panel_class(self):
    333         self.tooltipPanelClassInfo = GlobalProgressOmegaRewardTooltip(self.goal)
    334 
    335     def connect_signals(self):
    336         on_reward_claimed.connect(self.on_reward_claimed)
    337         on_reward_claimed_failed.connect(self.on_reward_claimed_failed)
    338         sm.RegisterNotify(self)
    339 
    340     def disconnect_signals(self):
    341         on_reward_claimed.disconnect(self.on_reward_claimed)
    342         on_reward_claimed_failed.disconnect(self.on_reward_claimed_failed)
    343         sm.UnregisterNotify(self)
    344 
    345     def Close(self):
    346         try:
    347             self.disconnect_signals()
    348         finally:
    349             super(OmegaGoalReward, self).Close()
    350 
    351     def construct_layout(self):
    352         self.construct_lock()
    353         self.construct_checkmark()
    354         self.construct_reward_icon()
    355         self.construct_background()
    356 
    357     def construct_lock(self):
    358         self.lock = Sprite(name='lock', parent=self, align=Align.CENTER, pickState=PickState.OFF, texturePath=eveicon.locked, color=self.highlight_color, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0, 0, 16, 16))
    359 
    360     def construct_checkmark(self):
    361         self.checkmark = Container(name='checkmark', parent=self, align=Align.CENTER, pos=(0, 0, 16, 16))
    362         Sprite(name='icon', parent=self.checkmark, align=Align.CENTER, pickState=PickState.OFF, texturePath=eveicon.checkmark, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0, 0, 8, 8))
    363         Sprite(name='background', parent=self.checkmark, align=Align.CENTER, pickState=PickState.OFF, texturePath='res:/UI/Texture/classes/careerPortal/filled_circle.png', color=self.highlight_color, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0, 0, 17, 17))
    364 
    365     def construct_reward_icon(self):
    366         self.reward_icon = Sprite(name='reward_icon', parent=self, align=Align.CENTER, pickState=PickState.OFF, pos=(0, 0, 30, 30))
    367         rewards = self.rewards
    368         if len(rewards) == 1:
    369             self.reward_icon.texturePath = get_skill_point_icon_for_reward(rewards[0])
    370         else:
    371             self.reward_icon.texturePath = careerConst.CRATE_64_SIZES.get(self.goal.definition.career, '')
    372 
    373     def construct_background(self):
    374         Sprite(name='background', parent=self, align=Align.CENTER, pickState=PickState.OFF, texturePath=self.background_icon, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.5, pos=(0, 0, 36, 40))
    375 
    376     def update(self, animate = True):
    377         self.update_reward_icon(animate)
    378         self.update_checkmark(animate)
    379         self.update_lock(animate)
    380 
    381     def update_reward_icon(self, animate):
    382         if self.has_omega:
    383             target_opacity = 0.5 if self.is_claimed else 1.0
    384         else:
    385             target_opacity = 0.5
    386         if animate:
    387             animations.FadeTo(self.reward_icon, startVal=self.reward_icon.opacity, endVal=target_opacity, duration=0.3)
    388         else:
    389             self.reward_icon.opacity = target_opacity
    390 
    391     def update_checkmark(self, animate):
    392         if self.has_omega:
    393             target_opacity = 1.0 if self.is_claimed else 0.0
    394         else:
    395             target_opacity = 0.5
    396         if animate:
    397             animations.FadeTo(self.checkmark, startVal=self.checkmark.opacity, endVal=target_opacity, duration=0.3)
    398         else:
    399             self.checkmark.opacity = target_opacity
    400 
    401     def update_lock(self, animate):
    402         target_opacity = 0.0 if self.has_omega else 1.0
    403         if animate:
    404             animations.FadeTo(self.lock, startVal=self.lock.opacity, endVal=target_opacity, duration=0.3)
    405         else:
    406             self.lock.opacity = target_opacity
    407 
    408     def OnSubscriptionChanged(self):
    409         self.update()
    410 
    411     @property
    412     def rewards(self):
    413         return self.goal.definition.omega_rewards
    414 
    415     def on_reward_claimed(self, goal_id, reward_label):
    416         if goal_id != self.goal.goal_id or self.reward_label != reward_label:
    417             return
    418         self.update()
    419 
    420     def on_reward_claimed_failed(self, goal_id, reward_label):
    421         if goal_id != self.goal.goal_id or self.reward_label != reward_label:
    422             return
    423         self.update()
    424 
    425     @property
    426     def is_claimed(self):
    427         return self.goal.is_reward_label_claimed(self.reward_label)
    428 
    429     @property
    430     def has_omega(self):
    431         return get_clone_grade_svc().is_omega_with_grace_period()
    432 
    433 
    434 class AlphaGoalReward(OmegaGoalReward):
    435     reward_label = RewardLabel.ALPHA
    436     background_icon = 'res:/UI/Texture/classes/careerPortal/reward_alpha_bg.png'
    437     highlight_color = eveColor.SUCCESS_GREEN
    438 
    439     def _set_tooltip_panel_class(self):
    440         self.tooltipPanelClassInfo = GlobalProgressAlphaRewardTooltip(self.goal)
    441 
    442     def update_reward_icon(self, animate):
    443         target_opacity = 0.5 if self.is_claimed else 1.0
    444         if animate:
    445             animations.FadeTo(self.reward_icon, startVal=self.reward_icon.opacity, endVal=target_opacity, duration=0.3)
    446         else:
    447             self.reward_icon.opacity = target_opacity
    448 
    449     def update_checkmark(self, animate):
    450         target_opacity = 1.0 if self.is_claimed else 0.0
    451         if animate:
    452             animations.FadeTo(self.checkmark, startVal=self.checkmark.opacity, endVal=target_opacity, duration=0.3)
    453         else:
    454             self.checkmark.opacity = target_opacity
    455 
    456     def update_lock(self, animate):
    457         self.lock.opacity = 0.0
    458 
    459     @property
    460     def rewards(self):
    461         return self.goal.definition.alpha_rewards