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

mapViewSolarSystem.py (32296B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\mapViewSolarSystem.py
      2 import logging
      3 import carbonui.const as uiconst
      4 import eve.client.script.ui.shared.pointerTool.pointerToolConst as pConst
      5 import evecamera
      6 import geo2
      7 import localization
      8 import trinity
      9 import uthread
     10 from brennivin.itertoolsext import Bundle
     11 from carbon.client.script.environment.AudioUtil import PlaySound
     12 from carbon.common.script.util.timerstuff import AutoTimer
     13 from carbonui.control.buttonIcon import ButtonIcon
     14 from carbonui.control.dragResizeCont import DragResizeCont
     15 from carbonui.primitives.fill import Fill
     16 from carbonui.window.segment.underlay import WindowSegmentUnderlay
     17 from carbonui.primitives.container import Container
     18 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     19 from carbonui.uicore import uicore
     20 from carbonui.util.various_unsorted import IsUnder
     21 from eve.client.script.ui.control import eveLabel
     22 from eve.client.script.ui.control.eveLabel import EveLabelSmall
     23 from eve.client.script.ui.control.infoIcon import MoreInfoIcon
     24 from eve.client.script.ui.control.themeColored import FillThemeColored, FrameThemeColored
     25 from eve.client.script.ui.inflight.probeScannerWindow import ProbeScannerWindow
     26 from eve.client.script.ui.inflight.scannerFiles.directionalScanUtil import SetScanModeTarget, IsDscanConeShown
     27 from eve.client.script.ui.inflight.scannerFiles.directionalScannerPalette import DirectionalScannerPalette
     28 from eve.client.script.ui.inflight.scannerFiles.directionalScannerWindow import DirectionalScanner
     29 from eve.client.script.ui.inflight.scannerFiles.probeScannerPalette import ProbeScannerPalette
     30 from eve.client.script.ui.inflight.scannerFiles.scanHologramHandler import ScanHologramHandler
     31 from eve.client.script.ui.inflight.scannerFiles.scannerUtil import SetProbeScanPanelWindowed, SetDirectionalScanPanelWindowed, IsSolarSystemMapFullscreen, IsShortuctExecutionAllowed, SetProbeScanEmbeddedPanelOpen, SetProbeScanEmbeddedPanelClosed, IsProbeScanEmbeddedPanelOpen, SetDirectionalScanEmbeddedPanelClosed, IsDirectionalScanEmbeddedPanelOpen, SetDirectionalScanEmbeddedPanelOpen
     32 from eve.client.script.ui.shared.mapView.mapViewBookmarkHandler import MapViewBookmarkHandler
     33 from eve.client.script.ui.shared.mapView.mapViewConst import MARKERID_MYPOS, MARKERID_MYHOME, VIEWMODE_MARKERS_SETTINGS, SETTING_PREFIX, MIN_CAMERA_DISTANCE_SOLARSYSTEMVIEW, MAX_CAMERA_DISTANCE_SOLARSYSTEMVIEW
     34 from eve.client.script.ui.shared.mapView.mapViewScannerNavigationStandalone import MapViewScannerNavigation
     35 from eve.client.script.ui.shared.mapView.mapViewSceneContainer import MapViewSceneContainer
     36 from eve.client.script.ui.shared.mapView.mapViewUtil import SolarSystemPosToMapPos, ScaleSolarSystemValue, GetTranslationFromParentWithRadius, UpdateDebugOutput, TryGetPosFromItemID
     37 from eve.client.script.ui.shared.mapView.markers.mapMarkerMyHome import MarkerMyHome
     38 from eve.client.script.ui.shared.mapView.markers.mapMarkersHandler import MapViewMarkersHandler
     39 from eve.client.script.ui.shared.mapView.markers.markerMyLocationSolarSystem import MarkerMyLocationSolarSystem
     40 from eve.client.script.ui.shared.mapView.systemMapHandler import SystemMapHandler, SolarSystemInfoBox
     41 from eve.common.script.sys.idCheckers import IsSolarSystem, IsStation, IsKnownSpaceSystem
     42 from evegraphics import effects
     43 from eveservices.menu import GetMenuService
     44 from localization import GetByLabel
     45 from menu import MenuList
     46 from probescanning.tooltips.DScanHelpTooltip import DScanHelpTooltip
     47 from probescanning.tooltips.ProbeScanHelpTooltip import ProbeScanHelpTooltip
     48 log = logging.getLogger(__name__)
     49 SUNBASE = 7.5
     50 LINE_EFFECT = 'res:/Graphics/Effect/Managed/Space/SpecialFX/Lines3DStarMapNew.fx'
     51 PARTICLE_EFFECT = 'res:/Graphics/Effect/Managed/Space/SpecialFX/Particles/StarmapNew.fx'
     52 PARTICLE_SPRITE_TEXTURE = 'res:/Texture/Particle/mapStarNew5.dds'
     53 PARTICLE_SPRITE_HEAT_TEXTURE = 'res:/Texture/Particle/mapStarNewHeat.dds'
     54 DISTANCE_RANGE = 'distanceRange'
     55 NEUTRAL_COLOR = (0.25,
     56  0.25,
     57  0.25,
     58  1.0)
     59 HEX_TILE_SIZE = 60
     60 
     61 class MapViewSolarSystem(Container):
     62     __notifyevents__ = ['OnUIScalingChange',
     63      'OnAutopilotUpdated',
     64      'OnDestinationSet',
     65      'OnSessionChanged',
     66      'OnBallparkSetState',
     67      'DoBallClear',
     68      'DoBallsAdded',
     69      'OnDirectionalScanComplete',
     70      'OnDirectionalScannerClosed',
     71      'OnDirectionalScannerOpened',
     72      'OnDirectionalScannerDocked',
     73      'OnDirectionalScannerUndocked',
     74      'OnDscanEntryMouseEnter',
     75      'OnDscanEntryMouseExit',
     76      'OnProbeScannerClosed',
     77      'OnProbeScannerDocked',
     78      'OnProbeScannerUndocked']
     79     curveSet = None
     80     systemMap = None
     81     mapRoot = None
     82     infoBox = None
     83     markersHandler = None
     84     bookmarkHandler = None
     85     layoutHandler = None
     86     markersAlwaysVisible = set()
     87     inFocus = False
     88     currentSolarsystem = None
     89     hilightID = None
     90     mapViewID = None
     91     sceneBlendMode = None
     92     showSolarSystemNebula = True
     93     showStarfield = False
     94     showDebugInfo = False
     95     showInfobox = False
     96     cameraID = evecamera.CAM_SOLARSYSTEMMAP
     97 
     98     def ApplyAttributes(self, attributes):
     99         Container.ApplyAttributes(self, attributes)
    100         self.mapViewID = attributes.mapViewID
    101         self.innerPadding = attributes.Get('innerPadding', 0)
    102         self.mapSvc = sm.GetService('map')
    103         self.autoFocusEnabled = settings.char.ui.Get('%s_autoFocusEnabled_%s' % (SETTING_PREFIX, self.mapViewID), True)
    104         self.mainCont = Container(name='mainCont', parent=self)
    105         self.infoLayer = Container(parent=self, clipChildren=True, name='infoLayer', padding=self.innerPadding)
    106         if attributes.showCloseButton:
    107             ButtonIcon(parent=self.infoLayer, hint=localization.GetByLabel('UI/Generic/Close'), texturePath='res:/UI/Texture/classes/DockPanel/closeButton.png', func=attributes.closeFunction or self.Close, align=uiconst.TOPRIGHT)
    108         self.showInfobox = attributes.Get('showInfobox', self.showInfobox)
    109         if self.showInfobox:
    110             self.infoBox = SolarSystemInfoBox(parent=self.infoLayer, align=uiconst.TOPLEFT, left=32, top=32)
    111         navigationClass = attributes.Get('navigationClass', MapViewScannerNavigation)
    112         navigationPadding = attributes.Get('navigationPadding', (0, 32, 0, 0))
    113         self.mapNavigation = navigationClass(parent=self, align=uiconst.TOALL, state=uiconst.UI_NORMAL, mapView=self, padding=navigationPadding)
    114         self.ConstructScene(attributes)
    115         self.ConstructViewButtonCont()
    116 
    117     def ConstructViewButtonCont(self):
    118         self.viewButtonCont = ContainerAutoSize(name='viewButtonCont', parent=Container(parent=self.mainCont), align=uiconst.CENTERBOTTOM, top=12)
    119         btn = ButtonIcon(parent=self.viewButtonCont, align=uiconst.TOPLEFT, iconSize=50, pos=(45, 0, 46, 46), texturePath='res:/UI/Texture/Classes/MapView/sideView.png', func=self.OnSideViewButton)
    120         btn.LoadTooltipPanel = self.LoadSideViewBtnTooltipPanel
    121         btn = ButtonIcon(parent=self.viewButtonCont, align=uiconst.TOPLEFT, iconSize=50, pos=(0, 0, 46, 46), texturePath='res:/UI/Texture/Classes/MapView/topView.png', func=self.OnTopViewButton)
    122         btn.LoadTooltipPanel = self.LoadTopViewBtnTooltipPanel
    123 
    124     def OnTopViewButton(self):
    125         self.mapNavigation.cameraController.SetTopView()
    126 
    127     def OnSideViewButton(self):
    128         self.mapNavigation.cameraController.SetSideView()
    129 
    130     def LoadSideViewBtnTooltipPanel(self, tooltipPanel, *args):
    131         self._LoadBtnTooltipPanel(tooltipPanel, 'UI/Inflight/Scanner/ViewFromSide')
    132 
    133     def LoadTopViewBtnTooltipPanel(self, tooltipPanel, *args):
    134         self._LoadBtnTooltipPanel(tooltipPanel, 'UI/Inflight/Scanner/ViewFromTop')
    135 
    136     def _LoadBtnTooltipPanel(self, tooltipPanel, txt):
    137         tooltipPanel.LoadGeneric2ColumnTemplate()
    138         tooltipPanel.AddLabelMedium(text=GetByLabel(txt), colSpan=tooltipPanel.columns, bold=True)
    139         tooltipPanel.AddLabelShortcut(GetByLabel('UI/Inflight/Scanner/ToggleView'), GetByLabel('UI/Inflight/Scanner/DoubleClickScene'), bold=False)
    140 
    141     def CheckExecuteFilterShortcut(self, vkey):
    142         if IsShortuctExecutionAllowed(self):
    143             dScanHasFocus = IsDirectionalScanEmbeddedPanelOpen() and IsUnder(uicore.registry.GetFocus(), self.directionalScannerPalette)
    144             if IsProbeScanEmbeddedPanelOpen() and not dScanHasFocus:
    145                 return self.probeScannerPalette.ToggleFilterShortcut(vkey)
    146             if IsDirectionalScanEmbeddedPanelOpen():
    147                 return self.directionalScannerPalette.ToggleFitlerShortcut(vkey)
    148         return False
    149 
    150     def ConstructScene(self, attributes):
    151         sceneContainer = MapViewSceneContainer(parent=self, align=uiconst.TOALL, state=uiconst.UI_DISABLED, padding=self.innerPadding, cameraID=self.cameraID)
    152         sceneContainer.Startup()
    153         self.sceneContainer = sceneContainer
    154         self.sceneContainer.display = False
    155         scene = trinity.EveSpaceScene()
    156         self.showSolarSystemNebula = attributes.Get('showSolarSystemNebula', self.showSolarSystemNebula)
    157         if self.showSolarSystemNebula:
    158             scene.backgroundRenderingEnabled = True
    159         self.showStarfield = attributes.Get('showStarfield', self.showStarfield)
    160         if self.showStarfield:
    161             scene.starfield = trinity.Load('res:/dx9/scene/starfield/spritestars.red')
    162             scene.backgroundRenderingEnabled = True
    163         self.mapRoot = trinity.EveRootTransform()
    164         self.mapRoot.name = 'mapRoot'
    165         scene.objects.append(self.mapRoot)
    166         self.sceneBlendMode = attributes.Get('sceneBlendMode', self.sceneBlendMode)
    167         self.sceneContainer.scene = scene
    168         self.sceneContainer.DisplaySpaceScene(blendMode=self.sceneBlendMode)
    169         if self.destroyed:
    170             return
    171         self.markersHandler = MapViewMarkersHandler(self, self.sceneContainer.bracketCurveSet, self.infoLayer, eventHandler=self.mapNavigation, stackMarkers=attributes.Get('stackMarkers', True))
    172         self.bookmarkHandler = MapViewBookmarkHandler(self)
    173         self.showDebugInfo = attributes.Get('showDebugInfo', self.showDebugInfo)
    174         if self.showDebugInfo:
    175             self.debugOutput = EveLabelSmall(parent=self, align=uiconst.BOTTOMLEFT, left=6, top=6, idx=0)
    176             self.debugOutputTimer = AutoTimer(5, self.UpdateDebugOutput)
    177         self.camera.fov = 0.7
    178         self.camera.maxZoom = MIN_CAMERA_DISTANCE_SOLARSYSTEMVIEW
    179         self.camera.minZoom = MAX_CAMERA_DISTANCE_SOLARSYSTEMVIEW
    180         self.camera.nearClip = 0.1
    181         self.camera.farClip = 50000.0
    182         self.camera.SetUpdateCallback(self.OnCameraUpdate)
    183         uthread.new(uicore.registry.SetFocus, self)
    184         self.ConstructScanPanels()
    185         self.scanHologramHandler = ScanHologramHandler(scene=self.sceneContainer.scene, camera=self.camera)
    186         sm.RegisterNotify(self)
    187 
    188     def ConstructScanPanels(self):
    189         self.horizontalDragCont = DragResizeCont(name='HorizontalDragContainer', parent=self.mainCont, idx=0, align=uiconst.TORIGHT, minSize=362, defaultSize=362, maxSize=600, onResizeCallback=self.OnHorizontalDragContResize, settingsID='solarSystemViewHorizontal', state=uiconst.UI_HIDDEN)
    190         self.panelsCont = DragResizeCont(name='PanelsContainer', parent=self.horizontalDragCont.mainCont, align=uiconst.TOTOP_PROP, minSize=0.32, defaultSize=0.5, maxSize=1.0, padding=(0, 26, 0, 0), settingsID='solarSystemViewVertical')
    191         self.secondPanelContainer = Container(name='secondPanelContainer', parent=self.horizontalDragCont.mainCont, align=uiconst.TOALL, state=uiconst.UI_HIDDEN)
    192         self.secondPanelMainCont = Container(parent=self.secondPanelContainer, padding=4)
    193         FillThemeColored(bgParent=self.panelsCont.mainCont, colorType=uiconst.COLORTYPE_UIBASECONTRAST, opacity=0.6)
    194         FillThemeColored(bgParent=self.secondPanelContainer, colorType=uiconst.COLORTYPE_UIBASECONTRAST, opacity=0.6)
    195         FillThemeColored(bgParent=self.horizontalDragCont, colorType=uiconst.COLORTYPE_UIBASECONTRAST, opacity=0.2)
    196         self.firstPanelMainCont = Container(name='firstPanelMainCont', parent=self.panelsCont.mainCont, padding=4)
    197         self.horizontalDragCont.mainCont.padding = 4
    198         self.panelsCont.OnMouseWheel = lambda *args: None
    199         self.directionalScannerPalette = None
    200         self.probeScannerPalette = None
    201         self.UpdateScanPanels()
    202 
    203     def UpdateScanPanels(self):
    204         if IsSolarSystemMapFullscreen():
    205             self.horizontalDragCont.padding = (0, 0, 18, 55)
    206         else:
    207             self.horizontalDragCont.padding = 0
    208         if not IsProbeScanEmbeddedPanelOpen() and not IsDirectionalScanEmbeddedPanelOpen():
    209             self.horizontalDragCont.Hide()
    210         elif not session.solarsystemid:
    211             self.horizontalDragCont.Hide()
    212         else:
    213             self.horizontalDragCont.Show()
    214             self._UpdateScanPanelsEmbedded()
    215         self.OnHorizontalDragContResize()
    216 
    217     def _UpdateScanPanelsEmbedded(self):
    218         parent = self.firstPanelMainCont
    219         if IsProbeScanEmbeddedPanelOpen() or IsDirectionalScanEmbeddedPanelOpen():
    220             if IsProbeScanEmbeddedPanelOpen():
    221                 if self.probeScannerPalette:
    222                     self.probeScannerHeader.SetParent(parent)
    223                     self.probeScannerPalette.SetParent(parent)
    224                 else:
    225                     self.ConstructScannerPalette(parent)
    226                 parent = self.secondPanelMainCont
    227             if IsDirectionalScanEmbeddedPanelOpen():
    228                 if self.directionalScannerPalette:
    229                     self.directionalScannerHeader.SetParent(parent)
    230                     self.directionalScannerPalette.SetParent(parent)
    231                 else:
    232                     self.ConstructDirectionalScannerPalette(parent)
    233         if IsProbeScanEmbeddedPanelOpen() and IsDirectionalScanEmbeddedPanelOpen():
    234             self.panelsCont.SetMaxSize(0.8)
    235             self.secondPanelContainer.SetState(uiconst.UI_NORMAL)
    236         else:
    237             self.panelsCont.SetMaxSize(1.0)
    238             self.secondPanelContainer.SetState(uiconst.UI_HIDDEN)
    239 
    240     def OpenDirectionalScanPanelEmbedded(self):
    241         if IsDirectionalScanEmbeddedPanelOpen():
    242             return
    243         if self.currentSolarsystem:
    244             self.currentSolarsystem.EnableDirectionalScanHandler()
    245         SetDirectionalScanEmbeddedPanelOpen()
    246         self.UpdateScanPanels()
    247 
    248     def OpenProbeScanPanelEmbedded(self):
    249         if self.currentSolarsystem:
    250             self.currentSolarsystem.EnableProbeHandlerStandalone()
    251         SetProbeScanEmbeddedPanelOpen()
    252         self.UpdateScanPanels()
    253 
    254     def OnDirectionalScannerDocked(self):
    255         self.OpenDirectionalScanPanelEmbedded()
    256 
    257     def OnDirectionalScannerUndocked(self):
    258         SetDirectionalScanEmbeddedPanelClosed()
    259 
    260     def OnProbeScannerUndocked(self):
    261         SetProbeScanEmbeddedPanelClosed()
    262 
    263     def OnProbeScannerDocked(self):
    264         self.OpenProbeScanPanelEmbedded()
    265 
    266     def OnDockModeChanged(self, isFullScreen = False):
    267         self.horizontalDragCont.Close()
    268         self.mapNavigation.OnDockModeChanged()
    269         self.ConstructScanPanels()
    270         if isFullScreen:
    271             self.camera.EnableCenterOffset()
    272         else:
    273             self.camera.DisableCenterOffset()
    274 
    275     def ConstructDirectionalScannerPalette(self, parent):
    276         DirectionalScanner.CloseIfOpen()
    277         self.directionalScannerHeader = ScannerPaletteHeader(parent=parent, align=uiconst.TOTOP, text=GetByLabel('UI/Inflight/Scanner/DirectionalScanner'), floatCallback=self.SetDirectionalScannerWindowed, helpTooltip=DScanHelpTooltip, closeCallback=self.CloseDirectionalScannerPalette)
    278         self.directionalScannerPalette = DirectionalScannerPalette(parent=parent, padTop=2, scanOnOpen=False, state=uiconst.UI_NORMAL, uniqueUiName=pConst.UNIQUE_NAME_DIRECTIONAL_SCANNER)
    279 
    280     def CloseDirectionalScanWindow(self):
    281         dScanWindow = DirectionalScanner.GetIfOpen()
    282         if dScanWindow:
    283             dScanWindow.CloseByUser()
    284 
    285     def ConstructScannerPalette(self, parent):
    286         ProbeScannerWindow.CloseIfOpen()
    287         self.probeScannerHeader = ScannerPaletteHeader(parent=parent, align=uiconst.TOTOP, text=GetByLabel('UI/Inflight/Scanner/ProbeScanner'), floatCallback=self.SetProbeScannerWindowed, helpTooltip=ProbeScanHelpTooltip, closeCallback=self.CloseProbeScannerPalette)
    288         self.probeScannerPalette = ProbeScannerPalette(name='ProbeScannerPalette', parent=parent, align=uiconst.TOALL, state=uiconst.UI_NORMAL, padTop=2, uniqueUiName=pConst.UNIQUE_NAME_PROBE_SCANNER)
    289 
    290     def CloseProbeScannerWindow(self):
    291         probeScanWindow = ProbeScannerWindow.GetIfOpen()
    292         if probeScanWindow:
    293             probeScanWindow.CloseByUser()
    294 
    295     def CloseDirectionalScannerPalette(self):
    296         if self.currentSolarsystem:
    297             self.currentSolarsystem.StopDirectionalScanHandler()
    298         SetDirectionalScanEmbeddedPanelClosed()
    299         self.directionalScannerPalette.Close()
    300         self.directionalScannerHeader.Close()
    301         self.directionalScannerPalette = None
    302         self.UpdateScanPanels()
    303 
    304     def CloseProbeScannerPalette(self):
    305         if self.currentSolarsystem:
    306             self.currentSolarsystem.StopProbeHandler()
    307         SetProbeScanEmbeddedPanelClosed()
    308         self.probeScannerPalette.Close()
    309         self.probeScannerHeader.Close()
    310         self.probeScannerPalette = None
    311         self.UpdateScanPanels()
    312 
    313     def ToggleDirectionalScanner(self, wasMinimized = False):
    314         if IsDirectionalScanEmbeddedPanelOpen():
    315             if not wasMinimized:
    316                 self.CloseDirectionalScannerPalette()
    317         else:
    318             self.OpenDirectionalScanPanelEmbedded()
    319 
    320     def ToggleProbeScanner(self, wasMinimized = False):
    321         if IsProbeScanEmbeddedPanelOpen():
    322             if not wasMinimized:
    323                 self.CloseProbeScannerPalette()
    324         else:
    325             self.OpenProbeScanPanelEmbedded()
    326 
    327     def SetDirectionalScannerWindowed(self):
    328         self.CloseDirectionalScannerPalette()
    329         SetDirectionalScanPanelWindowed()
    330         DirectionalScanner.Open()
    331         self.UpdateScanPanels()
    332 
    333     def SetProbeScannerWindowed(self):
    334         self.CloseProbeScannerPalette()
    335         SetProbeScanPanelWindowed()
    336         ProbeScannerWindow.Open()
    337         self.UpdateScanPanels()
    338 
    339     def OnHorizontalDragContResize(self, *args):
    340         if not hasattr(self, 'horizontalDragCont'):
    341             return
    342         if self.horizontalDragCont.display:
    343             w, _ = self.GetAbsoluteSize()
    344             offset = self.horizontalDragCont.width / float(w)
    345         else:
    346             offset = 0.0
    347         self.camera.SetCenterOffsetPanels(offset)
    348 
    349     def _OnSizeChange_NoBlock(self, *args):
    350         self.OnHorizontalDragContResize()
    351 
    352     def Close(self, *args, **kwds):
    353         sm.UnregisterNotify(self)
    354         if hasattr(self, 'mapRoot') and self.mapRoot is not None:
    355             del self.mapRoot.children[:]
    356         self.mapRoot = None
    357         if self.currentSolarsystem:
    358             self.currentSolarsystem.RemoveFromScene()
    359         self.currentSolarsystem = None
    360         if self.camera:
    361             self.camera.OnDeactivated()
    362             sm.GetService('sceneManager').UnregisterCamera(self.camera.cameraID)
    363         self.camera = None
    364         if self.markersHandler:
    365             self.markersHandler.StopHandler()
    366         self.markersHandler = None
    367         if self.bookmarkHandler:
    368             self.bookmarkHandler.StopHandler()
    369         self.bookmarkHandler = None
    370         self.mapNavigation = None
    371         self.debugOutputTimer = None
    372         Container.Close(self)
    373 
    374     def UpdateDebugOutput(self):
    375         if self.destroyed:
    376             return
    377         UpdateDebugOutput(self.debugOutput, camera=self.camera, mapView=self)
    378 
    379     def SetFocusState(self, focusState):
    380         self.inFocus = focusState
    381 
    382     def OnMarkerHovered(self, itemID):
    383         hilightID = itemID
    384         if self.hilightID != hilightID:
    385             self.hilightID = hilightID
    386             if hilightID:
    387                 self.markersHandler.HilightMarkers([hilightID])
    388             else:
    389                 self.markersHandler.HilightMarkers([])
    390 
    391     def OnMapViewSettingChanged(self, settingKey, *args, **kwds):
    392         if settingKey == VIEWMODE_MARKERS_SETTINGS:
    393             if self.currentSolarsystem:
    394                 self.currentSolarsystem.LoadMarkers(showChanges=True)
    395 
    396     def FocusSelf(self, *args, **kwds):
    397         self.EnableAutoFocus()
    398         self.SetActiveItemID(self.GetEgoMarkerID())
    399 
    400     def EnableAutoFocus(self):
    401         settings.char.ui.Set('%s_autoFocusEnabled_%s' % (SETTING_PREFIX, self.mapViewID), True)
    402         self.autoFocusEnabled = True
    403 
    404     def DisableAutoFocus(self):
    405         settings.char.ui.Set('%s_autoFocusEnabled_%s' % (SETTING_PREFIX, self.mapViewID), False)
    406         self.autoFocusEnabled = False
    407 
    408     @apply
    409     def solarSystemTransform():
    410 
    411         def fget(self):
    412             if self.currentSolarsystem:
    413                 return self.currentSolarsystem.systemMapTransform
    414 
    415         return property(**locals())
    416 
    417     @apply
    418     def solarSystemSunID():
    419 
    420         def fget(self):
    421             if self.currentSolarsystem:
    422                 return self.currentSolarsystem.sunID
    423 
    424         return property(**locals())
    425 
    426     @apply
    427     def camera():
    428 
    429         def fget(self):
    430             if getattr(self, 'sceneContainer', None):
    431                 return self.sceneContainer.camera
    432 
    433         def fset(self, value):
    434             pass
    435 
    436         return property(**locals())
    437 
    438     @apply
    439     def scene():
    440 
    441         def fget(self):
    442             return self.sceneContainer.scene
    443 
    444         return property(**locals())
    445 
    446     @apply
    447     def solarSystemID():
    448 
    449         def fget(self):
    450             if self.currentSolarsystem:
    451                 return self.currentSolarsystem.solarsystemID
    452 
    453         def fset(self, value):
    454             pass
    455 
    456         return property(**locals())
    457 
    458     def LogError(self, *args, **kwds):
    459         log.error('MAPVIEW ' + repr(args))
    460 
    461     def LogInfo(self, *args, **kwds):
    462         log.info('MAPVIEW ' + repr(args))
    463 
    464     def LogWarn(self, *args, **kwds):
    465         log.warning('MAPVIEW ' + repr(args))
    466 
    467     def OnUIScalingChange(self, *args):
    468         self.markersHandler.ReloadAll()
    469 
    470     def GetItemMenu(self, itemID):
    471         item = self.mapSvc.GetItem(itemID, retall=True)
    472         if not item:
    473             return MenuList()
    474         m = MenuList([None])
    475         m += GetMenuService().CelestialMenu(itemID, mapItem=item)
    476         return m.filter('UI/Commands/ShowLocationOnMap')
    477 
    478     def ShowMyHomeStation(self):
    479         if self.destroyed:
    480             return
    481         markerID = (MARKERID_MYHOME, session.charid)
    482         self.markersHandler.RemoveMarker(markerID)
    483         try:
    484             self.markersAlwaysVisible.remove(markerID)
    485         except:
    486             pass
    487 
    488         homeStationRow = sm.GetService('charactersheet').GetHomeStationRow()
    489         homeStationID = homeStationRow.stationID
    490         if not homeStationID or self.destroyed:
    491             return
    492         if self.destroyed:
    493             return
    494         solarsystemID = homeStationRow.solarSystemID
    495         if solarsystemID != self.currentSolarsystem.solarsystemID:
    496             return
    497         if IsStation(homeStationID):
    498             stationInfo = sm.GetService('ui').GetStationStaticInfo(homeStationID)
    499             pos = (stationInfo.x, stationInfo.y, stationInfo.z)
    500         else:
    501             stationInfo = Bundle(stationID=homeStationID, stationTypeID=homeStationRow.stationTypeID)
    502             pos = TryGetPosFromItemID(homeStationID, solarsystemID)
    503         localPosition = SolarSystemPosToMapPos(pos)
    504         markerObject = self.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerMyHome, stationInfo=stationInfo, solarSystemID=solarsystemID, mapPositionLocal=localPosition, mapPositionSolarSystem=(0, 0, 0))
    505         self.markersAlwaysVisible.add(markerID)
    506 
    507     def RemoveMyLocation(self):
    508         markerID = self.GetEgoMarkerID()
    509         self.markersHandler.RemoveMarker(markerID, fadeOut=False)
    510 
    511     def ShowMyLocation(self):
    512         if self.destroyed:
    513             return
    514         if self.mapRoot is None:
    515             return
    516         self.RemoveMyLocation()
    517         markerID = self.GetEgoMarkerID()
    518         try:
    519             self.markersAlwaysVisible.remove(markerID)
    520         except:
    521             pass
    522 
    523         if self.solarSystemID == session.solarsystemid2:
    524             if session.stationid:
    525                 stationInfo = sm.GetService('ui').GetStationStaticInfo(session.stationid)
    526                 if self.destroyed:
    527                     return
    528                 localPosition = SolarSystemPosToMapPos((stationInfo.x, stationInfo.y, stationInfo.z))
    529                 trackObjectID = None
    530             elif session.structureid:
    531                 structureInfo = self.mapSvc.GetMapDataForStructure(session.solarsystemid2, session.structureid)
    532                 localPosition = SolarSystemPosToMapPos((structureInfo.x, structureInfo.y, structureInfo.z))
    533                 trackObjectID = None
    534             else:
    535                 localPosition = (0, 0, 0)
    536                 trackObjectID = session.shipid or session.stationid
    537             self.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerMyLocationSolarSystem, trackObjectID=trackObjectID, solarSystemID=session.solarsystemid2, mapPositionLocal=localPosition, mapPositionSolarSystem=(0, 0, 0))
    538             self.markersAlwaysVisible.add(markerID)
    539             if self.autoFocusEnabled:
    540                 self.FocusSelf()
    541 
    542     def GetEgoMarkerID(self):
    543         return (MARKERID_MYPOS, session.charid)
    544 
    545     def OnCameraUpdate(self):
    546         camera = self.camera
    547         if camera is None or self.destroyed:
    548             return
    549         if self.currentSolarsystem:
    550             self.currentSolarsystem.OnCameraUpdate()
    551         cameraDistance = camera.GetZoomDistanceForMap()
    552         if self.markersHandler:
    553             self.markersHandler.RegisterCameraTranslationFromParent(cameraDistance)
    554 
    555     def SetCameraPointOfInterestSolarSystemPosition(self, solarSystemID, position):
    556         if solarSystemID != self.solarSystemID:
    557             return
    558         self.DisableAutoFocus()
    559         self.camera.LookAtPoint(SolarSystemPosToMapPos(position))
    560 
    561     def SetActiveItemID(self, itemID, *args, **kwds):
    562         markerObject = self.markersHandler.GetMarkerByID(itemID)
    563         if markerObject:
    564             self.SetSelectedMarker(markerObject)
    565 
    566     def SetSelectedMarker(self, markerObject, *args, **kwds):
    567         PlaySound('msg_newscan_explore_click_play')
    568         SetScanModeTarget()
    569         self.camera.LookAtMarker(markerObject)
    570 
    571     def LookAtEgoMarker(self, duration = None):
    572         pos = self.GetEgoPosition()
    573         if pos:
    574             self.camera.LookAtPoint(pos, duration)
    575 
    576     def GetEgoPosition(self):
    577         markerObject = self.markersHandler.GetMarkerByID(self.GetEgoMarkerID())
    578         if markerObject:
    579             return markerObject.GetDisplayPosition()
    580 
    581     def LoadSolarSystemDetails(self, solarSystemID):
    582         current = getattr(self, 'currentSolarsystem', None)
    583         if current:
    584             resetSolarsystemID = current.solarsystemID
    585         else:
    586             resetSolarsystemID = None
    587         if resetSolarsystemID != solarSystemID:
    588             if current:
    589                 current.Close()
    590             self.currentSolarsystem = None
    591             self.currentSolarsystem = SystemMapHandler(self, solarSystemID, position=(0, 0, 0))
    592             self.currentSolarsystem.LoadSolarSystemMap()
    593             self.currentSolarsystem.EnableProbeHandlerStandalone()
    594             if self.destroyed:
    595                 return
    596             self.currentSolarsystem.LoadMarkers()
    597             if self.destroyed:
    598                 return
    599             scaling = ScaleSolarSystemValue(1.0)
    600             self.currentSolarsystem.systemMapTransform.scaling = (scaling, scaling, scaling)
    601             if not IsKnownSpaceSystem(solarSystemID) and self.scene.starfield:
    602                 self.scene.starfield.numStars = 0
    603             uthread.new(self.ShowMyHomeStation)
    604             uthread.new(self.ShowMyLocation)
    605             if self.infoBox:
    606                 self.infoBox.LoadSolarSystemID(solarSystemID)
    607 
    608     def FrameSolarSystem(self):
    609         radius = ScaleSolarSystemValue(self.currentSolarsystem.solarSystemRadius)
    610         cameraDistanceFromInterest = GetTranslationFromParentWithRadius(radius, self.camera)
    611         if not self.autoFocusEnabled:
    612             self.SetCameraPointOfInterestSolarSystemPosition(session.solarsystemid2, (0, 0, 0))
    613         if cameraDistanceFromInterest:
    614             self.camera.SetZoomDistance(1.3 * cameraDistanceFromInterest)
    615         self.sceneContainer.display = True
    616 
    617     def GetPickObjects(self, *args, **kwds):
    618         return None
    619 
    620     def OnAutopilotUpdated(self):
    621         pass
    622 
    623     def OnDestinationSet(self, *args, **kwds):
    624         self.ShowMyLocation()
    625 
    626     def OnBallparkSetState(self, *args):
    627         if self.currentSolarsystem:
    628             self.currentSolarsystem.LoadMarkers()
    629             self.ShowMyHomeStation()
    630 
    631     def OnSessionChanged(self, isRemote, session, change):
    632         if self.destroyed:
    633             return
    634         if self.currentSolarsystem:
    635             if 'locationid' in change and not IsSolarSystem(change['locationid'][1]):
    636                 self.currentSolarsystem.StopDirectionalScanHandler()
    637                 self.currentSolarsystem.StopProbeHandler()
    638                 self.currentSolarsystem.HideRangeIndicator()
    639                 self.currentSolarsystem.LoadMarkers()
    640                 self.ShowMyHomeStation()
    641                 uthread.new(self.ShowMyLocation)
    642         if not session.solarsystemid:
    643             self.UpdateScanPanels()
    644 
    645     def DoBallClear(self, solitem):
    646         self.RemoveMyLocation()
    647 
    648     def DoBallsAdded(self, balls_slimItems, *args, **kw):
    649         for ball, slimItem in balls_slimItems:
    650             if ball.id == session.shipid:
    651                 uthread.new(self.ShowMyLocation)
    652                 break
    653 
    654     def UpdateViewPort(self):
    655         if self.sceneContainer:
    656             self.sceneContainer.UpdateViewPort()
    657 
    658     def OnDirectionalScanComplete(self, angle, range, direction, results):
    659         egoPos = self.GetEgoPosition()
    660         if IsDscanConeShown() and egoPos and not self.destroyed:
    661             self.scanHologramHandler.RenderHolograms(results, egoPos, direction)
    662 
    663     def OnDscanEntryMouseEnter(self, typeID):
    664         if IsDscanConeShown():
    665             egoPos = self.GetEgoPosition()
    666             if egoPos:
    667                 camera = sm.GetService('sceneManager').GetActivePrimaryCamera()
    668                 direction = geo2.Vec3Scale(camera.GetLookAtDirection(), -1)
    669                 self.scanHologramHandler.RenderHologram(typeID, egoPos, direction)
    670 
    671     def OnDscanEntryMouseExit(self):
    672         self.scanHologramHandler.HideHologram()
    673 
    674     def OnDirectionalScannerOpened(self):
    675         if self.currentSolarsystem:
    676             self.currentSolarsystem.EnableDirectionalScanHandler()
    677 
    678     def OnDirectionalScannerClosed(self):
    679         SetDirectionalScanEmbeddedPanelClosed()
    680         if self.currentSolarsystem:
    681             self.currentSolarsystem.StopDirectionalScanHandler()
    682 
    683     def OnProbeScannerClosed(self):
    684         SetProbeScanEmbeddedPanelClosed()
    685 
    686 
    687 class ScannerPaletteHeader(Container):
    688     name = 'ScannerPaletteHeader'
    689     default_height = 26
    690 
    691     def ApplyAttributes(self, attributes):
    692         Container.ApplyAttributes(self, attributes)
    693         text = attributes.text
    694         floatCallback = attributes.floatCallback
    695         helpTooltip = attributes.helpTooltip
    696         self.closeCallback = attributes.closeCallback
    697         WindowSegmentUnderlay(bgParent=self)
    698         headerLabel = eveLabel.EveLabelMedium(parent=self, align=uiconst.CENTERLEFT, text=text, left=5)
    699         MoreInfoIcon(name='helpIcon', parent=self, align=uiconst.CENTERLEFT, left=headerLabel.width + 10).tooltipPanelClassInfo = helpTooltip()
    700         ButtonIcon(name='openInWindow', parent=self, iconSize=16, pos=(24, 0, 16, 16), texturePath='res:/UI/Texture/classes/DockPanel/floatButton.png', align=uiconst.CENTERRIGHT, func=floatCallback, hint=localization.GetByLabel('UI/Inflight/Scanner/OpenInWindow'))
    701         ButtonIcon(name='closePanel', parent=self, pos=(4, 0, 16, 16), texturePath='res:/UI/Texture/classes/DockPanel/closeButton.png', align=uiconst.CENTERRIGHT, func=self.close)
    702 
    703     def close(self):
    704         super(ScannerPaletteHeader, self).Close()
    705         self.closeCallback()