technologyViewUtils.py (18035B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\login\charcreation\technologyViewUtils.py 2 from carbon.client.script.environment.AudioUtil import PlaySound 3 import carbonui.const as uiconst 4 from carbonui.primitives.container import Container 5 from carbonui.primitives.frame import Frame 6 from carbonui.primitives.gradientSprite import GradientSprite 7 from carbonui.primitives.sprite import Sprite 8 from carbonui.uicore import uicore 9 from charactercreator.client.empireSelectionData import GetEmpireColor, GetEmpireButtonLogo, GetEmpireLogo 10 from charactercreator.client.scalingUtils import GetScaleFactor 11 from carbonui.control.buttonIcon import ButtonIcon 12 from eve.client.script.ui.control.eveLabel import EveLabelMediumBold, EveLabelSmall 13 from eve.client.script.ui.login.charcreation import ccUtil 14 from eve.client.script.ui.login.charcreation.charCreationButtons import EmpireTab, EmpireTabAnimationType 15 from eve.client.script.ui.login.charcreation.charCreationButtons import EMPIRE_TAB_ICON_SIZE, EMPIRE_ICON_PAD 16 from eve.client.script.ui.login.charcreation.charCreationButtons import GetEmpireTabSizeLarge 17 from eve.common.lib import appConst 18 from eve.common.lib.appConst import raceAmarr, raceGallente, raceCaldari, raceMinmatar 19 import math 20 from uthread2 import start_tasklet 21 from characterdata.races import CHARACTER_CREATION_RACE_IDS 22 TECH_EXAMPLE_BUTTON_TEXT_HEIGHT = 30 23 ARROW_TEXTURE = 'res:/UI/Texture/Classes/EmpireSelection/navArrow_Up.png' 24 ARROW_TEXTURE_OVER = 'res:/UI/Texture/Classes/EmpireSelection/navArrow_Over.png' 25 ARROW_TEXTURE_DOWN = 'res:/UI/Texture/Classes/EmpireSelection/navArrow_Down.png' 26 ARROW_BUTTON_UP_TEXTURE = 'res:/UI/Texture/Shared/sideButton_Up.png' 27 ARROW_BUTTON_DOWN_TEXTURE = 'res:/UI/Texture/Shared/sideButton_Down.png' 28 ARROW_BUTTON_OVER_TEXTURE = 'res:/UI/Texture/Shared/sideButton_Over.png' 29 LINE_DECORATION = 'res:/UI/Texture/classes/EmpireSelection/lineDeco.png' 30 LINE_DECORATION_WIDTH = 58 31 LINE_DECORATION_HEIGHT = 3 32 LINE_DECORATION_COLOR = (1.0, 1.0, 1.0) 33 LINE_DECORATION_OPACITY = 0.5 34 LINE_DECORATION_CORNERSIZE = 1 35 LINE_DECORATION_GRADIENT_WIDTH = 370 36 LINE_DECORATION_GRADIENT_HEIGHT = 1 37 LINE_DECORATION_GRADIENT_OPACITY = 0.25 38 ICON_FRAME_CORNER_SIZE = 6 39 ICON_BG_COLOR = (0.4, 0.4, 0.4, 1.0) 40 ICON_FRAME_COLOR = (1.0, 1.0, 1.0, 1.0) 41 ICON_PADDING = (10, 10, 10, 10) 42 TECH_NAV_BUTTON_SIZE_LARGE = 44 43 TECH_NAV_BUTTON_SIZE_SMALL = 32 44 TECH_NAV_BUTTON_FONTSIZE = 9 45 TECH_NAV_ARROW_SIZE = 24.25 46 TECH_NAV_ARROW_ICON_SIZE = 24.25 47 TECH_NAV_ARROW_SPACE_SIZE = 17 48 EMPIRE_TABS_ANIMATION_MSECS = 100 49 FORCE_TERMINATE_ANIMATION_SECS = 0.2 50 51 def GetTechNavButtonSizeLarge(): 52 return TECH_NAV_BUTTON_SIZE_LARGE * GetScaleFactor() 53 54 55 def GetTechNavButtonSizeSmall(): 56 return TECH_NAV_BUTTON_SIZE_SMALL * GetScaleFactor() 57 58 59 def GetTechNavButtonFontsize(): 60 return TECH_NAV_BUTTON_FONTSIZE * GetScaleFactor() 61 62 63 def GetTechNavArrowSize(): 64 return TECH_NAV_ARROW_SIZE * GetScaleFactor() 65 66 67 def GetTechNavArrowIconSize(): 68 return TECH_NAV_ARROW_ICON_SIZE * GetScaleFactor() 69 70 71 def GetTechNavArrowSpacingSize(): 72 return TECH_NAV_ARROW_SPACE_SIZE * GetScaleFactor() 73 74 75 def GetEmpireColorWithOpacity(raceID, opacity): 76 r, g, b, a = GetEmpireColor(raceID) 77 return (r, 78 g, 79 b, 80 opacity) 81 82 83 class EmpireButton(ButtonIcon): 84 default_mouseUpBGTexture = None 85 default_mouseEnterBGTexture = None 86 default_mouseDownBGTexture = None 87 default_isBGFrameUsed = None 88 default_frameOffset = 0 89 default_frameCornerSize = 0 90 91 def ApplyAttributes(self, attributes): 92 raceID = attributes.Get('raceID', None) 93 raceSetter = attributes.Get('raceSetter', None) 94 ButtonIcon.ApplyAttributes(self, attributes) 95 self.OnClick = lambda raceID = raceID: raceSetter(raceID=raceID) 96 97 98 class EmpireNavigation(Container): 99 SELECTION_SOUND_BY_RACE = {raceAmarr: 'ui_es_button_mouse_down_amarr_play', 100 raceCaldari: 'ui_es_button_mouse_down_caldari_play', 101 raceGallente: 'ui_es_button_mouse_down_gallente_play', 102 raceMinmatar: 'ui_es_button_mouse_down_minmatar_play'} 103 HOVER_SOUND = 'ui_es_small_banner_mouse_over_play' 104 105 def ApplyAttributes(self, attributes): 106 self.raceSetter = attributes.Get('raceSetter', None) 107 self.activeRace = attributes.Get('activeRace', None) 108 self.audioSvc = sm.GetService('audio') 109 Container.ApplyAttributes(self, attributes) 110 self.tabs = [] 111 tabSizeLarge = GetEmpireTabSizeLarge() 112 empireButtonsWrapper = Container(name='empireButtonsWrapper', parent=self, align=uiconst.CENTER, width=4 * tabSizeLarge, height=tabSizeLarge) 113 for raceID in CHARACTER_CREATION_RACE_IDS: 114 isActive = raceID == self.activeRace 115 factionID = appConst.factionByRace[raceID] 116 isDisabled = ccUtil.IsFactionSelectionDisabled(factionID) 117 raceTab = EmpireTab(name='empireTab_%d' % raceID, parent=empireButtonsWrapper, align=uiconst.TOLEFT, width=tabSizeLarge, height=tabSizeLarge, raceID=raceID, raceSetter=self.OnTabRaceSelected, raceHoverer=self.OnTabRaceHovered, iconColor=GetEmpireColor(raceID), iconSize=EMPIRE_TAB_ICON_SIZE * GetScaleFactor(), texturePath=GetEmpireButtonLogo(raceID), empireLogoPath=GetEmpireLogo(raceID), isActive=isActive, isDisabled=isDisabled) 118 isNotLastTab = len(self.tabs) < len(CHARACTER_CREATION_RACE_IDS) 119 if isNotLastTab: 120 raceTab.padRight = EMPIRE_ICON_PAD * GetScaleFactor() 121 self.tabs.append(raceTab) 122 123 def Close(self): 124 super(EmpireNavigation, self).Close() 125 126 def OnTabRaceSelected(self, raceID): 127 self.NotifyTabsOfRaceChange(raceID) 128 129 def OnTabRaceHovered(self, raceID): 130 self.NotifyTabsOfRaceHover(raceID) 131 132 def NotifyTabsOfRaceChange(self, raceID): 133 animation = {} 134 for tab in self.tabs: 135 if tab.raceID == raceID: 136 animation[tab.raceID] = EmpireTabAnimationType.ACTIVATE 137 else: 138 animation[tab.raceID] = EmpireTabAnimationType.DEACTIVATE 139 140 self.ProcessAnimation(animation) 141 142 def NotifyTabsOfRaceHover(self, raceID): 143 animation = {} 144 for tab in self.tabs: 145 if tab.raceID == raceID: 146 animation[tab.raceID] = EmpireTabAnimationType.HOVER 147 else: 148 animation[tab.raceID] = EmpireTabAnimationType.DEHOVER 149 150 self.ProcessAnimation(animation) 151 152 def ProcessAnimation(self, animation): 153 for tab in self.tabs: 154 raceID = tab.raceID 155 if raceID in animation: 156 animationType = animation[raceID] 157 if animationType == EmpireTabAnimationType.ACTIVATE: 158 self.activeRace = raceID 159 tab.Activate() 160 start_tasklet(self.raceSetter, raceID) 161 self.PlaySelectSound(raceID) 162 elif animationType == EmpireTabAnimationType.DEACTIVATE: 163 tab.Deactivate() 164 elif animationType == EmpireTabAnimationType.HOVER: 165 if self.activeRace != raceID: 166 tab.Hover() 167 self.PlayHoverSound() 168 elif animationType == EmpireTabAnimationType.DEHOVER: 169 if self.activeRace != raceID: 170 tab.Dehover() 171 172 def PlaySelectSound(self, raceID): 173 self.audioSvc.SendUIEvent(self.SELECTION_SOUND_BY_RACE[raceID]) 174 175 def PlayHoverSound(self): 176 self.audioSvc.SendUIEvent(self.HOVER_SOUND) 177 178 179 class RacialArrowButton(ButtonIcon): 180 default_iconSize = TECH_NAV_ARROW_SIZE 181 default_isHoverBGUsed = False 182 default_texturePath = ARROW_TEXTURE 183 default_iconColor = (1.0, 1.0, 1.0, 1.0) 184 185 def ApplyAttributes(self, attributes): 186 ButtonIcon.ApplyAttributes(self, attributes) 187 188 189 class ArrowTechButton(RacialArrowButton): 190 191 def ApplyAttributes(self, attributes): 192 super(ArrowTechButton, self).ApplyAttributes(attributes) 193 self.order = attributes.Get('order', None) 194 self.techSetter = attributes.Get('techSetter', None) 195 self.func = lambda order = self.order: self.techSetter(techOrder=order) 196 197 198 class ArrowBackButton(RacialArrowButton): 199 200 def ApplyAttributes(self, attributes): 201 super(ArrowBackButton, self).ApplyAttributes(attributes) 202 self.func = uicore.layer.charactercreation.controller.Back 203 204 205 class TechExampleButton(Container): 206 OPACITY_ACTIVE = 0.9 207 OPACITY_BG_ACTIVE = 0.0 208 DEFAULT_OPACITY = 0.7 209 OPACITY_ON_ENTER = 1.0 210 DEFAULT_BG_OPACITY = 0.0 211 OPACITY_BG_ON_ENTER = 0.5 212 DEFAULT_IMAGE_OPACITY = 0.3 213 IMAGE_OPACITY_ACTIVE = 0.9 214 GRADIENT_COLOR = (0.5, 0.5, 0.5) 215 GRADIENT_OPACITY = 0.3 216 217 def ApplyAttributes(self, attributes): 218 self.order = attributes.Get('order', None) 219 self.techExampleSetter = attributes.Get('techExampleSetter', None) 220 raceID = attributes.Get('raceID', None) 221 techExample = attributes.Get('techExample', None) 222 iconSize = attributes.Get('iconSize', 0) 223 padIconToText = attributes.Get('padIconToText', 0) 224 attributes.bgColor = GetEmpireColorWithOpacity(raceID=raceID, opacity=self.DEFAULT_BG_OPACITY) 225 attributes.opacity = self.DEFAULT_OPACITY 226 Container.ApplyAttributes(self, attributes) 227 icon = techExample.GetIcon(raceID) 228 self._AddFrame() 229 self._AddGradient() 230 self._AddIcon(icon, iconSize) 231 title = techExample.GetTitle(raceID) 232 subtitle = techExample.GetSubtitle(raceID) 233 padLeft = iconSize + padIconToText 234 self._AddText(title, subtitle, padLeft) 235 self.active = False 236 237 def _AddFrame(self): 238 iconNo = 7 239 cornerSize = -2 240 offset = 0 241 self.frame = Frame(parent=self, color=(1.0, 1.0, 1.0, 1.0), frameConst=('res://UI/Texture/classes/CharacterSelection/EmpireSelection2017/leftCornerFrame.png', 242 iconNo, 243 cornerSize, 244 offset), opacity=0.0) 245 246 def _AddGradient(self): 247 self.gradient = GradientSprite(name='techExampleButtonGradient', bgParent=self, rgbData=((0, self.GRADIENT_COLOR),), alphaData=[(0.0, 1.0), (1.0, 0.0)], opacity=0.0) 248 249 def _AddIcon(self, icon, iconSize): 250 self.iconContainer = Container(name='techExampleButtonIconContainer', parent=self, align=uiconst.TOLEFT, width=iconSize, height=iconSize, bgColor=ICON_BG_COLOR, padding=ICON_PADDING) 251 Frame(parent=self.iconContainer, color=ICON_FRAME_COLOR, cornerSize=ICON_FRAME_CORNER_SIZE) 252 self.icon = Sprite(name='techExampleButtonIcon', parent=self.iconContainer, align=uiconst.TOLEFT, width=iconSize, height=iconSize, texturePath=icon) 253 254 def _AddText(self, title, subtitle, padLeft): 255 textContainer = Container(name='techExampleButtonTextContainer', parent=self, align=uiconst.CENTERLEFT, width=self.width - padLeft, height=TECH_EXAMPLE_BUTTON_TEXT_HEIGHT, left=padLeft + ICON_FRAME_CORNER_SIZE) 256 self.titleLabel = EveLabelMediumBold(name='techExampleButtonTitle', parent=textContainer, align=uiconst.TOPLEFT, text=title) 257 self.subtitleLabel = EveLabelSmall(name='techExampleButtonSubtitle', parent=textContainer, align=uiconst.BOTTOMLEFT, text=subtitle.upper()) 258 259 def OnMouseEnter(self, *args): 260 PlaySound(uiconst.SOUND_BUTTON_HOVER) 261 self.icon.OnMouseEnter() 262 uicore.animations.FadeTo(self, self.opacity, self.OPACITY_ON_ENTER, duration=0.15) 263 uicore.animations.FadeTo(self.bgFill, self.bgFill.opacity, self.OPACITY_BG_ON_ENTER, duration=0.15) 264 265 def OnMouseExit(self, *args): 266 self.icon.OnMouseExit() 267 opacity = self.OPACITY_ACTIVE if self.active else self.DEFAULT_OPACITY 268 opacityBg = self.OPACITY_BG_ACTIVE if self.active else self.DEFAULT_BG_OPACITY 269 uicore.animations.FadeTo(self, self.opacity, opacity, duration=0.3, callback=self.UpdateOpacity) 270 uicore.animations.FadeTo(self.bgFill, self.bgFill.opacity, opacityBg, duration=0.3, callback=self.UpdateBgOpacity) 271 272 def OnClick(self): 273 PlaySound(uiconst.SOUND_BUTTON_CLICK) 274 self.techExampleSetter(order=self.order) 275 276 def SetActive(self): 277 self.active = True 278 self.UpdateOpacity() 279 self.UpdateBgOpacity() 280 self.subtitleLabel.Show() 281 self.titleLabel.align = uiconst.TOPLEFT 282 283 def SetInactive(self): 284 self.active = False 285 self.UpdateOpacity() 286 self.UpdateBgOpacity() 287 self.subtitleLabel.Hide() 288 self.titleLabel.align = uiconst.CENTERLEFT 289 290 def UpdateOpacity(self): 291 if self.active: 292 self.opacity = self.OPACITY_ACTIVE 293 self.iconContainer.opacity = self.IMAGE_OPACITY_ACTIVE 294 self.frame.opacity = 1.0 295 self.gradient.opacity = self.GRADIENT_OPACITY 296 else: 297 self.opacity = self.DEFAULT_OPACITY 298 self.iconContainer.opacity = self.DEFAULT_IMAGE_OPACITY 299 self.frame.opacity = 0.0 300 self.gradient.opacity = 0.0 301 302 def UpdateBgOpacity(self): 303 self.bgFill.opacity = self.OPACITY_BG_ACTIVE if self.active else self.DEFAULT_BG_OPACITY 304 305 306 class LineDecoration(Container): 307 default_lineWidth = LINE_DECORATION_GRADIENT_WIDTH 308 default_lineDecorationWidth = LINE_DECORATION_WIDTH 309 default_lineColor = LINE_DECORATION_COLOR 310 311 def ApplyAttributes(self, attributes): 312 Container.ApplyAttributes(self, attributes) 313 invert = attributes.Get('invert', False) 314 lineWidth = attributes.Get('lineWidth', self.default_lineWidth) 315 lineDecorationWidth = attributes.Get('lineDecorationWidth', self.default_lineDecorationWidth) 316 lineColor = attributes.Get('lineColor', self.default_lineColor) or self.default_lineColor 317 self.lineGradientContainer = Container(name='lineGradientContainer', align=uiconst.TOTOP, parent=self, width=lineWidth, height=LINE_DECORATION_GRADIENT_HEIGHT, padTop=LINE_DECORATION_HEIGHT if invert else 0) 318 self.line = GradientSprite(name='line', width=lineWidth, height=LINE_DECORATION_GRADIENT_HEIGHT, align=uiconst.CENTER, parent=self.lineGradientContainer, rgbData=((0.0, lineColor),), alphaData=((0.0, 0.0), (0.5, 0.5), (1.0, 0.0)), rotation=0, opacity=LINE_DECORATION_GRADIENT_OPACITY) 319 self.deco = Frame(name='lineDeco', align=uiconst.CENTERTOP, parent=self, width=lineDecorationWidth, height=LINE_DECORATION_HEIGHT if invert else LINE_DECORATION_HEIGHT + LINE_DECORATION_GRADIENT_HEIGHT, texturePath=LINE_DECORATION, cornerSize=LINE_DECORATION_CORNERSIZE, opacity=LINE_DECORATION_OPACITY, padTop=0 if invert else LINE_DECORATION_GRADIENT_HEIGHT, rotation=math.pi if invert else 0, color=lineColor) 320 321 def ResizeContents(self, lineWidth, lineDecorationWidth): 322 self.lineGradientContainer.width = lineWidth 323 self.line.width = lineWidth 324 self.deco.width = lineDecorationWidth 325 326 327 class VerticalLineDecoration(Container): 328 default_lineHeight = LINE_DECORATION_GRADIENT_WIDTH 329 default_lineDecorationHeight = LINE_DECORATION_WIDTH 330 default_lineColor = LINE_DECORATION_COLOR 331 332 def ApplyAttributes(self, attributes): 333 Container.ApplyAttributes(self, attributes) 334 invert = attributes.Get('invert', False) 335 lineHeight = attributes.Get('lineHeight', self.default_lineHeight) 336 lineDecorationHeight = attributes.Get('lineDecorationHeight', self.default_lineDecorationHeight) 337 lineColor = attributes.Get('lineColor', self.default_lineColor) or self.default_lineColor 338 lineGradientContainer = Container(name='lineGradientContainer', align=uiconst.TOLEFT, parent=self, width=LINE_DECORATION_GRADIENT_HEIGHT, height=lineDecorationHeight, padLeft=LINE_DECORATION_HEIGHT if invert else 0) 339 GradientSprite(name='line', width=LINE_DECORATION_GRADIENT_HEIGHT, height=lineHeight, align=uiconst.CENTER, parent=lineGradientContainer, rgbData=((0.0, lineColor),), alphaData=((0.0, 0.0), (0.5, 0.5), (1.0, 0.0)), rotation=math.pi / 2, opacity=LINE_DECORATION_GRADIENT_OPACITY) 340 Frame(name='lineDeco', align=uiconst.CENTERLEFT, parent=self, width=LINE_DECORATION_HEIGHT if invert else LINE_DECORATION_HEIGHT + LINE_DECORATION_GRADIENT_HEIGHT, height=lineDecorationHeight, texturePath=LINE_DECORATION, cornerSize=0, opacity=LINE_DECORATION_OPACITY, padLeft=0 if invert else LINE_DECORATION_GRADIENT_HEIGHT, rotation=3 * math.pi / 2 if invert else math.pi / 2, color=lineColor) 341 342 343 class TechNavigationButton(Container): 344 default_state = uiconst.UI_NORMAL 345 ACTIVATION_DURATION = 1.0 346 DEACTIVATION_DURATION = 1.0 347 INACTIVE_OPACITY = 0.25 348 MOUSEOVER_OPACITY = 0.5 349 ACTIVE_OPACITY = 1.0 350 MOUSEOVER_SOUND = 'ui_icc_button_mouse_over_play' 351 SELECT_SOUND = 'ui_icc_button_select_play' 352 353 def ApplyAttributes(self, attributes): 354 Container.ApplyAttributes(self, attributes) 355 self.isActive = attributes.isActive 356 self.techSetter = attributes.techSetter 357 self.raceID = attributes.raceID 358 self.order = attributes.order 359 iconRotation = attributes.Get('rotation', 0.0) 360 iconTexture = attributes.iconTexture 361 iconSize = attributes.iconSize 362 iconOpacity = self.ACTIVE_OPACITY if self.isActive else self.INACTIVE_OPACITY 363 self.icon = Sprite(name='techNavigationButtonIcon', parent=self, align=uiconst.CENTER, texturePath=iconTexture, width=iconSize, height=iconSize, opacity=iconOpacity, state=uiconst.UI_DISABLED, rotation=iconRotation) 364 365 def OnMouseEnter(self, *args): 366 if not self.isActive: 367 self.icon.SetAlpha(self.MOUSEOVER_OPACITY) 368 if self.MOUSEOVER_SOUND: 369 sm.StartService('audio').SendUIEvent(unicode(self.MOUSEOVER_SOUND)) 370 371 def OnMouseExit(self, *args): 372 if not self.isActive: 373 self.icon.SetAlpha(self.INACTIVE_OPACITY) 374 375 def OnMouseDown(self, *args): 376 self.icon.SetAlpha(self.ACTIVE_OPACITY) 377 if self.SELECT_SOUND: 378 sm.StartService('audio').SendUIEvent(unicode(self.SELECT_SOUND)) 379 380 def OnClick(self): 381 self.techSetter(self.order)