omegaUpsellWindow.py (11713B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\omega\upsell\omegaUpsellWindow.py 2 import logging 3 import math 4 import uthread2 5 from carbonui import Align, PickState, uiconst 6 from carbonui.primitives.container import Container 7 from carbonui.primitives.fill import Fill 8 from carbonui.primitives.gradientSprite import GradientSprite 9 from carbonui.primitives.sprite import Sprite 10 from carbonui.uianimations import animations 11 from carbonui.uiconst import OutputMode 12 from eve.client.script.ui import eveColor 13 from eve.client.script.ui.control.eveLoadingWheel import LoadingWheel 14 from eve.client.script.ui.omega.upsell import omegaUpsellSignals 15 from eve.client.script.ui.omega.upsell.components.clone_state_indicator import CloneStateIndicator 16 from eve.client.script.ui.omega.upsell.components.omega_header import OmegaHeader 17 from eve.client.script.ui.omega.upsell.omegaUpsellConst import OmegaUpsellPage 18 from eve.client.script.ui.omega.upsell.pages.all_offers_page import AllOffersPage 19 from eve.client.script.ui.omega.upsell.pages.benefit_details_page import BenefitDetailsPage 20 from eve.client.script.ui.omega.upsell.pages.all_benefits_page import AllBenefitsPage 21 from eve.client.script.ui.omega.upsell.pages.omega_acquired_fanfare_page import OmegaAcquiredFanfarePage 22 from eve.client.script.ui.omega.upsell.pages.checkout_page import CheckoutPage 23 from eve.client.script.ui.omega.upsell.pages.landing_page import LandingPage 24 from eve.client.script.ui.omega.upsell.pages.omega_extended_fanfare_page import OmegaExtendedFanfarePage 25 from eve.client.script.ui.shared.mapView.dockPanel import DockablePanel, BUTTON_FULLSCREEN 26 from eve.client.script.ui.view.viewStateConst import ViewState 27 from omega.client.clone_grade_svc import get_clone_grade_svc 28 from stackless_response_router.exceptions import TimeoutException 29 log = logging.getLogger(__name__) 30 31 class OmegaUpsellWindow(DockablePanel): 32 default_apply_content_padding = False 33 default_captionLabelPath = 'UI/CloneState/UpgradeToOmegaTitle' 34 default_descriptionLabelPath = 'UI/CloneState/UpgradeToOmegaDescription' 35 default_iconNum = 'res:/ui/Texture/WindowIcons/upsell.png' 36 default_minSize = (1024, 700) 37 default_windowID = 'OmegaUpsellWindow' 38 default_analyticID = 'omega_upsell' 39 default_isMinimizable = False 40 dock_options = (BUTTON_FULLSCREEN,) 41 default_align = Align.TOALL 42 default_clipChildren = True 43 panelID = default_windowID 44 viewState = ViewState.OmegaUpsell 45 46 def __init__(self, page_id = None, *args, **kwargs): 47 super(OmegaUpsellWindow, self).__init__(*args, **kwargs) 48 self.page_id = None 49 self.previous_page_id = None 50 self.construct_layout() 51 self.construct_background() 52 self.connect_signals() 53 uthread2.start_tasklet(self.load_page, page_id=page_id) 54 55 def _get_default_page_id(self): 56 try: 57 if get_clone_grade_svc().is_omega_without_grace_period() and not get_clone_grade_svc().is_omega_about_to_lapse(): 58 return OmegaUpsellPage.ALL_BENEFITS 59 return OmegaUpsellPage.LANDING 60 except TimeoutException: 61 return OmegaUpsellPage.LANDING 62 63 def construct_layout(self): 64 self.inner_content = Container(name='InnerContent', parent=self.content, align=Align.VERTICALLY_CENTERED, height=0.85, minHeight=700, padding=(32, 0, 32, 0)) 65 self.loading_indicator = LoadingWheel(parent=self.inner_content, align=Align.CENTER) 66 top_cont = Container(name='topContainer', parent=self.inner_content, align=Align.TOTOP, height=188) 67 self.header_cont = OmegaHeader(parent=top_cont, align=Align.HORIZONTALLY_CENTERED, width=0.7, minWidth=800) 68 self.header_cont.on_close_btn.connect(self.CloseByUser) 69 self.header_cont.on_back_btn.connect(self.on_back_button) 70 self.page_container = Container(name='pageContainer', parent=self.inner_content, padTop=16) 71 self.construct_bottom_decoration() 72 self.construct_bottom_gradient() 73 _, height = self.GetAbsoluteSize() 74 self.update_bottom_decoration_visibility(height) 75 76 def update_bottom_decoration_visibility(self, height): 77 is_large = height > 850 78 self.bottom_decoration_cont.display = is_large 79 if is_large: 80 self.clone_state_indicator.align = Align.TOPLEFT_PROP 81 self.clone_state_indicator.left = 0.5 82 self.clone_state_indicator.top = 0.96 83 else: 84 self.clone_state_indicator.align = Align.TOPRIGHT 85 self.clone_state_indicator.left = 32 86 self.clone_state_indicator.top = 16 87 88 def construct_background(self): 89 self.hero_image = Sprite(name='hero_image', parent=self.content, align=Align.CENTER_PRESERVE_ASPECT_CLIP, aspectRatio=16 / 9.0, pickState=PickState.OFF, outputMode=OutputMode.COLOR_AND_GLOW, glowBrightness=0.0) 90 Sprite(name='backgroundSprite', parent=self.content, pos=(0, 0, 1920, 1080), aspectRatio=16 / 9.0, align=Align.CENTER_PRESERVE_ASPECT_CLIP, texturePath='res:/UI/Texture/classes/OmegaUpsell/background.png') 91 Fill(bgParent=self.content, color=eveColor.BLACK, opacity=0.3) 92 93 def construct_bottom_decoration(self): 94 self.bottom_decoration_cont = Container(parent=self.content, align=Align.TOPLEFT_PROP, pickState=PickState.OFF, pos=(0.5, 0.95, 636, 22)) 95 self.clone_state_indicator = CloneStateIndicator(parent=self.content, align=Align.TOPLEFT_PROP, pos=(0.5, 0.96, 0, 0)) 96 Sprite(name='bottom_decoration_left', parent=self.bottom_decoration_cont, align=Align.TOLEFT, width=155, texturePath='res:/UI/Texture/classes/OmegaUpsell/bottom_decoration_left.png') 97 Sprite(name='bottom_decoration_right', parent=self.bottom_decoration_cont, align=Align.TORIGHT, width=155, texturePath='res:/UI/Texture/classes/OmegaUpsell/bottom_decoration_right.png') 98 99 def construct_bottom_gradient(self): 100 GradientSprite(name='bottom_gradient', parent=self.content, align=Align.TOBOTTOM_PROP, pickState=PickState.OFF, rgbData=((0.0, eveColor.BLACK[:3]), (1.0, eveColor.BLACK[:3])), alphaData=((0.0, 0.0), (0.5, 1.0), (1.0, 1.0)), rotation=-math.pi / 2, height=0.3) 101 102 @classmethod 103 def Open(cls, *args, **kwds): 104 sm.GetService('audio').SendUIEvent('omega_subscribe_window_play') 105 return super(OmegaUpsellWindow, cls).Open(*args, **kwds) 106 107 def Close(self, setClosed = False, *args, **kwds): 108 try: 109 self.disconnect_signals() 110 sm.GetService('audio').SendUIEvent('omega_subscribe_window_stop') 111 finally: 112 super(OmegaUpsellWindow, self).Close(setClosed, *args, **kwds) 113 114 def DockFullscreen(self, *args): 115 super(OmegaUpsellWindow, self).DockFullscreen(*args) 116 self.toolbarContainer.display = False 117 118 def connect_signals(self): 119 omegaUpsellSignals.load_page.connect(self.on_load_page) 120 omegaUpsellSignals.upgrade_to_offer.connect(self.on_upgrade_to_offer) 121 omegaUpsellSignals.on_more_offers_button.connect(self.on_more_offers_button) 122 omegaUpsellSignals.set_hero_image.connect(self.on_set_hero_image) 123 self.on_size_changed.connect(self._on_size_changed) 124 125 def _on_size_changed(self, width, height): 126 self.update_bottom_decoration_visibility(height) 127 128 def on_set_hero_image(self, texture_path = None, duration = 0.8, allow_crop = False): 129 if texture_path is None: 130 animations.FadeOut(self.hero_image, duration=duration) 131 else: 132 self.hero_image.texturePath = texture_path 133 animations.FadeTo(self.hero_image, 0.0, 1.0, duration=duration) 134 animations.MorphScalar(self.hero_image, 'glowBrightness', 0.0, 0.3, curveType=uiconst.ANIM_OVERSHOT5, duration=duration) 135 136 def disconnect_signals(self): 137 omegaUpsellSignals.load_page.disconnect(self.on_load_page) 138 omegaUpsellSignals.upgrade_to_offer.disconnect(self.on_upgrade_to_offer) 139 omegaUpsellSignals.on_more_offers_button.disconnect(self.on_more_offers_button) 140 omegaUpsellSignals.set_hero_image.disconnect(self.on_set_hero_image) 141 142 def on_more_offers_button(self): 143 self.load_page(OmegaUpsellPage.ALL_OFFERS) 144 145 def on_upgrade_to_offer(self, offer_id, use_plex = False): 146 self.load_page(OmegaUpsellPage.CHECKOUT, offer_id=offer_id, use_plex=use_plex) 147 148 def on_back_button(self): 149 if self.page_id == OmegaUpsellPage.BENEFIT_DETAILS and self.previous_page_id == OmegaUpsellPage.ALL_BENEFITS: 150 self.load_page(OmegaUpsellPage.ALL_BENEFITS) 151 return 152 if self.page_id in [OmegaUpsellPage.ALL_OFFERS, 153 OmegaUpsellPage.ALL_BENEFITS, 154 OmegaUpsellPage.CHECKOUT, 155 OmegaUpsellPage.OMEGA_ACQUIRED_FANFARE, 156 OmegaUpsellPage.OMEGA_EXTENDED_FANFARE, 157 OmegaUpsellPage.BENEFIT_DETAILS]: 158 self.load_page(OmegaUpsellPage.LANDING) 159 160 def on_load_page(self, page_id, **kwargs): 161 self.load_page(page_id=page_id, **kwargs) 162 163 def load_page(self, page_id, **kwargs): 164 self.previous_page_id = self.page_id 165 self.page_id = page_id or self._get_default_page_id() 166 if self.destroyed: 167 return 168 self.reset_hero_image() 169 self.page_container.Flush() 170 self.page_container.StopAnimations() 171 self.header_cont.back_button.display = self.page_id != OmegaUpsellPage.LANDING 172 try: 173 self.loading_indicator.display = True 174 self._construct_page(self.page_id, **kwargs) 175 finally: 176 animations.FadeTo(self.page_container, 0.0, 1.0, duration=0.4) 177 self.loading_indicator.display = False 178 179 def reset_hero_image(self): 180 self.hero_image.texturePath = None 181 182 def _construct_page(self, page_id, **kwargs): 183 if page_id == OmegaUpsellPage.LANDING: 184 LandingPage(parent=self.page_container, padTop=32) 185 elif page_id == OmegaUpsellPage.ALL_OFFERS: 186 AllOffersPage(parent=self.page_container, padTop=32) 187 elif page_id == OmegaUpsellPage.OMEGA_ACQUIRED_FANFARE: 188 OmegaAcquiredFanfarePage(parent=self.page_container, padTop=32) 189 elif page_id == OmegaUpsellPage.OMEGA_EXTENDED_FANFARE: 190 OmegaExtendedFanfarePage(parent=self.page_container, padTop=32) 191 elif page_id == OmegaUpsellPage.CHECKOUT: 192 try: 193 offer_id = kwargs['offer_id'] 194 except KeyError: 195 log.error('No offer id specified') 196 raise 197 198 use_plex = kwargs.get('use_plex', False) 199 CheckoutPage(parent=self.page_container, offer_id=offer_id, use_plex=use_plex) 200 elif page_id == OmegaUpsellPage.ALL_BENEFITS: 201 AllBenefitsPage(parent=self.page_container, padTop=32) 202 elif page_id == OmegaUpsellPage.BENEFIT_DETAILS: 203 try: 204 omega_benefit_type = kwargs['omega_benefit_type'] 205 except KeyError: 206 log.error('No benefit id specified') 207 raise 208 209 BenefitDetailsPage(parent=self.page_container, omega_benefit_type=omega_benefit_type) 210 211 def OnBack(self): 212 self.on_back_button() 213 214 @classmethod 215 def show_omega_acquired_fanfare(cls): 216 wnd = cls.GetIfOpen() 217 if wnd: 218 omegaUpsellSignals.load_page(OmegaUpsellPage.OMEGA_ACQUIRED_FANFARE) 219 else: 220 cls.Open(page_id=OmegaUpsellPage.OMEGA_ACQUIRED_FANFARE) 221 222 @classmethod 223 def show_omega_extended_fanfare(cls): 224 wnd = cls.GetIfOpen() 225 if wnd: 226 omegaUpsellSignals.load_page(OmegaUpsellPage.OMEGA_EXTENDED_FANFARE) 227 else: 228 cls.Open(page_id=OmegaUpsellPage.OMEGA_EXTENDED_FANFARE)