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

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)