def PromptUserForQuantity(self, item, itemQuantity, sourceLocation=None): if self.locationFlag is not None and item.flagID != self.locationFlag or item.locationID != getattr( self._GetInvCacheContainer(), 'itemID', None): if self.hasCapacity: cap = self.GetCapacity() capacity = cap.capacity - cap.used itemvolume = cfg.GetItemVolume(item, 1) or 1 maxQty = capacity / itemvolume + 1e-07 maxQty = min(itemQuantity, int(maxQty)) else: maxQty = itemQuantity if maxQty == itemQuantity: errmsg = localization.GetByLabel('UI/Common/NoMoreUnits') else: errmsg = localization.GetByLabel('UI/Common/NoRoomForMore') ret = uix.QtyPopup(int(maxQty), 0, int(maxQty), errmsg) else: ret = uix.QtyPopup( itemQuantity, 1, 1, None, localization.GetByLabel( 'UI/Inventory/ItemActions/DivideItemStack')) if item.locationID != session.stationid2: if not sm.GetService('invCache').IsInventoryPrimedAndListed( item.locationID): log.LogError('Item disappeared before we could add it', item) return if ret is not None: return ret['qty']
def RemoveCommodity(self, selected): toMove = {} if len(selected) == 1 and uicore.uilib.Key(uiconst.VK_SHIFT): typeID = selected[0].typeID typeName = cfg.invtypes.Get(typeID).name ret = uix.QtyPopup( self.transferContents[typeID], 1, 1, None, localization.GetByLabel('UI/PI/Common/QuantityToRemove', typeName=typeName)) if ret and 'qty' in ret: toMove[typeID] = min(self.transferContents[typeID], max(1, ret['qty'])) else: for entry in selected: toMove[entry.typeID] = self.transferContents[entry.typeID] for typeID, qty in toMove.iteritems(): self.transferContents[typeID] -= qty if self.transferContents[typeID] <= 0: del self.transferContents[typeID] if typeID not in self.pinContents: self.pinContents[typeID] = 0 self.pinContents[typeID] += qty self.RefreshLists()
def AddCommodity(self, selected): toMove = {} if len(selected) == 1 and uicore.uilib.Key(uiconst.VK_SHIFT): typeID = selected[0].typeID typeName = cfg.invtypes.Get(typeID).name ret = uix.QtyPopup( self.pinContents[typeID], 1, 1, None, localization.GetByLabel('UI/PI/Common/QuantityToTransfer', typeName=typeName)) if ret and 'qty' in ret: toMove[typeID] = min(self.pinContents[typeID], max(1, ret['qty'])) else: for entry in selected: toMove[entry.typeID] = self.pinContents[entry.typeID] if self.destPin.IsConsumer(): toMove = self._ApplyConsumerFilter(toMove) if not toMove: raise UserError('ConsumerCantAcceptCommodities') elif self.destPin.IsStorage(): toMove = self._ApplyMaxAmountFilter(toMove) for typeID, qty in toMove.iteritems(): self.pinContents[typeID] -= qty if self.pinContents[typeID] <= 0: del self.pinContents[typeID] if typeID not in self.transferContents: self.transferContents[typeID] = 0 self.transferContents[typeID] += qty self.RefreshLists()
def SetDefaultDist(key): if not key: return minDist, maxDist = {'Orbit': (500, 1000000), 'KeepAtRange': (50, 1000000), 'WarpTo': (const.minWarpEndDistance, const.maxWarpEndDistance)}.get(key, (500, 1000000)) current = sm.GetService('menu').GetDefaultActionDistance(key) current = current or '' fromDist = util.FmtAmt(minDist) toDist = util.FmtAmt(maxDist) if key == 'KeepAtRange': hint = localization.GetByLabel('UI/Inflight/SetDefaultKeepAtRangeDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultKeepAtRangeDistance') elif key == 'Orbit': hint = localization.GetByLabel('UI/Inflight/SetDefaultOrbitDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultOrbitDistance') elif key == 'WarpTo': hint = localization.GetByLabel('UI/Inflight/SetDefaultWarpWithinDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultWarpWithinDistance') else: hint = '' caption = '' r = uix.QtyPopup(maxvalue=maxDist, minvalue=minDist, setvalue=current, hint=hint, caption=caption, label=None, digits=0) if r: newRange = max(minDist, min(maxDist, r['qty'])) defaultRangeUtils.UpdateRangeSetting(key, newRange)
def DeliverToCorpHangarFolder(invItemAndFlagList, invCacheSvc): if len(invItemAndFlagList) == 0: return invItems = [] itemIDs = [] for item in invItemAndFlagList: invItems.append(item[0]) itemIDs.append(item[0].itemID) CheckItemsInSamePlace(invItems) fromID = invItems[0].locationID doSplit = bool( uicore.uilib.Key(uiconst.VK_SHIFT) and len(invItemAndFlagList) == 1 and invItemAndFlagList[0][0].stacksize > 1) stationID = invCacheSvc.GetStationIDOfItem(invItems[0]) if stationID is None: raise UserError('CanOnlyDoInStations') ownerID = invItems[0].ownerID flag = invItems[0].flagID deliverToFlag = invItemAndFlagList[0][1] qty = None if doSplit: invItem = invItems[0] ret = uix.QtyPopup( invItem.stacksize, 1, 1, None, localization.GetByLabel( 'UI/Inventory/ItemActions/DivideItemStack')) if ret is not None: qty = ret['qty'] invCacheSvc.GetInventoryMgr().DeliverToCorpHangar(fromID, stationID, itemIDs, qty, ownerID, deliverToFlag) InvalidateItemLocation(ownerID, stationID, flag, invCacheSvc) if ownerID == session.corpid: sm.ScatterEvent('OnCorpAssetChange', invItems, stationID)
def CommoditiesToTransfer(self, commodities, toSpaceport = False): """ Returns a dictionary of the items and quanities we wish to transfer from a drag and drop. Checks for shift drag and adjusts quantities. Raises an exception if the commodities won't fit in the destination. """ toMove = {} for item in commodities: toMove[item.itemID, item.typeID] = util.KeyVal(name=cfg.invtypes.Get(item.typeID).name, itemID=item.itemID, typeID=item.typeID, quantity=item.quantity, item=getattr(item, 'item', item)) if len(commodities) == 1: if toSpaceport: available = self.GetSpaceportCapacityAvailable() required = self.GetCommodityVolume(toMove, self.exportContents) else: available = self.GetCustomsCapacityAvailable() required = self.GetCommodityVolume(toMove, self.importContents) if required > 0 and uicore.uilib.Key(uiconst.VK_SHIFT) or required - available > 1e-05: selectedItem = commodities[0] itemID = selectedItem.itemID typeID = selectedItem.typeID typeName = cfg.invtypes.Get(typeID).name availableQuantity = min(selectedItem.quantity, int(available / required * selectedItem.quantity)) if availableQuantity > 0: ret = uix.QtyPopup(availableQuantity, 1, availableQuantity, None, localization.GetByLabel('UI/PI/Common/QuantityToTransfer', typeName=typeName)) if ret and 'qty' in ret: toMove[itemID, typeID].quantity = min(availableQuantity, max(1, ret['qty'])) else: toMove = {} if toSpaceport: self.CheckAvailableSpaceInSpaceport(toMove) else: self.CheckAvailableSpaceInCustoms(toMove) return toMove
def GetDefaultDist(key, itemID = None, minDist = 500, maxDist = 1000000): drange = sm.GetService('menu').GetDefaultActionDistance(key) if drange is None: dist = '' if itemID: bp = sm.StartService('michelle').GetBallpark() if not bp: return ball = bp.GetBall(itemID) if not ball: return dist = long(max(minDist, min(maxDist, ball.surfaceDist))) fromDist = util.FmtAmt(minDist) toDist = util.FmtAmt(maxDist) if key == 'KeepAtRange': hint = localization.GetByLabel('UI/Inflight/SetDefaultKeepAtRangeDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultKeepAtRangeDistance') elif key == 'Orbit': hint = localization.GetByLabel('UI/Inflight/SetDefaultOrbitDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultOrbitDistance') elif key == 'WarpTo': hint = localization.GetByLabel('UI/Inflight/SetDefaultWarpWithinDistanceHint', fromDist=fromDist, toDist=toDist) caption = localization.GetByLabel('UI/Inflight/SetDefaultWarpWithinDistance') else: hint = '' caption = '' r = uix.QtyPopup(maxvalue=maxDist, minvalue=minDist, setvalue=dist, hint=hint, caption=caption, label=None, digits=0) if r: newRange = max(minDist, min(maxDist, r['qty'])) defaultRangeUtils.UpdateRangeSetting(key, newRange) else: return return drange
def RepairItems(self, items): totalcost = 0 hasModule = False for item in items: damage = math.ceil(item.damage) totalcost = totalcost + math.ceil( item.damage) * item.costToRepairOneUnitOfDamage categoryID = evetypes.GetCategoryIDByGroup(item.groupID) if IsFittingModule(categoryID): hasModule = True btnSetup = { self.sr.selBtn: uiconst.UI_HIDDEN, self.sr.pickBtn: uiconst.UI_NORMAL } if hasModule: if eve.Message('RepairNonPartialConfirmation', {'isk': util.FmtISK(totalcost)}, uiconst.YESNO) != uiconst.ID_YES: amount = None else: amount = {'qty': totalcost} else: amount = uix.QtyPopup(totalcost, 0, totalcost, hint=localization.GetByLabel( 'UI/Station/Repair/FullRepair', isk=totalcost), label=localization.GetByLabel( 'UI/Station/Repair/RepairCostLabel'), digits=2) if amount is not None: itemIDs = [] try: for item in items: if self.invCache.IsItemLocked(item.itemID): raise UserError( 'ItemLocked', {'item': evetypes.GetName(item.typeID)}) if not self.invCache.TryLockItem( item.itemID, 'lockUnassemblingItem', {}, 1): raise UserError( 'ItemLocked', {'item': evetypes.GetName(item.typeID)}) itemIDs.append(item.itemID) if len(itemIDs): self.repairSvc.RepairItems(itemIDs, amount['qty']) finally: for itemID in itemIDs: self.invCache.UnlockItem(itemID) sm.ScatterEvent('OnRepairDone', itemIDs) uthread.new(self.DisplayRepairQuote, self.GetAll()) else: btnSetup[self.sr.repairAllBtn] = uiconst.UI_NORMAL self.DisplayButtons(btnSetup)
def SetOrigin(self, *args): ret = uix.QtyPopup(caption='Arena Origin', label='itemID of the origin') if ret: self.originID = int(ret['qty']) if self.originID == 0: self.originID = None self.svc.Setup(self.originID) self.UpdateOriginText(self.originID)
def MultiMerge(self, data, mergeSourceID): if not self.CheckAndConfirmOneWayMove(): return ret = None try: dataReduced = [] for d in data: dataReduced.append((d[0], d[1], d[2])) self._GetInvCacheContainer().MultiMerge(dataReduced, mergeSourceID) return True except UserError as what: if len(data) == 1 and what.args[0] in ( 'NotEnoughCargoSpace', 'NotEnoughCargoSpaceOverload', 'NotEnoughDroneBaySpace', 'NotEnoughDroneBaySpaceOverload', 'NoSpaceForThat', 'NoSpaceForThatOverload', 'NotEnoughChargeSpace'): cap = self.GetCapacity() free = cap.capacity - cap.used if free < 0: raise item = data[0][3] if item.typeID == const.typePlasticWrap: volume = sm.GetService('invCache').GetInventoryFromId( item.itemID).GetCapacity().used else: volume = cfg.GetItemVolume(item, 1) maxQty = min(item.stacksize, int(free / (volume or 1))) if maxQty <= 0: if volume < 0.01: req = 0.01 else: req = volume eve.Message('NotEnoughCargoSpaceFor1Unit', { 'type': item.typeID, 'free': free, 'required': req }) return if self._DBLessLimitationsCheck(what.args[0], item): return if maxQty == item.stacksize: errmsg = localization.GetByLabel('UI/Common/NoMoreUnits') else: errmsg = localization.GetByLabel('UI/Common/NoRoomForMore') ret = uix.QtyPopup(int(maxQty), 0, int(maxQty), errmsg) if ret is None: quantity = None else: quantity = ret['qty'] if quantity: self._GetInvCacheContainer().MultiMerge( [(data[0][0], data[0][1], quantity)], mergeSourceID) return True else: raise sys.exc_clear()
def AssembleMany(self, amount = None): self.NoPodCheck(wantNewShip=True) if amount is None: result = uix.QtyPopup(maxvalue=50, minvalue=1, caption='Mass Manufacture', label='', hint='Specify amount of ships to assemble (Max. 50).<br>Note: this function cannot be aborted once running.') if result: amount = result['qty'] else: amount = 0 for x in xrange(amount): self.Assemble()
def SplitStack(self): maxQty = self.sr.node.quantity msg = localization.GetByLabel('UI/Common/HowManyItems') ret = uix.QtyPopup(int(maxQty), 1, 1, msg) if ret: sm.GetService('contracts').SplitStack(self.sr.node.stationID, self.sr.node.itemID, ret['qty'], self.sr.node.forCorp, self.sr.node.flag)
def FitDrone(self, drone): if uicore.uilib.Key(uiconst.VK_SHIFT): result = uix.QtyPopup(maxvalue=100, minvalue=1, caption=drone.name, label=u'Quantity', hint='') if result: qty = result['qty'] else: return else: qty = 1 sm.RemoteSvc('slash').SlashCmd('/fit me %d %d' % (drone.typeID, qty))
def SetDogmaAttribute(itemID, attrName, actualValue): ret = uix.QtyPopup(None, None, actualValue, 'Set Dogma Attribute for <b>%s</b>' % attrName, 'Set Dogma Attribute', digits=5) if ret: cmd = '/dogma %s %s = %s' % (itemID, attrName, ret['qty']) SlashCmd(cmd)
def MassSpawnFitting(self, ownerID, fitting): quantity = uix.QtyPopup( maxvalue=50, minvalue=1, caption='Mass Spawn Fitting', label='', hint= 'Specify amount of ships to spawn (Max. 50).<br>Note: this function cannot be aborted once running.' ) self.SpawnFitting(ownerID, fitting, quantity['qty'])
def OnGiveShares(self, *args): ret = uix.QtyPopup( 2147483647, 1, '1', localization.GetByLabel( 'UI/Corporations/EditMemberDialog/HowManySharesToGive', player=self.charID), localization.GetByLabel( 'UI/Corporations/EditMemberDialog/GiveShares')) if ret is not None: amount = ret['qty'] self.corp.MoveCompanyShares(eve.session.corpid, self.charID, amount)
def SetDogmaAttribute(itemID, attrName, actualValue): """ Shortcut popup for setting dogma attributes for programmers """ ret = uix.QtyPopup(None, None, actualValue, 'Set Dogma Attribute for <b>%s</b>' % attrName, 'Set Dogma Attribute', digits=5) if ret: cmd = '/dogma %s %s = %s' % (itemID, attrName, ret['qty']) SlashCmd(cmd)
def UseFreeSkillPoints(self, skillTypeID, diff): if sm.StartService('skills').SkillInTraining(): eve.Message('CannotApplyFreePointsWhileQueueActive') return freeSkillPoints = sm.StartService('skills').GetFreeSkillPoints() text = localization.GetByLabel('UI/SkillQueue/AddSkillMenu/UseSkillPointsWindow', skill=skillTypeID, skillPoints=int(diff)) caption = localization.GetByLabel('UI/SkillQueue/AddSkillMenu/ApplySkillPoints') ret = uix.QtyPopup(maxvalue=freeSkillPoints, caption=caption, label=text) if ret is None: return sp = int(ret.get('qty', '')) currentSkillPoints = sm.GetService('skills').GetSkillPoints() sm.StartService('skills').ApplyFreeSkillPoints(skillTypeID, sp)
def _load(listOftypeIDs, what='/load', qty=1, maxValue=2147483647): if uicore.uilib.Key(uiconst.VK_SHIFT): result = uix.QtyPopup(maxvalue=maxValue, minvalue=1, caption=what, label=u'Quantity', hint='') if result: qty = result['qty'] else: return for typeID in listOftypeIDs: sm.StartService('slash').SlashCmd('/load me %d %d' % (typeID, qty))
def DropLoadChargeToModule(self, itemID, chargeTypeID, chargeItems, qty = None, preferSingletons = False): if uicore.uilib.Key(uiconst.VK_SHIFT): maxQty = 0 for item in chargeItems: if item.typeID != chargeTypeID: continue maxQty += item.stacksize if maxQty == 0: errmsg = localization.GetByLabel('UI/Common/NoMoreUnits') else: errmsg = localization.GetByLabel('UI/Common/NoRoomForMore') qty = None ret = uix.QtyPopup(int(maxQty), 0, int(maxQty), errmsg) if ret is not None: qty = ret['qty'] if qty <= 0: return self.LoadChargeToModule(itemID, chargeTypeID, chargeItems=chargeItems, qty=qty, preferSingletons=preferSingletons)
def CommoditiesToTransfer(self, commodities, toSpaceport=False): toMove = {} for item in commodities: toMove[item.itemID, item.typeID] = util.KeyVal( name=evetypes.GetName(item.typeID), itemID=item.itemID, typeID=item.typeID, quantity=item.quantity, item=getattr(item, 'item', item)) if len(commodities) == 1: if toSpaceport: available = self.GetSpaceportCapacityAvailable() required = self.GetCommodityVolume(toMove, self.exportContents) else: available = self.GetCustomsCapacityAvailable() required = self.GetCommodityVolume(toMove, self.importContents) if required > 0 and uicore.uilib.Key( uiconst.VK_SHIFT) or required - available > 1e-05: selectedItem = commodities[0] itemID = selectedItem.itemID typeID = selectedItem.typeID typeName = evetypes.GetName(typeID) availableQuantity = min( selectedItem.quantity, int(available / required * selectedItem.quantity)) if availableQuantity > 0: ret = uix.QtyPopup( availableQuantity, 1, availableQuantity, None, localization.GetByLabel( 'UI/PI/Common/QuantityToTransfer', typeName=typeName)) if ret and 'qty' in ret: toMove[itemID, typeID].quantity = min(availableQuantity, max(1, ret['qty'])) else: toMove = {} if toSpaceport: self.CheckAvailableSpaceInSpaceport(toMove) else: self.CheckAvailableSpaceInCustoms(toMove) return toMove
def SplitStack(invItems, invCacheSvc): if len(invItems) != 1: raise UserError('CannotPerformOnMultipleItems') invItem = invItems[0] ret = uix.QtyPopup( invItem.stacksize, 1, 1, None, localization.GetByLabel('UI/Inventory/ItemActions/DivideItemStack')) if ret is not None: qty = ret['qty'] stationID = invCacheSvc.GetStationIDOfItem(invItem) if stationID is None: raise UserError('CanOnlyDoInStations') flag = invItem.flagID invCacheSvc.GetInventoryMgr().SplitStack(stationID, invItem.itemID, qty, invItem.ownerID) InvalidateItemLocation(invItem.ownerID, stationID, flag, invCacheSvc) if invItem.ownerID == session.corpid: invItem.quantity = invItem.quantity - qty sm.ScatterEvent('OnCorpAssetChange', [invItem], stationID)
def DeliverToCorpMember(invItems, invCacheSvc): if len(invItems) == 0: return CheckItemsInSamePlace(invItems) corpMemberIDs = sm.GetService('corp').GetMemberIDs() cfg.eveowners.Prime(corpMemberIDs) memberslist = [] for memberID in corpMemberIDs: if util.IsDustCharacter(memberID): continue who = cfg.eveowners.Get(memberID) memberslist.append([who.ownerName, memberID, who.typeID]) doSplit = uicore.uilib.Key( uiconst.VK_SHIFT) and len(invItems) == 1 and invItems[0].stacksize > 1 stationID = invCacheSvc.GetStationIDOfItem(invItems[0]) if stationID is None: raise UserError('CanOnlyDoInStations') ownerID = invItems[0].ownerID flagID = invItems[0].flagID itemIDs = [item.itemID for item in invItems] res = uix.ListWnd( memberslist, 'character', localization.GetByLabel('UI/Corporations/Common/SelectCorpMember'), localization.GetByLabel( 'UI/Corporations/Common/SelectCorpMemberToDeliverTo'), 1) if res: corporationMemberID = res[1] qty = None if doSplit: invItem = invItems[0] ret = uix.QtyPopup( invItem.stacksize, 1, 1, None, localization.GetByLabel( 'UI/Inventory/ItemActions/DivideItemStack')) if ret is not None: qty = ret['qty'] invCacheSvc.GetInventoryMgr().DeliverToCorpMember( corporationMemberID, stationID, itemIDs, qty, ownerID, flagID) InvalidateItemLocation(ownerID, stationID, flagID, invCacheSvc) if ownerID == session.corpid: sm.ScatterEvent('OnCorpAssetChange', invItems, stationID)
def UseFreeSkillPoints(self, skillTypeID, diff): inTraining = self.SkillInTraining() if inTraining is not None and inTraining.typeID == skillTypeID: eve.Message('CannotApplyFreePointsWhileTrainingSkill') return freeSkillPoints = sm.StartService('skills').GetFreeSkillPoints() text = localization.GetByLabel( 'UI/SkillQueue/AddSkillMenu/UseSkillPointsWindow', skill=skillTypeID, skillPoints=int(diff)) caption = localization.GetByLabel( 'UI/SkillQueue/AddSkillMenu/ApplySkillPoints') ret = uix.QtyPopup(maxvalue=freeSkillPoints, caption=caption, label=text) if ret is None: return sp = int(ret.get('qty', '')) sm.StartService('skills').ApplyFreeSkillPoints(skillTypeID, sp) sm.GetService('audio').SendUIEvent('st_allocate_skillpoints_play')
def Damage(self, items, *args): btnSetup = { self.sr.selBtn: uiconst.UI_HIDDEN, self.sr.pickBtn: uiconst.UI_DISABLED } temp = uix.QtyPopup( 100, 1, 50, hint=localization.GetByLabel('UI/Station/Repair/ApplyDamage')) percentage = temp and temp['qty'] if percentage == 0 or percentage is None: self.sr.pickBtn.state = uiconst.UI_NORMAL return itemIDAndAmountOfDamageList = [] try: for item in items: if self.invCache.IsItemLocked(item.itemID): continue if not self.invCache.TryLockItem(item.itemID, 'lockRepairingItem', {}, 1): continue amount = int( math.ceil( float(percentage) / 100.0 * float(item.maxHealth - item.damage))) itemIDAndAmountOfDamageList.append((item.itemID, amount)) if len(itemIDAndAmountOfDamageList): self.repairSvc.DamageModules(itemIDAndAmountOfDamageList) finally: for itemID, amount in itemIDAndAmountOfDamageList: self.invCache.UnlockItem(itemID) uthread.new(self.DisplayRepairQuote, self.GetAll()) btnSetup[self.sr.pickBtn] = uiconst.UI_NORMAL self.DisplayButtons(btnSetup)
def OnClickOfferMoney(self, *etc): self.tradeSession.ToggleAccept(False) ret = uix.QtyPopup(sm.GetService('wallet').GetWealth(), 0, 0, digits=2) if ret is not None and self is not None and not self.destroyed: self.tradeSession.OfferMoney(ret['qty'])
def GMAddCommodity(self, pinID, typeID): quantity = uix.QtyPopup(None, 1, 100).get('qty', None) if not quantity: return self.remoteHandler.GMAddCommodity(pinID, typeID, quantity)
def OnDropData(self, dragObj, nodes): if self.blinkBG: uicore.animations.FadeOut(self.blinkBG, duration=0.2) if len(nodes) and getattr(nodes[0], 'scroll', None): nodes[0].scroll.ClearSelection() if not nodes[0].rec: return if not hasattr(nodes[0].rec, 'locationID'): return locationID = nodes[0].rec.locationID if locationID != self.rec.locationID: if not sm.GetService('crimewatchSvc').CheckCanTakeItems( locationID): sm.GetService('crimewatchSvc').SafetyActivated( const.shipSafetyLevelPartial) return if self.isShip: if invCtrl.ShipCargo(self.rec.itemID).OnDropData(nodes): self.Blink() return if self.isContainer: if invCtrl.StationContainer(self.rec.itemID).OnDropData(nodes): self.Blink() return mergeToMe = [] notUsed = [] sourceID = None for node in nodes: if getattr(node, '__guid__', None) not in ('xtriui.ShipUIModule', 'xtriui.InvItem', 'listentry.InvItem'): notUsed.append(node) continue if node.item.itemID == self.sr.node.item.itemID: notUsed.append(node) continue if node.item.typeID == self.sr.node.item.typeID and not isinstance( self.sr.node.item.itemID, tuple) and not getattr( node.item, 'singleton', False) and not self.sr.node.item.singleton: mergeToMe.append(node.item) else: notUsed.append(node) if sourceID is None: sourceID = node.rec.locationID if sourceID is None: log.LogInfo('OnDropData: Moot operation with ', nodes) return if mergeToMe: containerItem = sm.GetService('invCache').GetInventoryFromId( self.rec.locationID).GetItem() if session.solarsystemid and containerItem.itemID == mergeToMe[ 0].locationID and containerItem.ownerID not in ( session.charid, session.corpid, session.allianceid): return shift = uicore.uilib.Key(uiconst.VK_SHIFT) mergeData = [] stateMgr = sm.StartService('godma').GetStateManager() dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation() singletons = [] for invItem in mergeToMe: if invItem.stacksize == 1: quantity = 1 elif shift: ret = uix.QtyPopup( invItem.stacksize, 1, 1, None, localization.GetByLabel( 'UI/Inventory/ItemActions/StackItems')) if ret is not None: quantity = ret['qty'] else: quantity = None else: quantity = invItem.stacksize if not quantity: continue if invItem.categoryID == const.categoryCharge and IsShipFittingFlag( invItem.flagID): if type(invItem.itemID) is tuple: flag = invItem.itemID[1] chargeIDs = dogmaLocation.GetSubLocationsInBank( invItem.locationID, invItem.itemID) if chargeIDs: for chargeID in chargeIDs: charge = dogmaLocation.dogmaItems[chargeID] mergeData.append( (charge.itemID, self.rec.itemID, dogmaLocation.GetAttributeValue( chargeID, const.attributeQuantity), charge)) else: mergeData.append((invItem.itemID, self.rec.itemID, quantity, invItem)) else: crystalIDs = dogmaLocation.GetCrystalsInBank( invItem.locationID, invItem.itemID) if crystalIDs: for crystalID in crystalIDs: crystal = dogmaLocation.GetItem(crystalID) if crystal.singleton: singletons.append(crystalID) else: mergeData.append( (crystal.itemID, self.rec.itemID, crystal.stacksize, crystal)) else: mergeData.append((invItem.itemID, self.rec.itemID, quantity, invItem)) else: mergeData.append( (invItem.itemID, self.rec.itemID, quantity, invItem)) if singletons and util.GetAttrs(self, 'sr', 'node', 'rec', 'flagID'): flag = self.sr.node.rec.flagID inv = sm.GetService('invCache').GetInventoryFromId( self.rec.locationID) if inv: inv.MultiAdd(singletons, sourceID, flag=flag, fromManyFlags=True) if mergeData and util.GetAttrs(self, 'sr', 'node', 'container', 'invController', 'MultiMerge'): invController = self.sr.node.container.invController sm.ScatterEvent('OnInvContDragExit', invController.GetInvID(), []) if invController.MultiMerge(mergeData, sourceID): sm.GetService('audio').SendUIEvent('ui_state_stack') self.Blink() if notUsed and util.GetAttrs(self, 'sr', 'node', 'container', 'OnDropData'): self.sr.node.container.OnDropData(dragObj, notUsed)