resourceController.py (17863B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\resourceController.py 2 import blue 3 import carbonui.const as uiconst 4 import evetypes 5 import localization 6 import uthread 7 from carbon.client.script.environment.AudioUtil import PlaySound 8 from carbon.common.script.sys.serviceConst import ROLE_GML 9 from carbonui.primitives.container import Container 10 from carbonui.primitives.containerAutoSize import ContainerAutoSize 11 from carbonui.primitives.fill import Fill 12 from carbonui.primitives.line import Line 13 from carbonui.primitives.sprite import Sprite 14 from carbonui.primitives.transform import Transform 15 from carbonui.uicore import uicore 16 from carbonui.util.various_unsorted import SortListOfTuples 17 from eve.client.script.ui.control import eveIcon, eveLabel 18 from eve.client.script.ui.control.gauge import Gauge 19 from eve.client.script.ui.shared.planet import planetCommon 20 from eve.common.lib import appConst as const 21 from inventorycommon import typeHelpers 22 from localization import GetByLabel 23 24 class ResourceController(ContainerAutoSize): 25 __notifyevents__ = [] 26 default_name = 'ResourceController' 27 default_align = uiconst.TOTOP 28 default_state = uiconst.UI_HIDDEN 29 30 def ApplyAttributes(self, attributes): 31 ContainerAutoSize.ApplyAttributes(self, attributes) 32 self.CreateLayout() 33 sm.RegisterNotify(self) 34 35 def CreateLayout(self): 36 legend = ResourceLegend(parent=self) 37 planetUI = sm.GetService('planetUI') 38 self.resourceList = ResourceList(parent=self) 39 planetObject = sm.GetService('planetSvc').GetPlanet(planetUI.planetID) 40 resourceInfo = planetObject.remoteHandler.GetPlanetResourceInfo() 41 sortedList = [] 42 for typeID, quality in resourceInfo.iteritems(): 43 name = evetypes.GetName(typeID) 44 sortedList.append((name, (typeID, quality))) 45 46 sortedList = SortListOfTuples(sortedList) 47 for typeID, quality in sortedList: 48 qualityRemapped = quality / const.MAX_DISPLAY_QUALITY 49 self.resourceList.AddItem(typeID, quality=max(0, min(1.0, qualityRemapped))) 50 51 def StopLoadingResources(self, resourceTypeID): 52 self.resourceList.StopLoading(resourceTypeID) 53 54 def StartLoadingResources(self): 55 self.resourceList.StartLoading() 56 57 def ResourceSelected(self, resourceTypeID): 58 for item in self.resourceList.children: 59 if item.typeID == resourceTypeID: 60 self.resourceList.SelectItem(item) 61 62 def EnterSurveyMode(self): 63 self.resourceList.SetOpacity(0.5) 64 self.resourceList.state = uiconst.UI_DISABLED 65 66 def ExitSurveyMode(self): 67 self.resourceList.SetOpacity(1) 68 self.resourceList.state = uiconst.UI_PICKCHILDREN 69 70 71 class ResourceLegend(Container): 72 default_name = 'ResourceLegend' 73 default_align = uiconst.TOTOP 74 default_height = 30 75 default_state = uiconst.UI_PICKCHILDREN 76 LINE_COLOR = (1, 1, 1, 0.5) 77 RAMP_HEIGHT = 8 78 HEIGHT = 4 79 ADJUSTER_WIDTH = 16 80 MIN_COLOR_RANGE = 26 81 LEGENDWIDTH = 240 82 83 def ApplyAttributes(self, attributes): 84 Container.ApplyAttributes(self, attributes) 85 self.leftSpacerMaxWidth = self.ADJUSTER_WIDTH + self.LEGENDWIDTH - self.MIN_COLOR_RANGE 86 self.CreateLayout() 87 88 def CreateLayout(self): 89 scale = Container(name='scale', parent=self, align=uiconst.TOTOP, pos=(0, 90 0, 91 0, 92 self.HEIGHT), padding=(4, 2, 4, -4)) 93 Line(name='scaleBase', parent=scale, align=uiconst.TOTOP, color=self.LINE_COLOR) 94 Line(name='leftTick', parent=scale, align=uiconst.TOLEFT, color=self.LINE_COLOR) 95 Line(name='rightTick', parent=scale, align=uiconst.TORIGHT, color=self.LINE_COLOR) 96 Line(name='centerTick', parent=scale, align=uiconst.RELATIVE, color=self.LINE_COLOR, pos=(self.LEGENDWIDTH / 2, 97 1, 98 1, 99 self.HEIGHT)) 100 for x in (0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9): 101 left = int(self.LEGENDWIDTH * x) 102 Line(name='miniorTick_%f' % x, parent=scale, align=uiconst.RELATIVE, color=self.LINE_COLOR, pos=(left, 103 1, 104 1, 105 self.HEIGHT / 2)) 106 107 self.legendContainer = Container(parent=self, name='colorFilterContainer', align=uiconst.TOTOP, statestate=uiconst.UI_PICKCHILDREN, pos=(0, 108 8, 109 self.LEGENDWIDTH + 2 * self.ADJUSTER_WIDTH, 110 self.ADJUSTER_WIDTH)) 111 self.leftSpacer = Container(parent=self.legendContainer, name='leftSpacer', align=uiconst.TOLEFT, pos=(0, 112 0, 113 self.ADJUSTER_WIDTH, 114 self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN) 115 self.centerSpacer = Container(parent=self.legendContainer, name='centerSpacer', align=uiconst.TOLEFT, pos=(0, 116 0, 117 self.LEGENDWIDTH, 118 self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN) 119 self.rightSpacer = Container(parent=self.legendContainer, name='rightSpacer', align=uiconst.TOLEFT, pos=(0, 120 0, 121 self.ADJUSTER_WIDTH, 122 self.ADJUSTER_WIDTH), state=uiconst.UI_PICKCHILDREN) 123 adjusterMin = eveIcon.Icon(iname='leftAdjuster', icon='ui_73_16_185', parent=self.leftSpacer, align=uiconst.TORIGHT, pos=(0, 124 0, 125 self.ADJUSTER_WIDTH - 2, 126 self.ADJUSTER_WIDTH), state=uiconst.UI_NORMAL, hint=localization.GetByLabel('UI/PI/Common/ResourcesMinimumVisibleHint'), color=(1, 1, 1, 0.5)) 127 adjusterMax = eveIcon.Icon(name='rightAdjuster', icon='ui_73_16_186', parent=self.rightSpacer, align=uiconst.TOLEFT, pos=(0, 128 0, 129 self.ADJUSTER_WIDTH - 2, 130 self.ADJUSTER_WIDTH), state=uiconst.UI_NORMAL, hint=localization.GetByLabel('UI/PI/Common/ResourcesMaximumVisibleHint'), color=(1, 1, 1, 0.5)) 131 adjusterMin.OnMouseDown = (self.OnAdjustMouseDown, adjusterMin) 132 adjusterMin.OnMouseUp = (self.OnAdjustMouseUp, adjusterMin) 133 adjusterMin.OnMouseMove = (self.OnAdjustMouseMove, adjusterMin) 134 adjusterMin.OnMouseEnter = (self.OnAdjusterMouseEnter, adjusterMin) 135 adjusterMin.OnMouseExit = (self.OnAdjusterMouseExit, adjusterMin) 136 adjusterMax.OnMouseDown = (self.OnAdjustMouseDown, adjusterMax) 137 adjusterMax.OnMouseUp = (self.OnAdjustMouseUp, adjusterMax) 138 adjusterMax.OnMouseMove = (self.OnAdjustMouseMove, adjusterMax) 139 adjusterMax.OnMouseEnter = (self.OnAdjusterMouseEnter, adjusterMax) 140 adjusterMax.OnMouseExit = (self.OnAdjusterMouseExit, adjusterMax) 141 colorRamp = Sprite(name='ColorRamp', parent=self.centerSpacer, texturePath='res:/dx9/model/worldobject/planet/resource_colorramp.dds', color=(1, 1, 1, 0.75), padding=(0, 4, 0, 4), state=uiconst.UI_NORMAL, align=uiconst.TOALL) 142 colorRamp.OnMouseDown = (self.OnAdjustMouseDown, colorRamp) 143 colorRamp.OnMouseUp = (self.OnAdjustMouseUp, colorRamp) 144 colorRamp.OnMouseMove = (self.OnMoveRange, colorRamp) 145 low, hi = sm.GetService('planetUI').GetResourceDisplayRange() 146 scalar = self.LEGENDWIDTH - 1 147 self.leftSpacer.width = int(low * scalar) + self.ADJUSTER_WIDTH 148 self.centerSpacer.width = int((hi - low) * scalar) 149 150 def OnAdjusterMouseEnter(self, adjuster, *args): 151 adjuster.SetRGBA(1, 1, 1, 0.75) 152 PlaySound(uiconst.SOUND_ENTRY_HOVER) 153 154 def OnAdjusterMouseExit(self, adjuster, *args): 155 adjuster.SetRGBA(1, 1, 1, 0.5) 156 157 def OnAdjustMouseDown(self, adjuster, button): 158 if button == 0: 159 adjuster.dragging = True 160 161 def OnAdjustMouseUp(self, adjuster, button): 162 if button == 0: 163 adjuster.dragging = False 164 165 def OnAdjustMouseMove(self, adjuster, *args): 166 if getattr(adjuster, 'dragging', False) and uicore.uilib.leftbtn: 167 if adjuster.name.startswith('right'): 168 self.centerSpacer.width += uicore.uilib.dx 169 position = self.centerSpacer.width + self.leftSpacer.width - self.ADJUSTER_WIDTH 170 if position > self.LEGENDWIDTH - self.ADJUSTER_WIDTH: 171 self.centerSpacer.width = self.LEGENDWIDTH - self.leftSpacer.width 172 elif position > self.LEGENDWIDTH: 173 self.centerSpacer.width = self.LEGENDWIDTH - (self.leftSpacer.width - self.ADJUSTER_WIDTH) 174 elif self.centerSpacer.width < self.MIN_COLOR_RANGE: 175 self.centerSpacer.width = self.MIN_COLOR_RANGE 176 else: 177 width = self.leftSpacer.width 178 dx = uicore.uilib.dx 179 if self.centerSpacer.width - uicore.uilib.dx < self.MIN_COLOR_RANGE: 180 dx = self.centerSpacer.width - self.MIN_COLOR_RANGE 181 width += dx 182 if width < self.ADJUSTER_WIDTH: 183 width = self.ADJUSTER_WIDTH 184 elif width > self.leftSpacerMaxWidth: 185 width = self.leftSpacerMaxWidth 186 dx = width - self.leftSpacer.width 187 self.leftSpacer.width = width 188 self.centerSpacer.width -= dx 189 self.UpdateColorRamp() 190 191 def OnMoveRange(self, adjuster, *args): 192 if getattr(adjuster, 'dragging', False): 193 self.leftSpacer.width += uicore.uilib.dx 194 position = self.centerSpacer.width + self.leftSpacer.width - self.ADJUSTER_WIDTH 195 if position > self.LEGENDWIDTH - self.ADJUSTER_WIDTH: 196 self.leftSpacer.width = self.LEGENDWIDTH - self.centerSpacer.width 197 elif position > self.LEGENDWIDTH: 198 self.leftSpacer.width = self.LEGENDWIDTH - (self.centerSpacer.width - self.ADJUSTER_WIDTH) 199 elif self.leftSpacer.width < self.ADJUSTER_WIDTH: 200 self.leftSpacer.width = self.ADJUSTER_WIDTH 201 self.UpdateColorRamp() 202 203 def UpdateColorRamp(self): 204 low = self.leftSpacer.width - self.ADJUSTER_WIDTH 205 hi = low + self.centerSpacer.width 206 sm.GetService('planetUI').SetResourceDisplayRange(low / float(self.LEGENDWIDTH - 1), hi / float(self.LEGENDWIDTH - 1)) 207 208 209 class ResourceNameLabel(eveLabel.EveLabelMedium): 210 211 def ApplyAttributes(self, attributes): 212 eveLabel.EveLabelMedium.ApplyAttributes(self, attributes) 213 self.toolTipTextWidthThreshold = attributes.get('toolTipTextWidthThreshold', 0) 214 self.SetRightAlphaFade(self.toolTipTextWidthThreshold, maxFadeWidth=10) 215 216 217 class ResourceList(ContainerAutoSize): 218 default_name = 'ResourceList' 219 default_align = uiconst.TOTOP 220 default_state = uiconst.UI_PICKCHILDREN 221 222 def ApplyAttributes(self, attributes): 223 ContainerAutoSize.ApplyAttributes(self, attributes) 224 self.AddItem(None) 225 226 def AddItem(self, typeID, quality = None): 227 ResourceListItem(parent=self, typeID=typeID, quality=quality) 228 229 def ClearItems(self): 230 self.children.Clear() 231 232 def SelectItem(self, selectedItem): 233 for item in self.children: 234 if item != selectedItem: 235 item.Deselect() 236 else: 237 item.Select() 238 239 def StopLoading(self, typeID): 240 item = self.GetItemByType(typeID) 241 item.StopLoading() 242 243 def GetItemByType(self, typeID): 244 for item in self.children: 245 if item.typeID == typeID: 246 return item 247 248 def GetSelected(self): 249 for item in self.children: 250 if item.selected: 251 return item 252 253 254 class ResourceListItem(Container): 255 ITEM_HEIGHT = 28 256 SELECT_BLOCK_PADDING = 1 257 LEVEL_COLOR = (0.85, 0.85, 0.85, 1) 258 LEVEL_BG_COLOR = (0.85, 0.85, 0.85, 0.25) 259 LEVEL_WIDTH = 112 260 LEVEL_HEIGHT = 10 261 LEVEL_LEFT = 150 262 SELECT_FILL_COLOR = (1.0, 1.0, 1.0, 0.25) 263 HOVER_FILL_COLOR = (1.0, 1.0, 1.0, 0.25) 264 EMPTY_COLOR = (1, 1, 1, 0) 265 ICON_SIZE = 24 266 ICON_LEFT = 0 267 default_name = 'ResourceListItem' 268 default_left = 0 269 default_top = 0 270 default_width = 0 271 default_height = ITEM_HEIGHT 272 default_align = uiconst.TOTOP 273 default_state = uiconst.UI_NORMAL 274 default_typeID = None 275 default_selected = False 276 default_quality = None 277 278 def ApplyAttributes(self, attributes): 279 Container.ApplyAttributes(self, attributes) 280 self.typeID = attributes.get('typeID', self.default_typeID) 281 self.quality = attributes.get('quality', self.default_quality) 282 if self.typeID is None: 283 self.selected = True 284 else: 285 self.selected = False 286 self.CreateLayout() 287 288 def CreateLayout(self): 289 if self.typeID is None: 290 text = localization.GetByLabel('UI/PI/Common/NoFilter') 291 self.icon = None 292 self.loadingIcon = None 293 else: 294 self.icon = eveIcon.Icon(parent=self, align=uiconst.CENTERLEFT, pos=(0, 295 0, 296 self.ICON_SIZE, 297 self.ICON_SIZE), state=uiconst.UI_DISABLED, ignoreSize=True, typeID=self.typeID, size=self.ICON_SIZE) 298 text = evetypes.GetName(self.typeID) 299 self.loadingIcon = Transform(parent=self, align=uiconst.CENTERLEFT, pos=(0, 300 0, 301 self.ICON_SIZE, 302 self.ICON_SIZE), state=uiconst.UI_HIDDEN) 303 load = eveIcon.Icon(icon='ui_77_32_13', parent=self.loadingIcon, IgnoreSize=True, pos=(0, 304 0, 305 self.ICON_SIZE, 306 self.ICON_SIZE), align=uiconst.CENTER) 307 self.container = Container(parent=self, name='mainContainer', align=uiconst.TOALL, state=uiconst.UI_DISABLED) 308 self.resourceName = ResourceNameLabel(text=text, parent=self, left=6 + (self.ICON_SIZE if self.typeID is not None else 0), top=0, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, toolTipTextWidthThreshold=105) 309 if self.typeID is not None: 310 self.ConstructQualityGauge() 311 self.selectBlock = Fill(parent=self, name='selectBlock', state=uiconst.UI_DISABLED, align=uiconst.TOALL, padding=(0, 312 self.SELECT_BLOCK_PADDING, 313 0, 314 self.SELECT_BLOCK_PADDING), color=self.SELECT_FILL_COLOR if self.selected else self.EMPTY_COLOR) 315 316 def ConstructQualityGauge(self): 317 if self.quality is not None: 318 gauge = Gauge(parent=self, pos=(0, 319 0, 320 self.LEVEL_WIDTH, 321 self.LEVEL_HEIGHT), align=uiconst.CENTERRIGHT, state=uiconst.UI_DISABLED, gaugeHeight=self.LEVEL_HEIGHT, value=self.quality) 322 gauge.ShowMarkers([ i * 0.1 for i in xrange(1, 10) ], color=(0.0, 0.0, 0.0, 0.2)) 323 324 def OnMouseEnter(self, *args): 325 if not self.selected: 326 PlaySound(uiconst.SOUND_ENTRY_HOVER) 327 self.selectBlock.SetRGBA(*self.HOVER_FILL_COLOR) 328 329 def OnMouseExit(self, *args): 330 if not self.selected: 331 self.selectBlock.SetRGBA(*self.EMPTY_COLOR) 332 333 def OnClick(self, *args): 334 sm.GetService('audio').SendUIEvent('msg_pi_scanning_switch_play') 335 selected = self.parent.GetSelected() 336 if selected == self: 337 return 338 PlaySound(uiconst.SOUND_ENTRY_SELECT) 339 self.parent.SelectItem(self) 340 sm.GetService('planetUI').ShowResource(self.typeID) 341 342 def Select(self): 343 self.selectBlock.SetRGBA(*self.SELECT_FILL_COLOR) 344 if self.loadingIcon: 345 self.loadingIcon.state = uiconst.UI_DISABLED 346 self.icon.state = uiconst.UI_HIDDEN 347 uthread.new(self.loadingIcon.StartRotationCycle, 1.0, 4000.0) 348 self.selected = True 349 350 def Deselect(self): 351 self.selectBlock.SetRGBA(*self.EMPTY_COLOR) 352 self.selected = False 353 354 def StopLoading(self): 355 if self.loadingIcon: 356 self.loadingIcon.StopRotationCycle() 357 self.loadingIcon.state = uiconst.UI_HIDDEN 358 self.icon.state = uiconst.UI_DISABLED 359 360 def GetMenu(self): 361 if self.typeID is None: 362 return [] 363 ret = sm.GetService('menu').GetMenuFromItemIDTypeID(None, self.typeID, includeMarketDetails=True) 364 if session.role & ROLE_GML == ROLE_GML: 365 ret.append(('PI: GM / WM Extras', self.GetGMMenu())) 366 return ret 367 368 def LoadTooltipPanel(self, tooltipPanel, *args): 369 if not self.typeID: 370 return 371 tooltipPanel.LoadGeneric2ColumnTemplate() 372 tooltipPanel.AddLabelMedium(colSpan=2, text=planetCommon.GetProductNameAndTier(self.typeID)) 373 text = GetByLabel('UI/PI/Common/ResourceDensity', density=int(100 * self.quality)) 374 tooltipPanel.AddLabelMedium(colSpan=2, text=text) 375 tooltipPanel.AddLabelMedium(colSpan=2, cellPadding=(0, 10, 0, 2), text=GetByLabel('UI/InfoWindow/TabNames/RequiredFor')) 376 for typeID in planetCommon.GetRequiredForItems(self.typeID): 377 label = planetCommon.GetProductNameAndTier(typeID) 378 icon = typeHelpers.GetIconFile(typeID) 379 tooltipPanel.AddIconLabel(icon=icon, label=label, iconSize=28) 380 381 def GetTooltipPointer(self): 382 return uiconst.POINT_LEFT_2 383 384 def GetGMMenu(self): 385 ret = [] 386 ret.append(('Copy typeID', self.CopyTypeID)) 387 ret.append(('Show resource details: current server version', sm.GetService('planetUI').GMShowResource, (self.typeID, 'current'))) 388 ret.append(('Show resource details: current player version', sm.GetService('planetUI').GMShowResource, (self.typeID, 'player'))) 389 ret.append(('Show resource details: base layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'base'))) 390 ret.append(('Show resource details: depletion layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'depletion'))) 391 ret.append(('Show resource details: Nugget layer', sm.GetService('planetUI').GMShowResource, (self.typeID, 'nuggets'))) 392 ret.append(None) 393 ret.append(('Create nugget layer', sm.GetService('planetUI').GMCreateNuggetLayer, (self.typeID,))) 394 return ret 395 396 def CopyTypeID(self): 397 blue.pyos.SetClipboardData(str(self.typeID))