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

mapMarkerSolarSystem.py (28569B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\markers\mapMarkerSolarSystem.py
      2 import mathext
      3 from carbon.common.script.sys.serviceConst import ROLE_PROGRAMMER
      4 from carbonui import Align, TextColor
      5 from carbonui.text.styles import TextHeader, TextDetail
      6 from carbonui.text.custom import TextCustom
      7 from carbonui.control.contextMenu.menuData import MenuData
      8 from carbonui.control.contextMenu.menuEntryData import MenuEntryData
      9 from carbonui.primitives.transform import Transform
     10 from eve.client.script.ui import eveColor
     11 from eve.client.script.ui.shared.mapView.filters.mapFilterConst import MARKER_BIG, MARKER_MEDIUM, MARKER_NONE
     12 from eve.client.script.ui.shared.mapView.mapViewUtil import TUBE_BUBBLE_SIZE, GetSizeForUIElement, JUMP_RANGE_OUTSIDE, JUMP_RANGE_OFF, TUBE_BUBBLE_CONTENT_MEDIUM, TUBE_BUBBLE_CONTENT_BIG
     13 from eve.client.script.ui.shared.mapView.markers.markerTooltipUtil import LoadSolarSystemMarkerTooltipPanel
     14 from evePathfinder.core import IsUnreachableJumpCount
     15 from carbonui.primitives.base import ScaleDpi
     16 from carbonui.primitives.container import Container
     17 from carbonui.primitives.fill import Fill
     18 from carbonui.primitives.vectorlinetrace import DashedCircle
     19 from carbonui.uicore import uicore
     20 from carbonui.util.color import Color
     21 from eve.client.script.ui.control.eveLabel import EveLabelSmall
     22 import eve.client.script.ui.shared.mapView.mapViewConst as mapViewConst
     23 from eve.client.script.ui.shared.mapView.markers.mapMarkerBase import MarkerSolarSystemBased, MarkerContainerBase
     24 import carbonui.const as uiconst
     25 import math
     26 from carbonui.uianimations import animations
     27 from eve.common.script.sys import idCheckers
     28 from localization import GetByLabel
     29 from carbonui.primitives.sprite import Sprite
     30 CIRCLESIZE = 14
     31 LABEL_LEFT_MARGIN = 8
     32 LABEL_LEFT = CIRCLESIZE + LABEL_LEFT_MARGIN
     33 MARKER_NONE_SIZE = CIRCLESIZE
     34 JUMP_RANGE_OPACITY = 0.3
     35 NAME_OPACITY_FULL = 0.75
     36 NAME_OPACITY_FAINT = 0.3
     37 OPACITY_RANGE_FOR_NAME = NAME_OPACITY_FULL - NAME_OPACITY_FAINT
     38 ZOOM_RANGE_FOR_NAME_OPACITY = mapViewConst.MAP2D_ZOOM_TUBE_MARKER - mapViewConst.MAP2D_ZOOM_NO_SYSTEM_NAME
     39 BUFFER_VALUE = 100
     40 
     41 class MarkerLabelSolarSystem(MarkerSolarSystemBased):
     42     distanceFadeAlphaNearFar = (0.0, 17500.0)
     43     positionPickable = True
     44     extraInfo = None
     45     showPreviewBubble = None
     46     contentContainer = None
     47     jumpRangeMode = JUMP_RANGE_OFF
     48     ignoreOverlaps = True
     49     _cachedLabel = None
     50 
     51     def __init__(self, *args, **kwds):
     52         self.busyUpdating = False
     53         self.lastUpdateCameraValues = None
     54         self.regionGateInfo = {}
     55         self.isAbstractMode = kwds.get('isAbstractMode', False)
     56         self.filterInfo = kwds.get('filterInfo', None)
     57         MarkerSolarSystemBased.__init__(self, *args, **kwds)
     58         self.typeID = const.typeSolarSystem
     59         self.itemID = self.markerID
     60         self.regionContainers = []
     61 
     62     def Load(self):
     63         self.isLoaded = True
     64         self.ConstructContentContainer()
     65         self.UpdateActiveAndHilightState()
     66         self.markerContainer.LoadTooltipPanel = self.LoadTooltipPanel
     67 
     68     def ConstructContentContainer(self):
     69         if self.contentContainer:
     70             return
     71         if self.isAbstractMode:
     72             self._ConstructAbstractContent()
     73         else:
     74             self._ConstructNormalContent()
     75 
     76     def _ConstructNormalContent(self):
     77         self.contentContainer = MarkerContainerContentSimple(name='contentContainer', parent=self.markerContainer, text=self.GetLabelText(), align=Align.CENTERLEFT)
     78         self._UpdateMarkerContainerSize()
     79 
     80     def _ConstructAbstractContent(self):
     81         self.contentContainer = MarkerContainerContentAdvanced(name='contentContainer', parent=self.markerContainer, text=self.GetLabelText(), align=Align.CENTER, filterInfo=self.filterInfo, regionGateInfo=self.regionGateInfo, itemID=self.markerID)
     82         for solarSystemID, radians in self.regionGateInfo.iteritems():
     83             t = Transform(name='regionTransform', parent=self.markerContainer, align=Align.TOALL, rotation=-radians)
     84             RegionArrow(parent=t, solarSystemID=solarSystemID)
     85             self.regionContainers.append(t)
     86 
     87         self.UpdateMarkerContent(False)
     88 
     89     def _UpdateMarkerContainerSize(self):
     90         w, h = self.contentContainer.GetContentSize()
     91         self.markerContainer.width = w
     92         self.markerContainer.height = h
     93         self.projectBracket.offsetX = self.contentContainer.GetOffsetX()
     94 
     95     def _OnMapMarkerUpdated(self, projectBracket):
     96         if not self.isAbstractMode:
     97             return super(MarkerLabelSolarSystem, self)._OnMapMarkerUpdated(projectBracket)
     98         if self.displayStateOverride == False:
     99             if self.markerContainer:
    100                 self.DestroyRenderObject()
    101             return
    102         self._OnAbstractMapMarkerUpdated(projectBracket)
    103 
    104     def _OnAbstractMapMarkerUpdated(self, projectBracket):
    105         viewportValues = self.markerHandler.GetViewportValues()
    106         cameraZoomValue, _, vpWidth, vpHeight = viewportValues
    107         cameraValues = round(cameraZoomValue, 5)
    108         if cameraValues != self.lastUpdateCameraValues and not self.busyUpdating:
    109             if not self.IsOnScreen(vpHeight, vpWidth):
    110                 return
    111             self.busyUpdating = True
    112             self.markerHandler.pendingAbstractUpdater.RegisterMarkerForPendingUpdate(self.markerID)
    113 
    114     def DoUpdateAbstractMarker(self):
    115         if self.markerHandler is None:
    116             self.busyUpdating = False
    117             return
    118         viewportValues = self.markerHandler.GetViewportValues()
    119         cameraZoomValue, _, vpWidth, vpHeight = viewportValues
    120         cameraValues = round(cameraZoomValue, 5)
    121         if not self.IsOnScreen(vpHeight, vpWidth):
    122             self.busyUpdating = False
    123             return
    124         self.lastUpdateCameraValues = cameraValues
    125         opacity = self.GetMarkerOpacity(0.0, cameraZoomValue)
    126         alreadyExists = bool(self.markerContainer)
    127         self._UpdateRenderObjectVisibility(opacity)
    128         if alreadyExists and self.markerContainer:
    129             self.UpdateMarkerContent(True)
    130         self.updated = True
    131         self.busyUpdating = False
    132         return True
    133 
    134     def IsOnScreen(self, vpHeight, vpWidth):
    135         mx, my = self.projectBracket.rawProjectedPosition
    136         if mx < -BUFFER_VALUE or mx > vpWidth + BUFFER_VALUE:
    137             return False
    138         if my < -BUFFER_VALUE or my > vpHeight + BUFFER_VALUE:
    139             return False
    140         return True
    141 
    142     def UpdateMarkerContent(self, animate = True):
    143         if not self.contentContainer:
    144             return
    145         viewportValues = self.markerHandler.GetViewportValues()
    146         isSelectedOrHighlighted = self.hilightState or self.activeState == mapViewConst.MARKER_SELECTED
    147         markerSizeType = self.contentContainer._UpdateContent(self.showPreviewBubble, self.filterInfo, viewportValues, animate, isSelectedOrHighlighted)
    148         self.UpdataRegionalArrowsDisplay(markerSizeType)
    149         self._UpdateMarkerContainerSize()
    150 
    151     def UpdataRegionalArrowsDisplay(self, markerSizeType):
    152         doDisplay = markerSizeType in (MARKER_BIG, MARKER_MEDIUM)
    153         for c in self.regionContainers:
    154             c.display = doDisplay
    155 
    156     def DestroyRenderObject(self):
    157         super(MarkerLabelSolarSystem, self).DestroyRenderObject()
    158         if self.contentContainer:
    159             self.contentContainer.Close()
    160             self.contentContainer = None
    161         for c in self.regionContainers:
    162             c.Close()
    163 
    164         self.regionContainers = []
    165         if self.markerHandler:
    166             self.markerHandler.pendingAbstractUpdater.RemovePending(self.markerID)
    167             self.busyUpdating = False
    168 
    169     def _HideRenderObject(self):
    170         if self.IsActive():
    171             self.markerContainer.Hide()
    172         else:
    173             self.DestroyRenderObject()
    174 
    175     def UpdateSolarSystemPosition(self, solarSystemPosition):
    176         self.mapPositionSolarSystem = solarSystemPosition
    177         self.SetPosition(solarSystemPosition)
    178 
    179     def GetLabelText(self):
    180         if self._cachedLabel is None:
    181             self._cachedLabel = _GetLabelText(self.markerID)
    182         return self._cachedLabel
    183 
    184     def UpdateLabelText(self):
    185         self._cachedLabel = None
    186         if self.contentContainer:
    187             self.contentContainer.SetText(self.GetLabelText())
    188 
    189     def GetDragText(self):
    190         return cfg.evelocations.Get(self.markerID).name
    191 
    192     def GetMarkerDistance(self):
    193         if not self.isAbstractMode:
    194             return self.GetCameraDistance()
    195         return not self.hilightState
    196 
    197     def UpdateActiveAndHilightState(self):
    198         if self.hilightState or self.activeState or self.IsShowingPreviewAndAtZoomLevel():
    199             self.projectBracket.maxDispRange = 1e+32
    200             if self.markerContainer:
    201                 if self.hilightState:
    202                     self.ConstructContentContainer()
    203                     if self.contentContainer:
    204                         self.contentContainer.HiliteMarker()
    205                     self.MoveToFront()
    206                 elif self.contentContainer:
    207                     self.contentContainer.KillHilite()
    208                 if self.contentContainer:
    209                     if self.activeState == mapViewConst.MARKER_SELECTED:
    210                         self.contentContainer.SetTextOpacity(1.3)
    211                     else:
    212                         self.contentContainer.SetTextOpacity(1.0)
    213                 self.UpdateExtraInfo()
    214         else:
    215             if self.distanceFadeAlphaNearFar:
    216                 self.projectBracket.maxDispRange = self.distanceFadeAlphaNearFar[1]
    217             if self.contentContainer:
    218                 self.contentContainer.KillHilite()
    219                 self.contentContainer.KillExtraContainer()
    220                 self.UpdateExtraInfo()
    221         self.lastUpdateCameraValues = None
    222 
    223     def UpdateExtraInfo(self):
    224         if self.contentContainer:
    225             extraInfoText = self.GetExtraInfoText()
    226             self.contentContainer.UpdateExtraInfo(extraInfoText)
    227 
    228     def GetExtraInfoText(self):
    229         extraInfoText = ''
    230         if self.IsHilighted() or self.IsSelected():
    231             extraInfoText = self.GetExtraMouseOverInfo() or ''
    232             lines = extraInfoText.split('<br>')
    233             if len(lines) > 1 and not self.hilightState:
    234                 extraInfoText = GetByLabel('UI/Map/ColorModeHandler/NumRecordsFound', count=len(lines))
    235             if self.IsHilighted() and self.itemID != session.solarsystemid2 and idCheckers.IsKnownSpaceSystem(session.solarsystemid2):
    236                 numJumps = sm.GetService('clientPathfinderService').GetJumpCountFromCurrent(self.itemID)
    237                 if not IsUnreachableJumpCount(numJumps):
    238                     if extraInfoText:
    239                         extraInfoText += '<br>'
    240                     extraInfoText += GetByLabel('UI/Fleet/FleetRegistry/NumberOfJumps', numJumps=numJumps)
    241         return extraInfoText
    242 
    243     def GetMarkerOpacity(self, bracketCameraDistance, zoomDistance):
    244         if self.IsSelected() or self.IsHilighted():
    245             return mapViewConst.OPACITY_MARKER_ACTIVE
    246         if self.isAbstractMode:
    247             if self.IsActive():
    248                 return mapViewConst.OPACITY_MARKER_ACTIVE
    249             if self._IsMarkerVisibleAtZoomLevel():
    250                 return mapViewConst.OPACITY_MARKER_ACTIVE
    251         if self.IsActive():
    252             nearFadeDist, farFadeDist = self._distanceFadeAlphaNearFar
    253             return self.GetMarkerBaseOpacity(bracketCameraDistance, nearFadeDist, farFadeDist)
    254 
    255     def _IsMarkerVisibleAtZoomLevel(self):
    256         cameraZoomValue = self.markerHandler.cameraZoomValue
    257         visible = cameraZoomValue < mapViewConst.MAP2D_ZOOM_TUBE_BUBBLE
    258         return visible
    259 
    260     def SetBracketMaxDispRange(self):
    261         if self.isAbstractMode or self.hilightState or self.activeState:
    262             self.projectBracket.maxDispRange = self.distanceFadeAlphaNearFar[1]
    263         else:
    264             self.projectBracket.maxDispRange = 0
    265 
    266     def ResetAbstractMode(self, isAbstractMode):
    267         self.isAbstractMode = isAbstractMode
    268         self.SetBracketMaxDispRange()
    269         self.Reload()
    270 
    271     def IsShowingPreviewAndAtZoomLevel(self):
    272         return IsShowingPreviewAndAtZoomLevel(self.markerHandler.cameraZoomValue, self.showPreviewBubble)
    273 
    274     def SetPreviewState(self, showPreviewBubble):
    275         if showPreviewBubble != self.showPreviewBubble:
    276             self.showPreviewBubble = showPreviewBubble
    277             self.lastUpdateCameraValues = None
    278             self.UpdateActiveAndHilightState()
    279             if not showPreviewBubble:
    280                 self.DestroyRenderObject()
    281 
    282     def OnClick(self, *args, **kwds):
    283         if uicore.uilib.Key(uiconst.VK_CONTROL):
    284             clearOtherWaypoints = not uicore.uilib.Key(uiconst.VK_SHIFT)
    285             sm.GetService('starmap').SetWaypoint(self.itemID, clearOtherWaypoints=clearOtherWaypoints, origin='map_marker_ctrl_click')
    286         else:
    287             MarkerSolarSystemBased.OnClick(self, *args, **kwds)
    288 
    289     def GetMarkerContainerCls(self):
    290         return MarkerContainerSolarSystem
    291 
    292     def UpdateFilterInfo(self, filterInfo):
    293         self.filterInfo = filterInfo
    294         if self.contentContainer:
    295             self.contentContainer.UpdateFilterInfo(filterInfo)
    296 
    297     def SetJumpRangeMode(self, jumpRangeMode):
    298         self.jumpRangeMode = jumpRangeMode
    299 
    300     def LoadTooltipPanel(self, tooltipPanel, *args):
    301         LoadSolarSystemMarkerTooltipPanel(tooltipPanel, self.itemID, self.jumpRangeMode)
    302 
    303     def UpdateRegionGatesInfo(self, solarSystemID, radians):
    304         self.regionGateInfo[solarSystemID] = radians
    305 
    306     def GetMenu(self):
    307         m = super(MarkerLabelSolarSystem, self).GetMenu()
    308         try:
    309             if session.role & ROLE_PROGRAMMER:
    310                 lineOptions = self.GetLines()
    311                 if lineOptions:
    312                     if not m:
    313                         m = MenuData()
    314                     m.extend(lineOptions)
    315         except Exception:
    316             pass
    317 
    318         return m
    319 
    320     def GetLines(self):
    321         if not self.markerHandler:
    322             return
    323         m = MenuData()
    324         layoutHandler = self.markerHandler.mapView.layoutHandler
    325         mapNode = layoutHandler.GetNodeBySolarSystemID(self.markerID)
    326         subMenu = []
    327         if mapNode:
    328             for line in mapNode.lineData:
    329                 import blue
    330                 subMenu.append(MenuEntryData(line.lineID, lambda lineID = line.lineID: blue.pyos.SetClipboardData(str(lineID)), hint=str(line)))
    331 
    332         if not subMenu:
    333             return
    334         m.AddEntry('GM: Lines', subMenuData=subMenu)
    335         return m
    336 
    337 
    338 def IsShowingPreviewAndAtZoomLevel(cameraZoomValue, showPreviewBubble):
    339     return showPreviewBubble and cameraZoomValue < mapViewConst.MAP2D_ZOOM_TUBE_BUBBLE
    340 
    341 
    342 class MarkerContainerSolarSystem(MarkerContainerBase):
    343 
    344     def ApplyAttributes(self, attributes):
    345         super(MarkerContainerSolarSystem, self).ApplyAttributes(attributes)
    346         self.uniqueUiName = 'map_marker_solar_system_%s' % self.markerObject.markerID
    347 
    348 
    349 class ExtraInfoLabel(EveLabelSmall):
    350 
    351     def OnMouseEnter(self, *args):
    352         if self.destroyed:
    353             return
    354         EveLabelSmall.OnMouseEnter(self, *args)
    355 
    356 
    357 class ExtraInfoContainer(Container):
    358     default_align = uiconst.TOPLEFT
    359     default_state = uiconst.UI_NORMAL
    360     default_opacity = 0.0
    361     default_clipChildren = False
    362 
    363     def ApplyAttributes(self, attributes):
    364         Container.ApplyAttributes(self, attributes)
    365         self.markerObject = attributes.markerObject
    366         self.label = ExtraInfoLabel(parent=self, text=attributes.text, bold=True, state=uiconst.UI_NORMAL, opacity=0.8, cursor=uiconst.UICURSOR_DEFAULT)
    367         self.UpdateSize()
    368         Fill(bgParent=self, padding=(-3, 0, -2, 0), color=(0, 0, 0, 0.4))
    369         animations.FadeTo(self, startVal=0.0, endVal=1.0, duration=0.1)
    370         animations.MorphScalar(self, 'displayWidth', 0, self.label.actualTextWidth, duration=0.2)
    371 
    372     def UpdateSize(self):
    373         self.height = self.label.textheight
    374         self.width = self.label.textwidth
    375 
    376     def Close(self, *args):
    377         Container.Close(self, *args)
    378         self.markerObject = None
    379 
    380     def SetText(self, text):
    381         self.label.text = text
    382         self.UpdateSize()
    383 
    384 
    385 class BaseMarkerContainerContent(Container):
    386     textLabel = None
    387     extraContainer = None
    388     hiliteContainer = None
    389     jumpRangeMode = JUMP_RANGE_OUTSIDE
    390     filterInfo = None
    391     flagDirty = False
    392 
    393     def GetOffsetX(self):
    394         return 0
    395 
    396     def HiliteMarker(self):
    397         self.CheckConstructHiliteContainer()
    398         self.textLabel.Show()
    399 
    400     def CheckConstructHiliteContainer(self):
    401         if not self.hiliteContainer:
    402             align = Align.CENTERLEFT
    403             hiliteContainer = Container(name='hiliteContainer', parent=self, align=align, pos=(0,
    404              0,
    405              CIRCLESIZE,
    406              CIRCLESIZE), state=uiconst.UI_DISABLED)
    407             DashedCircle(parent=hiliteContainer, dashCount=4, lineWidth=0.8, radius=CIRCLESIZE / 2, range=math.pi * 2)
    408             self.hiliteContainer = hiliteContainer
    409 
    410     def KillHilite(self):
    411         if self.hiliteContainer:
    412             self.hiliteContainer.Close()
    413             self.hiliteContainer = None
    414 
    415     def KillExtraContainer(self):
    416         if self.extraContainer:
    417             self.extraContainer.Close()
    418             self.extraContainer = None
    419 
    420     def SetText(self, text):
    421         self.textLabel.text = text
    422 
    423     def SetTextOpacity(self, opacity):
    424         pass
    425 
    426     def UpdateExtraInfo(self, extraInfoText):
    427         if not extraInfoText:
    428             self.KillExtraContainer()
    429             return
    430         self.ConstructExtraContainer(extraInfoText)
    431         self.extraContainer.SetText(extraInfoText)
    432 
    433     def ConstructExtraContainer(self, text):
    434         pass
    435 
    436     def UpdateFilterInfo(self, filterInfo):
    437         pass
    438 
    439     def GetContentSize(self):
    440         return (CIRCLESIZE, CIRCLESIZE)
    441 
    442     def _UpdateContent(self, showPreviewBubble, filterInfo, viewportValues, animate = True, isSelectedOrHighlighted = False):
    443         pass
    444 
    445     def UpdateJumpRange(self, jumpRangeMode):
    446         self.jumpRangeMode = jumpRangeMode
    447 
    448 
    449 class MarkerContainerContentSimple(BaseMarkerContainerContent):
    450     labelLeft = LABEL_LEFT
    451 
    452     def ApplyAttributes(self, attributes):
    453         super(MarkerContainerContentSimple, self).ApplyAttributes(attributes)
    454         text = attributes.text
    455         self.textLabel = EveLabelSmall(parent=self, text=text, bold=True, state=uiconst.UI_NORMAL, left=self.labelLeft)
    456         self.textLabel.GetMenu = self.parent.GetMenu
    457         self.width = LABEL_LEFT + self.textLabel.textwidth
    458         self.height = self.textLabel.textheight
    459         Fill(bgParent=self, padding=(LABEL_LEFT - 2,
    460          CIRCLESIZE,
    461          -2,
    462          0), color=(0, 0, 0, 0.5))
    463 
    464     def GetOffsetX(self):
    465         return 0
    466 
    467     def SetTextOpacity(self, opacity):
    468         self.textLabel.opacity = opacity
    469 
    470     def ConstructExtraContainer(self, text):
    471         if not self.extraContainer:
    472             left = LABEL_LEFT
    473             self.extraContainer = ExtraInfoContainer(parent=self, text=text, top=self.textLabel.top + self.textLabel.textheight, left=left, markerObject=self, idx=0)
    474 
    475 
    476 class MarkerContainerContentAdvanced(BaseMarkerContainerContent):
    477     markerSizeType = None
    478     markerSize = 0
    479     amountLabel = None
    480     filterSprite = None
    481     default_width = 13
    482     default_height = 13
    483     default_state = uiconst.UI_DISABLED
    484     itemID = None
    485 
    486     def ApplyAttributes(self, attributes):
    487         self.itemID = attributes.itemID
    488         self.regionGateInfo = attributes.regionGateInfo
    489         super(MarkerContainerContentAdvanced, self).ApplyAttributes(attributes)
    490         self.itemID = attributes.itemID
    491         text = attributes.text
    492         self.filterInfo = filterInfo = attributes.filterInfo
    493         self.textLabelCont = Container(name='textLabelCont', parent=self, align=uiconst.CENTER, pos=(0, 0, 20, 20))
    494         self.textLabel = TextDetail(parent=self.textLabelCont, text=text, state=uiconst.UI_NORMAL, align=uiconst.CENTER, color=None)
    495         self.amountLabel = TextCustom(name='amountLabel', parent=self, text=filterInfo.amountText if filterInfo else '', align=Align.CENTER, color=eveColor.BLACK, shadowColor=(0.0, 0.0, 0.0, 0.0))
    496 
    497     def ConstructExtraContainer(self, text):
    498         if not self.extraContainer:
    499             self.extraContainer = ExtraInfoContainer(parent=self, text=text, top=0, markerObject=self, idx=0)
    500             self._UpdateContentContainerSize()
    501 
    502     def _UpdateContent(self, showPreviewBubble, filterInfo, viewportValues, animate = True, isSelectedOrHighlighted = False):
    503         markerSizeType, sizeToUse, nameOpacity = self._GetMarkerSizeToUse(showPreviewBubble, viewportValues, isSelectedOrHighlighted)
    504         self.textLabelCont.opacity = nameOpacity
    505         if not isSelectedOrHighlighted and not self.flagDirty and self.markerSizeType == markerSizeType and self.markerSize == sizeToUse:
    506             return markerSizeType
    507         self.flagDirty = False
    508         self.markerSizeType = markerSizeType
    509         self.markerSize = sizeToUse
    510         self.amountLabel.Hide()
    511         self.textLabelCont.Hide()
    512         if markerSizeType == MARKER_NONE:
    513             self.amountLabel.Hide()
    514             if isSelectedOrHighlighted:
    515                 self.textLabelCont.Show()
    516                 self.textLabelCont.opacity = 1.0
    517                 self.textLabel.SetAlign(Align.TOPLEFT)
    518                 self.textLabelCont.SetAlign(Align.TOPLEFT)
    519                 self.textLabelCont.left = LABEL_LEFT
    520             self.textLabelCont.top = 0
    521             self._UpdateContentContainerSize()
    522             if self.filterSprite:
    523                 self.filterSprite.Hide()
    524             return markerSizeType
    525         self.textLabel.SetAlign(Align.CENTER)
    526         self.textLabelCont.SetAlign(Align.CENTER)
    527         self.textLabelCont.left = 0
    528         self.textLabelCont.top = (sizeToUse + self.textLabel.textheight) / 2 + 3
    529         if filterInfo:
    530             amountText = filterInfo.amountText
    531             texturePath = filterInfo.texturePath
    532             textureColor = filterInfo.textureColor
    533         else:
    534             amountText = ''
    535             texturePath = ''
    536             textureColor = None
    537         if amountText is not None:
    538             self.amountLabel.SetText(amountText)
    539             fontsize = mathext.clamp(int(sizeToUse / 2.5), 12, 26)
    540             self.amountLabel.fontsize = fontsize
    541             self.amountLabel.Show()
    542         elif texturePath:
    543             self._UpdateFilterSprite(texturePath, textureColor)
    544         if self.markerSizeType in (MARKER_BIG, MARKER_MEDIUM):
    545             self.textLabelCont.Show()
    546         self._UpdateContentContainerSize()
    547         return markerSizeType
    548 
    549     def _UpdateContentContainerSize(self):
    550         w, h = self.GetContentSize()
    551         if self.extraContainer:
    552             if self.markerSizeType == MARKER_NONE:
    553                 self.extraContainer.left = LABEL_LEFT
    554                 self.extraContainer.top = self.textLabel.textheight
    555             else:
    556                 self.extraContainer.left = self.width + 0.5 * self.markerSize
    557                 self.extraContainer.top = 0
    558 
    559     def _GetMarkerSizeToUse(self, showPreviewBubble, viewportValues, isSelectedOrHighlighted):
    560         cameraZoomValue, cameraProjectionFovConst, _, viewportHeight = viewportValues
    561         if cameraZoomValue < mapViewConst.MAP2D_ZOOM_TUBE_MARKER:
    562             size = GetSizeForUIElement(TUBE_BUBBLE_CONTENT_BIG, viewportHeight, cameraProjectionFovConst)
    563             return (MARKER_BIG, size, NAME_OPACITY_FULL)
    564         if IsShowingPreviewAndAtZoomLevel(cameraZoomValue, showPreviewBubble):
    565             size = GetSizeForUIElement(TUBE_BUBBLE_CONTENT_MEDIUM, viewportHeight, cameraProjectionFovConst)
    566             if isSelectedOrHighlighted:
    567                 opacity = NAME_OPACITY_FULL
    568             elif cameraZoomValue > mapViewConst.MAP2D_ZOOM_NO_SYSTEM_NAME:
    569                 opacity = 0.0
    570             else:
    571                 t = (cameraZoomValue - mapViewConst.MAP2D_ZOOM_NO_SYSTEM_NAME) / ZOOM_RANGE_FOR_NAME_OPACITY
    572                 opacity = NAME_OPACITY_FAINT + t * OPACITY_RANGE_FOR_NAME
    573             return (MARKER_MEDIUM, size, opacity)
    574         return (MARKER_NONE, MARKER_NONE_SIZE, 1.0)
    575 
    576     def UpdateFilterInfo(self, filterInfo):
    577         self.filterInfo = filterInfo
    578         if not self.amountLabel:
    579             return
    580         self.amountLabel.Hide()
    581         if not filterInfo:
    582             return
    583         self.amountLabel.text = filterInfo.amountText
    584         if filterInfo.texturePath:
    585             self._UpdateFilterSprite(filterInfo.texturePath, filterInfo.textureColor)
    586         elif self.filterSprite:
    587             self.filterSprite.Hide()
    588         if self.markerSizeType == MARKER_NONE:
    589             return
    590         if filterInfo.amount:
    591             self.amountLabel.Show()
    592 
    593     def _UpdateFilterSprite(self, texturePath, textureColor):
    594         size = self.markerSize - 2
    595         self.SetFilterSpriteTexture(texturePath)
    596         self.filterSprite.width = size
    597         self.filterSprite.height = size
    598         self.filterSprite.Show()
    599         if textureColor:
    600             self.filterSprite.SetRGBA(*textureColor)
    601 
    602     def SetFilterSpriteTexture(self, texturePath):
    603         if self.filterSprite:
    604             self.filterSprite.SetTexturePath(texturePath)
    605         else:
    606             self.filterSprite = Sprite(name='filterSprite', parent=self, align=Align.CENTER, state=uiconst.UI_DISABLED, pos=(0, 0, 32, 32), texturePath=texturePath)
    607 
    608     def GetContentSize(self):
    609         w = self.markerSize
    610         h = self.markerSize
    611         if self.regionGateInfo:
    612             w += 32
    613             h += 34
    614         return (w, h)
    615 
    616     def KillHilite(self):
    617         super(MarkerContainerContentAdvanced, self).KillHilite()
    618         if self.markerSizeType not in (MARKER_BIG, MARKER_MEDIUM):
    619             self.textLabelCont.Hide()
    620 
    621     def GetOffsetX(self):
    622         if self.markerSizeType == MARKER_NONE:
    623             return ScaleDpi(0)
    624         return super(MarkerContainerContentAdvanced, self).GetOffsetX()
    625 
    626     def CheckConstructHiliteContainer(self):
    627         if self.markerSizeType != MARKER_NONE:
    628             return
    629         return super(MarkerContainerContentAdvanced, self).CheckConstructHiliteContainer()
    630 
    631 
    632 class FilterInfo(object):
    633 
    634     def __init__(self, color, amount, texturePath, textureColor, amountFmtFunc):
    635         self._color = color
    636         self._amount = amount
    637         self._texturePath = texturePath
    638         self._textureColor = textureColor
    639         self._amountFmtFunc = amountFmtFunc
    640 
    641     @property
    642     def color(self):
    643         return self._color
    644 
    645     @property
    646     def amount(self):
    647         return self._amount
    648 
    649     @property
    650     def amountText(self):
    651         if self._amountFmtFunc:
    652             return self._amountFmtFunc(self._amount)
    653         return self._amount
    654 
    655     @property
    656     def texturePath(self):
    657         return self._texturePath
    658 
    659     @property
    660     def textureColor(self):
    661         return self._textureColor
    662 
    663     def __repr__(self):
    664         return '<FilterInfo %s>, %s' % (self.__dict__, id(self))
    665 
    666 
    667 class RegionArrow(Sprite):
    668     default_texturePath = 'res:/UI/Texture/classes/MapView/mapArrow.png'
    669     default_width = 16
    670     default_height = 17
    671     default_align = Align.CENTERTOP
    672     default_opacity = 0.5
    673 
    674     def ApplyAttributes(self, attributes):
    675         super(RegionArrow, self).ApplyAttributes(attributes)
    676         self.solarSystemID = attributes.solarSystemID
    677 
    678     def OnClick(self, *args):
    679         from eve.client.script.ui.shared.mapView.mapViewPanel import MapViewPanel
    680         mapPanel = MapViewPanel.GetIfOpen()
    681         if mapPanel:
    682             mapPanel.SetActiveItemID(self.solarSystemID)
    683 
    684     def GetHint(self):
    685         regionID = sm.GetService('map').GetRegionForSolarSystem(self.solarSystemID)
    686         regionName = cfg.evelocations.Get(regionID).name
    687         solarSystemName = _GetLabelText(self.solarSystemID)
    688         return '<br>'.join([regionName, solarSystemName])
    689 
    690     def OnMouseEnter(self, *args):
    691         self.opacity = 1.0
    692 
    693     def OnMouseExit(self, *args):
    694         self.opacity = 0.5
    695 
    696     def GetTooltipPosition(self):
    697         return (uicore.uilib.x - 2,
    698          uicore.uilib.y - 2,
    699          4,
    700          4)
    701 
    702 
    703 def _GetLabelText(solarSystemID):
    704     securityStatus, color = sm.GetService('map').GetSecurityStatus(solarSystemID, True)
    705     securityModifierIconText = sm.GetService('securitySvc').get_security_modifier_icon_text(solarSystemID)
    706     return '%s <color=%s>%s</color>%s' % (cfg.evelocations.Get(solarSystemID).name,
    707      Color.RGBtoHex(color[0], color[1], color[2], 1.0),
    708      securityStatus,
    709      securityModifierIconText)