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