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

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