blueprintEntry.py (12156B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\industry\blueprintEntry.py 2 from evePathfinder.core import IsUnreachableJumpCount 3 from carbonui.const import TOALL, UI_DISABLED 4 from menu import MenuLabel 5 from carbonui.primitives.container import Container 6 from carbonui.primitives.gradientSprite import GradientSprite 7 from carbonui.util.color import Color 8 from eve.client.script.ui.control.baseListEntry import BaseListEntryCustomColumns 9 from eve.client.script.ui.control.eveLabel import Label 10 from eve.client.script.ui.control.itemIcon import ItemIcon 11 from eve.client.script.ui.shared.industry import industryUIConst, GetTypeName, GetActivitySum 12 from eve.client.script.ui.shared.industry.views.containersMETE import ContainerTE, ContainerME 13 import industry 14 import localization 15 import carbonui.const as uiconst 16 from eve.client.script.ui.shared.industry.industryUIConst import ACTIVITY_ICONS_SMALL, ACTIVITY_NAMES, VIEWMODE_ICONLIST, VIEWMODE_LIST 17 from carbonui.primitives.sprite import Sprite 18 import eve.client.script.ui.util.uix as uix 19 from carbonui.control.buttonIcon import ButtonIcon 20 import telemetry 21 from carbonui.uicore import uicore 22 from eveservices.menu import GetMenuService 23 24 class BlueprintEntry(BaseListEntryCustomColumns): 25 default_name = 'BlueprintEntry' 26 27 def ApplyAttributes(self, attributes): 28 BaseListEntryCustomColumns.ApplyAttributes(self, attributes) 29 self.bpData = self.node.bpData 30 self.item = self.node.item 31 self.activityCallback = self.node.activityCallback 32 self.activityButtons = [] 33 self.itemIcon = None 34 self.viewMode = self.node.viewMode 35 self.AddColumnBlueprintLabel() 36 self.AddColumnMaterialEfficiency() 37 self.AddColumnTimeEfficiency() 38 self.AddColumnRunsRemaining() 39 self.columnActivities = self.AddColumnActivities() 40 if self.node.showFacility: 41 self.AddColumnJumps() 42 self.AddColumnText(self.bpData.GetFacilityName()) 43 if self.node.showLocation: 44 self.AddColumnText(self.bpData.GetLocationName()) 45 self.AddColumnText(self.bpData.GetGroupName()) 46 self.AddColumnText(self.bpData.GetAvailabilityText()) 47 self.OnJobStateChanged() 48 49 def OnJobStateChanged(self, status = None): 50 if status: 51 isInstalled = industry.STATUS_UNSUBMITTED < status < industry.STATUS_COMPLETED 52 if status in (industry.STATUS_INSTALLED, industry.STATUS_DELIVERED): 53 self.AnimFlash(Color.WHITE) 54 else: 55 isInstalled = self.bpData.IsInstalled() 56 isImpounded = self.bpData.IsImpounded() 57 disabled = isImpounded or isInstalled 58 if isInstalled: 59 opacity = 0.15 60 elif isImpounded: 61 opacity = 0.3 62 else: 63 opacity = 1.0 64 for col in self.columns: 65 col.opacity = opacity 66 67 if disabled: 68 self.columnActivities.Disable() 69 else: 70 self.columnActivities.Enable() 71 72 def AnimFlash(self, color): 73 width = 500 74 flashCont = Container(parent=self, idx=0, align=uiconst.TOPLEFT, width=width, height=self.height) 75 flashGradient = GradientSprite(bgParent=flashCont, rgbData=[(0, color[:3])], alphaData=[(0, 0.0), (0.9, 0.4), (1.0, 0.0)]) 76 arrows = Sprite(parent=flashCont, align=uiconst.CENTERLEFT, texturePath='res:/UI/Texture/Classes/Industry/CenterBar/arrows.png', pos=(0, 77 0, 78 375, 79 self.height), color=color, opacity=0.15, tileX=True) 80 duration = self.width / 600.0 81 uicore.animations.MorphScalar(flashCont, 'left', -width, self.width + width, duration=duration, curveType=uiconst.ANIM_LINEAR) 82 uicore.animations.FadeTo(flashCont, 0.0, 1.0, duration=duration, callback=flashCont.Close, curveType=uiconst.ANIM_WAVE) 83 84 @staticmethod 85 def GetDynamicHeight(node, width): 86 if node.viewMode == VIEWMODE_ICONLIST: 87 return 36 88 else: 89 return 22 90 91 def AddColumnRunsRemaining(self): 92 runsRemaining = self.bpData.runsRemaining 93 if runsRemaining != -1: 94 self.AddColumnText('%s' % runsRemaining) 95 else: 96 col = self.AddColumnContainer() 97 Sprite(name='infinityIcon', parent=col, align=uiconst.CENTERLEFT, pos=(6, 0, 11, 6), texturePath='res:/UI/Texture/Classes/Industry/infinity.png', opacity=Label.default_color[3]) 98 99 def AddColumnJumps(self): 100 jumps = self.node.jumps 101 if not IsUnreachableJumpCount(jumps): 102 self.AddColumnText(jumps) 103 else: 104 col = self.AddColumnContainer() 105 Sprite(name='infinityIcon', parent=col, align=uiconst.CENTERLEFT, pos=(6, 0, 11, 6), texturePath='res:/UI/Texture/Classes/Industry/infinity.png', opacity=Label.default_color[3]) 106 107 def AddColumnBlueprintLabel(self): 108 col = self.AddColumnContainer() 109 if self.viewMode == VIEWMODE_LIST: 110 texturePath, hint = uix.GetTechLevelIconPathAndHint(self.bpData.blueprintTypeID) 111 if texturePath: 112 techIconSize = 16 if self.viewMode == VIEWMODE_ICONLIST else 12 113 Sprite(name='techIcon', parent=col, texturePath=texturePath, hint=hint, width=techIconSize, height=techIconSize) 114 if self.viewMode == VIEWMODE_ICONLIST: 115 iconSize = 32 116 self.itemIcon = ItemIcon(parent=col, typeID=self.bpData.blueprintTypeID, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, width=iconSize, bpData=self.bpData, height=iconSize, left=2) 117 else: 118 iconSize = 0 119 Label(parent=col, text=self.bpData.GetLabel(), align=uiconst.CENTERLEFT, left=iconSize + 4, idx=0) 120 121 def _AddColumnMETE(self, cls, value): 122 col = self.AddColumnContainer() 123 opacity = 0.5 if not value else 1.0 124 isCompact = self.viewMode != VIEWMODE_ICONLIST 125 gauge = cls(parent=col, align=TOALL, state=UI_DISABLED, padding=(3, 2, 3, 6), opacity=opacity, showBG=False, isCompact=isCompact) 126 gauge.SetValue(value) 127 128 def AddColumnMaterialEfficiency(self): 129 value = self.bpData.materialEfficiency 130 cls = ContainerME 131 self._AddColumnMETE(cls, value) 132 133 def AddColumnTimeEfficiency(self): 134 value = self.bpData.timeEfficiency 135 cls = ContainerTE 136 self._AddColumnMETE(cls, value) 137 138 def AddColumnActivities(self): 139 col = self.AddColumnContainer() 140 ICONSIZE = 20 if self.viewMode == VIEWMODE_ICONLIST else 14 141 for i, activityID in enumerate(industry.ACTIVITIES): 142 isEnabled = activityID in self.bpData.activities.keys() 143 hint = ACTIVITY_NAMES.get(activityID) if isEnabled else 'UI/Industry/ActivityNotAvailable' 144 opacity = 1.0 145 if isEnabled and not (self.bpData.facility and self.bpData.facility.CanDoActivity(activityID, self.bpData.productTypeID)): 146 opacity = 0.4 147 btn = ActivityButtonIcon(parent=col, align=uiconst.CENTERLEFT, pos=(6 + i * (ICONSIZE + 4), 148 0, 149 ICONSIZE + 4, 150 ICONSIZE + 4), texturePath=ACTIVITY_ICONS_SMALL[activityID], iconSize=ICONSIZE, func=self.OnActivityBtn, args=(activityID, self.bpData), hint=localization.GetByLabel(hint), isHoverBGUsed=False, colorSelected=industryUIConst.GetActivityColor(activityID), iconEnabledOpacity=opacity) 151 self.activityButtons.append(btn) 152 if not isEnabled: 153 btn.Disable(0.05) 154 155 return col 156 157 def OnActivityBtn(self, activityID, bpData): 158 self.activityCallback(self.bpData, activityID) 159 160 def GetMenu(self): 161 m = GetMenuService().GetMenuFromItemIDTypeID(self.bpData.blueprintID, self.bpData.blueprintTypeID, includeMarketDetails=True, invItem=self.item) 162 label = MenuLabel('UI/Industry/Facility') 163 m.append((label, GetMenuService().CelestialMenu(itemID=self.bpData.facilityID))) 164 return m 165 166 @staticmethod 167 def GetDefaultColumnWidth(): 168 return {localization.GetByLabel('UI/Industry/Blueprint'): 230, 169 localization.GetByLabel('UI/Industry/MaterialEfficiency'): 80, 170 localization.GetByLabel('UI/Industry/TimeEfficiency'): 80, 171 localization.GetByLabel('UI/Industry/Facility'): 200} 172 173 @staticmethod 174 def GetFixedColumns(viewMode): 175 if viewMode == VIEWMODE_ICONLIST: 176 return {localization.GetByLabel('UI/Industry/Activities'): 157} 177 else: 178 return {localization.GetByLabel('UI/Industry/Activities'): 120} 179 180 @staticmethod 181 def GetHeaders(showFacility = True, showLocation = True, showImpounded = False): 182 ret = [localization.GetByLabel('UI/Industry/Blueprint'), 183 localization.GetByLabel('UI/Industry/MaterialEfficiency'), 184 localization.GetByLabel('UI/Industry/TimeEfficiency'), 185 localization.GetByLabel('UI/Industry/RunsRemaining'), 186 localization.GetByLabel('UI/Industry/Activities')] 187 if showFacility: 188 ret.extend((localization.GetByLabel('UI/Common/Jumps'), localization.GetByLabel('UI/Industry/Facility'))) 189 if showLocation: 190 ret.append(localization.GetByLabel('UI/Industry/InventoryLocation')) 191 ret.append(localization.GetByLabel('UI/Common/Group')) 192 if showImpounded: 193 ret.append(localization.GetByLabel('UI/ScienceAndIndustry/ScienceAndIndustryWindow/Availability')) 194 return ret 195 196 @staticmethod 197 @telemetry.ZONE_METHOD 198 def GetColumnSortValues(bpData, jumps = None, showFacility = True, showLocation = True): 199 activitySum = GetActivitySum(bpData.activities.keys()) 200 typeName = GetTypeName(bpData.blueprintTypeID) 201 ret = [typeName.lower(), 202 bpData.materialEfficiency, 203 bpData.timeEfficiency, 204 bpData.runsRemaining, 205 activitySum] 206 if showFacility: 207 facilityName = bpData.GetFacilityName() 208 if facilityName: 209 facilityName = facilityName.lower() 210 ret.extend((jumps, facilityName)) 211 if showLocation: 212 ret.append(bpData.GetLocationName()) 213 ret.append(bpData.GetGroupName()) 214 ret.append(bpData.GetAvailabilityText()) 215 return ret 216 217 @telemetry.ZONE_METHOD 218 def OnActivitySelected(self, itemID, activityID): 219 for btn in self.activityButtons: 220 if self.bpData.blueprintID == itemID and btn.activityID == activityID: 221 btn.SetSelected() 222 else: 223 btn.SetDeselected() 224 225 def GetDragData(self): 226 ret = [] 227 nodes = self.sr.node.scroll.GetSelectedNodes(self.sr.node) 228 for node in nodes: 229 ret.append(node.bpData.GetDragData()) 230 231 return ret 232 233 def OnDblClick(self, *args): 234 sm.ScatterEvent('OnBlueprintEntryDblClicked') 235 236 def OnMouseEnter(self, *args): 237 BaseListEntryCustomColumns.OnMouseEnter(self, *args) 238 if self.itemIcon: 239 self.itemIcon.OnMouseEnter() 240 241 def OnMouseExit(self, *args): 242 BaseListEntryCustomColumns.OnMouseExit(self, *args) 243 if self.itemIcon: 244 self.itemIcon.OnMouseExit() 245 246 @classmethod 247 def GetCopyData(cls, node): 248 bpData = node.bpData 249 labelList = [bpData.GetLabel(), 250 unicode(bpData.materialEfficiency), 251 unicode(bpData.timeEfficiency), 252 unicode(bpData.runsRemaining)] 253 if node.showFacility: 254 labelList += [unicode(node.jumps), bpData.GetFacilityName()] 255 if node.showLocation: 256 labelList += [bpData.GetLocationName()] 257 labelList += [bpData.GetGroupName()] 258 return '\t'.join(labelList) 259 260 261 class ActivityButtonIcon(ButtonIcon): 262 263 def ApplyAttributes(self, attributes): 264 ButtonIcon.ApplyAttributes(self, attributes) 265 if self.isActive: 266 self.Enable() 267 self.activityID, self.bpData = attributes.args 268 269 def OnDblClick(self, *args): 270 if uicore.uilib.Key(uiconst.VK_SHIFT): 271 job = sm.GetService('industrySvc').CreateJob(self.bpData, self.activityID, self.bpData.facilityID) 272 sm.GetService('industrySvc').InstallJob(job)