31 using System.Collections.Generic;
67 internal abstract double GetValue();
68 internal abstract double GetMinValue();
69 internal abstract double GetMaxValue();
77 public Meter<T> OfType<T>() where
T :
struct, IComparable<T>, IEquatable<T>
79 Type meterType = this.GetType();
80 Type[] genargs = meterType.GetGenericArguments();
82 if ( genargs.Length < 1 )
throw new ArgumentException(
"This meter is not typed" );
83 if ( genargs[0] != typeof( T ) )
throw new ArgumentException( String.Format(
"This meter measures {0}, not {1}", genargs[0].Name, typeof( T ).Name ) );
94 public abstract class Meter<ValueType> :
Meter where ValueType : struct, IComparable<ValueType>, IEquatable<ValueType>
96 private struct Trigger
98 public ValueType value;
100 public Action method;
105 this.direction = direction;
106 this.method = method;
110 private bool valueSet;
112 private ValueType val;
113 private ValueType minval;
114 private ValueType maxval;
115 private ValueType defval;
117 private List<Trigger> triggers;
123 public ValueType Value
128 if ( value.Equals( val ) )
131 ValueType oldval = val;
134 if (value.CompareTo(minval) < 0) value = minval;
135 if (value.CompareTo(maxval) > 0) value = maxval;
138 OnChange(oldval, value);
139 CheckLimits( oldval, value );
140 CheckTriggers(oldval, value);
147 public ValueType DefaultValue
149 get {
return defval; }
152 defval = clampValue( value, minval, maxval );
153 if ( !valueSet ) Value = value;
161 public ValueType MinValue
163 get {
return minval; }
164 set { minval = value; updateBounds(); }
171 public ValueType MaxValue
173 get {
return maxval; }
174 set { maxval = value; updateBounds(); }
182 public delegate
void ChangeHandler( ValueType oldValue, ValueType newValue );
200 private void OnChange( ValueType oldValue, ValueType newValue )
202 if ( Changed != null )
203 Changed( oldValue, newValue );
206 private void CheckLimits( ValueType oldValue, ValueType newValue )
208 if ( LowerLimit != null && newValue.CompareTo(minval) <= 0 && oldValue.CompareTo(minval) > 0 )
214 if ( UpperLimit != null && newValue.CompareTo(maxval) >= 0 && oldValue.CompareTo(maxval) < 0 )
221 private void CheckTriggers( ValueType oldValue, ValueType newValue )
223 if ( triggers == null )
return;
225 foreach ( Trigger t
in triggers )
227 if ( t.direction !=
TriggerDirection.Down && oldValue.CompareTo( t.value ) < 0 && newValue.CompareTo( t.value ) >= 0 )
230 else if ( t.direction !=
TriggerDirection.Up && oldValue.CompareTo( t.value ) > 0 && newValue.CompareTo( t.value ) <= 0 )
243 public Meter( ValueType defaultVal, ValueType minVal, ValueType maxVal )
270 Value = DefaultValue;
291 if ( triggers == null ) triggers =
new List<Trigger>();
292 triggers.Add(
new Trigger( value, direction, method ) );
303 AddTrigger( value, direction, delegate() { method( this.Value ); } );
312 if ( triggers == null )
return;
313 triggers.RemoveAll( t => t.value.Equals( value ) );
322 if ( triggers == null )
return;
323 triggers.RemoveAll( t => t.method == method );
331 if ( triggers == null )
return;
335 private static ValueType clampValue( ValueType v, ValueType min, ValueType max )
337 if (min.CompareTo(max) > 0)
343 if ( v.CompareTo( min ) < 0 )
346 if ( v.CompareTo( max ) > 0 )
352 private static void clampValue( ref ValueType v, ValueType min, ValueType max )
354 if ( min.CompareTo( max ) > 0 )
360 if ( v.CompareTo( min ) < 0 )
363 else if ( v.CompareTo( max ) > 0 )
367 private void updateBounds()
369 clampValue( ref val, minval, maxval );
370 clampValue( ref defval, minval, maxval );
378 return Value.ToString();
389 private List<Operation> operations =
new List<Operation>();
391 public override double RelativeValue
393 get {
return ( Value - MinValue ) / (double)( MaxValue - MinValue ); }
394 set { Value = (int)( MinValue + value * ( MaxValue - MinValue ) ); }
398 : base( defaultValue, 0, int.MaxValue )
402 public IntMeter(
int defaultValue,
int minValue,
int MaxValue)
403 : base(defaultValue, minValue,MaxValue)
422 public static implicit
operator double(
IntMeter m )
424 return (
double)m.Value;
454 Value = (int)Math.Round( Value * multiplier );
466 Operation op = AddOverTime( change, seconds );
480 op.
Finished += delegate { operations.Remove( op ); };
481 op.
Stopped += delegate { operations.Remove( op ); };
482 operations.Add( op );
491 while ( operations.Count > 0 )
492 operations[0].Stop();
495 internal override double GetValue()
500 internal override double GetMinValue()
505 internal override double GetMaxValue()
517 private List<Operation> operations =
new List<Operation>();
519 public override double RelativeValue
521 get {
return ( Value - MinValue ) / ( MaxValue - MinValue ); }
522 set { Value = MinValue + value * ( MaxValue - MinValue ); }
526 : base( defaultValue, 0.0, double.MaxValue )
530 public DoubleMeter(
double defaultValue,
double minValue,
double maxValue)
531 : base(defaultValue,minValue, maxValue)
574 Operation op = AddOverTime( change, seconds );
588 op.
Finished += delegate { operations.Remove( op ); };
589 op.
Stopped += delegate { operations.Remove( op ); };
590 operations.Add( op );
599 while ( operations.Count > 0 )
600 operations[0].Stop();
603 internal override double GetValue()
608 internal override double GetMinValue()
613 internal override double GetMaxValue()
void Stop()
Pysäyttää AddOverTime-metodilla tehtävät lisäykset mittariin.
void AddTrigger(ValueType value, TriggerDirection direction, Action< ValueType > method)
Lisää mittarille rajan, jonka yli mentäessä laukaistaan aliohjelma.
Operation AddOverTime(int change, double seconds)
Lisää tietyn summan mittariin tasaisesti tietyn ajan sisällä.
void MultiplyValue(double multiplier)
Kertoo mittarin arvon jollakin. Sama kuin Value-ominaisuuden kertominen, mutta helpompi käyttää tapah...
abstract double RelativeValue
Mittarin suhteellinen arvo (minimi 0, maksimi 1)
IntMeter(int defaultValue, int minValue, int MaxValue)
Operation AddOverTime(double change, double seconds)
Lisää tietyn summan mittariin tasaisesti tietyn ajan sisällä.
ChangeHandler Changed
Tapahtuu, kun mittarin arvo muuttuu.
void ClearTriggers()
Poistaa kaikki raja-arvotapahtumat.
Action Stopped
Tapahtuu kun tehtävä pysäytetään Stop-metodilla.
Action LowerLimit
Tapahtuu, kun mittari saavuttaa pienimmän sallitun arvonsa.
Meter(ValueType defaultVal, ValueType minVal, ValueType maxVal)
Luo uuden mittarin.
void RemoveTriggers(Action method)
Poistaa kaikki raja-arvotapahtumat, jotka kutsuvat tiettyä aliohjelmaa.
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
void Stop()
Pysäyttää AddOverTime-metodilla tehtävät lisäykset mittariin.
DoubleMeter(double defaultValue, double minValue, double maxValue)
DoubleMeter(double defaultValue)
Tehtävä mittarin arvon kasvattamiselle.
Action UpperLimit
Tapahtuu, kun mittari saavuttaa suurimman sallitun arvonsa.
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
void RemoveTriggers(ValueType value)
Poistaa kaikki tietylle arvolle asetetut raja-arvotapahtumat.
Tehtävä mittarin arvon kasvattamiselle.
override String ToString()
Palauttaa mittarin arvon merkkijonona.
void AddTrigger(ValueType value, TriggerDirection direction, Action method)
Lisää mittarille rajan, jonka yli mentäessä laukaistaan aliohjelma.
void AddValue(int change)
Lisää jotain mittarin arvoon. Sama kuin Value-ominaisuuteen lisääminen, mutta helpompi käyttää tapaht...
Meter(Meter< ValueType > src)
Luo uuden mittarin kopiona parametrina annetusta.
IntMeter(int defaultValue)
void AddValue(double change)
Lisää jotain mittarin arvoon. Sama kuin Value-ominaisuuteen lisääminen, mutta helpompi käyttää tapaht...
TriggerDirection
Suunta mittarin muutokselle.
Operation AddOverTime(double change, double seconds, Action onComplete)
Lisää tietyn summan mittariin tasaisesti tietyn ajan sisällä.
void MultiplyValue(double multiplier)
Kertoo mittarin arvon jollakin. Sama kuin Value-ominaisuuden kertominen, mutta helpompi käyttää tapah...
void SetValue(ValueType value)
Asettaa mittarille arvon. Sama kuin Value-ominaisuuteen sijoitus, mutta helpompi käyttää tapahtumakäs...
Action Finished
Tapahtuu kun tehtävä valmistuu. Ei tapahdu, jos tehtävä keskeytetään Stop-aliohjelmalla.
Mittari, joka mittaa erityyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Operation AddOverTime(int change, double seconds, Action onComplete)
Lisää tietyn summan mittariin tasaisesti tietyn ajan sisällä.
void MultiplyValue(int multiplier)
Kertoo mittarin arvon jollakin. Sama kuin Value-ominaisuuden kertominen, mutta helpompi käyttää tapah...
void Reset()
Palauttaa mittarin arvon oletusarvoonsa.