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

activateMultiTraining.py (12232B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\activateMultiTraining.py
      2 import functools
      3 import math
      4 import blue
      5 import localization
      6 import uthread
      7 import carbonui.const as uiconst
      8 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      9 from carbonui.primitives.fill import Fill
     10 from carbonui.primitives.gradientSprite import GradientSprite
     11 from carbonui.primitives.line import Line
     12 from carbonui.primitives.sprite import Sprite
     13 from carbonui.control.button import Button
     14 from carbonui.util.color import Color
     15 from carbonui.control.window import Window
     16 from carbonui.uicore import uicore
     17 from eve.client.script.ui.control.eveLabel import EveLabelLargeBold, EveLabelMedium, EveLabelMediumBold
     18 from eve.common.lib import appConst as const
     19 from eveexceptions import UserError
     20 
     21 def ActivateMultiTraining(itemID = 0, tokens = None, charId = None, useHomeStation = False):
     22     wnd = ActivateMultiTrainingWindow.Open(itemID=0, tokens=tokens, charId=charId, useHomeStation=useHomeStation)
     23     if wnd and not wnd.destroyed:
     24         wnd.itemID = itemID
     25         wnd.tokens = tokens
     26         wnd.charId = charId
     27         wnd.useHomeStation = useHomeStation
     28     wnd.ModalPosition()
     29 
     30 
     31 class ActivateMultiTrainingWindow(Window):
     32     __guid__ = 'form.ActivateMultiTrainingWindow'
     33     default_width = 420
     34     default_heigt = 100
     35     default_windowID = 'ActivateMultiTrainingWindow'
     36     default_clipChildren = True
     37     default_isLightBackgroundConfigurable = False
     38     GRAY_COLOR = Color.GRAY5
     39     GREEN_COLOR = (0.0, 1.0, 0.0, 0.8)
     40     LINE_COLOR = (1, 1, 1, 0.2)
     41     WHITE_COLOR = Color.WHITE
     42     CONFIRM_DELAY = 3000
     43 
     44     def ApplyAttributes(self, attributes):
     45         Window.ApplyAttributes(self, attributes)
     46         self.itemID = attributes['itemID']
     47         self.tokens = attributes['tokens']
     48         self.useHomeStation = attributes['useHomeStation']
     49         self.expireDate1 = None
     50         self.expireDate2 = None
     51         self.numberOfDays = 30 * len(self.tokens) if self.tokens else 30
     52         self.reloading = False
     53         self.confirmed = False
     54         self.highlight = None
     55         self.charId = None
     56         self.Layout()
     57         self.Reload()
     58         uthread.new(self.UpdateTimersThread)
     59 
     60     def Layout(self):
     61         self.HideHeader()
     62         self.MakeUnResizeable()
     63         self.container = ContainerAutoSize(parent=self.GetMainArea(), align=uiconst.TOTOP, alignMode=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, padding=(15, 15, 15, 0), callback=self.OnContainerResized)
     64         EveLabelLargeBold(parent=self.container, align=uiconst.TOTOP, text=localization.GetByLabel('UI/ActivateMultiTraining/ActivateHeading'))
     65         EveLabelMedium(parent=self.container, align=uiconst.TOTOP, text=localization.GetByLabel('UI/ActivateMultiTraining/ActivateDescription', numberOfDays=self.numberOfDays), color=self.GRAY_COLOR, padding=(0, 5, 0, 10))
     66         Line(parent=self.container, align=uiconst.TOTOP, color=self.LINE_COLOR)
     67         slot1 = ContainerAutoSize(parent=self.container, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, bgColor=(0, 0, 0, 0.3))
     68         self.slot1Background = Fill(parent=slot1, color=self.GREEN_COLOR, opacity=0.0)
     69         self.slot1Title = EveLabelMediumBold(parent=slot1, align=uiconst.TOTOP, text='', padding=(60, 12, 140, 0), color=self.WHITE_COLOR)
     70         self.slot1Expiry = EveLabelMediumBold(parent=slot1, align=uiconst.TOTOP, text='', padding=(60, 0, 140, 10), color=self.GRAY_COLOR)
     71         self.slot1Button = Button(parent=slot1, label='', align=uiconst.CENTERRIGHT, fontsize=13, fixedwidth=120, fixedheight=30, pos=(10, 0, 0, 0))
     72         self.slot1Button.confirmHilite = GradientSprite(bgParent=self.slot1Button, rotation=-math.pi / 2, rgbData=[(0, self.GREEN_COLOR[:3])], alphaData=[(0, 0.5), (0.3, 0.2), (0.6, 0.14)], opacity=0.0)
     73         self.slot1Icon = Sprite(parent=slot1, texturePath='res:/UI/Texture/Icons/add_training_queue.png', align=uiconst.CENTERLEFT, pos=(15, 0, 32, 32))
     74         Line(parent=self.container, align=uiconst.TOTOP, color=self.LINE_COLOR)
     75         slot2 = ContainerAutoSize(parent=self.container, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, bgColor=(0, 0, 0, 0.3))
     76         self.slot2Background = Fill(parent=slot2, color=self.GREEN_COLOR, opacity=0.0)
     77         self.slot2Title = EveLabelMediumBold(parent=slot2, align=uiconst.TOTOP, text='', padding=(60, 12, 140, 0), color=self.WHITE_COLOR)
     78         self.slot2Expiry = EveLabelMediumBold(parent=slot2, align=uiconst.TOTOP, text='', padding=(60, 0, 140, 10), color=self.GRAY_COLOR)
     79         self.slot2Button = Button(parent=slot2, label='', align=uiconst.CENTERRIGHT, fontsize=13, fixedwidth=120, fixedheight=30, pos=(10, 0, 0, 0))
     80         self.slot2Button.confirmHilite = GradientSprite(bgParent=self.slot2Button, rotation=-math.pi / 2, rgbData=[(0, self.GREEN_COLOR[:3])], alphaData=[(0, 0.5), (0.3, 0.2), (0.6, 0.14)], opacity=0.0)
     81         self.slot2Icon = Sprite(parent=slot2, texturePath='res:/UI/Texture/Icons/add_training_queue.png', align=uiconst.CENTERLEFT, pos=(15, 0, 32, 32))
     82         Line(parent=self.container, align=uiconst.TOTOP, color=self.LINE_COLOR)
     83         self.closeButton = Button(parent=self.container, label=localization.GetByLabel('UI/Generic/Cancel'), func=self.Close, align=uiconst.TOTOP, fontsize=13, padding=(120, 10, 120, 30))
     84 
     85     def Reload(self, delay = 0, force = False):
     86         try:
     87             self.reloading = True
     88             blue.pyos.synchro.SleepWallclock(delay)
     89             if self.destroyed:
     90                 return
     91             queues = sm.RemoteSvc('userSvc').GetUpdatedMultiCharacterTraining(force)
     92             if len(queues) < 1:
     93                 self.expireDate1 = None
     94                 self.slot1Title.text = localization.GetByLabel('UI/ActivateMultiTraining/AdditionalQueueNotActive')
     95                 self.slot1Title.color = self.GRAY_COLOR
     96                 self.slot1Icon.opacity = 0.3
     97                 self.slot1Button.SetLabel(localization.GetByLabel('UI/ActivateMultiTraining/Activate'))
     98                 self.slot1Button.SetHint(localization.GetByLabel('UI/ActivateMultiTraining/ActivateHint', expiryDate=blue.os.GetWallclockTime() + self.numberOfDays * const.DAY))
     99                 self.slot1Button.func = functools.partial(self.OnConfirmButton, self.slot1Button, self.OnAddQueue, 2, None)
    100             if len(queues) < 2:
    101                 self.expireDate2 = None
    102                 self.slot2Title.text = localization.GetByLabel('UI/ActivateMultiTraining/AdditionalQueueNotActive')
    103                 self.slot2Title.color = self.GRAY_COLOR
    104                 self.slot2Icon.opacity = 0.3
    105                 self.slot2Button.SetLabel(localization.GetByLabel('UI/ActivateMultiTraining/Activate'))
    106                 self.slot2Button.SetHint(localization.GetByLabel('UI/ActivateMultiTraining/ActivateHint', expiryDate=blue.os.GetWallclockTime() + self.numberOfDays * const.DAY))
    107                 self.slot2Button.func = functools.partial(self.OnConfirmButton, self.slot2Button, self.OnAddQueue, 3, None)
    108             for index, (trainingID, trainingExpiry) in enumerate(sorted(queues)):
    109                 if index == 0:
    110                     self.expireDate1 = trainingExpiry
    111                     self.slot1Title.text = localization.GetByLabel('UI/ActivateMultiTraining/AdditionalQueueActive')
    112                     self.slot1Title.color = self.GREEN_COLOR
    113                     self.slot1Icon.opacity = 1.0
    114                     self.slot1Button.SetLabel(localization.GetByLabel('UI/ActivateMultiTraining/Extend'))
    115                     self.slot1Button.SetHint(localization.GetByLabel('UI/ActivateMultiTraining/ExtendHint', expiryDate=trainingExpiry + self.numberOfDays * const.DAY))
    116                     self.slot1Button.func = functools.partial(self.OnConfirmButton, self.slot1Button, self.OnAddQueue, 1, trainingID)
    117                 elif index == 1:
    118                     self.expireDate2 = trainingExpiry
    119                     self.slot2Title.text = localization.GetByLabel('UI/ActivateMultiTraining/AdditionalQueueActive')
    120                     self.slot2Title.color = self.GREEN_COLOR
    121                     self.slot2Icon.opacity = 1.0
    122                     self.slot2Button.SetLabel(localization.GetByLabel('UI/ActivateMultiTraining/Extend'))
    123                     self.slot2Button.SetHint(localization.GetByLabel('UI/ActivateMultiTraining/ExtendHint', expiryDate=trainingExpiry + self.numberOfDays * const.DAY))
    124                     self.slot2Button.func = functools.partial(self.OnConfirmButton, self.slot2Button, self.OnAddQueue, 2, trainingID)
    125 
    126             uicore.animations.FadeTo(self.slot1Button.confirmHilite, self.slot1Button.confirmHilite.opacity, 0.0, duration=0.3)
    127             uicore.animations.FadeTo(self.slot2Button.confirmHilite, self.slot2Button.confirmHilite.opacity, 0.0, duration=0.3)
    128             self.EnableButtons()
    129             if len(queues) == 0:
    130                 self.slot2Button.Disable()
    131             if self.confirmed:
    132                 self.slot1Button.state = uiconst.UI_HIDDEN
    133                 self.slot2Button.state = uiconst.UI_HIDDEN
    134                 self.closeButton.SetLabel(localization.GetByLabel('UI/Generic/OK'))
    135             else:
    136                 self.slot1Button.state = uiconst.UI_NORMAL
    137                 self.slot2Button.state = uiconst.UI_NORMAL
    138                 self.closeButton.SetLabel(localization.GetByLabel('UI/Generic/Cancel'))
    139             if self.highlight == 1:
    140                 uicore.animations.FadeTo(self.slot1Background, self.slot1Background.opacity, 0.1, duration=0.3)
    141                 self.closeButton.Blink(blinks=1)
    142                 self.highlight = None
    143             elif self.highlight == 2:
    144                 uicore.animations.FadeTo(self.slot2Background, self.slot2Background.opacity, 0.1, duration=0.3)
    145                 self.closeButton.Blink(blinks=1)
    146                 self.highlight = None
    147             self.UpdateTimers()
    148         finally:
    149             self.reloading = False
    150 
    151     def UpdateTimersThread(self):
    152         while not self.destroyed:
    153             blue.pyos.synchro.SleepWallclock(1000)
    154             self.UpdateTimers()
    155 
    156     def OnContainerResized(self):
    157         self.height = self.container.height
    158 
    159     def OnConfirmButton(self, button, *args):
    160         if not self.reloading:
    161             self.DisableButtons()
    162             button.Enable()
    163             button.func = functools.partial(*args[:-1])
    164             button.SetLabel(localization.GetByLabel('UI/ActivateMultiTraining/Confirm'))
    165             uicore.animations.FadeTo(button.confirmHilite, button.confirmHilite.opacity, 1.0, duration=0.3)
    166             self.Reload(self.CONFIRM_DELAY)
    167 
    168     def OnAddQueue(self, slot, trainingID, button):
    169         if not self.confirmed:
    170             self.confirmed = True
    171             self.highlight = slot
    172             self.Reload()
    173             try:
    174                 if self.tokens:
    175                     sm.RemoteSvc('userSvc').ActivateSoulboundMultiTraining(self.charId, self.tokens, trainingID=trainingID, useHomeStation=self.useHomeStation)
    176                 else:
    177                     sm.RemoteSvc('userSvc').ActivateMultiTraining(self.itemID, trainingID=trainingID)
    178                 self.Reload(force=True)
    179             except UserError:
    180                 self.Close()
    181                 raise
    182 
    183     def UpdateTimers(self):
    184         if self.expireDate1:
    185             timeRemaining = localization.formatters.FormatTimeIntervalShortWritten(self.expireDate1 - blue.os.GetWallclockTime(), showFrom='day', showTo='second')
    186             self.slot1Expiry.text = localization.GetByLabel('UI/ActivateMultiTraining/Ends', timeRemaining=timeRemaining)
    187         else:
    188             self.slot1Expiry.text = ''
    189         if self.expireDate2:
    190             timeRemaining = localization.formatters.FormatTimeIntervalShortWritten(self.expireDate2 - blue.os.GetWallclockTime(), showFrom='day', showTo='second')
    191             self.slot2Expiry.text = localization.GetByLabel('UI/ActivateMultiTraining/Ends', timeRemaining=timeRemaining)
    192         else:
    193             self.slot2Expiry.text = ''
    194 
    195     def DisableButtons(self):
    196         self.slot1Button.Disable()
    197         self.slot2Button.Disable()
    198 
    199     def EnableButtons(self):
    200         self.slot1Button.Enable()
    201         self.slot2Button.Enable()