pvptradewnd.py (12672B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\station\pvptrade\pvptradewnd.py 2 import carbonui.const as uiconst 3 import eveformat 4 import eveicon 5 import evetypes 6 import localization 7 import uthread 8 from carbonui.control.dragResizeCont import DragResizeCont 9 from carbonui import TextColor 10 from carbonui.primitives.container import Container 11 from carbonui.primitives.sprite import Sprite 12 from carbonui.uicore import uicore 13 from eve.client.script.ui import eveColor 14 from eve.client.script.environment import invControllers as invCtrl 15 from eve.client.script.ui.control import primaryButton 16 from carbonui.control.button import Button 17 from carbonui.button.group import ButtonGroup, ButtonSizeMode 18 from eve.client.script.ui.control.eveLabel import EveLabelLarge, EveLabelMedium 19 from carbonui.control.window import Window 20 from eve.client.script.ui.shared.container import _InvContBase, InvContViewBtns 21 from eve.client.script.ui.shared.tooltip.item import InventoryItemTooltip 22 from eve.client.script.ui.util import uix 23 from eve.common.lib import appConst 24 from eveexceptions import UserError 25 from inventorycommon.const import VIEWMODE_DETAILS, VIEWMODE_LIST, VIEWMODE_ICONS 26 from localization import GetByLabel 27 from menucheckers import ItemChecker 28 from player_messaging.client.ui_message import prompt_player_fsd_dialog 29 from utillib import KeyVal 30 31 class PVPTrade(Window): 32 __guid__ = 'form.PVPTrade' 33 default_minSize = (300, 410) 34 default_width = 460 35 default_height = 500 36 default_scope = uiconst.SCOPE_DOCKED 37 38 def ApplyAttributes(self, attributes): 39 super(PVPTrade, self).ApplyAttributes(attributes) 40 self.tradeSession = attributes.tradeSession 41 tradeItems = attributes.tradeItems 42 buttonParent = ButtonGroup(name='buttonParent', parent=self.content, align=uiconst.TOBOTTOM, padTop=16, button_size_mode=ButtonSizeMode.STRETCH) 43 acceptBtn = primaryButton.PrimaryButton(parent=buttonParent, label=localization.GetByLabel('UI/PVPTrade/Accept'), func=self.OnClickAccept) 44 self.acceptBtnController = acceptBtn.controller 45 Button(parent=buttonParent, label=localization.GetByLabel('UI/Common/Buttons/Cancel'), func=self.Cancel) 46 sessionData = self.tradeSession.List() 47 herID = sessionData.traders[not sessionData.traders.index(session.charid)] 48 self.sr.herinfo = cfg.eveowners.Get(herID) 49 mainCont = Container(name='mainCont', parent=self.sr.main) 50 myCont = DragResizeCont(parent=mainCont, align=uiconst.TOTOP_PROP, defaultSize=0.5, minSize=0.35, maxSize=0.65, settingsID='PVPtradeResizeCont', show_line=True) 51 herCont = Container(parent=mainCont, align=uiconst.TOALL) 52 self.sr.my = my = PlayerTrade(name='InventoryContainer_myTrade', parent=myCont, align=uiconst.TOALL, itemID=sessionData.tradeContainerID, ownerID=session.charid, tradeSession=self.tradeSession, state=uiconst.UI_PICKCHILDREN, tradeItems=tradeItems, tradeWindow=self) 53 self.sr.myAccept = my.acceptIcon 54 self.sr.myMoney = my.moneyLabel 55 self.sr.myMoney.amount = 0 56 self.sr.her = her = PlayerTrade(name='InventoryContainer_herTrade', parent=herCont, align=uiconst.TOALL, itemID=sessionData.tradeContainerID, ownerID=herID, tradeSession=self.tradeSession, state=uiconst.UI_PICKCHILDREN, tradeWindow=self) 57 self.sr.herAccept = her.acceptIcon 58 self.sr.herMoney = her.moneyLabel 59 self.sr.herMoney.amount = 0 60 self.sr.her.invController.OnDropData = self.sr.my.invController.OnDropData 61 Button(name='OfferMoneyButton', parent=my.topCont, label=localization.GetByLabel('UI/PVPTrade/OfferMoney'), func=self.OnClickOfferMoney, args=None, idx=0, align=uiconst.TOPRIGHT) 62 self.sr.myIx = sessionData.traders.index(session.charid) 63 self.sr.herIx = sessionData.traders.index(herID) 64 self.OnMoneyOffer([0, 0]) 65 self.SetCaption(self.GetWindowCaptionText()) 66 67 def _OnClose(self, *args): 68 if self and getattr(self, 'sr', None): 69 if self.sr.my: 70 self.sr.my.Close() 71 if self.sr.her: 72 self.sr.her.Close() 73 try: 74 self.tradeSession.Abort() 75 except AttributeError: 76 pass 77 78 def Cancel(self, *etc): 79 if self.tradeSession and prompt_player_fsd_dialog('ConfirmCancelTrade', {}, uiconst.OKCANCEL) == uiconst.ID_OK: 80 if self and not self.destroyed and hasattr(self, 'sr'): 81 tmp = self.tradeSession 82 self.tradeSession = None 83 tmp.Abort() 84 else: 85 prompt_player_fsd_dialog('TradeNotCanceled') 86 87 CloseByUser = Cancel 88 89 def OnClickAccept(self, *etc): 90 myItems = filter(None, self.sr.my.items) 91 herItems = filter(None, self.sr.her.items) 92 self.acceptBtnController.is_enabled = False 93 moneys = [self.sr.myMoney.amount] 94 moneys.insert(self.sr.herIx, self.sr.herMoney.amount) 95 manifest = KeyVal(tradeContainerID=self.sr.my.itemID, money=moneys, tradeItems=set(myItems) | set(herItems)) 96 shipsAreCool = False 97 for i in manifest.tradeItems: 98 if evetypes.GetCategoryIDByGroup(i.groupID) == appConst.categoryShip: 99 if i.ownerID != session.charid and not shipsAreCool: 100 if prompt_player_fsd_dialog('TradeShipWarning', {}, uiconst.OKCANCEL) != uiconst.ID_OK: 101 return self.OnTradeOfferReset() 102 shipsAreCool = True 103 104 try: 105 self.tradeSession.MakeOffer(manifest) 106 except UserError: 107 self.OnTradeOfferReset() 108 raise 109 except AttributeError: 110 self.OnCancel() 111 112 def GetWindowCaptionText(self): 113 return localization.GetByLabel('UI/PVPTrade/TradeWith', otherParty=self.sr.herinfo.id) 114 115 def OnTradeOfferReset(self): 116 self.sr.myAccept.display = False 117 self.sr.herAccept.display = False 118 self.acceptBtnController.is_enabled = True 119 120 def OnStateToggle(self, states): 121 myDisplayState = bool(states[self.sr.myIx]) 122 self.sr.myAccept.display = myDisplayState 123 herDisplayState = bool(states[self.sr.herIx]) 124 self.sr.herAccept.display = herDisplayState 125 if myDisplayState: 126 self.acceptBtnController.is_enabled = False 127 else: 128 self.acceptBtnController.is_enabled = True 129 if states[0] and states[1]: 130 self.sr.my.invReady = 0 131 self.sr.her.invReady = 0 132 self.Close() 133 134 def OnMoneyOffer(self, money): 135 self.acceptBtnController.is_enabled = True 136 myMoney = eveformat.isk(money[self.sr.myIx]) 137 if money[self.sr.myIx] > 0: 138 myMoney = eveformat.color(myMoney, color=TextColor.DANGER) 139 else: 140 myMoney = eveformat.color(myMoney, color=TextColor.SECONDARY) 141 herMoney = eveformat.isk(money[self.sr.herIx]) 142 if money[self.sr.herIx] > 0: 143 herMoney = eveformat.color(herMoney, color=TextColor.SUCCESS) 144 else: 145 herMoney = eveformat.color(herMoney, color=TextColor.SECONDARY) 146 self.sr.myMoney.text = localization.GetByLabel('UI/PVPTrade/MyCharacterOffers', formattedAmount=myMoney) 147 self.sr.myMoney.amount = money[self.sr.myIx] 148 self.sr.herMoney.text = localization.GetByLabel('UI/PVPTrade/OtherCharacterOffers', formattedAmount=herMoney) 149 self.sr.herMoney.amount = money[self.sr.herIx] 150 self.OnStateToggle([0, 0]) 151 152 def OnClickOfferMoney(self, *etc): 153 ret = uix.QtyPopup(sm.GetService('wallet').GetWealth(), self.sr.myMoney.amount, 100, digits=2) 154 if ret is not None and self is not None and not self.destroyed: 155 self.tradeSession.OfferMoney(ret['qty']) 156 157 def OnTradeComplete(self, items): 158 prompt_player_fsd_dialog('TradeComplete', {'name': self.sr.herinfo.name}) 159 self.sr.my.invReady = 0 160 self.sr.her.invReady = 0 161 self.Close() 162 163 def OnCancel(self): 164 prompt_player_fsd_dialog('TradeCancel', {'name': self.sr.herinfo.name}) 165 self.sr.my.invReady = 0 166 self.sr.her.invReady = 0 167 self.tradeSession = None 168 self.Close() 169 170 171 class PlayerTrade(_InvContBase): 172 __guid__ = 'invCont.PlayerTrade' 173 __invControllerClass__ = invCtrl.PlayerTrade 174 default_containerViewMode = VIEWMODE_DETAILS 175 176 def ApplyAttributes(self, attributes): 177 _InvContBase.ApplyAttributes(self, attributes) 178 tradeItems = attributes.tradeItems 179 ownerID = attributes.ownerID 180 ownerName = cfg.eveowners.Get(ownerID).name 181 self.tradeWindow = attributes.tradeWindow 182 self.topCont = Container(parent=self, align=uiconst.TOTOP, height=64, idx=0, padBottom=8) 183 myImgCont = Sprite(parent=self.topCont, align=uiconst.TOLEFT, width=64, idx=0, texturePath='res:/UI/Texture/silhouette_64.png') 184 sm.GetService('photo').GetPortrait(ownerID, 64, myImgCont) 185 myImgCont.OnClick = (self.ShowCharInfo, ownerID) 186 myImgCont.hint = ownerName 187 ownerLink = GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=ownerName, info=('showinfo', appConst.typeCharacter, ownerID)) 188 EveLabelLarge(text=ownerLink, parent=self.topCont, left=72, state=uiconst.UI_NORMAL) 189 self.acceptIcon = Sprite(parent=self.topCont, align=uiconst.TOPLEFT, left=72, top=24, width=16, height=16, state=uiconst.UI_NORMAL, texturePath=eveicon.checkmark, hint=GetByLabel('UI/PVPTrade/AcceptedHint', name=ownerName), color=eveColor.SUCCESS_GREEN) 190 InvContViewBtns(parent=self.topCont, align=uiconst.BOTTOMRIGHT, controller=self) 191 self.moneyLabel = EveLabelMedium(parent=self.topCont, left=72, align=uiconst.BOTTOMLEFT) 192 hiddenHeaders = uix.GetInvItemDefaultHiddenHeaders() 193 hiddenHeaders += [localization.GetByLabel('UI/Inventory/ItemSize'), 194 localization.GetByLabel('UI/Inventory/ItemSlot'), 195 localization.GetByLabel('UI/Inventory/ItemVolume'), 196 localization.GetByLabel('UI/Contracts/ContractsWindow/EstPrice')] 197 self.scroll.SetColumnsHiddenByDefault(hiddenHeaders) 198 if tradeItems: 199 uthread.new(self.AddStartingItems, tradeItems) 200 201 def AddStartingItems(self, tradeItems): 202 self.invController.OnDropData(tradeItems) 203 204 def AddItem(self, rec, index = None, fromWhere = None): 205 if self.IsItemPresent(rec.itemID): 206 return 207 self.tradeWindow.OnTradeOfferReset() 208 super(PlayerTrade, self).AddItem(rec, index, fromWhere) 209 210 def _GetInvController(self, attributes): 211 return self.__invControllerClass__(itemID=attributes.itemID, ownerID=attributes.ownerID, tradeSession=attributes.tradeSession) 212 213 def ShowCharInfo(self, ownerID, *args): 214 sm.GetService('info').ShowInfo(appConst.typeCharacter, ownerID) 215 216 def GetItemData(self, rec, scrollID = None): 217 node = _InvContBase.GetItemData(self, rec, scrollID) 218 node.labelFunc = GetItemLabel 219 node.LoadTooltipPanel = LoadTooltipPanelForTrade 220 return node 221 222 223 def LoadTooltipPanelForTrade(tooltipPanel, owner, *args): 224 if uicore.IsDragging(): 225 return 226 node = owner.sr.node 227 rec = node.rec 228 itemChecker = ItemChecker(rec) 229 if itemChecker.IsAlphaSkillInjector() or itemChecker.IsSkillInjector() or itemChecker.IsNonDiminishingInjectionBooster(): 230 return owner.LoadTooltipPanel(tooltipPanel) 231 InventoryItemTradeTooltip(tooltipPanel=tooltipPanel, item=rec) 232 233 234 def GetItemLabel(rec, data, new = 0): 235 if getattr(data, 'label', None) and data.viewMode == VIEWMODE_ICONS and not new: 236 return data.label 237 name = evetypes.GetName(rec.typeID) 238 itemName = uix.GetItemName(rec, data) 239 if name != itemName: 240 name = GetByLabel('UI/PVPTrade/TypeNameAndItemName', typeName=name, itemName=itemName) 241 if data.viewMode in (VIEWMODE_LIST, VIEWMODE_DETAILS): 242 label = uix.GetItemLabelForListOrDetails(rec, data, name) 243 data.label = label 244 else: 245 data.label = '<center>%s' % name 246 return data.label 247 248 249 class InventoryItemTradeTooltip(InventoryItemTooltip): 250 251 def AddName(self): 252 typeName = evetypes.GetName(self.item.typeID) 253 itemName = uix.GetItemName(self.item) 254 text = GetByLabel('UI/PVPTrade/TypeNameWithName', typeName=typeName) 255 self.panel.AddLabelMedium(text=text, colSpan=2) 256 text = GetByLabel('UI/PVPTrade/ItemNameWithName', itemName=itemName) 257 self.panel.AddLabelMedium(text=text, colSpan=2) 258 qtyText = GetByLabel('UI/PVPTrade/QuantityWithQty', qty=self.item.stacksize) 259 self.panel.AddLabelMedium(text=qtyText, colSpan=2)