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.')