current_skin_design.py (6837B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\ships\skins\live_data\current_skin_design.py 2 import uthread2 3 from eve.client.script.ui.control.historyBuffer import HistoryBuffer 4 from cosmetics.common.ships.skins.static_data.slot_name import PATTERN_RELATED_SLOT_IDS, PATTERN_SLOT_ID_BY_PATTERN_MATERIAL_ID 5 from characterdata.races import get_ship_type_id 6 from cosmetics.client.shipSkinDataSvc import get_ship_skin_data_svc 7 from cosmetics.client.shipSkinDesignSvc import get_ship_skin_design_svc 8 from cosmetics.client.ships.skins.live_data import current_skin_design_signals 9 from cosmetics.client.ships.skins.live_data.skin_design import SkinDesign 10 from cosmetics.common.ships.skins.static_data.slot_configuration import is_skinnable_ship 11 from player_messaging.client.ui_message import message_player 12 from localization import GetByLabel 13 from publicGateway.grpc.exceptions import GenericException 14 from stackless_response_router.exceptions import TimeoutException 15 _current_design = SkinDesign() 16 _current_design.on_name_changed.connect(current_skin_design_signals.on_name_changed) 17 _current_design.on_line_name_changed.connect(current_skin_design_signals.on_line_name_changed) 18 _current_design.on_slot_fitting_changed.connect(current_skin_design_signals.on_slot_fitting_changed) 19 _current_design.on_ship_type_id_changed.connect(current_skin_design_signals.on_ship_type_id_changed) 20 _current_design.on_tier_level_changed.connect(current_skin_design_signals.on_tier_level_changed) 21 _current_design.on_component_instance_license_to_use_changed.connect(current_skin_design_signals.on_component_instance_license_to_use_changed) 22 _current_design.on_pattern_blend_mode_changed.connect(current_skin_design_signals.on_pattern_blend_mode_changed) 23 _current_design.on_component_attribute_changed.connect(current_skin_design_signals.on_component_attribute_changed) 24 _snapshot_design = SkinDesign() 25 _selected_slot_id = None 26 _undo_history_buffer = HistoryBuffer(maxLen=50) 27 _undo_batch_thread = None 28 29 def take_snapshot(): 30 _snapshot_design.update_from_other(_current_design) 31 current_skin_design_signals.on_snapshot_changed() 32 33 34 def has_changes_from_snapshot(): 35 return _current_design != _snapshot_design 36 37 38 def get(): 39 return _current_design 40 41 42 def get_default_ship_type_id(type_id = None): 43 if not type_id: 44 type_id = get_active_ship_type_id() 45 if not is_skinnable_ship(type_id): 46 type_id = get_ship_type_id(session.raceID) 47 return type_id 48 49 50 def get_active_ship_type_id(): 51 return sm.GetService('godma').GetItem(session.shipid).typeID 52 53 54 def get_selected_slot_id(): 55 global _selected_slot_id 56 return _selected_slot_id 57 58 59 def get_selected_pattern_component_instance(): 60 slot_id = get_selected_slot_id() 61 if slot_id not in PATTERN_RELATED_SLOT_IDS: 62 return 63 slot_id = PATTERN_SLOT_ID_BY_PATTERN_MATERIAL_ID.get(slot_id, slot_id) 64 return get().get_fitted_component_instance(slot_id) 65 66 67 def set_selected_slot_id(value): 68 global _selected_slot_id 69 _selected_slot_id = value 70 current_skin_design_signals.on_slot_selected(value) 71 72 73 def create_blank_design(ship_type_id = None): 74 ship_type_id = get_default_ship_type_id(ship_type_id) 75 _current_design.clear() 76 _current_design.creator_character_id = session.charid 77 _current_design.ship_type_id = ship_type_id 78 take_snapshot() 79 reset_undo_history() 80 current_skin_design_signals.on_design_reset(_current_design, None) 81 82 83 def reset_design(ship_type_id = None): 84 if not ship_type_id: 85 ship_type_id = get_default_ship_type_id() 86 if _current_design.has_fitted_components() or ship_type_id != _current_design.ship_type_id: 87 create_blank_design(ship_type_id) 88 reset_undo_history() 89 90 91 def open_existing_saved_design(saved_skin_design_id): 92 try: 93 existing_saved_design = get_ship_skin_design_svc().get_saved_design(saved_skin_design_id) 94 except (GenericException, TimeoutException): 95 message_player(GetByLabel('UI/Common/CannotConnectToServer')) 96 existing_saved_design = None 97 98 if existing_saved_design is not None: 99 update_from_other(existing_saved_design, saved_skin_design_id) 100 reset_undo_history() 101 102 103 def update_from_other(skin_design, saved_skin_design_id = None, animate = True): 104 _current_design.update_from_other(skin_design, saved_skin_design_id=saved_skin_design_id) 105 take_snapshot() 106 current_skin_design_signals.on_existing_design_loaded(_current_design, animate) 107 108 109 def open_existing_design(skin_hex, animate = True): 110 try: 111 existing_design = get_ship_skin_data_svc().get_skin_data(skin_hex) 112 except (GenericException, TimeoutException): 113 message_player(GetByLabel('UI/Common/CannotConnectToServer')) 114 return 115 116 if existing_design is not None: 117 _current_design.update_from_other(existing_design) 118 take_snapshot() 119 current_skin_design_signals.on_existing_design_loaded(_current_design, animate) 120 121 122 def reset_undo_history(): 123 _undo_history_buffer.Reset() 124 add_to_undo_history() 125 126 127 def add_to_undo_history(): 128 skin_design = _add_to_undo_history() 129 current_skin_design_signals.on_undo_history_change() 130 return skin_design 131 132 133 def add_to_undo_history_batch_up(batch_up_delay = 3.0): 134 global _undo_batch_thread 135 if _undo_batch_thread: 136 skin_design, _ = _undo_history_buffer.GetCurrent() 137 skin_design.update_from_other(_current_design) 138 else: 139 _add_to_undo_history() 140 _undo_batch_thread = uthread2.start_tasklet(_add_to_undo_history_thread, batch_up_delay) 141 142 143 def _add_to_undo_history_thread(batch_up_delay = None): 144 global _undo_batch_thread 145 uthread2.Sleep(batch_up_delay) 146 _undo_batch_thread = None 147 148 149 def _add_to_undo_history(): 150 _kill_undo_batch_thread() 151 skin_design = SkinDesign() 152 skin_design.update_from_other(_current_design) 153 _undo_history_buffer.Append((skin_design, _selected_slot_id)) 154 return skin_design 155 156 157 def _kill_undo_batch_thread(): 158 global _undo_batch_thread 159 if _undo_batch_thread: 160 _undo_batch_thread.kill() 161 _undo_batch_thread = None 162 163 164 def _undo_redo(skin_design, selected_slot_id): 165 if not skin_design: 166 return 167 _current_design.update_from_other(skin_design) 168 set_selected_slot_id(selected_slot_id) 169 current_skin_design_signals.on_existing_design_loaded(_current_design, False) 170 current_skin_design_signals.on_undo_history_change() 171 172 173 def undo(): 174 if _undo_batch_thread: 175 _add_to_undo_history() 176 _undo_redo(*_undo_history_buffer.GoBack()) 177 178 179 def redo(): 180 if _undo_batch_thread: 181 _add_to_undo_history() 182 _undo_redo(*_undo_history_buffer.GoForward()) 183 184 185 def is_undo_enabled(): 186 return _undo_history_buffer.IsBackEnabled() 187 188 189 def is_redo_enabled(): 190 return _undo_history_buffer.IsForwardEnabled()