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

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)