2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
6 using System.Runtime.Serialization;
\r
11 public delegate void VoidFunc();
\r
15 /// 注意:値の参照は Value プロパティを使ってください。
\r
16 /// 一部のクラスは暗黙的な型変換を実装していますが、
\r
17 /// オプションクラスインスタンス同士の等価比較には気をつけてください。
\r
20 public abstract class COptionBase
\r
22 public EOptionType type;
\r
24 /// コンフィグ画面におけるこの項目を表す文字列。
\r
26 public string label;
\r
29 /// 説明。Properties.Resources から取得してください。
\r
31 public string explanation;
\r
34 /// OnEnter で用いる動作。たとえば、この値によってほかのオプションに制約を与える場合などに
\r
35 /// その処理を登録しておけば、値の確定後実行されます。
\r
37 public VoidFunc OnEnterDelegate;
\r
40 /// 決定動作。OnEnterDelegate メンバに動作を登録します。
\r
42 public void OnEnter()
\r
44 if (OnEnterDelegate != null)
\r
51 /// 前の項目値動作。順序付け可能な値からなるオプションは相応に実装する必要があります。
\r
53 public virtual void OnPrevious()
\r
60 public virtual int Index
\r
73 /// OnPrevious の逆順序用。
\r
75 public virtual void OnNext()
\r
82 /// DataContract により XML へのシリアライズ、XML からのデシリアライズが可能です。
\r
84 /// <typeparam name="T">このオプションの型。</typeparam>
\r
86 public abstract class COption<T> : COptionBase
\r
91 public virtual T Value
\r
105 public class COptionBool : COption<bool>
\r
107 public static implicit operator bool (COptionBool b)
\r
112 public override int Index
\r
116 return val ? 1 : 0;
\r
120 public COptionBool(bool init)
\r
125 public override void OnNext()
\r
130 public override void OnPrevious()
\r
135 public override string ToString()
\r
137 return val ? "On" : "Off";
\r
140 public void Initialize(string lbl, string expl)
\r
143 explanation = expl;
\r
148 public class COptionInteger : COption<int>
\r
154 public static implicit operator int (COptionInteger n)
\r
159 public override int Index
\r
167 public COptionInteger(int init)
\r
169 nMin = int.MinValue;
\r
170 nMax = int.MaxValue;
\r
174 public override int Value
\r
183 base.Value = value;
\r
188 private void LimitValue()
\r
200 public override void OnNext()
\r
206 public override void OnPrevious()
\r
212 public Converter<int, string> ValueFormatter;
\r
214 public override string ToString()
\r
217 if (ValueFormatter != null)
\r
219 ret = ValueFormatter(val);
\r
223 ret = val.ToString();
\r
228 public void Initialize(string lbl, string expl, int min = int.MinValue, int max = int.MaxValue, int step = 1)
\r
231 explanation = expl;
\r
238 public interface IOptionList
\r
244 public abstract class COptionList<T> : COption<T>, IOptionList
\r
246 protected T[] vals;
\r
248 public int Length { get; protected set; }
\r
250 public T this[int idx]
\r
258 public override T Value
\r
267 base.Value = value;
\r
268 for (int i = 0; i < Length; ++i)
\r
270 if (vals[i].Equals(value))
\r
278 public override int Index
\r
287 if (ptr >= Length) ptr = Length - 1;
\r
288 if (ptr < 0) ptr = 0;
\r
292 public override void OnNext()
\r
302 public override void OnPrevious()
\r
312 public override string ToString()
\r
314 return val.ToString();
\r
321 /// 列挙定数用オプションアイテム。
\r
323 /// <typeparam name="E">
\r
324 /// 列挙型。ただし、列挙型以外を渡してもコンパイル時エラーとならないので注意してください。(where 制約不可)
\r
325 /// また E のメンバに負の値を持つメンバを入れると意図した順番になりません。</typeparam>
\r
327 public class COptionEnum<E> : COptionList<E> where E : struct
\r
329 public static implicit operator E(COptionEnum<E> e)
\r
335 /// リフレクションから列挙定数の集合を取得し、内部ポインタでまわします。
\r
336 /// ※実行時型情報の扱いは基本的に重いので注意してください。
\r
338 public COptionEnum(E init)
\r
343 public void Initialize(string lbl, string expl, Type type)
\r
346 explanation = expl;
\r
348 Length = type.GetEnumValues().Length;
\r
349 vals = new E[Length];
\r
352 foreach (E t in typeof(E).GetEnumValues())
\r
375 public class COptionString : COption<string>
\r
377 public static implicit operator string (COptionString s)
\r
382 public COptionString(string init)
\r
387 public void Initialize(string lbl, string expl)
\r
390 explanation = expl;
\r
393 public override string ToString()
\r
400 public class COptionStringList : COptionList<string>
\r
402 public COptionStringList(string init)
\r
407 public void Initialize(string lbl, string expl, string[] initvals)
\r
410 explanation = expl;
\r
412 Length = initvals.Length;
\r
413 vals = new string[Length];
\r
416 foreach (var t in initvals)
\r
439 public class COptionFloat : COption<float>
\r
441 public static implicit operator float (COptionFloat f)
\r
446 public COptionFloat(float init)
\r
451 public void Initialize(string lbl, string expl)
\r
454 explanation = expl;
\r
457 public override string ToString()
\r
459 return val.ToString();
\r
463 public class COptionLabel : COptionString
\r
465 public COptionLabel(string lbl, string expl)
\r
468 type = EOptionType.Other;
\r
470 explanation = expl;
\r
475 public class COptionDictionary<K, V> : COption<Dictionary<K, V>>
\r
487 public class COptionKeyAssign : COption<CKeyAssign>
\r
489 public EInputDevice 入力デバイス
\r
493 return Value.InputDevice;
\r
497 Value.InputDevice = value;
\r
521 Value.Code = value;
\r
525 public COptionKeyAssign()
\r
527 val = new CKeyAssign(EInputDevice.Unknown, 0, 0);
\r
530 public void Reset()
\r
532 Value.InputDevice = EInputDevice.Unknown;
\r
537 public void CopyFrom(CKeyAssign t)
\r
539 Value.InputDevice = t.InputDevice;
\r
541 Value.Code = t.Code;
\r
546 public class COptionPadBool : STPadValue<COptionBool>
\r
548 private bool DetermineAssignValue(EThreeState state)
\r
550 return state == EThreeState.On ? true : state == EThreeState.Off ? false : false;
\r
553 public bool bIsAutoHH
\r
557 return !LC && HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && HHO;
\r
561 public bool bIsAutoBD
\r
565 return !LC && !HH && !SD && BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
569 public bool bIsAutoNeck(EPart e)
\r
572 if (e == EPart.Guitar)
\r
574 ret = GtR && GtG && GtB && !GtPick;
\r
576 else if (e == EPart.Bass)
\r
578 ret = BsR && BsG && BsB && !BsPick;
\r
583 public bool bIsAutoPick(EPart e)
\r
586 if (e == EPart.Guitar)
\r
588 ret = !GtR && !GtG && !GtB && GtPick;
\r
590 else if (e == EPart.Bass)
\r
592 ret = !BsR && !BsG && !BsB && BsPick;
\r
597 public void SetAutoHH()
\r
599 Set(EPart.Drums, EThreeState.Off);
\r
603 public void SetAutoBD()
\r
605 Set(EPart.Drums, EThreeState.Off);
\r
609 public void SetAutoPick(EPart e)
\r
611 Set(e, EThreeState.Off);
\r
612 if (e == EPart.Drums)
\r
614 GtPick.Value = true;
\r
616 else if (e == EPart.Bass)
\r
618 BsPick.Value = true;
\r
622 public void SetAutoNeck(EPart e)
\r
624 Set(e, EThreeState.Off);
\r
625 if (e == EPart.Drums)
\r
631 else if (e == EPart.Bass)
\r
639 public void Set(EPart e, EThreeState state)
\r
641 bool val = DetermineAssignValue(state);
\r
642 if (EThreeState.X != state)
\r
644 if (e == EPart.Drums)
\r
646 LC.Value = HH.Value = HHO.Value = SD.Value =
\r
647 BD.Value = HT.Value = LT.Value = FT.Value = CY.Value = RD.Value = val;
\r
649 else if (e == EPart.Guitar)
\r
651 GtR.Value = GtG.Value = GtB.Value = GtPick.Value = GtWail.Value = val;
\r
653 else if (e == EPart.Bass)
\r
655 BsR.Value = BsG.Value = BsB.Value = BsPick.Value = BsWail.Value = val;
\r
660 public bool IsAllFalse(EPart x)
\r
663 if (x == EPart.Guitar)
\r
665 ret = !GtR && !GtG && !GtB && !GtPick && !GtWail;
\r
667 else if (x == EPart.Bass)
\r
669 ret = !BsR && !BsG && !BsB && !BsPick && !BsWail;
\r
671 else if (x == EPart.Drums)
\r
673 ret = !LC && !HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && !HHO;
\r
678 public bool IsAllTrue(EPart x)
\r
681 if (x == EPart.Guitar)
\r
683 ret = GtR && GtG && GtB && GtPick && GtWail;
\r
685 else if (x == EPart.Bass)
\r
687 ret = BsR && BsG && BsB && BsPick && BsWail;
\r
689 else if (x == EPart.Drums)
\r
691 ret = LC && HH && SD && BD && HT && LT && FT && CY && RD && HHO;
\r