Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ai.fluctio.fluctio-sim / Utils / SerializableClasses / SerializableTimeSpan.cs
Size: Mime:
using System;
using UnityEditor;
using UnityEngine;

namespace Fluctio.FluctioSim.Utils.SerializableClasses
{
	[Serializable]
	public class SerializableTimeSpan : ISerializationCallbackReceiver, IFormattable
	{

		#region Info and constructor

		[SerializeField] private double seconds;
		public TimeSpan TimeSpan { get; private set; }

		public SerializableTimeSpan(TimeSpan timeSpan)
		{
			TimeSpan = timeSpan;
			seconds = TimeSpan.TotalSeconds;
		}
		
		#endregion

		#region Cast operators
		
		public static implicit operator TimeSpan(SerializableTimeSpan serializableTimeSpan)
		{
			return serializableTimeSpan.TimeSpan;
		}

		public static implicit operator SerializableTimeSpan(TimeSpan timeSpan)
		{
			return new SerializableTimeSpan(timeSpan);
		}
		
		#endregion

		#region Serialization
		
		public void OnBeforeSerialize()
		{
			seconds = TimeSpan.TotalSeconds;
		}

		public void OnAfterDeserialize()
		{
			TimeSpan = TimeSpan.FromSeconds(seconds);
		}
		
		#endregion

		#region ToString

		// ReSharper disable once SpecifyACultureInStringConversionExplicitly
		public override string ToString() => TimeSpan.ToString();
		
		public string ToString(string format, IFormatProvider formatProvider)
		{
			return TimeSpan.ToString(format, formatProvider);
		}		

		#endregion
	}
	
	#if UNITY_EDITOR
	[CustomPropertyDrawer(typeof(SerializableTimeSpan))]
	public class SerializableTimeSpanDrawer : PropertyDrawer
	{
		public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
		{
			var secondsProperty = property.FindPropertyRelative("seconds");
			label.text = $"{label.text} (seconds)";
			EditorGUI.PropertyField(position, secondsProperty, label);
		}
	}
	#endif
}