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
257 IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
\r
258 if ( keyboard.bキーが押されている( (int) SharpDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SharpDX.DirectInput.Key.RightControl ) )
\r
269 public override void OnPrevious()
\r
271 IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
\r
272 if ( keyboard.bキーが押されている( (int) SharpDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SharpDX.DirectInput.Key.RightControl ) )
\r
283 public Converter<int, string> ValueFormatter;
\r
285 public override string ToString()
\r
288 if (ValueFormatter != null)
\r
290 ret = ValueFormatter(val);
\r
294 ret = val.ToString();
\r
299 public void Initialize(string lbl, string expl, int min = int.MinValue, int max = int.MaxValue, int step = 1)
\r
302 explanation = expl;
\r
308 public void Initialize( string _strname, int min = int.MinValue, int max = int.MaxValue, int step = 1 )
\r
311 explanation = null;
\r
315 strname = _strname;
\r
319 public interface IOptionList
\r
325 public abstract class COptionList<T> : COption<T>, IOptionList
\r
327 protected T[] vals;
\r
329 public int Length { get; protected set; }
\r
331 public T this[int idx]
\r
339 public override T Value
\r
348 base.Value = value;
\r
349 for (int i = 0; i < Length; ++i)
\r
351 if (vals[i].Equals(value))
\r
359 public override int Index
\r
368 if (ptr >= Length) ptr = Length - 1;
\r
369 if (ptr < 0) ptr = 0;
\r
374 public override void OnNext()
\r
384 public override void OnPrevious()
\r
394 public override string ToString()
\r
396 return val.ToString();
\r
403 /// 列挙定数用オプションアイテム。
\r
405 /// <typeparam name="E">
\r
406 /// 列挙型。ただし、列挙型以外を渡してもコンパイル時エラーとならないので注意してください。(where 制約不可)
\r
407 /// また E のメンバに負の値を持つメンバを入れると意図した順番になりません。</typeparam>
\r
409 public class COptionEnum<E> : COptionList<E> where E : struct
\r
411 public static implicit operator E(COptionEnum<E> e)
\r
417 /// リフレクションから列挙定数の集合を取得し、内部ポインタでまわします。
\r
418 /// ※実行時型情報の扱いは基本的に重いので注意してください。
\r
420 public COptionEnum(E init)
\r
425 public void Initialize(string lbl, string expl, Type type)
\r
428 explanation = expl;
\r
430 InitialieMain( type );
\r
432 public void Initialize( string _strname, Type type )
\r
435 explanation = null;
\r
436 strname = _strname;
\r
437 InitialieMain( type );
\r
439 private void InitialieMain( Type type )
\r
441 Length = type.GetEnumValues().Length;
\r
442 vals = new E[Length];
\r
445 foreach (E t in typeof(E).GetEnumValues())
\r
468 public class COptionString : COption<string>
\r
470 public static implicit operator string (COptionString s)
\r
475 public COptionString(string init)
\r
480 public void Initialize(string lbl, string expl)
\r
483 explanation = expl;
\r
486 public void Initialize( string _strname )
\r
489 explanation = null;
\r
490 strname = _strname;
\r
493 public override string ToString()
\r
500 public class COptionStringList : COptionList<string>
\r
502 public COptionStringList(string init)
\r
507 public void Initialize(string lbl, string expl, string[] initvals)
\r
510 explanation = expl;
\r
512 InitializeMain( initvals );
\r
514 public void Initialize( string _strname, string[] initvals )
\r
517 explanation = null;
\r
518 strname = _strname;
\r
519 InitializeMain( initvals );
\r
521 public void InitializeMain( string[] initvals )
\r
523 Length = initvals.Length;
\r
524 vals = new string[Length];
\r
527 foreach (var t in initvals)
\r
550 public class COptionFloat : COption<float>
\r
552 public static implicit operator float (COptionFloat f)
\r
557 public COptionFloat(float init)
\r
562 public void Initialize( string lbl, string expl )
\r
565 explanation = expl;
\r
568 public void Initialize( string _strname )
\r
571 explanation = null;
\r
572 strname = _strname;
\r
575 public override string ToString()
\r
577 return val.ToString();
\r
581 public class COptionLabel : COptionString
\r
583 public COptionLabel(string lbl, string expl)
\r
586 type = EOptionType.Other;
\r
588 explanation = expl;
\r
591 public COptionLabel( string _strname )
\r
594 type = EOptionType.Other;
\r
596 explanation = null;
\r
597 strname = _strname;
\r
602 public class COptionDictionary<K, V> : COption<Dictionary<K, V>>
\r
614 public class COptionKeyAssign : COption<CKeyAssign>
\r
616 public EInputDevice 入力デバイス
\r
620 return Value.InputDevice;
\r
624 Value.InputDevice = value;
\r
648 Value.Code = value;
\r
652 public COptionKeyAssign()
\r
654 val = new CKeyAssign(EInputDevice.Unknown, 0, 0);
\r
657 public void Reset()
\r
659 Value.InputDevice = EInputDevice.Unknown;
\r
664 public void CopyFrom(CKeyAssign t)
\r
666 Value.InputDevice = t.InputDevice;
\r
668 Value.Code = t.Code;
\r
673 public class COptionPadBool : STPadValue<COptionBool>
\r
675 private bool DetermineAssignValue(EThreeState state)
\r
677 return state == EThreeState.On ? true : state == EThreeState.Off ? false : false;
\r
680 public bool bIsAutoHH
\r
684 return !LC && HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && HHO;
\r
688 public bool bIsAutoBD
\r
692 return !LC && !HH && !SD && BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
696 public bool bIsAutoNeck(EPart e)
\r
699 if (e == EPart.Guitar)
\r
701 ret = GtR && GtG && GtB && !GtPick;
\r
703 else if (e == EPart.Bass)
\r
705 ret = BsR && BsG && BsB && !BsPick;
\r
710 public bool bIsAutoPick(EPart e)
\r
713 if (e == EPart.Guitar)
\r
715 ret = !GtR && !GtG && !GtB && GtPick;
\r
717 else if (e == EPart.Bass)
\r
719 ret = !BsR && !BsG && !BsB && BsPick;
\r
724 public void SetAutoHH()
\r
726 Set(EPart.Drums, EThreeState.Off);
\r
730 public void SetAutoBD()
\r
732 Set(EPart.Drums, EThreeState.Off);
\r
736 public void SetAutoPick(EPart e)
\r
738 Set(e, EThreeState.Off);
\r
739 if (e == EPart.Drums)
\r
741 GtPick.Value = true;
\r
743 else if (e == EPart.Bass)
\r
745 BsPick.Value = true;
\r
749 public void SetAutoNeck(EPart e)
\r
751 Set(e, EThreeState.Off);
\r
752 if (e == EPart.Drums)
\r
758 else if (e == EPart.Bass)
\r
766 public void Set(EPart e, EThreeState state)
\r
768 bool val = DetermineAssignValue(state);
\r
769 if (EThreeState.X != state)
\r
771 if (e == EPart.Drums)
\r
773 LC.Value = HH.Value = HHO.Value = SD.Value =
\r
774 BD.Value = HT.Value = LT.Value = FT.Value = CY.Value = RD.Value = val;
\r
776 else if (e == EPart.Guitar)
\r
778 GtR.Value = GtG.Value = GtB.Value = GtPick.Value = GtWail.Value = val;
\r
780 else if (e == EPart.Bass)
\r
782 BsR.Value = BsG.Value = BsB.Value = BsPick.Value = BsWail.Value = val;
\r
787 public bool IsAllFalse(EPart x)
\r
790 if (x == EPart.Guitar)
\r
792 ret = !GtR && !GtG && !GtB && !GtPick && !GtWail;
\r
794 else if (x == EPart.Bass)
\r
796 ret = !BsR && !BsG && !BsB && !BsPick && !BsWail;
\r
798 else if (x == EPart.Drums)
\r
800 ret = !LC && !HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
805 public bool IsAllTrue(EPart x)
\r
808 if (x == EPart.Guitar)
\r
810 ret = GtR && GtG && GtB && GtPick && GtWail;
\r
812 else if (x == EPart.Bass)
\r
814 ret = BsR && BsG && BsB && BsPick && BsWail;
\r
816 else if (x == EPart.Drums)
\r
818 ret = LC && HH && SD && BD && HT && LT && FT && CY && RD && HHO;
\r