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

infoPanelMissions.py (10218B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\infoPanels\infoPanelMissions.py
      2 import blue
      3 import carbonui.const as uiconst
      4 from carbonui.control.scrollContainer import ScrollContainer
      5 from eve.client.script.ui.shared.infoPanels.const.infoPanelUIConst import PANELWIDTH, LEFTPAD
      6 from eve.client.script.ui.shared.infoPanels.const import infoPanelConst
      7 from eve.client.script.ui.shared.infoPanels.InfoPanelBase import InfoPanelBase
      8 from eve.client.script.ui.shared.pointerTool.pointerToolConst import UNIQUE_NAME_MISSION_INFO_PANEL
      9 from localization import GetByLabel
     10 from missions.client.ui.missionEntry import MissionEntry
     11 MISSION_CONTAINER_WIDTH = PANELWIDTH - LEFTPAD
     12 PADDING_MISSION_TO_MISSION = 12
     13 PADDING_INFO_PANEL_TITLE_TO_HEADER = 4
     14 SCROLL_CONTAINER_HEIGHT_MAX = 450
     15 EXPANDED_MISSION_INDEX = 'ExpandedMissionIndex'
     16 MISSION_INDEX_NONE = None
     17 MISSION_INDEX_UNSET = -1
     18 SCROLL_DATA_SETTING = 'MissionInfoPanelScrollData'
     19 
     20 class InfoPanelMissionData(object):
     21     DEFAULT_ICON_TEXTURE_PATH = None
     22     DEFAULT_ICON_OPACITY = 0.7
     23     DEFAULT_ICON_COLOR = None
     24 
     25     def __init__(self, title, icon = None):
     26         self.title = title
     27         self.icon = icon or self.DEFAULT_ICON_TEXTURE_PATH
     28         self._InitializeObjectives()
     29 
     30     def _InitializeObjectives(self):
     31         self.objectives = []
     32 
     33     def GetObjectives(self):
     34         return self.objectives
     35 
     36     def GetIcon(self):
     37         return (self.icon, self.DEFAULT_ICON_OPACITY, self.DEFAULT_ICON_COLOR)
     38 
     39     def GetID(self):
     40         return self.title
     41 
     42     def GetContextMenu(self):
     43         return None
     44 
     45     def GetStateColor(self):
     46         return None
     47 
     48     @property
     49     def hint(self):
     50         return self.title
     51 
     52 
     53 class InfoPanelMissions(InfoPanelBase):
     54     default_state = uiconst.UI_PICKCHILDREN
     55     uniqueUiName = UNIQUE_NAME_MISSION_INFO_PANEL
     56     default_are_objectives_collapsable = True
     57     hasSettings = False
     58     MAINPADTOP = 4
     59     featureID = None
     60     __notifyevents__ = InfoPanelBase.__notifyevents__ + ['OnExpandedMissionChanged']
     61 
     62     def ApplyAttributes(self, attributes):
     63         self.missions = []
     64         self.missionContainers = {}
     65         self.header = None
     66         self.scrollContainer = None
     67         self.expandedMissionIndex = None
     68         InfoPanelBase.ApplyAttributes(self, attributes)
     69         self._ConstructHeader()
     70 
     71     def GetTitle(self):
     72         if self.label:
     73             return GetByLabel(self.label)
     74         return ''
     75 
     76     def ConstructNormal(self):
     77         self.missions = self.GetMissions()
     78         self.mainCont.Flush()
     79         self.scrollContainer = ScrollContainer(name='missions_scroll_container', parent=self.mainCont, align=uiconst.TOTOP, height=0)
     80         for missionIndex, mission in enumerate(self.missions):
     81             objectives = mission.GetObjectives()
     82             top = self._GetMissionContainerTop(missionIndex)
     83             missionContainer = MissionEntry(name='mission_container_%s' % mission.GetID(), parent=self.scrollContainer, align=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, width=MISSION_CONTAINER_WIDTH, top=top, missionIndex=missionIndex, mission=mission, objectives=objectives, HasOptionsMenu=self.HasOptionsMenu, GetOptionsMenu=self.GetOptionsMenu, UpdateExpandedStateForMission=self.UpdateExpandedStateForMission, callback=self.UpdateScrollHeight, isCollapsable=self.default_are_objectives_collapsable)
     84             self.missionContainers[missionIndex] = missionContainer
     85 
     86         self.InitializeExpandedStates()
     87         self.UpdateScrollHeight()
     88         self.UpdateScrollPosition()
     89 
     90     def Hide(self, *args):
     91         self.SaveScrollData()
     92         super(InfoPanelMissions, self).Hide(*args)
     93 
     94     def Close(self):
     95         self.SaveScrollData()
     96         super(InfoPanelMissions, self).Close()
     97 
     98     def OnBeforeModeChanged(self, oldMode):
     99         self.SaveScrollData()
    100         super(InfoPanelMissions, self).OnBeforeModeChanged(oldMode)
    101 
    102     def _ConstructHeader(self):
    103         self.header = self.headerCls(name='missions_container', parent=self.headerCont, align=uiconst.CENTERLEFT, text=self.GetTitle())
    104 
    105     def _GetMissionContainerTop(self, missionIndex):
    106         if missionIndex > 0:
    107             return PADDING_MISSION_TO_MISSION
    108         return 0
    109 
    110     def UpdateScrollHeight(self):
    111         if self.scrollContainer and not self.scrollContainer.destroyed:
    112             totalHeight = self.scrollContainer.mainCont.height
    113             self.scrollContainer.height = min(totalHeight, SCROLL_CONTAINER_HEIGHT_MAX)
    114             self.scrollContainer.clipCont.clipChildren = totalHeight > SCROLL_CONTAINER_HEIGHT_MAX
    115 
    116     def UpdateScrollPosition(self):
    117         blue.synchro.Yield()
    118         if self.scrollContainer and not self.scrollContainer.destroyed:
    119             scrollFraction, scrollHeight = self.GetScrollDataSetting()
    120             currentScrollHeight = self.scrollContainer.height
    121             if scrollFraction and scrollHeight and 0.0 <= scrollFraction <= 1.0 and scrollHeight == currentScrollHeight:
    122                 self.scrollContainer.ScrollToVertical(scrollFraction)
    123 
    124     def SaveScrollData(self):
    125         if self.scrollContainer and not self.scrollContainer.destroyed:
    126             scrollFraction = self.scrollContainer.GetPositionVertical()
    127             currentScrollHeight = self.scrollContainer.height
    128             self.SetScrollDataSetting((scrollFraction, currentScrollHeight))
    129 
    130     def ScrollToMission(self, missionIndex):
    131         missionContainer = self.missionContainers[missionIndex]
    132         _, topContainer, _, heightContainer = missionContainer.GetAbsolute()
    133         _, topScroll, _, heightScroll = self.scrollContainer.GetAbsolute()
    134         heightDifference = heightScroll - heightContainer
    135         if heightDifference > 0:
    136             scrollFraction = float(topContainer - topScroll) / heightDifference
    137             self.scrollContainer.ScrollToVertical(scrollFraction)
    138 
    139     def OnStartModeChanged(self, oldMode):
    140         if not self.featureID or not oldMode:
    141             return
    142         self._UpdateExpandedState()
    143 
    144     def InitializeExpandedStates(self):
    145         if not self.featureID:
    146             missionIndex = self.GetExpandedMissionIndex()
    147             self.UpdateExpandedStateForMission(missionIndex)
    148             return
    149         self._UpdateExpandedState()
    150 
    151     def _UpdateExpandedState(self):
    152         if self.mode == infoPanelConst.MODE_NORMAL:
    153             expandedMission = sm.GetService('infoPanel').GetExpandedMission()
    154             missionIndex = None
    155             if not expandedMission or expandedMission['missionID'] == -1:
    156                 missionIndex = self.GetExpandedMissionIndex()
    157                 if missionIndex in (None, -1):
    158                     missionIndex = self.GetDefaultExpandedMissionIndex()
    159                 if missionIndex is not None:
    160                     self._CacheExpandedMission(missionIndex)
    161             elif expandedMission['featureID'] == self.featureID:
    162                 missionIndex = self.GetIndexForMissionID(expandedMission['missionID'])
    163             if missionIndex is not None:
    164                 self.TurnOnExpandedMissionIndex(missionIndex)
    165         else:
    166             self._CacheExpandedMission(-1)
    167 
    168     def OnExpandedMissionChanged(self, featureID = None, missionID = None):
    169         if not self.featureID or not featureID or featureID == self.featureID:
    170             return
    171         self.expandedMissionIndex = -1
    172         self.UpdateExpandedStates()
    173 
    174     def UpdateExpandedStateForMissionID(self, missionID):
    175         self.UpdateExpandedStateForMission(missionID)
    176 
    177     def UpdateExpandedStateForMission(self, missionIndex):
    178         indexToExpand = MISSION_INDEX_UNSET if missionIndex == self.expandedMissionIndex else missionIndex
    179         self.TurnOnExpandedMissionIndex(indexToExpand)
    180         self._CacheExpandedMission(indexToExpand)
    181 
    182     def TurnOnExpandedMissionIndex(self, missionIndex):
    183         self.SetExpandedMissionIndex(missionIndex)
    184         self.UpdateExpandedStates()
    185 
    186     def GetMissionIDForIndex(self, index):
    187         return index
    188 
    189     def GetIndexForMissionID(self, missionID):
    190         return missionID
    191 
    192     def _CacheExpandedMission(self, index):
    193         if not self.featureID:
    194             return
    195         if index == -1:
    196             expandedMission = sm.GetService('infoPanel').GetExpandedMission()
    197             if expandedMission.get('featureID') != self.featureID:
    198                 return
    199         if index != -1:
    200             index = self.GetMissionIDForIndex(index)
    201         sm.GetService('infoPanel').SetExpandedMission(self.featureID, index)
    202 
    203     def UpdateExpandedStates(self):
    204         for missionIndex, missionContainer in self.missionContainers.items():
    205             if missionIndex == self.expandedMissionIndex:
    206                 missionContainer.ShowObjectives()
    207             else:
    208                 missionContainer.HideObjectives()
    209 
    210     def GetDefaultExpandedMissionIndex(self):
    211         if len(self.missions) > 0:
    212             return 0
    213         return MISSION_INDEX_NONE
    214 
    215     def GetExpandedMissionIndexSettingName(self):
    216         return '%s_%s' % (EXPANDED_MISSION_INDEX, self.panelTypeID)
    217 
    218     def GetExpandedMissionIndex(self):
    219         settingName = self.GetExpandedMissionIndexSettingName()
    220         return settings.char.ui.Get(settingName, self.GetDefaultExpandedMissionIndex())
    221 
    222     def SetExpandedMissionIndex(self, missionIndex):
    223         self.expandedMissionIndex = missionIndex
    224         settingName = self.GetExpandedMissionIndexSettingName()
    225         settings.char.ui.Set(settingName, missionIndex)
    226 
    227     def GetScrollDataSettingName(self):
    228         return '%s_%s' % (SCROLL_DATA_SETTING, self.panelTypeID)
    229 
    230     def GetScrollDataSetting(self):
    231         settingName = self.GetScrollDataSettingName()
    232         return settings.char.ui.Get(settingName, (None, None))
    233 
    234     def SetScrollDataSetting(self, scrollData):
    235         settingName = self.GetScrollDataSettingName()
    236         return settings.char.ui.Set(settingName, scrollData)
    237 
    238     def GetMissions(self):
    239         raise NotImplementedError('InfoPanelMissions::GetMissions must be implemented in derived classes.')
    240 
    241     def HasOptionsMenu(self):
    242         return False
    243 
    244     def GetOptionsMenu(self, menuParent, mission):
    245         raise NotImplementedError('InfoPanelMissions::GetOptionsMenu must be implemented in derived classes.')