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

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 ]