orders.py (13367B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\market\orders.py 2 import blue 3 import carbonui.const as uiconst 4 import eveicon 5 import evetypes 6 import log 7 import utillib 8 from caching import Memoize 9 from carbonui.control.contextMenu.menuEntryData import MenuEntryData 10 from carbonui.control.dragdrop.dragdata import TypeDragData 11 from eve.client.script.ui.control.entries.generic import Generic 12 from eve.client.script.ui.control.entries.util import GetFromClass 13 from eve.client.script.ui.quickFilter import QuickFilterEdit 14 from eve.client.script.ui.shared.market.qa import SETTING_SHOULD_SEE_PLEX_ORDERS_LOCATION_INFO 15 from eve.client.script.ui.shared.market.util import should_show_location_info 16 from marketutil.feature_flags.client import is_global_plex_market_experiment_enabled_changed 17 from menu import MenuLabel, MenuList 18 from carbon.common.script.util.commonutils import StripTags 19 from carbon.common.script.util.timerstuff import AutoTimer 20 from carbonui.control.dragResizeCont import DragResizeCont 21 from carbonui.primitives.container import Container 22 from eve.client.script.ui.control.eveLabel import EveCaptionSmall 23 from eve.client.script.ui.control.eveScroll import Scroll 24 from eveservices.menu import GetMenuService 25 from localization import GetByLabel 26 TOPCONTHEIGHT = 26 27 28 class MarketOrders(Container): 29 __guid__ = 'form.MarketOrders' 30 __nonpersistvars__ = [] 31 __notifyevents__ = ['OnOwnOrdersChanged'] 32 default_name = 'MarketOrders' 33 lastUpdateTime = None 34 refreshOrdersTimer = None 35 36 def ApplyAttributes(self, attributes): 37 self.buyScroll = None 38 self.sellScroll = None 39 self.buyFilter = None 40 self.sellFilter = None 41 super(MarketOrders, 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._OnGlobalPlexMarketExperimentChanged) 44 sm.RegisterNotify(self) 45 self.isInitialized = False 46 self.totalEscrow = 0.0 47 self.totalLeft = 0.0 48 self.totalIncome = 0.0 49 self.totalExpenses = 0.0 50 51 def Close(self, *args, **kwds): 52 Container.Close(self, *args, **kwds) 53 is_global_plex_market_experiment_enabled_changed.disconnect(self._OnGlobalPlexMarketExperimentChanged) 54 SETTING_SHOULD_SEE_PLEX_ORDERS_LOCATION_INFO.on_change.disconnect(self._OnGlobalPlexMarketExperimentChanged) 55 sm.UnregisterNotify(self) 56 self.lastUpdateTime = None 57 self.refreshOrdersTimer = None 58 59 def OnTabSelect(self): 60 if not self.isInitialized: 61 self.ConstructLayout() 62 self.isInitialized = True 63 self.PopulateScroll() 64 65 def OnOwnOrdersChanged(self, orders, reason, isCorp): 66 if self.state == uiconst.UI_HIDDEN or self.destroyed: 67 return 68 self.RefreshOrders() 69 70 def RefreshOrders(self): 71 if self.lastUpdateTime and self.refreshOrdersTimer is None: 72 diff = max(1, blue.os.TimeDiffInMs(self.lastUpdateTime, blue.os.GetWallclockTime())) 73 if diff > 30000: 74 self._RefreshOrders() 75 else: 76 self.refreshOrdersTimer = AutoTimer(int(diff), self._RefreshOrders) 77 else: 78 self._RefreshOrders() 79 80 def _RefreshOrders(self): 81 if not self.isInitialized: 82 self.ConstructLayout() 83 self.PopulateScroll(refreshing=1) 84 self.refreshOrdersTimer = None 85 self.lastUpdateTime = blue.os.GetWallclockTime() 86 87 def ConstructLayout(self): 88 self.ConstructBottomCont() 89 self.mainCont = Container(name='mainCont', parent=self) 90 self.dividerCont = DragResizeCont(name='dividerCont', settingsID='marketOrders', parent=self.mainCont, align=uiconst.TOTOP_PROP, minSize=0.25, maxSize=0.75, defaultSize=0.5, clipChildren=True, show_line=True) 91 self.sellParent = Container(name='sellParent', parent=self.dividerCont.mainCont) 92 self.buyParent = Container(name='buyParent', parent=self.mainCont) 93 self.ConstructSellCont() 94 self.ConstructBuyCont() 95 w, h = self.GetAbsoluteSize() 96 self._OnSizeChange_NoBlock(w, h) 97 98 def ConstructSellCont(self): 99 self.ConstructSellTopCont() 100 self.sellScroll = Scroll(name='sellscroll', parent=self.sellParent) 101 self.sellScroll.multiSelect = 0 102 self.sellScroll.smartSort = 1 103 self.sellScroll.ignoreHeaderWidths = 1 104 self.sellScroll.sr.id = 'ordersSellScroll' 105 self.sellScroll.OnColumnChanged = self.OnOrderSellColumnChanged 106 107 def ConstructSellTopCont(self): 108 self.sellTopCont = Container(name='sellTopCont', parent=self.sellParent, align=uiconst.TOTOP, height=TOPCONTHEIGHT) 109 self.sellFilter = QuickFilterEdit(name='sellFilter', parent=self.sellTopCont, left=const.defaultPadding, align=uiconst.CENTERRIGHT, width=150, hintText=GetByLabel('UI/Market/Orders/FilterTypes'), isTypeField=True) 110 self.sellFilter.ReloadFunction = self.PopulateScroll 111 EveCaptionSmall(text=GetByLabel('UI/Market/Orders/Selling'), parent=self.sellTopCont, align=uiconst.RELATIVE, left=4) 112 113 def ConstructBuyCont(self): 114 self.ConstructBuyTopCont() 115 self.buyScroll = Scroll(name='buyscroll', parent=self.buyParent) 116 self.buyScroll.multiSelect = 0 117 self.buyScroll.smartSort = 1 118 self.buyScroll.ignoreHeaderWidths = 1 119 self.buyScroll.sr.id = 'ordersBuyScroll' 120 self.buyScroll.OnColumnChanged = self.OnOrderBuyColumnChanged 121 122 def ConstructBuyTopCont(self): 123 self.buyTopCont = Container(name='buyTopCont', parent=self.buyParent, align=uiconst.TOTOP, height=TOPCONTHEIGHT) 124 self.buyFilter = QuickFilterEdit(name='buyFilter', parent=self.buyTopCont, left=const.defaultPadding, align=uiconst.CENTERRIGHT, width=150, hintText=GetByLabel('UI/Market/Orders/FilterTypes'), isTypeField=True) 125 self.buyFilter.ReloadFunction = self.PopulateScroll 126 EveCaptionSmall(text=GetByLabel('UI/Market/Orders/Buying'), parent=self.buyTopCont, align=uiconst.RELATIVE, left=4) 127 128 def ConstructBottomCont(self): 129 pass 130 131 def GetOrders(self): 132 raise NotImplementedError 133 134 def _OnGlobalPlexMarketExperimentChanged(self, *args): 135 self.PopulateScroll() 136 137 def OnOrderBuyColumnChanged(self, *args): 138 self.PopulateScroll() 139 140 def OnOrderSellColumnChanged(self, *args): 141 self.PopulateScroll() 142 143 def PopulateScroll(self, refreshing = 0): 144 visibleSHeaders = [] 145 sscrollList = [] 146 sheaders = self.GetSellHeaders() 147 if self.sellScroll: 148 self.sellScroll.sr.headers = sheaders 149 visibleSHeaders = self.sellScroll.GetColumns() 150 visibleBHeaders = [] 151 bscrollList = [] 152 bheaders = self.GetBuyHeaders() 153 if self.buyScroll: 154 self.buyScroll.sr.headers = bheaders 155 visibleBHeaders = self.buyScroll.GetColumns() 156 marketUtil = sm.GetService('marketutils') 157 orders = self.GetOrders() 158 if self.destroyed: 159 return 160 self.UpdateOrderTotals(orders) 161 buySelected = self.buyScroll.GetSelected() if self.buyScroll else [] 162 sellSelected = self.sellScroll.GetSelected() if self.sellScroll else [] 163 funcs = sm.GetService('marketutils').GetFuncMaps() 164 buyFilterValue = self.buyFilter.GetValue().strip().lower() if self.buyFilter else '' 165 sellFilterValue = self.sellFilter.GetValue().strip().lower() if self.sellFilter else '' 166 filteredOutOrders = [0, 0] 167 for order in orders: 168 data = utillib.KeyVal() 169 data.label = '' 170 data.typeID = order.typeID 171 data.order = order 172 data.OnDblClick = self.ShowMarketDetilsForTypeInOrder 173 if evetypes.Exists(order.typeID): 174 data.showinfo = 1 175 if order.bid: 176 filterValue = buyFilterValue 177 selected = buySelected 178 visibleHeaders = visibleBHeaders 179 scrollList = bscrollList 180 else: 181 filterValue = sellFilterValue 182 selected = sellSelected 183 visibleHeaders = visibleSHeaders 184 scrollList = sscrollList 185 if filterValue and self.GetTypeNameLower(order.typeID).find(filterValue) < 0: 186 filteredOutOrders[order.bid] += 1 187 continue 188 if selected and selected[0].order.orderID == order.orderID: 189 data.isSelected = 1 190 for header in visibleHeaders: 191 header = StripTags(header, stripOnly=['localized']) 192 funcName = funcs.get(header, None) 193 if funcName == 'GetQuantity': 194 funcName = 'GetQuantitySlashVolume' 195 if funcName and hasattr(marketUtil, funcName): 196 getattr(marketUtil, funcName, None)(order, data) 197 else: 198 log.LogWarn('Unsupported header in record', header, order) 199 data.label += '###<t>' 200 201 data.label = data.label.rstrip('<t>') 202 scrollList.append(GetFromClass(OrderEntry, data)) 203 204 buyScrollTo = None 205 sellScrollTo = None 206 if refreshing: 207 if self.buyScroll: 208 buyScrollTo = self.buyScroll.GetScrollProportion() 209 if self.sellScroll: 210 sellScrollTo = self.sellScroll.GetScrollProportion() 211 if self.sellScroll: 212 filteredOutSell = filteredOutOrders[0] 213 self.sellScroll.Load(contentList=sscrollList, headers=sheaders, scrollTo=sellScrollTo, noContentHint=GetByLabel('UI/Market/Marketbase/NoOrdersMatched') if filteredOutSell else GetByLabel('UI/Market/Orders/NoOrdersFound')) 214 if self.buyScroll: 215 filteredOutBuy = filteredOutOrders[1] 216 self.buyScroll.Load(contentList=bscrollList, headers=bheaders, scrollTo=buyScrollTo, noContentHint=GetByLabel('UI/Market/Marketbase/NoOrdersMatched') if filteredOutBuy else GetByLabel('UI/Market/Orders/NoOrdersFound')) 217 218 @Memoize(10) 219 def GetTypeNameLower(self, typeID): 220 return evetypes.GetName(typeID).lower() 221 222 def UpdateOrderTotals(self, orders): 223 pass 224 225 def GetBuyHeaders(self): 226 return [GetByLabel('UI/Common/Type'), 227 GetByLabel('UI/Common/Quantity'), 228 GetByLabel('UI/Market/MarketQuote/headerPrice'), 229 GetByLabel('UI/Common/Station'), 230 GetByLabel('UI/Common/LocationTypes/Region'), 231 GetByLabel('UI/Common/Range'), 232 GetByLabel('UI/Market/MarketQuote/HeaderMinVolumn'), 233 GetByLabel('UI/Market/Marketbase/ExpiresIn')] 234 235 def GetSellHeaders(self): 236 return [GetByLabel('UI/Common/Type'), 237 GetByLabel('UI/Common/Quantity'), 238 GetByLabel('UI/Market/MarketQuote/headerPrice'), 239 GetByLabel('UI/Common/Station'), 240 GetByLabel('UI/Common/LocationTypes/Region'), 241 GetByLabel('UI/Market/Marketbase/ExpiresIn')] 242 243 def ShowMarketDetilsForTypeInOrder(self, order): 244 sm.StartService('marketutils').ShowMarketDetails(order.typeID, None) 245 246 247 class OrderEntry(Generic): 248 __guid__ = 'listentry.OrderEntry' 249 __nonpersistvars__ = [] 250 isDragObject = True 251 252 def GetMenu(self): 253 self.OnClick() 254 m = MenuList() 255 order = self.sr.node.order 256 if order.charID == session.charid: 257 m.append((MenuLabel('UI/Market/Orders/CancelOrder'), self.CancelOffer, (self.sr.node,))) 258 m.append((MenuLabel('UI/Market/Orders/ModifyOrder'), self.ModifyPrice, (self.sr.node,))) 259 m.append(None) 260 m += GetMenuService().GetMenuFromItemIDTypeID(None, order.typeID, includeMarketDetails=True) 261 m.append(None) 262 stationID = order.stationID 263 solarSystemID = order.solarSystemID 264 if should_show_location_info(order.typeID): 265 stationInfo = sm.GetService('ui').GetStationStaticInfo(stationID) 266 if stationInfo: 267 m.append(MenuEntryData(MenuLabel('UI/Common/Location'), subMenuData=GetMenuService().CelestialMenu(stationID, typeID=stationInfo.stationTypeID, parentID=stationInfo.solarSystemID, mapItem=None), texturePath=eveicon.location)) 268 else: 269 structureInfo = sm.GetService('structureDirectory').GetStructureInfo(stationID) 270 if structureInfo: 271 m.append(MenuEntryData(MenuLabel('UI/Common/Location'), subMenuData=GetMenuService().CelestialMenu(stationID, typeID=structureInfo.typeID, parentID=stationID), texturePath=eveicon.location)) 272 elif solarSystemID: 273 m += [(MenuLabel('UI/Common/SolarSystem'), GetMenuService().CelestialMenu(solarSystemID))] 274 return m 275 276 def GetDragData(self, *args): 277 order = self.sr.node.order 278 return [TypeDragData(typeID=order.typeID)] 279 280 def ShowInfo(self, *args): 281 sm.GetService('info').ShowInfo(self.sr.node.order.typeID) 282 283 def CancelOffer(self, node = None): 284 node = node if node != None else self.sr.node 285 sm.GetService('marketutils').CancelOffer(node.order) 286 287 def ModifyPrice(self, node = None): 288 node = node if node != None else self.sr.node 289 sm.GetService('marketutils').ModifyOrder(node.order)