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

dropboxWnd.py (13898B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\structure\dropbox\dropboxWnd.py
      2 import carbonui.const as uiconst
      3 import inventorycommon
      4 from carbon.common.script.util.linkUtil import GetShowInfoLink
      5 from carbon.common.script.util.timerstuff import AutoTimer
      6 from carbonui.control.button import Button
      7 from carbonui.control.scrollContainer import ScrollContainer
      8 from carbonui.control.window import Window
      9 from carbonui.primitives.container import Container
     10 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     11 from carbonui.primitives.flowcontainer import FlowContainer
     12 from carbonui.uicore import uicore
     13 from eve.client.script.ui.control.eveLabel import EveLabelMedium, EveLabelMediumBold, EveCaptionMedium
     14 from eve.client.script.ui.structure.dropbox.const import TILE_SIZE
     15 from eve.client.script.ui.structure.dropbox.dropboxController import DropBoxController
     16 from eve.client.script.ui.structure.dropbox.dropboxTilePlacer import DropBoxTilePlacer
     17 from eve.client.script.ui.structure.dropbox.transferItem import TransferItem
     18 from eve.common.script.util.eveFormat import FmtISKAndRound
     19 from eveservices.menu import GetMenuService
     20 from eveuniverse.security import is_low_sec_or_higher_solar_system
     21 from localization import GetByLabel
     22 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     23 from reprocessing.ui.controller import NodesToItems
     24 from signals.signalUtil import ChangeSignalConnect
     25 
     26 class DropboxWnd(Window):
     27     __guid__ = 'dropboxWnd'
     28     __notifyevents__ = ['OnSessionChanged', 'OnClientEvent_WarpStarted']
     29     default_width = 400
     30     default_height = 400
     31     default_minSize = (300, 400)
     32     default_windowID = 'dropboxWnd'
     33     default_descriptionLabelPath = 'Tooltips/Neocom/HangarTransfer_description'
     34     default_captionLabelPath = 'Tooltips/Neocom/HangarTransfer'
     35     default_iconNum = 'res:/UI/Texture/WindowIcons/items.png'
     36 
     37     def ApplyAttributes(self, attributes):
     38         Window.ApplyAttributes(self, attributes)
     39         structureID = attributes.structureID
     40         structureTypeID = attributes.structureTypeID
     41         self.isTranferInProgress = False
     42         self.validRange = sm.GetService('godma').GetTypeAttribute(structureTypeID, const.attributeCargoDeliverRange)
     43         self.dropBoxController = DropBoxController(structureID, session.shipid)
     44         mainCont = Container(name='mainCont', parent=self.sr.main, padding=const.defaultPadding)
     45         self.transferToLabel = EveLabelMedium(name='transferToLabel', parent=mainCont, align=uiconst.TOTOP, state=uiconst.UI_NORMAL, padding=(6, 0, 6, 6))
     46         self.bottomContainer = Container(name='bottomCont', parent=mainCont, align=uiconst.TOBOTTOM, height=36, padTop=8)
     47         inputCont = Container(name='inputCont', parent=mainCont, align=uiconst.TOALL)
     48         self.inputInfoCont = TransferInputContainer(name='inputInfo', parent=inputCont, dropBoxController=self.dropBoxController)
     49         self.AddButtons()
     50         self.ChangeSignalConnection()
     51         sm.RegisterNotify(self)
     52         structureLink = GetShowInfoLink(structureTypeID, cfg.evelocations.Get(structureID).name, itemID=structureID)
     53         text = GetByLabel('UI/HangarTransfer/TransferTo', structureLink=structureLink)
     54         self.transferToLabel.text = text
     55         self.verifyingTimer = AutoTimer(1000, self.VerifyRestrictions)
     56         if attributes.itemsToTransfer:
     57             self.dropBoxController.AddManyItems(attributes.itemsToTransfer)
     58 
     59     def ChangeSignalConnection(self, connect = True):
     60         signalAndCallback = [(self.dropBoxController.on_items_added, self.OnItemsAdded), (self.dropBoxController.on_items_removed, self.OnItemsRemoved), (self.dropBoxController.on_items_updated, self.OnItemsUpdated)]
     61         ChangeSignalConnect(signalAndCallback, connect)
     62 
     63     def OnItemsAdded(self, itemIDs):
     64         self.UpdateButton()
     65 
     66     def OnItemsRemoved(self, itemIDs):
     67         updateNoContentHint = not self.isTranferInProgress and self.dropBoxController.GetNumToBeTransferred() < 1
     68         self.inputInfoCont.RemoveItems(itemIDs, updateNoContentHint)
     69         self.UpdateButton()
     70 
     71     def OnItemsUpdated(self, itemIDs):
     72         self.UpdateButton()
     73 
     74     def AddButtons(self):
     75         btnCont = Container(name='buttonCont', parent=self.bottomContainer, align=uiconst.TOBOTTOM, height=36, idx=0)
     76         self.transferBtn = Button(name='transferBtn', parent=btnCont, label=GetByLabel('UI/HangarTransfer/TransferBtn'), func=self.TransferItems, align=uiconst.CENTERRIGHT)
     77         self.cancelButton = Button(parent=btnCont, label=GetByLabel('UI/Common/Buttons/Cancel'), func=self.Cancel, align=uiconst.CENTERLEFT)
     78         self.UpdateButton()
     79 
     80     def UpdateButton(self):
     81         numItems = self.dropBoxController.GetNumToBeTransferred()
     82         if numItems:
     83             self.transferBtn.Enable()
     84             self.transferBtn.hint = ''
     85         else:
     86             self.transferBtn.Disable()
     87             self.transferBtn.hint = GetByLabel('UI/HangarTransfer/NothingToTransfer')
     88 
     89     def Cancel(self, *args):
     90         self.CloseByUser()
     91 
     92     def TransferItems(self, *args):
     93         try:
     94             self.isTranferInProgress = True
     95             itemRecsMoved = self.dropBoxController.TransferItems()
     96             self.inputInfoCont.PopulateMovedTiles(itemRecsMoved)
     97         finally:
     98             self.isTranferInProgress = False
     99 
    100     def Close(self, *args, **kwds):
    101         self.verifyingTimer = None
    102         sm.UnregisterNotify(self.dropBoxController)
    103         self.ChangeSignalConnection(connect=False)
    104         self.dropBoxController = None
    105         Window.Close(self, *args, **kwds)
    106 
    107     def OnClientEvent_WarpStarted(self, *args):
    108         self.Close()
    109 
    110     def OnSessionChanged(self, isRemote, session, change):
    111         if 'shipid' in change and session.shipid != self.dropBoxController.forShipID:
    112             self.Close()
    113         elif session.structureid or session.stationid:
    114             self.Close()
    115 
    116     def VerifyRestrictions(self):
    117         self.VerifyRange()
    118         self.VerifyNotCloaked()
    119         self.VerifyCrimewatchFlags()
    120 
    121     def VerifyRange(self):
    122         bp = sm.GetService('michelle').GetBallpark()
    123         if not bp:
    124             return self.Close()
    125         try:
    126             structureID = self.dropBoxController.GetStructureID()
    127             dist = bp.GetBall(structureID).surfaceDist
    128             if dist > self.validRange:
    129                 self.Close()
    130         except Exception:
    131             self.Close()
    132 
    133     def VerifyNotCloaked(self):
    134         shipBall = sm.GetService('michelle').GetBall(session.shipid)
    135         if not shipBall:
    136             return self.Close()
    137         if shipBall.isCloaked:
    138             self.Close()
    139 
    140     def VerifyCrimewatchFlags(self):
    141         crimewatchSvc = sm.GetService('crimewatchSvc')
    142         if crimewatchSvc.IsCriminal(session.charid):
    143             if is_low_sec_or_higher_solar_system(session.solarsystemid2):
    144                 prompt_player_fsd_dialog('CannotDeliverInEmpireWhileCriminal')
    145                 self.Close()
    146                 return
    147         if sm.GetService('crimewatchSvc').HaveWeaponsTimer():
    148             prompt_player_fsd_dialog('CannotDeliverWithWeaponsTimer')
    149             self.Close()
    150 
    151 
    152 class TransferInputContainer(Container):
    153 
    154     def ApplyAttributes(self, attributes):
    155         Container.ApplyAttributes(self, attributes)
    156         self.dropBoxController = attributes.dropBoxController
    157         infoCont = Container(name='infoCont', parent=self, align=uiconst.TOBOTTOM, height=38, clipChildren=True)
    158         self.CreateScrollContainer()
    159         self.numItemsLabel = EveLabelMedium(name='numItemsLabel', parent=infoCont, align=uiconst.TOPRIGHT, left=5, top=4)
    160         self.totalPriceLabel = EveLabelMedium(name='totalPriceLabel', parent=infoCont, align=uiconst.TOPRIGHT, left=5, top=20)
    161         inputTileParent = ContainerAutoSize(name='inputTileParent', parent=self.scrollCont, align=uiconst.TOTOP, percentage=0.5, alignMode=uiconst.TOTOP)
    162         tileContainer = FlowContainer(name='tileContainer', parent=inputTileParent, align=uiconst.TOTOP, state=uiconst.UI_NORMAL, contentSpacing=(8, 8), padding=8)
    163         self.tilePlacer = DropBoxTilePlacer(tileContainer)
    164         self.overlayMoveCont = Container(name='overlayMoveCont', parent=inputTileParent, align=uiconst.TOALL)
    165         movedToText = GetByLabel('UI/HangarTransfer/MovedTo')
    166         overlayLabel = EveCaptionMedium(name='overlayLabel', parent=self.overlayMoveCont, align=uiconst.CENTERTOP, top=6, text=movedToText)
    167         self.overlayLabelDest = EveLabelMediumBold(name='overlayLabel2', parent=self.overlayMoveCont, align=uiconst.CENTERTOP, top=26, state=uiconst.UI_NORMAL, text='')
    168         self.overlayMoveCont.display = False
    169         self.movedTileContainer = FlowContainer(name='movedTileContainer', parent=inputTileParent, align=uiconst.TOTOP, state=uiconst.UI_DISABLED, contentSpacing=(8, 8), padding=8)
    170         self.movedTilePlacer = DropBoxTilePlacer(self.movedTileContainer)
    171         self.ChangeSignalConnection(connect=True)
    172         self.UpdateItemInfo()
    173 
    174     def CreateScrollContainer(self):
    175         self.scrollCont = ScrollContainer(name='inputScroll', parent=self, align=uiconst.TOALL, showUnderlay=True)
    176         self.scrollCont.onDropDataSignal.connect(self.OnDroppingItems)
    177         self.scrollCont.GetAbsoluteSize()
    178         self.UpdateNoContentHint()
    179 
    180     def ChangeSignalConnection(self, connect = True):
    181         signalAndCallback = [(self.dropBoxController.on_items_added, self.OnItemsAdded), (self.dropBoxController.on_items_updated, self.OnItemsUpdated)]
    182         ChangeSignalConnect(signalAndCallback, connect)
    183 
    184     def UpdateNoContentHint(self):
    185         if self.dropBoxController.itemsToBeTransferred:
    186             return
    187         if self.dropBoxController.IsDockableStructure():
    188             self.scrollCont.ShowNoContentHint(GetByLabel('UI/HangarTransfer/DropHereToTransfer'))
    189         else:
    190             self.scrollCont.ShowNoContentHint(GetByLabel('UI/HangarTransfer/DropHereToTransfer_NonDockable'))
    191 
    192     def OnItemsAdded(self, itemIDs):
    193         for eachItemID in itemIDs:
    194             self.AddItemToTilePlacer(eachItemID)
    195 
    196         if self.dropBoxController.GetNumToBeTransferred() > 0:
    197             self.scrollCont.HideNoContentHint()
    198         self.UpdateItemInfo()
    199 
    200     def RemoveItems(self, itemIDs, updateNoContentHint):
    201         for each in itemIDs:
    202             self.tilePlacer.RemoveItem(each)
    203 
    204         self.UpdateItemInfo()
    205         if updateNoContentHint:
    206             self.UpdateNoContentHint()
    207 
    208     def OnItemsUpdated(self, itemIDs):
    209         for eachItemID in itemIDs:
    210             itemContainer = self.MakeInputItem(eachItemID)
    211             if itemContainer:
    212                 self.tilePlacer.ReplaceItem(eachItemID, itemContainer)
    213 
    214         self.UpdateItemInfo()
    215 
    216     def OnDroppingItems(self, dragObj, nodes):
    217         items = NodesToItems(nodes)
    218         self.dropBoxController.AddManyItems(items)
    219 
    220     def AddItemToTilePlacer(self, itemID):
    221         itemContainer = self.MakeInputItem(itemID)
    222         if itemContainer:
    223             self.tilePlacer.AddItem(itemID, itemContainer)
    224             self.tilePlacer.mainContainer.OnDropData = self.OnDroppingItems
    225 
    226     def MakeInputItem(self, itemID):
    227         itemRec = self.dropBoxController.GetItem(itemID)
    228         if not itemRec:
    229             return None
    230         return self._MakeInputItem(itemRec)
    231 
    232     def _MakeInputItem(self, itemRec, isRemovable = True):
    233         itemContainer = CreateInputItem(itemRec, self.dropBoxController, isRemovable=isRemovable)
    234         itemContainer.removeIcon.OnClick = (self.RemoveItem, itemRec.itemID)
    235         return itemContainer
    236 
    237     def RemoveItem(self, itemID):
    238         self.dropBoxController.RemoveItems([itemID])
    239 
    240     def GetItemMenu(self, itemID, typeID):
    241         menu = []
    242         menu += GetMenuService().GetMenuFromItemIDTypeID(itemID, typeID, includeMarketDetails=True)
    243         menu.append((GetByLabel('UI/Generic/RemoveItem'), self.RemoveItem, (itemID,)))
    244         return menu
    245 
    246     def _GetAveragePrice(self, typeID):
    247         price = inventorycommon.typeHelpers.GetAveragePrice(typeID)
    248         if price is None:
    249             return 0.0
    250         return price
    251 
    252     def UpdateItemInfo(self):
    253         allItems = self.dropBoxController.GetItems()
    254         numItems = self.dropBoxController.GetNumToBeTransferred()
    255         price = sum((self._GetAveragePrice(x.typeID) * max(1, x.quantity) for x in allItems))
    256         self.totalPriceLabel.text = GetByLabel('UI/Inventory/EstIskPrice', iskString=FmtISKAndRound(price, False))
    257         self.numItemsLabel.text = GetByLabel('UI/Inventory/NumItems', numItems=numItems, numFilteredTxt='')
    258 
    259     def PopulateMovedTiles(self, itemRecs):
    260         if self.dropBoxController.IsDockableStructure():
    261             destText = GetByLabel('UI/Inventory/ItemHangar')
    262         else:
    263             destText = GetByLabel('UI/Ship/FuelBay')
    264         self.overlayLabelDest.text = destText
    265         self.overlayMoveCont.display = True
    266         self.movedTileContainer.display = True
    267         uicore.animations.FadeTo(self.overlayMoveCont, 0.0, 1.0)
    268         self.movedTilePlacer.Clear()
    269         for each in itemRecs:
    270             itemContainer = self._MakeInputItem(each, isRemovable=False)
    271             if itemContainer:
    272                 self.movedTilePlacer.AddItem(each.itemID, itemContainer)
    273 
    274         uicore.animations.FadeTo(self.movedTileContainer, 0.25, 0.0, timeOffset=2, callback=self.ResetMoved)
    275 
    276     def ResetMoved(self):
    277         self.movedTilePlacer.Clear()
    278         self.movedTileContainer.display = False
    279         self.overlayMoveCont.display = False
    280         self.UpdateNoContentHint()
    281 
    282     def Close(self):
    283         self.ChangeSignalConnection(connect=False)
    284         self.dropboxController = None
    285         Container.Close(self)
    286 
    287 
    288 def CreateInputItem(item, dropboxController, isRemovable):
    289     return TransferItem(align=uiconst.TOPLEFT, width=TILE_SIZE, height=TILE_SIZE, dropboxController=dropboxController, isRemovable=isRemovable, item=item)