initial project folder
This commit is contained in:
parent
e6d2f9b9ca
commit
837543ed9a
8
Jump Game/Assets/Scenes.meta
Normal file
8
Jump Game/Assets/Scenes.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bfe993b3aa787a34e9fbe0a1c0b39feb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
188
Jump Game/Assets/Scenes/SampleScene.unity
Normal file
188
Jump Game/Assets/Scenes/SampleScene.unity
Normal file
@ -0,0 +1,188 @@
|
||||
%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: 9
|
||||
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.212, g: 0.227, b: 0.259, 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: 1
|
||||
m_AmbientMode: 3
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 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}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 11
|
||||
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: 10
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 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: 2
|
||||
m_BakeBackend: 0
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 500
|
||||
m_PVRBounces: 2
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ShowResolutionOverlay: 1
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_UseShadowmask: 1
|
||||
--- !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
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &519420028
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 519420032}
|
||||
- component: {fileID: 519420031}
|
||||
- component: {fileID: 519420029}
|
||||
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 &519420029
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 519420028}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &519420031
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 519420028}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 2
|
||||
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: 60
|
||||
orthographic: 1
|
||||
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: 0
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 0
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 0
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &519420032
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 519420028}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: -10}
|
||||
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}
|
7
Jump Game/Assets/Scenes/SampleScene.unity.meta
Normal file
7
Jump Game/Assets/Scenes/SampleScene.unity.meta
Normal file
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2cda990e2423bbf4892e6590ba056729
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
Jump Game/Library/APIUpdater/project-dependencies.graph
Normal file
BIN
Jump Game/Library/APIUpdater/project-dependencies.graph
Normal file
Binary file not shown.
BIN
Jump Game/Library/AnnotationManager
Normal file
BIN
Jump Game/Library/AnnotationManager
Normal file
Binary file not shown.
1
Jump Game/Library/AssetImportState
Normal file
1
Jump Game/Library/AssetImportState
Normal file
@ -0,0 +1 @@
|
||||
5;0;4;0;0
|
0
Jump Game/Library/BuildPlayer.prefs
Normal file
0
Jump Game/Library/BuildPlayer.prefs
Normal file
BIN
Jump Game/Library/BuildSettings.asset
Normal file
BIN
Jump Game/Library/BuildSettings.asset
Normal file
Binary file not shown.
736
Jump Game/Library/CurrentLayout-default.dwlt
Normal file
736
Jump Game/Library/CurrentLayout-default.dwlt
Normal file
@ -0,0 +1,736 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &1
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_PixelRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 43.2
|
||||
width: 1536
|
||||
height: 780.8
|
||||
m_ShowMode: 4
|
||||
m_Title:
|
||||
m_RootView: {fileID: 6}
|
||||
m_MinSize: {x: 950, y: 300}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
--- !u!114 &2
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 9}
|
||||
- {fileID: 3}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 30
|
||||
width: 1536
|
||||
height: 731
|
||||
m_MinSize: {x: 683, y: 494}
|
||||
m_MaxSize: {x: 14004, y: 14044}
|
||||
vertical: 0
|
||||
controlID: 33
|
||||
--- !u!114 &3
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 1225
|
||||
y: 0
|
||||
width: 311
|
||||
height: 731
|
||||
m_MinSize: {x: 277, y: 72}
|
||||
m_MaxSize: {x: 4002, y: 4022}
|
||||
m_ActualView: {fileID: 14}
|
||||
m_Panes:
|
||||
- {fileID: 14}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &4
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 303
|
||||
height: 442
|
||||
m_MinSize: {x: 202, y: 222}
|
||||
m_MaxSize: {x: 4002, y: 4022}
|
||||
m_ActualView: {fileID: 15}
|
||||
m_Panes:
|
||||
- {fileID: 15}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &5
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 442
|
||||
width: 1225
|
||||
height: 289
|
||||
m_MinSize: {x: 232, y: 272}
|
||||
m_MaxSize: {x: 10002, y: 10022}
|
||||
m_ActualView: {fileID: 13}
|
||||
m_Panes:
|
||||
- {fileID: 13}
|
||||
- {fileID: 18}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &6
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 7}
|
||||
- {fileID: 2}
|
||||
- {fileID: 8}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1536
|
||||
height: 781
|
||||
m_MinSize: {x: 950, y: 300}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
--- !u!114 &7
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1536
|
||||
height: 30
|
||||
m_MinSize: {x: 0, y: 0}
|
||||
m_MaxSize: {x: 0, y: 0}
|
||||
m_LastLoadedLayoutName:
|
||||
--- !u!114 &8
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 761
|
||||
width: 1536
|
||||
height: 20
|
||||
m_MinSize: {x: 0, y: 0}
|
||||
m_MaxSize: {x: 0, y: 0}
|
||||
--- !u!114 &9
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 10}
|
||||
- {fileID: 5}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1225
|
||||
height: 731
|
||||
m_MinSize: {x: 406, y: 494}
|
||||
m_MaxSize: {x: 10002, y: 14044}
|
||||
vertical: 1
|
||||
controlID: 34
|
||||
--- !u!114 &10
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 4}
|
||||
- {fileID: 11}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1225
|
||||
height: 442
|
||||
m_MinSize: {x: 406, y: 222}
|
||||
m_MaxSize: {x: 8006, y: 4022}
|
||||
vertical: 0
|
||||
controlID: 35
|
||||
--- !u!114 &11
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 303
|
||||
y: 0
|
||||
width: 922
|
||||
height: 442
|
||||
m_MinSize: {x: 204, y: 222}
|
||||
m_MaxSize: {x: 4004, y: 4022}
|
||||
m_ActualView: {fileID: 16}
|
||||
m_Panes:
|
||||
- {fileID: 16}
|
||||
- {fileID: 17}
|
||||
- {fileID: 12}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 1
|
||||
--- !u!114 &12
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 400, y: 100}
|
||||
m_MaxSize: {x: 2048, y: 2048}
|
||||
m_TitleContent:
|
||||
m_Text: Asset Store
|
||||
m_Image: {fileID: 357073275683767465, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 468
|
||||
y: 181
|
||||
width: 973
|
||||
height: 501
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
--- !u!114 &13
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 230, y: 250}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
m_TitleContent:
|
||||
m_Text: Project
|
||||
m_Image: {fileID: -7501376956915960154, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 515.2
|
||||
width: 1225
|
||||
height: 270
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_SearchFilter:
|
||||
m_NameFilter:
|
||||
m_ClassNames: []
|
||||
m_AssetLabels: []
|
||||
m_AssetBundleNames: []
|
||||
m_VersionControlStates: []
|
||||
m_SoftLockControlStates: []
|
||||
m_ReferencingInstanceIDs:
|
||||
m_SceneHandles:
|
||||
m_ShowAllHits: 0
|
||||
m_SkipHidden: 0
|
||||
m_SearchArea: 1
|
||||
m_Folders:
|
||||
- Assets
|
||||
m_ViewMode: 1
|
||||
m_StartGridSize: 64
|
||||
m_LastFolders:
|
||||
- Assets
|
||||
m_LastFoldersGridSize: -1
|
||||
m_LastProjectPath: C:\Users\Tomi\Documents\SAMK\Let's make a game!\Let's make a
|
||||
game-kurssi\Let's make a game!\Jump Game
|
||||
m_LockTracker:
|
||||
m_IsLocked: 0
|
||||
m_FolderTreeState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: c42d0000
|
||||
m_LastClickedID: 11716
|
||||
m_ExpandedIDs: 00000000c42d000000ca9a3b
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_AssetTreeState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs:
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs:
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_ListAreaState:
|
||||
m_SelectedInstanceIDs:
|
||||
m_LastClickedInstanceID: 0
|
||||
m_HadKeyboardFocusLastEvent: 0
|
||||
m_ExpandedInstanceIDs: c6230000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_NewAssetIndexInList: -1
|
||||
m_ScrollPosition: {x: 0, y: 0}
|
||||
m_GridSize: 64
|
||||
m_SkipHiddenPackages: 0
|
||||
m_DirectoriesAreaWidth: 115
|
||||
--- !u!114 &14
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 275, y: 50}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Inspector
|
||||
m_Image: {fileID: -6905738622615590433, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 1224.8
|
||||
y: 73.6
|
||||
width: 309
|
||||
height: 712
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OpenAddComponentMenu: 0
|
||||
m_ObjectsLockedBeforeSerialization: []
|
||||
m_InstanceIDsLockedBeforeSerialization:
|
||||
m_LockTracker:
|
||||
m_IsLocked: 0
|
||||
m_PreviewResizer:
|
||||
m_CachedPref: 160
|
||||
m_ControlHash: -371814159
|
||||
m_PrefName: Preview_InspectorPreview
|
||||
m_PreviewWindow: {fileID: 0}
|
||||
m_LastInspectedObjectInstanceID: -1
|
||||
m_LastVerticalScrollValue: 0
|
||||
--- !u!114 &15
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Hierarchy
|
||||
m_Image: {fileID: -590624980919486359, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 73.6
|
||||
width: 303
|
||||
height: 423
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_SceneHierarchy:
|
||||
m_TreeViewState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs:
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs: 6cfbffff
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 0
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_ExpandedScenes: []
|
||||
m_CurrenRootInstanceID: 0
|
||||
m_LockTracker:
|
||||
m_IsLocked: 0
|
||||
m_CurrentSortingName: TransformSorting
|
||||
m_WindowGUID: 1ddb1fc7138cdaa429a5585c1cbd56db
|
||||
--- !u!114 &16
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Scene
|
||||
m_Image: {fileID: 2318424515335265636, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 303.2
|
||||
y: 73.6
|
||||
width: 920
|
||||
height: 423
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_ShowContextualTools: 0
|
||||
m_WindowGUID: ffb7c86cfaff9354fbe1bf5fb7e71be5
|
||||
m_Gizmos: 1
|
||||
m_SceneIsLit: 1
|
||||
m_SceneLighting: 1
|
||||
m_2DMode: 1
|
||||
m_isRotationLocked: 0
|
||||
m_PlayAudio: 0
|
||||
m_AudioPlay: 0
|
||||
m_Position:
|
||||
m_Target: {x: 0, y: 0, z: 0}
|
||||
speed: 2
|
||||
m_Value: {x: 0, y: 0, z: 0}
|
||||
m_RenderMode: 0
|
||||
m_CameraMode:
|
||||
drawMode: 0
|
||||
name: Shaded
|
||||
section: Shading Mode
|
||||
m_ValidateTrueMetals: 0
|
||||
m_DoValidateTrueMetals: 0
|
||||
m_SceneViewState:
|
||||
showFog: 1
|
||||
showMaterialUpdate: 0
|
||||
showSkybox: 1
|
||||
showFlares: 1
|
||||
showImageEffects: 1
|
||||
showParticleSystems: 1
|
||||
grid:
|
||||
xGrid:
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
yGrid:
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
zGrid:
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
m_Value: 1
|
||||
m_Rotation:
|
||||
m_Target: {x: 0, y: 0, z: 0, w: 1}
|
||||
speed: 2
|
||||
m_Value: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_Size:
|
||||
m_Target: 10
|
||||
speed: 2
|
||||
m_Value: 10
|
||||
m_Ortho:
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
m_Value: 1
|
||||
m_CameraSettings:
|
||||
m_Speed: 1
|
||||
m_SpeedNormalized: 0.5
|
||||
m_SpeedMin: 0.01
|
||||
m_SpeedMax: 2
|
||||
m_EasingEnabled: 1
|
||||
m_EasingDuration: 0.4
|
||||
m_AccelerationEnabled: 1
|
||||
m_FieldOfView: 90
|
||||
m_NearClip: 0.03
|
||||
m_FarClip: 10000
|
||||
m_DynamicClip: 1
|
||||
m_OcclusionCulling: 0
|
||||
m_ShowGlobalGrid: 1
|
||||
m_LastSceneViewRotation: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}
|
||||
m_LastSceneViewOrtho: 0
|
||||
m_ReplacementShader: {fileID: 0}
|
||||
m_ReplacementString:
|
||||
m_SceneVisActive: 1
|
||||
m_LastLockedObject: {fileID: 0}
|
||||
m_ViewIsLockedToObject: 0
|
||||
--- !u!114 &17
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Game
|
||||
m_Image: {fileID: -2087823869225018852, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 303.2
|
||||
y: 73.6
|
||||
width: 920
|
||||
height: 423
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_VSyncEnabled: 0
|
||||
m_MaximizeOnPlay: 0
|
||||
m_Gizmos: 0
|
||||
m_Stats: 0
|
||||
m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_TargetDisplay: 0
|
||||
m_ZoomArea:
|
||||
m_HRangeLocked: 0
|
||||
m_VRangeLocked: 0
|
||||
hZoomLockedByDefault: 0
|
||||
vZoomLockedByDefault: 0
|
||||
m_HBaseRangeMin: -368
|
||||
m_HBaseRangeMax: 368
|
||||
m_VBaseRangeMin: -162.40001
|
||||
m_VBaseRangeMax: 162.40001
|
||||
m_HAllowExceedBaseRangeMin: 1
|
||||
m_HAllowExceedBaseRangeMax: 1
|
||||
m_VAllowExceedBaseRangeMin: 1
|
||||
m_VAllowExceedBaseRangeMax: 1
|
||||
m_ScaleWithWindow: 0
|
||||
m_HSlider: 0
|
||||
m_VSlider: 0
|
||||
m_IgnoreScrollWheelUntilClicked: 0
|
||||
m_EnableMouseInput: 0
|
||||
m_EnableSliderZoomHorizontal: 0
|
||||
m_EnableSliderZoomVertical: 0
|
||||
m_UniformScale: 1
|
||||
m_UpDirection: 1
|
||||
m_DrawArea:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 17
|
||||
width: 920
|
||||
height: 406
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Translation: {x: 460, y: 203}
|
||||
m_MarginLeft: 0
|
||||
m_MarginRight: 0
|
||||
m_MarginTop: 0
|
||||
m_MarginBottom: 0
|
||||
m_LastShownAreaInsideMargins:
|
||||
serializedVersion: 2
|
||||
x: -460
|
||||
y: -203
|
||||
width: 920
|
||||
height: 406
|
||||
m_MinimalGUI: 1
|
||||
m_defaultScale: 1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_CurrentColorSpace: 0
|
||||
m_LastWindowPixelSize: {x: 1150, y: 528.75}
|
||||
m_ClearInEditMode: 1
|
||||
m_NoCameraWarning: 1
|
||||
m_LowResolutionForAspectRatios: 01000000000000000000
|
||||
m_XRRenderMode: 0
|
||||
--- !u!114 &18
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_MinSize: {x: 100, y: 100}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Console
|
||||
m_Image: {fileID: 111653112392082826, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 8
|
||||
y: 718
|
||||
width: 1366
|
||||
height: 308
|
||||
m_ViewDataDictionary: {fileID: 0}
|
1
Jump Game/Library/EditorOnlyScriptingUserSettings.json
Normal file
1
Jump Game/Library/EditorOnlyScriptingUserSettings.json
Normal file
@ -0,0 +1 @@
|
||||
{"m_ScriptingRuntimeVersion":1,"m_DefineSymbols":[],"m_AllowUnsafeCode":false}
|
BIN
Jump Game/Library/EditorUserBuildSettings.asset
Normal file
BIN
Jump Game/Library/EditorUserBuildSettings.asset
Normal file
Binary file not shown.
21
Jump Game/Library/EditorUserSettings.asset
Normal file
21
Jump Game/Library/EditorUserSettings.asset
Normal file
@ -0,0 +1,21 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!162 &1
|
||||
EditorUserSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 4
|
||||
m_ConfigSettings:
|
||||
vcSharedLogLevel:
|
||||
value: 0d5e400f0650
|
||||
flags: 0
|
||||
m_VCAutomaticAdd: 1
|
||||
m_VCDebugCom: 0
|
||||
m_VCDebugCmd: 0
|
||||
m_VCDebugOut: 0
|
||||
m_SemanticMergeMode: 2
|
||||
m_VCShowFailedCheckout: 1
|
||||
m_VCOverwriteFailedCheckoutAssets: 1
|
||||
m_VCAllowAsyncUpdate: 0
|
||||
m_AssetPipelineMode: 0
|
||||
m_CacheServerMode: 0
|
||||
m_CacheServers: []
|
BIN
Jump Game/Library/InspectorExpandedItems.asset
Normal file
BIN
Jump Game/Library/InspectorExpandedItems.asset
Normal file
Binary file not shown.
5
Jump Game/Library/LastSceneManagerSetup.txt
Normal file
5
Jump Game/Library/LastSceneManagerSetup.txt
Normal file
@ -0,0 +1,5 @@
|
||||
sceneSetups:
|
||||
- path: Assets/Scenes/SampleScene.unity
|
||||
isLoaded: 1
|
||||
isActive: 1
|
||||
isSubScene: 0
|
2
Jump Game/Library/LibraryFormatVersion.txt
Normal file
2
Jump Game/Library/LibraryFormatVersion.txt
Normal file
@ -0,0 +1,2 @@
|
||||
unityRebuildLibraryVersion: 11
|
||||
unityForwardCompatibleVersion: 40
|
BIN
Jump Game/Library/MonoManager.asset
Normal file
BIN
Jump Game/Library/MonoManager.asset
Normal file
Binary file not shown.
@ -0,0 +1,6 @@
|
||||
|
||||
automation/**
|
||||
utr_output/**
|
||||
.Editor/**
|
||||
.yamato/**
|
||||
*.zip*
|
@ -0,0 +1,31 @@
|
||||
# Changelog
|
||||
All notable changes to this package will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.2.16] - 2019-02-11
|
||||
Update stylesheet to pass USS validation
|
||||
|
||||
## [1.2.15] - 2018-11-16
|
||||
Added support for non-experimental UIElements.
|
||||
|
||||
## [1.2.11] - 2018-09-04
|
||||
Made some performance improvements to reduce impact on ReloadAssemblies.
|
||||
|
||||
## [1.2.9] - 2018-08-13
|
||||
Test issues for the Collab History Window are now fixed.
|
||||
|
||||
## [1.2.7] - 2018-08-07
|
||||
Toolbar drop-down will no longer show up when package is uninstalled.
|
||||
|
||||
## [1.2.6] - 2018-06-15
|
||||
Fixed an issue where Collab's History window wouldn't load properly.
|
||||
|
||||
## [1.2.5] - 2018-05-21
|
||||
This is the first release of *Unity Package CollabProxy*.
|
||||
|
||||
### Added
|
||||
- Collab history and toolbar windows
|
||||
- Collab view and presenter classes
|
||||
- Collab Editor tests for view and presenter
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 782c49e6e68074dc7ba12c95537825ce
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Unity.CollabProxy.Dependencies</id>
|
||||
<version>1.1.0-experimental</version>
|
||||
<authors>Rohit Garg</authors>
|
||||
<description>Dependencies for the CollabProxy package</description>
|
||||
</metadata>
|
||||
</package>
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 470530e667ad4475786b28fa3187ce95
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,5 @@
|
||||
# About Unity Collaborate
|
||||
|
||||
Collaborate is a simple way for teams to save, share, and sync their Unity project.
|
||||
|
||||
Please refer to the online documentation [here.](https://docs.unity3d.com/Manual/UnityCollaborate.html)
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d31e5d760880a4e52a3a75322481d0d2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,4 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using UnityEngine;
|
||||
|
||||
[assembly: InternalsVisibleTo("Unity.CollabProxy.EditorTests")]
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4ef26aa386b44923b61c9c4b505a67c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c18cb9388313e4287ad5895ee735c47d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,24 @@
|
||||
using UnityEditor;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CollabProxy.UI
|
||||
{
|
||||
[InitializeOnLoad]
|
||||
public class Bootstrap
|
||||
{
|
||||
private const float kCollabToolbarButtonWidth = 78.0f;
|
||||
|
||||
static Bootstrap()
|
||||
{
|
||||
Collab.ShowHistoryWindow = CollabHistoryWindow.ShowHistoryWindow;
|
||||
Collab.ShowToolbarAtPosition = CollabToolbarWindow.ShowCenteredAtPosition;
|
||||
Collab.IsToolbarVisible = CollabToolbarWindow.IsVisible;
|
||||
Collab.CloseToolbar = CollabToolbarWindow.CloseToolbar;
|
||||
Toolbar.AddSubToolbar(new CollabToolbarButton
|
||||
{
|
||||
Width = kCollabToolbarButtonWidth
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8aa8171e088f94069bbd1978a053f7dd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,21 @@
|
||||
using System;
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal static class CollabAnalytics
|
||||
{
|
||||
[Serializable]
|
||||
private struct CollabUserActionAnalyticsEvent
|
||||
{
|
||||
public string category;
|
||||
public string action;
|
||||
}
|
||||
|
||||
public static void SendUserAction(string category, string action)
|
||||
{
|
||||
EditorAnalytics.SendCollabUserAction(new CollabUserActionAnalyticsEvent() { category = category, action = action });
|
||||
}
|
||||
|
||||
public static readonly string historyCategoryString = "History";
|
||||
};
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f944311c8fff2479fa3ba741f6039fc8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,330 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor.Collaboration;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEditor.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||||
#endif
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEditor.Connect;
|
||||
|
||||
namespace UnityEditor
|
||||
{
|
||||
internal class CollabHistoryWindow : EditorWindow, ICollabHistoryWindow
|
||||
{
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
private const string ResourcesPath = "Packages/com.unity.collab-proxy/Editor/Resources/Styles/";
|
||||
#else
|
||||
private const string ResourcesPath = "StyleSheets/";
|
||||
#endif
|
||||
|
||||
|
||||
const string kWindowTitle = "Collab History";
|
||||
const string kServiceUrl = "developer.cloud.unity3d.com";
|
||||
|
||||
[MenuItem("Window/Asset Management/Collab History", false, 1)]
|
||||
public static void ShowHistoryWindow()
|
||||
{
|
||||
EditorWindow.GetWindow<CollabHistoryWindow>(kWindowTitle);
|
||||
}
|
||||
|
||||
[MenuItem("Window/Asset Management/Collab History", true)]
|
||||
public static bool ValidateShowHistoryWindow()
|
||||
{
|
||||
return Collab.instance.IsCollabEnabledForCurrentProject();
|
||||
}
|
||||
|
||||
CollabHistoryPresenter m_Presenter;
|
||||
Dictionary<HistoryState, VisualElement> m_Views;
|
||||
List<CollabHistoryItem> m_HistoryItems = new List<CollabHistoryItem>();
|
||||
HistoryState m_State;
|
||||
VisualElement m_Container;
|
||||
PagedListView m_Pager;
|
||||
ScrollView m_HistoryView;
|
||||
int m_ItemsPerPage = 5;
|
||||
string m_InProgressRev;
|
||||
bool m_RevisionActionsEnabled;
|
||||
|
||||
public CollabHistoryWindow()
|
||||
{
|
||||
minSize = new Vector2(275, 50);
|
||||
}
|
||||
|
||||
public void OnEnable()
|
||||
{
|
||||
SetupGUI();
|
||||
name = "CollabHistory";
|
||||
|
||||
if (m_Presenter == null)
|
||||
{
|
||||
m_Presenter = new CollabHistoryPresenter(this, new CollabHistoryItemFactory(), new RevisionsService(Collab.instance, UnityConnect.instance));
|
||||
}
|
||||
m_Presenter.OnWindowEnabled();
|
||||
}
|
||||
|
||||
public void OnDisable()
|
||||
{
|
||||
m_Presenter.OnWindowDisabled();
|
||||
}
|
||||
|
||||
public bool revisionActionsEnabled
|
||||
{
|
||||
get { return m_RevisionActionsEnabled; }
|
||||
set
|
||||
{
|
||||
if (m_RevisionActionsEnabled == value)
|
||||
return;
|
||||
|
||||
m_RevisionActionsEnabled = value;
|
||||
foreach (var historyItem in m_HistoryItems)
|
||||
{
|
||||
historyItem.RevisionActionsEnabled = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void AddStyleSheetPath(VisualElement root, string path)
|
||||
{
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
root.styleSheets.Add(EditorGUIUtility.Load(path) as StyleSheet);
|
||||
#else
|
||||
root.AddStyleSheetPath(path);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
public void SetupGUI()
|
||||
{
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
var root = this.rootVisualElement;
|
||||
#else
|
||||
var root = this.GetRootVisualContainer();
|
||||
#endif
|
||||
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryCommon.uss");
|
||||
if (EditorGUIUtility.isProSkin)
|
||||
{
|
||||
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryDark.uss");
|
||||
}
|
||||
else
|
||||
{
|
||||
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryLight.uss");
|
||||
}
|
||||
|
||||
m_Container = new VisualElement();
|
||||
m_Container.StretchToParentSize();
|
||||
root.Add(m_Container);
|
||||
|
||||
m_Pager = new PagedListView()
|
||||
{
|
||||
name = "PagedElement",
|
||||
pageSize = m_ItemsPerPage
|
||||
};
|
||||
|
||||
var errorView = new StatusView()
|
||||
{
|
||||
message = "An Error Occurred",
|
||||
icon = EditorGUIUtility.LoadIconRequired("Collab.Warning") as Texture,
|
||||
};
|
||||
|
||||
var noInternetView = new StatusView()
|
||||
{
|
||||
message = "No Internet Connection",
|
||||
icon = EditorGUIUtility.LoadIconRequired("Collab.NoInternet") as Texture,
|
||||
};
|
||||
|
||||
var maintenanceView = new StatusView()
|
||||
{
|
||||
message = "Maintenance",
|
||||
};
|
||||
|
||||
var loginView = new StatusView()
|
||||
{
|
||||
message = "Sign in to access Collaborate",
|
||||
buttonText = "Sign in...",
|
||||
callback = SignInClick,
|
||||
};
|
||||
|
||||
var noSeatView = new StatusView()
|
||||
{
|
||||
message = "Ask your project owner for access to Unity Teams",
|
||||
buttonText = "Learn More",
|
||||
callback = NoSeatClick,
|
||||
};
|
||||
|
||||
var waitingView = new StatusView()
|
||||
{
|
||||
message = "Updating...",
|
||||
};
|
||||
|
||||
m_HistoryView = new ScrollView() { name = "HistoryContainer", showHorizontal = false};
|
||||
m_HistoryView.contentContainer.StretchToParentWidth();
|
||||
m_HistoryView.Add(m_Pager);
|
||||
|
||||
m_Views = new Dictionary<HistoryState, VisualElement>()
|
||||
{
|
||||
{HistoryState.Error, errorView},
|
||||
{HistoryState.Offline, noInternetView},
|
||||
{HistoryState.Maintenance, maintenanceView},
|
||||
{HistoryState.LoggedOut, loginView},
|
||||
{HistoryState.NoSeat, noSeatView},
|
||||
{HistoryState.Waiting, waitingView},
|
||||
{HistoryState.Ready, m_HistoryView}
|
||||
};
|
||||
}
|
||||
|
||||
public void UpdateState(HistoryState state, bool force)
|
||||
{
|
||||
if (state == m_State && !force)
|
||||
return;
|
||||
|
||||
m_State = state;
|
||||
switch (state)
|
||||
{
|
||||
case HistoryState.Ready:
|
||||
UpdateHistoryView(m_Pager);
|
||||
break;
|
||||
case HistoryState.Disabled:
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
|
||||
m_Container.Clear();
|
||||
m_Container.Add(m_Views[m_State]);
|
||||
}
|
||||
|
||||
public void UpdateRevisions(IEnumerable<RevisionData> datas, string tip, int totalRevisions, int currentPage)
|
||||
{
|
||||
var elements = new List<VisualElement>();
|
||||
var isFullDateObtained = false; // Has everything from this date been obtained?
|
||||
m_HistoryItems.Clear();
|
||||
|
||||
if (datas != null)
|
||||
{
|
||||
DateTime currentDate = DateTime.MinValue;
|
||||
foreach (var data in datas)
|
||||
{
|
||||
if (data.timeStamp.Date != currentDate.Date)
|
||||
{
|
||||
elements.Add(new CollabHistoryRevisionLine(data.timeStamp, isFullDateObtained));
|
||||
currentDate = data.timeStamp;
|
||||
}
|
||||
|
||||
var item = new CollabHistoryItem(data);
|
||||
m_HistoryItems.Add(item);
|
||||
|
||||
var container = new VisualElement();
|
||||
container.style.flexDirection = FlexDirection.Row;
|
||||
if (data.current)
|
||||
{
|
||||
isFullDateObtained = true;
|
||||
container.AddToClassList("currentRevision");
|
||||
container.AddToClassList("obtainedRevision");
|
||||
}
|
||||
else if (data.obtained)
|
||||
{
|
||||
container.AddToClassList("obtainedRevision");
|
||||
}
|
||||
else
|
||||
{
|
||||
container.AddToClassList("absentRevision");
|
||||
}
|
||||
// If we use the index as-is, the latest commit will become #1, but we want it to be last
|
||||
container.Add(new CollabHistoryRevisionLine(data.index));
|
||||
container.Add(item);
|
||||
elements.Add(container);
|
||||
}
|
||||
}
|
||||
|
||||
m_HistoryView.scrollOffset = new Vector2(0, 0);
|
||||
m_Pager.totalItems = totalRevisions;
|
||||
m_Pager.curPage = currentPage;
|
||||
m_Pager.items = elements;
|
||||
}
|
||||
|
||||
public string inProgressRevision
|
||||
{
|
||||
get { return m_InProgressRev; }
|
||||
set
|
||||
{
|
||||
m_InProgressRev = value;
|
||||
foreach (var historyItem in m_HistoryItems)
|
||||
{
|
||||
historyItem.SetInProgressStatus(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int itemsPerPage
|
||||
{
|
||||
set
|
||||
{
|
||||
if (m_ItemsPerPage == value)
|
||||
return;
|
||||
m_Pager.pageSize = m_ItemsPerPage;
|
||||
}
|
||||
}
|
||||
|
||||
public PageChangeAction OnPageChangeAction
|
||||
{
|
||||
set { m_Pager.OnPageChanged = value; }
|
||||
}
|
||||
|
||||
public RevisionAction OnGoBackAction
|
||||
{
|
||||
set { CollabHistoryItem.s_OnGoBack = value; }
|
||||
}
|
||||
|
||||
public RevisionAction OnUpdateAction
|
||||
{
|
||||
set { CollabHistoryItem.s_OnUpdate = value; }
|
||||
}
|
||||
|
||||
public RevisionAction OnRestoreAction
|
||||
{
|
||||
set { CollabHistoryItem.s_OnRestore = value; }
|
||||
}
|
||||
|
||||
public ShowBuildAction OnShowBuildAction
|
||||
{
|
||||
set { CollabHistoryItem.s_OnShowBuild = value; }
|
||||
}
|
||||
|
||||
public Action OnShowServicesAction
|
||||
{
|
||||
set { CollabHistoryItem.s_OnShowServices = value; }
|
||||
}
|
||||
|
||||
void UpdateHistoryView(VisualElement history)
|
||||
{
|
||||
}
|
||||
|
||||
void NoSeatClick()
|
||||
{
|
||||
var connection = UnityConnect.instance;
|
||||
var env = connection.GetEnvironment();
|
||||
// Map environment to url - prod is special
|
||||
if (env == "production")
|
||||
env = "";
|
||||
else
|
||||
env += "-";
|
||||
|
||||
var url = "https://" + env + kServiceUrl
|
||||
+ "/orgs/" + connection.GetOrganizationId()
|
||||
+ "/projects/" + connection.GetProjectName()
|
||||
+ "/unity-teams/";
|
||||
Application.OpenURL(url);
|
||||
}
|
||||
|
||||
void SignInClick()
|
||||
{
|
||||
UnityConnect.instance.ShowLogin();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fed9dda667cab45d398d06402bba03f4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,297 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEditor.Connect;
|
||||
using UnityEditor.Web;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UnityEditor
|
||||
{
|
||||
internal class CollabToolbarButton : SubToolbar, IDisposable
|
||||
{
|
||||
// Must match s_CollabIcon array
|
||||
enum CollabToolbarState
|
||||
{
|
||||
NeedToEnableCollab,
|
||||
UpToDate,
|
||||
Conflict,
|
||||
OperationError,
|
||||
ServerHasChanges,
|
||||
FilesToPush,
|
||||
InProgress,
|
||||
Disabled,
|
||||
Offline
|
||||
}
|
||||
|
||||
private class CollabToolbarContent
|
||||
{
|
||||
readonly string m_iconName;
|
||||
readonly string m_toolTip;
|
||||
readonly CollabToolbarState m_state;
|
||||
|
||||
static Dictionary<CollabToolbarContent, GUIContent> m_CollabIcons;
|
||||
|
||||
public CollabToolbarState RegisteredForState
|
||||
{
|
||||
get { return m_state; }
|
||||
}
|
||||
|
||||
public GUIContent GuiContent
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_CollabIcons == null)
|
||||
{
|
||||
m_CollabIcons = new Dictionary<CollabToolbarContent, GUIContent>();
|
||||
}
|
||||
|
||||
if (!m_CollabIcons.ContainsKey(this))
|
||||
{
|
||||
m_CollabIcons.Add(this, EditorGUIUtility.TrTextContentWithIcon("Collab", m_toolTip, m_iconName));
|
||||
}
|
||||
|
||||
return m_CollabIcons[this];
|
||||
}
|
||||
}
|
||||
|
||||
public CollabToolbarContent(CollabToolbarState state, string iconName, string toolTip)
|
||||
{
|
||||
m_state = state;
|
||||
m_iconName = iconName;
|
||||
m_toolTip = toolTip;
|
||||
}
|
||||
}
|
||||
|
||||
CollabToolbarContent[] m_toolbarContents;
|
||||
CollabToolbarState m_CollabToolbarState = CollabToolbarState.UpToDate;
|
||||
const float kCollabButtonWidth = 78.0f;
|
||||
ButtonWithAnimatedIconRotation m_CollabButton;
|
||||
string m_DynamicTooltip;
|
||||
static bool m_ShowCollabTooltip = false;
|
||||
|
||||
private GUIContent currentCollabContent
|
||||
{
|
||||
get
|
||||
{
|
||||
CollabToolbarContent toolbarContent =
|
||||
m_toolbarContents.FirstOrDefault(c => c.RegisteredForState.Equals(m_CollabToolbarState));
|
||||
GUIContent content = new GUIContent(toolbarContent == null? m_toolbarContents.First().GuiContent : toolbarContent.GuiContent);
|
||||
if (!m_ShowCollabTooltip)
|
||||
{
|
||||
content.tooltip = null;
|
||||
}
|
||||
else if (m_DynamicTooltip != "")
|
||||
{
|
||||
content.tooltip = m_DynamicTooltip;
|
||||
}
|
||||
|
||||
if (Collab.instance.AreTestsRunning())
|
||||
{
|
||||
content.text = "CTF";
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
}
|
||||
|
||||
public CollabToolbarButton()
|
||||
{
|
||||
m_toolbarContents = new[]
|
||||
{
|
||||
new CollabToolbarContent(CollabToolbarState.NeedToEnableCollab, "CollabNew", " You need to enable collab."),
|
||||
new CollabToolbarContent(CollabToolbarState.UpToDate, "Collab", " You are up to date."),
|
||||
new CollabToolbarContent(CollabToolbarState.Conflict, "CollabConflict", " Please fix your conflicts prior to publishing."),
|
||||
new CollabToolbarContent(CollabToolbarState.OperationError, "CollabError", " Last operation failed. Please retry later."),
|
||||
new CollabToolbarContent(CollabToolbarState.ServerHasChanges, "CollabPull", " Please update, there are server changes."),
|
||||
new CollabToolbarContent(CollabToolbarState.FilesToPush, "CollabPush", " You have files to publish."),
|
||||
new CollabToolbarContent(CollabToolbarState.InProgress, "CollabProgress", " Operation in progress."),
|
||||
new CollabToolbarContent(CollabToolbarState.Disabled, "CollabNew", " Collab is disabled."),
|
||||
new CollabToolbarContent(CollabToolbarState.Offline, "CollabNew", " Please check your network connection.")
|
||||
};
|
||||
|
||||
Collab.instance.StateChanged += OnCollabStateChanged;
|
||||
UnityConnect.instance.StateChanged += OnUnityConnectStateChanged;
|
||||
UnityConnect.instance.UserStateChanged += OnUnityConnectUserStateChanged;
|
||||
}
|
||||
|
||||
void OnUnityConnectUserStateChanged(UserInfo state)
|
||||
{
|
||||
UpdateCollabToolbarState();
|
||||
}
|
||||
|
||||
void OnUnityConnectStateChanged(ConnectInfo state)
|
||||
{
|
||||
UpdateCollabToolbarState();
|
||||
}
|
||||
|
||||
public override void OnGUI(Rect rect)
|
||||
{
|
||||
DoCollabDropDown(rect);
|
||||
}
|
||||
|
||||
Rect GUIToScreenRect(Rect guiRect)
|
||||
{
|
||||
Vector2 screenPoint = GUIUtility.GUIToScreenPoint(new Vector2(guiRect.x, guiRect.y));
|
||||
guiRect.x = screenPoint.x;
|
||||
guiRect.y = screenPoint.y;
|
||||
return guiRect;
|
||||
}
|
||||
|
||||
void ShowPopup(Rect rect)
|
||||
{
|
||||
// window should be centered on the button
|
||||
ReserveRight(kCollabButtonWidth / 2, ref rect);
|
||||
ReserveBottom(5, ref rect);
|
||||
// calculate screen rect before saving assets since it might open the AssetSaveDialog window
|
||||
var screenRect = GUIToScreenRect(rect);
|
||||
// save all the assets
|
||||
AssetDatabase.SaveAssets();
|
||||
if (Collab.ShowToolbarAtPosition != null && Collab.ShowToolbarAtPosition(screenRect))
|
||||
{
|
||||
GUIUtility.ExitGUI();
|
||||
}
|
||||
}
|
||||
|
||||
void DoCollabDropDown(Rect rect)
|
||||
{
|
||||
UpdateCollabToolbarState();
|
||||
GUIStyle collabButtonStyle = "OffsetDropDown";
|
||||
bool showPopup = Toolbar.requestShowCollabToolbar;
|
||||
Toolbar.requestShowCollabToolbar = false;
|
||||
|
||||
bool enable = !EditorApplication.isPlaying;
|
||||
|
||||
using (new EditorGUI.DisabledScope(!enable))
|
||||
{
|
||||
bool animate = m_CollabToolbarState == CollabToolbarState.InProgress;
|
||||
|
||||
EditorGUIUtility.SetIconSize(new Vector2(12, 12));
|
||||
if (GetCollabButton().OnGUI(rect, currentCollabContent, animate, collabButtonStyle))
|
||||
{
|
||||
showPopup = true;
|
||||
}
|
||||
EditorGUIUtility.SetIconSize(Vector2.zero);
|
||||
}
|
||||
|
||||
if (m_CollabToolbarState == CollabToolbarState.Disabled)
|
||||
return;
|
||||
|
||||
if (showPopup)
|
||||
{
|
||||
ShowPopup(rect);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnCollabStateChanged(CollabInfo info)
|
||||
{
|
||||
UpdateCollabToolbarState();
|
||||
}
|
||||
|
||||
public void UpdateCollabToolbarState()
|
||||
{
|
||||
var currentCollabState = CollabToolbarState.UpToDate;
|
||||
bool networkAvailable = UnityConnect.instance.connectInfo.online && UnityConnect.instance.connectInfo.loggedIn;
|
||||
m_DynamicTooltip = "";
|
||||
|
||||
if (UnityConnect.instance.isDisableCollabWindow)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.Disabled;
|
||||
}
|
||||
else if (networkAvailable)
|
||||
{
|
||||
Collab collab = Collab.instance;
|
||||
CollabInfo currentInfo = collab.collabInfo;
|
||||
UnityErrorInfo errInfo;
|
||||
bool error = false;
|
||||
if (collab.GetError((UnityConnect.UnityErrorFilter.ByContext | UnityConnect.UnityErrorFilter.ByChild), out errInfo))
|
||||
{
|
||||
error = (errInfo.priority <= (int)UnityConnect.UnityErrorPriority.Error);
|
||||
m_DynamicTooltip = errInfo.shortMsg;
|
||||
}
|
||||
|
||||
if (!currentInfo.ready)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.InProgress;
|
||||
}
|
||||
else if (error)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.OperationError;
|
||||
}
|
||||
else if (currentInfo.inProgress)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.InProgress;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool collabEnable = Collab.instance.IsCollabEnabledForCurrentProject();
|
||||
|
||||
if (UnityConnect.instance.projectInfo.projectBound == false || !collabEnable)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.NeedToEnableCollab;
|
||||
}
|
||||
else if (currentInfo.update)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.ServerHasChanges;
|
||||
}
|
||||
else if (currentInfo.conflict)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.Conflict;
|
||||
}
|
||||
else if (currentInfo.publish)
|
||||
{
|
||||
currentCollabState = CollabToolbarState.FilesToPush;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
currentCollabState = CollabToolbarState.Offline;
|
||||
}
|
||||
|
||||
if (Collab.IsToolbarVisible != null)
|
||||
{
|
||||
if (currentCollabState != m_CollabToolbarState ||
|
||||
Collab.IsToolbarVisible() == m_ShowCollabTooltip)
|
||||
{
|
||||
m_CollabToolbarState = currentCollabState;
|
||||
m_ShowCollabTooltip = !Collab.IsToolbarVisible();
|
||||
Toolbar.RepaintToolbar();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ReserveRight(float width, ref Rect pos)
|
||||
{
|
||||
pos.x += width;
|
||||
}
|
||||
|
||||
void ReserveBottom(float height, ref Rect pos)
|
||||
{
|
||||
pos.y += height;
|
||||
}
|
||||
|
||||
ButtonWithAnimatedIconRotation GetCollabButton()
|
||||
{
|
||||
if (m_CollabButton == null)
|
||||
{
|
||||
const int repaintsPerSecond = 20;
|
||||
const float animSpeed = 500f;
|
||||
const bool mouseDownButton = true;
|
||||
m_CollabButton = new ButtonWithAnimatedIconRotation(() => (float)EditorApplication.timeSinceStartup * animSpeed, Toolbar.RepaintToolbar, repaintsPerSecond, mouseDownButton);
|
||||
}
|
||||
|
||||
return m_CollabButton;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Collab.instance.StateChanged -= OnCollabStateChanged;
|
||||
UnityConnect.instance.StateChanged -= OnUnityConnectStateChanged;
|
||||
UnityConnect.instance.UserStateChanged -= OnUnityConnectUserStateChanged;
|
||||
|
||||
if (m_CollabButton != null)
|
||||
m_CollabButton.Clear();
|
||||
}
|
||||
}
|
||||
} // namespace
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 882f1a4147a284f028899b9c018e63eb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,137 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEditor.Web;
|
||||
using UnityEditor.Connect;
|
||||
|
||||
namespace UnityEditor
|
||||
{
|
||||
[InitializeOnLoad]
|
||||
internal class WebViewStatic : ScriptableSingleton<WebViewStatic>
|
||||
{
|
||||
[SerializeField]
|
||||
WebView m_WebView;
|
||||
|
||||
static public WebView GetWebView()
|
||||
{
|
||||
return instance.m_WebView;
|
||||
}
|
||||
|
||||
static public void SetWebView(WebView webView)
|
||||
{
|
||||
instance.m_WebView = webView;
|
||||
}
|
||||
}
|
||||
|
||||
[InitializeOnLoad]
|
||||
internal class CollabToolbarWindow : WebViewEditorStaticWindow, IHasCustomMenu
|
||||
{
|
||||
internal override WebView webView
|
||||
{
|
||||
get {return WebViewStatic.GetWebView(); }
|
||||
set {WebViewStatic.SetWebView(value); }
|
||||
}
|
||||
|
||||
private const string kWindowName = "Unity Collab Toolbar";
|
||||
|
||||
private static long s_LastClosedTime;
|
||||
private static CollabToolbarWindow s_CollabToolbarWindow;
|
||||
|
||||
public static bool s_ToolbarIsVisible = false;
|
||||
|
||||
const int kWindowWidth = 320;
|
||||
const int kWindowHeight = 350;
|
||||
|
||||
public static void CloseToolbar()
|
||||
{
|
||||
foreach (CollabToolbarWindow window in Resources.FindObjectsOfTypeAll<CollabToolbarWindow>())
|
||||
window.Close();
|
||||
}
|
||||
|
||||
[MenuItem("Window/Asset Management/Collab Toolbar", false /*IsValidateFunction*/, 2, true /* IsInternalMenu */)]
|
||||
public static CollabToolbarWindow ShowToolbarWindow()
|
||||
{
|
||||
//Create a new window if it does not exist
|
||||
if (s_CollabToolbarWindow == null)
|
||||
{
|
||||
s_CollabToolbarWindow = GetWindow<CollabToolbarWindow>(false, kWindowName) as CollabToolbarWindow;
|
||||
}
|
||||
|
||||
return s_CollabToolbarWindow;
|
||||
}
|
||||
|
||||
[MenuItem("Window/Asset Management/Collab Toolbar", true /*IsValidateFunction*/)]
|
||||
public static bool ValidateShowToolbarWindow()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool IsVisible()
|
||||
{
|
||||
return s_ToolbarIsVisible;
|
||||
}
|
||||
|
||||
public static bool ShowCenteredAtPosition(Rect buttonRect)
|
||||
{
|
||||
buttonRect.x -= kWindowWidth / 2;
|
||||
// We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time.
|
||||
long nowMilliSeconds = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond;
|
||||
bool justClosed = nowMilliSeconds < s_LastClosedTime + 50;
|
||||
if (!justClosed)
|
||||
{
|
||||
// Method may have been triggered programmatically, without a user event to consume.
|
||||
if (Event.current.type != EventType.Layout)
|
||||
{
|
||||
Event.current.Use();
|
||||
}
|
||||
if (s_CollabToolbarWindow == null)
|
||||
s_CollabToolbarWindow = CreateInstance<CollabToolbarWindow>() as CollabToolbarWindow;
|
||||
var windowSize = new Vector2(kWindowWidth, kWindowHeight);
|
||||
s_CollabToolbarWindow.initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html";
|
||||
s_CollabToolbarWindow.Init();
|
||||
s_CollabToolbarWindow.ShowAsDropDown(buttonRect, windowSize);
|
||||
s_CollabToolbarWindow.OnFocus();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Receives HTML title
|
||||
public void OnReceiveTitle(string title)
|
||||
{
|
||||
titleContent.text = title;
|
||||
}
|
||||
|
||||
public new void OnInitScripting()
|
||||
{
|
||||
base.OnInitScripting();
|
||||
}
|
||||
|
||||
public override void OnEnable()
|
||||
{
|
||||
minSize = new Vector2(kWindowWidth, kWindowHeight);
|
||||
maxSize = new Vector2(kWindowWidth, kWindowHeight);
|
||||
initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html";
|
||||
base.OnEnable();
|
||||
s_ToolbarIsVisible = true;
|
||||
}
|
||||
|
||||
internal new void OnDisable()
|
||||
{
|
||||
s_LastClosedTime = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond;
|
||||
if (s_CollabToolbarWindow)
|
||||
{
|
||||
s_ToolbarIsVisible = false;
|
||||
NotifyVisibility(s_ToolbarIsVisible);
|
||||
}
|
||||
s_CollabToolbarWindow = null;
|
||||
|
||||
base.OnDisable();
|
||||
}
|
||||
|
||||
public new void OnDestroy()
|
||||
{
|
||||
OnLostFocus();
|
||||
base.OnDestroy();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6f516f1ec21a54a59a92bf99db2d9535
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d437fe60bb34f45728664a5d930c1635
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,228 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor.Connect;
|
||||
using UnityEditor.Web;
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryPresenter
|
||||
{
|
||||
public const int ItemsPerPage = 5;
|
||||
ICollabHistoryWindow m_Window;
|
||||
ICollabHistoryItemFactory m_Factory;
|
||||
IRevisionsService m_Service;
|
||||
ConnectInfo m_ConnectState;
|
||||
CollabInfo m_CollabState;
|
||||
bool m_IsCollabError;
|
||||
int m_TotalRevisions;
|
||||
int m_CurrentPage;
|
||||
int m_RequestedPage;
|
||||
bool m_FetchInProgress;
|
||||
|
||||
BuildAccess m_BuildAccess;
|
||||
string m_ProgressRevision;
|
||||
public bool BuildServiceEnabled {get; set; }
|
||||
|
||||
public CollabHistoryPresenter(ICollabHistoryWindow window, ICollabHistoryItemFactory factory, IRevisionsService service)
|
||||
{
|
||||
m_Window = window;
|
||||
m_Factory = factory;
|
||||
m_Service = service;
|
||||
m_CurrentPage = 0;
|
||||
m_BuildAccess = new BuildAccess();
|
||||
m_Service.FetchRevisionsCallback += OnFetchRevisions;
|
||||
}
|
||||
|
||||
public void OnWindowEnabled()
|
||||
{
|
||||
UnityConnect.instance.StateChanged += OnConnectStateChanged;
|
||||
Collab.instance.StateChanged += OnCollabStateChanged;
|
||||
Collab.instance.RevisionUpdated += OnCollabRevisionUpdated;
|
||||
Collab.instance.JobsCompleted += OnCollabJobsCompleted;
|
||||
Collab.instance.ErrorOccurred += OnCollabError;
|
||||
Collab.instance.ErrorCleared += OnCollabErrorCleared;
|
||||
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
|
||||
m_ConnectState = UnityConnect.instance.GetConnectInfo();
|
||||
m_CollabState = Collab.instance.GetCollabInfo();
|
||||
|
||||
m_Window.revisionActionsEnabled = !EditorApplication.isPlayingOrWillChangePlaymode;
|
||||
|
||||
// Setup window callbacks
|
||||
m_Window.OnPageChangeAction = OnUpdatePage;
|
||||
m_Window.OnUpdateAction = OnUpdate;
|
||||
m_Window.OnRestoreAction = OnRestore;
|
||||
m_Window.OnGoBackAction = OnGoBack;
|
||||
m_Window.OnShowBuildAction = ShowBuildForCommit;
|
||||
m_Window.OnShowServicesAction = ShowServicePage;
|
||||
m_Window.itemsPerPage = ItemsPerPage;
|
||||
|
||||
// Initialize data
|
||||
UpdateBuildServiceStatus();
|
||||
var state = RecalculateState();
|
||||
// Only try to load the page if we're ready
|
||||
if (state == HistoryState.Ready)
|
||||
OnUpdatePage(m_CurrentPage);
|
||||
m_Window.UpdateState(state, true);
|
||||
}
|
||||
|
||||
public void OnWindowDisabled()
|
||||
{
|
||||
UnityConnect.instance.StateChanged -= OnConnectStateChanged;
|
||||
Collab.instance.StateChanged -= OnCollabStateChanged;
|
||||
Collab.instance.RevisionUpdated -= OnCollabRevisionUpdated;
|
||||
Collab.instance.JobsCompleted -= OnCollabJobsCompleted;
|
||||
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
|
||||
}
|
||||
|
||||
private void OnConnectStateChanged(ConnectInfo state)
|
||||
{
|
||||
m_ConnectState = state;
|
||||
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
}
|
||||
|
||||
private void OnCollabStateChanged(CollabInfo state)
|
||||
{
|
||||
// Sometimes a collab state change will trigger even though everything is the same
|
||||
if (m_CollabState.Equals(state))
|
||||
return;
|
||||
|
||||
if (m_CollabState.tip != state.tip)
|
||||
OnUpdatePage(m_CurrentPage);
|
||||
|
||||
m_CollabState = state;
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
if (state.inProgress)
|
||||
{
|
||||
m_Window.inProgressRevision = m_ProgressRevision;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Window.inProgressRevision = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCollabRevisionUpdated(CollabInfo state)
|
||||
{
|
||||
OnUpdatePage(m_CurrentPage);
|
||||
}
|
||||
|
||||
private void OnCollabJobsCompleted(CollabInfo state)
|
||||
{
|
||||
m_ProgressRevision = null;
|
||||
}
|
||||
|
||||
private void OnCollabError()
|
||||
{
|
||||
m_IsCollabError = true;
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
}
|
||||
|
||||
private void OnCollabErrorCleared()
|
||||
{
|
||||
m_IsCollabError = false;
|
||||
m_FetchInProgress = true;
|
||||
m_Service.GetRevisions(m_CurrentPage * ItemsPerPage, ItemsPerPage);
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
}
|
||||
|
||||
private void OnPlayModeStateChanged(PlayModeStateChange stateChange)
|
||||
{
|
||||
// If entering play mode, disable
|
||||
if (stateChange == PlayModeStateChange.ExitingEditMode ||
|
||||
stateChange == PlayModeStateChange.EnteredPlayMode)
|
||||
{
|
||||
m_Window.revisionActionsEnabled = false;
|
||||
}
|
||||
// If exiting play mode, enable!
|
||||
else if (stateChange == PlayModeStateChange.EnteredEditMode ||
|
||||
stateChange == PlayModeStateChange.ExitingPlayMode)
|
||||
{
|
||||
m_Window.revisionActionsEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private HistoryState RecalculateState()
|
||||
{
|
||||
if (!m_ConnectState.online)
|
||||
return HistoryState.Offline;
|
||||
if (m_ConnectState.maintenance || m_CollabState.maintenance)
|
||||
return HistoryState.Maintenance;
|
||||
if (!m_ConnectState.loggedIn)
|
||||
return HistoryState.LoggedOut;
|
||||
if (!m_CollabState.seat)
|
||||
return HistoryState.NoSeat;
|
||||
if (!Collab.instance.IsCollabEnabledForCurrentProject())
|
||||
return HistoryState.Disabled;
|
||||
if (!Collab.instance.IsConnected() || !m_CollabState.ready || m_FetchInProgress)
|
||||
return HistoryState.Waiting;
|
||||
if (m_ConnectState.error || m_IsCollabError)
|
||||
return HistoryState.Error;
|
||||
|
||||
return HistoryState.Ready;
|
||||
}
|
||||
|
||||
// TODO: Eventually this can be a listener on the build service status
|
||||
public void UpdateBuildServiceStatus()
|
||||
{
|
||||
foreach (var service in UnityConnectServiceCollection.instance.GetAllServiceInfos())
|
||||
{
|
||||
if (service.name.Equals("Build"))
|
||||
{
|
||||
BuildServiceEnabled = service.enabled;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowBuildForCommit(string revisionID)
|
||||
{
|
||||
m_BuildAccess.ShowBuildForCommit(revisionID);
|
||||
}
|
||||
|
||||
public void ShowServicePage()
|
||||
{
|
||||
m_BuildAccess.ShowServicePage();
|
||||
}
|
||||
|
||||
public void OnUpdatePage(int page)
|
||||
{
|
||||
m_FetchInProgress = true;
|
||||
m_Service.GetRevisions(page * ItemsPerPage, ItemsPerPage);
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
m_RequestedPage = page;
|
||||
}
|
||||
|
||||
private void OnFetchRevisions(RevisionsResult data)
|
||||
{
|
||||
m_FetchInProgress = false;
|
||||
IEnumerable<RevisionData> items = null;
|
||||
if (data != null)
|
||||
{
|
||||
m_CurrentPage = m_RequestedPage;
|
||||
m_TotalRevisions = data.RevisionsInRepo;
|
||||
items = m_Factory.GenerateElements(data.Revisions, m_TotalRevisions, m_CurrentPage * ItemsPerPage, m_Service.tipRevision, m_Window.inProgressRevision, m_Window.revisionActionsEnabled, BuildServiceEnabled, m_Service.currentUser);
|
||||
}
|
||||
|
||||
// State must be recalculated prior to inserting items
|
||||
m_Window.UpdateState(RecalculateState(), false);
|
||||
m_Window.UpdateRevisions(items, m_Service.tipRevision, m_TotalRevisions, m_CurrentPage);
|
||||
}
|
||||
|
||||
private void OnRestore(string revisionId, bool updatetorevision)
|
||||
{
|
||||
m_ProgressRevision = revisionId;
|
||||
Collab.instance.ResyncToRevision(revisionId);
|
||||
}
|
||||
|
||||
private void OnGoBack(string revisionId, bool updatetorevision)
|
||||
{
|
||||
m_ProgressRevision = revisionId;
|
||||
Collab.instance.GoBackToRevision(revisionId, false);
|
||||
}
|
||||
|
||||
private void OnUpdate(string revisionId, bool updatetorevision)
|
||||
{
|
||||
m_ProgressRevision = revisionId;
|
||||
Collab.instance.Update(revisionId, updatetorevision);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a7c91a123806d41a0873fcdcb629b1c4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fd0a39b4d296d4d509b4f1dbd08d0630
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class BuildStatusButton : Button
|
||||
{
|
||||
private readonly string iconPrefix = "Icons/Collab.Build";
|
||||
private readonly string iconSuffix = ".png";
|
||||
Label labelElement = new Label();
|
||||
Image iconElement = new Image() {name = "BuildIcon"};
|
||||
|
||||
public BuildStatusButton(Action clickEvent) : base(clickEvent)
|
||||
{
|
||||
iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture;
|
||||
labelElement.text = "Build Now";
|
||||
Add(iconElement);
|
||||
Add(labelElement);
|
||||
}
|
||||
|
||||
public BuildStatusButton(Action clickEvent, BuildState state, int failures) : base(clickEvent)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case BuildState.InProgress:
|
||||
iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture;
|
||||
labelElement.text = "In progress";
|
||||
break;
|
||||
|
||||
case BuildState.Failed:
|
||||
iconElement.image = EditorGUIUtility.Load(iconPrefix + "Failed" + iconSuffix) as Texture;
|
||||
labelElement.text = failures + ((failures == 1) ? " failure" : " failures");
|
||||
break;
|
||||
|
||||
case BuildState.Success:
|
||||
iconElement.image = EditorGUIUtility.Load(iconPrefix + "Succeeded" + iconSuffix) as Texture;
|
||||
labelElement.text = "success";
|
||||
break;
|
||||
}
|
||||
|
||||
Add(iconElement);
|
||||
Add(labelElement);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0217a80286f79419daa202f69409f19b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,78 @@
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor.Connect;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryDropDown : VisualElement
|
||||
{
|
||||
private readonly VisualElement m_FilesContainer;
|
||||
private readonly Label m_ToggleLabel;
|
||||
private int m_ChangesTotal;
|
||||
private string m_RevisionId;
|
||||
|
||||
public CollabHistoryDropDown(ICollection<ChangeData> changes, int changesTotal, bool changesTruncated, string revisionId)
|
||||
{
|
||||
m_FilesContainer = new VisualElement();
|
||||
m_ChangesTotal = changesTotal;
|
||||
m_RevisionId = revisionId;
|
||||
|
||||
m_ToggleLabel = new Label(ToggleText(false));
|
||||
m_ToggleLabel.AddManipulator(new Clickable(ToggleDropdown));
|
||||
Add(m_ToggleLabel);
|
||||
|
||||
foreach (ChangeData change in changes)
|
||||
{
|
||||
m_FilesContainer.Add(new CollabHistoryDropDownItem(change.path, change.action));
|
||||
}
|
||||
|
||||
if (changesTruncated)
|
||||
{
|
||||
m_FilesContainer.Add(new Button(ShowAllClick)
|
||||
{
|
||||
text = "Show all on dashboard"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ToggleDropdown()
|
||||
{
|
||||
if (Contains(m_FilesContainer))
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseAssets");
|
||||
Remove(m_FilesContainer);
|
||||
m_ToggleLabel.text = ToggleText(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandAssets");
|
||||
Add(m_FilesContainer);
|
||||
m_ToggleLabel.text = ToggleText(true);
|
||||
}
|
||||
}
|
||||
|
||||
private string ToggleText(bool open)
|
||||
{
|
||||
var icon = open ? "\u25bc" : "\u25b6";
|
||||
var change = m_ChangesTotal == 1 ? "Change" : "Changes";
|
||||
return string.Format("{0} {1} Asset {2}", icon, m_ChangesTotal, change);
|
||||
}
|
||||
|
||||
private void ShowAllClick()
|
||||
{
|
||||
var host = UnityConnect.instance.GetConfigurationURL(CloudConfigUrl.CloudServicesDashboard);
|
||||
var org = UnityConnect.instance.GetOrganizationId();
|
||||
var proj = UnityConnect.instance.GetProjectGUID();
|
||||
var url = string.Format("{0}/collab/orgs/{1}/projects/{2}/commits?commit={3}", host, org, proj, m_RevisionId);
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowAllOnDashboard");
|
||||
Application.OpenURL(url);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a483595b0257945278dc75c5ff7d82ee
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryDropDownItem : VisualElement
|
||||
{
|
||||
public CollabHistoryDropDownItem(string path, string action)
|
||||
{
|
||||
var fileName = Path.GetFileName(path);
|
||||
var isFolder = Path.GetFileNameWithoutExtension(path).Equals(fileName);
|
||||
var fileIcon = GetIconElement(action, fileName, isFolder);
|
||||
var metaContainer = new VisualElement();
|
||||
var fileNameLabel = new Label
|
||||
{
|
||||
name = "FileName",
|
||||
text = fileName
|
||||
};
|
||||
var filePathLabel = new Label
|
||||
{
|
||||
name = "FilePath",
|
||||
text = path
|
||||
};
|
||||
metaContainer.Add(fileNameLabel);
|
||||
metaContainer.Add(filePathLabel);
|
||||
Add(fileIcon);
|
||||
Add(metaContainer);
|
||||
}
|
||||
|
||||
private Image GetIconElement(string action, string fileName, bool isFolder)
|
||||
{
|
||||
var prefix = isFolder ? "Folder" : "File";
|
||||
var actionName = action.First().ToString().ToUpper() + action.Substring(1);
|
||||
// Use the same icon for renamed and moved files
|
||||
actionName = actionName.Equals("Renamed") ? "Moved" : actionName;
|
||||
var iconElement = new Image
|
||||
{
|
||||
name = "FileIcon",
|
||||
image = EditorGUIUtility.LoadIcon("Icons/Collab." + prefix + actionName + ".png")
|
||||
};
|
||||
return iconElement;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d912d4873af534bd4a9d44bf1b52f14e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,229 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using UnityEditor.Connect;
|
||||
using UnityEditor.Web;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryItem : VisualElement
|
||||
{
|
||||
public static RevisionAction s_OnRestore;
|
||||
public static RevisionAction s_OnGoBack;
|
||||
public static RevisionAction s_OnUpdate;
|
||||
public static ShowBuildAction s_OnShowBuild;
|
||||
public static Action s_OnShowServices;
|
||||
|
||||
private readonly string m_RevisionId;
|
||||
private readonly string m_FullDescription;
|
||||
private readonly DateTime m_TimeStamp;
|
||||
private readonly Button m_Button;
|
||||
private readonly HistoryProgressSpinner m_ProgressSpinner;
|
||||
private VisualElement m_ActionsTray;
|
||||
private VisualElement m_Details;
|
||||
private Label m_Description;
|
||||
private Label m_TimeAgo;
|
||||
private readonly Button m_ExpandCollapseButton;
|
||||
private bool m_Expanded;
|
||||
|
||||
private const int kMaxDescriptionChars = 500;
|
||||
|
||||
public bool RevisionActionsEnabled
|
||||
{
|
||||
set
|
||||
{
|
||||
m_Button.SetEnabled(value);
|
||||
}
|
||||
}
|
||||
|
||||
public DateTime timeStamp
|
||||
{
|
||||
get { return m_TimeStamp; }
|
||||
}
|
||||
|
||||
public CollabHistoryItem(RevisionData data)
|
||||
{
|
||||
m_RevisionId = data.id;
|
||||
m_TimeStamp = data.timeStamp;
|
||||
name = "HistoryItem";
|
||||
m_ActionsTray = new VisualElement {name = "HistoryItemActionsTray"};
|
||||
m_ProgressSpinner = new HistoryProgressSpinner();
|
||||
m_Details = new VisualElement {name = "HistoryDetail"};
|
||||
var author = new Label(data.authorName) {name = "Author"};
|
||||
m_TimeAgo = new Label(TimeAgo.GetString(m_TimeStamp));
|
||||
m_FullDescription = data.comment;
|
||||
var shouldTruncate = ShouldTruncateDescription(m_FullDescription);
|
||||
if (shouldTruncate)
|
||||
{
|
||||
m_Description = new Label(GetTruncatedDescription(m_FullDescription));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Description = new Label(m_FullDescription);
|
||||
}
|
||||
m_Description.name = "RevisionDescription";
|
||||
var dropdown = new CollabHistoryDropDown(data.changes, data.changesTotal, data.changesTruncated, data.id);
|
||||
if (data.current)
|
||||
{
|
||||
m_Button = new Button(Restore) {name = "ActionButton", text = "Restore"};
|
||||
}
|
||||
else if (data.obtained)
|
||||
{
|
||||
m_Button = new Button(GoBackTo) {name = "ActionButton", text = "Go back to..."};
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Button = new Button(UpdateTo) {name = "ActionButton", text = "Update"};
|
||||
}
|
||||
m_Button.SetEnabled(data.enabled);
|
||||
m_ProgressSpinner.ProgressEnabled = data.inProgress;
|
||||
|
||||
m_ActionsTray.Add(m_ProgressSpinner);
|
||||
m_ActionsTray.Add(m_Button);
|
||||
|
||||
m_Details.Add(author);
|
||||
m_Details.Add(m_TimeAgo);
|
||||
m_Details.Add(m_Description);
|
||||
|
||||
if (shouldTruncate)
|
||||
{
|
||||
m_ExpandCollapseButton = new Button(ToggleDescription) { name = "ToggleDescription", text = "Show More" };
|
||||
m_Details.Add(m_ExpandCollapseButton);
|
||||
}
|
||||
|
||||
if (data.buildState != BuildState.None)
|
||||
{
|
||||
BuildStatusButton buildButton;
|
||||
if (data.buildState == BuildState.Configure)
|
||||
buildButton = new BuildStatusButton(ShowServicePage);
|
||||
else
|
||||
buildButton = new BuildStatusButton(ShowBuildForCommit, data.buildState, data.buildFailures);
|
||||
|
||||
m_Details.Add(buildButton);
|
||||
}
|
||||
|
||||
m_Details.Add(m_ActionsTray);
|
||||
m_Details.Add(dropdown);
|
||||
|
||||
Add(m_Details);
|
||||
|
||||
this.schedule.Execute(UpdateTimeAgo).Every(1000 * 20);
|
||||
}
|
||||
|
||||
public static void SetUpCallbacks(RevisionAction Restore, RevisionAction GoBack, RevisionAction Update)
|
||||
{
|
||||
s_OnRestore = Restore;
|
||||
s_OnGoBack = GoBack;
|
||||
s_OnUpdate = Update;
|
||||
}
|
||||
|
||||
public void SetInProgressStatus(string revisionIdInProgress)
|
||||
{
|
||||
if (String.IsNullOrEmpty(revisionIdInProgress))
|
||||
{
|
||||
m_Button.SetEnabled(true);
|
||||
m_ProgressSpinner.ProgressEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Button.SetEnabled(false);
|
||||
if (m_RevisionId.Equals(revisionIdInProgress))
|
||||
{
|
||||
m_ProgressSpinner.ProgressEnabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShowBuildForCommit()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowBuild");
|
||||
if (s_OnShowBuild != null)
|
||||
{
|
||||
s_OnShowBuild(m_RevisionId);
|
||||
}
|
||||
}
|
||||
|
||||
void ShowServicePage()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowServices");
|
||||
if (s_OnShowServices != null)
|
||||
{
|
||||
s_OnShowServices();
|
||||
}
|
||||
}
|
||||
|
||||
void Restore()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Restore");
|
||||
if (s_OnRestore != null)
|
||||
{
|
||||
s_OnRestore(m_RevisionId, false);
|
||||
}
|
||||
}
|
||||
|
||||
void GoBackTo()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "GoBackTo");
|
||||
if (s_OnGoBack != null)
|
||||
{
|
||||
s_OnGoBack(m_RevisionId, false);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateTo()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Update");
|
||||
if (s_OnUpdate != null)
|
||||
{
|
||||
s_OnUpdate(m_RevisionId, true);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateTimeAgo()
|
||||
{
|
||||
m_TimeAgo.text = TimeAgo.GetString(m_TimeStamp);
|
||||
}
|
||||
|
||||
bool ShouldTruncateDescription(string description)
|
||||
{
|
||||
return description.Contains(Environment.NewLine) || description.Length > kMaxDescriptionChars;
|
||||
}
|
||||
|
||||
string GetTruncatedDescription(string description)
|
||||
{
|
||||
string result = description.Contains(Environment.NewLine) ?
|
||||
description.Substring(0, description.IndexOf(Environment.NewLine)) : description;
|
||||
if (result.Length > kMaxDescriptionChars)
|
||||
{
|
||||
result = result.Substring(0, kMaxDescriptionChars) + "...";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void ToggleDescription()
|
||||
{
|
||||
if (m_Expanded)
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseDescription");
|
||||
m_Expanded = false;
|
||||
m_ExpandCollapseButton.text = "Show More";
|
||||
m_Description.text = GetTruncatedDescription(m_FullDescription);
|
||||
}
|
||||
else
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandDescription");
|
||||
m_Expanded = true;
|
||||
m_ExpandCollapseButton.text = "Show Less";
|
||||
m_Description.text = m_FullDescription;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c4c1445ee948a4124bfa9fb818a17e36
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||||
#endif
|
||||
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryItemFactory : ICollabHistoryItemFactory
|
||||
{
|
||||
const int k_MaxChangesPerRevision = 10;
|
||||
|
||||
public IEnumerable<RevisionData> GenerateElements(IEnumerable<Revision> revisions, int totalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser)
|
||||
{
|
||||
int index = startIndex;
|
||||
|
||||
foreach (var rev in revisions)
|
||||
{
|
||||
index++;
|
||||
var current = rev.revisionID == tipRev;
|
||||
|
||||
// Calculate build status
|
||||
BuildState buildState = BuildState.None;
|
||||
int buildFailures = 0;
|
||||
if (rev.buildStatuses != null && rev.buildStatuses.Length > 0)
|
||||
{
|
||||
bool inProgress = false;
|
||||
foreach (CloudBuildStatus buildStatus in rev.buildStatuses)
|
||||
{
|
||||
if (buildStatus.complete)
|
||||
{
|
||||
if (!buildStatus.success)
|
||||
{
|
||||
buildFailures++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
inProgress = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (inProgress)
|
||||
{
|
||||
buildState = BuildState.InProgress;
|
||||
}
|
||||
else if (buildFailures > 0)
|
||||
{
|
||||
buildState = BuildState.Failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
buildState = BuildState.Success;
|
||||
}
|
||||
}
|
||||
else if (current && !buildServiceEnabled)
|
||||
{
|
||||
buildState = BuildState.Configure;
|
||||
}
|
||||
|
||||
// Calculate the number of changes performed on files and folders (not meta files)
|
||||
var paths = new Dictionary<string, ChangeData>();
|
||||
foreach (ChangeAction change in rev.entries)
|
||||
{
|
||||
if (change.path.EndsWith(".meta"))
|
||||
{
|
||||
var path = change.path.Substring(0, change.path.Length - 5);
|
||||
// Actions taken on meta files are secondary to any actions taken on the main file
|
||||
if (!paths.ContainsKey(path))
|
||||
paths[path] = new ChangeData() {path = path, action = change.action};
|
||||
}
|
||||
else
|
||||
{
|
||||
paths[change.path] = new ChangeData() {path = change.path, action = change.action};
|
||||
}
|
||||
}
|
||||
|
||||
var displayName = (rev.author != currentUser) ? rev.authorName : "You";
|
||||
|
||||
var item = new RevisionData
|
||||
{
|
||||
id = rev.revisionID,
|
||||
index = totalRevisions - index + 1,
|
||||
timeStamp = TimeStampToDateTime(rev.timeStamp),
|
||||
authorName = displayName,
|
||||
comment = rev.comment,
|
||||
|
||||
obtained = rev.isObtained,
|
||||
current = current,
|
||||
inProgress = (rev.revisionID == inProgressRevision),
|
||||
enabled = revisionActionsEnabled,
|
||||
|
||||
buildState = buildState,
|
||||
buildFailures = buildFailures,
|
||||
|
||||
changes = paths.Values.Take(k_MaxChangesPerRevision).ToList(),
|
||||
changesTotal = paths.Values.Count,
|
||||
changesTruncated = paths.Values.Count > k_MaxChangesPerRevision,
|
||||
};
|
||||
|
||||
yield return item;
|
||||
}
|
||||
}
|
||||
|
||||
private static DateTime TimeStampToDateTime(double timeStamp)
|
||||
{
|
||||
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
||||
dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime();
|
||||
return dateTime;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc46f91ea1e8e4ca2ab693fef9156dbe
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class CollabHistoryRevisionLine : VisualElement
|
||||
{
|
||||
public CollabHistoryRevisionLine(int number)
|
||||
{
|
||||
AddNumber(number);
|
||||
AddLine("topLine");
|
||||
AddLine("bottomLine");
|
||||
AddIndicator();
|
||||
}
|
||||
|
||||
public CollabHistoryRevisionLine(DateTime date, bool isFullDateObtained)
|
||||
{
|
||||
AddLine(isFullDateObtained ? "obtainedDateLine" : "absentDateLine");
|
||||
AddHeader(GetFormattedHeader(date));
|
||||
AddToClassList("revisionLineHeader");
|
||||
}
|
||||
|
||||
private void AddHeader(string content)
|
||||
{
|
||||
Add(new Label
|
||||
{
|
||||
text = content
|
||||
});
|
||||
}
|
||||
|
||||
private void AddIndicator()
|
||||
{
|
||||
Add(new VisualElement
|
||||
{
|
||||
name = "RevisionIndicator"
|
||||
});
|
||||
}
|
||||
|
||||
private void AddLine(string className = null)
|
||||
{
|
||||
var line = new VisualElement
|
||||
{
|
||||
name = "RevisionLine"
|
||||
};
|
||||
if (!String.IsNullOrEmpty(className))
|
||||
{
|
||||
line.AddToClassList(className);
|
||||
}
|
||||
Add(line);
|
||||
}
|
||||
|
||||
private void AddNumber(int number)
|
||||
{
|
||||
Add(new Label
|
||||
{
|
||||
text = number.ToString(),
|
||||
name = "RevisionIndex"
|
||||
});
|
||||
}
|
||||
|
||||
private string GetFormattedHeader(DateTime date)
|
||||
{
|
||||
string result = "Commits on " + date.ToString("MMM d");
|
||||
switch (date.Day)
|
||||
{
|
||||
case 1:
|
||||
case 21:
|
||||
case 31:
|
||||
result += "st";
|
||||
break;
|
||||
case 2:
|
||||
case 22:
|
||||
result += "nd";
|
||||
break;
|
||||
case 3:
|
||||
case 23:
|
||||
result += "rd";
|
||||
break;
|
||||
default:
|
||||
result += "th";
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c737f7a9d78541d1ab25f28f045dd32
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,69 @@
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class HistoryProgressSpinner : Image
|
||||
{
|
||||
private readonly Texture2D[] m_StatusWheelTextures;
|
||||
private bool m_ProgressEnabled;
|
||||
private IVisualElementScheduledItem m_Animation;
|
||||
|
||||
public bool ProgressEnabled
|
||||
{
|
||||
set
|
||||
{
|
||||
if (m_ProgressEnabled == value)
|
||||
return;
|
||||
|
||||
m_ProgressEnabled = value;
|
||||
visible = value;
|
||||
|
||||
|
||||
if (value)
|
||||
{
|
||||
if (m_Animation == null)
|
||||
{
|
||||
m_Animation = this.schedule.Execute(AnimateProgress).Every(33);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Animation.Resume();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_Animation != null)
|
||||
{
|
||||
m_Animation.Pause();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public HistoryProgressSpinner()
|
||||
{
|
||||
m_StatusWheelTextures = new Texture2D[12];
|
||||
for (int i = 0; i < 12; i++)
|
||||
{
|
||||
m_StatusWheelTextures[i] = EditorGUIUtility.LoadIcon("WaitSpin" + i.ToString("00"));
|
||||
}
|
||||
image = m_StatusWheelTextures[0];
|
||||
style.width = m_StatusWheelTextures[0].width;
|
||||
style.height = m_StatusWheelTextures[0].height;
|
||||
visible = false;
|
||||
}
|
||||
|
||||
private void AnimateProgress(TimerState obj)
|
||||
{
|
||||
int frame = (int)Mathf.Repeat(Time.realtimeSinceStartup * 10, 11.99f);
|
||||
image = m_StatusWheelTextures[frame];
|
||||
MarkDirtyRepaint();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf6aca931950a4a6a886e214e9e649c4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor.Collaboration;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal interface ICollabHistoryItemFactory
|
||||
{
|
||||
IEnumerable<RevisionData> GenerateElements(IEnumerable<Revision> revsRevisions, int mTotalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 821f5482c5a3f4389885f4432433f56f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,192 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal interface IPagerData
|
||||
{
|
||||
int curPage { get; }
|
||||
int totalPages { get; }
|
||||
PageChangeAction OnPageChanged { get; }
|
||||
}
|
||||
|
||||
internal class PagerElement : VisualElement
|
||||
{
|
||||
IPagerData m_Data;
|
||||
readonly Label m_PageText;
|
||||
readonly Button m_DownButton;
|
||||
readonly Button m_UpButton;
|
||||
|
||||
public PagerElement(IPagerData dataSource)
|
||||
{
|
||||
m_Data = dataSource;
|
||||
|
||||
this.style.flexDirection = FlexDirection.Row;
|
||||
this.style.alignSelf = Align.Center;
|
||||
|
||||
Add(m_DownButton = new Button(OnPageDownClicked) {text = "\u25c5 Newer"});
|
||||
m_DownButton.AddToClassList("PagerDown");
|
||||
|
||||
m_PageText = new Label();
|
||||
m_PageText.AddToClassList("PagerLabel");
|
||||
Add(m_PageText);
|
||||
|
||||
Add(m_UpButton = new Button(OnPageUpClicked) {text = "Older \u25bb"});
|
||||
m_UpButton.AddToClassList("PagerUp");
|
||||
|
||||
UpdateControls();
|
||||
}
|
||||
|
||||
void OnPageDownClicked()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "NewerPage");
|
||||
m_Data.OnPageChanged(m_Data.curPage - 1);
|
||||
}
|
||||
|
||||
void OnPageUpClicked()
|
||||
{
|
||||
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "OlderPage");
|
||||
m_Data.OnPageChanged(m_Data.curPage + 1);
|
||||
}
|
||||
|
||||
public void Refresh()
|
||||
{
|
||||
UpdateControls();
|
||||
}
|
||||
|
||||
void UpdateControls()
|
||||
{
|
||||
var curPage = m_Data.curPage;
|
||||
var totalPages = m_Data.totalPages;
|
||||
|
||||
m_PageText.text = (curPage + 1) + " / " + totalPages;
|
||||
m_DownButton.SetEnabled(curPage > 0);
|
||||
m_UpButton.SetEnabled(curPage < totalPages - 1);
|
||||
}
|
||||
}
|
||||
|
||||
internal enum PagerLocation
|
||||
{
|
||||
Top,
|
||||
Bottom,
|
||||
}
|
||||
|
||||
internal class PagedListView : VisualElement, IPagerData
|
||||
{
|
||||
public const int DefaultItemsPerPage = 10;
|
||||
|
||||
readonly VisualElement m_ItemContainer;
|
||||
readonly PagerElement m_PagerTop, m_PagerBottom;
|
||||
int m_PageSize = DefaultItemsPerPage;
|
||||
IEnumerable<VisualElement> m_Items;
|
||||
int m_TotalItems;
|
||||
int m_CurPage;
|
||||
|
||||
public int pageSize
|
||||
{
|
||||
set { m_PageSize = value; }
|
||||
}
|
||||
|
||||
public IEnumerable<VisualElement> items
|
||||
{
|
||||
set
|
||||
{
|
||||
m_Items = value;
|
||||
LayoutItems();
|
||||
}
|
||||
}
|
||||
|
||||
public int totalItems
|
||||
{
|
||||
set
|
||||
{
|
||||
if (m_TotalItems == value)
|
||||
return;
|
||||
|
||||
m_TotalItems = value;
|
||||
UpdatePager();
|
||||
}
|
||||
}
|
||||
|
||||
public PageChangeAction OnPageChanged { get; set; }
|
||||
|
||||
public PagedListView()
|
||||
{
|
||||
m_PagerTop = new PagerElement(this);
|
||||
|
||||
m_ItemContainer = new VisualElement()
|
||||
{
|
||||
name = "PagerItems",
|
||||
};
|
||||
Add(m_ItemContainer);
|
||||
m_Items = new List<VisualElement>();
|
||||
|
||||
m_PagerBottom = new PagerElement(this);
|
||||
}
|
||||
|
||||
void LayoutItems()
|
||||
{
|
||||
m_ItemContainer.Clear();
|
||||
foreach (var item in m_Items)
|
||||
{
|
||||
m_ItemContainer.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdatePager()
|
||||
{
|
||||
if (m_PagerTop.parent != this && totalPages > 1 && curPage > 0)
|
||||
Insert(0, m_PagerTop);
|
||||
if (m_PagerTop.parent == this && (totalPages <= 1 || curPage == 0))
|
||||
Remove(m_PagerTop);
|
||||
|
||||
if (m_PagerBottom.parent != this && totalPages > 1)
|
||||
Add(m_PagerBottom);
|
||||
if (m_PagerBottom.parent == this && totalPages <= 1)
|
||||
Remove(m_PagerBottom);
|
||||
|
||||
m_PagerTop.Refresh();
|
||||
m_PagerBottom.Refresh();
|
||||
}
|
||||
|
||||
int pageCount
|
||||
{
|
||||
get
|
||||
{
|
||||
var pages = m_TotalItems / m_PageSize;
|
||||
if (m_TotalItems % m_PageSize > 0)
|
||||
pages++;
|
||||
|
||||
return pages;
|
||||
}
|
||||
}
|
||||
|
||||
public int curPage
|
||||
{
|
||||
get { return m_CurPage; }
|
||||
set
|
||||
{
|
||||
m_CurPage = value;
|
||||
UpdatePager();
|
||||
}
|
||||
}
|
||||
|
||||
public int totalPages
|
||||
{
|
||||
get
|
||||
{
|
||||
var extraPage = 0;
|
||||
if (m_TotalItems % m_PageSize > 0)
|
||||
extraPage = 1;
|
||||
return m_TotalItems / m_PageSize + extraPage;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 50de529b6a28f4a7093045e08810a5df
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
#if UNITY_2019_1_OR_NEWER
|
||||
using UnityEngine.UIElements;
|
||||
#else
|
||||
using UnityEngine.Experimental.UIElements;
|
||||
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||||
#endif
|
||||
|
||||
namespace UnityEditor.Collaboration
|
||||
{
|
||||
internal class StatusView : VisualElement
|
||||
{
|
||||
Image m_Image;
|
||||
Label m_Message;
|
||||
Button m_Button;
|
||||
Action m_Callback;
|
||||
|
||||
public Texture icon
|
||||
{
|
||||
get { return m_Image.image; }
|
||||
set
|
||||
{
|
||||
m_Image.image = value;
|
||||
m_Image.visible = value != null;
|
||||
// Until "display: hidden" is added, this is the only way to hide an element
|
||||
m_Image.style.height = value != null ? 150 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
public string message
|
||||
{
|
||||
get { return m_Message.text; }
|
||||
set
|
||||
{
|
||||
m_Message.text = value;
|
||||
m_Message.visible = value != null;
|
||||
}
|
||||
}
|
||||
|
||||
public string buttonText
|
||||
{
|
||||
get { return m_Button.text; }
|
||||
set
|
||||
{
|
||||
m_Button.text = value;
|
||||
UpdateButton();
|
||||
}
|
||||
}
|
||||
|
||||
public Action callback
|
||||
{
|
||||
get { return m_Callback; }
|
||||
set
|
||||
{
|
||||
m_Callback = value;
|
||||
UpdateButton();
|
||||
}
|
||||
}
|
||||
|
||||
public StatusView()
|
||||
{
|
||||
name = "StatusView";
|
||||
|
||||
this.StretchToParentSize();
|
||||
|
||||
m_Image = new Image() { name = "StatusIcon", visible = false, style = { height = 0f }};
|
||||
m_Message = new Label() { name = "StatusMessage", visible = false};
|
||||
m_Button = new Button(InternalCallaback) { name = "StatusButton", visible = false};
|
||||
|
||||
Add(m_Image);
|
||||
Add(m_Message);
|
||||
Add(m_Button);
|
||||
}
|
||||
|
||||
private void UpdateButton()
|
||||
{
|
||||
m_Button.visible = m_Button.text != null && m_Callback != null;
|
||||
}
|
||||
|
||||
private void InternalCallaback()
|
||||
{
|
||||
m_Callback();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08e9894bdf0834710b22d3c0aa245ac0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a6ab6fd2b91214e8a9c8ec2224a528de
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6b1ae1e78552c459d9ce27048ff51c7f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,259 @@
|
||||
.unity-button {
|
||||
min-height:0;
|
||||
-unity-text-align:middle-center;
|
||||
margin-left:4px;
|
||||
margin-top:3px;
|
||||
margin-right:4px;
|
||||
margin-bottom:3px;
|
||||
border-left-width:6px;
|
||||
border-top-width:4px;
|
||||
border-right-width:6px;
|
||||
border-bottom-width:4px;
|
||||
padding-left:6px;
|
||||
padding-top:2px;
|
||||
padding-right:6px;
|
||||
padding-bottom:3px;
|
||||
}
|
||||
|
||||
.unity-label {
|
||||
overflow: hidden;
|
||||
margin-left:4px;
|
||||
margin-top:2px;
|
||||
margin-right:4px;
|
||||
margin-bottom:2px;
|
||||
padding-left:2px;
|
||||
padding-top:1px;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
#HistoryContainer {
|
||||
flex: 1 0 0;
|
||||
}
|
||||
|
||||
#HistoryItem {
|
||||
flex: 1 0 0;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
#HistoryDetail {
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 10px;
|
||||
padding-top: 4px;
|
||||
flex: 1 0 0;
|
||||
}
|
||||
|
||||
#Author {
|
||||
-unity-font-style: bold;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#HistoryDetail > Button {
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
CollabHistoryRevisionLine {
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
#RevisionLine {
|
||||
flex: 1 0 0;
|
||||
margin-left: 35px;
|
||||
width: 1.5px;
|
||||
}
|
||||
|
||||
#RevisionLine.topLine {
|
||||
height: 20px;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
#RevisionLine.absentDateLine {
|
||||
background-color: #797676;
|
||||
}
|
||||
|
||||
.absentRevision #RevisionLine {
|
||||
background-color: #797676;
|
||||
}
|
||||
|
||||
.currentRevision #RevisionLine.topLine {
|
||||
background-color: #797676;
|
||||
}
|
||||
|
||||
#RevisionIndex {
|
||||
position: absolute;
|
||||
min-width: 23px;
|
||||
-unity-text-align: middle-right;
|
||||
top: 15.8px;
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
#RevisionIndicator {
|
||||
position: absolute;
|
||||
background-color: #000;
|
||||
border-radius: 3px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-bottom-width: 2px;
|
||||
border-left-width: 2px;
|
||||
border-right-width: 2px;
|
||||
border-top-width: 2px;
|
||||
top: 20px;
|
||||
left: 32px;
|
||||
}
|
||||
|
||||
.revisionLineHeader {
|
||||
width: 200px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.revisionLineHeader > .unity-label {
|
||||
position: absolute;
|
||||
margin-left: 47px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
#PagerItems {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
PagerElement > .unity-label {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.absentRevision #RevisionIndicator {
|
||||
border-color: #797676;
|
||||
}
|
||||
|
||||
.absentRevision #RevisionIndex {
|
||||
color: #797676;
|
||||
}
|
||||
|
||||
.currentRevision #HistoryDetail {
|
||||
border-top-width: 2px;
|
||||
}
|
||||
|
||||
#HistoryItem #RevisionDescription {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
#HistoryItem #ToggleDescription {
|
||||
align-self: flex-start;
|
||||
padding-top: 0;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
#HistoryItem #ActionButton {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#HistoryItem #BuildIcon {
|
||||
width: 16px;
|
||||
height: 13px;
|
||||
}
|
||||
|
||||
#HistoryItemActionsTray {
|
||||
flex: 1 0 0;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
height: 38px;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
CollabHistoryDropDown {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
CollabHistoryDropDown > .unity-label {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
CollabHistoryDropDownItem {
|
||||
flex-direction: row;
|
||||
border-top-width: 1px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#FileIcon {
|
||||
align-self: center;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
}
|
||||
|
||||
#FileName {
|
||||
-unity-font-style: bold;
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#FileIcon {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
#ErrorBar {
|
||||
height: 24px;
|
||||
background-color: #ff0000;
|
||||
color: #000;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#ErrorBar > #CloseButton {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
color: #000;
|
||||
font-size: 18px;
|
||||
-unity-font-style: bold;
|
||||
}
|
||||
|
||||
#StatusView {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-self: center;
|
||||
align-items: center;
|
||||
flex: 1 0 0;
|
||||
}
|
||||
|
||||
#StatusView > #StatusIcon {
|
||||
width: 115px;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
#StatusView > #StatusMessage {
|
||||
font-size: 22px;
|
||||
width: 230px;
|
||||
white-space: normal;
|
||||
-unity-text-align: middle-center;
|
||||
}
|
||||
|
||||
#StatusView > #StatusButton {
|
||||
font-size: 12px;
|
||||
margin-top: 20px;
|
||||
background-image: none;
|
||||
width: 108px;
|
||||
height: 29px;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button {
|
||||
flex-direction: row;
|
||||
align-self: flex-end;
|
||||
align-items: center;
|
||||
margin-right: 10px;
|
||||
padding-left:0;
|
||||
padding-top:0;
|
||||
padding-right:0;
|
||||
padding-bottom:0;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button .unity-label {
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a2d94c8977984b67984caeff9fa666e
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: stylesheet
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
@ -0,0 +1,86 @@
|
||||
#HistoryContainer {
|
||||
background-color: #292929;
|
||||
}
|
||||
|
||||
.obtainedRevision #HistoryDetail {
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
.absentRevision #HistoryDetail {
|
||||
background-color: #595959;
|
||||
}
|
||||
|
||||
#StatusView {
|
||||
background-color: #292929;
|
||||
}
|
||||
|
||||
#StatusView > #StatusMessage {
|
||||
color: #959995;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button {
|
||||
color: #B4B4B4;
|
||||
background-image: resource("Builtin Skins/DarkSkin/Images/btn.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:active {
|
||||
background-image: resource("Builtin Skins/DarkSkin/Images/btn act.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:checked {
|
||||
color: #F0F0F0;
|
||||
background-image: resource("Builtin Skins/DarkSkin/Images/btn on.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:checked {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:active:checked {
|
||||
background-image: resource("Builtin Skins/DarkSkin/Images/btn onact.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:focus:checked {
|
||||
background-image: resource("Builtin Skins/DarkSkin/Images/btn on focus.png");
|
||||
}
|
||||
|
||||
CollabHistoryDropDown {
|
||||
border-color: #292929;
|
||||
}
|
||||
|
||||
CollabHistoryDropDownItem {
|
||||
border-color: #292929;
|
||||
}
|
||||
|
||||
#RevisionLine.obtainedDateLine {
|
||||
background-color: #0cb4cc;
|
||||
}
|
||||
|
||||
.obtainedRevision #RevisionLine {
|
||||
background-color: #0cb4cc;
|
||||
}
|
||||
|
||||
#RevisionIndex {
|
||||
color: #0cb4cc;
|
||||
}
|
||||
|
||||
#RevisionIndicator {
|
||||
border-color: #0cb4cc;
|
||||
}
|
||||
|
||||
.currentRevision #RevisionIndicator {
|
||||
background-color: #0cb4cc;
|
||||
}
|
||||
|
||||
.currentRevision #HistoryDetail {
|
||||
border-color: #0cb4cc;
|
||||
}
|
||||
|
||||
#StatusView > #StatusButton {
|
||||
background-color: #0cb4cc;
|
||||
border-color: #0cb4cc;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70d4d75a2877243758b0750cbc75b6eb
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: stylesheet
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
@ -0,0 +1,86 @@
|
||||
#HistoryContainer {
|
||||
background-color: #a2a2a2;
|
||||
}
|
||||
|
||||
.obtainedRevision #HistoryDetail {
|
||||
background-color: #c2c2c2;
|
||||
}
|
||||
|
||||
.absentRevision #HistoryDetail {
|
||||
background-color: #dedede;
|
||||
}
|
||||
|
||||
#StatusView {
|
||||
background-color: #a2a2a3;
|
||||
}
|
||||
|
||||
#StatusView > #StatusMessage {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button {
|
||||
color: #111;
|
||||
background-image: resource("Builtin Skins/LightSkin/Images/btn.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:active {
|
||||
background-image: resource("Builtin Skins/LightSkin/Images/btn act.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:checked {
|
||||
color: #F0F0F0;
|
||||
background-image: resource("Builtin Skins/LightSkin/Images/btn on.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:checked {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:hover:active:checked {
|
||||
background-image: resource("Builtin Skins/LightSkin/Images/btn onact.png");
|
||||
}
|
||||
|
||||
BuildStatusButton.unity-button:focus:checked {
|
||||
background-image: resource("Builtin Skins/LightSkin/Images/btn on focus.png");
|
||||
}
|
||||
|
||||
CollabHistoryDropDown {
|
||||
border-color: #a2a2a2;
|
||||
}
|
||||
|
||||
CollabHistoryDropDownItem {
|
||||
border-color: #a2a2a2;
|
||||
}
|
||||
|
||||
#RevisionLine.obtainedDateLine {
|
||||
background-color: #018d98;
|
||||
}
|
||||
|
||||
.obtainedRevision #RevisionLine {
|
||||
background-color: #018d98;
|
||||
}
|
||||
|
||||
#RevisionIndex {
|
||||
color: #018d98;
|
||||
}
|
||||
|
||||
#RevisionIndicator {
|
||||
border-color: #018d98;
|
||||
}
|
||||
|
||||
.currentRevision #RevisionIndicator {
|
||||
background-color: #018d98;
|
||||
}
|
||||
|
||||
.currentRevision #HistoryDetail {
|
||||
border-color: #018d98;
|
||||
}
|
||||
|
||||
#StatusView > #StatusButton {
|
||||
background-color: #018d98;
|
||||
border-color: #018d98;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b52bde26a83564960bcb90217f72b910
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: stylesheet
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Unity.CollabProxy.Editor",
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": []
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 645165c8169474bfbbeb8fb0bcfd26f5
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,31 @@
|
||||
**Unity Companion Package License v1.0 ("_License_")**
|
||||
|
||||
Copyright © 2017 Unity Technologies ApS ("**_Unity_**")
|
||||
|
||||
Unity hereby grants to you a worldwide, non-exclusive, no-charge, and royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the software that is made available with this License ("**_Software_**"), subject to the following terms and conditions:
|
||||
|
||||
1. *Unity Companion Use Only*. Exercise of the license granted herein is limited to exercise for the creation, use, and/or distribution of applications, software, or other content pursuant to a valid Unity development engine software license ("**_Engine License_**"). That means while use of the Software is not limited to use in the software licensed under the Engine License, the Software may not be used for any purpose other than the creation, use, and/or distribution of Engine License-dependent applications, software, or other content. No other exercise of the license granted herein is permitted.
|
||||
|
||||
1. *No Modification of Engine License*. Neither this License nor any exercise of the license granted herein modifies the Engine License in any way.
|
||||
|
||||
1. *Ownership & Grant Back to You*.
|
||||
|
||||
3.1. You own your content. In this License, "derivative works" means derivatives of the Software itself--works derived only from the Software by you under this License (for example, modifying the code of the Software itself to improve its efficacy); “derivative works” of the Software do not include, for example, games, apps, or content that you create using the Software. You keep all right, title, and interest to your own content.
|
||||
|
||||
3.2. Unity owns its content. While you keep all right, title, and interest to your own content per the above, as between Unity and you, Unity will own all right, title, and interest to all intellectual property rights (including patent, trademark, and copyright) in the Software and derivative works of the Software, and you hereby assign and agree to assign all such rights in those derivative works to Unity.
|
||||
|
||||
3.3. You have a license to those derivative works. Subject to this License, Unity grants to you the same worldwide, non-exclusive, no-charge, and royalty-free copyright license to derivative works of the Software you create as is granted to you for the Software under this License.
|
||||
|
||||
1. *Trademarks*. You are not granted any right or license under this License to use any trademarks, service marks, trade names, products names, or branding of Unity or its affiliates ("**_Trademarks_**"). Descriptive uses of Trademarks are permitted; see, for example, Unity’s Branding Usage Guidelines at [https://unity3d.com/public-relations/brand](https://unity3d.com/public-relations/brand).
|
||||
|
||||
1. *Notices & Third-Party Rights*. This License, including the copyright notice above, must be provided in all substantial portions of the Software and derivative works thereof (or, if that is impracticable, in any other location where such notices are customarily placed). Further, if the Software is accompanied by a Unity "third-party notices" or similar file, you acknowledge and agree that software identified in that file is governed by those separate license terms.
|
||||
|
||||
1. *DISCLAIMER, LIMITATION OF LIABILITY*. THE SOFTWARE AND ANY DERIVATIVE WORKS THEREOF IS PROVIDED ON AN "AS IS" BASIS, AND IS PROVIDED WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND/OR NONINFRINGEMENT. IN NO EVENT SHALL ANY COPYRIGHT HOLDER OR AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES (WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL, INCLUDING PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, AND BUSINESS INTERRUPTION), OR OTHER LIABILITY WHATSOEVER, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM OR OUT OF, OR IN CONNECTION WITH, THE SOFTWARE OR ANY DERIVATIVE WORKS THEREOF OR THE USE OF OR OTHER DEALINGS IN SAME, EVEN WHERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
1. *USE IS ACCEPTANCE and License Versions*. Your receipt and use of the Software constitutes your acceptance of this License and its terms and conditions. Software released by Unity under this License may be modified or updated and the License with it; upon any such modification or update, you will comply with the terms of the updated License for any use of any of the Software under the updated License.
|
||||
|
||||
1. *Use in Compliance with Law and Termination*. Your exercise of the license granted herein will at all times be in compliance with applicable law and will not infringe any proprietary rights (including intellectual property rights); this License will terminate immediately on any breach by you of this License.
|
||||
|
||||
1. *Severability*. If any provision of this License is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the other provisions will remain in full force and effect.
|
||||
|
||||
1. *Governing Law and Venue*. This License is governed by and construed in accordance with the laws of Denmark, except for its conflict of laws rules; the United Nations Convention on Contracts for the International Sale of Goods will not apply. If you reside (or your principal place of business is) within the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the state and federal courts located in San Francisco County, California concerning any dispute arising out of this License ("**_Dispute_**"). If you reside (or your principal place of business is) outside the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the courts located in Copenhagen, Denmark concerning any Dispute.
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c754112a02f354a6696fa4f2b99e95a5
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,16 @@
|
||||
# Collab Proxy UPM Package
|
||||
This is the packaged version of Collab, currently limited to containing the History and Toolbar windows, along with supporting classes.
|
||||
|
||||
## Development
|
||||
Check this repository out in your {$PROJECT}/Packages/ folder, under the name com.unity.collab-proxy. The classes will be built by Unity.
|
||||
|
||||
## Testing
|
||||
In order to run the tests, you will need to add this project to the testables key in your manifest.json - once you have done this, the tests will be picked up by the Unity Test Runner window.
|
||||
|
||||
## Building
|
||||
You may build this project using msbuild. The commands to do so can be seen under .gitlab-ci.yml.
|
||||
|
||||
## Deploying
|
||||
Gitlab will automatically build your project when you deploy. You can download the resulting artifact, which will be a dll, and place it in your Editor/bin/ folder. Open the package in Unity to generate the meta files, and then you will be able to publish.
|
||||
|
||||
We're currently looking into a way to avoid this manual process.
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ac281230df7b14becb40b3c479f1b429
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1369382d2c5e64dc5b2ec0b6b0a94531
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4506ac79f5b274cb1b249ed7f4abfb9a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,583 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEditor.Collaboration;
|
||||
using UnityEngine.TestTools;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace UnityEditor.Collaboration.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
internal class HistoryTests
|
||||
{
|
||||
private TestHistoryWindow _window;
|
||||
private TestRevisionsService _service;
|
||||
private CollabHistoryPresenter _presenter;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_window = new TestHistoryWindow();
|
||||
_service = new TestRevisionsService();
|
||||
_presenter = new CollabHistoryPresenter(_window, new CollabHistoryItemFactory(), _service);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__PropagatesRevisionResult()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(authorName: "authorName", comment: "comment", revisionID: "revisionID"),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual("revisionID", item.id);
|
||||
Assert.AreEqual("authorName", item.authorName);
|
||||
Assert.AreEqual("comment", item.comment);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingIsInOrder()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
RevisionsInRepo = 4,
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
new Revision(revisionID: "1"),
|
||||
new Revision(revisionID: "2"),
|
||||
new Revision(revisionID: "3"),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var items = _window.items.ToArray();
|
||||
|
||||
Assert.AreEqual(4, items[0].index);
|
||||
Assert.AreEqual(3, items[1].index);
|
||||
Assert.AreEqual(2, items[2].index);
|
||||
Assert.AreEqual(1, items[3].index);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingChangesForMorePages()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
RevisionsInRepo = 12,
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
new Revision(revisionID: "1"),
|
||||
new Revision(revisionID: "2"),
|
||||
new Revision(revisionID: "3"),
|
||||
new Revision(revisionID: "4"),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(1);
|
||||
var items = _window.items.ToArray();
|
||||
|
||||
Assert.AreEqual(12, items[0].index);
|
||||
Assert.AreEqual(11, items[1].index);
|
||||
Assert.AreEqual(10, items[2].index);
|
||||
Assert.AreEqual(9, items[3].index);
|
||||
Assert.AreEqual(8, items[4].index);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__ObtainedIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(isObtained: false),
|
||||
new Revision(isObtained: true),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var items = _window.items.ToArray();
|
||||
|
||||
Assert.IsFalse(items[0].obtained);
|
||||
Assert.IsTrue(items[1].obtained);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__CurrentIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "1"),
|
||||
new Revision(revisionID: "2"),
|
||||
new Revision(revisionID: "3"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "2";
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var items = _window.items.ToArray();
|
||||
|
||||
Assert.AreEqual(false, items[0].current);
|
||||
Assert.AreEqual(true, items[1].current);
|
||||
Assert.AreEqual(false, items[2].current);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__InProgressIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "1"),
|
||||
new Revision(revisionID: "2"),
|
||||
new Revision(revisionID: "3"),
|
||||
}
|
||||
};
|
||||
_window.inProgressRevision = "2";
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var items = _window.items.ToArray();
|
||||
|
||||
Assert.IsFalse(items[0].inProgress);
|
||||
Assert.IsTrue(items[1].inProgress);
|
||||
Assert.IsFalse(items[2].inProgress);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__EnabledIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_window.revisionActionsEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(true, item.enabled);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__DisabledIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_window.revisionActionsEnabled = false;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(false, item.enabled);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenNotTip()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "1"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = false;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.None, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateTipHasNoneWhenEnabled()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.None, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenTip()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = false;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.Configure, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenZeroBuildStatus()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = false;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.Configure, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenZeroBuildStatuses()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0"),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.None, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasSuccessWhenCompleteAndSucceeded()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
revisionID: "0",
|
||||
buildStatuses: new CloudBuildStatus[1]
|
||||
{
|
||||
new CloudBuildStatus(complete: true, success: true),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.Success, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasInProgress()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
revisionID: "0",
|
||||
buildStatuses: new CloudBuildStatus[1]
|
||||
{
|
||||
new CloudBuildStatus(complete: false),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.InProgress, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailure()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
revisionID: "0",
|
||||
buildStatuses: new CloudBuildStatus[1]
|
||||
{
|
||||
new CloudBuildStatus(complete: true, success: false),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.Failed, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailureWhenAnyBuildsFail()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
revisionID: "0",
|
||||
buildStatuses: new CloudBuildStatus[3]
|
||||
{
|
||||
new CloudBuildStatus(complete: true, success: false),
|
||||
new CloudBuildStatus(complete: true, success: false),
|
||||
new CloudBuildStatus(complete: true, success: true),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
_service.tipRevision = "0";
|
||||
_presenter.BuildServiceEnabled = true;
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(BuildState.Failed, item.buildState);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__ChangesPropagateThrough()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0", entries: GenerateChangeActions(3)),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
var changes = item.changes.ToList();
|
||||
|
||||
Assert.AreEqual("Path0", changes[0].path);
|
||||
Assert.AreEqual("Path1", changes[1].path);
|
||||
Assert.AreEqual("Path2", changes[2].path);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__ChangesTotalIsCalculated()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0", entries: GenerateChangeActions(3)),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(3, item.changes.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__ChangesTruncatedIsCalculated()
|
||||
{
|
||||
for (var i = 0; i < 20; i++)
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(revisionID: "0", entries: GenerateChangeActions(i)),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(0);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(i > 10, item.changesTruncated);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__OnlyKeeps10ChangeActions()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision(authorName: "Test", author: "test", entries: GenerateChangeActions(12)),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(1);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(10, item.changes.Count);
|
||||
Assert.AreEqual(12, item.changesTotal);
|
||||
Assert.AreEqual(true, item.changesTruncated);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__DeduplicatesMetaFiles()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
authorName: "Test",
|
||||
author: "test",
|
||||
revisionID: "",
|
||||
entries: new ChangeAction[2]
|
||||
{
|
||||
new ChangeAction(path: "Path1", action: "Action1"),
|
||||
new ChangeAction(path: "Path1.meta", action: "Action1"),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(1);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(1, item.changes.Count);
|
||||
Assert.AreEqual(1, item.changesTotal);
|
||||
Assert.AreEqual("Path1", item.changes.First().path);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CollabHistoryPresenter_OnUpdatePage__FolderMetaFilesAreCounted()
|
||||
{
|
||||
_service.result = new RevisionsResult()
|
||||
{
|
||||
Revisions = new List<Revision>()
|
||||
{
|
||||
new Revision
|
||||
(
|
||||
authorName: "Test",
|
||||
author: "test",
|
||||
entries: new ChangeAction[1]
|
||||
{
|
||||
new ChangeAction(path: "Folder1.meta", action: "Action1"),
|
||||
}
|
||||
),
|
||||
}
|
||||
};
|
||||
|
||||
_presenter.OnUpdatePage(1);
|
||||
var item = _window.items.First();
|
||||
|
||||
Assert.AreEqual(1, item.changes.Count);
|
||||
Assert.AreEqual(1, item.changesTotal);
|
||||
Assert.AreEqual("Folder1", item.changes.First().path);
|
||||
}
|
||||
|
||||
private static ChangeAction[] GenerateChangeActions(int count)
|
||||
{
|
||||
var entries = new ChangeAction[count];
|
||||
for (var i = 0; i < count; i++)
|
||||
entries[i] = new ChangeAction(path: "Path" + i, action: "Action" + i);
|
||||
return entries;
|
||||
}
|
||||
}
|
||||
|
||||
internal class TestRevisionsService : IRevisionsService
|
||||
{
|
||||
public RevisionsResult result;
|
||||
public event RevisionsDelegate FetchRevisionsCallback;
|
||||
|
||||
public string tipRevision { get; set; }
|
||||
public string currentUser { get; set; }
|
||||
|
||||
public void GetRevisions(int offset, int count)
|
||||
{
|
||||
if(FetchRevisionsCallback != null)
|
||||
{
|
||||
FetchRevisionsCallback(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class TestHistoryWindow : ICollabHistoryWindow
|
||||
{
|
||||
public IEnumerable<RevisionData> items;
|
||||
|
||||
public bool revisionActionsEnabled { get; set; }
|
||||
public int itemsPerPage { get; set; }
|
||||
public string errMessage { get; set; }
|
||||
public string inProgressRevision { get; set; }
|
||||
public PageChangeAction OnPageChangeAction { get; set; }
|
||||
public RevisionAction OnGoBackAction { get; set; }
|
||||
public RevisionAction OnUpdateAction { get; set; }
|
||||
public RevisionAction OnRestoreAction { get; set; }
|
||||
public ShowBuildAction OnShowBuildAction { get; set; }
|
||||
public Action OnShowServicesAction { get; set; }
|
||||
|
||||
public void UpdateState(HistoryState state, bool force)
|
||||
{
|
||||
}
|
||||
|
||||
public void UpdateRevisions(IEnumerable<RevisionData> items, string tip, int totalRevisions, int currPage)
|
||||
{
|
||||
this.items = items;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23a56a19774ed42b6b65646af08a003c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "Unity.CollabProxy.EditorTests",
|
||||
"references": [
|
||||
"Unity.CollabProxy.Editor"
|
||||
],
|
||||
"optionalUnityReferences": [
|
||||
"TestAssemblies"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": []
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 782de34c17796430ba8d0ceddb60944e
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "com.unity.collab-proxy",
|
||||
"displayName": "Unity Collaborate",
|
||||
"version": "1.2.16",
|
||||
"unity": "2018.3",
|
||||
"description": "Collaborate is a simple way for teams to save, share, and sync their Unity project",
|
||||
"keywords": [
|
||||
"collab",
|
||||
"collaborate",
|
||||
"teams",
|
||||
"team",
|
||||
"cloud",
|
||||
"backup"
|
||||
],
|
||||
"dependencies": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitlab.cds.internal.unity3d.com/upm-packages/cloud-services/collab-proxy.git",
|
||||
"revision": "070e173b6a36e1d6097b1d95e09c08840c23f6ca"
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 57b0c806ba25b48aa8a6ecb3345a4a9b
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
image: node:6.10.0
|
||||
|
||||
stages:
|
||||
- push_to_packman_staging
|
||||
|
||||
push_to_packman_staging:
|
||||
stage: push_to_packman_staging
|
||||
only:
|
||||
- tags
|
||||
script:
|
||||
- sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" package.json
|
||||
- sed -i "s/PLACEHOLDERSHA/$CI_COMMIT_SHA/g" package.json
|
||||
- sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" CHANGELOG.md
|
||||
- curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc
|
||||
- npm publish
|
@ -0,0 +1,11 @@
|
||||
# Changelog
|
||||
All notable changes to this package will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.0.0] - 2019-02-21
|
||||
|
||||
### This is the first release of *Unity Package com.unity.ext.nunit*.
|
||||
|
||||
- Migrated the custom version of nunit from inside of unity.
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f49bbe06ffa5ae24abe32abdab430c24
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,6 @@
|
||||
# Custom Nunit build to work with Unity
|
||||
|
||||
This version of nunit works with all platforms, il2cpp and Mono AOT.
|
||||
|
||||
For Nunit Documentation:
|
||||
https://github.com/nunit/docs/wiki/NUnit-Documentation
|
@ -0,0 +1,19 @@
|
||||
Copyright (c) 2018 Charlie Poole, Rob Prouse
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f91a00d2dca52b843b2d50ccf750737d
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,6 @@
|
||||
# Custom Nunit build to work with Unity
|
||||
|
||||
This version of nunit works with all platforms, il2cpp and Mono AOT.
|
||||
|
||||
For Nunit Documentation:
|
||||
https://github.com/nunit/docs/wiki/NUnit-Documentation
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5da62a0c1c5218c4aa16b74546a7822d
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a36d8b72880a8004f96ac54ce4598ff9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2347243c7aa3e224f9282dc94e6fc3b2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,4 @@
|
||||
This is a custom nUnit build meant to be used by Unity editor and players. It shoul not be included or referenced from anywhere (unless you know what you're doing)
|
||||
|
||||
Build from this repo
|
||||
https://github.com/Unity-Technologies/nunit
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3d67ccdf81bed8247ad0db2d5f47a7d1
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6f768c3714a34a549960ea903fbadcc2
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,37 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f1605f5534186904fa2c4c42acbfe01e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: ["UNITY_INCLUDE_TESTS"]
|
||||
isPreloaded: 0
|
||||
isOverridable: 1
|
||||
isExplicitlyReferenced: 1
|
||||
platformData:
|
||||
- first:
|
||||
'': Any
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f136f1f122a53c64c9af51baecaa9c96
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user