2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
6 using System.Runtime.Serialization;
\r
7 using System.Diagnostics;
\r
12 public delegate void VoidFunc();
\r
16 /// 注意:値の参照は Value プロパティを使ってください。
\r
17 /// 一部のクラスは暗黙的な型変換を実装していますが、
\r
18 /// オプションクラスインスタンス同士の等価比較には気をつけてください。
\r
21 public abstract class COptionBase
\r
23 public EOptionType type;
\r
25 private string _label;
\r
27 /// コンフィグ画面におけるこの項目を表す文字列。
\r
28 /// nullの場合は、代わりにstrnameで名づけられたリソースから文字列を取得します。
\r
34 return (_label == null)? CDTXMania.Instance.Resources.Label(_strname ) : _label;
\r
43 private string _explanation;
\r
46 /// nullの場合は、代わりにstrnameで名づけられたリソースから文字列を取得します。
\r
48 public string explanation
\r
52 return ( _explanation == null ) ? CDTXMania.Instance.Resources.Explanation( _strname ) : _explanation;
\r
56 _explanation = value;
\r
61 private string _strname;
\r
63 /// 文字列の名前。リソースから文字列を取得する場合のkey文字列として使用。
\r
64 /// これがnullの場合は、labelとexplanationに設定された文字列を直接使います。
\r
66 public string strname
\r
80 /// OnEnter で用いる動作。たとえば、この値によってほかのオプションに制約を与える場合などに
\r
81 /// その処理を登録しておけば、値の確定後実行されます。
\r
83 public VoidFunc OnEnterDelegate;
\r
86 /// 決定動作。OnEnterDelegate メンバに動作を登録します。
\r
88 public void OnEnter()
\r
90 if (OnEnterDelegate != null)
\r
97 /// 前の項目値動作。順序付け可能な値からなるオプションは相応に実装する必要があります。
\r
99 public virtual void OnPrevious()
\r
106 public virtual int Index
\r
119 /// OnPrevious の逆順序用。
\r
121 public virtual void OnNext()
\r
128 /// DataContract により XML へのシリアライズ、XML からのデシリアライズが可能です。
\r
130 /// <typeparam name="T">このオプションの型。</typeparam>
\r
132 public abstract class COption<T> : COptionBase
\r
137 public virtual T Value
\r
151 public class COptionBool : COption<bool>
\r
153 public static implicit operator bool (COptionBool b)
\r
158 public override int Index
\r
162 return val ? 1 : 0;
\r
166 public COptionBool(bool init)
\r
171 public override void OnNext()
\r
176 public override void OnPrevious()
\r
181 public override string ToString()
\r
183 CResources cr = CDTXMania.Instance.Resources;
\r
184 return val ? cr.Label("strCfgOn") : cr.Label("strCfgOff");
\r
187 public void Initialize(string lbl, string expl)
\r
190 explanation = expl;
\r
194 public void Initialize( string strname_ )
\r
197 explanation = null;
\r
198 strname = strname_;
\r
203 public class COptionInteger : COption<int>
\r
209 public static implicit operator int (COptionInteger n)
\r
214 public override int Index
\r
222 public COptionInteger(int init)
\r
224 nMin = int.MinValue;
\r
225 nMax = int.MaxValue;
\r
229 public override int Value
\r
238 base.Value = value;
\r
243 private void LimitValue()
\r
255 public override void OnNext()
\r
261 public override void OnPrevious()
\r
267 public Converter<int, string> ValueFormatter;
\r
269 public override string ToString()
\r
272 if (ValueFormatter != null)
\r
274 ret = ValueFormatter(val);
\r
278 ret = val.ToString();
\r
283 public void Initialize(string lbl, string expl, int min = int.MinValue, int max = int.MaxValue, int step = 1)
\r
286 explanation = expl;
\r
292 public void Initialize( string _strname, int min = int.MinValue, int max = int.MaxValue, int step = 1 )
\r
295 explanation = null;
\r
299 strname = _strname;
\r
303 public interface IOptionList
\r
309 public abstract class COptionList<T> : COption<T>, IOptionList
\r
311 protected T[] vals;
\r
313 public int Length { get; protected set; }
\r
315 public T this[int idx]
\r
323 public override T Value
\r
332 base.Value = value;
\r
333 for (int i = 0; i < Length; ++i)
\r
335 if (vals[i].Equals(value))
\r
343 public override int Index
\r
352 if (ptr >= Length) ptr = Length - 1;
\r
353 if (ptr < 0) ptr = 0;
\r
358 public override void OnNext()
\r
368 public override void OnPrevious()
\r
378 public override string ToString()
\r
380 return val.ToString();
\r
387 /// 列挙定数用オプションアイテム。
\r
389 /// <typeparam name="E">
\r
390 /// 列挙型。ただし、列挙型以外を渡してもコンパイル時エラーとならないので注意してください。(where 制約不可)
\r
391 /// また E のメンバに負の値を持つメンバを入れると意図した順番になりません。</typeparam>
\r
393 public class COptionEnum<E> : COptionList<E> where E : struct
\r
395 public static implicit operator E(COptionEnum<E> e)
\r
401 /// リフレクションから列挙定数の集合を取得し、内部ポインタでまわします。
\r
402 /// ※実行時型情報の扱いは基本的に重いので注意してください。
\r
404 public COptionEnum(E init)
\r
409 public void Initialize(string lbl, string expl, Type type)
\r
412 explanation = expl;
\r
414 InitialieMain( type );
\r
416 public void Initialize( string _strname, Type type )
\r
419 explanation = null;
\r
420 strname = _strname;
\r
421 InitialieMain( type );
\r
423 private void InitialieMain( Type type )
\r
425 Length = type.GetEnumValues().Length;
\r
426 vals = new E[Length];
\r
429 foreach (E t in typeof(E).GetEnumValues())
\r
452 public class COptionString : COption<string>
\r
454 public static implicit operator string (COptionString s)
\r
459 public COptionString(string init)
\r
464 public void Initialize(string lbl, string expl)
\r
467 explanation = expl;
\r
470 public void Initialize( string _strname )
\r
473 explanation = null;
\r
474 strname = _strname;
\r
477 public override string ToString()
\r
484 public class COptionStringList : COptionList<string>
\r
486 public COptionStringList(string init)
\r
491 public void Initialize(string lbl, string expl, string[] initvals)
\r
494 explanation = expl;
\r
496 InitializeMain( initvals );
\r
498 public void Initialize( string _strname, string[] initvals )
\r
501 explanation = null;
\r
502 strname = _strname;
\r
503 InitializeMain( initvals );
\r
505 public void InitializeMain( string[] initvals )
\r
507 Length = initvals.Length;
\r
508 vals = new string[Length];
\r
511 foreach (var t in initvals)
\r
534 public class COptionFloat : COption<float>
\r
536 public static implicit operator float (COptionFloat f)
\r
541 public COptionFloat(float init)
\r
546 public void Initialize( string lbl, string expl )
\r
549 explanation = expl;
\r
552 public void Initialize( string _strname )
\r
555 explanation = null;
\r
556 strname = _strname;
\r
559 public override string ToString()
\r
561 return val.ToString();
\r
565 public class COptionLabel : COptionString
\r
567 public COptionLabel(string lbl, string expl)
\r
570 type = EOptionType.Other;
\r
572 explanation = expl;
\r
575 public COptionLabel( string _strname )
\r
578 type = EOptionType.Other;
\r
580 explanation = null;
\r
581 strname = _strname;
\r
586 public class COptionDictionary<K, V> : COption<Dictionary<K, V>>
\r
598 public class COptionKeyAssign : COption<CKeyAssign>
\r
600 public EInputDevice 入力デバイス
\r
604 return Value.InputDevice;
\r
608 Value.InputDevice = value;
\r
632 Value.Code = value;
\r
636 public COptionKeyAssign()
\r
638 val = new CKeyAssign(EInputDevice.Unknown, 0, 0);
\r
641 public void Reset()
\r
643 Value.InputDevice = EInputDevice.Unknown;
\r
648 public void CopyFrom(CKeyAssign t)
\r
650 Value.InputDevice = t.InputDevice;
\r
652 Value.Code = t.Code;
\r
657 public class COptionPadBool : STPadValue<COptionBool>
\r
659 private bool DetermineAssignValue(EThreeState state)
\r
661 return state == EThreeState.On ? true : state == EThreeState.Off ? false : false;
\r
664 public bool bIsAutoHH
\r
668 return !LC && HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && HHO;
\r
672 public bool bIsAutoBD
\r
676 return !LC && !HH && !SD && BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
680 public bool bIsAutoNeck(EPart e)
\r
683 if (e == EPart.Guitar)
\r
685 ret = GtR && GtG && GtB && !GtPick;
\r
687 else if (e == EPart.Bass)
\r
689 ret = BsR && BsG && BsB && !BsPick;
\r
694 public bool bIsAutoPick(EPart e)
\r
697 if (e == EPart.Guitar)
\r
699 ret = !GtR && !GtG && !GtB && GtPick;
\r
701 else if (e == EPart.Bass)
\r
703 ret = !BsR && !BsG && !BsB && BsPick;
\r
708 public void SetAutoHH()
\r
710 Set(EPart.Drums, EThreeState.Off);
\r
714 public void SetAutoBD()
\r
716 Set(EPart.Drums, EThreeState.Off);
\r
720 public void SetAutoPick(EPart e)
\r
722 Set(e, EThreeState.Off);
\r
723 if (e == EPart.Drums)
\r
725 GtPick.Value = true;
\r
727 else if (e == EPart.Bass)
\r
729 BsPick.Value = true;
\r
733 public void SetAutoNeck(EPart e)
\r
735 Set(e, EThreeState.Off);
\r
736 if (e == EPart.Drums)
\r
742 else if (e == EPart.Bass)
\r
750 public void Set(EPart e, EThreeState state)
\r
752 bool val = DetermineAssignValue(state);
\r
753 if (EThreeState.X != state)
\r
755 if (e == EPart.Drums)
\r
757 LC.Value = HH.Value = HHO.Value = SD.Value =
\r
758 BD.Value = HT.Value = LT.Value = FT.Value = CY.Value = RD.Value = val;
\r
760 else if (e == EPart.Guitar)
\r
762 GtR.Value = GtG.Value = GtB.Value = GtPick.Value = GtWail.Value = val;
\r
764 else if (e == EPart.Bass)
\r
766 BsR.Value = BsG.Value = BsB.Value = BsPick.Value = BsWail.Value = val;
\r
771 public bool IsAllFalse(EPart x)
\r
774 if (x == EPart.Guitar)
\r
776 ret = !GtR && !GtG && !GtB && !GtPick && !GtWail;
\r
778 else if (x == EPart.Bass)
\r
780 ret = !BsR && !BsG && !BsB && !BsPick && !BsWail;
\r
782 else if (x == EPart.Drums)
\r
784 ret = !LC && !HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
789 public bool IsAllTrue(EPart x)
\r
792 if (x == EPart.Guitar)
\r
794 ret = GtR && GtG && GtB && GtPick && GtWail;
\r
796 else if (x == EPart.Bass)
\r
798 ret = BsR && BsG && BsB && BsPick && BsWail;
\r
800 else if (x == EPart.Drums)
\r
802 ret = LC && HH && SD && BD && HT && LT && FT && CY && RD && HHO;
\r