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)