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)