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

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