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