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

moonminingEventsCont.py (9847B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\structure\structureBrowser\moonminingEventsCont.py
      2 import gametime
      3 import log
      4 from carbon.common.script.util.commonutils import StripTags
      5 from carbon.common.script.util.format import FmtDate
      6 from carbon.common.script.util.linkUtil import GetShowInfoLink
      7 from carbonui.primitives.container import Container
      8 import carbonui.const as uiconst
      9 from carbonui.util.bunch import Bunch
     10 from eve.client.script.ui.control.baseListEntry import BaseListEntryCustomColumns
     11 from eve.client.script.ui.control.eveLabel import EveLabelLarge, Label
     12 from eve.client.script.ui.control.eveScroll import Scroll
     13 from eve.client.script.ui.control.itemIcon import ItemIcon
     14 from eve.client.script.ui.control.scrollUtil import TabFinder
     15 from carbonui.fontconst import EVE_MEDIUM_FONTSIZE
     16 from eve.client.script.ui.moonmining import DAY_NAME_TEXT
     17 from eve.client.script.ui.shared.fitting.fittingUtil import EatSignalChangingErrors
     18 from eve.client.script.ui.structure.structureBrowser import browserUIConst
     19 from eveservices.menu import GetMenuService
     20 from localization import GetByLabel
     21 import blue
     22 from carbonui.uicore import uicore
     23 from localization.formatters import FormatTimeIntervalShortWritten
     24 from signals.signalUtil import ChangeSignalConnect
     25 
     26 class MoonminingEventsCont(Container):
     27     default_name = 'MoonminingEventsCont'
     28     TAB_ID = 'MOONMINING'
     29 
     30     def ApplyAttributes(self, attributes):
     31         Container.ApplyAttributes(self, attributes)
     32         self.allStructuresProfileController = sm.GetService('structureControllers').GetAllStructuresProfileController()
     33         self.structureBrowserController = attributes.structureBrowserController
     34         self.myStructureControllersByID = {x.GetItemID():x for x in self.structureBrowserController.GetMyStructures()}
     35         self.isInitialized = False
     36         self.ChangeSignalConnection()
     37 
     38     def ChangeSignalConnection(self, connect = True):
     39         signalAndCallback = [(self.structureBrowserController.on_profile_selected, self.OnProfileSelected)]
     40         ChangeSignalConnect(signalAndCallback, connect)
     41 
     42     def OnProfileSelected(self, profileID):
     43         if self.structureBrowserController.GetSelectedTab() == self.TAB_ID:
     44             self.LoadProfile(profileID)
     45 
     46     def LoadProfile(self, profileID):
     47         self.UpdateScroll()
     48 
     49     def OnTabSelect(self):
     50         self.structureBrowserController.SetTabSelected(self.TAB_ID)
     51         self.LoadPanel()
     52 
     53     def LoadPanel(self):
     54         if self.isInitialized:
     55             self.UpdateScroll()
     56             return
     57         self.topPanel = Container(name='topPanel', parent=self, align=uiconst.TOTOP, height=20, padding=(0, 6, 0, 6))
     58         self.profilaNameLabel = EveLabelLarge(text='', parent=self.topPanel, state=uiconst.UI_DISABLED, align=uiconst.TOPLEFT, top=2)
     59         self.scroll = Scroll(parent=self, id='MyStructuresScroll')
     60         self.scroll.multiSelect = False
     61         self.scroll.GetTabStops = self.GetTabStops
     62         self.UpdateScroll()
     63         self.isInitialized = True
     64 
     65     def GetTabStops(self, headertabs, idx = None):
     66         return TabFinder().GetTabStops(self.scroll.sr.nodes, headertabs, MoonminingEntry, idx=idx)
     67 
     68     def UpdateScroll(self):
     69         if self.structureBrowserController.GetSelectedTab() != self.TAB_ID:
     70             return
     71         self.SetLabelProfileName()
     72         scrollList = self.GetScrollList()
     73         self.scroll.LoadContent(contentList=scrollList, headers=MoonminingEntry.GetHeaders(), noContentHint=GetByLabel('UI/Structures/Browser/NoExtractionsFound'))
     74 
     75     def SetLabelProfileName(self):
     76         currentProfileID = self.structureBrowserController.GetSelectedProfileID()
     77         c = self.allStructuresProfileController.GetSlimProfileController(currentProfileID)
     78         self.profilaNameLabel.text = c.GetProfileName() if c else ''
     79 
     80     def GetScrollList(self):
     81         extractions = sm.GetService('scheduling').GetExtractionsForCorp()
     82         scrollList = []
     83         toPrime = {x.structureID for x in extractions}
     84         toPrime.update({x.solarSystemID for x in extractions})
     85         cfg.evelocations.Prime(toPrime)
     86         for eachExtraction in extractions:
     87             structureController = self.myStructureControllersByID.get(eachExtraction.structureID, None)
     88             if structureController is None:
     89                 log.LogWarn('missing structure controller for structure %s' % eachExtraction.structureID)
     90                 continue
     91             if self.IsFilteredOut(structureController):
     92                 continue
     93             timerText, timeUntil = self.FmtTimeAndTimeUntil(eachExtraction.chunkAvailableTime)
     94             node = Bunch(numJumps=structureController.GetNumJumps(), structureName=structureController.GetName(), timerText=timerText, timeUntil=timeUntil, secText=structureController.GetSecurityWithColor(), secValue=structureController.GetSecurity(), structureID=eachExtraction.structureID, structureTypeID=structureController.GetTypeID(), chunkAvailableTime=eachExtraction.chunkAvailableTime, moonID=eachExtraction.moonID, decoClass=MoonminingEntry, GetSortValue=MoonminingEntry.GetSortValue)
     95             node.columnSortValues = MoonminingEntry.GetColumnSortValues(node)
     96             scrollList.append(node)
     97 
     98         return scrollList
     99 
    100     def IsFilteredOut(self, structureController):
    101         currentProfileID = self.structureBrowserController.GetSelectedProfileID()
    102         if currentProfileID != browserUIConst.ALL_PROFILES and currentProfileID != structureController.GetProfileID():
    103             return True
    104         return False
    105 
    106     def FmtTimeAndTimeUntil(self, timestamp):
    107         now = gametime.GetWallclockTimeNow()
    108         weekday = GetWeekdayTextForTimestamp(timestamp)
    109         timeText = '%s<br>%s' % (weekday, FmtDate(timestamp))
    110         diff = max(0, timestamp - now)
    111         timeUntil = FormatTimeIntervalShortWritten(diff)
    112         return (timeText, timeUntil)
    113 
    114     def Close(self):
    115         with EatSignalChangingErrors(errorMsg='MoonminingEventsCont'):
    116             self.ChangeSignalConnection(connect=False)
    117         Container.Close(self)
    118 
    119 
    120 HEIGHT = 48
    121 LABEL_PARAMS = (EVE_MEDIUM_FONTSIZE, 0, 0)
    122 
    123 class MoonminingEntry(BaseListEntryCustomColumns):
    124 
    125     def ApplyAttributes(self, attributes):
    126         BaseListEntryCustomColumns.ApplyAttributes(self, attributes)
    127         self.BuildUI()
    128 
    129     def BuildUI(self):
    130         self.jumpColumnLabel = self.AddCenteredTextColumn()
    131         self.securityColumn = self.AddCenteredTextColumn()
    132         self.nameColumn = self.AddColumnContainer()
    133         self.timerText = self.AddCenteredTextColumn()
    134         self.countdownText = self.AddCenteredTextColumn()
    135         self.LoadUI()
    136 
    137     def AddCenteredTextColumn(self, text = None):
    138         column = self.AddColumnContainer()
    139         return Label(parent=column, text=text, align=uiconst.CENTER)
    140 
    141     def LoadUI(self):
    142         self.PopulateLabels()
    143         self.PopulateNameColumn()
    144 
    145     def PopulateLabels(self):
    146         node = self.sr.node
    147         self.jumpColumnLabel.text = node.numJumps
    148         self.securityColumn.text = node.secText
    149         self.timerText.text = node.timerText
    150         self.countdownText.text = node.timeUntil
    151 
    152     def PopulateNameColumn(self):
    153         node = self.sr.node
    154         self.nameColumn.Flush()
    155         name = node.structureName
    156         size = HEIGHT - 4
    157         ItemIcon(parent=self.nameColumn, align=uiconst.CENTERLEFT, typeID=node.structureTypeID, width=size, height=size, state=uiconst.UI_DISABLED)
    158         label = Label(parent=self.nameColumn, text=name, align=uiconst.CENTERLEFT, left=HEIGHT, state=uiconst.UI_NORMAL)
    159         label.GetMenu = None
    160         label.DelegateEventsNotImplemented(self)
    161 
    162     def GetMenu(self):
    163         node = self.sr.node
    164         itemID = node.structureID
    165         typeID = node.structureTypeID
    166         return GetMenuService().GetMenuFromItemIDTypeID(itemID=itemID, typeID=typeID)
    167 
    168     @staticmethod
    169     def GetHeaders():
    170         return (GetByLabel('UI/Common/Jumps'),
    171          GetByLabel('UI/Common/Security'),
    172          GetByLabel('UI/Common/Name'),
    173          'Time',
    174          'Time Until')
    175 
    176     @staticmethod
    177     def GetDynamicHeight(node, width):
    178         return HEIGHT
    179 
    180     @staticmethod
    181     def GetColWidths(node, idx = None):
    182         widths = []
    183         getAllWidths = idx is None
    184         if getAllWidths or idx == 0:
    185             jumpText = unicode(node.numJumps)
    186             w = FindColumnWidth(jumpText)
    187             widths.append(w)
    188         if getAllWidths or idx == 1:
    189             securityText = unicode(node.secText)
    190             w = FindColumnWidth(securityText)
    191             widths.append(w)
    192         if getAllWidths or idx == 3:
    193             nameToUse = max(StripTags(node.structureName, ignoredTags=('br',)).split('<br>'), key=len)
    194             w = FindColumnWidth(nameToUse)
    195             widths.append(w + HEIGHT - 4)
    196         if getAllWidths or idx == 4:
    197             textToUse = max(StripTags(node.timerText, ignoredTags=('br',)).split('<br>'), key=len)
    198             w = FindColumnWidth(textToUse)
    199             widths.append(w)
    200         if getAllWidths or idx == 5:
    201             w = FindColumnWidth(node.timeUntil)
    202             widths.append(w)
    203         return widths
    204 
    205     @staticmethod
    206     def GetColumnSortValues(node):
    207         return (node.numJumps,
    208          node.secValue,
    209          StripTags(node.structureName).lower(),
    210          node.chunkAvailableTime,
    211          -node.chunkAvailableTime)
    212 
    213     @staticmethod
    214     def GetSortValue(node, by, sortDirection, idx):
    215         return (node.columnSortValues[idx],) + tuple(node.columnSortValues)
    216 
    217 
    218 def FindColumnWidth(text):
    219     stringsData = (text,) + LABEL_PARAMS
    220     tabStops = uicore.font.MeasureTabstops([stringsData])
    221     return tabStops[0]
    222 
    223 
    224 def GetWeekdayTextForTimestamp(timestamp):
    225     year, month, wd, day, hour, min, sec, ms = blue.os.GetTimeParts(timestamp)
    226     return DAY_NAME_TEXT[wd]