orbitalMaterialUI.py (12781B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\orbitalMaterialUI.py 2 import eveformat 3 import evelink.client 4 import utillib 5 from carbon.common.script.net.moniker import Moniker 6 from carbonui import uiconst 7 from carbonui.control.button import Button 8 from carbonui.control.window import Window 9 from carbonui.decorative.panelUnderlay import PanelUnderlay 10 from carbonui.primitives.container import Container 11 from carbonui.primitives.containerAutoSize import ContainerAutoSize 12 from carbonui.primitives.fill import Fill 13 from carbonui.primitives.frame import Frame 14 from carbonui.primitives.layoutGrid import LayoutGrid 15 from carbonui.uianimations import animations 16 import inventorycommon.typeHelpers 17 import localization 18 from collections import defaultdict 19 from eve.client.script.ui.control import eveIcon, eveLabel 20 from carbonui.button.group import ButtonGroup 21 from eve.client.script.ui.util import uix 22 from eve.common.lib import appConst as const 23 from typematerials.data import get_type_materials_by_id 24 ICONWIDTH = 74 25 ICONHEIGHT = 154 26 ICONPADDING = 4 27 28 class OrbitalMaterialUI(Window): 29 __guid__ = 'form.OrbitalMaterialUI' 30 __notifyevents__ = ['OnItemChange'] 31 default_windowID = 'OrbitalMaterialUI' 32 default_captionLabelPath = 'UI/UpgradeWindow/UpgradeHold' 33 scope = uiconst.SCOPE_INFLIGHT 34 35 def ApplyAttributes(self, attributes): 36 super(OrbitalMaterialUI, self).ApplyAttributes(attributes) 37 self.orbitalID = attributes.orbitalID 38 self.hasCapacity = 1 39 self.MakeUnResizeable() 40 self.Startup(attributes.orbitalID, const.flagSpecializedMaterialBay) 41 self.CheckCanUpgrade() 42 43 def Startup(self, itemID, locationFlag): 44 sm.RegisterNotify(self) 45 self.itemID = itemID 46 self.typeID = sm.GetService('invCache').GetInventoryFromId(itemID).GetItem().typeID 47 self.locationFlag = locationFlag 48 self.AddLayoutNew() 49 50 def AddLayoutNew(self): 51 self.main_container = ContainerAutoSize(parent=self.content, align=uiconst.TOPLEFT, callback=self._on_main_cont_size_changed, only_use_callback_when_size_changes=True) 52 self.sr.iconContainer = LayoutGrid(name='iconContainer', parent=self.main_container, align=uiconst.TOPLEFT, columns=4, cellSpacing=(8, 8)) 53 self.sr.iconContainer.OnDropData = self.OnDropData 54 self.sr.iconContainer.OnDragEnter = self.OnDragEnter 55 self.sr.iconContainer.OnDragExit = self.OnDragExit 56 self.PopulateIcons() 57 self.transferBtn = Button(align=uiconst.CENTER, label=localization.GetByLabel('UI/UpgradeWindow/StartUpgrade'), func=self.InitiateUpgrade, args=(), enabled=self._can_upgrade()) 58 self.sr.iconContainer.AddCell(self.transferBtn, colSpan=self.sr.iconContainer.columns) 59 60 def _on_main_cont_size_changed(self): 61 width, height = self.GetWindowSizeForContentSize(height=self.main_container.height, width=self.main_container.width) 62 self.SetMinSize(size=(width, height), refresh=True) 63 64 def AddLayout(self): 65 pad = const.defaultPadding 66 self.sr.footer = Container(name='footer', parent=self.sr.main, align=uiconst.TOBOTTOM, pos=(0, 0, 0, 25), padding=(pad, 67 pad, 68 pad, 69 pad)) 70 self.sr.iconContainer = Container(name='iconContainer', parent=self.sr.main, align=uiconst.TOALL, padding=(pad + 5, 71 pad + 5, 72 0, 73 0), columns=4) 74 self.sr.iconContainer.OnDropData = self.OnDropData 75 self.sr.iconContainer.OnDragEnter = self.OnDragEnter 76 self.sr.iconContainer.OnDragExit = self.OnDragExit 77 btns = [(localization.GetByLabel('UI/UpgradeWindow/StartUpgrade'), 78 self.InitiateUpgrade, 79 (), 80 None)] 81 self.buttons = btns = ButtonGroup(btns=btns, parent=self.sr.footer) 82 self.transferBtn = btns.buttons[0] 83 84 def PopulateIcons(self): 85 qtyByTypeID = defaultdict(lambda : utillib.KeyVal(qty=0, invItems=set())) 86 inv = sm.GetService('invCache').GetInventoryFromId(self.itemID) 87 for item in inv.List(flag=const.flagSpecializedMaterialBay): 88 qtyByTypeID[item.typeID].qty += item.stacksize 89 qtyByTypeID[item.typeID].invItems.add(item) 90 91 self.upgradeIconsByTypeID = {} 92 for info in self.GetUpgradeMaterials(): 93 upgradeIcon = self.upgradeIconsByTypeID[info.materialTypeID] = UpgradeTypeIcon(name='%s' % info.materialTypeID, parent=self.sr.iconContainer, align=uiconst.TOPLEFT, state=uiconst.UI_NORMAL, typeID=info.materialTypeID, qtyNeeded=info.quantity, qty=qtyByTypeID[info.materialTypeID].qty, invItems=qtyByTypeID[info.materialTypeID].invItems, containerID=self.itemID) 94 upgradeIcon.width = ICONWIDTH 95 upgradeIcon.height = ICONHEIGHT 96 upgradeIcon.HookInEvents(utillib.KeyVal(OnDropData=self.OnDropData, OnDragEnter=self.OnDragEnter, OnDragExit=self.OnDragExit)) 97 98 def ArrangeIcons(self): 99 containerWidth, containerHeight = self.sr.iconContainer.GetAbsoluteSize() 100 iconWidth = ICONWIDTH + ICONPADDING 101 iconHeight = ICONHEIGHT + ICONPADDING 102 maxRows = containerHeight / iconHeight 103 numberOfColumns = (containerWidth - ICONPADDING) / iconWidth 104 for i, icon in enumerate(self.upgradeIconsByTypeID.itervalues()): 105 column = i % numberOfColumns 106 row = i / numberOfColumns 107 icon.left = iconWidth * column 108 icon.top = iconHeight * row 109 icon.width = ICONWIDTH 110 icon.height = ICONHEIGHT 111 if row < maxRows: 112 icon.state = uiconst.UI_NORMAL 113 else: 114 icon.state = uiconst.UI_HIDDEN 115 icon.state = uiconst.UI_NORMAL 116 117 def OnItemChange(self, item, change, location): 118 if const.ixLocationID in change or item.locationID == self.itemID and const.ixStackSize in change: 119 if self.itemID in (item.locationID, change.get(const.ixLocationID, None)): 120 self.UpdateTypeQuantity(item.typeID) 121 122 def UpdateTypeQuantity(self, typeID): 123 inv = sm.GetService('invCache').GetInventoryFromId(self.itemID) 124 qty = 0 125 for item in inv.List(): 126 if item.typeID == typeID: 127 qty += item.stacksize 128 129 self.upgradeIconsByTypeID[typeID].SetQuantity(qty) 130 self.CheckCanUpgrade() 131 132 def CheckCanUpgrade(self): 133 self.transferBtn.enabled = self._can_upgrade() 134 135 def _can_upgrade(self): 136 return all((icon.qty >= icon.qtyNeeded for icon in self.upgradeIconsByTypeID.values())) 137 138 def DoGetShell(self): 139 return sm.GetService('invCache').GetInventoryFromId(self.itemID) 140 141 def IsItemHere(self, rec): 142 return rec.locationID == self.itemID and rec.flagID == self.locationFlag 143 144 def GetCapacity(self): 145 return self.GetShell().GetCapacity(self.locationFlag) 146 147 def InitiateUpgrade(self): 148 posMgr = Moniker('posMgr', session.solarsystemid) 149 posMgr.OnlineOrbital(self.itemID) 150 self.Close() 151 152 def GetUpgradeMaterials(self): 153 upgradeTypeID = self.GetUpgradeTypeID() 154 return get_type_materials_by_id(upgradeTypeID) 155 156 def GetUpgradeTypeID(self): 157 dogmaStaticSvc = sm.GetService('clientDogmaStaticSvc') 158 return int(dogmaStaticSvc.GetTypeAttribute2(self.typeID, const.attributeConstructionType)) 159 160 def OnDropData(self, dragObj, nodes): 161 itemIDsByLocation = defaultdict(set) 162 try: 163 for node in nodes: 164 if node.__guid__ not in ('xtriui.InvItem', 'listentry.InvItem'): 165 continue 166 itemIDsByLocation[node.rec.locationID].add(node.rec.itemID) 167 168 inv = sm.GetService('invCache').GetInventoryFromId(self.itemID) 169 for locationID, itemIDs in itemIDsByLocation.iteritems(): 170 inv.MultiAdd(itemIDs, locationID, flag=const.flagSpecializedMaterialBay) 171 172 finally: 173 for icon in self.upgradeIconsByTypeID.itervalues(): 174 self.UpdateTypeQuantity(icon.typeID) 175 176 def OnDragEnter(self, dragObj, nodes, *args): 177 qtyByTypeID = defaultdict(lambda : 0) 178 for node in nodes: 179 if node.__guid__ not in ('xtriui.InvItem', 'listentry.InvItem'): 180 continue 181 if node.rec.locationID == self.itemID and node.rec.flagID == const.flagSpecializedMaterialBay: 182 continue 183 typeID = node.rec.typeID 184 qtyByTypeID[typeID] += node.rec.quantity 185 186 for typeID, quantity in qtyByTypeID.iteritems(): 187 icon = self.upgradeIconsByTypeID.get(typeID, None) 188 if icon is None: 189 continue 190 icon.Hilite(quantity) 191 192 def OnDragExit(self, *args): 193 for icon in self.upgradeIconsByTypeID.itervalues(): 194 icon.Delite() 195 196 197 class UpgradeTypeIcon(Container): 198 isDragObject = True 199 default_align = uiconst.TOALL 200 201 def ApplyAttributes(self, attributes): 202 Container.ApplyAttributes(self, attributes) 203 self.animateThread = None 204 self.typeID = attributes.typeID 205 self.invItems = attributes.invItems 206 self.qtyNeeded = attributes.qtyNeeded 207 self.containerID = attributes.containerID 208 self.AddLayout() 209 self.SetQuantity(attributes.qty) 210 211 def AddLayout(self): 212 self.sr.main = Container(name='main', parent=self, align=uiconst.TOPLEFT, height=ICONHEIGHT, width=ICONWIDTH) 213 self.sr.background = Container(name='background', parent=self.sr.main, align=uiconst.TOTOP, height=88) 214 self.sr.backgroundFrame = PanelUnderlay(name='backgroundUnderlay', parent=self.sr.background) 215 self.sr.iconContainer = Container(name='iconContainer', parent=self.sr.main, align=uiconst.CENTERTOP, pos=(0, 10, 54, 54), idx=0) 216 invTypeIcon = inventorycommon.typeHelpers.GetIcon(self.typeID) 217 self.sr.icon = icon = eveIcon.Icon(parent=self.sr.iconContainer, align=uiconst.TOALL, state=uiconst.UI_DISABLED) 218 if invTypeIcon is None: 219 icon.ChangeIcon(typeID=self.typeID) 220 else: 221 icon.LoadIcon(invTypeIcon.iconFile) 222 self.sr.quantityContainer = Container(name='quantityContainer', parent=self.sr.background, align=uiconst.CENTERBOTTOM, height=20, width=ICONWIDTH - 1, idx=0, bgColor=(0.0, 0.0, 0.0, 0.5)) 223 self.sr.quantityLabel = eveLabel.EveLabelMedium(text='', parent=self.sr.quantityContainer, align=uiconst.CENTERBOTTOM, left=3, bold=True) 224 self.barContainer = Fill(name='barContainer', parent=self.sr.quantityContainer, align=uiconst.TOPLEFT, color=(1, 1, 1, 0.25), height=20, width=0) 225 self.sr.typeNameContainer = Container(name='typeNameContainer', parent=self.sr.main, align=uiconst.TOALL) 226 self.sr.typeName = eveLabel.EveLabelMedium(parent=self.sr.typeNameContainer, align=uiconst.CENTERTOP, state=uiconst.UI_NORMAL, width=ICONWIDTH, text=eveformat.center(evelink.client.type_link(self.typeID)), maxLines=3, top=4) 227 self.sr.typeName.maxLines = None 228 self.sr.frame = Frame(parent=self, state=uiconst.UI_HIDDEN, color=(1.0, 1.0, 1.0, 0.5)) 229 230 def HookInEvents(self, events): 231 for container in (self, self.sr.typeName): 232 container.OnDropData = events.OnDropData 233 container.OnDragEnter = events.OnDragEnter 234 container.OnDragExit = events.OnDragExit 235 236 def SetQuantity(self, qty): 237 self.qty = qty 238 self.DisplayQuantity(qty) 239 self.hint = localization.GetByLabel('UI/UpgradeWindow/TypeIconToolTip', amount=self.qtyNeeded - self.qty, typeID=self.typeID) 240 241 def DisplayQuantity(self, qty, highlight = False): 242 self.AnimateBar(min(int(ICONWIDTH * (float(qty) / self.qtyNeeded)), ICONWIDTH) - 1) 243 if qty <= 0: 244 self.sr.icon.opacity = 0.2 245 else: 246 self.sr.icon.opacity = 1.0 247 if False and self.qtyNeeded <= self.qty: 248 self.sr.quantityLabel.text = localization.GetByLabel('UI/UpgradeWindow/TypeFull') 249 else: 250 if highlight: 251 qty = '<color=yellow>%s</color>' % qty 252 self.sr.quantityLabel.text = '%s / %s' % (qty, self.qtyNeeded) 253 254 def AnimateBar(self, width): 255 width = int(max(0, width)) 256 animations.MorphScalar(self.barContainer, 'width', endVal=width, duration=0.25) 257 258 def Hilite(self, quantity): 259 totalQuantity = min(self.qty + quantity, self.qtyNeeded) 260 self.DisplayQuantity(totalQuantity, highlight=True) 261 262 def Delite(self): 263 self.DisplayQuantity(self.qty) 264 265 def GetDragData(self, *args): 266 inv = sm.GetService('invCache').GetInventoryFromId(self.containerID) 267 return [ uix.GetItemData(item, 'icons') for item in inv.List(const.flagSpecializedMaterialBay) if item.typeID == self.typeID ]