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 /// コンフィグ画面におけるこの項目を表す文字列。
\r
27 public string label;
\r
30 /// 説明。Properties.Resources から取得してください。
\r
32 public string explanation;
\r
35 /// OnEnter で用いる動作。たとえば、この値によってほかのオプションに制約を与える場合などに
\r
36 /// その処理を登録しておけば、値の確定後実行されます。
\r
38 public VoidFunc OnEnterDelegate;
\r
41 /// 決定動作。OnEnterDelegate メンバに動作を登録します。
\r
43 public void OnEnter()
\r
45 if (OnEnterDelegate != null)
\r
52 /// 前の項目値動作。順序付け可能な値からなるオプションは相応に実装する必要があります。
\r
54 public virtual void OnPrevious()
\r
61 public virtual int Index
\r
74 /// OnPrevious の逆順序用。
\r
76 public virtual void OnNext()
\r
83 /// DataContract により XML へのシリアライズ、XML からのデシリアライズが可能です。
\r
85 /// <typeparam name="T">このオプションの型。</typeparam>
\r
87 public abstract class COption<T> : COptionBase
\r
92 public virtual T Value
\r
106 public class COptionBool : COption<bool>
\r
108 public static implicit operator bool (COptionBool b)
\r
113 public override int Index
\r
117 return val ? 1 : 0;
\r
121 public COptionBool(bool init)
\r
126 public override void OnNext()
\r
131 public override void OnPrevious()
\r
136 public override string ToString()
\r
138 CResources cr = CDTXMania.Instance.Resources;
\r
139 return val ? cr.Label("strCfgOn") : cr.Label("strCfgOff");
\r
142 public void Initialize(string lbl, string expl)
\r
145 explanation = expl;
\r
150 public class COptionInteger : COption<int>
\r
156 public static implicit operator int (COptionInteger n)
\r
161 public override int Index
\r
169 public COptionInteger(int init)
\r
171 nMin = int.MinValue;
\r
172 nMax = int.MaxValue;
\r
176 public override int Value
\r
185 base.Value = value;
\r
190 private void LimitValue()
\r
202 public override void OnNext()
\r
208 public override void OnPrevious()
\r
214 public Converter<int, string> ValueFormatter;
\r
216 public override string ToString()
\r
219 if (ValueFormatter != null)
\r
221 ret = ValueFormatter(val);
\r
225 ret = val.ToString();
\r
230 public void Initialize(string lbl, string expl, int min = int.MinValue, int max = int.MaxValue, int step = 1)
\r
233 explanation = expl;
\r
240 public interface IOptionList
\r
246 public abstract class COptionList<T> : COption<T>, IOptionList
\r
248 protected T[] vals;
\r
250 public int Length { get; protected set; }
\r
252 public T this[int idx]
\r
260 public override T Value
\r
269 base.Value = value;
\r
270 for (int i = 0; i < Length; ++i)
\r
272 if (vals[i].Equals(value))
\r
280 public override int Index
\r
289 if (ptr >= Length) ptr = Length - 1;
\r
290 if (ptr < 0) ptr = 0;
\r
295 public override void OnNext()
\r
305 public override void OnPrevious()
\r
315 public override string ToString()
\r
317 return val.ToString();
\r
324 /// 列挙定数用オプションアイテム。
\r
326 /// <typeparam name="E">
\r
327 /// 列挙型。ただし、列挙型以外を渡してもコンパイル時エラーとならないので注意してください。(where 制約不可)
\r
328 /// また E のメンバに負の値を持つメンバを入れると意図した順番になりません。</typeparam>
\r
330 public class COptionEnum<E> : COptionList<E> where E : struct
\r
332 public static implicit operator E(COptionEnum<E> e)
\r
338 /// リフレクションから列挙定数の集合を取得し、内部ポインタでまわします。
\r
339 /// ※実行時型情報の扱いは基本的に重いので注意してください。
\r
341 public COptionEnum(E init)
\r
346 public void Initialize(string lbl, string expl, Type type)
\r
349 explanation = expl;
\r
351 Length = type.GetEnumValues().Length;
\r
352 vals = new E[Length];
\r
355 foreach (E t in typeof(E).GetEnumValues())
\r
378 public class COptionString : COption<string>
\r
380 public static implicit operator string (COptionString s)
\r
385 public COptionString(string init)
\r
390 public void Initialize(string lbl, string expl)
\r
393 explanation = expl;
\r
396 public override string ToString()
\r
403 public class COptionStringList : COptionList<string>
\r
405 public COptionStringList(string init)
\r
410 public void Initialize(string lbl, string expl, string[] initvals)
\r
413 explanation = expl;
\r
415 Length = initvals.Length;
\r
416 vals = new string[Length];
\r
419 foreach (var t in initvals)
\r
442 public class COptionFloat : COption<float>
\r
444 public static implicit operator float (COptionFloat f)
\r
449 public COptionFloat(float init)
\r
454 public void Initialize(string lbl, string expl)
\r
457 explanation = expl;
\r
460 public override string ToString()
\r
462 return val.ToString();
\r
466 public class COptionLabel : COptionString
\r
468 public COptionLabel(string lbl, string expl)
\r
471 type = EOptionType.Other;
\r
473 explanation = expl;
\r
478 public class COptionDictionary<K, V> : COption<Dictionary<K, V>>
\r
490 public class COptionKeyAssign : COption<CKeyAssign>
\r
492 public EInputDevice 入力デバイス
\r
496 return Value.InputDevice;
\r
500 Value.InputDevice = value;
\r
524 Value.Code = value;
\r
528 public COptionKeyAssign()
\r
530 val = new CKeyAssign(EInputDevice.Unknown, 0, 0);
\r
533 public void Reset()
\r
535 Value.InputDevice = EInputDevice.Unknown;
\r
540 public void CopyFrom(CKeyAssign t)
\r
542 Value.InputDevice = t.InputDevice;
\r
544 Value.Code = t.Code;
\r
549 public class COptionPadBool : STPadValue<COptionBool>
\r
551 private bool DetermineAssignValue(EThreeState state)
\r
553 return state == EThreeState.On ? true : state == EThreeState.Off ? false : false;
\r
556 public bool bIsAutoHH
\r
560 return !LC && HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && HHO;
\r
564 public bool bIsAutoBD
\r
568 return !LC && !HH && !SD && BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
572 public bool bIsAutoNeck(EPart e)
\r
575 if (e == EPart.Guitar)
\r
577 ret = GtR && GtG && GtB && !GtPick;
\r
579 else if (e == EPart.Bass)
\r
581 ret = BsR && BsG && BsB && !BsPick;
\r
586 public bool bIsAutoPick(EPart e)
\r
589 if (e == EPart.Guitar)
\r
591 ret = !GtR && !GtG && !GtB && GtPick;
\r
593 else if (e == EPart.Bass)
\r
595 ret = !BsR && !BsG && !BsB && BsPick;
\r
600 public void SetAutoHH()
\r
602 Set(EPart.Drums, EThreeState.Off);
\r
606 public void SetAutoBD()
\r
608 Set(EPart.Drums, EThreeState.Off);
\r
612 public void SetAutoPick(EPart e)
\r
614 Set(e, EThreeState.Off);
\r
615 if (e == EPart.Drums)
\r
617 GtPick.Value = true;
\r
619 else if (e == EPart.Bass)
\r
621 BsPick.Value = true;
\r
625 public void SetAutoNeck(EPart e)
\r
627 Set(e, EThreeState.Off);
\r
628 if (e == EPart.Drums)
\r
634 else if (e == EPart.Bass)
\r
642 public void Set(EPart e, EThreeState state)
\r
644 bool val = DetermineAssignValue(state);
\r
645 if (EThreeState.X != state)
\r
647 if (e == EPart.Drums)
\r
649 LC.Value = HH.Value = HHO.Value = SD.Value =
\r
650 BD.Value = HT.Value = LT.Value = FT.Value = CY.Value = RD.Value = val;
\r
652 else if (e == EPart.Guitar)
\r
654 GtR.Value = GtG.Value = GtB.Value = GtPick.Value = GtWail.Value = val;
\r
656 else if (e == EPart.Bass)
\r
658 BsR.Value = BsG.Value = BsB.Value = BsPick.Value = BsWail.Value = val;
\r
663 public bool IsAllFalse(EPart x)
\r
666 if (x == EPart.Guitar)
\r
668 ret = !GtR && !GtG && !GtB && !GtPick && !GtWail;
\r
670 else if (x == EPart.Bass)
\r
672 ret = !BsR && !BsG && !BsB && !BsPick && !BsWail;
\r
674 else if (x == EPart.Drums)
\r
676 ret = !LC && !HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
681 public bool IsAllTrue(EPart x)
\r
684 if (x == EPart.Guitar)
\r
686 ret = GtR && GtG && GtB && GtPick && GtWail;
\r
688 else if (x == EPart.Bass)
\r
690 ret = BsR && BsG && BsB && BsPick && BsWail;
\r
692 else if (x == EPart.Drums)
\r
694 ret = LC && HH && SD && BD && HT && LT && FT && CY && RD && HHO;
\r