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()