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

resourceController.py (17863B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\resourceController.py
      2 import blue
      3 import carbonui.const as uiconst
      4 import evetypes
      5 import localization
      6 import uthread
      7 from carbon.client.script.environment.AudioUtil import PlaySound
      8 from carbon.common.script.sys.serviceConst import ROLE_GML
      9 from carbonui.primitives.container import Container
     10 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     11 from carbonui.primitives.fill import Fill
     12 from carbonui.primitives.line import Line
     13 from carbonui.primitives.sprite import Sprite
     14 from carbonui.primitives.transform import Transform
     15 from carbonui.uicore import uicore
     16 from carbonui.util.various_unsorted import SortListOfTuples
     17 from eve.client.script.ui.control import eveIcon, eveLabel
     18 from eve.client.script.ui.control.gauge import Gauge
     19 from eve.client.script.ui.shared.planet import planetCommon
     20 from eve.common.lib import appConst as const
     21 from inventorycommon import typeHelpers
     22 from localization import GetByLabel
     23 
     24 class ResourceController(ContainerAutoSize):
     25     __notifyevents__ = []
     26     default_name = 'ResourceController'
     27     default_align = uiconst.TOTOP
     28     default_state = uiconst.UI_HIDDEN
     29 
     30     def ApplyAttributes(self, attributes):
     31         ContainerAutoSize.ApplyAttributes(self, attributes)
     32         self.CreateLayout()
     33         sm.RegisterNotify(self)
     34 
     35     def CreateLayout(self):
     36         legend = ResourceLegend(parent=self)
     37         planetUI = sm.GetService('planetUI')
     38         self.resourceList = ResourceList(parent=self)
     39         planetObject = sm.GetService('planetSvc').GetPlanet(planetUI.planetID)
     40         resourceInfo = planetObject.remoteHandler.GetPlanetResourceInfo()
     41         sortedList = []
     42         for typeID, quality in resourceInfo.iteritems():
     43             name = evetypes.GetName(typeID)
     44             sortedList.append((name, (typeID, quality)))
     45 
     46         sortedList = SortListOfTuples(sortedList)
     47         for typeID, quality in sortedList:
     48             qualityRemapped = quality / const.MAX_DISPLAY_QUALITY
     49             self.resourceList.AddItem(typeID, quality=max(0, min(1.0, qualityRemapped)))
     50 
     51     def StopLoadingResources(self, resourceTypeID):
     52         self.resourceList.StopLoading(resourceTypeID)
     53 
     54     def StartLoadingResources(self):
     55         self.resourceList.StartLoading()
     56 
     57     def ResourceSelected(self, resourceTypeID):
     58         for item in self.resourceList.children:
     59             if item.typeID == resourceTypeID:
     60                 self.resourceList.SelectItem(item)
     61 
     62     def EnterSurveyMode(self):
     63         self.resourceList.SetOpacity(0.5)
     64         self.resourceList.state = uiconst.UI_DISABLED
     65 
     66     def ExitSurveyMode(self):
     67         self.resourceList.SetOpacity(1)
     68         self.resourceList.state = uiconst.UI_PICKCHILDREN
     69 
     70 
     71 class ResourceLegend(Container):
     72     default_name = 'ResourceLegend'
     73     default_align = uiconst.TOTOP
     74     default_height = 30
     75     default_state = uiconst.UI_PICKCHILDREN
     76     LINE_COLOR = (1, 1, 1, 0.5)
     77     RAMP_HEIGHT = 8
     78     HEIGHT = 4
     79     ADJUSTER_WIDTH = 16
     80     MIN_COLOR_RANGE = 26
     81     LEGENDWIDTH = 240
     82 
     83     def ApplyAttributes(self, attributes):
     84         Container.ApplyAttributes(self, attributes)
     85         self.leftSpacerMaxWidth = self.ADJUSTER_WIDTH + self.LEGENDWIDTH - self.MIN_COLOR_RANGE
     86         self.CreateLayout()
     87 
     88     def CreateLayout(self):
     89         scale = Container(name='scale', parent=self, align=uiconst.TOTOP, pos=(0,
     90          0,
     91          0,
     92          self.HEIGHT), padding=(4, 2, 4, -4))
     93         Line(name='scaleBase', parent=scale, align=uiconst.TOTOP, color=self.LINE_COLOR)
     94         Line(name='leftTick', parent=scale, align=uiconst.TOLEFT, color=self.LINE_COLOR)
     95         Line(name='rightTick', parent=scale, align=uiconst.TORIGHT, color=self.LINE_COLOR)
     96         Line(name='centerTick', parent=scale, align=uiconst.RELATIVE, color=self.LINE_COLOR, pos=(self.LEGENDWIDTH / 2,
     97          1,
     98          1,
     99          self.HEIGHT))
    100         for x in (0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9):
    101             left = int(self.LEGENDWIDTH * x)
    102             Line(name='miniorTick_%f' % x, parent=scale, align=uiconst.RELATIVE, color=self.LINE_COLOR, pos=(left,
    103              1,
    104              1,
    105              self.HEIGHT / 2))
    106 
    107         self.legendContainer = Container(parent=self, name='colorFilterContainer', align=uiconst.TOTOP, statestate=uiconst.UI_PICKCHILDREN, pos=(0,
    108          8,
    109          self.LEGENDWIDTH + 2 * self.ADJUSTER_WIDTH,
    110          self.ADJUSTER_WIDTH))
    111         self.leftSpacer = Container(parent=self.legendContainer, name='leftSpacer', align=uiconst.TOLEFT, pos=(0,
    112          0,
    113          self.ADJUSTER_WIDTH,
    114          self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN)
    115         self.centerSpacer = Container(parent=self.legendContainer, name='centerSpacer', align=uiconst.TOLEFT, pos=(0,
    116          0,
    117          self.LEGENDWIDTH,
    118          self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN)
    119         self.rightSpacer = Container(parent=self.legendContainer, name='rightSpacer', align=uiconst.TOLEFT, pos=(0,
    120          0,
    121          self.ADJUSTER_WIDTH,
    122          self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN)
    123         adjusterMin = eveIcon.Icon(iname='leftAdjuster', icon='ui_73_16_185', parent=self.leftSpacer, align=uiconst.TORIGHT, pos=(0,
    124          0,
    125          self.ADJUSTER_WIDTH - 2,
    126          self.ADJUSTER_WIDTH), state=uiconst.UI_NORMAL, hint=localization.GetByLabel('UI/PI/Common/ResourcesMinimumVisibleHint'), color=(1, 1, 1, 0.5))
    127         adjusterMax = eveIcon.Icon(name='rightAdjuster', icon='ui_73_16_186', parent=self.rightSpacer, align=uiconst.TOLEFT, pos=(0,
    128          0,
    129          self.ADJUSTER_WIDTH - 2,
    130          self.ADJUSTER_WIDTH), state=uiconst.UI_NORMAL, hint=localization.GetByLabel('UI/PI/Common/ResourcesMaximumVisibleHint'), color=(1, 1, 1, 0.5))
    131         adjusterMin.OnMouseDown = (self.OnAdjustMouseDown, adjusterMin)
    132         adjusterMin.OnMouseUp = (self.OnAdjustMouseUp, adjusterMin)
    133         adjusterMin.OnMouseMove = (self.OnAdjustMouseMove, adjusterMin)
    134         adjusterMin.OnMouseEnter = (self.OnAdjusterMouseEnter, adjusterMin)
    135         adjusterMin.OnMouseExit = (self.OnAdjusterMouseExit, adjusterMin)
    136         adjusterMax.OnMouseDown = (self.OnAdjustMouseDown, adjusterMax)
    137         adjusterMax.OnMouseUp = (self.OnAdjustMouseUp, adjusterMax)
    138         adjusterMax.OnMouseMove = (self.OnAdjustMouseMove, adjusterMax)
    139         adjusterMax.OnMouseEnter = (self.OnAdjusterMouseEnter, adjusterMax)
    140         adjusterMax.OnMouseExit = (self.OnAdjusterMouseExit, adjusterMax)
    141         colorRamp = Sprite(name='ColorRamp', parent=self.centerSpacer, texturePath='res:/dx9/model/worldobject/planet/resource_colorramp.dds', color=(1, 1, 1, 0.75), padding=(0, 4, 0, 4), state=uiconst.UI_NORMAL, align=uiconst.TOALL)
    142         colorRamp.OnMouseDown = (self.OnAdjustMouseDown, colorRamp)
    143         colorRamp.OnMouseUp = (self.OnAdjustMouseUp, colorRamp)
    144         colorRamp.OnMouseMove = (self.OnMoveRange, colorRamp)
    145         low, hi = sm.GetService('planetUI').GetResourceDisplayRange()
    146         scalar = self.LEGENDWIDTH - 1
    147         self.leftSpacer.width = int(low * scalar) + self.ADJUSTER_WIDTH
    148         self.centerSpacer.width = int((hi - low) * scalar)
    149 
    150     def OnAdjusterMouseEnter(self, adjuster, *args):
    151         adjuster.SetRGBA(1, 1, 1, 0.75)
    152         PlaySound(uiconst.SOUND_ENTRY_HOVER)
    153 
    154     def OnAdjusterMouseExit(self, adjuster, *args):
    155         adjuster.SetRGBA(1, 1, 1, 0.5)
    156 
    157     def OnAdjustMouseDown(self, adjuster, button):
    158         if button == 0:
    159             adjuster.dragging = True
    160 
    161     def OnAdjustMouseUp(self, adjuster, button):
    162         if button == 0:
    163             adjuster.dragging = False
    164 
    165     def OnAdjustMouseMove(self, adjuster, *args):
    166         if getattr(adjuster, 'dragging', False) and uicore.uilib.leftbtn:
    167             if adjuster.name.startswith('right'):
    168                 self.centerSpacer.width += uicore.uilib.dx
    169                 position = self.centerSpacer.width + self.leftSpacer.width - self.ADJUSTER_WIDTH
    170                 if position > self.LEGENDWIDTH - self.ADJUSTER_WIDTH:
    171                     self.centerSpacer.width = self.LEGENDWIDTH - self.leftSpacer.width
    172                 elif position > self.LEGENDWIDTH:
    173                     self.centerSpacer.width = self.LEGENDWIDTH - (self.leftSpacer.width - self.ADJUSTER_WIDTH)
    174                 elif self.centerSpacer.width < self.MIN_COLOR_RANGE:
    175                     self.centerSpacer.width = self.MIN_COLOR_RANGE
    176             else:
    177                 width = self.leftSpacer.width
    178                 dx = uicore.uilib.dx
    179                 if self.centerSpacer.width - uicore.uilib.dx < self.MIN_COLOR_RANGE:
    180                     dx = self.centerSpacer.width - self.MIN_COLOR_RANGE
    181                 width += dx
    182                 if width < self.ADJUSTER_WIDTH:
    183                     width = self.ADJUSTER_WIDTH
    184                 elif width > self.leftSpacerMaxWidth:
    185                     width = self.leftSpacerMaxWidth
    186                 dx = width - self.leftSpacer.width
    187                 self.leftSpacer.width = width
    188                 self.centerSpacer.width -= dx
    189             self.UpdateColorRamp()
    190 
    191     def OnMoveRange(self, adjuster, *args):
    192         if getattr(adjuster, 'dragging', False):
    193             self.leftSpacer.width += uicore.uilib.dx
    194             position = self.centerSpacer.width + self.leftSpacer.width - self.ADJUSTER_WIDTH
    195             if position > self.LEGENDWIDTH - self.ADJUSTER_WIDTH:
    196                 self.leftSpacer.width = self.LEGENDWIDTH - self.centerSpacer.width
    197             elif position > self.LEGENDWIDTH:
    198                 self.leftSpacer.width = self.LEGENDWIDTH - (self.centerSpacer.width - self.ADJUSTER_WIDTH)
    199             elif self.leftSpacer.width < self.ADJUSTER_WIDTH:
    200                 self.leftSpacer.width = self.ADJUSTER_WIDTH
    201             self.UpdateColorRamp()
    202 
    203     def UpdateColorRamp(self):
    204         low = self.leftSpacer.width - self.ADJUSTER_WIDTH
    205         hi = low + self.centerSpacer.width
    206         sm.GetService('planetUI').SetResourceDisplayRange(low / float(self.LEGENDWIDTH - 1), hi / float(self.LEGENDWIDTH - 1))
    207 
    208 
    209 class ResourceNameLabel(eveLabel.EveLabelMedium):
    210 
    211     def ApplyAttributes(self, attributes):
    212         eveLabel.EveLabelMedium.ApplyAttributes(self, attributes)
    213         self.toolTipTextWidthThreshold = attributes.get('toolTipTextWidthThreshold', 0)
    214         self.SetRightAlphaFade(self.toolTipTextWidthThreshold, maxFadeWidth=10)
    215 
    216 
    217 class ResourceList(ContainerAutoSize):
    218     default_name = 'ResourceList'
    219     default_align = uiconst.TOTOP
    220     default_state = uiconst.UI_PICKCHILDREN
    221 
    222     def ApplyAttributes(self, attributes):
    223         ContainerAutoSize.ApplyAttributes(self, attributes)
    224         self.AddItem(None)
    225 
    226     def AddItem(self, typeID, quality = None):
    227         ResourceListItem(parent=self, typeID=typeID, quality=quality)
    228 
    229     def ClearItems(self):
    230         self.children.Clear()
    231 
    232     def SelectItem(self, selectedItem):
    233         for item in self.children:
    234             if item != selectedItem:
    235                 item.Deselect()
    236             else:
    237                 item.Select()
    238 
    239     def StopLoading(self, typeID):
    240         item = self.GetItemByType(typeID)
    241         item.StopLoading()
    242 
    243     def GetItemByType(self, typeID):
    244         for item in self.children:
    245             if item.typeID == typeID:
    246                 return item
    247 
    248     def GetSelected(self):
    249         for item in self.children:
    250             if item.selected:
    251                 return item
    252 
    253 
    254 class ResourceListItem(Container):
    255     ITEM_HEIGHT = 28
    256     SELECT_BLOCK_PADDING = 1
    257     LEVEL_COLOR = (0.85, 0.85, 0.85, 1)
    258     LEVEL_BG_COLOR = (0.85, 0.85, 0.85, 0.25)
    259     LEVEL_WIDTH = 112
    260     LEVEL_HEIGHT = 10
    261     LEVEL_LEFT = 150
    262     SELECT_FILL_COLOR = (1.0, 1.0, 1.0, 0.25)
    263     HOVER_FILL_COLOR = (1.0, 1.0, 1.0, 0.25)
    264     EMPTY_COLOR = (1, 1, 1, 0)
    265     ICON_SIZE = 24
    266     ICON_LEFT = 0
    267     default_name = 'ResourceListItem'
    268     default_left = 0
    269     default_top = 0
    270     default_width = 0
    271     default_height = ITEM_HEIGHT
    272     default_align = uiconst.TOTOP
    273     default_state = uiconst.UI_NORMAL
    274     default_typeID = None
    275     default_selected = False
    276     default_quality = None
    277 
    278     def ApplyAttributes(self, attributes):
    279         Container.ApplyAttributes(self, attributes)
    280         self.typeID = attributes.get('typeID', self.default_typeID)
    281         self.quality = attributes.get('quality', self.default_quality)
    282         if self.typeID is None:
    283             self.selected = True
    284         else:
    285             self.selected = False
    286         self.CreateLayout()
    287 
    288     def CreateLayout(self):
    289         if self.typeID is None:
    290             text = localization.GetByLabel('UI/PI/Common/NoFilter')
    291             self.icon = None
    292             self.loadingIcon = None
    293         else:
    294             self.icon = eveIcon.Icon(parent=self, align=uiconst.CENTERLEFT, pos=(0,
    295              0,
    296              self.ICON_SIZE,
    297              self.ICON_SIZE), state=uiconst.UI_DISABLED, ignoreSize=True, typeID=self.typeID, size=self.ICON_SIZE)
    298             text = evetypes.GetName(self.typeID)
    299             self.loadingIcon = Transform(parent=self, align=uiconst.CENTERLEFT, pos=(0,
    300              0,
    301              self.ICON_SIZE,
    302              self.ICON_SIZE), state=uiconst.UI_HIDDEN)
    303             load = eveIcon.Icon(icon='ui_77_32_13', parent=self.loadingIcon, IgnoreSize=True, pos=(0,
    304              0,
    305              self.ICON_SIZE,
    306              self.ICON_SIZE), align=uiconst.CENTER)
    307         self.container = Container(parent=self, name='mainContainer', align=uiconst.TOALL, state=uiconst.UI_DISABLED)
    308         self.resourceName = ResourceNameLabel(text=text, parent=self, left=6 + (self.ICON_SIZE if self.typeID is not None else 0), top=0, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, toolTipTextWidthThreshold=105)
    309         if self.typeID is not None:
    310             self.ConstructQualityGauge()
    311         self.selectBlock = Fill(parent=self, name='selectBlock', state=uiconst.UI_DISABLED, align=uiconst.TOALL, padding=(0,
    312          self.SELECT_BLOCK_PADDING,
    313          0,
    314          self.SELECT_BLOCK_PADDING), color=self.SELECT_FILL_COLOR if self.selected else self.EMPTY_COLOR)
    315 
    316     def ConstructQualityGauge(self):
    317         if self.quality is not None:
    318             gauge = Gauge(parent=self, pos=(0,
    319              0,
    320              self.LEVEL_WIDTH,
    321              self.LEVEL_HEIGHT), align=uiconst.CENTERRIGHT, state=uiconst.UI_DISABLED, gaugeHeight=self.LEVEL_HEIGHT, value=self.quality)
    322             gauge.ShowMarkers([ i * 0.1 for i in xrange(1, 10) ], color=(0.0, 0.0, 0.0, 0.2))
    323 
    324     def OnMouseEnter(self, *args):
    325         if not self.selected:
    326             PlaySound(uiconst.SOUND_ENTRY_HOVER)
    327             self.selectBlock.SetRGBA(*self.HOVER_FILL_COLOR)
    328 
    329     def OnMouseExit(self, *args):
    330         if not self.selected:
    331             self.selectBlock.SetRGBA(*self.EMPTY_COLOR)
    332 
    333     def OnClick(self, *args):
    334         sm.GetService('audio').SendUIEvent('msg_pi_scanning_switch_play')
    335         selected = self.parent.GetSelected()
    336         if selected == self:
    337             return
    338         PlaySound(uiconst.SOUND_ENTRY_SELECT)
    339         self.parent.SelectItem(self)
    340         sm.GetService('planetUI').ShowResource(self.typeID)
    341 
    342     def Select(self):
    343         self.selectBlock.SetRGBA(*self.SELECT_FILL_COLOR)
    344         if self.loadingIcon:
    345             self.loadingIcon.state = uiconst.UI_DISABLED
    346             self.icon.state = uiconst.UI_HIDDEN
    347             uthread.new(self.loadingIcon.StartRotationCycle, 1.0, 4000.0)
    348         self.selected = True
    349 
    350     def Deselect(self):
    351         self.selectBlock.SetRGBA(*self.EMPTY_COLOR)
    352         self.selected = False
    353 
    354     def StopLoading(self):
    355         if self.loadingIcon:
    356             self.loadingIcon.StopRotationCycle()
    357             self.loadingIcon.state = uiconst.UI_HIDDEN
    358             self.icon.state = uiconst.UI_DISABLED
    359 
    360     def GetMenu(self):
    361         if self.typeID is None:
    362             return []
    363         ret = sm.GetService('menu').GetMenuFromItemIDTypeID(None, self.typeID, includeMarketDetails=True)
    364         if session.role & ROLE_GML == ROLE_GML:
    365             ret.append(('PI: GM / WM Extras', self.GetGMMenu()))
    366         return ret
    367 
    368     def LoadTooltipPanel(self, tooltipPanel, *args):
    369         if not self.typeID:
    370             return
    371         tooltipPanel.LoadGeneric2ColumnTemplate()
    372         tooltipPanel.AddLabelMedium(colSpan=2, text=planetCommon.GetProductNameAndTier(self.typeID))
    373         text = GetByLabel('UI/PI/Common/ResourceDensity', density=int(100 * self.quality))
    374         tooltipPanel.AddLabelMedium(colSpan=2, text=text)
    375         tooltipPanel.AddLabelMedium(colSpan=2, cellPadding=(0, 10, 0, 2), text=GetByLabel('UI/InfoWindow/TabNames/RequiredFor'))
    376         for typeID in planetCommon.GetRequiredForItems(self.typeID):
    377             label = planetCommon.GetProductNameAndTier(typeID)
    378             icon = typeHelpers.GetIconFile(typeID)
    379             tooltipPanel.AddIconLabel(icon=icon, label=label, iconSize=28)
    380 
    381     def GetTooltipPointer(self):
    382         return uiconst.POINT_LEFT_2
    383 
    384     def GetGMMenu(self):
    385         ret = []
    386         ret.append(('Copy typeID', self.CopyTypeID))
    387         ret.append(('Show resource details: current server version', sm.GetService('planetUI').GMShowResource, (self.typeID, 'current')))
    388         ret.append(('Show resource details: current player version', sm.GetService('planetUI').GMShowResource, (self.typeID, 'player')))
    389         ret.append(('Show resource details: base layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'base')))
    390         ret.append(('Show resource details: depletion layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'depletion')))
    391         ret.append(('Show resource details: Nugget layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'nuggets')))
    392         ret.append(None)
    393         ret.append(('Create nugget layer', sm.GetService('planetUI').GMCreateNuggetLayer, (self.typeID,)))
    394         return ret
    395 
    396     def CopyTypeID(self):
    397         blue.pyos.SetClipboardData(str(self.typeID))