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

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)