cosmeticFittingController.py (5569B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fitting\cosmeticFittingController.py 2 from eve.client.script.ui.inflight.shipstance import ShipStanceButtonController 3 import logging 4 from eve.client.script.ui.shared.fitting.fittingController import IsSubsystemBeingLoaded 5 from eve.client.script.ui.shared.skins.controller import GetSkinnedShipModel, GetMultiHullTypeIDList 6 from shipcosmetics.common.const import CosmeticsType 7 from cosmetics.common.cosmeticsConst import BACKGROUND_PATH_BY_TYPE, HINT_BY_TYPE 8 from eve.client.script.ui.shared.fitting.cosmeticSlotController import CosmeticSlotController 9 import inventorycommon.const as invConst 10 from eve.common.lib import appConst as const 11 import signals 12 from eve.client.script.ui.shared.fitting.fittingUtil import GetTypeIDForController 13 from localization import GetByLabel 14 logger = logging.getLogger(__name__) 15 16 class CosmeticFittingController(object): 17 __notifyevents__ = ['ProcessActiveShipChanged', 'OnDogmaItemChange'] 18 SLOT_GROUP_LAYOUT_ARCS = {0: (-34, 80), 19 1: (55, 20), 20 2: (75, 60), 21 3: (145, 80), 22 4: (236, 70), 23 5: (306, 10)} 24 SLOT_GROUPS = {0: (CosmeticsType.NONE, 25 CosmeticsType.NONE, 26 CosmeticsType.NONE, 27 CosmeticsType.NONE, 28 CosmeticsType.NONE, 29 CosmeticsType.NONE, 30 CosmeticsType.NONE, 31 CosmeticsType.NONE), 32 1: (CosmeticsType.ALLIANCE_LOGO, CosmeticsType.CORPORATION_LOGO), 33 2: (CosmeticsType.NONE, 34 CosmeticsType.NONE, 35 CosmeticsType.NONE, 36 CosmeticsType.NONE, 37 CosmeticsType.NONE, 38 CosmeticsType.NONE), 39 3: (CosmeticsType.NONE, 40 CosmeticsType.NONE, 41 CosmeticsType.NONE, 42 CosmeticsType.NONE, 43 CosmeticsType.NONE, 44 CosmeticsType.NONE, 45 CosmeticsType.NONE, 46 CosmeticsType.NONE), 47 4: (CosmeticsType.NONE, 48 CosmeticsType.NONE, 49 CosmeticsType.NONE, 50 CosmeticsType.NONE, 51 CosmeticsType.NONE, 52 CosmeticsType.NONE, 53 CosmeticsType.NONE), 54 5: (CosmeticsType.SKIN,)} 55 56 def __init__(self, itemID, typeID = None): 57 super(CosmeticFittingController, self).__init__() 58 sm.RegisterNotify(self) 59 self._dogmaLocation = None 60 self._skin = None 61 self._slotControllers = {} 62 self._itemID = itemID 63 self._typeID = typeID or GetTypeIDForController(itemID) 64 self.on_skin_material_changed = signals.Signal(signalName='on_skin_material_changed') 65 self.on_new_itemID = signals.Signal(signalName='on_new_itemID') 66 self.on_hardpoints_fitted = signals.Signal(signalName='on_hardpoints_fitted') 67 self.on_subsystem_fitted = signals.Signal(signalName='on_subsystem_fitted') 68 69 def Close(self): 70 self.on_new_itemID.clear() 71 self.on_skin_material_changed.clear() 72 sm.UnregisterNotify(self) 73 74 @property 75 def itemID(self): 76 return self._itemID 77 78 @property 79 def typeID(self): 80 return self._typeID 81 82 @property 83 def dogmaLocation(self): 84 if not self._dogmaLocation: 85 self._dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation() 86 return self._dogmaLocation 87 88 @property 89 def dogmaItem(self): 90 return self.dogmaLocation.SafeGetDogmaItem(self.itemID) 91 92 @property 93 def scenePath(self): 94 return 'res:/dx9/scene/fitting/fitting.red' 95 96 @property 97 def model(self): 98 multiHullTypeIDList = GetMultiHullTypeIDList(self.typeID, self.itemID, self.dogmaLocation) 99 return GetSkinnedShipModel(self._skin, self.typeID, multiHullTypeIDList) 100 101 @property 102 def texturePath(self): 103 if not self._skin: 104 return None 105 return self._skin.iconTexturePath 106 107 def SetDisplayedSkin(self, skin): 108 if self._skin == skin: 109 return 110 self._skin = skin 111 self.on_skin_material_changed() 112 113 def GetStanceBtnControllerClass(self): 114 return ShipStanceButtonController 115 116 def IsSimulated(self): 117 return False 118 119 def GetSlotController(self, cosmeticsType): 120 if cosmeticsType == CosmeticsType.NONE: 121 return 122 backgroundIconPath = BACKGROUND_PATH_BY_TYPE.get(cosmeticsType, '') 123 hintPath = HINT_BY_TYPE.get(cosmeticsType, '') 124 hint = GetByLabel(hintPath) if hintPath else '' 125 return CosmeticSlotController(backgroundIconPath, hint) 126 127 def ProcessActiveShipChanged(self, shipID, oldShipID): 128 if not self.IsSimulated(): 129 self.UpdateItem(shipID) 130 131 def UpdateItem(self, itemID, typeID = None): 132 oldItemID = self._itemID 133 oldTypeID = self._typeID 134 self._itemID = itemID 135 if typeID is None: 136 typeID = GetTypeIDForController(itemID) 137 self._typeID = typeID 138 self.on_new_itemID(itemID, oldItemID, typeID, oldTypeID) 139 140 def OnDogmaItemChange(self, item, change): 141 locationOrFlagIsInChange = const.ixFlag in change or const.ixLocationID in change 142 didStacksizeFlagOrLocationChange = const.ixStackSize in change or locationOrFlagIsInChange 143 if not didStacksizeFlagOrLocationChange: 144 return 145 oldLocationID = change.get(const.ixLocationID, None) 146 if self.itemID not in (oldLocationID, item.locationID): 147 return 148 if item.groupID in invConst.turretModuleGroups: 149 self.on_hardpoints_fitted() 150 if IsSubsystemBeingLoaded(change, item, self.itemID): 151 self.on_subsystem_fitted(throttle=True)