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

item.py (9658B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\tooltip\item.py
      2 import carbonui.uiconst as uiconst
      3 import eveformat
      4 import expertSystems.client
      5 import inventorycommon.const as invconst
      6 import localization
      7 import menucheckers
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.layoutGrid import LayoutGrid
     10 from carbonui.primitives.sprite import Sprite
     11 from carbonui.util.color import Color
     12 from eve.client.script.ui.control import eveLabel
     13 from eve.client.script.ui.control.eveLabel import EveLabelMedium
     14 from eve.client.script.ui.control.gauge import Gauge
     15 from eve.client.script.ui.shared.cloneGrade import ORIGIN_INVENTORY
     16 from eve.client.script.ui.shared.tooltip.blueprints import AddBlueprintInfo
     17 from eve.client.script.ui.shared.tooltip.dynamicItem import AddDynamicItemAttributes
     18 from eve.client.script.ui.shared.tooltip.itemBtns import ActivateSkinButton, ActivateAndApplySkinButton, ConsumeSkinDesignComponentButton
     19 from eve.client.script.ui.shared.tooltip.itemDamage import AddItemDamage
     20 from eve.client.script.ui.shared.tooltip.itemObject import ItemObject
     21 from eve.client.script.ui.shared.tooltip.skill_requirement import AddSkillActionAndRequirementsForType, ShouldShowTrainingDetails
     22 from eve.client.script.ui.util import uix
     23 from eve.common.script.util.eveFormat import FmtISKAndRound, GetAveragePrice
     24 from solarsysteminterference.util import SystemCanHaveInterference
     25 from spacecomponents.common.componentConst import LINK_WITH_SHIP
     26 from spacecomponents.common.data import get_space_component_for_type
     27 
     28 class InventoryItemTooltip(object):
     29 
     30     def __init__(self, tooltipPanel, item):
     31         self.panel = tooltipPanel
     32         self.item = item
     33         self.Layout()
     34 
     35     def Layout(self):
     36         self.panel.Flush()
     37         self.panel.LoadGeneric2ColumnTemplate()
     38         self.AddName()
     39         AddItemDamage(self.panel, self.item)
     40         estimatedPriceText = self.GetEstimatedPriceText()
     41         if estimatedPriceText:
     42             self.panel.AddLabelMedium(text=estimatedPriceText, colSpan=2, opacity=0.5)
     43         self.panel.AddLabelMedium(text=eveformat.volume_from_item(self.item, include_per_unit=True), colSpan=2, opacity=0.5)
     44         AddDynamicItemAttributes(self.panel, self.item.itemID, self.item.typeID)
     45         AddBlueprintInfo(self.panel, self.item.itemID, self.item.typeID)
     46         AddCharacterEnergyInfo(self.panel, self.item.typeID, self.item.groupID)
     47         AddSkillRequirementsAndActions(self.panel, self.item.typeID, self.item, origin=ORIGIN_INVENTORY)
     48         AddPersonalizationActions(self.panel, self.item.typeID, self.item)
     49 
     50     def AddName(self):
     51         self.panel.AddCell(eveLabel.EveLabelMediumBold(text=self.GetNameAndQuantityText()), colSpan=2)
     52 
     53     def GetNameAndQuantityText(self):
     54         name = uix.GetItemName(self.item)
     55         quantity = self.item.stacksize
     56         if menucheckers.ItemChecker(self.item).IsCrate():
     57             if quantity > 1:
     58                 return localization.GetByLabel('UI/Inventory/OpenCrateMultiple', quantity=quantity, crateName=name)
     59             return localization.GetByLabel('UI/Inventory/OpenCrate', crateName=name)
     60         if quantity > 1:
     61             return localization.GetByLabel('UI/Inventory/QuantityAndName', quantity=quantity, name=name)
     62         return name
     63 
     64     def GetEstimatedPriceText(self):
     65         price = GetAveragePrice(self.item)
     66         if price is None:
     67             return
     68         else:
     69             priceStr = FmtISKAndRound(price * self.item.stacksize, showFractionsAlways=False)
     70             if self.item.stacksize > 1:
     71                 showFraction = price < 100
     72                 return localization.GetByLabel('UI/Inventory/ItemStackEstimatedPrice', estPrice=priceStr, estPricePerUnit=FmtISKAndRound(price, showFractionsAlways=showFraction))
     73             return localization.GetByLabel('UI/Inventory/ItemEstimatedPrice', estPrice=priceStr)
     74 
     75 
     76 def AddSkillRequirementsAndActions(panel, typeID, item = None, origin = None):
     77     grid = LayoutGrid(state=uiconst.UI_NORMAL, columns=2)
     78     AddExpertSystemInfo(grid, typeID)
     79     numExertSystemChildren = len(grid.children)
     80     AddSkillActionAndRequirementsForType(grid, typeID, item)
     81     if len(grid.children) > 0:
     82         showTrainingDetails = ShouldShowTrainingDetails()
     83         if showTrainingDetails or numExertSystemChildren:
     84             panel.state = uiconst.UI_NORMAL
     85         grid.AddCell(Container(align=uiconst.TOPLEFT, width=250), colSpan=grid.columns)
     86         panel.AddCell(grid, colSpan=panel.columns)
     87 
     88 
     89 def AddPersonalizationActions(panel, typeID, item = None, origin = None):
     90     grid = LayoutGrid(state=uiconst.UI_NORMAL, columns=2)
     91     AddSkinAction(grid, typeID, item)
     92     AddSkinDesignComponentAction(grid, typeID, item)
     93     if len(grid.children) > 0:
     94         panel.state = uiconst.UI_NORMAL
     95         grid.AddCell(Container(align=uiconst.TOPLEFT, width=250), colSpan=grid.columns)
     96         panel.AddCell(grid, colSpan=panel.columns)
     97 
     98 
     99 def AddCharacterEnergyInfo(panel, typeID, groupID):
    100     if groupID not in [invconst.groupMobileAnalysisBeacon]:
    101         return
    102     if not SystemCanHaveInterference(session.solarsystemid2):
    103         return
    104     energyState = sm.GetService('characterEnergySvc').GetEnergyStateNow()
    105     interferenceState = sm.GetService('solarsystemInterferenceSvc').GetLocalInterferenceStateNow()
    106     normalisedEnergyLevel = energyState.normalisedEnergyLevel
    107     label = EveLabelMedium(text=localization.GetByLabel('UI/CharacterEnergy/AvailableEnergy'))
    108     gauge = Gauge(value=normalisedEnergyLevel, color=Color.HextoRGBA('#40BBEC'), align=uiconst.CENTERRIGHT)
    109     attributes = get_space_component_for_type(typeID, LINK_WITH_SHIP)
    110     if attributes.characterEnergyCost is not None:
    111         maxActivations = int(round(energyState.quiescentEnergyLevel / attributes.characterEnergyCost))
    112         for i in range(maxActivations):
    113             gauge.ShowMarker(float(i) / maxActivations, color=Color.BLACK, width=3)
    114 
    115     interferenceCost = attributes.solarsystemInterferenceCost
    116     warningLabel = EveLabelMedium(text=localization.GetByLabel('UI/CharacterEnergy/WarnInterferenceWillIncrease'), align=uiconst.CENTER)
    117     warningLabel.maxWidth = 190
    118     interferenceLabel = EveLabelMedium()
    119     interferenceLabel.maxWidth = 160
    120     tooMuchInterference = False
    121     if interferenceCost is not None and not interferenceState.CanAffordCost(interferenceCost):
    122         interferenceLabel.SetText(localization.GetByLabel('UI/CharacterEnergy/TooMuchInterference'))
    123         tooMuchInterference = True
    124     activatableLabel = EveLabelMedium()
    125     activatableLabel.maxWidth = 160
    126     enoughEnergyIcon = Sprite(name='enoughEnergy', width=36, height=36)
    127     tooMuchInterferenceIcon = Sprite(name='warningIcon', texturePath='res:/UI/Texture/classes/crab/warningIcon.png', width=36, height=36)
    128     if attributes.characterEnergyCost is not None and not energyState.CanAffordCost(attributes.characterEnergyCost):
    129         activatableLabel.SetText(localization.GetByLabel('UI/CharacterEnergy/YouDoNotHaveEnergy'))
    130         enoughEnergyIcon.SetTexturePath('res:/UI/Texture/classes/crab/warningIcon.png')
    131     else:
    132         activatableLabel.SetText(localization.GetByLabel('UI/CharacterEnergy/YouHaveEnergy'))
    133         enoughEnergyIcon.SetTexturePath('res:/UI/Texture/classes/SkillPlan/completedIcon.png')
    134     interferenceStateGrid = LayoutGrid(state=uiconst.UI_NORMAL, columns=2)
    135     interferenceStateGrid.AddCell(tooMuchInterferenceIcon, rowSpan=2)
    136     interferenceStateGrid.AddCell(interferenceLabel, colSpan=2, cellPadding=(0, 0, 0, 5))
    137     energyStateGrid = LayoutGrid(state=uiconst.UI_NORMAL, columns=2)
    138     energyStateGrid.AddCell(enoughEnergyIcon, rowSpan=2)
    139     energyStateGrid.AddCell(activatableLabel, colSpan=1, cellPadding=(0, 0, 0, 5))
    140     infoGrid = LayoutGrid(state=uiconst.UI_NORMAL, columns=1)
    141     infoGrid.AddCell(warningLabel)
    142     grid = LayoutGrid(state=uiconst.UI_NORMAL, columns=2)
    143     grid.AddCell(label, colSpan=1)
    144     grid.AddCell(gauge, colSpan=1, cellPadding=(5, 2, 0, 0))
    145     if tooMuchInterference:
    146         panel.AddCell(interferenceStateGrid, colSpan=panel.columns, cellPadding=(0, 5, 0, 0))
    147     panel.AddCell(energyStateGrid, colSpan=panel.columns, cellPadding=(0, 5, 0, 0))
    148     panel.AddCell(infoGrid, colSpan=panel.columns, cellPadding=(0, 5, 0, 0))
    149     panel.AddCell(grid, colSpan=panel.columns, cellPadding=(0, 5, 0, 0))
    150 
    151 
    152 def AddExpertSystemInfo(panel, typeID):
    153     expertSystems.add_type_unlocked_by_expert_systems(panel, typeID, padding=(0, 12, 0, 0))
    154 
    155 
    156 def AddSkinAction(grid, typeID, item):
    157     itemObject = ItemObject(typeID, item)
    158     if itemObject.CanActivateSkinLicense():
    159         AddSkinRow(grid, item, itemObject)
    160         return
    161 
    162 
    163 def AddSkinDesignComponentAction(grid, typeID, item):
    164     itemObject = ItemObject(typeID, item)
    165     if itemObject.CanConsumeSkinDesignComponent():
    166         AddConsumeSkinDesignComponentRow(grid, item)
    167         return
    168 
    169 
    170 def AddSkinRow(grid, item, itemObject):
    171     grid.AddCell(cellPadding=(0, 12, 0, 0), colSpan=grid.columns)
    172     btn = ActivateSkinButton(align=uiconst.CENTER, fixedheight=30, item=item)
    173     other_btn = ActivateAndApplySkinButton(align=uiconst.CENTER, fixedheight=30, item=item, can_apply=itemObject.CanApplySkin())
    174     grid.AddCell(btn, colSpan=grid.columns)
    175     grid.AddCell(cellPadding=(0, 12, 0, 0), colSpan=grid.columns)
    176     grid.AddCell(other_btn, colSpan=grid.columns)
    177 
    178 
    179 def AddConsumeSkinDesignComponentRow(grid, item):
    180     grid.AddCell(cellPadding=(0, 12, 0, 0), colSpan=grid.columns)
    181     btn = ConsumeSkinDesignComponentButton(align=uiconst.CENTER, fixedheight=30, fixedwidth=120, item=item)
    182     grid.AddCell(btn, colSpan=grid.columns)