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

lpOfferEntry2.py (10137B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\station\loyaltyPointStore\lpOfferEntry2.py
      2 from sys import maxint
      3 from carbonui import uiconst, TextColor
      4 from carbonui.control.button import Button
      5 from carbonui.control.scrollentries import SE_BaseClassCore
      6 from carbonui.primitives.container import Container
      7 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      8 from carbonui.primitives.transform import Transform
      9 from eve.client.script.ui.control.eveLabel import EveLabelMedium
     10 from eve.client.script.ui.control.infoIcon import InfoIcon
     11 from eve.client.script.ui.station.loyaltyPointStore.lpUtil import GetItemText
     12 from eve.client.script.ui.station.loyaltyPointStore.selectQuantityWnd import SelectQuantityWnd
     13 from eve.client.script.ui.station.lpstoreRequirement import LpRequirement, ISKRequirement, AnalysisKreditsRequirement
     14 from eve.client.script.ui.util.uix import GetTechLevelIcon
     15 from eve.common.script.util.eveFormat import FmtISK, FmtISKAndRound
     16 from eveui import Sprite
     17 from inventorycommon import typeHelpers
     18 from localization import GetByLabel
     19 
     20 class LPOfferEntry2(SE_BaseClassCore):
     21     entryHeight = 88
     22     ColumnWidths = {GetByLabel('UI/LPStore/Reward'): 260,
     23      GetByLabel('UI/LPStore/cost'): 124,
     24      GetByLabel('UI/LPStore/RequiredItems'): 300,
     25      '': 100}
     26     Headers = (GetByLabel('UI/LPStore/Reward'),
     27      GetByLabel('UI/LPStore/cost'),
     28      GetByLabel('UI/LPStore/RequiredItems'),
     29      '')
     30     PER_REQUIRED_ITEM_HEIGHT = 20
     31 
     32     def ApplyAttributes(self, attributes):
     33         super(LPOfferEntry2, self).ApplyAttributes(attributes)
     34         self.lpSvc = sm.GetService('lpstore')
     35         self.node = attributes.node
     36         self.typeID = self.node.typeID
     37         self.iskBalance = self.node.Get('iskBalance')
     38         self.lpBalance = self.node.Get('lpBalance')
     39         self.akBalance = self.node.Get('akBalance')
     40         self.qty = self.node.Get('qty', 1)
     41         self.reqItems = self.node.Get('reqItems', [])
     42         self.lootItems = self.node.Get('lootItems', [])
     43         self.lpOfferRequirementColumns = self.lpSvc.GetRequirements(self.node.corpID)
     44         self.requiredStandings = self.node.Get('requiredStandings', None)
     45         self.allRequirementsMet = True
     46         self.costRequirementLabels = []
     47         self.itemRequirementLabels = []
     48 
     49     def GetMaxPurchaseable(self):
     50         maxQnt = maxint
     51         for requirement in self.reqItems:
     52             typeID, quantityNeeded = requirement
     53             maxQnt = min(int(self.lpSvc.GetInvenoryItemQuantity(typeID) / quantityNeeded), maxQnt)
     54 
     55         for requirement in self.lpOfferRequirementColumns:
     56             amount = self.node[requirement.name]
     57             if amount == 0:
     58                 continue
     59             if requirement.name == LpRequirement.LP_REQUIREMENT_NAME:
     60                 maxQnt = min(int(self.lpBalance / amount), maxQnt)
     61             elif requirement.name == ISKRequirement.ISK_REQUIREMENT_NAME:
     62                 maxQnt = min(int(self.iskBalance / amount), maxQnt)
     63             elif requirement.name == AnalysisKreditsRequirement.AK_REQUIREMENT_NAME:
     64                 maxQnt = min(int(self.akBalance / amount), maxQnt)
     65 
     66         return maxQnt
     67 
     68     def IsCostRequirementMet(self, requirement):
     69         amount = self.node[requirement.name]
     70         if amount == 0:
     71             return True
     72         requirementMet = True
     73         if requirement.name == LpRequirement.LP_REQUIREMENT_NAME:
     74             requirementMet = amount <= self.lpBalance
     75         elif requirement.name == ISKRequirement.ISK_REQUIREMENT_NAME:
     76             requirementMet = amount <= self.iskBalance
     77         elif requirement.name == AnalysisKreditsRequirement.AK_REQUIREMENT_NAME:
     78             requirementMet = amount <= self.akBalance
     79         return requirementMet
     80 
     81     def IsItemRequirementMet(self, requirement):
     82         typeID, quantity = requirement
     83         return self.lpSvc.HaveItem(typeID, quantity)
     84 
     85     def AreAllRequirementsMet(self):
     86         for requirement in self.lpOfferRequirementColumns:
     87             if not self.IsCostRequirementMet(requirement):
     88                 return False
     89 
     90         for requirement in self.reqItems:
     91             if not self.IsItemRequirementMet(requirement):
     92                 return False
     93 
     94         return True
     95 
     96     def OnMouseEnter(self, *args):
     97         super(LPOfferEntry2, self).OnMouseEnter(*args)
     98         for label, requirement in self.itemRequirementLabels:
     99             if not self.IsItemRequirementMet(requirement):
    100                 label.color = TextColor.DANGER
    101 
    102         for label, requirement in self.costRequirementLabels:
    103             if not self.IsCostRequirementMet(requirement):
    104                 label.color = TextColor.DANGER
    105 
    106     def OnMouseExit(self, *args):
    107         super(LPOfferEntry2, self).OnMouseExit(*args)
    108         for label, _requirement in self.itemRequirementLabels:
    109             label.color = TextColor.NORMAL
    110 
    111         for label, _requirement in self.costRequirementLabels:
    112             label.color = TextColor.NORMAL
    113 
    114     def _AddRewardColumn(self):
    115         rewardContWidth = LPOfferEntry2.ColumnWidths[GetByLabel('UI/LPStore/Reward')]
    116         rewardCont = Container(parent=self, name='rewardCont', align=uiconst.TOLEFT, width=rewardContWidth, state=uiconst.UI_PICKCHILDREN)
    117         spriteTransformCont = Container(parent=rewardCont, name='spriteTransformCont', align=uiconst.TOLEFT, width=LPOfferEntry2.entryHeight)
    118         spriteTransform = Transform(parent=spriteTransformCont, name='spriteTransform', align=uiconst.CENTER, width=64, height=64)
    119         techIcon = Sprite(name='techIcon', parent=spriteTransform, pos=(1, 0, 16, 16))
    120         techSprite = GetTechLevelIcon(techIcon, 1, self.typeID)
    121         rewardSprite = Sprite(parent=spriteTransform, name='rewardSprite', width=64, height=64, align=uiconst.CENTER)
    122         InfoIcon(parent=spriteTransform, align=uiconst.TOPRIGHT, typeID=self.typeID, idx=0)
    123         self.LoadIconByTypeID(self.typeID, rewardSprite)
    124         rewardNameCont = Container(parent=rewardCont, name='rewardNameCont', align=uiconst.TOALL)
    125         EveLabelMedium(parent=rewardNameCont, name='rewardLabel', text=GetItemText(self.typeID, self.qty), align=uiconst.CENTERLEFT, padLeft=8, maxWidth=rewardContWidth - 110, color=TextColor.NORMAL)
    126 
    127     def _AddCostColumn(self):
    128         costContWidth = LPOfferEntry2.ColumnWidths[GetByLabel('UI/LPStore/cost')]
    129         costCont = Container(parent=self, name='costCont', align=uiconst.TOLEFT, width=costContWidth, state=uiconst.UI_PICKCHILDREN)
    130         costRowsCont = ContainerAutoSize(parent=costCont, align=uiconst.CENTER, minWidth=costContWidth, width=costContWidth, alignMode=uiconst.TOTOP)
    131         for requirement in self.lpOfferRequirementColumns:
    132             amount = self.node[requirement.name]
    133             if amount == 0:
    134                 continue
    135             amountName = requirement.amountName
    136             amountText = requirement.formatAmount(amount)
    137             amountHintPath = requirement.amountHintPath
    138             if amountHintPath:
    139                 keywords = {amountName: amountText}
    140                 amountText = GetByLabel(amountHintPath, **keywords)
    141             label = EveLabelMedium(parent=costRowsCont, align=uiconst.TOTOP, text=amountText, color=TextColor.NORMAL)
    142             self.costRequirementLabels.append((label, requirement))
    143 
    144     def _AddReqItemsColumn(self):
    145         reqItemsContWidth = LPOfferEntry2.ColumnWidths[GetByLabel('UI/LPStore/RequiredItems')]
    146         reqItemsCont = Container(parent=self, name='costCont', align=uiconst.TOLEFT, width=reqItemsContWidth, state=uiconst.UI_PICKCHILDREN)
    147         reqRowsCont = ContainerAutoSize(parent=reqItemsCont, align=uiconst.CENTER, minWidth=reqItemsContWidth, width=reqItemsContWidth, alignMode=uiconst.TOTOP)
    148         for req in self.reqItems:
    149             typeID, quantity = req
    150             requiredItemRowCont = ContainerAutoSize(name='requiredItemRowCont', parent=reqRowsCont, align=uiconst.TOTOP, alignMode=uiconst.TOTOP)
    151             label = EveLabelMedium(name='requiredItem', parent=requiredItemRowCont, text=GetItemText(typeID, quantity), align=uiconst.TOTOP, color=TextColor.NORMAL, state=uiconst.UI_NORMAL)
    152             textWidth, _height = EveLabelMedium.MeasureTextSize(GetItemText(typeID, quantity))
    153             infoIconOffset = min(reqItemsContWidth - InfoIcon.default_width, textWidth + 5)
    154             InfoIcon(parent=requiredItemRowCont, align=uiconst.TOPLEFT, typeID=typeID, idx=0, left=infoIconOffset)
    155             self.itemRequirementLabels.append((label, req))
    156 
    157     def _AddPurchaseButtonColumn(self):
    158         purchaseButtonContWidth = LPOfferEntry2.ColumnWidths['']
    159         purchaseButtonCont = Container(parent=self, name='costCont', align=uiconst.TOLEFT, width=purchaseButtonContWidth, state=uiconst.UI_PICKCHILDREN)
    160         Button(parent=purchaseButtonCont, align=uiconst.CENTER, label='Purchase', enabled=self.AreAllRequirementsMet(), func=self.AmountConfirmationDialogue)
    161 
    162     def AmountConfirmationDialogue(self, *args):
    163         SelectQuantityWnd.ConfirmPurchaseQuantity(GetItemText(self.typeID, self.qty), self.GetMaxPurchaseable(), self.Purchase)
    164 
    165     def Purchase(self, amount):
    166         self.lpSvc.AcceptOffer(self.node, amount)
    167 
    168     def Load(self, data):
    169         self.Flush()
    170         self._AddRewardColumn()
    171         self._AddCostColumn()
    172         self._AddReqItemsColumn()
    173         self._AddPurchaseButtonColumn()
    174 
    175     def GetHeight(self, node, _width):
    176         return max(LPOfferEntry2.entryHeight, len(node.Get('reqItems', [])) * LPOfferEntry2.PER_REQUIRED_ITEM_HEIGHT)
    177 
    178     def LoadIconByTypeID(object, typeID, sprite):
    179         sm.GetService('photo').GetIconByType(sprite, typeID, itemID=None, size=None, ignoreSize=False, isCopy=False)
    180 
    181     def LoadTooltipPanel(self, tooltipPanel, *_args):
    182         tooltipPanel.LoadGeneric2ColumnTemplate()
    183         avgPrice = typeHelpers.GetAveragePrice(self.typeID)
    184         if avgPrice is None:
    185             avgPrice = 0
    186         estimatedMaketPrice = self.qty * avgPrice
    187         estimatedPriceString = GetByLabel('UI/Inventory/EstIskPrice', iskString=FmtISKAndRound(estimatedMaketPrice, False))
    188         tooltipPanel.AddLabelSmall(text=estimatedPriceString)