infoPanelCareerProgram.py (10120B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\infoPanels\infoPanelCareerProgram.py 2 from carbonui import TextColor 3 from carbonui.control.button import Button 4 from carbonui.primitives.container import Container 5 from carbonui.primitives.containerAutoSize import ContainerAutoSize 6 from carbonui.primitives.sprite import Sprite 7 from careergoals.client.career_goal_svc import get_career_goals_svc 8 from careergoals.client.signal import on_goal_progress_changed, on_goal_completed, on_reward_claimed 9 from eve.client.script.ui.control.eveLabel import EveLabelMedium, EveLabelLarge 10 from carbonui.primitives.line import Line 11 from eve.client.script.ui.control.tooltips import TooltipPanel 12 from eve.client.script.ui.shared.careerPortal.careerControllerUI import get_career_portal_controller_svc 13 from eve.client.script.ui.shared.careerPortal.cpSignals import on_cp_goal_tracking_added, on_cp_goal_tracking_removed 14 from eve.client.script.ui.shared.careerPortal.panels.goalDetailsPanel import AuraGoalPanel 15 from eve.client.script.ui.shared.infoPanels.InfoPanelBase import InfoPanelBase 16 from eve.client.script.ui.shared.infoPanels.const import infoPanelConst 17 from eve.client.script.ui.tooltips.tooltipsWrappers import TooltipBaseWrapper 18 from localization import GetByLabel 19 from uihider import UiHiderMixin 20 import carbonui.const as uiconst 21 from uihighlighting.uniqueNameConst import UNIQUE_NAME_CAREER_INFO_PANEL 22 from carbonui import Density, ButtonFrameType 23 from careergoals.client.goal import Goal 24 25 class InfoPanelCareerProgram(UiHiderMixin, InfoPanelBase): 26 __guid__ = 'uicls.InfoPanelCareerProgram' 27 default_name = 'InfoPanelCareerProgram' 28 uniqueUiName = UNIQUE_NAME_CAREER_INFO_PANEL 29 panelTypeID = infoPanelConst.PANEL_CAREER_PROGRAM 30 label = 'UI/CareerPortal/CareerPortalWnd' 31 default_iconTexturePath = 'res:/ui/Texture/Classes/InfoPanels/careerProgram.png' 32 default_mode = infoPanelConst.MODE_NORMAL 33 default_are_objectives_collapsable = False 34 35 def ApplyAttributes(self, attributes): 36 self.sectionHeader = None 37 super(InfoPanelCareerProgram, self).ApplyAttributes(attributes) 38 self.currentGoals = {} 39 titleText = GetByLabel(self.label) 40 self.titleLabel = self.headerCls(name='title', text=titleText, parent=self.headerCont, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED) 41 self.UpdatePanel() 42 self.ConnectSignals() 43 44 def ConnectSignals(self): 45 on_cp_goal_tracking_added.connect(self.UpdateTrackedGoal) 46 on_cp_goal_tracking_removed.connect(self.UpdateTrackedGoal) 47 on_goal_progress_changed.connect(self.OnGoalProgress) 48 on_goal_completed.connect(self.OnGoalCompleted) 49 on_reward_claimed.connect(self.OnRewardClaimed) 50 51 def DisconnectSignals(self): 52 on_cp_goal_tracking_added.disconnect(self.UpdateTrackedGoal) 53 on_cp_goal_tracking_removed.disconnect(self.UpdateTrackedGoal) 54 on_goal_progress_changed.disconnect(self.OnGoalProgress) 55 on_goal_completed.disconnect(self.OnGoalCompleted) 56 on_reward_claimed.disconnect(self.OnRewardClaimed) 57 58 @staticmethod 59 def IsAvailable(): 60 return bool(get_career_portal_controller_svc().get_tracked_goals()) 61 62 def UpdatePanel(self): 63 trackedGoalIDs = get_career_portal_controller_svc().get_tracked_goals() 64 for goalID in trackedGoalIDs: 65 goalCont = self.currentGoals.get(goalID, None) 66 if not goalCont or goalCont.destroyed: 67 goal = get_career_goals_svc().get_goal_data_controller().get_goal(goalID) 68 if not goal: 69 continue 70 self.currentGoals[goalID] = TrackedGoal(parent=self.mainCont, goal=goal) 71 72 for goalID in self.currentGoals.keys(): 73 if goalID in trackedGoalIDs: 74 continue 75 cont = self.currentGoals.pop(goalID, None) 76 if cont: 77 cont.Close() 78 79 def UpdateTrackedGoal(self, *args): 80 if set(self.currentGoals.keys()) != get_career_portal_controller_svc().get_tracked_goals(): 81 self.UpdatePanel() 82 83 def ConstructHeaderButton(self): 84 btn = self.ConstructSimpleHeaderButton() 85 btn.OnClick = OpenCareerPortal 86 87 def OnGoalProgress(self, goalID, progress): 88 self.UpdateGoal(goalID) 89 90 def OnGoalCompleted(self, goalID): 91 self.UpdateGoal(goalID) 92 93 def OnRewardClaimed(self, goalID, _): 94 if goalID in self.currentGoals: 95 isTracked = get_career_portal_controller_svc().is_goal_tracked(goalID) 96 if isTracked: 97 goal = get_career_goals_svc().get_goal_data_controller().get_goal(goalID) 98 if goal and not goal.has_unclaimed_rewards(): 99 get_career_portal_controller_svc().untrack_goal(goalID) 100 101 def UpdateGoal(self, goalID): 102 cont = self.currentGoals.get(goalID) 103 if not cont: 104 return 105 cont.UpdateGoalInfo() 106 107 def Close(self): 108 self.DisconnectSignals() 109 super(InfoPanelCareerProgram, self).Close() 110 111 112 def OpenCareerPortal(*args): 113 from eve.client.script.ui.shared.careerPortal.careerPortalWnd import CareerPortalDockablePanel 114 wnd = CareerPortalDockablePanel.GetIfOpen() 115 if wnd and not wnd.destroyed: 116 wnd.Maximize() 117 else: 118 CareerPortalDockablePanel.Open() 119 120 121 class TrackedGoal(ContainerAutoSize): 122 default_align = uiconst.TOTOP 123 default_alignMode = uiconst.TOTOP 124 default_padBottom = 8 125 126 def ApplyAttributes(self, attributes): 127 super(TrackedGoal, self).ApplyAttributes(attributes) 128 self.goal = attributes.goal 129 SectionHeader(parent=self, title=self.goal.definition.name, goal=self.goal) 130 self._collapsed = False 131 mainContainer = ContainerAutoSize(parent=self, bgColor=(0, 0, 0, 0.25), align=uiconst.TOTOP, alignMode=uiconst.TOTOP, padTop=4) 132 wrapper = ContainerAutoSize(parent=mainContainer, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, padding=8) 133 progressCont = ContainerAutoSize(name='progressCont', parent=wrapper, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, state=uiconst.UI_NORMAL) 134 self.completeLine = Line(parent=progressCont, state=uiconst.UI_HIDDEN, align=uiconst.TOLEFT_NOPUSH, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, color=TextColor.SUCCESS, opacity=0.75, left=-8) 135 progressCont.OnClick = self._OnProgressContClicked 136 self.progressLabel = EveLabelLarge(parent=progressCont, name='progressLabel', align=uiconst.TOTOP) 137 contentContainer = ContainerAutoSize(name='contentContainer', parent=wrapper, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, clipChildren=True) 138 self.bottomCont = ContainerAutoSize(name='bottomCont', parent=contentContainer, align=uiconst.TOTOP) 139 self.descLabel = EveLabelMedium(parent=self.bottomCont, name='descLabel', align=uiconst.TOTOP, text=self.goal.definition.description, padding=4) 140 self.claimButton = Button(name='claimButton', align=uiconst.TOTOP, parent=self.bottomCont, density=Density.COMPACT, frame_type=ButtonFrameType.CUT_BOTTOM_LEFT_RIGHT, label=GetByLabel('UI/CareerPortal/ClaimRewards'), func=OpenCareerPortal) 141 self.UpdateGoalInfo() 142 143 def UpdateGoalInfo(self): 144 self.progressLabel.text = GetByLabel('UI/CareerPortal/GoalProgressCompleted', progressValue=self.goal.progress, targetValue=self.goal.definition.target_value) 145 if self.goal.has_unclaimed_rewards(): 146 self.completeLine.Show() 147 self.claimButton.Show() 148 else: 149 self.completeLine.Hide() 150 self.claimButton.Hide() 151 self.descLabel.text = self.goal.definition.description 152 153 def _OnProgressContClicked(self): 154 self._collapsed = not self._collapsed 155 if self._collapsed: 156 self.bottomCont.CollapseHeight(callback=self.bottomCont.Hide) 157 else: 158 self.bottomCont.Show() 159 self.bottomCont.ExpandHeight() 160 161 162 class SectionHeader(ContainerAutoSize): 163 default_name = 'SectionHeader' 164 default_state = uiconst.UI_NORMAL 165 default_align = uiconst.TOTOP 166 default_alignMode = uiconst.TOTOP 167 default_bgColor = (0, 0, 0, 0.35) 168 169 def ApplyAttributes(self, attributes): 170 super(SectionHeader, self).ApplyAttributes(attributes) 171 title = attributes.title 172 goal = attributes.goal 173 mainContainer = ContainerAutoSize(parent=self, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, padding=8) 174 auraIconContainer = Container(name='auraIconContainer', parent=mainContainer, align=uiconst.TORIGHT, width=16, padLeft=4) 175 auraSprite = Sprite(parent=auraIconContainer, align=uiconst.CENTER, texturePath='res:/UI/Texture/classes/careerPortal/aura/aura_icon_16x16.png', width=16, height=16) 176 auraSprite.tooltipPanelClassInfo = AuraAssistanceTooltip(goal) 177 titleContainer = ContainerAutoSize(name='titleContainer', parent=mainContainer, state=uiconst.UI_DISABLED, align=uiconst.TOTOP, clipChildren=True) 178 EveLabelLarge(name='titleLabel', parent=titleContainer, align=uiconst.TOTOP, maxLines=1, showEllipsis=True, color=TextColor.HIGHLIGHT, text=title) 179 self.hint = title 180 181 182 class AuraAssistanceTooltip(TooltipBaseWrapper): 183 184 def __init__(self, goal, *args, **kwargs): 185 super(AuraAssistanceTooltip, self).__init__(*args, **kwargs) 186 self.goal = goal 187 188 def CreateTooltip(self, parent, owner, idx): 189 self.tooltipPanel = TooltipPanel(parent=parent, owner=owner, idx=idx) 190 self.tooltipPanel.LoadGeneric1ColumnTemplate() 191 self.tooltipPanel.SetState(uiconst.UI_NORMAL) 192 self.tooltipPanel.AddCaptionMedium(text=GetByLabel('UI/CareerPortal/AuraAssistancePanelTitle'), left=16) 193 self.tooltipPanel.AddDivider() 194 auraAssistanceSection = AuraGoalPanel(width=400, align=uiconst.CENTER, insidePadding=(8, 8, 8, 8)) 195 auraAssistanceSection.headerCont.Hide() 196 auraAssistanceSection.LoadGoal(self.goal) 197 auraAssistanceSection.opacity = 1 198 self.tooltipPanel.AddCell(auraAssistanceSection) 199 return self.tooltipPanel