From ebb74b2615b6fefbb3b0323e9ec1dbb3d640a62f Mon Sep 17 00:00:00 2001 From: Iamteapot <77565416+iamteapot422@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:22:14 +0700 Subject: [PATCH] Movable and resizable panels (#1288) * Add panel plugin * CursorHandler * Make more space, make enabling/disabling work on panels * Change grid depending on its size * change menu width * Add cursor handler (again), change values a bit * Fix object object ghost * Add debug * Remove debug * Change AssetGridManager namesapace, add a little more doc --------- Co-authored-by: Mechar418 <77565416+Mechar418@users.noreply.github.com> --- .../UI/Lobby/Canvas/PlayerCanvas.prefab | 310 +++-- .../Construction/ConstructionMenu.prefab | 21 +- Assets/Scripts/External/DynamicPanels.meta | 8 + .../External/DynamicPanels/Cursors.meta | 9 + .../Cursors/CursorResizeHorizontal.psd | Bin 0 -> 38234 bytes .../Cursors/CursorResizeHorizontal.psd.meta | 92 ++ .../Cursors/CursorResizeTopLeft.psd | Bin 0 -> 39212 bytes .../Cursors/CursorResizeTopLeft.psd.meta | 92 ++ .../Cursors/CursorResizeTopRight.psd | Bin 0 -> 39212 bytes .../Cursors/CursorResizeTopRight.psd.meta | 92 ++ .../Cursors/CursorResizeVertical.psd | Bin 0 -> 39248 bytes .../Cursors/CursorResizeVertical.psd.meta | 92 ++ .../External/DynamicPanels/DemoScene.unity | 1089 +++++++++++++++++ .../DynamicPanels/DemoScene.unity.meta | 8 + .../DynamicPanels.Runtime.asmdef | 6 + .../DynamicPanels.Runtime.asmdef.meta | 7 + .../External/DynamicPanels/Editor.meta | 9 + .../Editor/DynamicPanels.Editor.asmdef | 17 + .../Editor/DynamicPanels.Editor.asmdef.meta | 7 + .../Editor/DynamicPanelsCanvasEditor.cs | 618 ++++++++++ .../Editor/DynamicPanelsCanvasEditor.cs.meta | 12 + .../Scripts/External/DynamicPanels/README.txt | 6 + .../External/DynamicPanels/README.txt.meta | 8 + .../External/DynamicPanels/Resources.meta | 9 + .../Resources/DynamicPanel.prefab | 432 +++++++ .../Resources/DynamicPanel.prefab.meta | 9 + .../Resources/DynamicPanelPreview.prefab | 78 ++ .../Resources/DynamicPanelPreview.prefab.meta | 9 + .../Resources/DynamicPanelTab.prefab | 523 ++++++++ .../Resources/DynamicPanelTab.prefab.meta | 9 + .../External/DynamicPanels/Scripts.meta | 9 + .../DynamicPanels/Scripts/Anchoring.meta | 9 + .../Scripts/Anchoring/AnchorZoneBase.cs | 67 + .../Scripts/Anchoring/AnchorZoneBase.cs.meta | 12 + .../Scripts/Anchoring/CanvasAnchorZone.cs | 39 + .../Anchoring/CanvasAnchorZone.cs.meta | 12 + .../Scripts/Anchoring/PanelAnchorZone.cs | 71 ++ .../Scripts/Anchoring/PanelAnchorZone.cs.meta | 12 + .../Anchoring/PanelHeaderAnchorZone.cs | 28 + .../Anchoring/PanelHeaderAnchorZone.cs.meta | 12 + .../Scripts/DynamicPanelsCanvas.cs | 635 ++++++++++ .../Scripts/DynamicPanelsCanvas.cs.meta | 12 + .../DynamicPanels/Scripts/Grouping.meta | 9 + .../Scripts/Grouping/IPanelGroupElement.cs | 21 + .../Grouping/IPanelGroupElement.cs.meta | 12 + .../Scripts/Grouping/PanelGroup.cs | 667 ++++++++++ .../Scripts/Grouping/PanelGroup.cs.meta | 12 + .../Scripts/Grouping/UnanchoredPanelGroup.cs | 111 ++ .../Grouping/UnanchoredPanelGroup.cs.meta | 12 + .../DynamicPanels/Scripts/Helpers.meta | 9 + .../Scripts/Helpers/NonDrawingGraphic.cs | 19 + .../Scripts/Helpers/NonDrawingGraphic.cs.meta | 12 + .../Scripts/Helpers/PanelCursorHandler.cs | 155 +++ .../Helpers/PanelCursorHandler.cs.meta | 18 + .../Scripts/Helpers/PanelHeader.cs | 62 + .../Scripts/Helpers/PanelHeader.cs.meta | 12 + .../Helpers/PanelNotificationCenter.cs | 216 ++++ .../Helpers/PanelNotificationCenter.cs.meta | 12 + .../Scripts/Helpers/PanelResizeHelper.cs | 139 +++ .../Scripts/Helpers/PanelResizeHelper.cs.meta | 12 + .../Scripts/Helpers/PanelSerialization.cs | 375 ++++++ .../Helpers/PanelSerialization.cs.meta | 12 + .../DynamicPanels/Scripts/Helpers/PanelTab.cs | 259 ++++ .../Scripts/Helpers/PanelTab.cs.meta | 12 + .../Scripts/Helpers/PanelUtils.cs | 130 ++ .../Scripts/Helpers/PanelUtils.cs.meta | 12 + .../External/DynamicPanels/Scripts/Panel.cs | 814 ++++++++++++ .../DynamicPanels/Scripts/Panel.cs.meta | 12 + .../DynamicPanels/Scripts/PanelManager.cs | 574 +++++++++ .../Scripts/PanelManager.cs.meta | 12 + .../External/DynamicPanels/Sprites.meta | 9 + .../DynamicPanels/Sprites/CloseButton.psd | Bin 0 -> 35584 bytes .../Sprites/CloseButton.psd.meta | 147 +++ .../DynamicPanels/Sprites/PanelBackground.psd | Bin 0 -> 20830 bytes .../Sprites/PanelBackground.psd.meta | 147 +++ .../Sprites/PanelTabBackground.psd | Bin 0 -> 30455 bytes .../Sprites/PanelTabBackground.psd.meta | 147 +++ .../Scripts/SS3D/Systems/SS3D.Systems.asmdef | 3 +- .../Tile/TileMapCreator/AssetGridManager.cs | 32 + .../TileMapCreator/AssetGridManager.cs.meta | 11 + .../Tile/TileMapCreator/TileMapCreator.cs | 29 +- 81 files changed, 8614 insertions(+), 123 deletions(-) create mode 100644 Assets/Scripts/External/DynamicPanels.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeHorizontal.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopLeft.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeTopRight.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Cursors/CursorResizeVertical.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/DemoScene.unity create mode 100644 Assets/Scripts/External/DynamicPanels/DemoScene.unity.meta create mode 100644 Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef create mode 100644 Assets/Scripts/External/DynamicPanels/DynamicPanels.Runtime.asmdef.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Editor.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef create mode 100644 Assets/Scripts/External/DynamicPanels/Editor/DynamicPanels.Editor.asmdef.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Editor/DynamicPanelsCanvasEditor.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/README.txt create mode 100644 Assets/Scripts/External/DynamicPanels/README.txt.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Resources.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanel.prefab.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelPreview.prefab.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab create mode 100644 Assets/Scripts/External/DynamicPanels/Resources/DynamicPanelTab.prefab.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/AnchorZoneBase.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/CanvasAnchorZone.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelAnchorZone.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Anchoring/PanelHeaderAnchorZone.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/DynamicPanelsCanvas.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/IPanelGroupElement.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/PanelGroup.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Grouping/UnanchoredPanelGroup.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/NonDrawingGraphic.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelCursorHandler.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelHeader.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelNotificationCenter.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelResizeHelper.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelSerialization.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelTab.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Helpers/PanelUtils.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/Panel.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs create mode 100644 Assets/Scripts/External/DynamicPanels/Scripts/PanelManager.cs.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/CloseButton.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/PanelBackground.psd.meta create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd create mode 100644 Assets/Scripts/External/DynamicPanels/Sprites/PanelTabBackground.psd.meta create mode 100644 Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs create mode 100644 Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/AssetGridManager.cs.meta 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 0000000000000000000000000000000000000000..5ddd2149c7b9ccf655b5379d9b166f4987687c12 GIT binary patch literal 38234 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..617de5f45ee2401226fe2f6be2a4f73d5a9a1708 GIT binary patch literal 39212 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..982f8f7bcce5b73b1f5ceaea483b8173d6d88373 GIT binary patch literal 39248 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 beMKSs0(==j!Bz66ay?Xs$ypFIe literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..402de1ea861a39566de4cd5e3db4f95165edb9ca GIT binary patch literal 35584 zcmeG_33yXg*7qf8+H~L8K|)!|V)uo%Y+a$1mX@Y~FfOFYYa5y-AxT@n1w_OV9T!AY z+;IgJ934>^M+H#?{ZUbY5tJez`&vqAN&EhD?pyLwipJ6T{%_{b%lFu1WNJ4*R7E$&aI_X#63PKblp3tyEY1r_! zO^35ntkX_q+?~7PoMG5S>Nf=aGS82lFwdqp)Ur-(C0lK>jEgz*_YY&VCgZr68EGYn zCAK`a##Fe#&gvFSsW2?4HDnrNCX5dpJ1=Wqovn^_>b3Lg%oa!1ym2vlqqUOF0vOQ= zF0`aSIqc8fX3R5Raxcv6NTu&H7=&c>9l1fBs4ZQ#y6(KTkX{eNtv0M35m%G z$;oj*5$Bk1aq8#ASsa6TCL*7F)?u)lY)+HaqD8*?N^8AyTucl`Bwa$f>TFU(7Dqfy zW4ysymoQInOGt`OOz19gSd0R&5h01JK6CNGCeLaJuWG= zA~`WDF(oT8a}+)kWlVU=E<8%0G#d3zy}%_oF)k@NE-|GdDJ3gubXHQLoQnr-S3Xvw zscODgT-=m09#XDngzlP(^upWp-< zi}J?b|~n8R(ssdH%BCSC6ByhPC`sb>&%6 zs;e_`SgV|kdOMp_4Q1jgmLyefNqDZF!Md^^o4_ml-;faweZ%j|h7?0(qA@ciBQAqA zX2hkZV?9bWCdQ>?X6g;;`ZPnTVYHad|8h2DW~HTy_U`{K8{DPXP@}h0v&QiWV#-9s ze^SnQX90hE1-fcW^@rtL=5MV)e^}1(HPO>1il)4a4dqE?T{gZyNUJh*2%#^UAazEs zsMwPI`y+v_h4YW(E%EY2BB{a~z^5*6v?S5^)Fr9H8^EV7Z?q)Q_|zq-!W+P+E^o9X z(fHIQslpq;r!H@_B+>ZPC8@$2z^5*6v?S5^)Fr9H8^EV7Z?q)Q_|zq-!W+P+E^o9X z(fHIQslpq;r!H@_B+>ZPC8@$2z^5*6v?S5^)Fr9H8^EV7Z?q)Q_|zq-!W+P+E^o9X z(fHIQslpq;r!H@_B+>ZPC8@$2z^5*6v?S5^)Fr9H8^EV7Z?q)Q_|zq-!W+P+E^o9X z(fHIQslpq;r!H@_B+>ZPC8@$2z^5*6v?S5^)Fr9H8^EV7Z?q)Q_|zq-!W+P+E^o9X z(fHIQslprJ7u6N$KHkY%;7n&D9Nwg-KeOn`(8KTyhnqiz8f3GZEY8w;r>))zNIxVg zb2xRCaF~x$6j_`sYpJh84}|fZXSSm|jE2>j<{?F{$%$dmo9D^er|9e0ih}Da0L4ef z2Y?f8)+!zAthbd`&M|;zFexK;VufE7oQKsBmN-d0u^}rGXp^YHMcL$`sm3GNdUhOE6 z9C>z2p4(w@x*f%pW{2c6rP|pbIST5``H}@p+cnany`q_@}@jZaUsDKcD=;`r~6ooVLo3Hdr+Ti;2Aj7o~Hjw!|4^r;6Yy}M$0_wVtex)8qT;|jE*kW#o$Z=KbmB$l2W+`WS4qFa^3Yy3*MyMU4784cEG7( z)-l~&j0S-5h{uom0XhjT@ zuy#EC3J8KHX9eOwo)|IcQ&d;2h1b73{Yp5e@6o_f<$GdE9MztUpjvNsR_Loes6q{_ z*<8WSa~3%YD@uw*GaDeHJ%}|mR{Me+v#DBa1;hBn7m8>|xxbOE($`b7uW4ZI&Th!3 zi)c^spvr1`R$Zpt2%dlLB*_DUkSSIR>RRKp+MxU3VC8l-&+4Jaqg9QrWA#uORj9KePS#KZa3a9L_KI?7omFEA2?(y1!Id)D z2_+C{NuJdbmOe6!8St+rhL$it9+c0ckTj%{=FMF zE+J&Ym$LNq#PTBh;E0Je#G^u`>sJXR%Busi_~J1>>H7}ae7*{6u~Zx2^AYuSE%Yf2 ztTwJ|A^w*G%EXe%acwzU#bV!u)lP>}23;@6Zi~@Gznx;TczlII#^GNKCgXr0U#yro-5QkQoDy@Z}z0@TX6YhvETnDjX)- zERekN3az2u-oTTn@Z|^no-h(k`jBhLU@{zfEXiav8AGy30lAKpLZ59Wxe0n{HKY!D zY>nhratB#T?j;YBN60Gj40(a9A?wJS!J7ig}J%!~B(bkJ-d* zW4>no$sAygG3S|fg;Ei$h*k_x3{xa1G88$A$%+cajf!f;T*U><+B#}um-uPHVt zHYq+=e5YtqoKUnVi84spQ#nW(r_501DNB{JlvPT*@^29|Y_S zI1+GK6RsJm$+wX7fAnbTsq8td zXHidc&j)(G*>hLV_Fe;e<@92E-P3DbubsVGd-v;|-J9*btoQof-}P?qqwQ1Br?$^S zectKwLtj=)f{Og}@vW&Pgl_kDjw|B?O6``^<4`Tk$@Zy9jS zfJp;v10Emn@qm-p^t>kfnmO03xaNavjtz_&IDVjM;EI7C4m_^yq0P~nwU24HXwMGn zKd5j}{h;Rt?HF`9CN^eT%;K2!F+U6r9Go$@YVeA|n+KmAGH^)AkXwhmI^_GInxPp( zYlc2LbnDR8VX?zz47+>SJHw8~_Kq!zT@d?f?7rb4!zT=%JAC! z#Gg(Wk}xabp@gjoor!6Q=EN5g_a;RqU6-^tX=Bp)6e+CxiItn z%(krbEN9l6S!c$?jj0{8cFfVSv18e>FN{4nE@qs5+;iia#%ssV9{=q4rU`>4=qIe6 z@Kg5SY-9FI*++6l+?cCP9ti0RuKFU|-Ps(4GzoQ_sU|PYdf*&Ww zOst;x>cq2?(k9(9>7zow!pVgX749w?P-G}tQ*`#a(bwH}-ImG0lXa6ce8G- z?qWr5#RC<4rwyN0KW+2$u<18UUo*XRM*fWDGn%eXxc;{5KcCrmrfKH8v;1dGpY_tL zmOmBz>5)Gjz9H>~r8n%lG4{rJH*UMB?@i{L{&92I&H9_)n(a4x#_YATUHVe}YJE#( zQRS1BXAOCVM-3;8*~S&dW9&F~IeVmPT-EZbqt)Z8AFe)DGofZ>%}G<9X_e{RoWeQJ z%xSGHt$n$cGtV%uuM4P~UH6_P(o$>LV!g&X&-%4(lx?Z4X>QisN9LZjPqx40U>r9( z-gQPpXX=ak;q`abA7~ig@I=F<#_5f3&5M|4nfJx~k@N4Fe`LYL1ux#By2WtI=358d zddIB?Zp*ptx!alBD{tStaPYz<3lA@vwCI&P0`I83<9`+>E?&O)!kshj+_+@Gl0{1n z-Zkm2SC@t^wJ+U$_n5n%`LpWJra$kvC*_{U@9A7-T($=Zy-}b*G{pGR0 zaQ9c;zvF@Q2cCXV{h;N+T@Ouo=#}LW%NHy^_;AU?8&+snEL(Bmk((dcwla0)Gmi#7 zTK{O%W5tiX`}mN@AAH=ks%F)9Pvkza{>lDN-t%PZQ^u!uKArvax@QJFbMG_l&zhdy z^W3E8Hmn}Ddgb%#=Nq2?`Gx5(Y<)4~#WgSWed*qpI$pNC-1JKMD_ho#UbALx|FsXi zs(7{j)nl*S@Y+|e=fD2$y0~@Et?#-1-Z#h_^=};i>+HYodUNudo8QWKYu(?5{_V-P zquyS&f!Q#B!`XLg-f4Pw=DT0NcinrNH;&o(_TS_G{_^{S-hbjBJ^t~)2Z0|f`GEUy z!G|p$**-eCse04F%{On}`|Hezo!Iv0s0%bHdI|-{gPu>96U*DA8^p6Ai z2fp}8_tV~khJz;#IS#oFFZns-=aokW9$9lV`RMz{CLa6h_@9m+K4Cj?`Q*}55vQI! zJ^b|F&SanY;_UTj51+H26GIdcj531Zet_}6 zg4@DO04e>TV*(cljF*xy3YDMQKR^>01QTDLo(xeaMbB`;s2HU}rSS7t2ly$2Q@}Gq zsTvfSp6_KWn3nEjf09JFx&*Oq5xDP3u#(0ZK_-xv z*a9J|Ammi;*u=Ul3t>X(rYE_SB9No3>$-BSV z=-9)N4OMyPe;oAeobOjH+_c-Z{=&*3FPv;$`N1ypd#mnQJgabe-(%k_Mp@5+tTT5X zstVp72!r)ZWX#7DgE2A5B_(7e00G3GiKG+aI2TKpzI34i zAX3Tnli)ebaDhevG)Z&{4EflZWC~*qUvamIPJLn6SK$7Z1iBUx0&}0jyZa9q%D$RJ zk`v)$gh|QpJwmPcJwd28&oXZLo>fS3XrEQOVTcbeH3Qvocr!RJ=uQh0<4y}RQl1tC zBl2L96>i>?89ZPf1hpc*N8Lckh-bM@(Hq`cdSje~ET*)JsYVu~<+H#y0yz={UQ9lv zATa)+GtW4m{L6P>F3bnuOdd>FATM*h1!f|^HsU;TF3fHlNG++Rt2^~D%Wb4I7Ka`D zRh88i-aX%BL^s@Y*41FHG@~1ng!Cp$)jYwUx@#@9R=L~kuvH1}5X#?RM*abC(+hEq znmUYwY6{(kdIz2909-2E;c#Pg5DGtJil2@YFdDOdK5MTq)v>q=le7DL{IfFuTT55}QgE?|I{*ZJbF ztI^w7Z4#!n!C}A!5~t3ZhkA3TRh%lODTg&Zt;YoJAF>QZ^P_4WtP4c%!vw%}W&Bw5 z$W>N>LhJMnCu^U0y{^&ZG}MSQqa@$1tML>UF~BDbnXwjqrAX>;v$L>PMOP;=rNQu# z*2W@BzDaMk(lsTT{1RAa6Bo2{&6X16Qet*u2IF$47pg%@@e)_)L^r<06*@Vt)MgM? z++gXeaFOIyUu|}aX4Y4m>9Smor8;}Mn<(Gmw1~@f;_N7L$g8cBmhmKx092am?IOJ# zKgH@`dA!{q$LCm_IpUfdsjypgp8D3+*z$lJOfAd>*J-uF9JN0wCMKxrEM3~7{POG# zT49Yq;mIS@+h<~fG@<>^VNigBV@YWX^`W7J+yqCR17V{h0y8@vsngK&o9-| z+%LMKG$96rpo@I}k)Z)>! z@$HR~$?lJo{B^Zrp{p@Y`Tt^kVE>Fwu)tvMi$v9cQmqqBp2Y|;;1B&ncVmXIycqqq z#%zkc4hyEY#i(v!Q_O6nCsHxuUHnrlMsl1-F`6m)L{!`LMiVr^6HR7w39Lz)x?L}Z zXeOe7bnAj>agm8U$>{dJ=7>qYieM0<-YBSDLnhHp8AfQka65+3IhwZT4r$~W2tl2otefiR(JS` z&|~-Hh8W-mJC*(wi>7nVH;a{OqRz=%GN+wZE|61drXUvTr-Sl{F?H9i|24CqTc8#8 zqs=pW^sE0}!vKvHwrJ2@iBfmF=!%X7Vjw{t!y8QDziu9V9gF{#QO#957S-lPomg#( zCh2IE(Af>NC&yM+cImq!21-;7ilH-80TN;@35U&+&;W0KkGa5tB_D)&^1Y%m*8?_lXfnrN2;0fF1} z>g}wEB6&4kn>xgR&Vo^KVm(4wUXRe-eLd=~$r4L0v}*sRnJ96xhxQSQEDf~xKph@E zBH5tDn`tR|jg(J6Wz!mfI)EnHR{ftpvqa}PX%C0F57OjM=a}ngw-Q$nancu2MlcZI zN`aeptI&&Xm!_JgE_fhiUA>)VJ2K29OujN!ntubGjO=*Ut4g*3P1zJ03}wXbHQXo&Mk7k;4h8?yZ!GW{&07FgZjI{B9)?BPRQ9)0(pVq!yreLLjLCC z>54@+FB|g3Smkd%JzcTj#vE&~R@cIKxEQ2C32^ixNFr=IM^{8GJ3n9eyEUu582%oq z``KS12-?XI2*U65#vzU{ zmrYrON@5gQjO;wo$D@FV>tMcu$e+jitp(9tIRChU=q{Z9)ddk%jdoR7H;)FVKb(N9 zfyFZ$-BbZ57^uInX6}GxUFvqPnbX}$zhlju=WqBoubKZ4LE~v~IHCPej)io(+m0ZI z({8N=y9IMRf=8qbe|{h-*h=D5Rh#=q+AbclE4)S0DD=0)~h=qb`dK=>(w0~A){X3&iSo_a5T_*wToadKq}X% z1=MBI&Z9WwyI$Q+FuwK82)B_-2)7`7iJ)-nTM=%BLp1=mA$*a->i}K{Fiil^U{Wyb zItaTC!qPMVPfQKQ2XS#A2Dsa)NZ^L_p=5x%OhpHjA0}BqqK^4gV%i{fDlOHsOd~v& z>RG_j)KKnS^bDkeo@F_*UdR#8+*>c?9^`VVn9J+Awo=rwqVyG73f7dmpj7NfBlSD$ zIW1w_{@?xcNphtQ!4l&IJs{i}NU!8Y@Iq@{rgzf52Er3d9MD_Bi9|OY;tjAR60&$M z__=#g;wXmpoTu9zmTt#5I0NEWr=MfB%SOC@b#RDQL;wL%R++@1675;x;XvWf(>;zN ztKqMR9af76jucp=lgShYeroueXL~hv5JGW6)Xd`XQT$_gq3u@lSn&6+fU*ah>SvEVx%;Eogn0OPBL2@|BrH#ulm6M_ll zIT$n_1y;Ea=|}pL0dV&NxEHnI5#Sd|t$J_LSMu!(yJC9)p4x86)Bnrxe9IFpNZCt} zI}~KYUx?5G@hwj;kehF#1o^T3zsxa*U8gyw<8UVj#;TJ$K172-p7h4p;l7&d%m@r;Z;$=`M4ZxG>itj&ogZztq}%=E%o@Z0B0J5JYx#xY{nB z`RuMWt~Tx>7laHU{Ka$IUv*vLTDZW@OYQA#ms(qz_ksH&7u?Z&;X-qB3&_=W0D`n~ zp&h5soIZ8pcXtMJV2+_txQjIljTC(=LGZzp~ z71GW{yH#>|&-oTX_Z^^tP`3|=zqgsHxbr7axJy*l2ap)l@m|oe`oiV*CKqNlX3o){ z_kXZtEyNrIdThDSeC9&)UKixLrt|nQ!LN-A1g_0zPaZjb{5uG!>F7ND^I;mSmD9NP zo;`i!(82xBLEZ=abnYbY(ZU6|b{{*`wD+02_H=UU{f7>G2(dJC{;qF-LL9`d+PC?x zwXSoV+V$15fWU0t^SbK{NckEB@fFoIP!D`X)mKz~R@G-!|1hfxgCO^?69+#y?EFl_ z4?8c{2m?$Qu58l?!%n3Omh2RSj&ZhWgi)u$H3xcAIOg1@5yqU%&R7Lee@0Qlh*Pm^ zkq(BTnr##*3^e@JPT4gEAFjafGJX4#T!>8h*s-N3l4XL$q?62FGLq17L?p zW*dydD5?VohMMioyvv0{M$PsX-gOxVlbY?VysI6DnVRiwysM2Ln6`0>U9;drEOgWf zBhYOcVblpD&}|xF)CnWdZ5nCB$?Xynh9hNOvRPCljWpP#Dd6SQNMlWZK3NpKT_X)P zg;aoKkfQCN0?;SVb(&I0tpdTm+3{+{T%28P&8zm xW;?*H7Z=2K67?Jxhs4dqU$dP<9Ozy(XD6V}5w+%1MBvyowp6~43Uw;jjMqYVX>=_YB~!g^nRWEb0sy>=3dY+~$9(pCtVota%vJv%d< zne`+5pbdpe{nt=H@B{S$Eq^Lr1tdU%lorIlwzQOjkVxCm3aOAj(jrl5Ip@yI-G`lY zTBm}dnf1(^d(OG%p8MT<&%I;m-o2Bv^MoVL6^0j2?+$`ATnB!(cXB4z(n1sM9|;ix ze}wXOQ(oW8uYUUV*qI&o-T(R0!;eePIQqL#mVRh---;oKi?YoZ{x`SD)!=7WC8{Jjk#GqtD7=EJP?nH@%S)5k{(D54~`6_KF%lO$wVxkj3tJmi9}{7 znMtI0_lk^n0X1q$#mwB)0k=3vjYSr0+sMRX%gf6H%c%j~EX5M(bQ;YhlTpx!TC18Z ztVA_yr(?vkGbLN1sTj7RYdqQ&3VOvJi$t&>cDeN`8>}GB8lZI?5cP6wMKEHCfp~1a zOp?g*7!^~cu1R7{R^_s+*%stWteX!Y&E;6ub&D&P*Uf3!(@RhT7m;;yTKQE&j?KxI zUNJ>^dI>z)xt{aJf^O^9f_{;DGqF>9+Bgnoqu_ofYs!MHn|WPV$DMYc_3ZK4EVOfC zgum{DqDlI)b^U0pIZLetYS!c_!IsA{XEdIUCWrFzL?*R2lNkP3Je7&Z>x?*>O*V4S z8zsROTr0^GT1mz8iF778lo?9bTWQd3wxdf*an+ZVnr591Nz4>=vn<%-f?=qNC}8)C zEoqY5sTi=Mv6^aKe%d)QGn!=!nkdgqjRRvqQKXDqC!O z6biB^NJVLHTA(21a`oBQn4Z$b3ieOev;?M8dxg~CP&yfnOCx)u!^OdLRFHuZl8KQK zAw5(~h)K_MUG_DmkD3a^7D27kLGRyf5$l*)Q`8~Fg8sK!*Ds-W(&#ZS-`dFa1gb)# zfFYQcjDut>;*Am(Hds`^Jan*S1Q8o>T*MA9OQW#{Zp|&0)6J%=Z9so0JNE0cU%ZUv z1zEe)fN@Mwt&1D6^rF2inDRsk`h=gc>{xBg)@*(>hVfQa-iL;;gr$u&Ls3o)3sORe zjz}XyR7wmEM}=xo@pzFn^LuUv2s%kG;{5lTq1KDV1wkvx(s<14z#ij+ z)N=kJ;JY6{7o96EL(3(T1F8C%(9h_(Y|Z8j!^VK<#qqTPbd*g^nXInrW=@yn@ziK+ zJ+|9zoC50BS#-cVTv)}y0y4%{kZWQA3z?UbXztIK(>Aje6vCkJLj-X7L5b-Ea4{(S z5CL3%P+~d(Tnq|7L;#l`l$cHc7lXnN5y0gKC8iU=#h~y*1aSF5iRlDzF(~{H0bG7i zVmbj_3<^I)0GA(>m`(r}gTfCHz~u)erW3%$pzuQkaQQ)r=>%{wDEtrsTz*huIsse^ z3O_^ummidvP5>8!!VeL^41aL7Z{15?Leo$gM0bC3UKSThR zAC#C*02hP84-vrS2PLKxz{Q~OLj-X7L5b-Ea4{(S5CL3%P+~d(Tnq|7L;#l`l$cHc z7lXnNaY?wkYI`ze4K`vf!;VX5KWB#S=R60`KDeDdq1}e5X!g;HZB%SvwxY_cWzQF2 z3m(;&(QH}PDrFQPjqj{#VtO;pJFl#u#-w6n9uzw^W%Gzomh;m$=7HrD=46;Pb-g$* z+ZE$z;T92uJ!F=cM2BAycBjr0nb@R43^YZ$45ke!YGzWkHP@q_LPb$+MWZG`-buBy zxtl)e)c6x=~o=}B?1Rn5+2%F+y?;`AUb$i8ZY1Z<3 z1=6StZ*-d+mWz&=regEDv2L;RqU!KxO>zHCXn|gRqNy7vU@zJ%_E1GDdGPh3U=Dnm z)NNZYtGZTlv-EfpbfJ#F$>Yx{rGIgmdbkF zLgBUVHfP6l_%+JwBBV+$cOUg8%54GGgEaq#oHRVIre(cO)1CAQ503WTJ=kNR|GPs6 zx-r$gK)HuVtXKqz3ePsm;atvr-}oluBtgQFo8jr{3{eh_2bV)_{tMCs$D8AI^E3Q1 zikrDkdLuH51)9b!=NwJp)^kGWUUZs{({zY)r06$#j>9BOK3b=8Yain+R4MHYv#Cnnrs&O?c)cJB1Cd2daaInK9A-sEU zh8QLg4Puu{CV>*kA}P_RRspUATIfadRnOx=hS9u>s2Fh(wl>&>u1Qu? zBoS?_C$rLt2RqkLPAioG8_{m3iJ7Uo zvf4|gUNIV2Z93i5>&5Zud9?2A&;=Wtgo>>nlr`DJ-Lb$RxU<$(?sAlogOZtYiHFzw zUH>p_#c!C*DEN(>oK?j}0|%m*k>Qp&`C=NjB|u)Q@}YM)mGOiEhcO1GnF?KY5S|APYI7YlwBH ztsAgZu;ls}+NDCUUBm4u(BQm=-wn;a(5z0!+jUqFtOcMu?>kRvXAbYDH0MOcmTfeJ z9lC|)LVXg#QHeu^ckj=+hDOK^!d3rReTDSU;{-mN&5=;`A28bSPzfU42Krp}&*To$ z)6vn<+0oP4+0)(5)YseFx2?Cg zcN;!>w>eq*{TQhJiu89t1^6%*A)$UQ+|O120wXt6eT>@&Ubb@d0*CPm6E4)!+ScCD z+11T83t_$rd%`}#wQ%83OQ^NIt)n&ElLBFXxaFEHiPniv30ot#-kxmRcK3ZhnB2K* z``npAYS29OWVU_x>G|_#UlpyPEAIc{7q6ZAN?w|N^Z|SL%BPM!FTeJqJAVE9$_uX_ z*mKXfzx2pgAA9=6H@@@Z$DcWO;dpWB%U^r&C%^f_-`*TKc%rm?=hq+l>2IHX>8*Ye z3W2vR)Tj2g)*$Wta<8mc7D5P4Zga&4IOB| zcIeTkz=;R0l%|gj+w$|wg^PQzr{+TSPoyVI%j_rn$c4evGrO`u*OpZVTfr#|!W7k;s2zWSWg`>vsIpMWRyKv?pU2?*voDL|m-A>=Or zZNqI*$^eaR@1VhxB#Fa~aoO$D5g-Yd%;m@pKy;9HZi_oBL6O{5bWx6l7q|~I`WEgw zR|kSWm!MO?M?uHrl9a}Aa`&AI4gHw+yKp~Ey57Ex5Lj8b@8%;m8g~^FI93IY$Vg{W zao#)b0<1viyO(pyhPjg58)9Yf_l9dU)r7Fjgmj)|>OOJUHCO1bIuLq)9Zrs^D~n@r$l$M74kucni9Taz!hy zxN@3a)E4#nv}zeeH@%746IHbDtb>3+p0!ZMG7iD*lu@y~<^Le?YRiWXJZc9IH$hFf zJ5^y-HuFkZ#xIVE=MHRb{oS|rP@BaS6FWENz1YQrfG4oZh4(3{bQiUH7e)Ur^vppY zo#kMqMK9mz_u+~kP8(2VKEaE+u?pEK0!}OJf@B|=gJCJcfW(zp307h_NE2|2FhmWq zO7-0qu@(e_rfV%i*OVJ*5yzkRy+x)j-69a_HugJP-PjLWJ@DXzjzJq~JNx!~|B>@A zTp;Jkxffm{=Qh|M{y#mT!4KoltYFjVjP!w=wFm-O)6yu4I!WYqX;|>ZV8H=J{%qoB z^gG$?mTJeQHGJZcQD#m(t$esGVN`=OphxUF+K4?71~xF$~?bJ?l=bz?V+T72u@2#nT2q nE|y`l>->~rVI?u!#-a&~pbbUj%aH%QN0PH|*T<6oH9P+SF&A7{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7128bc62bfd215e5b5ca68960506c6464443cd95 GIT binary patch literal 30455 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 P$kVt(K+b>MEuH@Z{k4Iu literal 0 HcmV?d00001 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); }