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

sequencingJobInfo.py (8689B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\cosmetics\ship\pages\homepage\sequencingJobInfo.py
      2 import uthread2
      3 from carbonui import Align, AxisAlignment, ButtonStyle, ButtonVariant, Density, uiconst
      4 from carbonui.button.group import ButtonGroup, ButtonSizeMode
      5 from carbonui.control.button import Button
      6 from carbonui.primitives.container import Container
      7 from carbonui.uianimations import animations
      8 from cosmetics.client.shipSkinDataSvc import get_ship_skin_data_svc
      9 from cosmetics.client.shipSkinSequencingSvc import get_ship_skin_sequencing_svc
     10 from cosmetics.client.ships.ship_skin_signals import on_skin_sequencing_job_completed
     11 from cosmetics.client.ships.skins.errors import get_sequencing_error_text
     12 from cosmetics.client.ships.skins.live_data import current_skin_design
     13 from eve.client.script.ui import eveColor
     14 from eve.client.script.ui.cosmetics.ship.const import ANIM_DURATION_LONG, SkinrPage
     15 from eve.client.script.ui.cosmetics.ship.controls.costInfo import SequencingJobCostInfo
     16 from eve.client.script.ui.cosmetics.ship.controls.shipName import ShipName
     17 from eve.client.script.ui.cosmetics.ship.pages import current_page
     18 from eve.client.script.ui.cosmetics.ship.pages.studio import studioSignals
     19 from localization import GetByLabel
     20 from plex.client.api.repository import get_repository
     21 from plex.client.api.signal import on_balance_changed
     22 from player_messaging.client.ui_message import message_player, prompt_player_fsd_dialog
     23 from publicGateway.grpc.exceptions import GenericException
     24 from stackless_response_router.exceptions import TimeoutException
     25 
     26 class SequencingJobInfo(Container):
     27     default_opacity = 0.0
     28 
     29     def __init__(self, *args, **kwargs):
     30         super(SequencingJobInfo, self).__init__(*args, **kwargs)
     31         self.sequencing_job = None
     32         self._update_thread = None
     33         self.construct_layout()
     34         self.connect_signals()
     35         self.update()
     36 
     37     def Close(self):
     38         try:
     39             self.kill_update_thread()
     40             self.disconnect_signals()
     41         finally:
     42             super(SequencingJobInfo, self).Close()
     43 
     44     def kill_update_thread(self):
     45         if self._update_thread is not None:
     46             self._update_thread.kill()
     47             self._update_thread = None
     48 
     49     def connect_signals(self):
     50         studioSignals.on_saved_design_selected.connect(self.on_saved_design_selected)
     51         studioSignals.on_sequencing_job_selected.connect(self.on_sequencing_job_selected)
     52         studioSignals.on_page_opened.connect(self.on_page_opened)
     53         on_skin_sequencing_job_completed.connect(self.on_sequencing_job_completed)
     54         on_balance_changed.connect(self.on_plex_amount_changed)
     55 
     56     def disconnect_signals(self):
     57         studioSignals.on_saved_design_selected.disconnect(self.on_saved_design_selected)
     58         studioSignals.on_sequencing_job_selected.disconnect(self.on_sequencing_job_selected)
     59         studioSignals.on_page_opened.disconnect(self.on_page_opened)
     60         on_skin_sequencing_job_completed.disconnect(self.on_sequencing_job_completed)
     61         on_balance_changed.disconnect(self.on_plex_amount_changed)
     62 
     63     def construct_layout(self):
     64         self.construct_buttons()
     65         self.construct_const_info()
     66         self.construct_ship_name()
     67 
     68     def construct_buttons(self):
     69         button_group = ButtonGroup(parent=self, align=Align.TOBOTTOM, button_alignment=AxisAlignment.END, density=Density.EXPANDED, button_size_mode=ButtonSizeMode.DYNAMIC)
     70         button_group.add_button(Button(label=GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/CreateNewDesign'), variant=ButtonVariant.PRIMARY, func=self.on_create_design_button))
     71         self.complete_now_button = Button(label=GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/CompleteJobNow'), variant=ButtonVariant.PRIMARY, style=ButtonStyle.SUCCESS, func=self.on_complete_now_button)
     72         self.complete_now_button.LoadTooltipPanel = self.LoadCompleteNowButtonTooltipPanel
     73         button_group.add_button(self.complete_now_button)
     74 
     75     def LoadCompleteNowButtonTooltipPanel(self, tooltipPanel, *args):
     76         if self.has_enough_plex:
     77             return
     78         tooltipPanel.columns = 1
     79         tooltipPanel.LoadStandardSpacing()
     80         tooltipPanel.AddLabelMedium(text=self.insufficient_funds_hint, wrapWidth=300, color=eveColor.DANGER_RED)
     81 
     82     def construct_const_info(self):
     83         self.cost_info = SequencingJobCostInfo(name='cost_info', parent=self.complete_now_button, align=Align.TOBOTTOM, top=44)
     84 
     85     def construct_ship_name(self):
     86         self.ship_name = ShipName(name='ship_name', parent=self, align=Align.CENTERTOP)
     87 
     88     def on_create_design_button(self, *args):
     89         if current_skin_design.get().has_fitted_components():
     90             ship_type_id = current_skin_design.get().ship_type_id
     91             current_skin_design.create_blank_design(ship_type_id)
     92         current_page.set_page_id(SkinrPage.STUDIO_DESIGNER)
     93 
     94     def on_complete_now_button(self, *args):
     95         try:
     96             plex_cost = get_ship_skin_sequencing_svc().get_early_completion_cost(self.sequencing_job.job_id)
     97             if prompt_player_fsd_dialog('CompleteSequencingNow', {'plex_cost': plex_cost}, uiconst.YESNO) == uiconst.ID_YES:
     98                 error = get_ship_skin_sequencing_svc().expedite_sequencing(self.sequencing_job.job_id)
     99                 if error is not None:
    100                     message_player(GetByLabel(get_sequencing_error_text(error)))
    101         except (GenericException, TimeoutException):
    102             message_player(GetByLabel('UI/Common/CannotConnectToServer'))
    103 
    104     def update(self):
    105         self.kill_update_thread()
    106         self._update_thread = uthread2.StartTasklet(self.update_async)
    107 
    108     def update_async(self):
    109         self.update_cost_info()
    110         self.update_ship_name()
    111         self.update_complete_now_button()
    112 
    113     def update_cost_info(self):
    114         self.cost_info.sequencing_job = self.sequencing_job
    115 
    116     def update_ship_name(self):
    117         if not self.sequencing_job:
    118             self.ship_name.ship_type_id = None
    119             return
    120         try:
    121             skin_design = get_ship_skin_data_svc().get_skin_data(self.sequencing_job.skin_hex)
    122             self.ship_name.ship_type_id = skin_design.ship_type_id if skin_design else None
    123         except (GenericException, TimeoutException):
    124             self.ship_name.ship_type_id = None
    125 
    126     def update_complete_now_button(self):
    127         if self.has_enough_plex:
    128             self.complete_now_button.style = ButtonStyle.SUCCESS
    129             self.complete_now_button.func = self.on_complete_now_button
    130         else:
    131             self.complete_now_button.style = ButtonStyle.DANGER
    132             self.complete_now_button.func = None
    133 
    134     @property
    135     def has_enough_plex(self):
    136         if not self.sequencing_job:
    137             return True
    138         try:
    139             plex_cost = get_ship_skin_sequencing_svc().get_early_completion_cost(self.sequencing_job.job_id)
    140             return get_repository().get_balance() >= plex_cost
    141         except (GenericException, TimeoutException):
    142             return True
    143 
    144     @property
    145     def insufficient_funds_hint(self):
    146         currencies = []
    147         if not self.has_enough_plex:
    148             currencies.append(GetByLabel('UI/Common/PLEX'))
    149         return u'{base} ({currencies})'.format(base=GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/ListingErrors/InsufficientFunds'), currencies=u'/'.join(currencies))
    150 
    151     def on_saved_design_selected(self, *args):
    152         self.fade_out()
    153 
    154     def on_sequencing_job_selected(self, sequencing_job):
    155         self._set_sequencing_job(sequencing_job)
    156         self.complete_now_button.Show()
    157 
    158     def on_sequencing_job_completed(self, job_id):
    159         if not self.sequencing_job or self.sequencing_job.job_id != job_id:
    160             return
    161         self.complete_now_button.Hide()
    162 
    163     def on_plex_amount_changed(self, *args):
    164         self.update()
    165 
    166     def on_page_opened(self, page_id, page_args, last_page_id, animate = True):
    167         self.fade_out()
    168 
    169     def _set_sequencing_job(self, sequencing_job):
    170         self.sequencing_job = sequencing_job
    171         if sequencing_job is None:
    172             self.fade_out()
    173         else:
    174             self.fade_out(callback=self.on_fade_out_complete)
    175 
    176     def fade_out(self, callback = None):
    177         if callback is None:
    178             self.sequencing_job = None
    179         self.state = uiconst.UI_DISABLED
    180         animations.FadeTo(self, self.opacity, 0.0, ANIM_DURATION_LONG, callback=callback)
    181 
    182     def fade_in(self):
    183         self.state = uiconst.UI_PICKCHILDREN
    184         animations.FadeTo(self, self.opacity, 1.0, 0.5)
    185 
    186     def on_fade_out_complete(self):
    187         self.update()
    188         self.fade_in()