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)