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

skinrBackgroundContainer.py (13446B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\cosmetics\ship\pages\studio\skinrBackgroundContainer.py
      2 from logging import getLogger
      3 import trinity
      4 import uthread2
      5 from carbonui import const as uiconst
      6 from carbonui.control.contextMenu.menuData import MenuData
      7 from carbonui.primitives.container import Container
      8 from carbonui.ui3d import InSceneContainer
      9 from cosmetics.client.ships.skins.live_data import current_skin_design_signals, current_skin_design
     10 from cosmetics.client.ships.skins.live_data.skin_design import SkinDesign
     11 from cosmetics.common.ships.skins.errors import SlotDisallowedForComponent
     12 from cosmetics.common.ships.skins.static_data.component_category import ComponentCategory
     13 from cosmetics.common.ships.skins.static_data.slot_name import SlotID
     14 from eve.client.script.ui.control.scenecontainer import SceneContainerBaseNavigation
     15 from eve.client.script.ui.cosmetics.ship.const import SkinrPage, CHILD_PAGES_BY_PARENT_PAGE
     16 from eve.client.script.ui.cosmetics.ship.pages import current_page
     17 from eve.client.script.ui.cosmetics.ship.pages.collection import collectionSignals
     18 from eve.client.script.ui.cosmetics.ship.pages.store import storeSignals, storeSettings
     19 from eve.client.script.ui.cosmetics.ship.pages.studio import studioSignals
     20 from eve.client.script.ui.cosmetics.ship.pages.studio.shipSKINRSceneContainer import ShipSKINRSceneContainer
     21 from eve.client.script.ui.cosmetics.ship.pages.studio.skinrInSceneContainer import SkinrInSceneContainer
     22 from eve.client.script.ui.cosmetics.ship.pages.studio.studioUtil import is_green_screen_enabled
     23 from localization import GetByLabel
     24 from signals import Signal
     25 log = getLogger(__name__)
     26 MINIMUM_ZOOM_DISTANCE_DEFAULT = 5000
     27 MAXIMUM_PROJECTION_ANGLE_ADJUSTMENT = 0.3
     28 DEFAULT_PATTERN_SHOWCASE_MATERIAL_ID = 220
     29 
     30 class SKINRBackgroundContainer(Container):
     31 
     32     def __init__(self, **kw):
     33         log.info('SKIN PREVIEW - PreviewPanel: Start constructing')
     34         super(SKINRBackgroundContainer, self).__init__(**kw)
     35         self.on_drop_data = Signal('on_drop_data')
     36         self.sceneNavigation = None
     37         self.in_scene_bg_container = None
     38         self._construct_layout()
     39         self.connect_signals()
     40         self.preview_type(current_skin_design.get().ship_type_id)
     41         log.info('SKIN PREVIEW - PreviewPanel: Finish constructing')
     42 
     43     def Close(self):
     44         try:
     45             self.disconnect_signals()
     46         finally:
     47             super(SKINRBackgroundContainer, self).Close()
     48 
     49     def connect_signals(self):
     50         studioSignals.on_page_opened.connect(self.on_page_opened)
     51         studioSignals.on_sequencing_job_selected.connect(self.on_sequencing_job_selected)
     52         collectionSignals.on_component_license_selected.connect(self.on_component_license_selected)
     53         collectionSignals.on_first_party_skin_applied.connect(self.on_first_party_skin_applied)
     54         collectionSignals.on_first_party_skin_selected.connect(self.on_first_party_skin_selected)
     55         collectionSignals.on_activated_skin_license_selected.connect(self.on_collection_skin_license_selected)
     56         collectionSignals.on_unactivated_skin_license_selected.connect(self.on_collection_skin_license_selected)
     57         collectionSignals.on_skin_license_details_clear.connect(self.on_collection_skin_license_details_clear)
     58         current_skin_design_signals.on_ship_type_id_changed.connect(self.on_ship_type_id_changed)
     59         current_skin_design_signals.on_design_reset.connect(self.on_new_design_initialized)
     60         current_skin_design_signals.on_existing_design_loaded.connect(self.on_existing_design_loaded)
     61         storeSignals.on_component_listing_selected.connect(self.on_store_component_listing_selected)
     62         storeSignals.on_skin_listing_selected.connect(self.on_store_skin_listing_selected)
     63         if self.sceneNavigation:
     64             self.sceneNavigation.on_drop_data.connect(self.on_drop_data)
     65 
     66     def disconnect_signals(self):
     67         studioSignals.on_page_opened.disconnect(self.on_page_opened)
     68         studioSignals.on_sequencing_job_selected.disconnect(self.on_sequencing_job_selected)
     69         collectionSignals.on_component_license_selected.disconnect(self.on_component_license_selected)
     70         collectionSignals.on_first_party_skin_applied.disconnect(self.on_first_party_skin_applied)
     71         collectionSignals.on_first_party_skin_selected.disconnect(self.on_first_party_skin_selected)
     72         collectionSignals.on_activated_skin_license_selected.disconnect(self.on_collection_skin_license_selected)
     73         collectionSignals.on_unactivated_skin_license_selected.disconnect(self.on_collection_skin_license_selected)
     74         collectionSignals.on_skin_license_details_clear.disconnect(self.on_collection_skin_license_details_clear)
     75         current_skin_design_signals.on_ship_type_id_changed.disconnect(self.on_ship_type_id_changed)
     76         current_skin_design_signals.on_design_reset.disconnect(self.on_new_design_initialized)
     77         current_skin_design_signals.on_existing_design_loaded.disconnect(self.on_existing_design_loaded)
     78         storeSignals.on_component_listing_selected.disconnect(self.on_store_component_listing_selected)
     79         storeSignals.on_skin_listing_selected.disconnect(self.on_store_skin_listing_selected)
     80         if self.sceneNavigation:
     81             self.sceneNavigation.on_drop_data.disconnect(self.on_drop_data)
     82 
     83     def on_collection_skin_license_selected(self, skin_license):
     84         current_skin_design.open_existing_design(skin_license.skin_hex)
     85 
     86     def on_collection_skin_license_details_clear(self):
     87         current_skin_design.reset_design()
     88 
     89     def on_component_license_selected(self, component_licence):
     90         category = component_licence.get_component_data().category
     91         self.apply_component(category, component_licence.component_id)
     92 
     93     def on_sequencing_job_selected(self, sequencing_job):
     94         if not sequencing_job:
     95             return
     96         current_skin_design.open_existing_design(sequencing_job.skin_hex)
     97 
     98     def on_store_skin_listing_selected(self, skin_listing, *args):
     99         if skin_listing:
    100             if current_skin_design.get() != skin_listing.skin_design:
    101                 current_skin_design.update_from_other(skin_listing.skin_design)
    102 
    103     def on_store_component_listing_selected(self, component_listing):
    104         if component_listing:
    105             category = component_listing.get_component_data().category
    106             component_id = component_listing.component_id
    107             self.apply_component(category, component_id)
    108 
    109     def apply_component(self, category, component_id):
    110         skin_design = SkinDesign()
    111         skin_design.ship_type_id = current_skin_design.get_default_ship_type_id()
    112         if category == ComponentCategory.MATERIAL:
    113             for slot_id in (SlotID.PRIMARY_NANOCOATING,
    114              SlotID.SECONDARY_NANOCOATING,
    115              SlotID.TERTIARY_NANOCOATING,
    116              SlotID.TECH_AREA):
    117                 skin_design.fit_slot(slot_id, component_id)
    118 
    119         if category == ComponentCategory.METALLIC:
    120             for slot_id in (SlotID.PRIMARY_NANOCOATING,
    121              SlotID.SECONDARY_NANOCOATING,
    122              SlotID.TERTIARY_NANOCOATING,
    123              SlotID.TECH_AREA):
    124                 try:
    125                     skin_design.fit_slot(slot_id, component_id)
    126                 except SlotDisallowedForComponent:
    127                     continue
    128 
    129         elif category == ComponentCategory.PATTERN:
    130             skin_design.fit_slot(SlotID.PATTERN, component_id)
    131             skin_design.fit_slot(SlotID.PATTERN_MATERIAL, DEFAULT_PATTERN_SHOWCASE_MATERIAL_ID)
    132         current_skin_design.update_from_other(skin_design)
    133 
    134     def on_page_opened(self, page_id, page_args, last_page_id, animate = True):
    135         if page_id == SkinrPage.STUDIO_DESIGNER and last_page_id == SkinrPage.STUDIO:
    136             if page_args and page_args == current_skin_design.get().saved_skin_design_id:
    137                 pass
    138             else:
    139                 log.info('SKIN PREVIEW - PreviewPanel: Reset when creating a new design')
    140                 current_skin_design.reset_design()
    141         elif page_id == SkinrPage.STUDIO and last_page_id == SkinrPage.STUDIO_DESIGNER:
    142             log.info('SKIN PREVIEW - PreviewPanel: Reset when going from studio design to studio homepage')
    143             current_skin_design.reset_design()
    144         elif page_id == SkinrPage.STUDIO or page_id in CHILD_PAGES_BY_PARENT_PAGE[SkinrPage.STUDIO]:
    145             if last_page_id not in CHILD_PAGES_BY_PARENT_PAGE[SkinrPage.STUDIO]:
    146                 log.info('SKIN PREVIEW - PreviewPanel: Reset when going to studio homepage or subpage except from studio subpages')
    147                 current_skin_design.reset_design()
    148         elif page_id == SkinrPage.STORE or page_id in CHILD_PAGES_BY_PARENT_PAGE[SkinrPage.STORE]:
    149             log.info('SKIN PREVIEW - PreviewPanel: Reset when going to store or subpage')
    150             current_skin_design.reset_design(ship_type_id=storeSettings.emphasized_ship_type_id.get())
    151         elif page_id == SkinrPage.COLLECTION or page_id in CHILD_PAGES_BY_PARENT_PAGE[SkinrPage.COLLECTION]:
    152             log.info('SKIN PREVIEW - PreviewPanel: Reset when going to collection or subpage')
    153             current_skin_design.reset_design()
    154         if page_id != SkinrPage.STUDIO_DESIGNER:
    155             current_skin_design.set_selected_slot_id(None)
    156 
    157     def on_new_design_initialized(self, current_design, saved_skin_design_id):
    158         self.apply_new_design(current_design)
    159 
    160     def on_existing_design_loaded(self, skin_design, animate):
    161         self.apply_new_design(skin_design, animate)
    162 
    163     def on_first_party_skin_applied(self, item_id, first_party_skin):
    164         self.preview_type(first_party_skin.types[0])
    165 
    166     def apply_new_design(self, skin_design, animate = True):
    167         self.preview_type(skin_design.ship_type_id, skinDesign=skin_design, animate=animate)
    168 
    169     def on_first_party_skin_selected(self, skin_id, first_party_skin):
    170         self.preview_type(first_party_skin.types[0])
    171 
    172     def _construct_layout(self):
    173         log.info('SKIN PREVIEW - PreviewPanel Layout: Start constructing')
    174         self.preview_container = Container(name='preview_container', parent=self, align=uiconst.TOALL)
    175         self.scene_container = ShipSKINRSceneContainer(parent=self.preview_container, align=uiconst.TOALL)
    176         log.info('SKIN PREVIEW - PreviewPanel Layout: PaintPreviewSceneContainer constructed')
    177         self.sceneNavigation = SceneContainerBaseNavigation(name='preview_navigation', parent=self.preview_container, align=uiconst.TOALL, pos=(0, 0, 0, 0), idx=0, state=uiconst.UI_NORMAL, pickRadius=0)
    178         log.info('SKIN PREVIEW - PreviewPanel Layout: SceneContainerBaseNavigation constructed')
    179         self.sceneNavigation.Startup(self.scene_container)
    180         self.sceneNavigation.GetMenu = self.GetMenu
    181         log.info('SKIN PREVIEW - PreviewPanel Layout: SceneContainerBaseNavigation started up')
    182         if not is_green_screen_enabled():
    183             uthread2.start_tasklet(self.create_in_scene_cont)
    184         log.info('SKIN PREVIEW - PreviewPanel Layout: Finish constructing')
    185 
    186     def GetMenu(self):
    187         m = MenuData()
    188         if current_page.get_page_id() == SkinrPage.STUDIO_DESIGNER:
    189             m.AddEntry(GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/ResetAllSlots'), self.reset_all)
    190         return m
    191 
    192     def reset_all(self):
    193         current_skin_design.get().unfit_all()
    194         current_skin_design.add_to_undo_history()
    195 
    196     def create_in_scene_cont(self):
    197         trinity.WaitForResourceLoads()
    198         if self.scene_container.scene and self.scene_container.camera:
    199             log.info('SKIN PREVIEW - PreviewPanel Layout: SkinrInSceneContainer started constructing')
    200             self.in_scene_bg_container = SkinrInSceneContainer(parent=self, scene=self.scene_container.scene, camera=self.scene_container.camera, name='SceneCont', clearBackground=True, backgroundColor=(0, 0, 0, 0), trackType=InSceneContainer.TRACKTYPE_TRANSFORM)
    201             self.sceneNavigation.on_mouse_up.connect(self.in_scene_bg_container.on_mouse_up)
    202             log.info('SKIN PREVIEW - PreviewPanel Layout: SkinrInSceneContainer finished constructing')
    203 
    204     def on_ship_type_id_changed(self, type_id):
    205         self.preview_type(type_id, current_skin_design.get())
    206 
    207     def _on_slot_mouse_enter(self, slot_id):
    208         pass
    209 
    210     def _on_slot_mouse_exit(self):
    211         pass
    212 
    213     def preview_type(self, type_id, skinDesign = None, animate = True):
    214         self.scene_container.preview_type(type_id, skinDesign=skinDesign, animate=animate)
    215         if self.in_scene_bg_container:
    216             self.in_scene_bg_container.update()
    217 
    218     @property
    219     def camera_width(self):
    220         if not self.scene_container.camera:
    221             return None
    222         return self.scene_container.camera.GetWidth()
    223 
    224     @property
    225     def camera_height(self):
    226         if not self.scene_container.camera:
    227             return None
    228         return self.scene_container.camera.GetHeight()
    229 
    230     @property
    231     def camera_offset(self):
    232         if not self.scene_container.camera:
    233             return None
    234         return self.scene_container.camera.centerOffset
    235 
    236     @camera_offset.setter
    237     def camera_offset(self, value):
    238         if self.scene_container.camera:
    239             self.scene_container.camera.centerOffset = value
    240 
    241     def turn_camera(self, yaw, pitch, duration):
    242         if self.scene_container.camera:
    243             self.scene_container.turn_camera(yaw, pitch, duration)