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

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)