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

lpStorePanel.py (16091B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\station\loyaltyPointStore\lpStorePanel.py
      2 import evetypes
      3 import localization
      4 import uthread
      5 from carbon.client.script.util.misc import RunOnceMethod, Despammer
      6 from carbonui import ButtonVariant, uiconst
      7 from carbonui.button.const import HEIGHT_NORMAL
      8 from carbonui.control.button import Button
      9 from carbonui.control.checkbox import Checkbox
     10 from carbonui.primitives.container import Container
     11 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     12 from eve.client.script.ui.control import eveScroll, eveLabel
     13 from eve.client.script.ui.control.entries.util import GetFromClass
     14 from eve.client.script.ui.control.eveIcon import GetLogoIcon
     15 from eve.client.script.ui.control.eveLoadingWheel import LoadingWheel
     16 from eve.client.script.ui.station.loyaltyPointStore.lpOfferEntry2 import LPOfferEntry2
     17 from eve.client.script.ui.station.loyaltyPointStore.lpStoreFilters import LPStoreFilters
     18 from eve.client.script.ui.station.loyaltyPointStore.lpStoreSignals import on_corp_lp_purchases_killswitch_changed
     19 from eve.client.script.ui.station.lpstoreRequirement import LpRequirement, ISKRequirement
     20 from eve.common.lib import appConst
     21 from inventorycommon import typeHelpers
     22 
     23 class LPStorePanel(Container):
     24     __notifyevents__ = ['OnLPStoreFilterChange',
     25      'OnLPStoreCurrentPresetChange',
     26      'OnLPStorePresetsChange',
     27      'OnSessionChanged',
     28      'OnAccountChange_Local']
     29 
     30     def ApplyAttributes(self, attributes):
     31         super(LPStorePanel, self).ApplyAttributes(attributes)
     32         self.lpSvc = sm.GetService('lpstore')
     33         self.loyaltyPointsWalletSvc = sm.GetService('loyaltyPointsWalletSvc')
     34         self.corpID = attributes.corpID
     35         self.lpStoreWindow = attributes.lpStoreWindow
     36         self.hasStandingsRequirement = self._HasStandingsRequirement()
     37         self.offerRefreshDespammerInitiated = False
     38         self.ConstructTopParent()
     39         self.ConstructHeader()
     40         self.ConstructScroll()
     41         self.ConstructLoadingWheel()
     42         sm.RegisterNotify(self)
     43         on_corp_lp_purchases_killswitch_changed.connect(self._on_corp_lp_purchases_killswitch_changed)
     44 
     45     def ConstructLoadingWheel(self):
     46         self._loadingWheel = LoadingWheel(parent=self.scroll, align=uiconst.CENTER, width=64, height=64, state=uiconst.UI_HIDDEN)
     47 
     48     def ShowLoad(self):
     49         if self._loadingWheel:
     50             self._loadingWheel.state = uiconst.UI_NORMAL
     51         self.lpStoreWindow.ShowLoad()
     52 
     53     def HideLoad(self):
     54         if self._loadingWheel:
     55             self._loadingWheel.state = uiconst.UI_HIDDEN
     56         self.lpStoreWindow.HideLoad()
     57 
     58     def ConstructTopParent(self):
     59         self.topParent = ContainerAutoSize(name='topParent', align=uiconst.TOTOP, parent=self)
     60 
     61     def ConstructHeader(self):
     62         self.ConstructInfoCont()
     63         self.ConstructFilterCont()
     64 
     65     def ConstructInfoCont(self):
     66         self.corpInfoCont = ContainerAutoSize(name='corpInfoCont', parent=self.topParent, align=uiconst.TOTOP, alignMode=uiconst.CENTERLEFT)
     67         self.ConstructCorpIcon()
     68         self.ConstructCorpLabelCont()
     69 
     70     def ConstructCorpIcon(self):
     71         corpIconCont = Container(name='corpIconCont', parent=self.corpInfoCont, align=uiconst.CENTERLEFT, width=64, height=64)
     72         corpIcon = GetLogoIcon(itemID=self.corpID, parent=corpIconCont, acceptNone=False, state=uiconst.UI_NORMAL, align=uiconst.TOPLEFT, pos=(0, 0, 64, 64))
     73         corpIcon.OnClick = self.ShowCorpInfo
     74         corpIcon.SetSize(64, 64)
     75 
     76     def ConstructCorpLabelCont(self):
     77         lpBalanceCont = ContainerAutoSize(name='lpBalanceCont', parent=self.corpInfoCont, align=uiconst.TOLEFT, left=80, width=300)
     78         self.corpLPsLabel = eveLabel.EveCaptionSmall(parent=lpBalanceCont, name='corpLPsLabel', align=uiconst.TOTOP)
     79         self.useCorpWalletsCb = Checkbox(parent=lpBalanceCont, name='useCorpWalletsCb', align=uiconst.TOTOP, text=localization.GetByLabel('UI/LPStore/UseCorpWallets'), hint=localization.GetByLabel('UI/LPStore/UseCorpWalletsTooltip'), checked=self.lpSvc.IsUsingCorpWallets(self.corpID), callback=self.OnUseCorpWalletsCheckboxChange)
     80         self.useCorpWalletsCb.display = self.lpSvc.CanCharacterUseCorpWallets(self.corpID)
     81         self.exchangeButton = Button(parent=self.corpInfoCont, name='exchangeBtn', label=localization.GetByLabel('UI/LPStore/ConcordExchange'), variant=ButtonVariant.GHOST, align=uiconst.CENTERRIGHT)
     82         if self.lpSvc.IsRWCorp(self.corpID):
     83             self.exchangeButton.display = False
     84 
     85     def OnUseCorpWalletsCheckboxChange(self, cb):
     86         if cb.checked:
     87             self.lpSvc.UseCorporationWallets(self.corpID)
     88         else:
     89             self.lpSvc.UseCharacterWallets(self.corpID)
     90 
     91     def ShowCorpInfo(self):
     92         sm.GetService('info').ShowInfo(appConst.typeCorporation, self.corpID)
     93 
     94     def ConstructFilterCont(self):
     95         self.filters = LPStoreFilters(parent=self.topParent, name='filters', align=uiconst.TOTOP, height=HEIGHT_NORMAL, padding=(0, 8, 0, 8), filterEditClearedCallback=self.RefreshOffers, filterEditCallback=self.RefreshOffers, corpID=self.corpID)
     96 
     97     def ConstructScroll(self):
     98         self.scroll = eveScroll.Scroll(parent=self, name='lpStoreScroll', align=uiconst.TOALL)
     99         self.scroll.sr.id = 'lpStoreScroll'
    100 
    101     def RefreshIfNotAlready(self):
    102         self.InitOfferRefreshDespammer()
    103         self.Refresh()
    104         self.filters.Refresh()
    105 
    106     RefreshIfNotAlready = RunOnceMethod(RefreshIfNotAlready)
    107 
    108     def Refresh(self):
    109         self.ShowLoad()
    110         try:
    111             self.factionID = sm.GetService('map').GetItem(session.solarsystemid2).factionID
    112             self.RefreshPresets()
    113             lpAmount = self.lpSvc.GetLPBalanceForStorePurchase(self.corpID)
    114             self.corpLPsLabel.text = self._GetCorpLPsLabel(lpAmount)
    115         finally:
    116             self.HideLoad()
    117 
    118         exchangeRate = self.lpSvc.GetConcordLPExchangeRate(self.corpID)
    119         if self.lpSvc.IsUsingCharacterWallets(self.corpID) and exchangeRate is not None and exchangeRate > 0.0 and self.loyaltyPointsWalletSvc.GetCharacterConcordLPBalance() * exchangeRate > 1:
    120             self.EnableExchangeButton()
    121         else:
    122             self.DisableExchangeButton()
    123         self.RefreshOffers()
    124 
    125     def _OnClose(self, *etc):
    126         self.ReleaseOfferRefreshDespammer()
    127 
    128     def OpenConcordExchange(self):
    129         self.DisableExchangeButton(suppressHint=True)
    130         self.lpSvc.OpenConcordExchange(sm.GetService('station').stationItem.ownerID)
    131 
    132     def DisableExchangeButton(self, suppressHint = False):
    133         self.exchangeButton.Disable()
    134         self.exchangeButton.OnClick = None
    135         fromCorpName = cfg.eveowners.Get(appConst.ownerCONCORD).ownerName
    136         toCorpName = cfg.eveowners.Get(self.corpID).ownerName
    137         if suppressHint:
    138             self.exchangeButton.SetHint('')
    139         else:
    140             exchangeRate = self.lpSvc.GetConcordLPExchangeRate(self.corpID)
    141             if self.lpSvc.IsUsingCorpWallets(self.corpID):
    142                 hint = localization.GetByLabel('UI/LPStore/CannotExchangeCorporationLP')
    143             elif exchangeRate is None or exchangeRate == 0.0:
    144                 hint = self._GetExchangeRateHint(fromCorpName, toCorpName)
    145             elif fromCorpName == toCorpName:
    146                 hint = localization.GetByLabel('UI/LPStore/ExchangeProhibited', fromCorpName=fromCorpName)
    147             else:
    148                 hint = localization.GetByLabel('UI/LPStore/ExchangeUnavailable', fromCorpName=fromCorpName, toCorpName=toCorpName)
    149             self.exchangeButton.SetHint(hint)
    150 
    151     def EnableExchangeButton(self):
    152         self.exchangeButton.Enable()
    153         self.exchangeButton.OnClick = lambda *discard: self.OpenConcordExchange()
    154         fromCorpName = cfg.eveowners.Get(appConst.ownerCONCORD).ownerName
    155         toCorpName = cfg.eveowners.Get(self.corpID).ownerName
    156         exchangeRate = self.lpSvc.GetConcordLPExchangeRate(self.corpID)
    157         self.exchangeButton.SetHint(localization.GetByLabel('UI/LPStore/ConvertLPMsg', toCorpName=toCorpName, exchangeRate=exchangeRate, fromCorpName=fromCorpName))
    158 
    159     def _RefreshOffersInternal(self):
    160         self.ShowLoad()
    161         try:
    162             filters, textFilter = self.filters.GetCurrentFilters()
    163             scroll = self.scroll
    164             pos = scroll.GetScrollProportion()
    165             storeOffers = self._GetStoreOffers()
    166             offers = self._ProcessOffers(storeOffers, filters, textFilter)
    167             self.scroll.sr.fixedColumns = self._GetMinColumnWidths()
    168             scroll.LoadContent(headers=self._GetHeaders(), contentList=offers, customColumnWidths=True, noContentHint=localization.GetByLabel('UI/LPStore/NoMatchingOffers'), sortby=self._GetSortByLabel())
    169             columnWidthSettingsVersion = 1
    170             languageID = localization.util.GetLanguageID()
    171             settingsKey = 'columnWidthsReset_%s_%s' % (columnWidthSettingsVersion, languageID)
    172             if offers and not settings.user.ui.Get(settingsKey, False):
    173                 scroll.ResetColumnWidths()
    174                 settings.user.ui.Set(settingsKey, True)
    175             scroll.ScrollToProportion(pos)
    176         finally:
    177             self.HideLoad()
    178 
    179     def _GetStoreOffers(self):
    180         return sm.GetService('lpstore').GetOffers(self.corpID)
    181 
    182     def _ProcessOffers(self, storeOffers, filters, textFilter):
    183         offers = []
    184         currentIskBalance = self.lpSvc.GetISKBalanceForStorePurchase(self.corpID)
    185         currentLPBalance = self.lpSvc.GetLPBalanceForStorePurchase(self.corpID)
    186         currentAKBalance = self.lpSvc.GetMyAnalysisKredits()
    187         for offer in storeOffers:
    188             if not self.Check(offer, filters, textFilter):
    189                 continue
    190             offer['sort_%s' % localization.GetByLabel('UI/LPStore/cost')] = (offer[LpRequirement.LP_REQUIREMENT_NAME], offer[ISKRequirement.ISK_REQUIREMENT_NAME])
    191             offer['sort_%s' % localization.GetByLabel('UI/LPStore/RequiredItems')] = len(offer['reqItems'])
    192             offer['iskBalance'] = currentIskBalance
    193             offer['lpBalance'] = currentLPBalance
    194             offer['akBalance'] = currentAKBalance
    195             offers.append(GetFromClass(LPOfferEntry2, offer))
    196 
    197         return offers
    198 
    199     def InitOfferRefreshDespammer(self):
    200         self.offerRefreshDespammerInitiated = True
    201         self.offerRefreshDespammer = Despammer(self._RefreshOffersInternal, delay=200)
    202         self._RefreshOffers = self.offerRefreshDespammer.Send
    203 
    204     def RefreshOffers(self):
    205         if hasattr(self, '_RefreshOffers'):
    206             self._RefreshOffers()
    207 
    208     def _GetHeaders(self):
    209         return LPOfferEntry2.Headers
    210 
    211     def _GetMinColumnWidths(self):
    212         return LPOfferEntry2.ColumnWidths
    213 
    214     def _HasStandingsRequirement(self):
    215         for offer in sm.GetService('lpstore').GetOffers(self.corpID):
    216             if offer.Get('requiredStandings', None):
    217                 return True
    218 
    219         return False
    220 
    221     def ReleaseOfferRefreshDespammer(self):
    222         if hasattr(self, 'offerRefreshDespammer'):
    223             uthread.new(self.offerRefreshDespammer.Stop)
    224             del self.offerRefreshDespammer
    225 
    226     def OnLPStoreFilterChange(self):
    227         self.RefreshOffers()
    228 
    229     def OnLPStorePresetsChange(self):
    230         self.RefreshPresets()
    231 
    232     def OnLPStoreCurrentPresetChange(self):
    233         self.RefreshPresets()
    234 
    235     def OnSessionChanged(self, _is_remote, _session, change):
    236         if 'corprole' in change or 'corpAccountKey' in change:
    237             self.useCorpWalletsCb.display = self.lpSvc.CanCharacterUseCorpWallets(self.corpID)
    238             if not self.useCorpWalletsCb.display:
    239                 self.useCorpWalletsCb.SetChecked(False, False)
    240             self.OnUseCorpWalletsCheckboxChange(self.useCorpWalletsCb)
    241 
    242     def RefreshPresets(self):
    243         self.ShowLoad()
    244         try:
    245             self.filters.RefreshPresets()
    246         finally:
    247             self.HideLoad()
    248 
    249     def Check(self, offer, filters, textFilter = ''):
    250         if textFilter and evetypes.GetName(offer.typeID).lower().find(textFilter) < 0:
    251             return False
    252         for name, val in filters.iteritems():
    253             if not getattr(self, 'Check_%s' % name)(offer, val):
    254                 return False
    255 
    256         return True
    257 
    258     def CategoryFromType(self, typeID):
    259         return evetypes.GetCategoryID(typeID)
    260 
    261     def GroupFromType(self, typeID):
    262         return evetypes.GetGroupID(typeID)
    263 
    264     def Check_rewardCategory(self, offer, val):
    265         return self.CategoryFromType(offer.typeID) == val
    266 
    267     def Check_rewardGroup(self, offer, val):
    268         return self.GroupFromType(offer.typeID) == val
    269 
    270     def Check_rewardType(self, offer, val):
    271         return offer.typeID == val
    272 
    273     def Check_reqCategory(self, offer, val):
    274         for typeID, qty in offer.reqItems:
    275             if self.CategoryFromType(typeID) == val:
    276                 return True
    277 
    278         return False
    279 
    280     def Check_reqGroup(self, offer, val):
    281         for typeID, qty in offer.reqItems:
    282             if self.GroupFromType(typeID) == val:
    283                 return True
    284 
    285         return False
    286 
    287     def Check_reqType(self, offer, val):
    288         for typeID, qty in offer.reqItems:
    289             if typeID == val:
    290                 return True
    291 
    292         return False
    293 
    294     def Check_reqIllegal(self, offer, _val):
    295         for typeID, qty in offer.reqItems:
    296             if self.factionID in typeHelpers.GetIllegality(typeID):
    297                 return False
    298 
    299         return True
    300 
    301     def Check_reqNotInHangar(self, offer, _val):
    302         for typeID, qty in offer.reqItems:
    303             if not self.lpSvc.HaveItem(typeID, qty):
    304                 return False
    305 
    306         return True
    307 
    308     def Check_minLP(self, offer, val):
    309         return offer.lpCost >= val
    310 
    311     def Check_maxLP(self, offer, val):
    312         return offer.lpCost <= val
    313 
    314     def Check_minISK(self, offer, val):
    315         return offer.iskCost >= val
    316 
    317     def Check_maxISK(self, offer, val):
    318         return offer.iskCost <= val
    319 
    320     def Check_minAnalysisKredits(self, offer, val):
    321         analysisKreditsCost = getattr(offer, 'akCost', None)
    322         if analysisKreditsCost:
    323             return analysisKreditsCost >= val
    324         return False
    325 
    326     def Check_maxAnalysisKredits(self, offer, val):
    327         analysisKreditsCost = getattr(offer, 'akCost', None)
    328         if analysisKreditsCost:
    329             return analysisKreditsCost <= val
    330         return True
    331 
    332     def Check_dynamicMaxLP(self, offer, _val):
    333         return self.Check_maxLP(offer, self.lpSvc.GetLPBalanceForStorePurchase(self.corpID))
    334 
    335     def Check_dynamicMaxISK(self, offer, _val):
    336         return self.Check_maxISK(offer, self.lpSvc.GetISKBalanceForStorePurchase(self.corpID))
    337 
    338     def Check_dynamicMaxAnalysisKredits(self, offer, _val):
    339         return self.Check_maxAnalysisKredits(offer, self.lpSvc.GetMyAnalysisKredits())
    340 
    341     def Check_dynamicStandings(self, offer, _val):
    342         return self.lpSvc.IsStandingsFulfilled(offer)
    343 
    344     def _GetCorpLPsLabel(self, lpAmount):
    345         return localization.GetByLabel('UI/LPStore/CurrentLPs', lpAmount=lpAmount)
    346 
    347     def _GetSortByLabel(self):
    348         return localization.GetByLabel('UI/LPStore/LPCost')
    349 
    350     def _GetExchangeRateHint(self, fromCorpName, toCorpName):
    351         return localization.GetByLabel('UI/LPStore/ExchangeRateNotDefined', fromCorpName=fromCorpName, toCorpName=toCorpName)
    352 
    353     def _on_corp_lp_purchases_killswitch_changed(self, _value):
    354         self.useCorpWalletsCb.display = self.lpSvc.CanCharacterUseCorpWallets(self.corpID)
    355         self.useCorpWalletsCb.SetChecked(False, report=False)
    356         self.lpSvc.ResetWalletsSourceChoices()
    357 
    358     def OnAccountChange_Local(self, accountKey, ownerID, balance):
    359         if balance is None:
    360             return
    361         if accountKey not in ('cash', 'cash2', 'cash3', 'cash4', 'cash5', 'cash6', 'cash7'):
    362             return
    363         if ownerID == session.charid:
    364             self._on_char_account_change()
    365         elif ownerID == session.corpid:
    366             self._on_corp_account_change()
    367 
    368     def _on_char_account_change(self):
    369         self.RefreshOffers()
    370 
    371     def _on_corp_account_change(self):
    372         self.RefreshOffers()