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

landing_page.py (7296B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\omega\upsell\pages\landing_page.py
      2 import carbonui
      3 import carbonui.text.styles
      4 import uthread2
      5 from carbonui import Align, ButtonStyle, PickState, TextColor, uiconst
      6 from carbonui.control.button import Button
      7 from carbonui.control.scrollContainer import ScrollContainer
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     10 from carbonui.primitives.sprite import Sprite
     11 from carbonui.uianimations import animations
     12 from eve.client.script.ui import eveColor
     13 from eve.client.script.ui.omega.upsell import omegaUpsellSignals, omegaUpsellConst
     14 from eve.client.script.ui.omega.upsell.components.default_offer_card import DefaultOfferCard
     15 from eve.client.script.ui.omega.upsell.link import create_benefit_link
     16 from eve.client.script.ui.omega.upsell.omegaUpsellConst import OmegaUpsellPage
     17 from localization import GetByLabel, GetByMessageID
     18 from omega.client.benefits.const import OmegaBenefitType
     19 from omega.client.clone_grade_svc import get_clone_grade_svc
     20 from signals import Signal
     21 ANIM_DURATION = 1.2
     22 BENEFITS = (OmegaBenefitType.ELITE_ADVANTAGE,
     23  OmegaBenefitType.SKILLS_FASTER_TRAINING,
     24  OmegaBenefitType.SKILLS_FULL_ACCESS,
     25  OmegaBenefitType.MULTIBOXING_ALLOWED,
     26  OmegaBenefitType.SHIPS_FULL_ACCESS)
     27 
     28 class BenefitCarouselEntry(Container):
     29     default_height = 40
     30     default_state = uiconst.UI_NORMAL
     31 
     32     def __init__(self, omega_benefit, **kw):
     33         super(BenefitCarouselEntry, self).__init__(**kw)
     34         self.omega_benefit = omega_benefit
     35         self._selected = False
     36         self.on_click = Signal('on_click')
     37         self.icon = Sprite(name='icon', parent=self, align=Align.CENTERLEFT, pickState=PickState.OFF, pos=(0, 0, 40, 40))
     38         self.label = carbonui.text.styles.TextHeader(name='label', parent=self, align=Align.CENTERLEFT, color=TextColor.HIGHLIGHT, bold=True, left=48)
     39         self.update()
     40 
     41     def update(self):
     42         self.label.text = GetByMessageID(self.omega_benefit.button_message_id)
     43         self.icon.texturePath = self.omega_benefit.icon_path
     44 
     45     def OnClick(self, *args):
     46         self.on_click(self)
     47 
     48     def OnMouseEnter(self, *args):
     49         pass
     50 
     51     def OnMouseExit(self, *args):
     52         pass
     53 
     54     @property
     55     def selected(self):
     56         return self._selected
     57 
     58     def select(self, duration = ANIM_DURATION):
     59         if self.selected:
     60             return
     61         self._selected = True
     62         animations.SpColorMorphTo(self.label, self.label.rgb, eveColor.OMEGA_YELLOW, duration=duration)
     63 
     64     def deselect(self, duration = ANIM_DURATION):
     65         if not self.selected:
     66             return
     67         self._selected = False
     68         animations.SpColorMorphTo(self.label, self.label.rgb, TextColor.HIGHLIGHT, duration=duration)
     69 
     70 
     71 class BenefitCarousel(ScrollContainer):
     72 
     73     def __init__(self, **kw):
     74         super(BenefitCarousel, self).__init__(**kw)
     75         self.entries = []
     76         self.selected_entry = None
     77         self._select_entry_thread = None
     78         self.construct_layout()
     79 
     80     def start(self):
     81         self.select_entry(self.entries[0])
     82 
     83     def construct_layout(self):
     84         for omega_benefit_type in BENEFITS:
     85             benefit = get_clone_grade_svc().get_omega_benefit(omega_benefit_type)
     86             entry = BenefitCarouselEntry(parent=self, omega_benefit=benefit, align=Align.TOTOP, padBottom=8)
     87             entry.on_click.connect(self.on_entry_clicked)
     88             self.entries.append(entry)
     89 
     90         button_cont = ContainerAutoSize(name='button_cont', parent=self, align=Align.TOTOP, padTop=16)
     91         Button(parent=button_cont, func=self.on_all_benefits_button, label=GetByLabel('UI/OmegaUpsell/SeeAllBenefits'), style=ButtonStyle.MONETIZATION)
     92         self.label_cont = ContainerAutoSize(name='label_cont', parent=self, align=Align.TOTOP, padTop=16, opacity=0.0)
     93         self.description_label = carbonui.text.styles.TextHeader(parent=self.label_cont, align=Align.TOTOP, color=TextColor.NORMAL)
     94         self.read_more_label = carbonui.text.styles.TextHeader(parent=self.label_cont, align=Align.TOTOP, padTop=16, pickState=PickState.ON)
     95 
     96     def on_entry_clicked(self, entry):
     97         self.select_entry(entry, duration=0.15)
     98 
     99     def Close(self):
    100         try:
    101             if self._select_entry_thread:
    102                 self._select_entry_thread.kill()
    103                 self._select_entry_thread = None
    104         finally:
    105             super(BenefitCarousel, self).Close()
    106 
    107     def select_entry(self, entry, duration = ANIM_DURATION):
    108         if self._select_entry_thread:
    109             self._select_entry_thread.kill()
    110             self._select_entry_thread = None
    111         self._select_entry_thread = uthread2.start_tasklet(self._select_entry, entry, duration)
    112 
    113     def _select_entry(self, entry, duration = ANIM_DURATION):
    114         if self.selected_entry:
    115             self._deselect_current_entry(duration=duration)
    116             uthread2.Sleep(duration + 0.1)
    117         self._apply_entry_selection(entry, duration=duration)
    118         uthread2.Sleep(5 * ANIM_DURATION)
    119         self._select_next_entry()
    120 
    121     def _apply_entry_selection(self, entry, duration = ANIM_DURATION):
    122         if self.destroyed:
    123             return
    124         self.selected_entry = entry
    125         entry.select(duration=duration)
    126         self.update_description(entry, duration=duration)
    127         omegaUpsellSignals.set_hero_image(self.selected_entry.omega_benefit.hero_image_icon_path, duration)
    128 
    129     def _select_next_entry(self):
    130         if self.destroyed:
    131             return
    132         next_index = (self.entries.index(self.selected_entry) + 1) % len(self.entries)
    133         next_entry = self.entries[next_index]
    134         self._select_entry(next_entry)
    135 
    136     def _deselect_current_entry(self, duration = ANIM_DURATION):
    137         if not self.selected_entry:
    138             return
    139         self.selected_entry.deselect(duration=duration)
    140         animations.FadeOut(self.label_cont, duration=duration)
    141         omegaUpsellSignals.set_hero_image(None, duration)
    142 
    143     def update_description(self, entry, duration = ANIM_DURATION):
    144         self.description_label.text = GetByMessageID(entry.omega_benefit.description_message_id)
    145         if entry:
    146             self.read_more_label.text = create_benefit_link(str(entry.omega_benefit.omega_benefit_type))
    147         else:
    148             self.read_more_label.text = ''
    149         animations.FadeIn(self.label_cont, duration=duration)
    150 
    151     def on_all_benefits_button(self, *args):
    152         omegaUpsellSignals.load_page(OmegaUpsellPage.ALL_BENEFITS)
    153 
    154 
    155 class LandingPage(Container):
    156 
    157     def __init__(self, **kw):
    158         super(LandingPage, self).__init__(**kw)
    159         self.construct_layout()
    160         uthread2.start_tasklet(self.benefit_carousel.start)
    161 
    162     def construct_layout(self):
    163         self.content = Container(name='content', parent=self, align=Align.HORIZONTALLY_CENTERED, width=0.8, minWidth=omegaUpsellConst.MIN_WIDTH)
    164         bottom_cont = Container(name='bottom_cont', parent=self.content, align=Align.TOBOTTOM, padBottom=8, height=140)
    165         DefaultOfferCard(name='offer_card', parent=bottom_cont, align=Align.HORIZONTALLY_CENTERED, width=0.8)
    166         self.benefit_carousel = BenefitCarousel(parent=self.content, align=Align.TORIGHT_PROP, width=0.33, minWidth=400, padBottom=16)