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]