marketHistory.py (14143B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\market\marketHistory.py 2 import blue 3 import carbonui.const as uiconst 4 import eveicon 5 import evetypes 6 from appConst import stationDoomheim 7 from caching import Memoize 8 from carbon.common.script.sys.serviceConst import ROLE_GML 9 from carbon.common.script.util.format import FmtDate 10 from carbonui.control.combo import Combo 11 from carbonui.control.contextMenu.menuEntryData import MenuEntryData 12 from eve.client.script.ui.shared.market.qa import SETTING_SHOULD_SEE_PLEX_ORDERS_LOCATION_INFO 13 from eve.client.script.ui.shared.market.util import should_show_location_info 14 from eve.client.script.ui.control.entries.generic import Generic 15 from eve.client.script.ui.control.entries.util import GetFromClass 16 from eve.client.script.ui.quickFilter import QuickFilterEdit 17 from eve.common.script.util.eveFormat import FmtISK 18 from marketutil.feature_flags.client import is_global_plex_market_experiment_enabled_changed 19 from menu import MenuLabel, MenuList 20 from carbon.common.script.util.timerstuff import AutoTimer 21 from carbonui.control.dragResizeCont import DragResizeCont 22 from carbonui.primitives.container import Container 23 from eve.client.script.ui.control.eveLabel import EveCaptionSmall 24 from eve.client.script.ui.control.eveScroll import Scroll 25 from eveservices.menu import GetMenuService 26 from localization import GetByLabel 27 from utillib import KeyVal 28 from eve.common.lib import appConst as const 29 TOPCONTHEIGHT = 26 30 31 class MarketHistory(Container): 32 __guid__ = 'MarketHistory' 33 __notifyevents__ = ['OnOwnOrdersChanged'] 34 default_name = 'MarketHistory' 35 lastUpdateTime = None 36 refrehHistoryTimer = None 37 38 def ApplyAttributes(self, attributes): 39 self.isInitialized = False 40 self.includesCorpOrders = False 41 super(MarketHistory, self).ApplyAttributes(attributes) 42 is_global_plex_market_experiment_enabled_changed.connect(self._OnGlobalPlexMarketExperimentChanged) 43 SETTING_SHOULD_SEE_PLEX_ORDERS_LOCATION_INFO.on_change.connect(self._OnShouldSeePlexOrdersLocationChanged) 44 sm.RegisterNotify(self) 45 46 def Close(self, *args, **kwds): 47 Container.Close(self, *args, **kwds) 48 is_global_plex_market_experiment_enabled_changed.disconnect(self._OnGlobalPlexMarketExperimentChanged) 49 SETTING_SHOULD_SEE_PLEX_ORDERS_LOCATION_INFO.on_change.disconnect(self._OnShouldSeePlexOrdersLocationChanged) 50 sm.UnregisterNotify(self) 51 52 def OnTabSelect(self): 53 if not self.isInitialized: 54 self.ConstructLayout() 55 self.isInitialized = True 56 self.PopulateScroll() 57 58 def OnOwnOrdersChanged(self, orders, reason, isCorp): 59 if not self.display or self.destroyed: 60 return 61 self.RefreshHistory() 62 63 def RefreshHistory(self): 64 if self.refrehHistoryTimer: 65 return 66 if self.lastUpdateTime: 67 diff = max(1, blue.os.TimeDiffInMs(self.lastUpdateTime, blue.os.GetWallclockTime())) 68 BUFFER_TIME = 30000 69 if diff > BUFFER_TIME: 70 self._RefreshHistory() 71 else: 72 waitTime = int(max(1, BUFFER_TIME - diff)) 73 self.refrehHistoryTimer = AutoTimer(waitTime, self._RefreshHistory) 74 else: 75 self._RefreshHistory() 76 77 def _RefreshHistory(self): 78 if self.destroyed or not session.charid: 79 return 80 if not self.isInitialized: 81 self.ConstructLayout() 82 self.PopulateScroll(refreshing=1) 83 self.refrehHistoryTimer = None 84 self.lastUpdateTime = blue.os.GetWallclockTime() 85 86 def ConstructLayout(self): 87 self.topCont = Container(parent=self, align=uiconst.TOTOP, height=32) 88 options = [(GetByLabel('UI/Market/Orders/AllOrders'), None), (GetByLabel('UI/Market/Orders/UI/Market/Orders/PersonalOrders'), 0), (GetByLabel('UI/Market/Orders/CorporationOrders'), 1, GetByLabel('UI/Market/Orders/CorpHistoryHint'))] 89 comboPrefsKey = ('char', 'ui', 'marketOrderHistory') 90 ownerTypeSelected = settings.char.ui.Get('marketOrderHistory', None) 91 self.ownerCombo = Combo(parent=self.topCont, options=options, name='marketOrder_history', prefskey=comboPrefsKey, callback=self.OnOwnerComboChanged, select=ownerTypeSelected, pos=(6, 6, 0, 0), width=200) 92 self.mainCont = Container(name='mainCont', parent=self) 93 self.dividerCont = DragResizeCont(name='dividerCont', settingsID='marketOrderHistory', parent=self.mainCont, align=uiconst.TOTOP_PROP, minSize=0.25, maxSize=0.75, defaultSize=0.5, clipChildren=True, show_line=True) 94 self.sellParent = Container(name='sellParent', parent=self.dividerCont.mainCont) 95 self.buyParent = Container(name='buyParent', parent=self.mainCont) 96 self.ConstructSellCont() 97 self.ConstructBuyCont() 98 99 def ConstructSellCont(self): 100 self.sellTopCont = Container(name='sellTopCont', parent=self.sellParent, align=uiconst.TOTOP, height=TOPCONTHEIGHT) 101 self.sellFilter = QuickFilterEdit(name='sellFilter', parent=self.sellTopCont, left=const.defaultPadding, align=uiconst.CENTERRIGHT, width=150, hintText=GetByLabel('UI/Market/Orders/FilterTypes'), isTypeField=True) 102 self.sellFilter.ReloadFunction = self.ReloadSellScroll 103 EveCaptionSmall(text=GetByLabel('UI/Market/Orders/Selling'), parent=self.sellTopCont, align=uiconst.RELATIVE, left=4) 104 self.sellScroll = Scroll(name='orderHistorySellScroll', parent=self.sellParent) 105 self.sellScroll.multiSelect = 0 106 self.sellScroll.sr.id = 'orderHistorySellScroll' 107 108 def ConstructBuyCont(self): 109 self.buyTopCont = Container(name='buyTopCont', parent=self.buyParent, align=uiconst.TOTOP, height=TOPCONTHEIGHT) 110 self.buyFilter = QuickFilterEdit(name='buyFilter', parent=self.buyTopCont, left=const.defaultPadding, align=uiconst.CENTERRIGHT, width=150, hintText=GetByLabel('UI/Market/Orders/FilterTypes'), isTypeField=True) 111 self.buyFilter.ReloadFunction = self.ReloadBuyScroll 112 EveCaptionSmall(text=GetByLabel('UI/Market/Orders/Buying'), parent=self.buyTopCont, align=uiconst.RELATIVE, left=4) 113 self.buyScroll = Scroll(name='orderHistoryBuyScroll', parent=self.buyParent) 114 self.buyScroll.multiSelect = 0 115 self.buyScroll.sr.id = 'orderHistoryBuyScroll' 116 117 def ReloadSellScroll(self): 118 history = sm.GetService('marketQuote').GetMarketOrderHistory() 119 self.LoadSellcroll(history) 120 121 def ReloadBuyScroll(self): 122 history = sm.GetService('marketQuote').GetMarketOrderHistory() 123 self.LoadBuyScroll(history) 124 125 def OnOwnerComboChanged(self, *args): 126 self.ownerCombo.UpdateSettings() 127 self.PopulateScroll() 128 129 def IsShowingExtraColumn(self): 130 if not self.includesCorpOrders: 131 return False 132 if self.ownerCombo.GetValue() is None: 133 return True 134 return False 135 136 def PopulateScroll(self, refreshing = 0): 137 history = sm.GetService('marketQuote').GetMarketOrderHistory() 138 self.includesCorpOrders = any((x for x in history if x.isCorp)) 139 if self.includesCorpOrders: 140 self.topCont.display = True 141 else: 142 self.topCont.display = False 143 self.LoadBuyScroll(history, refreshing) 144 self.LoadSellcroll(history, refreshing) 145 146 def LoadBuyScroll(self, history, refreshing = 0): 147 buyScrollList = self.GetScrollList(history, self.buyFilter, self.buyScroll) 148 self.LoadScroll(self.buyScroll, buyScrollList, refreshing=refreshing) 149 150 def LoadSellcroll(self, history, refreshing = 0): 151 sellScrollList = self.GetScrollList(history, self.sellFilter, self.sellScroll) 152 self.LoadScroll(self.sellScroll, sellScrollList, refreshing=refreshing) 153 154 def LoadScroll(self, scroll, scrollList, refreshing = 0): 155 scrollTo = None 156 if refreshing: 157 scrollTo = scroll.GetScrollProportion() 158 headers = [' '] if self.IsShowingExtraColumn() else [] 159 headers += [GetByLabel('UI/Generic/Status'), 160 GetByLabel('UI/Common/Updated'), 161 GetByLabel('UI/Common/Type'), 162 GetByLabel('UI/Market/MarketQuote/RemainingQuantity'), 163 GetByLabel('UI/Market/MarketQuote/headerPrice'), 164 GetByLabel('UI/Common/Station'), 165 GetByLabel('UI/Common/LocationTypes/Region')] 166 scroll.Load(contentList=scrollList, scrollTo=scrollTo, headers=headers, noContentHint=GetByLabel('UI/Market/Orders/NoOrdersFound')) 167 168 def GetScrollList(self, history, filterField, scroll): 169 ownerTypeToShow = self.ownerCombo.GetValue() if self.includesCorpOrders else None 170 showExtraColumn = self.IsShowingExtraColumn() 171 unknownText = GetByLabel('UI/Generic/Unknown') 172 structureDirectorySvc = sm.GetService('structureDirectory') 173 scrollList = [] 174 filterValue = filterField.GetValue().strip().lower() 175 for eachRecord in history: 176 if eachRecord.duration < 1: 177 continue 178 if ownerTypeToShow is not None and ownerTypeToShow != eachRecord.isCorp: 179 continue 180 if not self.IsOrderRelevantForThisScroll(scroll, eachRecord): 181 continue 182 if filterValue and self.GetTypeNameLower(eachRecord.typeID).find(filterValue) < 0: 183 continue 184 data = self.GetEntryDataForOrder(eachRecord, unknownText, showExtraColumn, structureDirectorySvc) 185 entry = GetFromClass(OrderHistoryEntry, data) 186 scrollList.append(entry) 187 188 return scrollList 189 190 def IsOrderRelevantForThisScroll(self, scroll, orderRecord): 191 if scroll == self.buyScroll: 192 return orderRecord.bid 193 if scroll == self.sellScroll: 194 return not orderRecord.bid 195 return True 196 197 @Memoize(2) 198 def GetTypeNameLower(self, typeID): 199 return evetypes.GetName(typeID).lower() 200 201 def GetEntryDataForOrder(self, orderRecord, unknownText, showExtraColumn, structureDirectorySvc): 202 orderState = unknownText 203 volRemaining = int(orderRecord.volRemaining) 204 lastStateChange = orderRecord.lastStateChange 205 if orderRecord.orderState == 2: 206 if volRemaining == 0: 207 orderState = '<color=green>%s</color>' % GetByLabel('UI/Market/Orders/StatusCompleted') 208 else: 209 if lastStateChange is None: 210 lastStateChange = orderRecord.issueDate + orderRecord.duration * const.DAY 211 orderState = '<color=red>%s</color>' % GetByLabel('UI/Market/Orders/StatusExpired') 212 elif orderRecord.orderState == 3: 213 orderState = GetByLabel('UI/Market/Orders/StatusCancelled') 214 if should_show_location_info(orderRecord.typeID): 215 stationInfo = sm.GetService('ui').GetStationStaticInfo(orderRecord.stationID) 216 if stationInfo: 217 stationName = cfg.evelocations.Get(orderRecord.stationID).name 218 else: 219 structureInfo = structureDirectorySvc.GetStructureInfo(orderRecord.stationID) 220 stationName = structureInfo.itemName if structureInfo else unknownText 221 regionName = cfg.evelocations.Get(orderRecord.regionID).name 222 else: 223 stationName = '-' 224 regionName = '-' 225 updateText = FmtDate(lastStateChange) if lastStateChange else '-' 226 labelList = [orderState, 227 updateText, 228 evetypes.GetName(orderRecord.typeID), 229 '%s / %s' % (volRemaining, orderRecord.volEntered), 230 '<right>%s</right>' % FmtISK(orderRecord.price), 231 stationName, 232 regionName] 233 if showExtraColumn: 234 labelPath = 'UI/Market/Orders/CorporationOrderShort' if orderRecord.isCorp else 'UI/Market/Orders/PersonalOrderShort' 235 labelList.insert(0, GetByLabel(labelPath)) 236 label = '<t>'.join(labelList) 237 data = KeyVal(label=label, order=orderRecord, OnDblClick=self.ShowMarketDetilsForTypeInOrder) 238 data.Set('sort_%s' % GetByLabel('UI/Market/MarketQuote/RemainingQuantity'), (int(orderRecord.volRemaining), orderRecord.volEntered)) 239 data.Set('sort_%s' % GetByLabel('UI/Market/MarketQuote/headerPrice'), float(orderRecord.price)) 240 data.Set('sort_%s' % GetByLabel('UI/Common/Updated'), lastStateChange or -1) 241 data.Set('sort_%s' % GetByLabel('UI/Common/Station'), stationName.lower()) 242 return data 243 244 def ShowMarketDetilsForTypeInOrder(self, entry): 245 order = entry.sr.node.order 246 sm.GetService('marketutils').ShowMarketDetails(order.typeID, None) 247 248 def _OnGlobalPlexMarketExperimentChanged(self, *args): 249 self.PopulateScroll() 250 251 def _OnShouldSeePlexOrdersLocationChanged(self, *args): 252 self.PopulateScroll() 253 254 255 class OrderHistoryEntry(Generic): 256 257 def GetMenu(self): 258 self.OnClick() 259 m = MenuList() 260 order = self.sr.node.order 261 m.append(None) 262 m += GetMenuService().GetMenuFromItemIDTypeID(None, order.typeID, includeMarketDetails=True) 263 m.append(None) 264 stationID = order.stationID 265 solarSystemID = order.solarSystemID 266 stationInfo = sm.GetService('ui').GetStationStaticInfo(stationID) 267 if stationInfo: 268 m.append(MenuEntryData(MenuLabel('UI/Common/Location'), subMenuData=GetMenuService().CelestialMenu(stationID, typeID=stationInfo.stationTypeID, parentID=stationInfo.solarSystemID, mapItem=None), texturePath=eveicon.location)) 269 else: 270 structureInfo = sm.GetService('structureDirectory').GetStructureInfo(stationID) 271 if structureInfo: 272 m.append(MenuEntryData(MenuLabel('UI/Common/Location'), subMenuData=GetMenuService().CelestialMenu(stationID, typeID=structureInfo.typeID, parentID=stationID), texturePath=eveicon.location)) 273 elif solarSystemID: 274 m += [(MenuLabel('UI/Common/SolarSystem'), GetMenuService().CelestialMenu(solarSystemID))] 275 if session.role & ROLE_GML > 0: 276 m.append(('GM - orderID: %s' % order.orderID, blue.pyos.SetClipboardData, (str(order.orderID),))) 277 return m