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()