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

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