diff --git a/Assets/Content/Systems/UI/Lobby/Canvas/PlayerCanvas.prefab b/Assets/Content/Systems/UI/Lobby/Canvas/PlayerCanvas.prefab index daab71e4ce..e0b635016d 100644 --- a/Assets/Content/Systems/UI/Lobby/Canvas/PlayerCanvas.prefab +++ b/Assets/Content/Systems/UI/Lobby/Canvas/PlayerCanvas.prefab @@ -115,6 +115,7 @@ GameObject: - component: {fileID: 3810371244597919610} - component: {fileID: 3810371244597919611} - component: {fileID: 3810371244597919608} + - component: {fileID: 5020268363940819091} m_Layer: 5 m_Name: PlayerCanvas m_TagString: Untagged @@ -208,6 +209,40 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 +--- !u!114 &5020268363940819091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3810371244597919613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e09a4b7ae29894a4194f95800d897bb0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_id: a51fd45b-63c1-4bf8-9d97-7e24c8824630 + m_leaveFreeSpace: 1 + minimumFreeSpace: {x: 50, y: 50} + freeSpaceTargetTransform: {fileID: 0} + PreventDetachingLastDockedPanel: 0 + m_panelResizableAreaLength: 12 + m_canvasAnchorZoneLength: 20 + m_panelAnchorZoneLength: 100 + initialPanelsUnanchored: + - tabs: + - content: {fileID: 9191455379462354299} + id: a6e2e728-5908-449c-bd69-7764153746c7 + minimumSize: {x: 100, y: 190} + tabLabel: Construction + tabIcon: {fileID: 0} + initialPanelsAnchoredSerialized: + - panel: + tabs: [] + anchorDirection: 0 + initialSize: {x: 0, y: 0} + childCount: 0 + indexOfFirstChild: 1 --- !u!1001 &436718102503711467 PrefabInstance: m_ObjectHideFlags: 0 @@ -899,6 +934,10 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: 0 objectReference: {fileID: 0} + - target: {fileID: 7328864950246393767, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 7667759673089745612, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: m_AnchorMax.y value: 0 @@ -1097,11 +1136,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8755300268855498640, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: m_SizeDelta.x - value: 136.9483 + value: 145 objectReference: {fileID: 0} - target: {fileID: 8755300268855498640, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: m_SizeDelta.y - value: 199.4413 + value: 190 objectReference: {fileID: 0} - target: {fileID: 8755300268855498640, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: m_LocalPosition.x @@ -1185,7 +1224,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: _scenePathHash - value: 2499635508 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} propertyPath: k__BackingField @@ -1199,14 +1238,71 @@ PrefabInstance: propertyPath: _sceneNetworkObjects.Array.data[14] value: objectReference: {fileID: 8720228674029226883} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Position.x + value: 315.46954 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Position.y + value: 7.705841 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Rotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Rotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Rotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.Rotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.LocalScale.x + value: 1.3615595 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.LocalScale.y + value: 1.3615595 + objectReference: {fileID: 0} + - target: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} + propertyPath: SerializedTransformProperties.LocalScale.z + value: 1.3615595 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: af039f84b4a245049b5b62799af01384, type: 3} +--- !u!1 &2110225533454929485 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1965414683581951142, guid: af039f84b4a245049b5b62799af01384, type: 3} + m_PrefabInstance: {fileID: 436718102503711467} + m_PrefabAsset: {fileID: 0} +--- !u!114 &8750195271371571836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2110225533454929485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 13f43f7a9474ed54489e906030258e3c, type: 3} + m_Name: + m_EditorClassIdentifier: + horizontalCursor: {fileID: 2800000, guid: a9c77eeb970c9ae40a370ca7060be120, type: 3} + verticalCursor: {fileID: 2800000, guid: 68ac78481f5b6df4da69a6f5133b6702, type: 3} + diagonalCursorTopLeft: {fileID: 2800000, guid: cbaa205f7a905b8429011ee0c50015ea, type: 3} + diagonalCursorTopRight: {fileID: 2800000, guid: e5a757b3ef912a24c912a99d9e1befe5, type: 3} --- !u!114 &8720228674029226883 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 9154675693299657064, guid: af039f84b4a245049b5b62799af01384, type: 3} m_PrefabInstance: {fileID: 436718102503711467} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 2110225533454929485} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 26b716c41e9b56b4baafaf13a523ba2e, type: 3} @@ -1224,6 +1320,94 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 3810371244597919609} m_Modifications: + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4416089188971054470, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: ClothingSlotPosition.Array.data[6] + value: 2048 + objectReference: {fileID: 0} + - target: {fileID: 4416089188971054470, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: ClothingSlotPosition.Array.data[8] + value: 4096 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6178539299263414650, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_Name + value: HumanoidInventoryAlt + objectReference: {fileID: 0} + - target: {fileID: 8084791768262570791, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} + propertyPath: m_LocalPosition.y + value: -95 + objectReference: {fileID: 0} - target: {fileID: -1906626332709311754, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} propertyPath: PocketView value: @@ -1327,7 +1511,7 @@ PrefabInstance: - target: {fileID: 3962283478476174122, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} propertyPath: TransformParent value: - objectReference: {fileID: 5088917634584121396} + objectReference: {fileID: 0} - target: {fileID: 4834630309877844804, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} propertyPath: m_AnchorMax.y value: 0 @@ -1388,94 +1572,6 @@ PrefabInstance: propertyPath: m_RootOrder value: 0 objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3885246897420459619, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4416089188971054470, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: ClothingSlotPosition.Array.data[6] - value: 2048 - objectReference: {fileID: 0} - - target: {fileID: 4416089188971054470, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: ClothingSlotPosition.Array.data[8] - value: 4096 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6178539299263414650, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_Name - value: HumanoidInventoryAlt - objectReference: {fileID: 0} - - target: {fileID: 8084791768262570791, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} - propertyPath: m_LocalPosition.y - value: -95 - objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} --- !u!224 &2562945676042755091 stripped @@ -1483,22 +1579,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4452887637558266342, guid: 0b8fbd4d5c5a29648b0311070cd87b40, type: 3} m_PrefabInstance: {fileID: 2187267507583538677} m_PrefabAsset: {fileID: 0} ---- !u!224 &5088917634584121396 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1395738565, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} - m_PrefabInstance: {fileID: 5088917633293277169} - m_PrefabAsset: {fileID: 0} ---- !u!114 &8098506172083102939 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 3962283478476174122, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} - m_PrefabInstance: {fileID: 5088917633293277169} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d16d9c9e1fac9c84da0a1db31c0c4294, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1001 &5313005819554070362 PrefabInstance: m_ObjectHideFlags: 0 @@ -1720,3 +1800,15 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 7737500049335600593, guid: 2c5702094085193418715c5332700e54, type: 3} m_PrefabInstance: {fileID: 6752008115007009143} m_PrefabAsset: {fileID: 0} +--- !u!114 &8098506172083102939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 3962283478476174122, guid: 40bc053ef2ba6d74fb3ebcf645b4925f, type: 3} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d16d9c9e1fac9c84da0a1db31c0c4294, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/Content/Systems/UI/Systems/Construction/ConstructionMenu.prefab b/Assets/Content/Systems/UI/Systems/Construction/ConstructionMenu.prefab index c9131e2015..fa5a06eb17 100644 --- a/Assets/Content/Systems/UI/Systems/Construction/ConstructionMenu.prefab +++ b/Assets/Content/Systems/UI/Systems/Construction/ConstructionMenu.prefab @@ -1132,7 +1132,7 @@ RectTransform: m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: -224.96143, y: 322.66217} - m_SizeDelta: {x: 170.0795, y: 238.238} + m_SizeDelta: {x: 180, y: 238.238} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6060677056020711314 CanvasRenderer: @@ -3242,6 +3242,7 @@ GameObject: m_Component: - component: {fileID: 2180168398058430789} - component: {fileID: 4686284081446859306} + - component: {fileID: 5112122915852808111} m_Layer: 5 m_Name: Content m_TagString: Untagged @@ -3294,6 +3295,18 @@ MonoBehaviour: m_Spacing: {x: 5, y: 5} m_Constraint: 1 m_ConstraintCount: 2 +--- !u!114 &5112122915852808111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6243703131314193102} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ca78eb30848a4fe40b2c16cdfff48e37, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &6321497670735554424 GameObject: m_ObjectHideFlags: 0 @@ -3705,7 +3718,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &4235739587677223029 RectTransform: m_ObjectHideFlags: 0 @@ -3808,7 +3821,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 2287788854832640797} m_HandleRect: {fileID: 3379647602017452814} m_Direction: 2 - m_Value: 0 + m_Value: 1 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: @@ -4380,7 +4393,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: -0.000030517578, y: -0.00018310547} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} diff --git a/Assets/Scripts/External/DynamicPanels.meta b/Assets/Scripts/External/DynamicPanels.meta new file mode 100644 index 0000000000..5a84f09d9c --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 002e4d9537cfa9d468d758ae131c3cd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Cursors.meta b/Assets/Scripts/External/DynamicPanels/Cursors.meta new file mode 100644 index 0000000000..b01b9e4e5e --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Cursors.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dec2ff6bcde25404e8b08e47281324f4 +folderAsset: yes +timeCreated: 1550698230 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd new file mode 100644 index 0000000000..5ddd2149c7 Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd.meta b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd.meta new file mode 100644 index 0000000000..f4ce60ba87 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a9c77eeb970c9ae40a370ca7060be120 +timeCreated: 1550692045 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 7 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd new file mode 100644 index 0000000000..617de5f45e Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd.meta b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd.meta new file mode 100644 index 0000000000..c6230929b4 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: cbaa205f7a905b8429011ee0c50015ea +timeCreated: 1550692045 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 7 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd new file mode 100644 index 0000000000..78dff0fc58 Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd.meta b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd.meta new file mode 100644 index 0000000000..2ba84c2005 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: e5a757b3ef912a24c912a99d9e1befe5 +timeCreated: 1550692045 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 7 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd new file mode 100644 index 0000000000..982f8f7bcc Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd.meta b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd.meta new file mode 100644 index 0000000000..109349efcd --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 68ac78481f5b6df4da69a6f5133b6702 +timeCreated: 1550692045 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 7 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/DemoScene.unity b/Assets/Scripts/External/DynamicPanels/DemoScene.unity new file mode 100644 index 0000000000..8dd95e3177 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/DemoScene.unity @@ -0,0 +1,1089 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.15743946, g: 0.17289996, b: 0.20588237, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 0.32 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 8 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 3 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 + m_LightingDataAsset: {fileID: 0} + m_ShadowMaskMode: 2 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &225541481 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1550482164782042, guid: 3463f335a20289e41b9d19d13653fc06, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 225541484} + - component: {fileID: 225541483} + - component: {fileID: 225541482} + - component: {fileID: 225541485} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &225541482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114326002331582782, guid: 3463f335a20289e41b9d19d13653fc06, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225541481} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &225541483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114785608876326778, guid: 3463f335a20289e41b9d19d13653fc06, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225541481} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &225541484 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4159788557604300, guid: 3463f335a20289e41b9d19d13653fc06, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225541481} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &225541485 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114817944282768750, guid: 3463f335a20289e41b9d19d13653fc06, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225541481} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1327945023, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &240130173 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 240130174} + - component: {fileID: 240130177} + - component: {fileID: 240130176} + - component: {fileID: 240130175} + m_Layer: 5 + m_Name: CanvasRight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &240130174 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 240130173} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 480963707} + - {fileID: 1231044452} + m_Father: {fileID: 1721750717} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.53, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &240130175 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 240130173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.303} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &240130176 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 240130173} +--- !u!114 &240130177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 240130173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e09a4b7ae29894a4194f95800d897bb0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_id: ad68d1e6-0ea8-4b80-b2cd-49680bcdc689 + m_leaveFreeSpace: 1 + minimumFreeSpace: {x: 50, y: 50} + m_panelResizableAreaLength: 15 + m_canvasAnchorZoneLength: 20 + m_panelAnchorZoneLength: 80 + initialPanelsUnanchored: [] + initialPanelsAnchoredSerialized: + - panel: + tabs: [] + anchorDirection: 0 + initialSize: {x: 0, y: 0} + childCount: 1 + indexOfFirstChild: 1 + - panel: + tabs: + - content: {fileID: 1231044452} + id: 1a5df545-f031-4dff-8d79-c6c72407f744 + minimumSize: {x: 200, y: 200} + tabLabel: Yellow Tab + tabIcon: {fileID: 0} + - content: {fileID: 480963707} + id: a8af3244-61e4-4ab5-be9c-08c17ee182a5 + minimumSize: {x: 200, y: 200} + tabLabel: Purple Tab + tabIcon: {fileID: 0} + anchorDirection: 3 + initialSize: {x: 0, y: 0} + childCount: 0 + indexOfFirstChild: 2 +--- !u!1 &480963706 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 480963707} + - component: {fileID: 480963709} + - component: {fileID: 480963708} + m_Layer: 5 + m_Name: Purple + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &480963707 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 480963706} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 240130174} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &480963708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 480963706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.627451, g: 0.1254902, b: 0.778, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &480963709 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 480963706} +--- !u!1 &491618927 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 491618928} + - component: {fileID: 491618930} + - component: {fileID: 491618929} + m_Layer: 5 + m_Name: Orange + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &491618928 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 491618927} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 647658035} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 465.99997, y: -115} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &491618929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 491618927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9705882, g: 0.5468172, b: 0.09277679, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &491618930 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 491618927} +--- !u!1 &587092777 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 587092779} + - component: {fileID: 587092778} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &587092778 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587092777} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.31 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &587092779 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587092777} + m_LocalRotation: {x: 0.01058352, y: 0.9060236, z: -0.42248574, w: 0.022696435} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &647658034 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 647658035} + - component: {fileID: 647658036} + - component: {fileID: 647658038} + - component: {fileID: 647658037} + m_Layer: 5 + m_Name: CanvasLeft + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &647658035 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647658034} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 801020840} + - {fileID: 1199676140} + - {fileID: 2038115445} + - {fileID: 491618928} + m_Father: {fileID: 1721750717} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.47, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &647658036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647658034} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e09a4b7ae29894a4194f95800d897bb0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_id: 2be1f88c-39da-4087-b957-7dda543cc09d + m_leaveFreeSpace: 1 + minimumFreeSpace: {x: 50, y: 50} + m_panelResizableAreaLength: 15 + m_canvasAnchorZoneLength: 20 + m_panelAnchorZoneLength: 80 + initialPanelsUnanchored: + - tabs: + - content: {fileID: 801020840} + id: 655a8208-4a9a-460c-807f-63e56b25ef0e + minimumSize: {x: 100, y: 100} + tabLabel: Green Tab + tabIcon: {fileID: 0} + initialPanelsAnchoredSerialized: + - panel: + tabs: [] + anchorDirection: 0 + initialSize: {x: 0, y: 0} + childCount: 2 + indexOfFirstChild: 1 + - panel: + tabs: + - content: {fileID: 2038115445} + id: 706988d7-ad78-4684-bfaa-0566a6f8447f + minimumSize: {x: 150, y: 150} + tabLabel: Blue Tab + tabIcon: {fileID: 0} + anchorDirection: 1 + initialSize: {x: 0, y: 0} + childCount: 0 + indexOfFirstChild: 2 + - panel: + tabs: + - content: {fileID: 1199676140} + id: d36d315f-1177-4acf-8805-66a7c7342f98 + minimumSize: {x: 150, y: 150} + tabLabel: Red Tab + tabIcon: {fileID: 0} + - content: {fileID: 491618928} + id: 5bc34423-650b-42dc-ac78-b45a433fc380 + minimumSize: {x: 150, y: 150} + tabLabel: Orange Tab + tabIcon: {fileID: 0} + anchorDirection: 0 + initialSize: {x: 0, y: 0} + childCount: 0 + indexOfFirstChild: 3 +--- !u!114 &647658037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647658034} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.303} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &647658038 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647658034} +--- !u!1 &801020839 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 801020840} + - component: {fileID: 801020842} + - component: {fileID: 801020841} + m_Layer: 5 + m_Name: Green + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &801020840 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801020839} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 647658035} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 300} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &801020841 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801020839} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.09277679, g: 0.9705882, b: 0.42573977, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &801020842 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801020839} +--- !u!1 &907922836 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 907922841} + - component: {fileID: 907922840} + - component: {fileID: 907922839} + - component: {fileID: 907922838} + - component: {fileID: 907922837} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &907922837 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907922836} + m_Enabled: 1 +--- !u!124 &907922838 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907922836} + m_Enabled: 1 +--- !u!92 &907922839 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907922836} + m_Enabled: 1 +--- !u!20 &907922840 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907922836} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 75 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!4 &907922841 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907922836} + m_LocalRotation: {x: 0.022595186, y: -0.9665775, z: 0.09161523, w: 0.23837811} + m_LocalPosition: {x: -12.928717, y: 2.1726065, z: -7.62846} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1199676139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1199676140} + - component: {fileID: 1199676142} + - component: {fileID: 1199676141} + m_Layer: 5 + m_Name: Red + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1199676140 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1199676139} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 647658035} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 200, y: 150} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1199676141 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1199676139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.88235295, g: 0.14273354, b: 0.14273354, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1199676142 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1199676139} +--- !u!1 &1231044451 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1231044452} + - component: {fileID: 1231044454} + - component: {fileID: 1231044453} + m_Layer: 5 + m_Name: Yellow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1231044452 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1231044451} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 240130174} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 200, y: 150} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1231044453 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1231044451} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.991, g: 1, b: 0.191, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1231044454 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1231044451} +--- !u!1 &1721750713 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1721750717} + - component: {fileID: 1721750716} + - component: {fileID: 1721750715} + - component: {fileID: 1721750714} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1721750714 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721750713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1721750715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721750713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1024, y: 768} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1721750716 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721750713} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1721750717 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721750713} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 647658035} + - {fileID: 240130174} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &2038115444 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2038115445} + - component: {fileID: 2038115447} + - component: {fileID: 2038115446} + m_Layer: 5 + m_Name: Blue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2038115445 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038115444} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 647658035} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 685.31384, y: 18.85} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &2038115446 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038115444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3451557, g: 0.37570384, b: 0.97794116, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &2038115447 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038115444} diff --git a/Assets/Scripts/External/DynamicPanels/DemoScene.unity.meta b/Assets/Scripts/External/DynamicPanels/DemoScene.unity.meta new file mode 100644 index 0000000000..9ad3d8a55f --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/DemoScene.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e281fe27261b1da49893c13d99a44b97 +timeCreated: 1505604062 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef b/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef new file mode 100644 index 0000000000..edb5617579 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef @@ -0,0 +1,6 @@ +{ + "name": "DynamicPanels.Runtime", + "references": [ + "Unity.InputSystem" + ] +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef.meta b/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef.meta new file mode 100644 index 0000000000..a62b70487a --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 47588e3d37f573d458b0eaa6cc8109c2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Editor.meta b/Assets/Scripts/External/DynamicPanels/Editor.meta new file mode 100644 index 0000000000..b1211df3be --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 05ed54b377aa11a44b72e14f82f44322 +folderAsset: yes +timeCreated: 1521749988 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef new file mode 100644 index 0000000000..4d8e0daa7b --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef @@ -0,0 +1,17 @@ +{ + "name": "DynamicPanels.Editor", + "references": [ + "DynamicPanels.Runtime" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef.meta b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef.meta new file mode 100644 index 0000000000..285f2fa83c --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57745fdc21e824f47b72f67cbb7c540b +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs new file mode 100644 index 0000000000..8898a6a190 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs @@ -0,0 +1,618 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; + +namespace DynamicPanels +{ + [CustomEditor( typeof( DynamicPanelsCanvas ) )] + [CanEditMultipleObjects] + public class DynamicPanelsCanvasEditor : Editor + { + private DynamicPanelsCanvas.InternalSettings settings; + + private const float LABEL_WIDTH = 100f; + private const float ANCHORED_PANELS_PREVIEW_HEIGHT = 350f; + private const string SHOW_IDS_PREF = "DynamicPanels_ShowIDs"; + + private static bool showIDs; + + private List reorderableLists; + private int reorderableListIndex; + private bool isReorderableListSelected; + + private DynamicPanelsCanvas.AnchoredPanelProperties selectedAnchoredPanel; + private DynamicPanelsCanvas.AnchoredPanelProperties justClickedAnchoredPanel; + private List selectedAnchoredPanelTabs; + + private GUIStyle anchoredPanelGUIStyle; + + private SerializedProperty leaveFreeSpace; + private SerializedProperty minimumFreeSpace; + private SerializedProperty freeSpaceTargetTransform; + private SerializedProperty preventDetachingLastDockedPanel; + private SerializedProperty panelResizableAreaLength; + private SerializedProperty canvasAnchorZoneLength; + private SerializedProperty panelAnchorZoneLength; + + private void OnEnable() + { + settings = ( (DynamicPanelsCanvas) target ).Internal; + + reorderableLists = new List(); + selectedAnchoredPanel = settings.InitialPanelsAnchored; + selectedAnchoredPanelTabs = selectedAnchoredPanel.panel.tabs; + + leaveFreeSpace = serializedObject.FindProperty( "m_leaveFreeSpace" ); + minimumFreeSpace = serializedObject.FindProperty( "minimumFreeSpace" ); + freeSpaceTargetTransform = serializedObject.FindProperty( "freeSpaceTargetTransform" ); + preventDetachingLastDockedPanel = serializedObject.FindProperty( "PreventDetachingLastDockedPanel" ); + panelResizableAreaLength = serializedObject.FindProperty( "m_panelResizableAreaLength" ); + canvasAnchorZoneLength = serializedObject.FindProperty( "m_canvasAnchorZoneLength" ); + panelAnchorZoneLength = serializedObject.FindProperty( "m_panelAnchorZoneLength" ); + + showIDs = EditorPrefs.GetBool( SHOW_IDS_PREF, false ); + + Undo.undoRedoPerformed -= OnUndo; + Undo.undoRedoPerformed += OnUndo; + } + + private void OnUndo() + { + settings = ( (DynamicPanelsCanvas) target ).Internal; + + selectedAnchoredPanel = settings.InitialPanelsAnchored; + selectedAnchoredPanelTabs = selectedAnchoredPanel.panel.tabs; + } + + [MenuItem( "CONTEXT/DynamicPanelsCanvas/Toggle Show IDs" )] + private static void ToggleShowIDs() + { + showIDs = !EditorPrefs.GetBool( SHOW_IDS_PREF, false ); + EditorPrefs.SetBool( SHOW_IDS_PREF, showIDs ); + } + + public override void OnInspectorGUI() + { + if( anchoredPanelGUIStyle == null ) + { + anchoredPanelGUIStyle = new GUIStyle( "box" ) + { + alignment = TextAnchor.MiddleCenter, + clipping = TextClipping.Clip + }; + } + + if( justClickedAnchoredPanel != null && Event.current.type == EventType.Layout ) + { + selectedAnchoredPanel = justClickedAnchoredPanel; + selectedAnchoredPanelTabs = selectedAnchoredPanel.panel.tabs; + + justClickedAnchoredPanel = null; + } + + serializedObject.Update(); + reorderableListIndex = 0; + + bool multiObjectEditing = targets.Length > 1; + bool guiEnabled = !EditorApplication.isPlaying || AssetDatabase.Contains( ( (DynamicPanelsCanvas) serializedObject.targetObject ).gameObject ); + + GUI.enabled = guiEnabled; + GUILayout.BeginVertical(); + + EditorGUILayout.LabelField( "= Properties =", EditorStyles.boldLabel ); + EditorGUILayout.PropertyField( leaveFreeSpace ); + EditorGUI.indentLevel++; + GUI.enabled = guiEnabled && leaveFreeSpace.boolValue; + EditorGUILayout.PropertyField( minimumFreeSpace ); + EditorGUILayout.PropertyField( freeSpaceTargetTransform ); + GUI.enabled = guiEnabled; + EditorGUI.indentLevel--; + EditorGUILayout.PropertyField( preventDetachingLastDockedPanel ); + EditorGUILayout.PropertyField( panelResizableAreaLength ); + EditorGUILayout.PropertyField( canvasAnchorZoneLength ); + EditorGUILayout.PropertyField( panelAnchorZoneLength ); + + GUILayout.Space( 10f ); + + EditorGUILayout.LabelField( "= Free Panels =", EditorStyles.boldLabel ); + if( multiObjectEditing ) + GUILayout.Label( "Multi-object editing not supported" ); + else if( !guiEnabled ) + GUILayout.Label( "Can't edit in Play mode" ); + else + { + List initialPanelsUnanchored = settings.InitialPanelsUnanchored; + int selectedReorderableListIndex = -1; + for( int i = 0; i < initialPanelsUnanchored.Count; i++ ) + { + if( DrawReorderableListFor( initialPanelsUnanchored[i] ) ) + selectedReorderableListIndex = i; + + if( i < initialPanelsUnanchored.Count - 1 ) + { + // Draw a horizontal line to separate the panels + GUILayout.Space( 5f ); + GUILayout.Box( GUIContent.none, GUILayout.ExpandWidth( true ), GUILayout.Height( 2f ) ); + } + + GUILayout.Space( 5f ); + } + + GUILayout.BeginHorizontal(); + + if( GUILayout.Button( "Add New", GUILayout.Height( 1.35f * EditorGUIUtility.singleLineHeight ) ) ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Add Free Panel" ); + + initialPanelsUnanchored.Add( new DynamicPanelsCanvas.PanelProperties() ); + } + + if( selectedReorderableListIndex < 0 ) + GUI.enabled = false; + + if( GUILayout.Button( "Remove Selected", GUILayout.Height( 1.35f * EditorGUIUtility.singleLineHeight ) ) ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Remove Free Panel" ); + + initialPanelsUnanchored.RemoveAt( selectedReorderableListIndex ); + } + + GUI.enabled = guiEnabled; + + GUILayout.EndHorizontal(); + } + + GUILayout.Space( 13f ); + + EditorGUILayout.LabelField( "= Docked Panels =", EditorStyles.boldLabel ); + if( multiObjectEditing ) + GUILayout.Label( "Multi-object editing not supported" ); + else if( !guiEnabled ) + GUILayout.Label( "Can't edit in Play mode" ); + else + { + DynamicPanelsCanvas.AnchoredPanelProperties initialPanelsAnchored = settings.InitialPanelsAnchored; + + Rect previewRect = EditorGUILayout.GetControlRect( false, ANCHORED_PANELS_PREVIEW_HEIGHT ); + DrawAnchoredPanelsPreview( previewRect, initialPanelsAnchored ); + + if( selectedAnchoredPanel != null ) + { + GUILayout.BeginVertical( EditorStyles.helpBox ); + GUILayout.Space( 5f ); + EditorGUILayout.LabelField( "Selected panel:", EditorStyles.boldLabel ); + + if( selectedAnchoredPanelTabs != settings.InitialPanelsAnchored.panel.tabs ) + { + string initialSizeLabel = selectedAnchoredPanel.initialSize == Vector2.zero ? "Initial Size (not set):" : "Initial Size:"; + + EditorGUI.BeginChangeCheck(); + Vector2 panelInitialSize = EditorGUILayout.Vector2Field( initialSizeLabel, selectedAnchoredPanel.initialSize ); + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change Initial Size" ); + selectedAnchoredPanel.initialSize = panelInitialSize; + } + + DrawReorderableListFor( selectedAnchoredPanel.panel ); + } + else + GUILayout.Label( "- nothing -" ); + + Direction direction = ShowDirectionButtons( "Dock new panel inside: " ); + if( direction != Direction.None ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Dock New Panel" ); + + selectedAnchoredPanel.subPanels.Add( new DynamicPanelsCanvas.AnchoredPanelProperties() { anchorDirection = direction } ); + } + + if( selectedAnchoredPanelTabs != settings.InitialPanelsAnchored.panel.tabs ) + { + GUILayout.Space( 5f ); + if( GUILayout.Button( "Remove Selected", GUILayout.Height( 1.35f * EditorGUIUtility.singleLineHeight ) ) ) + RemoveAnchoredPanel( settings.InitialPanelsAnchored, selectedAnchoredPanel ); + } + + GUILayout.EndVertical(); + } + + GUILayout.Space( 6f ); + + Direction rootDirection = ShowDirectionButtons( "Dock new panel to canvas: " ); + if( rootDirection != Direction.None ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Dock New Panel" ); + + settings.InitialPanelsAnchored.subPanels.Insert( 0, new DynamicPanelsCanvas.AnchoredPanelProperties() { anchorDirection = rootDirection } ); + } + } + + GUI.enabled = true; + GUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + + private Direction ShowDirectionButtons( string label ) + { + GUILayout.BeginHorizontal(); + GUILayout.Label( label ); + + Direction result = Direction.None; + if( GUILayout.Button( "Left" ) ) + result = Direction.Left; + if( GUILayout.Button( "Top" ) ) + result = Direction.Top; + if( GUILayout.Button( "Right" ) ) + result = Direction.Right; + if( GUILayout.Button( "Bottom" ) ) + result = Direction.Bottom; + + GUILayout.EndHorizontal(); + + return result; + } + + private bool RemoveAnchoredPanel( DynamicPanelsCanvas.AnchoredPanelProperties root, DynamicPanelsCanvas.AnchoredPanelProperties panel ) + { + for( int i = 0; i < root.subPanels.Count; i++ ) + { + if( root.subPanels[i] == panel ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Remove Panel" ); + + DynamicPanelsCanvas.AnchoredPanelProperties replacementPanel = null; + if( panel.subPanels.Count > 0 ) + { + replacementPanel = panel.subPanels[panel.subPanels.Count - 1]; + panel.subPanels.RemoveAt( panel.subPanels.Count - 1 ); + + if( replacementPanel != null ) + { + replacementPanel.anchorDirection = panel.anchorDirection; + replacementPanel.subPanels.InsertRange( 0, panel.subPanels ); + } + } + + if( replacementPanel == null ) + root.subPanels.RemoveAt( i ); + else + root.subPanels[i] = replacementPanel; + + justClickedAnchoredPanel = settings.InitialPanelsAnchored; + return true; + } + else if( RemoveAnchoredPanel( root.subPanels[i], panel ) ) + return true; + } + + return false; + } + + private void DrawAnchoredPanelsPreview( Rect rect, DynamicPanelsCanvas.AnchoredPanelProperties props ) + { + bool shouldDrawSelf = leaveFreeSpace.boolValue || props != settings.InitialPanelsAnchored || props.subPanels == null || props.subPanels.Count == 0; + if( props.subPanels != null && props.subPanels.Count > 0 ) + { + int horizontal = 1, vertical = 1; + for( int i = 0; i < props.subPanels.Count; i++ ) + { + Direction anchorDirection = props.subPanels[i].anchorDirection; + if( anchorDirection == Direction.Left || anchorDirection == Direction.Right ) + horizontal++; + else + vertical++; + } + + if( !shouldDrawSelf ) + { + Direction anchorDirection = props.subPanels[props.subPanels.Count - 1].anchorDirection; + if( anchorDirection == Direction.Left || anchorDirection == Direction.Right ) + { + if( horizontal > 1 ) + horizontal--; + } + else + { + if( vertical > 1 ) + vertical--; + } + } + + float perWidth = rect.width / horizontal; + float perHeight = rect.height / vertical; + for( int i = 0; i < props.subPanels.Count; i++ ) + { + Rect subRect = new Rect( rect ); + Direction anchorDirection = props.subPanels[i].anchorDirection; + if( anchorDirection == Direction.Left ) + { + rect.x += perWidth; + rect.width -= perWidth; + subRect.width = perWidth; + } + else if( anchorDirection == Direction.Top ) + { + rect.y += perHeight; + rect.height -= perHeight; + subRect.height = perHeight; + } + else if( anchorDirection == Direction.Right ) + { + rect.width -= perWidth; + subRect.width = perWidth; + subRect.x = rect.xMax; + } + else + { + rect.height -= perHeight; + subRect.height = perHeight; + subRect.y = rect.yMax; + } + + DrawAnchoredPanelsPreview( subRect, props.subPanels[i] ); + } + } + + if( !shouldDrawSelf ) + return; + + string label; + if( props == settings.InitialPanelsAnchored ) + label = "Free space"; + else + { + label = "Panel"; + + List tabs = props.panel.tabs; + for( int i = 0; i < tabs.Count; i++ ) + { + if( !string.IsNullOrEmpty( tabs[i].tabLabel ) ) + { + label = tabs[i].tabLabel; + break; + } + } + + if( tabs.Count == 1 ) + label = string.Concat( label, "\n1 tab" ); + else + label = string.Concat( label, "\n", tabs.Count.ToString(), " tabs" ); + } + + if( selectedAnchoredPanel == props ) + { + Color guiColor = GUI.color; + GUI.color = Color.cyan; + GUI.Box( rect, label, anchoredPanelGUIStyle ); + GUI.color = guiColor; + } + else + GUI.Box( rect, label, anchoredPanelGUIStyle ); + + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + + Event ev = Event.current; + switch( ev.GetTypeForControl( controlID ) ) + { + case EventType.MouseDown: + if( rect.Contains( ev.mousePosition ) && ev.button == 0 ) + { + GUIUtility.hotControl = controlID; + justClickedAnchoredPanel = props; + } + + break; + case EventType.MouseDrag: + if( GUIUtility.hotControl == controlID && props != settings.InitialPanelsAnchored ) + { + GUIUtility.hotControl = 0; + + // Credit: https://forum.unity.com/threads/editor-draganddrop-bug-system-needs-to-be-initialized-by-unity.219342/#post-1464056 + DragAndDrop.PrepareStartDrag(); + DragAndDrop.objectReferences = new Object[] { null }; + DragAndDrop.SetGenericData( "props", props ); + DragAndDrop.StartDrag( "AnchoredPanelProperties" ); + + ev.Use(); + } + + break; + case EventType.MouseUp: + if( GUIUtility.hotControl == controlID ) + GUIUtility.hotControl = 0; + + break; + case EventType.DragPerform: + case EventType.DragUpdated: + if( props != settings.InitialPanelsAnchored && rect.Contains( ev.mousePosition ) ) + { + DynamicPanelsCanvas.AnchoredPanelProperties drag = DragAndDrop.GetGenericData( "props" ) as DynamicPanelsCanvas.AnchoredPanelProperties; + if( drag == null ) + { + int i; + Object[] draggedObjects = DragAndDrop.objectReferences; + for( i = 0; i < draggedObjects.Length; i++ ) + { + if( draggedObjects[i] is GameObject || draggedObjects[i] is Component ) + break; + } + + if( i == draggedObjects.Length ) + break; + } + + DragAndDrop.visualMode = DragAndDropVisualMode.Move; + if( ev.type == EventType.DragPerform ) + { + DragAndDrop.AcceptDrag(); + + if( drag != null ) + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Swap Tabs" ); + + DynamicPanelsCanvas.PanelProperties temp = props.panel; + props.panel = drag.panel; + drag.panel = temp; + } + else + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Add Tabs" ); + + Object[] draggedObjects = DragAndDrop.objectReferences; + for( int i = 0; i < draggedObjects.Length; i++ ) + { + RectTransform transform; + if( draggedObjects[i] is GameObject ) + transform = ( (GameObject) draggedObjects[i] ).transform as RectTransform; + else + transform = ( (Component) draggedObjects[i] ).transform as RectTransform; + + if( transform != null ) + { + if( props.panel.tabs.Find( ( tab ) => tab.content == transform ) == null ) + props.panel.tabs.Add( new DynamicPanelsCanvas.PanelTabProperties() { content = transform } ); + } + } + } + } + + ev.Use(); + } + + break; + } + + if( ev.isMouse && GUIUtility.hotControl == controlID ) + ev.Use(); + } + + private bool DrawReorderableListFor( DynamicPanelsCanvas.PanelProperties panelProperties ) + { + isReorderableListSelected = false; + float elementHeight = ( showIDs ? 4 : 3 ) * EditorGUIUtility.singleLineHeight + 2; + + List tabs = panelProperties.tabs; + if( reorderableLists.Count > reorderableListIndex ) + { + reorderableLists[reorderableListIndex].list = tabs; + reorderableLists[reorderableListIndex].elementHeight = elementHeight; + } + else + { + ReorderableList reorderableList = new ReorderableList( tabs, typeof( DynamicPanelsCanvas.PanelTabProperties ), true, true, true, true ) + { + elementHeight = elementHeight, + onAddCallback = ( thisList ) => + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Add Tab" ); + + ReorderableList.defaultBehaviours.DoAddButton( thisList ); + }, + onRemoveCallback = ( thisList ) => + { + Undo.IncrementCurrentGroup(); + Undo.RecordObject( (DynamicPanelsCanvas) target, "Remove Tab" ); + + ReorderableList.defaultBehaviours.DoRemoveButton( thisList ); + }, + drawHeaderCallback = ( rect ) => GUI.Label( rect, "Tabs" ) + }; + + reorderableList.drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + isReorderableListSelected |= isActive && isFocused; + DrawReorderableListItem( rect, index, (DynamicPanelsCanvas.PanelTabProperties) reorderableList.list[index] ); + }; + + reorderableLists.Add( reorderableList ); + } + + reorderableLists[reorderableListIndex].DoLayoutList(); + reorderableListIndex++; + + return isReorderableListSelected; + } + + private void DrawReorderableListItem( Rect rect, int index, DynamicPanelsCanvas.PanelTabProperties tab ) + { + rect.y += 2; + + float lineHeight = EditorGUIUtility.singleLineHeight; + float contentWidth = rect.width - LABEL_WIDTH; + Vector2 tabMinimumSize = tab.minimumSize; + + Rect contentLabelRect = new Rect( rect.x, rect.y, LABEL_WIDTH, lineHeight ); + Rect contentRect = new Rect( rect.x + LABEL_WIDTH, rect.y, contentWidth, lineHeight ); + + Rect tabMetadataLabelRect = new Rect( rect.x, rect.y + lineHeight, LABEL_WIDTH, lineHeight ); + Rect tabLabelRect = new Rect( rect.x + LABEL_WIDTH, rect.y + lineHeight, contentWidth * 0.5f, lineHeight ); + Rect tabIconRect = new Rect( rect.x + LABEL_WIDTH + contentWidth * 0.5f, rect.y + lineHeight, contentWidth * 0.5f, lineHeight ); + + Rect minSizeLabelRect = new Rect( rect.x, rect.y + 2 * lineHeight, LABEL_WIDTH, lineHeight ); + Rect minSizeXRect = new Rect( rect.x + LABEL_WIDTH, rect.y + 2 * lineHeight, contentWidth * 0.5f, lineHeight ); + Rect minSizeYRect = new Rect( rect.x + LABEL_WIDTH + contentWidth * 0.5f, rect.y + 2 * lineHeight, contentWidth * 0.5f, lineHeight ); + + Rect idLabelRect = new Rect( rect.x, rect.y + 3 * lineHeight, LABEL_WIDTH, lineHeight ); + Rect idRect = new Rect( rect.x + LABEL_WIDTH, rect.y + 3 * lineHeight, contentWidth, lineHeight ); + + GUI.Label( contentLabelRect, "Content:" ); + EditorGUI.BeginChangeCheck(); + RectTransform content = EditorGUI.ObjectField( contentRect, GUIContent.none, tab.content, typeof( RectTransform ), true ) as RectTransform; + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change Content" ); + tab.content = content; + } + + GUI.Label( tabMetadataLabelRect, "Label/Icon:" ); + EditorGUI.BeginChangeCheck(); + string tabLabel = EditorGUI.TextField( tabLabelRect, GUIContent.none, tab.tabLabel ); + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change Label" ); + tab.tabLabel = tabLabel; + } + + EditorGUI.BeginChangeCheck(); + Sprite tabIcon = EditorGUI.ObjectField( tabIconRect, GUIContent.none, tab.tabIcon, typeof( Sprite ), false ) as Sprite; + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change Icon" ); + tab.tabIcon = tabIcon; + } + + GUI.Label( minSizeLabelRect, "Min Size (XY):" ); + EditorGUI.BeginChangeCheck(); + tabMinimumSize.x = EditorGUI.FloatField( minSizeXRect, GUIContent.none, tabMinimumSize.x ); + tabMinimumSize.y = EditorGUI.FloatField( minSizeYRect, GUIContent.none, tabMinimumSize.y ); + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change Minimum Size" ); + tab.minimumSize = tabMinimumSize; + } + + if( showIDs ) + { + GUI.Label( idLabelRect, "ID:" ); + EditorGUI.BeginChangeCheck(); + string tabID = EditorGUI.TextField( idRect, GUIContent.none, tab.id ); + if( EditorGUI.EndChangeCheck() ) + { + Undo.RecordObject( (DynamicPanelsCanvas) target, "Change ID" ); + tab.id = tabID; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs.meta b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs.meta new file mode 100644 index 0000000000..686ac52a50 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7c8e270c62c72c248941d2540e564a35 +timeCreated: 1521751306 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/README.txt b/Assets/Scripts/External/DynamicPanels/README.txt new file mode 100644 index 0000000000..f3f4724f3a --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/README.txt @@ -0,0 +1,6 @@ += Dynamic Panels (v1.3.0) = + +Documentation: https://github.com/yasirkula/UnityDynamicPanels +FAQ: https://github.com/yasirkula/UnityDynamicPanels#faq +Example code: https://github.com/yasirkula/UnityDynamicPanels#example-code +E-mail: yasirkula@gmail.com \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/README.txt.meta b/Assets/Scripts/External/DynamicPanels/README.txt.meta new file mode 100644 index 0000000000..64c97db5a2 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/README.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 829a1f7aeff870a468a7bfbacc1d40be +timeCreated: 1563308465 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Resources.meta b/Assets/Scripts/External/DynamicPanels/Resources.meta new file mode 100644 index 0000000000..12af4e1f58 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a10da257b412cea428dfd530dbca2051 +folderAsset: yes +timeCreated: 1504700276 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab new file mode 100644 index 0000000000..00bf5fd219 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab @@ -0,0 +1,432 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1043796585229992 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224210798838178700} + - component: {fileID: 222986914798992642} + - component: {fileID: 114027493792779984} + - component: {fileID: 114270162404285248} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &224210798838178700 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1043796585229992} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224363748066174280} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -2, y: -2} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 1, y: 1} +--- !u!222 &222986914798992642 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1043796585229992} + m_CullTransparentMesh: 1 +--- !u!114 &114027493792779984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1043796585229992} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.5019608, b: 0.5019608, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 20c417e04b8c35f4091523662474a6c4, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114270162404285248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1043796585229992} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114027493792779984} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1114860203056810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224556564501171762} + - component: {fileID: 222131658675741116} + - component: {fileID: 114796528486332184} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224556564501171762 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114860203056810} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224363748066174280} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -7.5} + m_SizeDelta: {x: -4, y: -19} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222131658675741116 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114860203056810} + m_CullTransparentMesh: 1 +--- !u!114 &114796528486332184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114860203056810} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.32352942, g: 0.32352942, b: 0.32352942, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1250567033053838 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224099754535828374} + - component: {fileID: 222812680874205716} + - component: {fileID: 114206482443958740} + - component: {fileID: 114082473048370878} + - component: {fileID: 114377495251387228} + m_Layer: 5 + m_Name: PanelHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224099754535828374 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1250567033053838} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224363748066174280} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 2, y: -2} + m_SizeDelta: {x: -4, y: 15} + m_Pivot: {x: 0, y: 1} +--- !u!222 &222812680874205716 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1250567033053838} + m_CullTransparentMesh: 1 +--- !u!114 &114206482443958740 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1250567033053838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2794118, g: 0.2794118, b: 0.2794118, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114082473048370878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1250567033053838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 034581b0eae396a48b005bc2114633f2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_panel: {fileID: 114843194787698652} +--- !u!114 &114377495251387228 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1250567033053838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1726343141212444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224363748066174280} + - component: {fileID: 222119064064416652} + - component: {fileID: 225255291005751456} + - component: {fileID: 114614089418798928} + - component: {fileID: 114843194787698652} + m_Layer: 5 + m_Name: DynamicPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224363748066174280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 224556564501171762} + - {fileID: 224099754535828374} + - {fileID: 224210798838178700} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 400, y: 100} + m_SizeDelta: {x: 250, y: 500} + m_Pivot: {x: 0, y: 0} +--- !u!222 &222119064064416652 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_CullTransparentMesh: 1 +--- !u!225 &225255291005751456 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &114614089418798928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2784314, g: 0.2784314, b: 0.2784314, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114843194787698652 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d12fb16f32dbe264e825a678eff38a90, type: 3} + m_Name: + m_EditorClassIdentifier: + header: {fileID: 114082473048370878} + tabsParent: {fileID: 224099754535828374} + contentParent: {fileID: 224556564501171762} + closeButton: {fileID: 114270162404285248} + headerHeight: 42 + m_tabNormalColor: {r: 0.2784314, g: 0.2784314, b: 0.2784314, a: 1} + m_tabNormalTextColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1} + m_tabSelectedColor: {r: 0.375, g: 0.375, b: 0.375, a: 1} + m_tabSelectedTextColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1} + m_tabDetachingColor: {r: 0, g: 0.4855985, b: 0.5294118, a: 1} + m_tabDetachingTextColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1} diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab.meta b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab.meta new file mode 100644 index 0000000000..39edf973e6 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5c4342897b6a5d94c9c583ef61af55f2 +timeCreated: 1504010371 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab new file mode 100644 index 0000000000..9dcbf52176 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1726343141212444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224363748066174280} + - component: {fileID: 222119064064416652} + - component: {fileID: 114614089418798928} + m_Layer: 5 + m_Name: DynamicPanelPreview + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224363748066174280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 500} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222119064064416652 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_CullTransparentMesh: 1 +--- !u!114 &114614089418798928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1726343141212444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.4855985, b: 0.5294118, a: 0.572} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ef24468435bb0d64296ede4cf9b6cc18, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab.meta b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab.meta new file mode 100644 index 0000000000..be77ddbbb2 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 55332d0ddeee7454095367b476b6813f +timeCreated: 1504010371 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab new file mode 100644 index 0000000000..d5751f773f --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab @@ -0,0 +1,523 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1223609383961532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224043261511920982} + - component: {fileID: 114701449697720124} + m_Layer: 5 + m_Name: TabContent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224043261511920982 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1223609383961532} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 224621675957088348} + - {fileID: 224736951175262904} + - {fileID: 224500342738483090} + m_Father: {fileID: 224452818132221032} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114701449697720124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1223609383961532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 1 + m_Bottom: 1 + m_ChildAlignment: 0 + m_Spacing: 4 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1290506992397030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224621675957088348} + - component: {fileID: 222740463014405626} + - component: {fileID: 114148454421488184} + - component: {fileID: 114249787093205428} + m_Layer: 5 + m_Name: IconHolder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224621675957088348 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290506992397030} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224043261511920982} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &222740463014405626 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290506992397030} + m_CullTransparentMesh: 1 +--- !u!114 &114148454421488184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290506992397030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7143c7559b82cd14da677a36b3df8d4d, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114249787093205428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290506992397030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 24 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1372674879344126 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224736951175262904} + - component: {fileID: 222039814760231978} + - component: {fileID: 114355370929409690} + - component: {fileID: 114202354710620052} + m_Layer: 5 + m_Name: NameHolder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224736951175262904 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1372674879344126} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224043261511920982} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222039814760231978 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1372674879344126} + m_CullTransparentMesh: 1 +--- !u!114 &114355370929409690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1372674879344126} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 14 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Tab +--- !u!114 &114202354710620052 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1372674879344126} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1542935947266476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224500342738483090} + - component: {fileID: 222597669491153042} + - component: {fileID: 114765799510743192} + - component: {fileID: 114670313046251076} + - component: {fileID: 114740044306829198} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &224500342738483090 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1542935947266476} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 224043261511920982} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 97, y: -1} + m_SizeDelta: {x: 14, y: 28} + m_Pivot: {x: 1, y: 1} +--- !u!222 &222597669491153042 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1542935947266476} + m_CullTransparentMesh: 1 +--- !u!114 &114765799510743192 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1542935947266476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.5019608, b: 0.5019608, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 20c417e04b8c35f4091523662474a6c4, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114670313046251076 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1542935947266476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114765799510743192} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &114740044306829198 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1542935947266476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 14 + m_MinHeight: -1 + m_PreferredWidth: 14 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1818210840912162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224452818132221032} + - component: {fileID: 222162105973802306} + - component: {fileID: 114017937663857124} + - component: {fileID: 114250021572920576} + - component: {fileID: 114042780021900062} + m_Layer: 5 + m_Name: DynamicPanelTab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224452818132221032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818210840912162} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 224043261511920982} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &222162105973802306 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818210840912162} + m_CullTransparentMesh: 1 +--- !u!114 &114017937663857124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818210840912162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9485294, g: 0.9485294, b: 0.9485294, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ef24468435bb0d64296ede4cf9b6cc18, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114250021572920576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818210840912162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 37df190a5f116af4d978c253e5f06d63, type: 3} + m_Name: + m_EditorClassIdentifier: + background: {fileID: 114017937663857124} + iconHolder: {fileID: 114148454421488184} + nameHolder: {fileID: 114355370929409690} + closeButton: {fileID: 114670313046251076} +--- !u!114 &114042780021900062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818210840912162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 100 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab.meta b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab.meta new file mode 100644 index 0000000000..6b3dd4bdae --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 020fbf96414a1a847aeb92aaea52178e +timeCreated: 1521635861 +licenseType: Free +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts.meta b/Assets/Scripts/External/DynamicPanels/Scripts.meta new file mode 100644 index 0000000000..8d61ccec0b --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a149c9a845d61984190c902c74445984 +folderAsset: yes +timeCreated: 1503931369 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring.meta new file mode 100644 index 0000000000..3012e2da79 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b894fe9ea0f830343b87ef42f0290167 +folderAsset: yes +timeCreated: 1521654151 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs new file mode 100644 index 0000000000..ca2f4c28b4 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs @@ -0,0 +1,67 @@ +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public abstract class AnchorZoneBase : MonoBehaviour, IPointerEnterHandler, IPointerDownHandler, IPointerExitHandler + { + protected Panel m_panel; + public Panel Panel { get { return m_panel; } } + + public RectTransform RectTransform { get; private set; } + + private Graphic raycastZone; + + private int hoveredPointerId = PanelManager.NON_EXISTING_TOUCH; + + public DynamicPanelsCanvas Canvas { get { return m_panel.Canvas; } } + + protected void Awake() + { + RectTransform = (RectTransform) transform; + raycastZone = gameObject.AddComponent(); + } + + protected void OnEnable() + { + hoveredPointerId = PanelManager.NON_EXISTING_TOUCH; + } + + public abstract bool Execute( PanelTab panelTab, PointerEventData eventData ); + public abstract bool GetAnchoredPreviewRectangleAt( PointerEventData eventData, out Rect rect ); + + public void Initialize( Panel panel ) + { + m_panel = panel; + } + + public void SetActive( bool value ) + { + hoveredPointerId = PanelManager.NON_EXISTING_TOUCH; + raycastZone.raycastTarget = value; + } + + public void OnPointerEnter( PointerEventData eventData ) + { + if( PanelManager.Instance.AnchorPreviewPanelTo( this ) ) + hoveredPointerId = eventData.pointerId; + } + + // Saves the system from a complete shutdown in a rare case + public void OnPointerDown( PointerEventData eventData ) + { + PanelManager.Instance.CancelDraggingPanel(); + } + + public void OnPointerExit( PointerEventData eventData ) + { + if( eventData.pointerId == hoveredPointerId ) + { + hoveredPointerId = PanelManager.NON_EXISTING_TOUCH; + PanelManager.Instance.StopAnchorPreviewPanelTo( this ); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs.meta new file mode 100644 index 0000000000..846cdec269 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c1e9ad7f1e768884cbeef3db8ba62b20 +timeCreated: 1504697414 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs new file mode 100644 index 0000000000..d3f208f338 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs @@ -0,0 +1,39 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + public class CanvasAnchorZone : AnchorZoneBase + { + private Direction direction; + + public void SetDirection( Direction direction ) + { + this.direction = direction; + } + + public override bool Execute( PanelTab panelTab, PointerEventData eventData ) + { + Panel detachedPanel = PanelManager.Instance.DetachPanelTab( panelTab.Panel, panelTab.Panel.GetTabIndex( panelTab ) ); + PanelManager.Instance.AnchorPanel( detachedPanel, m_panel.Canvas, direction ); + + return true; + } + + public override bool GetAnchoredPreviewRectangleAt( PointerEventData eventData, out Rect rect ) + { + Vector2 size = m_panel.Canvas.Size; + if( direction == Direction.Left ) + rect = new Rect( 0f, 0f, size.x * 0.2f, size.y ); + else if( direction == Direction.Top ) + rect = new Rect( 0f, size.y * 0.8f, size.x, size.y * 0.2f ); + else if( direction == Direction.Right ) + rect = new Rect( size.x * 0.8f, 0f, size.x * 0.2f, size.y ); + else + rect = new Rect( 0f, 0f, size.x, size.y * 0.2f ); + + rect.position += ( rect.size - size ) * 0.5f; + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs.meta new file mode 100644 index 0000000000..4d25f28379 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 73c0c2179033310488cd1644b36c1d76 +timeCreated: 1521654118 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs new file mode 100644 index 0000000000..58e55dbcb3 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs @@ -0,0 +1,71 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + public class PanelAnchorZone : AnchorZoneBase + { + public override bool Execute( PanelTab panelTab, PointerEventData eventData ) + { + Direction anchorDirection = GetAnchorDirection( eventData ); + if( anchorDirection == Direction.None ) + return false; + + Panel detachedPanel = PanelManager.Instance.DetachPanelTab( panelTab.Panel, panelTab.Panel.GetTabIndex( panelTab ) ); + PanelManager.Instance.AnchorPanel( detachedPanel, m_panel, anchorDirection ); + + return true; + } + + public override bool GetAnchoredPreviewRectangleAt( PointerEventData eventData, out Rect rect ) + { + Direction anchorDirection = GetAnchorDirection( eventData ); + if( anchorDirection == Direction.None ) + { + rect = new Rect(); + return false; + } + + Vector2 size = m_panel.RectTransform.sizeDelta; + size.y -= m_panel.Internal.HeaderHeight; + + float anchorWidth = Mathf.Min( m_panel.Canvas.PanelAnchorZoneLength, size.x * m_panel.Canvas.PanelAnchorZoneLengthRatio ); + float anchorHeight = Mathf.Min( m_panel.Canvas.PanelAnchorZoneLength, size.y * m_panel.Canvas.PanelAnchorZoneLengthRatio ); + + if( anchorDirection == Direction.Left ) + rect = new Rect( 0f, 0f, anchorWidth, size.y ); + else if( anchorDirection == Direction.Top ) + rect = new Rect( 0f, size.y - anchorHeight, size.x, anchorHeight ); + else if( anchorDirection == Direction.Right ) + rect = new Rect( size.x - anchorWidth, 0f, anchorWidth, size.y ); + else + rect = new Rect( 0f, 0f, size.x, anchorHeight ); + + rect.position += m_panel.RectTransform.anchoredPosition + ( rect.size - m_panel.Canvas.Size ) * 0.5f; + return true; + } + + private Direction GetAnchorDirection( PointerEventData eventData ) + { + Vector2 pointerPos; + RectTransformUtility.ScreenPointToLocalPointInRectangle( m_panel.RectTransform, eventData.position, m_panel.Canvas.Internal.worldCamera, out pointerPos ); + + Vector2 size = m_panel.RectTransform.sizeDelta; + size.y -= m_panel.Internal.HeaderHeight; + + float anchorWidth = Mathf.Min( m_panel.Canvas.PanelAnchorZoneLength, size.x * m_panel.Canvas.PanelAnchorZoneLengthRatio ); + float anchorHeight = Mathf.Min( m_panel.Canvas.PanelAnchorZoneLength, size.y * m_panel.Canvas.PanelAnchorZoneLengthRatio ); + + if( pointerPos.y < anchorHeight ) + return Direction.Bottom; + if( pointerPos.y > size.y - anchorHeight ) + return Direction.Top; + if( pointerPos.x < anchorWidth ) + return Direction.Left; + if( pointerPos.x > size.x - anchorWidth ) + return Direction.Right; + + return Direction.None; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs.meta new file mode 100644 index 0000000000..5e499c099a --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 004bce4254bbc924e91b36f9589ef1c6 +timeCreated: 1521654110 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs new file mode 100644 index 0000000000..8b02ba26d7 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + public class PanelHeaderAnchorZone : AnchorZoneBase + { + public override bool Execute( PanelTab panelTab, PointerEventData eventData ) + { + Vector2 tabPreviewRect; + int tabIndex = m_panel.Internal.GetTabIndexAt( eventData, out tabPreviewRect ); + + m_panel.AddTab( panelTab.Content, tabIndex ); + return true; + } + + public override bool GetAnchoredPreviewRectangleAt( PointerEventData eventData, out Rect rect ) + { + Vector2 tabPreviewRect; + m_panel.Internal.GetTabIndexAt( eventData, out tabPreviewRect ); + + rect = new Rect( tabPreviewRect.x, m_panel.RectTransform.sizeDelta.y - m_panel.Internal.HeaderHeight, tabPreviewRect.y, m_panel.Internal.HeaderHeight ); + rect.position += m_panel.RectTransform.anchoredPosition + ( rect.size - m_panel.Canvas.Size ) * 0.5f; + + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs.meta new file mode 100644 index 0000000000..4e009fe004 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9add292c0bfe2e74990a6b9e339cc223 +timeCreated: 1521657390 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs b/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs new file mode 100644 index 0000000000..bb64cfa6af --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs @@ -0,0 +1,635 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +#if UNITY_2017_3_OR_NEWER +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo( "DynamicPanels.Editor" )] +#else +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo( "Assembly-CSharp-Editor" )] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo( "Assembly-CSharp-Editor-firstpass" )] +#endif +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public class DynamicPanelsCanvas : MonoBehaviour, IPointerEnterHandler, ISerializationCallbackReceiver + { + internal class InternalSettings + { + private readonly DynamicPanelsCanvas canvas; + public readonly Camera worldCamera; + + public InternalSettings( DynamicPanelsCanvas canvas ) + { + this.canvas = canvas; + +#if UNITY_EDITOR + if( !canvas.UnityCanvas ) // is null while inspecting this component in edit mode + return; +#endif + + if( canvas.UnityCanvas.renderMode == RenderMode.ScreenSpaceOverlay || + ( canvas.UnityCanvas.renderMode == RenderMode.ScreenSpaceCamera && !canvas.UnityCanvas.worldCamera ) ) + worldCamera = null; + else + worldCamera = canvas.UnityCanvas.worldCamera ? canvas.UnityCanvas.worldCamera : Camera.main; + } + + public Panel DummyPanel { get { return canvas.dummyPanel; } } + + public List InitialPanelsUnanchored + { + get + { + if( canvas.initialPanelsUnanchored == null ) + canvas.initialPanelsUnanchored = new List(); + + return canvas.initialPanelsUnanchored; + } + } + + public AnchoredPanelProperties InitialPanelsAnchored + { + get + { + if( canvas.initialPanelsAnchored == null ) + canvas.initialPanelsAnchored = new AnchoredPanelProperties(); + + return canvas.initialPanelsAnchored; + } + } + + public bool IsLastDockedPanel( Panel panel ) + { + return panel.IsDocked && !PanelGroupHasAnyOtherPanels( canvas.RootPanelGroup, panel ); + } + + private bool PanelGroupHasAnyOtherPanels( PanelGroup group, Panel panel ) + { + for( int i = 0; i < group.Count; i++ ) + { + if( group[i] is Panel ) + { + Panel _panel = (Panel) group[i]; + if( _panel != panel && _panel != canvas.dummyPanel ) + return true; + } + else if( PanelGroupHasAnyOtherPanels( (PanelGroup) group[i], panel ) ) + return true; + } + + return false; + } + + public void OnApplicationQuit() + { +#if UNITY_2018_1_OR_NEWER + canvas.OnApplicationQuitting(); +#else + canvas.OnApplicationQuit(); +#endif + } + + public void AnchorZonesSetActive( bool value ) { canvas.AnchorZonesSetActive( value ); } + public void ReceiveRaycasts( bool value ) { canvas.background.raycastTarget = value; } + } + + [System.Serializable] + public class PanelProperties + { + public List tabs = new List(); + } + + public class AnchoredPanelProperties + { + public PanelProperties panel = new PanelProperties(); + public Direction anchorDirection; + public Vector2 initialSize; + + public List subPanels = new List(); + } + + // Credit: https://docs.unity3d.com/Manual/script-Serialization-Custom.html + [System.Serializable] + public struct SerializableAnchoredPanelProperties + { + public PanelProperties panel; + public Direction anchorDirection; + public Vector2 initialSize; + + public int childCount; + public int indexOfFirstChild; + } + + [System.Serializable] + public class PanelTabProperties : ISerializationCallbackReceiver + { + public RectTransform content = null; + public string id = null; + public Vector2 minimumSize = new Vector2( 250f, 300f ); + + public string tabLabel = "Panel"; + public Sprite tabIcon = null; + + void ISerializationCallbackReceiver.OnBeforeSerialize() + { + if( string.IsNullOrEmpty( id ) ) + id = System.Guid.NewGuid().ToString(); + } + + void ISerializationCallbackReceiver.OnAfterDeserialize() + { + } + } + + public RectTransform RectTransform { get; private set; } + public Canvas UnityCanvas { get; private set; } + +#if UNITY_EDITOR + private InternalSettings m_internal; + internal InternalSettings Internal + { + get + { + if( m_internal == null ) + m_internal = new InternalSettings( this ); + + return m_internal; + } + } +#else + internal InternalSettings Internal { get; private set; } +#endif + + [SerializeField] + [HideInInspector] + private string m_id; + public string ID + { + get { return m_id; } + set { m_id = value; } + } + + public UnanchoredPanelGroup UnanchoredPanelGroup { get; private set; } + public PanelGroup RootPanelGroup { get; private set; } + + public Vector2 Size { get; private set; } + + private Panel dummyPanel; + private Graphic background; + + private RectTransform anchorZonesParent; + private readonly CanvasAnchorZone[] anchorZones = new CanvasAnchorZone[4]; // one for each side + +#pragma warning disable 0649 + [SerializeField] + private bool m_leaveFreeSpace = true; + public bool LeaveFreeSpace + { + get { return m_leaveFreeSpace; } + set + { + m_leaveFreeSpace = value; + if( !m_leaveFreeSpace ) + dummyPanel.Detach(); + else if( !dummyPanel.IsDocked ) + { + // Add the free space to the middle + if( RootPanelGroup.Count <= 1 ) + RootPanelGroup.AddElement( dummyPanel ); + else + RootPanelGroup.AddElementBefore( RootPanelGroup[RootPanelGroup.Count / 2], dummyPanel ); + } + } + } + + [SerializeField] + private Vector2 minimumFreeSpace = new Vector2( 50f, 50f ); + + [SerializeField] + private RectTransform freeSpaceTargetTransform; + private Vector2 freeSpacePrevPos, freeSpacePrevSize; + + public bool PreventDetachingLastDockedPanel; + + [SerializeField] + private float m_panelResizableAreaLength = 12f; + public float PanelResizableAreaLength { get { return m_panelResizableAreaLength; } } + + [SerializeField] + private float m_canvasAnchorZoneLength = 20f; + public float CanvasAnchorZoneLength { get { return m_canvasAnchorZoneLength; } } + + [SerializeField] + private float m_panelAnchorZoneLength = 100f; + public float PanelAnchorZoneLength { get { return m_panelAnchorZoneLength; } } + + private const float m_panelAnchorZoneLengthRatio = 0.31f; + public float PanelAnchorZoneLengthRatio { get { return m_panelAnchorZoneLengthRatio; } } + + [SerializeField] + private List initialPanelsUnanchored; + + [SerializeField] + [HideInInspector] + private List initialPanelsAnchoredSerialized; + private AnchoredPanelProperties initialPanelsAnchored; +#pragma warning restore 0649 + + private bool updateBounds = true; + private bool isDirty = false; + + private bool isQuitting = false; + + private void Awake() + { + RectTransform = (RectTransform) transform; + UnityCanvas = GetComponentInParent(); +#if !UNITY_EDITOR + Internal = new InternalSettings( this ); +#endif + + UnanchoredPanelGroup = new UnanchoredPanelGroup( this ); + RectTransform.ChangePivotWithoutAffectingPosition( new Vector2( 0.5f, 0.5f ) ); + + if( !GetComponent() ) + gameObject.AddComponent(); + + Size = RectTransform.rect.size; + + InitializeRootGroup(); + InitializeAnchorZones(); + + background = GetComponent(); + if( !background ) + { + background = gameObject.AddComponent(); + background.raycastTarget = false; + } + + PanelManager.Instance.RegisterCanvas( this ); + +#if UNITY_2018_1_OR_NEWER + // OnApplicationQuit isn't reliable on some Unity versions when Application.wantsToQuit is used; Application.quitting is the only reliable solution on those versions + // https://issuetracker.unity3d.com/issues/onapplicationquit-method-is-called-before-application-dot-wantstoquit-event-is-raised + Application.quitting -= OnApplicationQuitting; + Application.quitting += OnApplicationQuitting; +#endif + } + + private void Start() + { + Size = RectTransform.rect.size; + + HashSet createdTabs = new HashSet(); // A set to prevent duplicate tabs or to prevent making canvas itself a panel + Transform tr = transform; + while( tr ) + { + createdTabs.Add( tr ); + tr = tr.parent; + } + + Dictionary initialSizes = null; + if( initialPanelsAnchored != null ) + { + initialSizes = new Dictionary( initialPanelsAnchoredSerialized.Count ); + CreateAnchoredPanelsRecursively( initialPanelsAnchored.subPanels, dummyPanel, createdTabs, initialSizes ); + } + + for( int i = 0; i < initialPanelsUnanchored.Count; i++ ) + CreateInitialPanel( initialPanelsUnanchored[i], null, Direction.None, createdTabs ); + + initialPanelsUnanchored = null; + initialPanelsAnchored = null; + initialPanelsAnchoredSerialized = null; + + if( freeSpaceTargetTransform ) + { + if( freeSpaceTargetTransform.parent != RectTransform ) + freeSpaceTargetTransform.SetParent( RectTransform, false ); + + freeSpaceTargetTransform.anchorMin = Vector2.zero; + freeSpaceTargetTransform.anchorMax = Vector2.zero; + freeSpaceTargetTransform.pivot = Vector2.zero; + freeSpaceTargetTransform.SetAsFirstSibling(); + } + + LeaveFreeSpace = m_leaveFreeSpace; + LateUpdate(); // Update layout + + if( m_leaveFreeSpace ) + { + // Minimize all panels to their minimum size + dummyPanel.ResizeTo( new Vector2( 99999f, 99999f ) ); + + //RootPanelGroup.Internal.TryChangeSizeOf( dummyPanel, Direction.Left, 20009f ); + //RootPanelGroup.Internal.TryChangeSizeOf( dummyPanel, Direction.Top, 20009f ); // Magick number.. + //RootPanelGroup.Internal.TryChangeSizeOf( dummyPanel, Direction.Right, 20009f ); // or not? + //RootPanelGroup.Internal.TryChangeSizeOf( dummyPanel, Direction.Bottom, 20009f ); // A: just a big random number U_U + } + + if( initialSizes != null ) + ResizeAnchoredPanelsRecursively( RootPanelGroup, initialSizes ); + } + + private void OnDestroy() + { +#if UNITY_2018_1_OR_NEWER + Application.quitting -= OnApplicationQuitting; +#endif + + if( !isQuitting ) + PanelManager.Instance.UnregisterCanvas( this ); + } + +#if UNITY_2018_1_OR_NEWER + private void OnApplicationQuitting() +#else + private void OnApplicationQuit() +#endif + { + isQuitting = true; + } + + private void LateUpdate() + { + if( isDirty ) + { + PanelManager.Instance.StopCanvasOperations( this ); + + RootPanelGroup.Internal.UpdateLayout(); + UnanchoredPanelGroup.Internal.UpdateLayout(); + + RootPanelGroup.Internal.UpdateSurroundings( null, null, null, null ); + } + + if( updateBounds ) + { + UpdateBounds(); + updateBounds = false; + } + + if( isDirty ) + { + RootPanelGroup.Internal.EnsureMinimumSize(); + UnanchoredPanelGroup.Internal.EnsureMinimumSize(); + + isDirty = false; + } + + if( m_leaveFreeSpace && freeSpaceTargetTransform ) + { + Vector2 freeSpacePos = dummyPanel.Position; + Vector2 freeSpaceSize = dummyPanel.Size; + if( freeSpacePos != freeSpacePrevPos || freeSpaceSize != freeSpacePrevSize ) + { + freeSpacePrevPos = freeSpacePos; + freeSpacePrevSize = freeSpaceSize; + + freeSpaceTargetTransform.anchoredPosition = freeSpacePos; + freeSpaceTargetTransform.sizeDelta = freeSpaceSize; + } + } + } + + public void SetDirty() + { + isDirty = true; + updateBounds = true; + } + + public void ForceRebuildLayoutImmediate() + { + LateUpdate(); + } + + void IPointerEnterHandler.OnPointerEnter( PointerEventData eventData ) + { + PanelManager.Instance.OnPointerEnteredCanvas( this, eventData ); + } + + private void OnRectTransformDimensionsChange() + { + updateBounds = true; + } + + private void UpdateBounds() + { + Size = RectTransform.rect.size; + + RootPanelGroup.Internal.UpdateBounds( Vector2.zero, Size ); + UnanchoredPanelGroup.Internal.UpdateBounds( Vector2.zero, Size ); + } + + private void CreateAnchoredPanelsRecursively( List anchoredPanels, Panel rootPanel, HashSet createdTabs, Dictionary initialSizes ) + { + if( anchoredPanels == null ) + return; + + for( int i = 0; i < anchoredPanels.Count; i++ ) + { + Panel panel = CreateInitialPanel( anchoredPanels[i].panel, rootPanel, anchoredPanels[i].anchorDirection, createdTabs ); + if( panel == null ) + panel = rootPanel; + else if( anchoredPanels[i].initialSize != Vector2.zero ) + initialSizes[panel] = anchoredPanels[i].initialSize; + + CreateAnchoredPanelsRecursively( anchoredPanels[i].subPanels, panel, createdTabs, initialSizes ); + } + } + + private void ResizeAnchoredPanelsRecursively( PanelGroup group, Dictionary initialSizes ) + { + if( group == null ) + return; + + int count = group.Count; + for( int i = 0; i < count; i++ ) + { + Panel panel = group[i] as Panel; + if( panel != null ) + { + Vector2 initialSize; + if( initialSizes.TryGetValue( panel, out initialSize ) ) + panel.ResizeTo( initialSize, Direction.Right, Direction.Top ); + } + else + ResizeAnchoredPanelsRecursively( group[i] as PanelGroup, initialSizes ); + } + } + + private Panel CreateInitialPanel( PanelProperties properties, Panel anchor, Direction anchorDirection, HashSet createdTabs ) + { + Panel panel = null; + for( int i = 0; i < properties.tabs.Count; i++ ) + { + PanelTabProperties panelProps = properties.tabs[i]; + if( panelProps.content ) + { + if( createdTabs.Contains( panelProps.content ) ) + continue; + + if( panelProps.content.parent != RectTransform ) + panelProps.content.SetParent( RectTransform, false ); + + PanelTab tab; + if( panel == null ) + { + panel = PanelUtils.CreatePanelFor( panelProps.content, this ); + tab = panel[0]; + } + else + tab = panel.AddTab( panelProps.content ); + + tab.Icon = panelProps.tabIcon; + tab.Label = panelProps.tabLabel; + tab.MinSize = panelProps.minimumSize; + tab.ID = panelProps.id; + + createdTabs.Add( panelProps.content ); + } + } + + if( panel != null ) + { + panel.ActiveTab = 0; + + if( anchor != null && anchorDirection != Direction.None ) + panel.DockToPanel( anchor, anchorDirection ); + } + + return panel; + } + + private void InitializeRootGroup() + { + dummyPanel = PanelUtils.Internal.CreatePanel( null, this ); + dummyPanel.gameObject.name = "DummyPanel"; + dummyPanel.CanvasGroup.alpha = 0f; + dummyPanel.Internal.SetDummy( minimumFreeSpace ); + + RootPanelGroup = new PanelGroup( this, Direction.Right ); + RootPanelGroup.AddElement( dummyPanel ); + } + + private void InitializeAnchorZones() + { + anchorZonesParent = (RectTransform) new GameObject( "CanvasAnchorZone", typeof( RectTransform ) ).transform; + anchorZonesParent.SetParent( RectTransform, false ); + anchorZonesParent.anchorMin = Vector2.zero; + anchorZonesParent.anchorMax = Vector2.one; + anchorZonesParent.sizeDelta = Vector2.zero; + + CreateAnchorZone( Direction.Left, new Vector2( 0f, 0f ), new Vector2( 0f, 1f ), new Vector2( m_canvasAnchorZoneLength, 0f ) ); + CreateAnchorZone( Direction.Top, new Vector2( 0f, 1f ), new Vector2( 1f, 1f ), new Vector2( 0f, m_canvasAnchorZoneLength ) ); + CreateAnchorZone( Direction.Right, new Vector2( 1f, 0f ), new Vector2( 1f, 1f ), new Vector2( m_canvasAnchorZoneLength, 0f ) ); + CreateAnchorZone( Direction.Bottom, new Vector2( 0f, 0f ), new Vector2( 1f, 0f ), new Vector2( 0f, m_canvasAnchorZoneLength ) ); + + for( int i = 0; i < anchorZones.Length; i++ ) + anchorZones[i].SetActive( false ); + } + + private void CreateAnchorZone( Direction direction, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta ) + { + CanvasAnchorZone anchorZone = new GameObject( "AnchorZone" + direction, typeof( RectTransform ) ).AddComponent(); + anchorZone.Initialize( dummyPanel ); + anchorZone.SetDirection( direction ); + + anchorZone.RectTransform.SetParent( anchorZonesParent, false ); + + anchorZone.RectTransform.pivot = anchorMin; + anchorZone.RectTransform.anchorMin = anchorMin; + anchorZone.RectTransform.anchorMax = anchorMax; + anchorZone.RectTransform.anchoredPosition = Vector2.zero; + anchorZone.RectTransform.sizeDelta = sizeDelta; + + anchorZones[(int) direction] = anchorZone; + } + + private void AnchorZonesSetActive( bool value ) + { + if( !enabled ) + return; + + if( value ) + anchorZonesParent.SetAsLastSibling(); + + for( int i = 0; i < anchorZones.Length; i++ ) + anchorZones[i].SetActive( value ); + } + + [ContextMenu( "Save Layout" )] + public void SaveLayout() + { + PanelSerialization.SerializeCanvas( this ); + } + + [ContextMenu( "Load Layout" )] + public void LoadLayout() + { + PanelSerialization.DeserializeCanvas( this ); + } + + void ISerializationCallbackReceiver.OnBeforeSerialize() + { + if( initialPanelsAnchoredSerialized == null ) + initialPanelsAnchoredSerialized = new List(); + else + initialPanelsAnchoredSerialized.Clear(); + + if( initialPanelsAnchored == null ) + initialPanelsAnchored = new AnchoredPanelProperties(); + + if( string.IsNullOrEmpty( m_id ) ) + m_id = System.Guid.NewGuid().ToString(); + + AddToSerializedAnchoredPanelProperties( initialPanelsAnchored ); + } + + void ISerializationCallbackReceiver.OnAfterDeserialize() + { + if( initialPanelsAnchoredSerialized != null && initialPanelsAnchoredSerialized.Count > 0 ) + ReadFromSerializedAnchoredPanelProperties( 0, out initialPanelsAnchored ); + else + initialPanelsAnchored = new AnchoredPanelProperties(); + } + + private void AddToSerializedAnchoredPanelProperties( AnchoredPanelProperties props ) + { + SerializableAnchoredPanelProperties serializedProps = new SerializableAnchoredPanelProperties() + { + panel = props.panel, + anchorDirection = props.anchorDirection, + initialSize = props.initialSize, + childCount = props.subPanels.Count, + indexOfFirstChild = initialPanelsAnchoredSerialized.Count + 1 + }; + + initialPanelsAnchoredSerialized.Add( serializedProps ); + for( int i = 0; i < props.subPanels.Count; i++ ) + AddToSerializedAnchoredPanelProperties( props.subPanels[i] ); + } + + private int ReadFromSerializedAnchoredPanelProperties( int index, out AnchoredPanelProperties props ) + { + SerializableAnchoredPanelProperties serializedProps = initialPanelsAnchoredSerialized[index]; + AnchoredPanelProperties newProps = new AnchoredPanelProperties() + { + panel = serializedProps.panel, + anchorDirection = serializedProps.anchorDirection, + initialSize = serializedProps.initialSize, + subPanels = new List() + }; + + for( int i = 0; i != serializedProps.childCount; i++ ) + { + AnchoredPanelProperties childProps; + index = ReadFromSerializedAnchoredPanelProperties( ++index, out childProps ); + newProps.subPanels.Add( childProps ); + } + + props = newProps; + return index; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs.meta new file mode 100644 index 0000000000..7fc10fbcd6 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e09a4b7ae29894a4194f95800d897bb0 +timeCreated: 1520957458 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: -75 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping.meta new file mode 100644 index 0000000000..fc4b66edf2 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d53847df923c5a24bb696de6d2d72572 +folderAsset: yes +timeCreated: 1507479845 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs new file mode 100644 index 0000000000..800be0a075 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace DynamicPanels +{ + public interface IPanelGroupElement + { + DynamicPanelsCanvas Canvas { get; } + PanelGroup Group { get; } + + Vector2 Position { get; } + Vector2 Size { get; } + Vector2 MinSize { get; } + + void ResizeTo( Vector2 newSize, Direction horizontalDir = Direction.Right, Direction verticalDir = Direction.Bottom ); + + void DockToRoot( Direction direction ); + void DockToPanel( IPanelGroupElement anchor, Direction direction ); + + IPanelGroupElement GetSurroundingElement( Direction direction ); + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs.meta new file mode 100644 index 0000000000..e3d311686d --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 836ab53589e33744cb3abe654e6b46f8 +timeCreated: 1504794445 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs new file mode 100644 index 0000000000..ec66dd0a24 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs @@ -0,0 +1,667 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace DynamicPanels +{ + public class PanelGroup : IPanelGroupElement + { + internal class InternalSettings + { + private readonly PanelGroup group; + + public InternalSettings( PanelGroup group ) { this.group = group; } + + public void SetDirty() { group.SetDirty(); } + public void UpdateBounds( Vector2 position, Vector2 size ) { group.UpdateBounds( position, size ); } + public void UpdateLayout() { group.UpdateLayout(); } + public void UpdateSurroundings( IPanelGroupElement left, IPanelGroupElement top, IPanelGroupElement right, IPanelGroupElement bottom ) { group.UpdateSurroundings( left, top, right, bottom ); } + public void TryChangeSizeOf( IPanelGroupElement element, Direction direction, float deltaSize ) { group.TryChangeSizeOf( element, direction, deltaSize ); } + public void ResizeElementTo( IPanelGroupElement element, Vector2 newSize, Direction horizontalDir, Direction verticalDir ) { group.ResizeElementTo( element, newSize, horizontalDir, verticalDir ); } + public void ReplaceElement( IPanelGroupElement beforeElement, IPanelGroupElement afterElement ) { group.ReplaceElement( beforeElement, afterElement ); } + + public void EnsureMinimumSize() + { + for( int i = 0; i < group.elements.Count; i++ ) + group.EnsureMinimumSizeOf( group.elements[i] ); + } + } + + private class ElementDirtyProperties + { + public IPanelGroupElement element; + public float posX, posY, sizeX, sizeY; + + public ElementDirtyProperties() { } + public ElementDirtyProperties( IPanelGroupElement element ) { this.element = element; } + + public void Reset( IPanelGroupElement element ) + { + this.element = element; + posX = posY = sizeX = sizeY = 0f; + } + } + + protected const float MIN_SIZE_TOLERANCE = 1E-4f; + + protected readonly Direction direction; + protected readonly List elements; + + protected readonly IPanelGroupElement[] surroundings; + + public DynamicPanelsCanvas Canvas { get; private set; } + public PanelGroup Group { get; protected set; } + + internal InternalSettings Internal { get; private set; } + + public Vector2 Position { get; protected set; } + public Vector2 Size { get; protected set; } + public Vector2 MinSize { get; protected set; } + + private List resizeProperties; + private int resizePropsIndex; + + protected bool isDirty = false; + + public int Count { get { return elements.Count; } } + public IPanelGroupElement this[int index] { get { return elements[index]; } } + + public PanelGroup( DynamicPanelsCanvas canvas, Direction direction ) + { + Canvas = canvas; + Internal = new InternalSettings( this ); + + this.direction = direction; + + elements = new List( 2 ); + surroundings = new IPanelGroupElement[4]; + } + + public bool IsInSameDirection( Direction direction ) + { + if( direction == Direction.None ) + return false; + + if( direction == Direction.Left || direction == Direction.Right ) + return this.direction == Direction.Left || this.direction == Direction.Right; + + return this.direction == Direction.Top || this.direction == Direction.Bottom; + } + + public IPanelGroupElement GetSurroundingElement( Direction direction ) + { + return surroundings[(int) direction]; + } + + protected void SetDirty() + { + isDirty = true; + + PanelGroup parentGroup = Group; + while( parentGroup != null ) + { + parentGroup.isDirty = true; + parentGroup = parentGroup.Group; + } + + Canvas.SetDirty(); + } + + protected virtual void UpdateBounds( Vector2 position, Vector2 size ) + { + Position = position; + + if( elements.Count == 1 ) + UpdateBoundsOf( elements[0], position, size ); + else + { + float multiplier; + bool horizontal = IsInSameDirection( Direction.Right ); + if( horizontal ) + { + if( Size.x == 0f ) + multiplier = size.x; + else + multiplier = size.x / Size.x; + } + else + { + if( Size.y == 0f ) + multiplier = size.y; + else + multiplier = size.y / Size.y; + } + + for( int i = 0; i < elements.Count; i++ ) + { + Vector2 elementSize = elements[i].Size; + + if( horizontal ) + { + elementSize.x *= multiplier; + elementSize.y = size.y; + + UpdateBoundsOf( elements[i], position, elementSize ); + position.x += elementSize.x; + } + else + { + elementSize.x = size.x; + elementSize.y *= multiplier; + + UpdateBoundsOf( elements[i], position, elementSize ); + position.y += elementSize.y; + } + } + } + + Size = size; + } + + protected virtual void UpdateLayout() + { + if( isDirty ) + { + elements.RemoveAll( ( element ) => element.IsNull() || element.Group != this ); + + for( int i = elements.Count - 1; i >= 0; i-- ) + { + PanelGroup subGroup = elements[i] as PanelGroup; + if( subGroup != null ) + { + subGroup.UpdateLayout(); + + int count = subGroup.Count; + if( count == 0 ) + elements.RemoveAt( i ); + else if( count == 1 ) + { + elements[i] = subGroup.elements[0]; + SetGroupFor( elements[i], this ); + i++; + } + else if( subGroup.IsInSameDirection( direction ) ) + { + elements.RemoveAt( i ); + elements.InsertRange( i, subGroup.elements ); + for( int j = 0; j < count; j++, i++ ) + SetGroupFor( elements[i], this ); + } + } + } + + Vector2 size = Vector2.zero; + Vector2 minSize = Vector2.zero; + bool horizontal = IsInSameDirection( Direction.Right ); + int dummyPanelIndex = -1; + for( int i = 0; i < elements.Count; i++ ) + { + Vector2 elementSize = elements[i].Size; + Vector2 elementMinSize = elements[i].MinSize; + + // Rescue elements whose sizes are stuck at 0 + bool rescueElement = false; + if( elementSize.x == 0f && elementMinSize.x > 0f ) + { + elementSize.x = Mathf.Min( 1f, elementMinSize.x ); + rescueElement = true; + } + if( elementSize.y == 0f && elementMinSize.y > 0f ) + { + elementSize.y = Mathf.Min( 1f, elementMinSize.y ); + rescueElement = true; + } + + if( rescueElement ) + UpdateBoundsOf( elements[i], elements[i].Position, elementSize ); + + if( i == 0 ) + { + size = elementSize; + minSize = elementMinSize; + } + else + { + if( horizontal ) + { + size.x += elementSize.x; + minSize.x += elementMinSize.x; + + if( elementSize.y < size.y ) + size.y = elementSize.y; + + if( elementMinSize.y > minSize.y ) + minSize.y = elementMinSize.y; + } + else + { + size.y += elementSize.y; + minSize.y += elementMinSize.y; + + if( elementSize.x < size.x ) + size.x = elementSize.x; + + if( elementMinSize.x > minSize.x ) + minSize.x = elementMinSize.x; + } + } + + if( elements[i] is Panel && ( (Panel) elements[i] ).Internal.IsDummy ) + dummyPanelIndex = i; + } + + if( dummyPanelIndex >= 0 ) + { + Vector2 flexibleSpace = Vector2.zero; + if( size.x < Size.x ) + { + flexibleSpace.x = Size.x - size.x; + size.x = Size.x; + } + + if( size.y < Size.y ) + { + flexibleSpace.y = Size.y - size.y; + size.y = Size.y; + } + + ( (Panel) elements[dummyPanelIndex] ).RectTransform.sizeDelta += flexibleSpace; + } + + Size = size; + MinSize = minSize; + + isDirty = false; + } + } + + protected void UpdateSurroundings( IPanelGroupElement left, IPanelGroupElement top, IPanelGroupElement right, IPanelGroupElement bottom ) + { + surroundings[(int) Direction.Left] = left; + surroundings[(int) Direction.Top] = top; + surroundings[(int) Direction.Right] = right; + surroundings[(int) Direction.Bottom] = bottom; + + bool horizontal = IsInSameDirection( Direction.Right ); + for( int i = 0; i < elements.Count; i++ ) + { + if( horizontal ) + { + left = i > 0 ? elements[i - 1] : surroundings[(int) Direction.Left]; + right = i < elements.Count - 1 ? elements[i + 1] : surroundings[(int) Direction.Right]; + } + else + { + bottom = i > 0 ? elements[i - 1] : surroundings[(int) Direction.Bottom]; + top = i < elements.Count - 1 ? elements[i + 1] : surroundings[(int) Direction.Top]; + } + + PanelGroup subGroup = elements[i] as PanelGroup; + if( subGroup != null ) + subGroup.UpdateSurroundings( left, top, right, bottom ); + else + ( (Panel) elements[i] ).Internal.UpdateSurroundings( left, top, right, bottom ); + } + } + + protected void ResizeElementTo( IPanelGroupElement element, Vector2 newSize, Direction horizontalDir, Direction verticalDir ) + { + if( horizontalDir != Direction.Left && horizontalDir != Direction.Right ) + horizontalDir = Direction.Right; + if( verticalDir != Direction.Bottom && verticalDir != Direction.Top ) + verticalDir = Direction.Bottom; + + Direction horizontalOpposite = horizontalDir.Opposite(); + Direction verticalOpposite = verticalDir.Opposite(); + + float flexibleWidth = newSize.x - element.Size.x; + if( flexibleWidth > MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element, horizontalDir, flexibleWidth ); + + flexibleWidth = newSize.x - element.Size.x; + if( flexibleWidth > MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element, horizontalOpposite, flexibleWidth ); + } + else if( flexibleWidth < -MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element.GetSurroundingElement( horizontalDir ), horizontalOpposite, -flexibleWidth ); + + flexibleWidth = newSize.x - element.Size.x; + if( flexibleWidth < -MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element.GetSurroundingElement( horizontalOpposite ), horizontalDir, -flexibleWidth ); + } + + float flexibleHeight = newSize.y - element.Size.y; + if( flexibleHeight > MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element, verticalDir, flexibleHeight ); + + flexibleHeight = newSize.y - element.Size.y; + if( flexibleHeight > MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element, verticalOpposite, flexibleHeight ); + } + else if( flexibleHeight < -MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element.GetSurroundingElement( verticalDir ), verticalOpposite, -flexibleHeight ); + + flexibleHeight = newSize.y - element.Size.y; + if( flexibleHeight < -MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element.GetSurroundingElement( verticalOpposite ), verticalDir, -flexibleHeight ); + } + } + + protected virtual void EnsureMinimumSizeOf( IPanelGroupElement element ) + { + float flexibleWidth = element.Size.x - element.MinSize.x; + if( flexibleWidth < -MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element, Direction.Right, -flexibleWidth ); + + flexibleWidth = element.Size.x - element.MinSize.x; + if( flexibleWidth < -MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element, Direction.Left, -flexibleWidth ); + } + + float flexibleHeight = element.Size.y - element.MinSize.y; + if( flexibleHeight < -MIN_SIZE_TOLERANCE ) + { + TryChangeSizeOf( element, Direction.Bottom, -flexibleHeight ); + + flexibleHeight = element.Size.y - element.MinSize.y; + if( flexibleHeight < -MIN_SIZE_TOLERANCE ) + TryChangeSizeOf( element, Direction.Top, -flexibleHeight ); + } + + PanelGroup subGroup = element as PanelGroup; + if( subGroup != null ) + subGroup.Internal.EnsureMinimumSize(); + } + + protected void TryChangeSizeOf( IPanelGroupElement element, Direction direction, float deltaSize ) + { + if( element.IsNull() || deltaSize <= MIN_SIZE_TOLERANCE || element.GetSurroundingElement( direction ).IsNull() ) + return; + + resizePropsIndex = 0; + + IPanelGroupElement surroundingElement = element.GetSurroundingElement( direction ); + element = surroundingElement.GetSurroundingElement( direction.Opposite() ); + AddResizeProperty( element ); + + float deltaMovement = TryChangeSizeOfInternal( surroundingElement, direction, deltaSize ); + if( resizePropsIndex > 1 ) + { + ResizeElementHelper( 0, direction, deltaMovement ); + + for( int i = 0; i < resizePropsIndex; i++ ) + { + ElementDirtyProperties properties = resizeProperties[i]; + + Vector2 position = properties.element.Position + new Vector2( properties.posX, properties.posY ); + Vector2 size = properties.element.Size + new Vector2( properties.sizeX, properties.sizeY ); + + UpdateBoundsOf( properties.element, position, size ); + } + } + } + + protected float TryChangeSizeOfInternal( IPanelGroupElement element, Direction direction, float deltaSize ) + { + int currResizePropsIndex = resizePropsIndex; + AddResizeProperty( element ); + + float thisFlexibleSize; + if( direction == Direction.Left || direction == Direction.Right ) + thisFlexibleSize = element.Size.x - element.MinSize.x; + else + thisFlexibleSize = element.Size.y - element.MinSize.y; + + if( thisFlexibleSize > MIN_SIZE_TOLERANCE ) + { + if( thisFlexibleSize >= deltaSize ) + { + thisFlexibleSize = deltaSize; + deltaSize = 0f; + } + else + deltaSize -= thisFlexibleSize; + + ResizeElementHelper( currResizePropsIndex, direction.Opposite(), -thisFlexibleSize ); + } + else + thisFlexibleSize = 0f; + + if( deltaSize > MIN_SIZE_TOLERANCE ) + { + IPanelGroupElement surrounding = element.GetSurroundingElement( direction ); + if( !surrounding.IsNull() ) + { + if( surrounding.Group != element.Group ) + AddResizeProperty( surrounding.GetSurroundingElement( direction.Opposite() ) ); + + float deltaMovement = TryChangeSizeOfInternal( surrounding, direction, deltaSize ); + if( deltaMovement > MIN_SIZE_TOLERANCE ) + { + if( surrounding.Group == element.Group ) + { + if( direction == Direction.Left ) + resizeProperties[currResizePropsIndex].posX -= deltaMovement; + else if( direction == Direction.Top ) + resizeProperties[currResizePropsIndex].posY += deltaMovement; + else if( direction == Direction.Right ) + resizeProperties[currResizePropsIndex].posX += deltaMovement; + else + resizeProperties[currResizePropsIndex].posY -= deltaMovement; + + thisFlexibleSize += deltaMovement; + } + else + ResizeElementHelper( currResizePropsIndex + 1, direction, deltaMovement ); + } + else + { + if( thisFlexibleSize == 0f ) + resizePropsIndex = currResizePropsIndex; + else + resizePropsIndex = currResizePropsIndex + 1; + } + } + else if( thisFlexibleSize == 0f ) + resizePropsIndex = currResizePropsIndex; + } + + return thisFlexibleSize; + } + + private void AddResizeProperty( IPanelGroupElement element ) + { + if( resizeProperties == null ) + resizeProperties = new List() { new ElementDirtyProperties( element ), new ElementDirtyProperties() }; + else if( resizePropsIndex == resizeProperties.Count ) + resizeProperties.Add( new ElementDirtyProperties( element ) ); + else + resizeProperties[resizePropsIndex].Reset( element ); + + resizePropsIndex++; + } + + private void ResizeElementHelper( int resizePropsIndex, Direction direction, float deltaSize ) + { + ElementDirtyProperties properties = resizeProperties[resizePropsIndex]; + + if( direction == Direction.Left ) + { + properties.posX -= deltaSize; + properties.sizeX += deltaSize; + } + else if( direction == Direction.Top ) + properties.sizeY += deltaSize; + else if( direction == Direction.Right ) + properties.sizeX += deltaSize; + else + { + properties.posY -= deltaSize; + properties.sizeY += deltaSize; + } + } + + protected void ReplaceElement( IPanelGroupElement beforeElement, IPanelGroupElement afterElement ) + { + if( beforeElement == afterElement ) + return; + + if( beforeElement.IsNull() || afterElement.IsNull() ) + { + Debug.LogError( "Invalid argument!" ); + return; + } + + int index = elements.IndexOf( beforeElement ); + if( index < 0 ) + { + Debug.LogError( "Invalid index!" ); + return; + } + + if( beforeElement.Group == this ) + Canvas.UnanchoredPanelGroup.AddElement( beforeElement ); + + AddElementAt( index, afterElement ); + } + + public void ResizeTo( Vector2 newSize, Direction horizontalDir = Direction.Right, Direction verticalDir = Direction.Bottom ) + { + if( Group != null ) + Group.ResizeElementTo( this, newSize, horizontalDir, verticalDir ); + } + + public void DockToRoot( Direction direction ) + { + PanelManager.Instance.AnchorPanel( this, Canvas, direction ); + } + + public void DockToPanel( IPanelGroupElement anchor, Direction direction ) + { + PanelManager.Instance.AnchorPanel( this, anchor, direction ); + } + + public void AddElement( IPanelGroupElement element ) + { + AddElementAt( elements.Count, element ); + } + + public void AddElementBefore( IPanelGroupElement pivot, IPanelGroupElement element ) + { + AddElementAt( elements.IndexOf( pivot ), element ); + } + + public void AddElementAfter( IPanelGroupElement pivot, IPanelGroupElement element ) + { + AddElementAt( elements.IndexOf( pivot ) + 1, element ); + } + + protected void AddElementAt( int index, IPanelGroupElement element ) + { + if( element.IsNull() ) + { + Debug.LogError( "Invalid argument!" ); + return; + } + + if( index < 0 || index > elements.Count ) + { + Debug.LogError( "Invalid index!" ); + return; + } + + int elementIndex = elements.IndexOf( element ); + if( elementIndex >= 0 && element.Group != this ) + { + if( index > elementIndex ) + index--; + + elements.RemoveAt( elementIndex ); + elementIndex = -1; + } + + if( elementIndex == index ) + return; + + if( element.Group != null ) + element.Group.SetDirty(); + + if( elementIndex < 0 ) + { + // Element not present in this group, add it + elements.Insert( index, element ); + SetGroupFor( element, this ); + } + else if( elementIndex != index ) + { + // Element already present in this group, just change its index + if( elementIndex > index ) + elementIndex++; + + elements.Insert( index, element ); + elements.RemoveAt( elementIndex ); + } + + SetDirty(); + } + + protected void SetGroupFor( IPanelGroupElement element, PanelGroup group ) + { + Panel panel = element as Panel; + if( panel != null ) + { + panel.Internal.Group = group; + + if( panel.RectTransform.parent != group.Canvas.RectTransform ) + panel.RectTransform.SetParent( group.Canvas.RectTransform, false ); + } + else + ( (PanelGroup) element ).Group = group; + } + + protected void UpdateBoundsOf( IPanelGroupElement element, Vector2 position, Vector2 size ) + { + if( element is Panel ) + ( (Panel) element ).Internal.UpdateBounds( position, size ); + else + ( (PanelGroup) element ).UpdateBounds( position, size ); + } + + public override string ToString() + { + if( direction == Direction.Left || direction == Direction.Right ) + return "Horizontal Group"; + + return "Vertical Group"; + } + + // Debug function to print the current hierarchy of groups to console + public void PrintHierarchy() + { + Debug.Log( ToTree( 0, new System.Text.StringBuilder( 500 ) ) ); + } + + private string ToTree( int depth, System.Text.StringBuilder treeBuilder ) + { + string prefix = string.Empty; + for( int i = 0; i <= depth; i++ ) + prefix += "-"; + + treeBuilder.Append( depth ).Append( prefix ).Append( ' ' ).Append( this ).Append( System.Environment.NewLine ); + + foreach( var element in elements ) + { + if( element is Panel ) + treeBuilder.Append( depth + 1 ).Append( prefix ).Append( "- " ).Append( element ).Append( System.Environment.NewLine ); + else + ( (PanelGroup) element ).ToTree( depth + 1, treeBuilder ); + } + + return depth == 0 ? treeBuilder.ToString() : null; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs.meta new file mode 100644 index 0000000000..c8db85ac03 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c18ac0bffdbf7544ab984f13e0643cd7 +timeCreated: 1504794374 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs new file mode 100644 index 0000000000..af0f75eb38 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs @@ -0,0 +1,111 @@ +using UnityEngine; + +namespace DynamicPanels +{ + public class UnanchoredPanelGroup : PanelGroup + { + public UnanchoredPanelGroup( DynamicPanelsCanvas canvas ) : base( canvas, Direction.None ) + { + } + + protected override void UpdateBounds( Vector2 position, Vector2 size ) + { + for( int i = 0; i < elements.Count; i++ ) + { + if( elements[i] is Panel ) + RestrictPanelToBounds( (Panel) elements[i], size ); + } + } + + protected override void UpdateLayout() + { + bool wasDirty = isDirty; + + base.UpdateLayout(); + + if( wasDirty ) + { + for( int i = elements.Count - 1; i >= 0; i-- ) + { + PanelGroup subGroup = elements[i] as PanelGroup; + if( subGroup != null ) + { + elements.RemoveAt( i ); + + for( int j = 0; j < subGroup.Count; j++, i++ ) + { + elements.Insert( i, subGroup[j] ); + SetGroupFor( elements[i], this ); + } + } + } + } + } + + protected override void EnsureMinimumSizeOf( IPanelGroupElement element ) + { + Panel panel = element as Panel; + if( !panel ) + return; + + Vector2 position = panel.Position; + + Vector2 size = panel.Size; + Vector2 minSize = panel.MinSize; + + bool hasChanged = false; + + float flexibleWidth = size.x - minSize.x; + if( flexibleWidth < -MIN_SIZE_TOLERANCE ) + { + size.x -= flexibleWidth; + position.x += flexibleWidth * 0.5f; + + hasChanged = true; + } + + float flexibleHeight = size.y - minSize.y; + if( flexibleHeight < -MIN_SIZE_TOLERANCE ) + { + size.y -= flexibleHeight; + position.y += flexibleHeight * 0.5f; + + hasChanged = true; + } + + if( hasChanged ) + { + panel.Internal.UpdateBounds( position, size ); + RestrictPanelToBounds( panel ); + } + } + + public void RestrictPanelToBounds( Panel panel ) + { + RestrictPanelToBounds( panel, Canvas.Size ); + } + + protected void RestrictPanelToBounds( Panel panel, Vector2 canvasSize ) + { + Vector2 panelPosition = panel.RectTransform.anchoredPosition; + Vector2 panelSize = panel.RectTransform.sizeDelta; + + if( panelPosition.y + panelSize.y < 50f ) + panelPosition.y = 50f - panelSize.y; + else if( panelPosition.y + panelSize.y > canvasSize.y ) + panelPosition.y = canvasSize.y - panelSize.y; + + if( panelPosition.x < 0f ) + panelPosition.x = 0f; + else if( canvasSize.x - panelPosition.x < 125f ) + panelPosition.x = canvasSize.x - 125f; + + panel.RectTransform.anchoredPosition = panelPosition; + } + + public override string ToString() + { + return "Unanchored Panel Group"; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs.meta new file mode 100644 index 0000000000..80b8eaecb9 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3a9600d0b607a204aaa4aefdfb6ab780 +timeCreated: 1520949278 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers.meta new file mode 100644 index 0000000000..4962d657b6 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f470c03715867be41913342c05a6e68f +folderAsset: yes +timeCreated: 1507479811 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs new file mode 100644 index 0000000000..8e28c27f4f --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs @@ -0,0 +1,19 @@ +using UnityEngine; +using UnityEngine.UI; + +namespace DynamicPanels +{ + // Credit: http://answers.unity.com/answers/1157876/view.html + [RequireComponent( typeof( CanvasRenderer ) )] + public class NonDrawingGraphic : Graphic + { + public override void SetMaterialDirty() { return; } + public override void SetVerticesDirty() { return; } + + protected override void OnPopulateMesh( VertexHelper vh ) + { + vh.Clear(); + return; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs.meta new file mode 100644 index 0000000000..fb76f4b58a --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 431fbefef6492614d84f825f4532d64e +timeCreated: 1572700126 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs new file mode 100644 index 0000000000..4146c68965 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs @@ -0,0 +1,155 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + public class PanelCursorHandler : MonoBehaviour + { + private static PanelCursorHandler instance = null; + + private PanelResizeHelper activeResizeHelper; + private PointerEventData activeEventData; + + private bool isResizing; + private Vector2 prevPointerPos; + +#pragma warning disable 0649 + [SerializeField] + private Texture2D horizontalCursor; + [SerializeField] + private Texture2D verticalCursor; + [SerializeField] + private Texture2D diagonalCursorTopLeft; + [SerializeField] + private Texture2D diagonalCursorTopRight; +#pragma warning restore 0649 + + private void Awake() + { + instance = this; + } + + public static void OnPointerEnter( PanelResizeHelper resizeHelper, PointerEventData eventData ) + { + if( instance == null ) + return; + + instance.activeResizeHelper = resizeHelper; + instance.activeEventData = eventData; + } + + public static void OnPointerExit( PanelResizeHelper resizeHelper ) + { + if( instance == null ) + return; + + if( instance.activeResizeHelper == resizeHelper ) + { + instance.activeResizeHelper = null; + instance.activeEventData = null; + + if( !instance.isResizing ) + SetDefaultCursor(); + } + } + + public static void OnBeginResize( Direction primary, Direction secondary ) + { + if( instance == null ) + return; + + instance.isResizing = true; + instance.UpdateCursor( primary, secondary ); + } + + public static void OnEndResize() + { + if( instance == null ) + return; + + instance.isResizing = false; + + if( instance.activeResizeHelper == null ) + SetDefaultCursor(); + else + instance.prevPointerPos = new Vector2( -1f, -1f ); + } + + private void Update() + { + if( isResizing ) + return; + + if( activeResizeHelper != null ) + { + Vector2 pointerPos = activeEventData.position; + if( pointerPos != prevPointerPos ) + { + if( activeEventData.dragging ) + SetDefaultCursor(); + else + { + Direction direction = activeResizeHelper.Direction; + Direction secondDirection = activeResizeHelper.GetSecondDirection( activeEventData.position ); + if( activeResizeHelper.Panel.CanResizeInDirection( direction ) ) + UpdateCursor( direction, secondDirection ); + else if( secondDirection != Direction.None ) + UpdateCursor( secondDirection, Direction.None ); + else + SetDefaultCursor(); + } + + prevPointerPos = pointerPos; + } + } + } + + private static void SetDefaultCursor() + { + Cursor.SetCursor( null, Vector2.zero, CursorMode.Auto ); + } + + private void UpdateCursor( Direction primary, Direction secondary ) + { + Texture2D cursorTex; + if( primary == Direction.Left ) + { + if( secondary == Direction.Top ) + cursorTex = diagonalCursorTopLeft; + else if( secondary == Direction.Bottom ) + cursorTex = diagonalCursorTopRight; + else + cursorTex = horizontalCursor; + } + else if( primary == Direction.Right ) + { + if( secondary == Direction.Top ) + cursorTex = diagonalCursorTopRight; + else if( secondary == Direction.Bottom ) + cursorTex = diagonalCursorTopLeft; + else + cursorTex = horizontalCursor; + } + else if( primary == Direction.Top ) + { + if( secondary == Direction.Left ) + cursorTex = diagonalCursorTopLeft; + else if( secondary == Direction.Right ) + cursorTex = diagonalCursorTopRight; + else + cursorTex = verticalCursor; + } + else + { + if( secondary == Direction.Left ) + cursorTex = diagonalCursorTopRight; + else if( secondary == Direction.Right ) + cursorTex = diagonalCursorTopLeft; + else + cursorTex = verticalCursor; + } + + Cursor.SetCursor( cursorTex, new Vector2( cursorTex.width * 0.5f, cursorTex.height * 0.5f ), CursorMode.Auto ); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs.meta new file mode 100644 index 0000000000..a8dfc2b861 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 13f43f7a9474ed54489e906030258e3c +timeCreated: 1550766107 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: + - horizontalCursor: {fileID: 2800000, guid: a9c77eeb970c9ae40a370ca7060be120, type: 3} + - verticalCursor: {fileID: 2800000, guid: 68ac78481f5b6df4da69a6f5133b6702, type: 3} + - diagonalCursorTopLeft: {fileID: 2800000, guid: cbaa205f7a905b8429011ee0c50015ea, + type: 3} + - diagonalCursorTopRight: {fileID: 2800000, guid: e5a757b3ef912a24c912a99d9e1befe5, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs new file mode 100644 index 0000000000..f9e5fa4191 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs @@ -0,0 +1,62 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public class PanelHeader : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler + { +#pragma warning disable 0649 + [SerializeField] + private Panel m_panel; + public Panel Panel { get { return m_panel; } } +#pragma warning restore 0649 + + private int pointerId = PanelManager.NON_EXISTING_TOUCH; + + private Vector2 m_initialTouchPos; + internal Vector2 InitialTouchPos { get { return m_initialTouchPos; } } + + private void OnEnable() + { + pointerId = PanelManager.NON_EXISTING_TOUCH; + } + + public void OnBeginDrag( PointerEventData eventData ) + { + if( !PanelManager.Instance.OnBeginPanelTranslate( m_panel ) ) + { + eventData.pointerDrag = null; + return; + } + + pointerId = eventData.pointerId; + RectTransformUtility.ScreenPointToLocalPointInRectangle( m_panel.RectTransform, eventData.position, m_panel.Canvas.Internal.worldCamera, out m_initialTouchPos ); + } + + public void OnDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + { + eventData.pointerDrag = null; + return; + } + + PanelManager.Instance.OnPanelTranslate( this, eventData ); + } + + public void OnEndDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + return; + + pointerId = PanelManager.NON_EXISTING_TOUCH; + PanelManager.Instance.OnEndPanelTranslate( m_panel ); + } + + public void Stop() + { + pointerId = PanelManager.NON_EXISTING_TOUCH; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs.meta new file mode 100644 index 0000000000..2ab72c1ecb --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 034581b0eae396a48b005bc2114633f2 +timeCreated: 1503993560 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs new file mode 100644 index 0000000000..89f9b5c7fd --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs @@ -0,0 +1,216 @@ +using System.Collections.Generic; + +namespace DynamicPanels +{ + public static class PanelNotificationCenter + { + internal static class Internal + { + public static void PanelCreated( Panel panel ) + { + if( !IsPanelRegistered( panel ) ) + { + panels.Add( panel ); + + panel.Internal.ChangeCloseButtonVisibility( m_onPanelClosed != null ); + + if( OnPanelCreated != null ) + OnPanelCreated( panel ); + + if( panel.gameObject.activeInHierarchy ) + { + if( OnPanelBecameActive != null ) + OnPanelBecameActive( panel ); + } + else + { + if( OnPanelBecameInactive != null ) + OnPanelBecameInactive( panel ); + } + } + } + + public static void PanelDestroyed( Panel panel ) + { + if( panels.Remove( panel ) && OnPanelDestroyed != null ) + OnPanelDestroyed( panel ); + } + + public static void PanelBecameActive( Panel panel ) + { + if( IsPanelRegistered( panel ) ) + { + if( OnPanelBecameActive != null ) + OnPanelBecameActive( panel ); + } + } + + public static void PanelBecameInactive( Panel panel ) + { + if( IsPanelRegistered( panel ) ) + { + if( OnPanelBecameInactive != null ) + OnPanelBecameInactive( panel ); + } + } + + public static void PanelClosed( Panel panel ) + { + if( m_onPanelClosed != null ) + m_onPanelClosed( panel ); + } + + public static void TabDragStateChanged( PanelTab tab, bool isDragging ) + { + if( isDragging ) + { + if( OnStartedDraggingTab != null ) + OnStartedDraggingTab( tab ); + } + else + { + if( OnStoppedDraggingTab != null ) + OnStoppedDraggingTab( tab ); + } + } + + public static void ActiveTabChanged( PanelTab tab ) + { + if( OnActiveTabChanged != null ) + OnActiveTabChanged( tab ); + } + + public static void TabIDChanged( PanelTab tab, string previousID, string newID ) + { + if( !idToTab.ContainsValue( tab ) ) + { + tab.Internal.ChangeCloseButtonVisibility( m_onTabClosed != null ); + + if( OnTabCreated != null ) + OnTabCreated( tab ); + } + + if( !string.IsNullOrEmpty( previousID ) ) + { + PanelTab previousTab; + if( idToTab.TryGetValue( previousID, out previousTab ) && previousTab == tab ) + idToTab.Remove( previousID ); + } + + if( !string.IsNullOrEmpty( newID ) ) + idToTab[newID] = tab; + else if( OnTabDestroyed != null ) + OnTabDestroyed( tab ); + } + + public static void TabClosed( PanelTab tab ) + { + if( m_onTabClosed != null ) + m_onTabClosed( tab ); + } + + private static bool IsPanelRegistered( Panel panel ) + { + for( int i = panels.Count - 1; i >= 0; i-- ) + { + if( panels[i] == panel ) + return true; + } + + return false; + } + } + + public delegate void PanelDelegate( Panel panel ); + public delegate void TabDelegate( PanelTab tab ); + + public static event PanelDelegate OnPanelCreated, OnPanelDestroyed, OnPanelBecameActive, OnPanelBecameInactive; + public static event TabDelegate OnTabCreated, OnTabDestroyed, OnActiveTabChanged, OnStartedDraggingTab, OnStoppedDraggingTab; + + private static PanelDelegate m_onPanelClosed; + public static event PanelDelegate OnPanelClosed + { + add + { + if( value != null ) + { + if( m_onPanelClosed == null ) + { + for( int i = panels.Count - 1; i >= 0; i-- ) + panels[i].Internal.ChangeCloseButtonVisibility( true ); + } + + m_onPanelClosed += value; + } + } + remove + { + if( value != null && m_onPanelClosed != null ) + { + m_onPanelClosed -= value; + + if( m_onPanelClosed == null ) + { + for( int i = panels.Count - 1; i >= 0; i-- ) + panels[i].Internal.ChangeCloseButtonVisibility( false ); + } + } + } + } + + private static TabDelegate m_onTabClosed; + public static event TabDelegate OnTabClosed + { + add + { + if( value != null ) + { + if( m_onTabClosed == null ) + { + foreach( PanelTab tab in idToTab.Values ) + tab.Internal.ChangeCloseButtonVisibility( true ); + } + + m_onTabClosed += value; + } + } + remove + { + if( value != null && m_onTabClosed != null ) + { + m_onTabClosed -= value; + + if( m_onTabClosed == null ) + { + foreach( PanelTab tab in idToTab.Values ) + tab.Internal.ChangeCloseButtonVisibility( false ); + } + } + } + } + + private static readonly List panels = new List( 32 ); + public static int NumberOfPanels { get { return panels.Count; } } + + private static readonly Dictionary idToTab = new Dictionary( 32 ); + + public static Panel GetPanel( int panelIndex ) + { + if( panelIndex >= 0 && panelIndex < panels.Count ) + return panels[panelIndex]; + + return null; + } + + public static bool TryGetTab( string tabID, out PanelTab tab ) + { + if( string.IsNullOrEmpty( tabID ) ) + { + tab = null; + return false; + } + + return idToTab.TryGetValue( tabID, out tab ); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs.meta new file mode 100644 index 0000000000..092c1da250 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 598dda653ba7b9040a4eb8aac5ab2fff +timeCreated: 1525200156 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs new file mode 100644 index 0000000000..52ff753b13 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs @@ -0,0 +1,139 @@ +#if UNITY_EDITOR || ( !UNITY_ANDROID && !UNITY_IOS ) +#define ENABLE_CURSOR_MANAGEMENT +#endif + +using UnityEngine; +using UnityEngine.EventSystems; + +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public class PanelResizeHelper : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler +#if ENABLE_CURSOR_MANAGEMENT + , IPointerEnterHandler, IPointerExitHandler +#endif + { + private Panel m_panel; + public Panel Panel { get { return m_panel; } } + + public RectTransform RectTransform { get; private set; } + + private Direction m_direction; + private Direction secondDirection; + + public Direction Direction { get { return m_direction; } } + + private PanelResizeHelper helperBefore, helperAfter; + + private int pointerId = PanelManager.NON_EXISTING_TOUCH; + + private void Awake() + { + RectTransform = (RectTransform) transform; + } + + private void OnEnable() + { + pointerId = PanelManager.NON_EXISTING_TOUCH; + } + + public void Initialize( Panel panel, Direction direction, PanelResizeHelper helperBefore, PanelResizeHelper helperAfter ) + { + m_panel = panel; + + this.m_direction = direction; + this.helperBefore = helperBefore; + this.helperAfter = helperAfter; + } + +#if ENABLE_CURSOR_MANAGEMENT + public void OnPointerEnter( PointerEventData eventData ) + { + PanelCursorHandler.OnPointerEnter( this, eventData ); + } + + public void OnPointerExit( PointerEventData eventData ) + { + PanelCursorHandler.OnPointerExit( this ); + } +#endif + + public void OnBeginDrag( PointerEventData eventData ) + { + // Cancel drag event if panel is already being resized by another pointer + // or panel is anchored to a fixed anchor in that direction + if( !m_panel.CanResizeInDirection( m_direction ) ) + { + eventData.pointerDrag = null; + return; + } + + pointerId = eventData.pointerId; + secondDirection = GetSecondDirection( eventData.pressPosition ); + +#if ENABLE_CURSOR_MANAGEMENT + PanelCursorHandler.OnBeginResize( m_direction, secondDirection ); +#endif + } + + public void OnDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + return; + + m_panel.Internal.OnResize( m_direction, eventData.position ); + + if( secondDirection != Direction.None ) + m_panel.Internal.OnResize( secondDirection, eventData.position ); + } + + public void OnEndDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + return; + + if( !m_panel.IsDocked ) + ( (UnanchoredPanelGroup) m_panel.Group ).RestrictPanelToBounds( m_panel ); + + pointerId = PanelManager.NON_EXISTING_TOUCH; + +#if ENABLE_CURSOR_MANAGEMENT + PanelCursorHandler.OnEndResize(); +#endif + } + + public Direction GetSecondDirection( Vector2 pointerPosition ) + { + if( m_panel.IsDocked ) + return Direction.None; + + Direction result; + if( RectTransformUtility.RectangleContainsScreenPoint( helperBefore.RectTransform, pointerPosition, m_panel.Canvas.Internal.worldCamera ) ) + result = helperBefore.m_direction; + else if( RectTransformUtility.RectangleContainsScreenPoint( helperAfter.RectTransform, pointerPosition, m_panel.Canvas.Internal.worldCamera ) ) + result = helperAfter.m_direction; + else + result = Direction.None; + + if( !m_panel.CanResizeInDirection( result ) ) + result = Direction.None; + + return result; + } + + public void Stop() + { + if( pointerId != PanelManager.NON_EXISTING_TOUCH ) + { + if( !m_panel.IsDocked ) + ( (UnanchoredPanelGroup) m_panel.Group ).RestrictPanelToBounds( m_panel ); + + pointerId = PanelManager.NON_EXISTING_TOUCH; + +#if ENABLE_CURSOR_MANAGEMENT + PanelCursorHandler.OnEndResize(); +#endif + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs.meta new file mode 100644 index 0000000000..0d54ed305c --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 09b78c3b175f33d4bbe3950ba0f01921 +timeCreated: 1503918646 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs new file mode 100644 index 0000000000..fa081b6d98 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs @@ -0,0 +1,375 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using UnityEngine; + +namespace DynamicPanels +{ + public static class PanelSerialization + { + #region Helper Classes +#pragma warning disable 0649 + [Serializable] + private class SerializedCanvas + { + public bool active; + public bool useFreeSpace; + + public SerializedPanelGroup rootPanelGroup; + public SerializedPanelGroup unanchoredPanelGroup; + } + + [Serializable] + private abstract class ISerializedElement + { + public SerializedVector2 size; + } + + [Serializable] + private class SerializedPanelGroup : ISerializedElement + { + public bool horizontal; + public ISerializedElement[] children; + } + + [Serializable] + private class SerializedDummyPanel : ISerializedElement + { + } + + [Serializable] + private class SerializedPanel : ISerializedElement + { + public int activeTab; + public SerializedPanelTab[] tabs; + public SerializedVector2 floatingSize; + } + + [Serializable] + private class SerializedUnanchoredPanel : SerializedPanel + { + public bool active; + public SerializedVector2 position; + } + + [Serializable] + private class SerializedPanelTab + { + public string id; + //public SerializedVector2 minSize; + //public string label; + } + + [Serializable] + private struct SerializedVector2 + { + public float x, y; + + public static implicit operator Vector2( SerializedVector2 v ) + { + return new Vector2( v.x, v.y ); + } + + public static implicit operator SerializedVector2( Vector2 v ) + { + return new SerializedVector2() { x = v.x, y = v.y }; + } + } + + private struct GroupElementSizeHolder + { + public IPanelGroupElement element; + public Vector2 size; + + public GroupElementSizeHolder( IPanelGroupElement element, Vector2 size ) + { + this.element = element; + this.size = size; + } + } +#pragma warning restore 0649 + #endregion + + private static readonly List tabsTemp = new List( 4 ); + private static readonly List sizesHolder = new List( 4 ); + + public static void SerializeCanvas( DynamicPanelsCanvas canvas ) + { + byte[] data = SerializeCanvasToArray( canvas ); + if( data == null || data.Length == 0 ) + { + Debug.LogError( "Couldn't serialize!" ); + return; + } + + PlayerPrefs.SetString( canvas.ID, Convert.ToBase64String( data ) ); + PlayerPrefs.Save(); + } + + public static void DeserializeCanvas( DynamicPanelsCanvas canvas ) + { + DeserializeCanvasFromArray( canvas, Convert.FromBase64String( PlayerPrefs.GetString( canvas.ID, string.Empty ) ) ); + } + + public static byte[] SerializeCanvasToArray( DynamicPanelsCanvas canvas ) + { +#if UNITY_EDITOR + if( !Application.isPlaying ) + { + Debug.LogError( "Can serialize in Play mode only!" ); + return null; + } +#endif + + canvas.ForceRebuildLayoutImmediate(); + + BinaryFormatter formatter = new BinaryFormatter(); + using( MemoryStream stream = new MemoryStream() ) + { + formatter.Serialize( stream, new SerializedCanvas + { + active = canvas.gameObject.activeSelf, + useFreeSpace = canvas.LeaveFreeSpace, + rootPanelGroup = Serialize( canvas.RootPanelGroup ) as SerializedPanelGroup, + unanchoredPanelGroup = Serialize( canvas.UnanchoredPanelGroup ) as SerializedPanelGroup + } ); + + return stream.ToArray(); + } + } + + public static void DeserializeCanvasFromArray( DynamicPanelsCanvas canvas, byte[] data ) + { +#if UNITY_EDITOR + if( !Application.isPlaying ) + { + Debug.LogError( "Can deserialize in Play mode only!" ); + return; + } +#endif + + if( data == null || data.Length == 0 ) + { + Debug.LogError( "Data is null!" ); + return; + } + + SerializedCanvas serializedCanvas; + BinaryFormatter formatter = new BinaryFormatter(); + using( MemoryStream stream = new MemoryStream( data ) ) + { + serializedCanvas = formatter.Deserialize( stream ) as SerializedCanvas; + } + + if( serializedCanvas == null ) + return; + + sizesHolder.Clear(); + canvas.LeaveFreeSpace = serializedCanvas.useFreeSpace; + + if( serializedCanvas.rootPanelGroup != null ) + { + PanelGroup rootPanelGroup = canvas.RootPanelGroup; + ISerializedElement[] children = serializedCanvas.rootPanelGroup.children; + for( int i = children.Length - 1; i >= 0; i-- ) + { + IPanelGroupElement element = Deserialize( canvas, children[i] ); + if( element != null ) + { + if( rootPanelGroup.Count == 0 ) + rootPanelGroup.AddElement( element ); + else + rootPanelGroup.AddElementBefore( rootPanelGroup[0], element ); + + sizesHolder.Insert( 0, new GroupElementSizeHolder( element, children[i].size ) ); + } + } + } + + if( sizesHolder.Count > 0 ) + { + canvas.ForceRebuildLayoutImmediate(); + + for( int i = 0; i < sizesHolder.Count; i++ ) + sizesHolder[i].element.ResizeTo( sizesHolder[i].size, Direction.Right, Direction.Top ); + } + + if( serializedCanvas.unanchoredPanelGroup != null ) + { + ISerializedElement[] children = serializedCanvas.unanchoredPanelGroup.children; + for( int i = 0; i < children.Length; i++ ) + { + SerializedUnanchoredPanel unanchoredPanel = children[i] as SerializedUnanchoredPanel; + if( unanchoredPanel != null ) + { + Panel panel = Deserialize( canvas, unanchoredPanel ) as Panel; + if( panel != null ) + { + panel.Detach(); + canvas.UnanchoredPanelGroup.RestrictPanelToBounds( panel ); + } + } + } + } + + for( int i = 0; i < canvas.UnanchoredPanelGroup.Count; i++ ) + { + Panel panel = canvas.UnanchoredPanelGroup[i] as Panel; + if( panel != null ) + panel.RectTransform.SetAsLastSibling(); + } + + canvas.gameObject.SetActive( serializedCanvas.active ); + } + + private static ISerializedElement Serialize( IPanelGroupElement element ) + { + if( element == null ) + return null; + + if( element is Panel ) + { + Panel panel = (Panel) element; + if( panel.Internal.IsDummy ) + return new SerializedDummyPanel() { size = panel.Size }; + + tabsTemp.Clear(); + for( int i = 0; i < panel.NumberOfTabs; i++ ) + { + PanelTab tab = panel[i]; + tabsTemp.Add( new SerializedPanelTab() + { + id = tab.ID, + //minSize = tab.MinSize, + //label = tab.Label + } ); + } + + if( tabsTemp.Count == 0 ) + return null; + + if( panel.IsDocked ) + { + return new SerializedPanel() + { + activeTab = panel.ActiveTab, + tabs = tabsTemp.ToArray(), + size = panel.Size, + floatingSize = panel.FloatingSize + }; + } + else + { + return new SerializedUnanchoredPanel() + { + active = panel.gameObject.activeSelf, + activeTab = panel.ActiveTab, + tabs = tabsTemp.ToArray(), + position = panel.Position, + size = panel.Size, + floatingSize = panel.Size + }; + } + } + + PanelGroup panelGroup = (PanelGroup) element; + + ISerializedElement[] children = new ISerializedElement[panelGroup.Count]; + for( int i = 0; i < panelGroup.Count; i++ ) + children[i] = Serialize( panelGroup[i] ); + + return new SerializedPanelGroup() + { + horizontal = panelGroup.IsInSameDirection( Direction.Right ), + children = children, + size = panelGroup.Size + }; + } + + private static IPanelGroupElement Deserialize( DynamicPanelsCanvas canvas, ISerializedElement element ) + { + if( element == null ) + return null; + + if( element is SerializedDummyPanel ) + return canvas.Internal.DummyPanel; + + if( element is SerializedPanel ) + { + SerializedPanel serializedPanel = (SerializedPanel) element; + Panel panel = null; + + SerializedPanelTab[] tabs = serializedPanel.tabs; + for( int i = 0; i < tabs.Length; i++ ) + { + PanelTab tab; + if( !PanelNotificationCenter.TryGetTab( tabs[i].id, out tab ) ) + continue; + + if( panel == null ) + { + panel = tab.Detach(); + canvas.UnanchoredPanelGroup.AddElement( panel ); + } + else + panel.AddTab( tab ); + + //if( tab != null ) + //{ + // tab.MinSize = tabs[i].minSize; + // tab.Label = tabs[i].label; + //} + } + + if( panel != null ) + { + if( serializedPanel.activeTab < tabs.Length ) + { + int activeTabIndex = panel.GetTabIndex( tabs[serializedPanel.activeTab].id ); + if( activeTabIndex >= 0 ) + panel.ActiveTab = activeTabIndex; + } + + if( serializedPanel is SerializedUnanchoredPanel ) + { + SerializedUnanchoredPanel unanchoredPanel = (SerializedUnanchoredPanel) serializedPanel; + panel.RectTransform.anchoredPosition = unanchoredPanel.position; + panel.gameObject.SetActive( unanchoredPanel.active ); + } + + panel.FloatingSize = serializedPanel.floatingSize; + } + + return panel; + } + + if( element is SerializedPanelGroup ) + { + SerializedPanelGroup serializedPanelGroup = (SerializedPanelGroup) element; + ISerializedElement[] children = serializedPanelGroup.children; + if( children == null || children.Length == 0 ) + return null; + + PanelGroup panelGroup = new PanelGroup( canvas, serializedPanelGroup.horizontal ? Direction.Right : Direction.Top ); + for( int i = 0; i < children.Length; i++ ) + { + if( children[i] == null ) + continue; + + IPanelGroupElement childElement = Deserialize( canvas, children[i] ); + if( childElement != null ) + { + panelGroup.AddElement( childElement ); + sizesHolder.Add( new GroupElementSizeHolder( childElement, children[i].size ) ); + } + } + + if( panelGroup.Count > 0 ) + return panelGroup; + } + + return null; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs.meta new file mode 100644 index 0000000000..0eecfa58be --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed5ab04fcc6d144419468d33ab106597 +timeCreated: 1545845208 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs new file mode 100644 index 0000000000..823bd819ef --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs @@ -0,0 +1,259 @@ +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public class PanelTab : MonoBehaviour, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler + { + internal class InternalSettings + { + private readonly PanelTab tab; + public readonly RectTransform RectTransform; + + public InternalSettings( PanelTab tab ) + { + this.tab = tab; + RectTransform = (RectTransform) tab.transform; + } + + public bool IsBeingDetached { get { return tab.pointerId != PanelManager.NON_EXISTING_TOUCH; } } + + public void Initialize( Panel panel, RectTransform content ) + { + tab.m_panel = panel; + tab.Content = content; + } + + public void ChangeCloseButtonVisibility( bool isVisible ) + { + if( tab.closeButton && isVisible != tab.closeButton.gameObject.activeSelf ) + { + tab.closeButton.gameObject.SetActive( isVisible ); + + float tabSizeDelta = tab.closeButton.GetComponent().preferredWidth; + tab.GetComponent().preferredWidth += isVisible ? tabSizeDelta : -tabSizeDelta; + } + } + + public void Stop() + { + if( tab.pointerId != PanelManager.NON_EXISTING_TOUCH ) + { + tab.ResetBackgroundColor(); + tab.pointerId = PanelManager.NON_EXISTING_TOUCH; + + PanelNotificationCenter.Internal.TabDragStateChanged( tab, false ); + } + } + + public void SetActive( bool activeState ) { tab.SetActive( activeState ); } + } + +#pragma warning disable 0649 + [SerializeField] + private Image background; + + [SerializeField] + private Image iconHolder; + + [SerializeField] + private Text nameHolder; + + [SerializeField] + private Button closeButton; +#pragma warning restore 0649 + + internal InternalSettings Internal { get; private set; } + + private string m_id = null; + public string ID + { + get { return m_id; } + set + { + if( !string.IsNullOrEmpty( value ) && m_id != value ) + { + PanelNotificationCenter.Internal.TabIDChanged( this, m_id, value ); + m_id = value; + } + } + } + + private Panel m_panel; + public Panel Panel { get { return m_panel; } } + + public int Index + { + get { return m_panel.GetTabIndex( this ); } + set { m_panel.AddTab( this, value ); } + } + + public RectTransform Content { get; private set; } + + private Vector2 m_minSize; + public Vector2 MinSize + { + get { return m_minSize; } + set + { + if( m_minSize != value ) + { + m_minSize = value; + m_panel.Internal.RecalculateMinSize(); + } + } + } + + public Sprite Icon + { + get { return iconHolder != null ? iconHolder.sprite : null; } + set + { + if( iconHolder != null ) + { + iconHolder.gameObject.SetActive( value != null ); + iconHolder.sprite = value; + } + } + } + + public string Label + { + get { return nameHolder != null ? nameHolder.text : null; } + set + { + if( nameHolder != null && value != null ) + nameHolder.text = value; + } + } + + private int pointerId = PanelManager.NON_EXISTING_TOUCH; + + private void Awake() + { + m_minSize = new Vector2( 100f, 100f ); + Internal = new InternalSettings( this ); + + iconHolder.preserveAspect = true; + + closeButton.onClick.AddListener( () => PanelNotificationCenter.Internal.TabClosed( this ) ); + } + + private void Start() + { + if( string.IsNullOrEmpty( m_id ) ) + ID = System.Guid.NewGuid().ToString(); + } + + private void OnEnable() + { + pointerId = PanelManager.NON_EXISTING_TOUCH; + } + + private void OnDestroy() + { + PanelNotificationCenter.Internal.TabIDChanged( this, m_id, null ); + } + + public void AttachTo( Panel panel, int tabIndex = -1 ) + { + panel.AddTab( Content, tabIndex ); + } + + public Panel Detach() + { + return m_panel.DetachTab( this ); + } + + public void Destroy() + { + m_panel.RemoveTab( this ); + } + + private void SetActive( bool activeState ) + { + if( !Content ) + m_panel.Internal.RemoveTab( m_panel.GetTabIndex( this ), true ); + else + { + if( activeState ) + { + background.color = m_panel.TabSelectedColor; + nameHolder.color = m_panel.TabSelectedTextColor; + } + else + { + background.color = m_panel.TabNormalColor; + nameHolder.color = m_panel.TabNormalTextColor; + } + + Content.gameObject.SetActive( activeState ); + } + } + + void IPointerClickHandler.OnPointerClick( PointerEventData eventData ) + { + if( !Content ) + m_panel.Internal.RemoveTab( m_panel.GetTabIndex( this ), true ); + else + m_panel.ActiveTab = m_panel.GetTabIndex( this ); + } + + void IBeginDragHandler.OnBeginDrag( PointerEventData eventData ) + { + // Cancel drag event if panel is already being dragged by another pointer, + // or PanelManager does not want the panel to be dragged at that moment + if( !PanelManager.Instance.OnBeginPanelTabTranslate( this, eventData ) ) + { + eventData.pointerDrag = null; + return; + } + + pointerId = eventData.pointerId; + + background.color = m_panel.TabDetachingColor; + nameHolder.color = m_panel.TabDetachingTextColor; + + PanelNotificationCenter.Internal.TabDragStateChanged( this, true ); + } + + void IDragHandler.OnDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + { + eventData.pointerDrag = null; + return; + } + + PanelManager.Instance.OnPanelTabTranslate( this, eventData ); + } + + void IEndDragHandler.OnEndDrag( PointerEventData eventData ) + { + if( eventData.pointerId != pointerId ) + return; + + pointerId = PanelManager.NON_EXISTING_TOUCH; + ResetBackgroundColor(); + + PanelManager.Instance.OnEndPanelTabTranslate( this, eventData ); + PanelNotificationCenter.Internal.TabDragStateChanged( this, false ); + } + + private void ResetBackgroundColor() + { + if( m_panel.ActiveTab == m_panel.GetTabIndex( this ) ) + { + background.color = m_panel.TabSelectedColor; + nameHolder.color = m_panel.TabSelectedTextColor; + } + else + { + background.color = m_panel.TabNormalColor; + nameHolder.color = m_panel.TabNormalTextColor; + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs.meta new file mode 100644 index 0000000000..832699a513 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 37df190a5f116af4d978c253e5f06d63 +timeCreated: 1503929790 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs new file mode 100644 index 0000000000..fc1e0b9951 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs @@ -0,0 +1,130 @@ +using UnityEngine; + +namespace DynamicPanels +{ + public static class PanelUtils + { + internal static class Internal + { + public static Panel CreatePanel( RectTransform content, DynamicPanelsCanvas canvas ) + { + bool canvasWasNull = canvas == null; + if( canvasWasNull ) + { + if( content != null ) + canvas = content.GetComponentInParent(); + + if( canvas == null ) + { + canvas = Object.FindObjectOfType(); + if( !canvas ) + { + Debug.LogError( "Panels require a DynamicPanelsCanvas!" ); + return null; + } + } + } + + Panel result = null; + if( content != null ) + { + PanelTab currentTab = GetAssociatedTab( content ); + if( currentTab != null ) + result = currentTab.Panel; + } + + if( result == null ) + { + result = (Panel) Object.Instantiate( Resources.Load( "DynamicPanel" ), canvas.RectTransform, false ); + result.gameObject.name = "DynamicPanel"; + result.RectTransform.SetAsLastSibling(); + + if( content != null ) + { + Rect contentRect = content.rect; + + result.RectTransform.anchoredPosition = (Vector2) canvas.RectTransform.InverseTransformPoint( content.TransformPoint( contentRect.position ) ) + canvas.Size * 0.5f; + result.FloatingSize = contentRect.size; + } + } + else if( result.Canvas != canvas && !canvasWasNull ) + canvas.UnanchoredPanelGroup.AddElement( result ); + + if( content != null ) + result.AddTab( content ); + + return result; + } + } + + public static Panel CreatePanelFor( RectTransform content, DynamicPanelsCanvas canvas ) + { + if( !content ) + { + Debug.LogError( "Content is null!" ); + return null; + } + + return Internal.CreatePanel( content, canvas ); + } + + public static PanelTab GetAssociatedTab( RectTransform content ) + { + if( !content ) + { + Debug.LogError( "Content is null!" ); + return null; + } + + if( content.parent == null || content.parent.parent == null ) + return null; + + Panel panel = content.parent.parent.GetComponent(); + if( panel == null ) + return null; + + return panel.GetTab( content ); + } + + public static Direction Opposite( this Direction direction ) + { + return (Direction) ( ( (int) direction + 2 ) % 4 ); + } + + public static bool IsNull( this IPanelGroupElement element ) + { + return element == null || element.Equals( null ); + } + + // Credit: https://github.com/Unity-Technologies/UnityCsReference/blob/4fc5eb0fb2c7f5fb09f990fc99f162c8d06d9570/Editor/Mono/Inspector/RectTransformEditor.cs#L1259 + public static void ChangePivotWithoutAffectingPosition( this RectTransform rectTransform, Vector2 pivot ) + { + if( rectTransform.pivot == pivot ) + return; + + Vector3 cornerBefore; + Vector3[] s_Corners = new Vector3[4]; + rectTransform.GetWorldCorners( s_Corners ); + if( rectTransform.parent ) + cornerBefore = rectTransform.parent.InverseTransformPoint( s_Corners[0] ); + else + cornerBefore = s_Corners[0]; + + rectTransform.pivot = pivot; + + Vector3 cornerAfter; + rectTransform.GetWorldCorners( s_Corners ); + if( rectTransform.parent ) + cornerAfter = rectTransform.parent.InverseTransformPoint( s_Corners[0] ); + else + cornerAfter = s_Corners[0]; + + Vector3 cornerOffset = cornerAfter - cornerBefore; + rectTransform.anchoredPosition -= (Vector2) cornerOffset; + + Vector3 pos = rectTransform.transform.position; + pos.z -= cornerOffset.z; + rectTransform.transform.position = pos; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs.meta new file mode 100644 index 0000000000..0fee34d600 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6a8b928efd02d8c499f887910fdaa503 +timeCreated: 1504774603 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs b/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs new file mode 100644 index 0000000000..73e288c9b2 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs @@ -0,0 +1,814 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace DynamicPanels +{ + [DisallowMultipleComponent] + public class Panel : MonoBehaviour, IPanelGroupElement + { + internal class InternalSettings + { + private readonly Panel panel; + + public InternalSettings( Panel panel ) + { + this.panel = panel; + BackgroundSprite = panel.GetComponent().sprite; + } + + public PanelGroup Group { set { panel.Group = value; } } + public ScrollRect ContentScrollRect { get { return panel.contentScrollRect; } } + public RectTransform HighlightTransform { get { return panel.resizeZonesParent; } } + public float HeaderHeight { get { return panel.headerHeight; } } + public bool IsDummy { get; private set; } + public PanelAnchorZone PanelAnchorZone { get { return panel.panelAnchorZone; } } + public PanelHeaderAnchorZone HeaderAnchorZone { get { return panel.headerAnchorZone; } } + public Sprite BackgroundSprite { get; private set; } + + public void SetDummy( Vector2 minSize ) + { + if( !IsDummy ) + { + Destroy( panel.header.gameObject ); + Destroy( panel.resizeZonesParent.gameObject ); + Destroy( panel.contentParent.gameObject ); + Destroy( panel.GetComponent() ); + Destroy( panel.headerAnchorZone.gameObject ); + + panel.header = null; + panel.resizeZonesParent = null; + panel.contentParent = null; + panel.headerAnchorZone = null; + panel.headerHeight = 0f; + panel.panelAnchorZone.RectTransform.sizeDelta = Vector2.zero; + + panel.MinSize = minSize; + IsDummy = true; + } + } + + public void UpdateBounds( Vector2 position, Vector2 size ) + { + panel.RectTransform.anchoredPosition = position; + panel.RectTransform.sizeDelta = size; + } + + public void UpdateSurroundings( IPanelGroupElement left, IPanelGroupElement top, IPanelGroupElement right, IPanelGroupElement bottom ) + { + panel.surroundings[(int) Direction.Left] = left; + panel.surroundings[(int) Direction.Top] = top; + panel.surroundings[(int) Direction.Right] = right; + panel.surroundings[(int) Direction.Bottom] = bottom; + + ValidateTabs(); + } + + public void ChangeCloseButtonVisibility( bool isVisible ) + { + if( panel.closeButton && isVisible != panel.closeButton.gameObject.activeSelf ) + { + panel.closeButton.gameObject.SetActive( isVisible ); + + float panelHeaderPadding = ( (RectTransform) panel.closeButton.transform ).rect.width; + ( (RectTransform) panel.header.transform ).offsetMax += new Vector2( isVisible ? -panelHeaderPadding : panelHeaderPadding, 0f ); + } + } + + public void ValidateTabs() + { + if( IsDummy ) + return; + + if( panel.tabs.Count == 0 ) + Destroy( panel.gameObject ); + else + { + for( int i = panel.tabs.Count - 1; i >= 0; i-- ) + { + if( !panel.tabs[i].Content || panel.tabs[i].Content.parent != panel.contentParent ) + RemoveTab( i, true ); + } + } + } + + public int GetTabIndexAt( PointerEventData pointer, out Vector2 tabPreviewRect ) // x: position, y: size + { + int tabCount = panel.tabs.Count; + float offset = panel.tabsParent.anchoredPosition.x; + if( tabCount == 0 ) + { + tabPreviewRect = new Vector2( offset, panel.Size.x ); + return 0; + } + + Vector2 touchPos; + RectTransformUtility.ScreenPointToLocalPointInRectangle( panel.tabsParent, pointer.position, panel.Canvas.Internal.worldCamera, out touchPos ); + + float tabPosition = 0f; + for( int i = 0; i < tabCount; i++ ) + { + float nextTabPosition = panel.tabs[i].Internal.RectTransform.anchoredPosition.x; + if( touchPos.x < nextTabPosition ) + { + if( i > 0 ) + i--; + + tabPreviewRect = new Vector2( offset + tabPosition, panel.tabs[i].Internal.RectTransform.sizeDelta.x ); + return i; + } + + tabPosition = nextTabPosition; + } + + float tabSize = panel.tabs[tabCount - 1].Internal.RectTransform.sizeDelta.x; + if( !panel.tabs[tabCount - 1].Internal.IsBeingDetached && touchPos.x > tabPosition + tabSize * 0.66f ) + { + float remainingSize = panel.Size.x - tabPosition - tabSize; + if( remainingSize < 30f ) + tabPreviewRect = new Vector2( offset + tabPosition + tabSize * 0.5f, remainingSize + tabSize * 0.5f ); + else if( remainingSize > tabSize ) + tabPreviewRect = new Vector2( offset + tabPosition + tabSize, tabSize ); + else + tabPreviewRect = new Vector2( offset + tabPosition + tabSize, remainingSize ); + + return tabCount; + } + + tabPreviewRect = new Vector2( offset + tabPosition, tabSize ); + return tabCount - 1; + } + + public void RemoveTab( int tabIndex, bool destroyTabObject ) + { + if( destroyTabObject ) + Destroy( panel.tabs[tabIndex].gameObject ); + + panel.tabs.RemoveAt( tabIndex ); + RecalculateMinSize(); + + if( !IsDummy ) + { + if( panel.tabs.Count == 0 ) + Destroy( panel.gameObject ); + else if( panel.ActiveTab == tabIndex ) + { + panel.m_activeTab = -1; + panel.ActiveTab = 0; + } + else if( panel.ActiveTab > tabIndex ) + panel.m_activeTab--; + } + } + + public void RecalculateMinSize() + { + panel.m_minSize = -Vector2.one; + + Vector2 minSize = Vector2.zero; + for( int i = 0; i < panel.tabs.Count; i++ ) + { + Vector2 tabMinSize = panel.tabs[i].MinSize; + + if( tabMinSize.x > minSize.x ) + minSize.x = tabMinSize.x; + + if( tabMinSize.y > minSize.y ) + minSize.y = tabMinSize.y; + } + + minSize.y += panel.headerHeight; + panel.MinSize = minSize; + } + + public void Stop() + { + if( IsDummy ) + return; + + panel.header.Stop(); + + for( int i = 0; i < panel.tabs.Count; i++ ) + panel.tabs[i].Internal.Stop(); + + for( int i = 0; i < panel.resizeZones.Length; i++ ) + panel.resizeZones[i].Stop(); + } + + public void OnApplicationQuit() + { +#if UNITY_2018_1_OR_NEWER + panel.OnApplicationQuitting(); +#else + panel.OnApplicationQuit(); +#endif + } + + public void AnchorZonesSetActive( bool value ) { panel.AnchorZonesSetActive( value ); } + public void OnResize( Direction direction, Vector2 screenPoint ) { panel.OnResize( direction, screenPoint ); } + public void OnTranslate( Vector2 deltaPosition ) { panel.OnTranslate( deltaPosition ); } + } + + public RectTransform RectTransform { get; private set; } + public CanvasGroup CanvasGroup { get; private set; } + + public DynamicPanelsCanvas Canvas { get { return Group.Canvas; } } + public PanelGroup Group { get; private set; } + + internal InternalSettings Internal { get; private set; } + +#pragma warning disable 0649 + [SerializeField] + private PanelHeader header; + + [SerializeField] + private RectTransform tabsParent; + private readonly List tabs = new List(); + + [SerializeField] + private RectTransform contentParent; + + [SerializeField] + private Button closeButton; +#pragma warning restore 0649 + + private RectTransform resizeZonesParent; + private readonly PanelResizeHelper[] resizeZones = new PanelResizeHelper[4]; // one for each side + + private readonly IPanelGroupElement[] surroundings = new IPanelGroupElement[4]; // one for each side + + private PanelAnchorZone panelAnchorZone; + private PanelHeaderAnchorZone headerAnchorZone; + +#pragma warning disable 0649 + [SerializeField] + private float headerHeight = 50f; + + [SerializeField] + private Color m_tabNormalColor; + public Color TabNormalColor { get { return m_tabNormalColor; } } + + [SerializeField] + private Color m_tabNormalTextColor; + public Color TabNormalTextColor { get { return m_tabNormalTextColor; } } + + [SerializeField] + private Color m_tabSelectedColor; + public Color TabSelectedColor { get { return m_tabSelectedColor; } } + + [SerializeField] + private Color m_tabSelectedTextColor; + public Color TabSelectedTextColor { get { return m_tabSelectedTextColor; } } + + [SerializeField] + private Color m_tabDetachingColor; + public Color TabDetachingColor { get { return m_tabDetachingColor; } } + + [SerializeField] + private Color m_tabDetachingTextColor; + public Color TabDetachingTextColor { get { return m_tabDetachingTextColor; } } +#pragma warning restore 0649 + + public Vector2 Position { get { return RectTransform.anchoredPosition; } } + public Vector2 Size { get { return RectTransform.sizeDelta; } } + + private Vector2 m_minSize = new Vector2( 0f, 0f ); + public Vector2 MinSize + { + get { return m_minSize; } + private set + { + if( m_minSize != value ) + { + m_minSize = value; + Group.Internal.SetDirty(); + } + } + } + + private Vector2 m_floatingSize; + public Vector2 FloatingSize + { + get { return m_floatingSize; } + set + { + if( m_floatingSize != value ) + { + m_floatingSize = value; + + if( m_floatingSize.x < m_minSize.x ) + m_floatingSize.x = m_minSize.x; + + if( m_floatingSize.y < m_minSize.y ) + m_floatingSize.y = m_minSize.y; + + if( !IsDocked && RectTransform.sizeDelta != m_floatingSize ) + { + RectTransform.sizeDelta = m_floatingSize; + ( (UnanchoredPanelGroup) Group ).RestrictPanelToBounds( this ); + } + } + } + } + + public int NumberOfTabs { get { return tabs.Count; } } + public PanelTab this[int tabIndex] + { + get + { + if( tabIndex >= 0 && tabIndex < tabs.Count ) + return tabs[tabIndex]; + + return null; + } + set + { + if( value ) + AddTab( value.Content, tabIndex ); + } + } + + private int m_activeTab = -1; + public int ActiveTab + { + get { return m_activeTab; } + set + { + if( m_activeTab != value && value >= 0 && value < tabs.Count ) + { + if( m_activeTab >= 0 && m_activeTab < tabs.Count ) + tabs[m_activeTab].Internal.SetActive( false ); + + m_activeTab = value; + tabs[m_activeTab].Internal.SetActive( true ); + + contentScrollRect = tabs[m_activeTab].Content.GetComponentInChildren(); + + PanelNotificationCenter.Internal.ActiveTabChanged( tabs[m_activeTab] ); + } + } + } + + public bool IsDocked { get { return !( Group is UnanchoredPanelGroup ); } } + + private ScrollRect contentScrollRect; + private bool isQuitting = false; + + private void Awake() + { + RectTransform = (RectTransform) transform; + CanvasGroup = GetComponent(); + Internal = new InternalSettings( this ); + + RectTransform.anchorMin = Vector2.zero; + RectTransform.anchorMax = Vector2.zero; + RectTransform.pivot = Vector2.zero; + + PanelManager.Instance.RegisterPanel( this ); + + InitializeResizeZones(); + InitializeAnchorZone(); + + AnchorZonesSetActive( false ); + + closeButton.onClick.AddListener( () => PanelNotificationCenter.Internal.PanelClosed( this ) ); + closeButton.transform.SetAsLastSibling(); + +#if UNITY_2018_1_OR_NEWER + // OnApplicationQuit isn't reliable on some Unity versions when Application.wantsToQuit is used; Application.quitting is the only reliable solution on those versions + // https://issuetracker.unity3d.com/issues/onapplicationquit-method-is-called-before-application-dot-wantstoquit-event-is-raised + Application.quitting -= OnApplicationQuitting; + Application.quitting += OnApplicationQuitting; +#endif + } + + private void Start() + { + if( !Internal.IsDummy ) + PanelNotificationCenter.Internal.PanelCreated( this ); + } + + private void OnEnable() + { + UnanchoredPanelGroup unanchoredGroup = Group as UnanchoredPanelGroup; + if( unanchoredGroup != null ) + { + unanchoredGroup.RestrictPanelToBounds( this ); + RectTransform.SetAsLastSibling(); + } + + if( !Internal.IsDummy ) + PanelNotificationCenter.Internal.PanelBecameActive( this ); + } + + private void OnDisable() + { + if( Group != null && Canvas.gameObject.activeInHierarchy ) + Canvas.UnanchoredPanelGroup.AddElement( this ); + + if( !Internal.IsDummy ) + PanelNotificationCenter.Internal.PanelBecameInactive( this ); + } + + private void OnDestroy() + { +#if UNITY_2018_1_OR_NEWER + Application.quitting -= OnApplicationQuitting; +#endif + + if( !isQuitting ) + { + PanelManager.Instance.UnregisterPanel( this ); + + if( !Internal.IsDummy ) + PanelNotificationCenter.Internal.PanelDestroyed( this ); + } + } + +#if UNITY_2018_1_OR_NEWER + private void OnApplicationQuitting() +#else + private void OnApplicationQuit() +#endif + { + isQuitting = true; + } + + public PanelTab AddTab( RectTransform tabContent, int tabIndex = -1 ) + { + if( !tabContent ) + return null; + + // Reset active tab because otherwise, it acts buggy in rare cases + if( m_activeTab >= 0 && m_activeTab < tabs.Count ) + tabs[m_activeTab].Internal.SetActive( false ); + + m_activeTab = -1; + + if( tabIndex < 0 || tabIndex > tabs.Count ) + tabIndex = tabs.Count; + + int thisTabIndex = GetTabIndex( tabContent ); + if( thisTabIndex == -1 ) + { + PanelTab tab = PanelUtils.GetAssociatedTab( tabContent ); + if( !tab ) + { + tab = (PanelTab) Instantiate( Resources.Load( "DynamicPanelTab" ), tabsParent, false ); + tabs.Insert( tabIndex, tab ); + + tabContent.anchorMin = Vector2.zero; + tabContent.anchorMax = Vector2.one; + tabContent.sizeDelta = Vector2.zero; + tabContent.anchoredPosition = Vector2.zero; + tabContent.localScale = Vector3.one; + } + else + { + tabs.Insert( tabIndex, tab ); + + tab.Internal.RectTransform.SetParent( null, false ); // workaround for a rare internal Unity crash + tab.Internal.RectTransform.SetParent( tabsParent, false ); + + tab.Panel.Internal.RemoveTab( tab.Index, false ); + } + + tab.Internal.Initialize( this, tabContent ); + tab.Internal.RectTransform.SetSiblingIndex( tabIndex ); + + tabContent.SetParent( null, false ); // workaround for a rare internal Unity crash + tabContent.SetParent( contentParent, false ); + + Internal.RecalculateMinSize(); + } + else if( thisTabIndex != tabIndex ) + { + if( tabIndex == tabs.Count ) + tabIndex = tabs.Count - 1; + + PanelTab tab = tabs[thisTabIndex]; + tab.Internal.RectTransform.SetSiblingIndex( tabIndex ); + + tabs.RemoveAt( thisTabIndex ); + tabs.Insert( tabIndex, tab ); + } + + ActiveTab = tabIndex; + return tabs[tabIndex]; + } + + public PanelTab AddTab( PanelTab tab, int tabIndex = -1 ) + { + if( !tab ) + return null; + + return AddTab( tab.Content, tabIndex ); + } + + public PanelTab AddTab( string tabID, int tabIndex = -1 ) + { + PanelTab tab; + PanelNotificationCenter.TryGetTab( tabID, out tab ); + + return AddTab( tab ); + } + + public void RemoveTab( int tabIndex ) + { + if( tabIndex >= 0 && tabIndex < tabs.Count ) + Internal.RemoveTab( tabIndex, true ); + } + + public void RemoveTab( PanelTab tab ) + { + RemoveTab( GetTabIndex( tab ) ); + } + + public void RemoveTab( string tabID ) + { + PanelTab tab; + PanelNotificationCenter.TryGetTab( tabID, out tab ); + + RemoveTab( tab ); + } + + public int GetTabIndex( RectTransform tabContent ) + { + for( int i = 0; i < tabs.Count; i++ ) + { + if( tabs[i].Content == tabContent ) + return i; + } + + return -1; + } + + public int GetTabIndex( PanelTab tab ) + { + for( int i = 0; i < tabs.Count; i++ ) + { + if( tabs[i] == tab ) + return i; + } + + return -1; + } + + public int GetTabIndex( string tabID ) + { + PanelTab tab; + if( PanelNotificationCenter.TryGetTab( tabID, out tab ) ) + return GetTabIndex( tab ); + + return -1; + } + + public PanelTab GetTab( RectTransform tabContent ) + { + int tabIndex = GetTabIndex( tabContent ); + if( tabIndex >= 0 ) + return tabs[tabIndex]; + + return null; + } + + public void DockToRoot( Direction direction ) + { + PanelManager.Instance.AnchorPanel( this, Canvas, direction ); + } + + public void DockToPanel( IPanelGroupElement anchor, Direction direction ) + { + PanelManager.Instance.AnchorPanel( this, anchor, direction ); + } + + public void Detach() + { + PanelManager.Instance.DetachPanel( this ); + } + + public Panel DetachTab( int tabIndex ) + { + return PanelManager.Instance.DetachPanelTab( this, tabIndex ); + } + + public Panel DetachTab( PanelTab tab ) + { + return DetachTab( GetTabIndex( tab ) ); + } + + public Panel DetachTab( string tabID ) + { + return DetachTab( GetTabIndex( tabID ) ); + } + + public void BringForward() + { + if( !IsDocked ) + RectTransform.SetAsLastSibling(); + } + + public void MoveTo( Vector2 screenPoint ) + { + if( IsDocked ) + return; + + Vector2 position; + RectTransformUtility.ScreenPointToLocalPointInRectangle( Canvas.RectTransform, screenPoint, Canvas.Internal.worldCamera, out position ); + + RectTransform.anchoredPosition = position + ( Canvas.Size - RectTransform.sizeDelta ) * 0.5f; + ( (UnanchoredPanelGroup) Group ).RestrictPanelToBounds( this ); + } + + public void ResizeTo( Vector2 newSize, Direction horizontalDir = Direction.Right, Direction verticalDir = Direction.Bottom ) + { + if( IsDocked ) + Group.Internal.ResizeElementTo( this, newSize, horizontalDir, verticalDir ); + else + FloatingSize = newSize; + } + + private void InitializeResizeZones() + { + resizeZonesParent = (RectTransform) new GameObject( "PanelResizeZones", typeof( RectTransform ) ).transform; + resizeZonesParent.SetParent( RectTransform, false ); + resizeZonesParent.anchorMin = Vector2.zero; + resizeZonesParent.anchorMax = Vector2.one; + resizeZonesParent.sizeDelta = new Vector2( Canvas.PanelResizableAreaLength, Canvas.PanelResizableAreaLength ); + resizeZonesParent.SetAsLastSibling(); + + RectTransform resizeZone = GetResizeZone( Direction.Left ).RectTransform; + resizeZone.anchorMin = new Vector2( 0f, 0f ); + resizeZone.anchorMax = new Vector2( 0f, 1f ); + resizeZone.anchoredPosition = new Vector2( Canvas.PanelResizableAreaLength * 0.5f, 0f ); + resizeZone.sizeDelta = new Vector2( Canvas.PanelResizableAreaLength, 0f ); + + // Top resize zone is smaller; this makes it easier to pick the panel from the short gap above a tab + resizeZone = GetResizeZone( Direction.Top ).RectTransform; + resizeZone.anchorMin = new Vector2( 0f, 1f ); + resizeZone.anchorMax = new Vector2( 1f, 1f ); + resizeZone.anchoredPosition = new Vector2( 0f, -Canvas.PanelResizableAreaLength * 0.25f - 1f ); + resizeZone.sizeDelta = new Vector2( 0f, 2f + Canvas.PanelResizableAreaLength * 0.5f ); + + resizeZone = GetResizeZone( Direction.Right ).RectTransform; + resizeZone.anchorMin = new Vector2( 1f, 0f ); + resizeZone.anchorMax = new Vector2( 1f, 1f ); + resizeZone.anchoredPosition = new Vector2( -Canvas.PanelResizableAreaLength * 0.5f, 0f ); + resizeZone.sizeDelta = new Vector2( Canvas.PanelResizableAreaLength, 0f ); + + resizeZone = GetResizeZone( Direction.Bottom ).RectTransform; + resizeZone.anchorMin = new Vector2( 0f, 0f ); + resizeZone.anchorMax = new Vector2( 1f, 0f ); + resizeZone.anchoredPosition = new Vector2( 0f, Canvas.PanelResizableAreaLength * 0.5f ); + resizeZone.sizeDelta = new Vector2( 0f, Canvas.PanelResizableAreaLength ); + + resizeZones[(int) Direction.Left].Initialize( this, Direction.Left, resizeZones[(int) Direction.Bottom], resizeZones[(int) Direction.Top] ); + resizeZones[(int) Direction.Top].Initialize( this, Direction.Top, resizeZones[(int) Direction.Left], resizeZones[(int) Direction.Right] ); + resizeZones[(int) Direction.Right].Initialize( this, Direction.Right, resizeZones[(int) Direction.Bottom], resizeZones[(int) Direction.Top] ); + resizeZones[(int) Direction.Bottom].Initialize( this, Direction.Bottom, resizeZones[(int) Direction.Left], resizeZones[(int) Direction.Right] ); + } + + private void InitializeAnchorZone() + { + RectTransform panelAnchorZoneTR = (RectTransform) new GameObject( "AnchorZone", typeof( RectTransform ) ).transform; + panelAnchorZoneTR.SetParent( RectTransform, false ); + panelAnchorZoneTR.pivot = new Vector2( 0.5f, 0f ); + panelAnchorZoneTR.anchorMin = Vector2.zero; + panelAnchorZoneTR.anchorMax = Vector2.one; + panelAnchorZoneTR.sizeDelta = new Vector2( 0f, -headerHeight ); + panelAnchorZoneTR.SetAsLastSibling(); + + panelAnchorZone = panelAnchorZoneTR.gameObject.AddComponent(); + panelAnchorZone.Initialize( this ); + + RectTransform headerAnchorZoneTR = (RectTransform) new GameObject( "HeaderAnchorZone", typeof( RectTransform ) ).transform; + headerAnchorZoneTR.SetParent( RectTransform, false ); + headerAnchorZoneTR.pivot = new Vector2( 0.5f, 1f ); + headerAnchorZoneTR.anchorMin = new Vector2( 0f, 1f ); + headerAnchorZoneTR.anchorMax = new Vector2( 1f, 1f ); + headerAnchorZoneTR.sizeDelta = new Vector2( 0f, headerHeight ); + headerAnchorZoneTR.SetAsLastSibling(); + + headerAnchorZone = headerAnchorZoneTR.gameObject.AddComponent(); + headerAnchorZone.Initialize( this ); + } + + private PanelResizeHelper GetResizeZone( Direction direction ) + { + PanelResizeHelper resizeZone = resizeZones[(int) direction]; + if( resizeZone != null ) + return resizeZone; + + resizeZone = new GameObject( "ResizeZone" + direction, typeof( RectTransform ) ).AddComponent(); + resizeZone.RectTransform.SetParent( resizeZonesParent, false ); + resizeZone.gameObject.AddComponent(); + + resizeZones[(int) direction] = resizeZone; + + return resizeZone; + } + + private void AnchorZonesSetActive( bool value ) + { + panelAnchorZone.SetActive( IsDocked ? value : false ); + + if( headerAnchorZone != null ) + headerAnchorZone.SetActive( value ); + } + + public bool CanResizeInDirection( Direction direction ) + { + if( direction == Direction.None ) + return false; + + if( !IsDocked ) + return true; + + return surroundings[(int) direction] != null; + } + + public IPanelGroupElement GetSurroundingElement( Direction direction ) + { + return surroundings[(int) direction]; + } + + #region Drag Handlers + private void OnResize( Direction direction, Vector2 screenPoint ) + { + Vector2 localPoint; + RectTransformUtility.ScreenPointToLocalPointInRectangle( RectTransform, screenPoint, Canvas.Internal.worldCamera, out localPoint ); + + Vector2 sizeDelta = RectTransform.sizeDelta; + if( !IsDocked ) + { + Vector2 anchoredPosition = RectTransform.anchoredPosition; + + if( direction == Direction.Left ) + { + float width = sizeDelta.x - localPoint.x; + if( width < m_minSize.x ) + width = m_minSize.x; + + anchoredPosition.x += sizeDelta.x - width; + sizeDelta.x = width; + } + else if( direction == Direction.Top ) + { + float height = localPoint.y; + if( height < m_minSize.y ) + height = m_minSize.y; + + sizeDelta.y = height; + } + else if( direction == Direction.Right ) + { + float width = localPoint.x; + if( width < m_minSize.x ) + width = m_minSize.x; + + sizeDelta.x = width; + } + else + { + float height = sizeDelta.y - localPoint.y; + if( height < m_minSize.y ) + height = m_minSize.y; + + anchoredPosition.y += sizeDelta.y - height; + sizeDelta.y = height; + } + + RectTransform.sizeDelta = sizeDelta; + RectTransform.anchoredPosition = anchoredPosition; + } + else + { + float deltaSize; + if( direction == Direction.Left ) + deltaSize = -localPoint.x; + else if( direction == Direction.Top ) + deltaSize = localPoint.y - sizeDelta.y; + else if( direction == Direction.Right ) + deltaSize = localPoint.x - sizeDelta.x; + else + deltaSize = -localPoint.y; + + if( deltaSize >= 0f ) + Group.Internal.TryChangeSizeOf( this, direction, deltaSize ); + else + { + IPanelGroupElement surrounding = surroundings[(int) direction]; + if( surrounding != null ) + surrounding.Group.Internal.TryChangeSizeOf( surrounding, direction.Opposite(), -deltaSize ); + } + } + } + + private void OnTranslate( Vector2 deltaPosition ) + { + RectTransform.anchoredPosition += deltaPosition; + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs.meta new file mode 100644 index 0000000000..0957af14d3 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d12fb16f32dbe264e825a678eff38a90 +timeCreated: 1503911411 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs b/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs new file mode 100644 index 0000000000..3ea8ea1b9c --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs @@ -0,0 +1,574 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER +using UnityEngine.InputSystem; +#endif + +namespace DynamicPanels +{ + public enum Direction { None = -1, Left = 0, Top = 1, Right = 2, Bottom = 3 }; + + [DisallowMultipleComponent] + public class PanelManager : MonoBehaviour + { + public const int NON_EXISTING_TOUCH = -98765; + private const float PANEL_TABS_VALIDATE_INTERVAL = 5f; + + private static PanelManager m_instance; + public static PanelManager Instance + { + get + { + if( m_instance == null ) + m_instance = new GameObject( "PanelManager" ).AddComponent(); + + return m_instance; + } + } + + private List canvases = new List( 8 ); + private List panels = new List( 32 ); + + private Panel draggedPanel = null; + private AnchorZoneBase hoveredAnchorZone = null; + + private RectTransform previewPanel = null; + private DynamicPanelsCanvas previewPanelCanvas; + + private float nextPanelValidationTime; + private PointerEventData nullPointerEventData; + + private void Awake() + { + if( m_instance == null ) + m_instance = this; + else if( this != m_instance ) + { + Destroy( this ); + return; + } + + InitializePreviewPanel(); + + DontDestroyOnLoad( gameObject ); + DontDestroyOnLoad( previewPanel.gameObject ); + + nextPanelValidationTime = Time.realtimeSinceStartup + PANEL_TABS_VALIDATE_INTERVAL; + nullPointerEventData = new PointerEventData( null ); + +#if UNITY_2018_1_OR_NEWER + // OnApplicationQuit isn't reliable on some Unity versions when Application.wantsToQuit is used; Application.quitting is the only reliable solution on those versions + // https://issuetracker.unity3d.com/issues/onapplicationquit-method-is-called-before-application-dot-wantstoquit-event-is-raised + Application.quitting -= OnApplicationQuitting; + Application.quitting += OnApplicationQuitting; +#endif + } + +#if UNITY_2018_1_OR_NEWER + private void OnDestroy() + { + Application.quitting -= OnApplicationQuitting; + } +#endif + +#if UNITY_2018_1_OR_NEWER + private void OnApplicationQuitting() +#else + private void OnApplicationQuit() +#endif + { + for( int i = 0; i < panels.Count; i++ ) + panels[i].Internal.OnApplicationQuit(); + + for( int i = 0; i < canvases.Count; i++ ) + canvases[i].Internal.OnApplicationQuit(); + } + + private void Update() + { + if( draggedPanel == null ) + { +#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER + if( Pointer.current != null ) + { + if( Pointer.current.press.wasPressedThisFrame ) + BringClickedPanelToForward( Pointer.current.position.ReadValue() ); + else if( Mouse.current != null ) + { + if( Mouse.current.rightButton.wasPressedThisFrame || Mouse.current.middleButton.wasPressedThisFrame ) + BringClickedPanelToForward( Mouse.current.position.ReadValue() ); + } + } +#else + if( Input.touchCount == 0 ) + { + if( Input.GetMouseButtonDown( 0 ) || Input.GetMouseButtonDown( 1 ) || Input.GetMouseButtonDown( 2 ) ) + BringClickedPanelToForward( Input.mousePosition ); + } + else + { + for( int i = 0; i < Input.touchCount; i++ ) + { + Touch touch = Input.GetTouch( i ); + if( touch.phase == TouchPhase.Began ) + BringClickedPanelToForward( touch.position ); + } + } +#endif + } + + if( Time.realtimeSinceStartup >= nextPanelValidationTime ) + { + for( int i = 0; i < panels.Count; i++ ) + panels[i].Internal.ValidateTabs(); + + nextPanelValidationTime = Time.realtimeSinceStartup + PANEL_TABS_VALIDATE_INTERVAL; + } + } + + public void RegisterCanvas( DynamicPanelsCanvas canvas ) + { + if( !canvases.Contains( canvas ) ) + canvases.Add( canvas ); + } + + public void UnregisterCanvas( DynamicPanelsCanvas canvas ) + { + canvases.Remove( canvas ); + StopCanvasOperations( canvas ); + + if( previewPanelCanvas == canvas ) + previewPanelCanvas = draggedPanel != null ? draggedPanel.Canvas : null; + + if( previewPanel.parent == canvas.RectTransform ) + previewPanel.SetParent( null, false ); + } + + public void RegisterPanel( Panel panel ) + { + if( !panels.Contains( panel ) ) + { + panels.Add( panel ); + panel.GetComponentInParent().UnanchoredPanelGroup.AddElement( panel ); + } + } + + public void UnregisterPanel( Panel panel ) + { + if( draggedPanel == panel ) + draggedPanel = null; + + panels.Remove( panel ); + panel.Group.Internal.SetDirty(); + } + + public void AnchorPanel( IPanelGroupElement source, DynamicPanelsCanvas canvas, Direction anchorDirection ) + { + PanelGroup rootGroup = canvas.RootPanelGroup; + PanelGroup tempGroup = new PanelGroup( canvas, Direction.Right ); + for( int i = 0; i < rootGroup.Count; i++ ) + { + if( rootGroup[i].Group == rootGroup ) + tempGroup.AddElement( rootGroup[i] ); + } + + rootGroup.AddElement( tempGroup ); + AnchorPanel( source, tempGroup, anchorDirection ); + } + + public void AnchorPanel( IPanelGroupElement source, IPanelGroupElement anchor, Direction anchorDirection ) + { + PanelGroup group = anchor.Group; + if( group is UnanchoredPanelGroup ) + { + Debug.LogError( "Can not anchor to an unanchored panel!" ); + return; + } + + Vector2 size; + Panel panel = source as Panel; + if( panel != null ) + size = panel.IsDocked ? panel.FloatingSize : panel.Size; + else + { + ( (PanelGroup) source ).Internal.UpdateLayout(); + size = source.Size; + } + + // Fill the whole anchored area in order not to break other elements' sizes on layout update + if( anchorDirection == Direction.Left || anchorDirection == Direction.Right ) + { + if( anchor.Size.y > 0f ) + size.y = anchor.Size.y; + } + else + { + if( anchor.Size.x > 0f ) + size.x = anchor.Size.x; + } + + if( panel != null ) + panel.RectTransform.sizeDelta = size; + else + ( (PanelGroup) source ).Internal.UpdateBounds( source.Position, size ); + + bool addElementAfter = anchorDirection == Direction.Right || anchorDirection == Direction.Top; + if( group.IsInSameDirection( anchorDirection ) ) + { + if( addElementAfter ) + group.AddElementAfter( anchor, source ); + else + group.AddElementBefore( anchor, source ); + } + else + { + IPanelGroupElement element1, element2; + if( addElementAfter ) + { + element1 = anchor; + element2 = source; + } + else + { + element1 = source; + element2 = anchor; + } + + PanelGroup newGroup = new PanelGroup( anchor.Canvas, anchorDirection ); + newGroup.AddElement( element1 ); + newGroup.AddElement( element2 ); + + group.Internal.ReplaceElement( anchor, newGroup ); + } + + if( panel != null ) + { + if( draggedPanel == panel ) + draggedPanel = null; + + panel.RectTransform.SetAsFirstSibling(); + + if( panel.Internal.ContentScrollRect != null ) + panel.Internal.ContentScrollRect.OnDrag( nullPointerEventData ); + } + } + + public void DetachPanel( Panel panel ) + { + if( draggedPanel == panel ) + draggedPanel = null; + + if( panel.IsDocked ) + { + panel.Canvas.UnanchoredPanelGroup.AddElement( panel ); + panel.RectTransform.SetAsLastSibling(); + panel.RectTransform.sizeDelta = panel.FloatingSize; + + if( panel.Internal.ContentScrollRect != null ) + panel.Internal.ContentScrollRect.OnDrag( nullPointerEventData ); + } + } + + public Panel DetachPanelTab( Panel panel, int tabIndex ) + { + if( tabIndex >= 0 && tabIndex < panel.NumberOfTabs ) + { + if( panel.NumberOfTabs == 1 ) + { + DetachPanel( panel ); + return panel; + } + else + { + Panel newPanel = PanelUtils.Internal.CreatePanel( null, panel.Canvas ); + newPanel.AddTab( panel[tabIndex].Content ); + newPanel.FloatingSize = panel.FloatingSize; + + if( newPanel.Internal.ContentScrollRect != null ) + newPanel.Internal.ContentScrollRect.OnDrag( nullPointerEventData ); + + return newPanel; + } + } + + return null; + } + + private void BringClickedPanelToForward( Vector2 screenPoint ) + { + for( int i = 0; i < canvases.Count; i++ ) + { + if( !canvases[i].gameObject.activeInHierarchy ) + continue; + + Camera worldCamera = canvases[i].Internal.worldCamera; + if( RectTransformUtility.RectangleContainsScreenPoint( canvases[i].RectTransform, screenPoint, worldCamera ) ) + { + RectTransform panelAtTop = null; + for( int j = 0; j < panels.Count; j++ ) + { + if( panels[j].IsDocked || panels[j].Internal.IsDummy ) + continue; + + if( panels[j].Canvas == canvases[i] && RectTransformUtility.RectangleContainsScreenPoint( panels[j].Internal.HighlightTransform, screenPoint, worldCamera ) ) + { + if( panelAtTop == null || panels[j].RectTransform.GetSiblingIndex() > panelAtTop.GetSiblingIndex() ) + panelAtTop = panels[j].RectTransform; + } + } + + if( panelAtTop != null ) + { + panelAtTop.SetAsLastSibling(); + return; + } + } + } + } + + public void StopCanvasOperations( DynamicPanelsCanvas canvas ) + { + CancelDraggingPanel(); + + for( int i = 0; i < panels.Count; i++ ) + { + if( panels[i].Canvas == canvas ) + panels[i].Internal.Stop(); + } + } + + public void CancelDraggingPanel() + { + if( draggedPanel != null ) + { + if( draggedPanel.RectTransform.parent != draggedPanel.Canvas.RectTransform ) + { + draggedPanel.RectTransform.SetParent( draggedPanel.Canvas.RectTransform, false ); + draggedPanel.RectTransform.SetAsLastSibling(); + } + + AnchorZonesSetActive( false ); + + UnanchoredPanelGroup unanchoredGroup = draggedPanel.Group as UnanchoredPanelGroup; + if( unanchoredGroup != null ) + unanchoredGroup.RestrictPanelToBounds( draggedPanel ); + + draggedPanel.Internal.Stop(); + draggedPanel = null; + } + + hoveredAnchorZone = null; + + if( previewPanel.gameObject.activeSelf ) + previewPanel.gameObject.SetActive( false ); + } + + public void OnPointerEnteredCanvas( DynamicPanelsCanvas canvas, PointerEventData pointer ) + { + if( draggedPanel != null && pointer.pointerDrag != null ) + { + PanelHeader header = pointer.pointerDrag.GetComponent(); + if( header != null ) + { + if( header.Panel == draggedPanel && header.Panel.RectTransform.parent != canvas.RectTransform ) + { + previewPanelCanvas = canvas; + + header.Panel.RectTransform.SetParent( canvas.RectTransform, false ); + header.Panel.RectTransform.SetAsLastSibling(); + } + } + else + { + PanelTab tab = pointer.pointerDrag.GetComponent(); + if( tab != null ) + { + if( tab.Panel == draggedPanel && previewPanel.parent != canvas.RectTransform ) + { + previewPanelCanvas = canvas; + + if( hoveredAnchorZone && hoveredAnchorZone.Panel.Canvas != canvas ) + hoveredAnchorZone.OnPointerExit( pointer ); + + previewPanel.SetParent( canvas.RectTransform, false ); + previewPanel.SetAsLastSibling(); + } + } + } + } + } + + #region Panel Header Drag Callbacks + public bool OnBeginPanelTranslate( Panel panel ) + { + if( panel.IsDocked ) + return false; + + if( draggedPanel != null ) + CancelDraggingPanel(); + + draggedPanel = panel; + previewPanelCanvas = draggedPanel.Canvas; + + for( int i = 0; i < canvases.Count; i++ ) + canvases[i].Internal.ReceiveRaycasts( true ); + + return true; + } + + public void OnPanelTranslate( PanelHeader panelHeader, PointerEventData draggingPointer ) + { + if( draggedPanel == panelHeader.Panel ) + { + Vector2 touchPos; + RectTransformUtility.ScreenPointToLocalPointInRectangle( draggedPanel.RectTransform, draggingPointer.position, previewPanelCanvas.Internal.worldCamera, out touchPos ); + + draggedPanel.RectTransform.anchoredPosition += touchPos - panelHeader.InitialTouchPos; + } + } + + public void OnEndPanelTranslate( Panel panel ) + { + if( draggedPanel == panel ) + { + if( draggedPanel.RectTransform.parent != draggedPanel.Canvas.RectTransform ) + draggedPanel.RectTransform.parent.GetComponent().UnanchoredPanelGroup.AddElement( draggedPanel ); + + for( int i = 0; i < canvases.Count; i++ ) + canvases[i].Internal.ReceiveRaycasts( false ); + + draggedPanel = null; + ( (UnanchoredPanelGroup) panel.Group ).RestrictPanelToBounds( panel ); + } + } + #endregion + + #region Panel Tab Drag Callbacks + public bool OnBeginPanelTabTranslate( PanelTab panelTab, PointerEventData draggingPointer ) + { + if( draggedPanel != null ) + CancelDraggingPanel(); + + if( panelTab.Panel.NumberOfTabs == 1 && panelTab.Panel.Canvas.PreventDetachingLastDockedPanel && panelTab.Panel.Canvas.Internal.IsLastDockedPanel( panelTab.Panel ) ) + return false; + + draggedPanel = panelTab.Panel; + + if( !draggedPanel.IsDocked ) + draggedPanel.FloatingSize = draggedPanel.Size; + + AnchorZonesSetActive( true ); + + if( draggedPanel.NumberOfTabs <= 1 ) + draggedPanel.Internal.PanelAnchorZone.SetActive( false ); + + if( RectTransformUtility.RectangleContainsScreenPoint( draggedPanel.Internal.HeaderAnchorZone.RectTransform, draggingPointer.position, draggedPanel.Canvas.Internal.worldCamera ) ) + { + draggedPanel.Internal.HeaderAnchorZone.OnPointerEnter( draggingPointer ); + draggingPointer.pointerEnter = draggedPanel.Internal.HeaderAnchorZone.gameObject; + } + + previewPanelCanvas = draggedPanel.Canvas; + if( previewPanel.parent != previewPanelCanvas.RectTransform ) + previewPanel.SetParent( previewPanelCanvas.RectTransform, false ); + + previewPanel.gameObject.SetActive( true ); + previewPanel.SetAsLastSibling(); + + return true; + } + + public void OnPanelTabTranslate( PanelTab panelTab, PointerEventData draggingPointer ) + { + if( draggedPanel == panelTab.Panel ) + { + Rect previewRect; + if( hoveredAnchorZone != null && hoveredAnchorZone.GetAnchoredPreviewRectangleAt( draggingPointer, out previewRect ) ) + { + previewPanel.anchoredPosition = previewRect.position; + previewPanel.sizeDelta = previewRect.size; + } + else + { + Vector2 position; + RectTransformUtility.ScreenPointToLocalPointInRectangle( previewPanelCanvas.RectTransform, draggingPointer.position, previewPanelCanvas.Internal.worldCamera, out position ); + previewPanel.anchoredPosition = position; + previewPanel.sizeDelta = panelTab.Panel.FloatingSize; + } + } + } + + public void OnEndPanelTabTranslate( PanelTab panelTab, PointerEventData draggingPointer ) + { + if( draggedPanel == panelTab.Panel ) + { + AnchorZoneBase targetAnchor = hoveredAnchorZone; + if( hoveredAnchorZone != null ) + hoveredAnchorZone.OnPointerExit( draggingPointer ); + + AnchorZonesSetActive( false ); + + if( targetAnchor == null || !targetAnchor.Execute( panelTab, draggingPointer ) ) + { + Panel detachedPanel = DetachPanelTab( draggedPanel, draggedPanel.GetTabIndex( panelTab.Content ) ); + if( detachedPanel.Canvas != previewPanelCanvas ) + { + previewPanelCanvas.UnanchoredPanelGroup.AddElement( detachedPanel ); + detachedPanel.RectTransform.SetAsLastSibling(); + } + + detachedPanel.MoveTo( draggingPointer.position ); + } + + draggedPanel = null; + hoveredAnchorZone = null; + previewPanel.gameObject.SetActive( false ); + } + } + #endregion + + #region Preview Panel Handlers + public bool AnchorPreviewPanelTo( AnchorZoneBase anchorZone ) + { + if( hoveredAnchorZone != null || draggedPanel == null ) + return false; + + hoveredAnchorZone = anchorZone; + return true; + } + + public void StopAnchorPreviewPanelTo( AnchorZoneBase anchorZone ) + { + if( hoveredAnchorZone == anchorZone ) + hoveredAnchorZone = null; + } + #endregion + + private void AnchorZonesSetActive( bool value ) + { + for( int i = 0; i < panels.Count; i++ ) + panels[i].Internal.AnchorZonesSetActive( value ); + + for( int i = 0; i < canvases.Count; i++ ) + { + canvases[i].Internal.AnchorZonesSetActive( value ); + canvases[i].Internal.ReceiveRaycasts( value ); + } + } + + private void InitializePreviewPanel() + { + RectTransform previewPanel = Instantiate( Resources.Load( "DynamicPanelPreview" ) ); + previewPanel.gameObject.name = "DraggedPanelPreview"; + + previewPanel.anchorMin = new Vector2( 0.5f, 0.5f ); + previewPanel.anchorMax = new Vector2( 0.5f, 0.5f ); + previewPanel.pivot = new Vector2( 0.5f, 0.5f ); + + previewPanel.gameObject.SetActive( false ); + + this.previewPanel = previewPanel; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs.meta b/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs.meta new file mode 100644 index 0000000000..cf9db0bd79 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4e929e4f7196f0469eff9e6b709877d +timeCreated: 1503995323 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Sprites.meta b/Assets/Scripts/External/DynamicPanels/Sprites.meta new file mode 100644 index 0000000000..8c92b0b813 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Sprites.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 022c852bc988849428da3536bc06773d +folderAsset: yes +timeCreated: 1506292608 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd b/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd new file mode 100644 index 0000000000..402de1ea86 Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd.meta b/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd.meta new file mode 100644 index 0000000000..e0b59e47e9 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 20c417e04b8c35f4091523662474a6c4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 5 + maxTextureSize: 32 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: DynamicPanels + pSDRemoveMatte: 1 + pSDShowRemoveMatteOption: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd b/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd new file mode 100644 index 0000000000..407564d972 Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd.meta b/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd.meta new file mode 100644 index 0000000000..505ad7e06b --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 7143c7559b82cd14da677a36b3df8d4d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 6, y: 6, z: 6, w: 6} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: DynamicPanels + pSDRemoveMatte: 1 + pSDShowRemoveMatteOption: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd b/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd new file mode 100644 index 0000000000..7128bc62bf Binary files /dev/null and b/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd differ diff --git a/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd.meta b/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd.meta new file mode 100644 index 0000000000..cc6fab5428 --- /dev/null +++ b/Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: ef24468435bb0d64296ede4cf9b6cc18 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 6, y: 6, z: 6, w: 6} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: DynamicPanels + pSDRemoveMatte: 1 + pSDShowRemoveMatteOption: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SS3D/Systems/SS3D.Systems.asmdef b/Assets/Scripts/SS3D/Systems/SS3D.Systems.asmdef index 9e8b847383..3a05ff5451 100644 --- a/Assets/Scripts/SS3D/Systems/SS3D.Systems.asmdef +++ b/Assets/Scripts/SS3D/Systems/SS3D.Systems.asmdef @@ -20,7 +20,8 @@ "GUID:75469ad4d38634e559750d17036d5f7c", "GUID:eb124556ba20d60469be9771eb1f0360", "GUID:46e20dca70571ce4e817a6b5874168a0", - "GUID:8979f103c1228714eb0115e440b2b33a" + "GUID:8979f103c1228714eb0115e440b2b33a", + "GUID:47588e3d37f573d458b0eaa6cc8109c2" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs new file mode 100644 index 0000000000..2da0a929e7 --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs @@ -0,0 +1,32 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace SS3D.Systems.Tile.TileMapCreator +{ + /// + /// Component, that changes number of columns in GridLayoutGroup to fit it's width. Elements of the group will take as much width as possible, but won't exceed it. + /// + [RequireComponent(typeof(GridLayoutGroup))] + public class AssetGridManager : MonoBehaviour + { + private GridLayoutGroup _grid; + private float _cellWidth; + private float _paddingWidth; + private void Start() + { + _grid = GetComponent(); + _cellWidth = _grid.cellSize.x; + _paddingWidth = _grid.spacing.x; + } + + private void Update() + { + float width = transform.parent.GetComponent().rect.width; + int constraintCount = Convert.ToInt32(Math.Floor(width / (_cellWidth + _paddingWidth))); + + if (constraintCount != _grid.constraintCount) + _grid.constraintCount = constraintCount; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs.meta b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs.meta new file mode 100644 index 0000000000..9920137a91 --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca78eb30848a4fe40b2c16cdfff48e37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs index 07601ef027..b4b4148288 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs @@ -1,4 +1,5 @@ using Coimbra; +using DynamicPanels; using FishNet.Connection; using FishNet.Object; using SS3D.Core; @@ -42,6 +43,7 @@ public class TileMapCreator : NetworkSystem, IPointerEnterHandler, IPointerExitH private List _objectDatabase; private Controls.TileCreatorActions _controls; private InputSystem _inputSystem; + private PanelTab _tab; public bool IsDeleting { @@ -62,16 +64,18 @@ public bool IsDeleting protected override void OnStart() { base.OnStart(); - ShowUI(false); - _inputSystem = Subsystems.Get(); + _tab = PanelUtils.GetAssociatedTab(GetComponent()); + ShowUI(false); + _inputSystem = Subsystems.Get(); _controls = _inputSystem.Inputs.TileCreator; _inputSystem.ToggleAction(_controls.ToggleMenu, true); - - _controls.ToggleMenu.performed += HandleToggleMenu; + + _controls.ToggleMenu.performed += HandleToggleMenu; _controls.Replace.performed += HandleReplace; _controls.Replace.canceled += HandleReplace; _controls.Place.performed += HandlePlace; _controls.Rotate.performed += HandleRotate; + } private void HandleToggleMenu(InputAction.CallbackContext context) @@ -148,13 +152,11 @@ private void Update() { return; } - // Clean-up if we are not building - if (!_enabled || _selectedObject == null) + if (_selectedObject == null) { - _ghostManager.DestroyGhost(); - - return; + _ghostManager.DestroyGhost(); + return; } _ghostManager.CreateGhost(_selectedObject.prefab); @@ -271,6 +273,15 @@ private void RpcReceiveCanBuild(NetworkConnection conn, bool canBuild) [ServerOrClient] private void ShowUI(bool show) { + if (!show) + { + if (_ghostManager) + { + _ghostManager.DestroyGhost(); + } + _tab.Detach(); + } + _tab.Panel.gameObject.SetActive(show); _menuRoot.SetActive(show); }