//
// VOID_DataValue.cs
//
// Author:
// toadicus <>
//
// Copyright (c) 2013 toadicus
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
using System;
using UnityEngine;
namespace VOID
{
public interface IVOID_DataValue
{
void Refresh();
string ValueUnitString();
void DoGUIHorizontal();
}
public class VOID_DataValue : IVOID_DataValue
{
/*
* Static Members
* */
public static implicit operator T(VOID_DataValue v)
{
return (T)v.Value;
}
/*
* Instance Members
* */
/*
* Fields
* */
protected T cache;
protected Func ValueFunc;
protected float lastUpdate;
/*
* Properties
* */
public string Label { get; protected set; }
public string Units { get; protected set; }
public T Value
{
get
{
if (
(VOID_Core.Instance.updateTimer - this.lastUpdate > VOID_Core.Instance.updatePeriod) ||
(this.lastUpdate > VOID_Core.Instance.updateTimer)
)
{
this.Refresh();
}
return (T)this.cache;
}
}
/*
* Methods
* */
public VOID_DataValue(string Label, Func ValueFunc, string Units = "")
{
this.Label = Label;
this.Units = Units;
this.ValueFunc = ValueFunc;
this.lastUpdate = 0;
}
public void Refresh()
{
this.cache = this.ValueFunc.Invoke ();
this.lastUpdate = VOID_Core.Instance.updateTimer;
}
public T GetFreshValue()
{
this.Refresh ();
return (T)this.cache;
}
public string ValueUnitString() {
return this.Value.ToString() + this.Units;
}
public virtual void DoGUIHorizontal()
{
GUILayout.BeginHorizontal (GUILayout.ExpandWidth (true));
GUILayout.Label (this.Label + ":");
GUILayout.FlexibleSpace ();
GUILayout.Label (this.ValueUnitString(), GUILayout.ExpandWidth (false));
GUILayout.EndHorizontal ();
}
public override string ToString()
{
return string.Format (
"{0}: {1}{2}",
this.Label,
this.Value.ToString (),
this.Units
);
}
}
public abstract class VOID_NumValue : VOID_DataValue
where T : IFormattable, IConvertible, IComparable
{
public static implicit operator Double(VOID_NumValue v)
{
return v.ToDouble();
}
public static implicit operator Int32(VOID_NumValue v)
{
return v.ToInt32();
}
public static implicit operator Single(VOID_NumValue v)
{
return v.ToSingle();
}
protected IFormatProvider formatProvider;
public VOID_NumValue(string Label, Func ValueFunc, string Units = "") : base(Label, ValueFunc, Units)
{
this.formatProvider = System.Globalization.CultureInfo.CurrentUICulture;
}
public virtual double ToDouble(IFormatProvider provider)
{
return this.Value.ToDouble(provider);
}
public virtual double ToDouble()
{
return this.ToDouble(this.formatProvider);
}
public virtual int ToInt32(IFormatProvider provider)
{
return this.Value.ToInt32(provider);
}
public virtual int ToInt32()
{
return this.ToInt32(this.formatProvider);
}
public virtual float ToSingle(IFormatProvider provider)
{
return this.Value.ToSingle(provider);
}
public virtual float ToSingle()
{
return this.ToSingle(this.formatProvider);
}
public virtual string ToString(string Format)
{
return string.Format (
"{0}: {1}{2}",
this.Label,
this.Value.ToString(Format, this.formatProvider),
this.Units
);
}
public virtual string ToSIString(int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue)
{
return string.Format (
"{0}{1}",
Tools.MuMech_ToSI (this, digits, MinMagnitude, MaxMagnitude),
this.Units
);
}
public virtual string ValueUnitString(string format)
{
return this.Value.ToString(format, this.formatProvider) + this.Units;
}
public virtual string ValueUnitString(int digits) {
return Tools.MuMech_ToSI(this, digits) + this.Units;
}
public virtual string ValueUnitString(int digits, int MinMagnitude, int MaxMagnitude)
{
return Tools.MuMech_ToSI(this, digits, MinMagnitude, MaxMagnitude) + this.Units;
}
public virtual void DoGUIHorizontal(string format)
{
GUILayout.BeginHorizontal (GUILayout.ExpandWidth (true));
GUILayout.Label (this.Label + ":");
GUILayout.FlexibleSpace ();
GUILayout.Label (this.ValueUnitString(format), GUILayout.ExpandWidth (false));
GUILayout.EndHorizontal ();
}
public virtual int DoGUIHorizontal(int digits, bool precisionButton = true)
{
if (precisionButton)
{
return this.DoGUIHorizontalPrec(digits);
}
GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
GUILayout.Label(this.Label + ":", GUILayout.ExpandWidth(true));
GUILayout.FlexibleSpace();
GUILayout.Label(this.ValueUnitString(digits), GUILayout.ExpandWidth(false));
GUILayout.EndHorizontal();
return digits;
}
public virtual int DoGUIHorizontalPrec(int digits)
{
float magnitude;
float magLimit;
magnitude = (float)Math.Log10(Math.Abs(this));
magLimit = Mathf.Max(magnitude, 6f);
magLimit = Mathf.Round((float)Math.Ceiling(magLimit / 3f) * 3f);
GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
GUILayout.Label(this.Label + "ⁱ:", GUILayout.ExpandWidth(true));
GUILayout.FlexibleSpace();
GUILayout.Label(this.ValueUnitString(3, int.MinValue, (int)magnitude - digits), GUILayout.ExpandWidth(false));
GUILayout.EndHorizontal();
if (Event.current.type == EventType.mouseUp)
{
Rect lastRect = GUILayoutUtility.GetLastRect();
if (lastRect.Contains(Event.current.mousePosition))
{
if (Event.current.button == 0)
{
digits = (digits + 3) % (int)magLimit;
}
else if (Event.current.button == 1)
{
digits = (digits - 3) % (int)magLimit;
}
if (digits < 0)
{
digits = (int)magLimit - 3;
}
}
}
return digits;
}
}
public class VOID_DoubleValue : VOID_NumValue
{
public VOID_DoubleValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {}
}
public class VOID_FloatValue : VOID_NumValue
{
public VOID_FloatValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {}
}
public class VOID_IntValue : VOID_NumValue
{
public VOID_IntValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {}
}
public class VOID_StrValue : VOID_DataValue
{
public VOID_StrValue(string Label, Func ValueFunc) : base(Label, ValueFunc, "") {}
}
}