mapViewBookmarkHandler.py (8887B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\mapViewBookmarkHandler.py 2 from eve.client.script.ui.shared.mapView.mapViewConst import MARKERID_BOOKMARK, MARKERS_OPTION_PERSONAL_LOCATION, VIEWMODE_MARKERS_SETTINGS, MARKERS_OPTION_SHARED_LOCATION 3 from eve.client.script.ui.shared.mapView.mapViewSettings import GetMapViewSetting 4 from eve.client.script.ui.shared.mapView.markers.mapMarkerBookmark import MarkerBookmark, MarkerBookmarkUniverseLevel 5 from eve.client.script.ui.shared.mapView.mapViewUtil import SolarSystemPosToMapPos 6 import weakref 7 import geo2 8 from eve.client.script.util.bookmarkUtil import IsCoordinateBookmark 9 from eve.common.lib import appConst 10 from eve.common.script.sys.idCheckers import IsSolarSystem, IsConstellation 11 import evetypes 12 import blue 13 import telemetry 14 import logging 15 log = logging.getLogger(__name__) 16 MAX_BOOKMARKS_DISPLAYED_ON_MAP = 250 17 18 class MapViewBookmarkHandler(object): 19 __metaclass__ = telemetry.ZONE_PER_METHOD 20 __notifyevents__ = ['OnRefreshBookmarks'] 21 _mapView = None 22 23 def __init__(self, mapView, loadUniverseBookmarks = False, solarSystemScaling = None): 24 self.bookmarkSvc = sm.GetService('bookmarkSvc') 25 self.mapView = mapView 26 self.loadedSolarSystemID = None 27 self.loadUniverseBookmarks = loadUniverseBookmarks 28 self.solarSystemScaling = solarSystemScaling 29 sm.RegisterNotify(self) 30 31 def StopHandler(self): 32 sm.UnregisterNotify(self) 33 34 @apply 35 def mapView(): 36 37 def fget(self): 38 if self._mapView: 39 return self._mapView() 40 41 def fset(self, value): 42 self._mapView = weakref.ref(value) 43 44 return property(**locals()) 45 46 def OnRefreshBookmarks(self): 47 self.LoadBookmarkMarkers(loadSolarSystemID=self.loadedSolarSystemID) 48 49 def LoadBookmarkMarkers(self, loadSolarSystemID = None, showChanges = False): 50 self.loadedSolarSystemID = loadSolarSystemID 51 bookmarks = self.GetAllEnabledBookmarks() 52 bookmarksBySolarSystemID = self.GetBookmarksBySolarSystemID(bookmarks) 53 bookmarkMarkers = self.mapView.markersHandler.GetMarkersByType(MARKERID_BOOKMARK) 54 bookmarkMarkerIDs = set([ markerObject.markerID for markerObject in bookmarkMarkers ]) 55 personalFolderIDs, _ = self.bookmarkSvc.GetPersonalAndSharedFolders() 56 markerIDs = set() 57 if not self.mapView: 58 return markerIDs 59 for solarSystemID, bookmarksInSystem in bookmarksBySolarSystemID.iteritems(): 60 if self.loadUniverseBookmarks: 61 solarSystemBookmarks = self.GetSolarSystemBookmarks(bookmarksInSystem) 62 if solarSystemBookmarks: 63 self.CheckAddUniverseLevelBookmark(solarSystemID, solarSystemBookmarks, markerIDs, showChanges) 64 if loadSolarSystemID and solarSystemID == loadSolarSystemID: 65 for bookmark in bookmarksInSystem[:MAX_BOOKMARKS_DISPLAYED_ON_MAP]: 66 isPersonal = bookmark.folderID in personalFolderIDs 67 self.CheckAddSolarSystemLevelBookmark(solarSystemID, bookmark, bookmarkMarkerIDs, markerIDs, showChanges, isPersonal) 68 69 blue.pyos.BeNice() 70 71 for removeMarkerID in bookmarkMarkerIDs.difference(markerIDs): 72 self.mapView.markersHandler.RemoveMarker(removeMarkerID) 73 74 return markerIDs 75 76 def GetAllEnabledBookmarks(self): 77 loadPersonal = IsMarkerGroupEnabled(MARKERS_OPTION_PERSONAL_LOCATION, self.mapView.mapViewID) 78 loadShared = IsMarkerGroupEnabled(MARKERS_OPTION_SHARED_LOCATION, self.mapView.mapViewID) 79 if not loadPersonal and not loadShared: 80 return [] 81 usePersonalFilter = not (loadPersonal and loadShared) 82 bookmarks = sm.GetService('bookmarkSvc').GetActiveBookmarksFiltered(None, usePersonalFilter=usePersonalFilter, personal=loadPersonal).values() 83 return bookmarks 84 85 def GetBookmarksBySolarSystemID(self, bookmarks): 86 bookmarksBySolarSystemID = {} 87 for bookmark in bookmarks: 88 solarSystemID = self.GetSolarSystemID(bookmark) 89 if solarSystemID: 90 bookmarksBySolarSystemID.setdefault(solarSystemID, []).append(bookmark) 91 92 return bookmarksBySolarSystemID 93 94 def GetSolarSystemID(self, bookmark): 95 if IsSolarSystem(bookmark.locationID): 96 return bookmark.locationID 97 if IsConstellation(bookmark.locationID): 98 return bookmark.itemID 99 100 def GetSolarSystemBookmarks(self, bookmarks): 101 return [ bookmark for bookmark in bookmarks if bookmark.typeID == appConst.typeSolarSystem and not IsCoordinateBookmark(bookmark) ] 102 103 def CheckAddSolarSystemLevelBookmark(self, solarSystemID, bookmark, bookmarkMarkerIDs, markerIDs, showChanges, isPersonal): 104 markerID = (MARKERID_BOOKMARK, bookmark.bookmarkID) 105 if markerID in bookmarkMarkerIDs: 106 markerIDs.add(markerID) 107 return 108 try: 109 localBookmarkPosition = self.GetBookmarkPosition(bookmark) 110 except RuntimeError: 111 log.warn('Failed to get bookmark position, bookmark.bookmarkID, bookmark.itemID: %s, %s' % (bookmark.bookmarkID, bookmark.itemID)) 112 return 113 114 try: 115 mapPositionLocal = SolarSystemPosToMapPos(localBookmarkPosition) 116 if self.solarSystemScaling: 117 mapPositionLocal = geo2.Vec3ScaleD(mapPositionLocal, self.solarSystemScaling) 118 except TypeError: 119 log.warn('Failed to get bookmark position, localBookmarkPosition: %s' % repr(localBookmarkPosition)) 120 return 121 122 solarSystemPosition = (0, 0, 0) 123 if getattr(self.mapView, 'layoutHandler', None): 124 mapNode = self.mapView.layoutHandler.GetNodeBySolarSystemID(solarSystemID) 125 if mapNode: 126 solarSystemPosition = mapNode.position 127 self.mapView.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerBookmark, bookmarkData=bookmark, solarSystemID=solarSystemID, highlightOnLoad=showChanges, mapPositionLocal=mapPositionLocal, mapPositionSolarSystem=solarSystemPosition, isPersonal=isPersonal) 128 markerIDs.add(markerID) 129 130 def CheckAddUniverseLevelBookmark(self, solarSystemID, bookmarks, markerIDs, showChanges): 131 if not self.mapView.layoutHandler: 132 return 133 mapNode = self.mapView.layoutHandler.GetNodeBySolarSystemID(solarSystemID) 134 if not mapNode: 135 return 136 markerID = (MARKERID_BOOKMARK, solarSystemID) 137 markerObject = self.mapView.markersHandler.GetMarkerByID(markerID) 138 if markerObject: 139 markerObject.bookmarksData = bookmarks 140 else: 141 self.mapView.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerBookmarkUniverseLevel, bookmarksData=bookmarks, solarSystemID=solarSystemID, highlightOnLoad=showChanges, mapPositionLocal=(0, 0, 0), mapPositionSolarSystem=mapNode.position) 142 markerIDs.add(markerID) 143 144 def GetBookmarkPosition(self, bookmark): 145 localPosition = None 146 if bookmark and (bookmark.itemID == bookmark.locationID or bookmark.typeID == const.typeSolarSystem) and bookmark.x is not None: 147 localPosition = (bookmark.x, bookmark.y, bookmark.z) 148 elif evetypes.Exists(bookmark.typeID) and evetypes.GetCategoryID(bookmark.typeID) == const.categoryStructure: 149 structure = sm.GetService('map').GetMapDataForStructure(bookmark.locationID, bookmark.itemID) 150 if structure: 151 localPosition = (structure.x, structure.y, structure.z) 152 else: 153 mapSvc = sm.GetService('map') 154 try: 155 itemStarMapData = mapSvc.GetItem(bookmark.itemID) 156 except KeyError: 157 log.error('Map data not found for bookmark.itemID: %s' % bookmark.itemID) 158 return 159 160 if itemStarMapData: 161 localPosition = (itemStarMapData.x, itemStarMapData.y, itemStarMapData.z) 162 elif evetypes.GetGroupID(bookmark.typeID) == const.groupStargate: 163 try: 164 solarSystemData = cfg.mapSolarSystemContentCache[bookmark.locationID] 165 except KeyError: 166 log.error('Stargate data not found for bookmark.locationID: %s' % bookmark.locationID) 167 return 168 169 starGateInfo = solarSystemData.stargates.get(bookmark.itemID, None) 170 if starGateInfo: 171 position = starGateInfo.position 172 localPosition = (position.x, position.y, position.z) 173 if localPosition is None: 174 localPosition = (0, 0, 0) 175 return localPosition 176 177 178 def IsMarkerGroupEnabled(markerGroupID, mapViewID): 179 markerGroups = GetMapViewSetting(VIEWMODE_MARKERS_SETTINGS, mapViewID) 180 return markerGroupID in markerGroups