OSDN Git Service

#37271 ドラムとギター/ベースの最大同時発音数を独立して設定できるようにした。CONFIGURATION/System/Sound Option/Polyphoni...
[dtxmania/dtxmania.git] / DTXMania / コード / ステージ / 04.コンフィグ / CActConfigList.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Text;
5 using System.Drawing;
6 using System.Threading;
7 using SharpDX;
8 using FDK;
9 using System.IO;
10
11 using Color = System.Drawing.Color;
12 using Point = System.Drawing.Point;
13 using Rectangle = System.Drawing.Rectangle;
14
15 namespace DTXMania
16 {
17         internal class CActConfigList : CActivity
18         {
19                 STDGBSValue<COptionLabel> ReturnToMenu;
20                 STDGBSValue<COptionLabel> KeyAssignMenu;
21                 STDGBSValue<COptionLabel> DisplayMenu;
22                 STDGBSValue<COptionLabel> EDrumsMenu;
23                 COptionLabel SoundMenu;
24                 COptionLabel HitRangeMenu;
25                 COptionStringList skins;
26
27                 bool b項目リスト側にフォーカスがある;
28                 bool b要素値にフォーカス中;
29                 CCounter ct三角矢印アニメ;
30                 Eメニュー種別 eメニュー種別;
31                 // #33689 2014.6.17 yyagi
32                 bool InitialUseOSTimer;
33                 bool InitialWASAPIEventDriven;
34                 ESoundDeviceTypeForConfig InitialSystemSoundType;
35                 int InitialWASAPIBufferSizeMs;
36                 int InitialASIODevice;
37                 bool InitialForceHighPower;
38                 List<COptionBase> list項目リスト;
39                 long nスクロール用タイマ値;
40                 int n現在のスクロールカウンタ;
41                 int n目標のスクロールカウンタ;
42                 Point[] ptパネルの基本座標 = new Point[]
43                 {
44                         new Point(0x12d, 3), new Point(0x12d, 0x35), new Point(0x12d, 0x67),
45                         new Point(0x12d, 0x99), new Point(0x114, 0xcb), new Point(0x12d, 0xfd),
46                         new Point(0x12d, 0x12f), new Point(0x12d, 0x161), new Point(0x12d, 0x193),
47                         new Point(0x12d, 0x1c5)
48                 };
49                 CTextureAf txその他項目行パネル;
50                 CTexture tx三角矢印;
51                 CTextureAf tx通常項目行パネル;
52                 // #28195 2012.5.2 yyagi
53                 CTexture txSkinSample;
54                 string[] skinSubFolders;
55                 string[] skinNames;
56                 string skinInitial;
57                 CPrivateFastFont prvFont;
58                 private struct stMenuItemRight
59                 {
60                         public CTexture txMenuItemRight;
61                         public int nParam;
62                         public string strParam;
63                         public CTexture txParam;
64                         public CTexture txParamColored;
65                 }
66                 stMenuItemRight[] listMenu;
67
68                 /// <summary>
69                 /// #32059 2013.9.17 yyagi
70                 /// </summary>
71                 public bool bIsFocusingParameter
72                 {
73                         get
74                         {
75                                 return b要素値にフォーカス中;
76                         }
77                 }
78
79                 public bool b現在選択されている項目はReturnToMenuである
80                 {
81                         get
82                         {
83                                 COptionBase sel = this.list項目リスト[this.n現在の選択項目];
84                                 bool ret = false;
85                                 for (EPart i = EPart.Drums; i <= EPart.System; ++i)
86                                 {
87                                         if (sel == ReturnToMenu[i])
88                                         {
89                                                 ret = true;
90                                         }
91                                 }
92                                 return ret;
93                         }
94                 }
95
96                 public bool b楽器またはシステム用メニューである
97                 {
98                         get
99                         {
100                                 return eメニュー種別 == Eメニュー種別.Bass || eメニュー種別 == Eメニュー種別.Drums || eメニュー種別 == Eメニュー種別.Guitar || eメニュー種別 == Eメニュー種別.System;
101                         }
102                 }
103
104                 public COptionBase ib現在の選択項目
105                 {
106                         get
107                         {
108                                 return this.list項目リスト[this.n現在の選択項目];
109                         }
110                 }
111
112                 public int n現在の選択項目;
113
114                 /// <summary>
115                 /// ESC押下時の右メニュー描画
116                 /// </summary>
117                 public void tEsc押下()
118                 {
119                         if (this.b要素値にフォーカス中)
120                         {
121                                 // #32059 2013.9.17 add yyagi
122                                 this.b要素値にフォーカス中 = false;
123                         }
124
125                         if (this.eメニュー種別 == Eメニュー種別.KeyAssignSystem)
126                         {
127                                 t項目リストの設定(Eメニュー種別.System);
128                         }
129                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignDrums)
130                         {
131                                 t項目リストの設定(Eメニュー種別.Drums);
132                         }
133                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignGuitar)
134                         {
135                                 t項目リストの設定(Eメニュー種別.Guitar);
136                         }
137                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignBass)
138                         {
139                                 t項目リストの設定(Eメニュー種別.Bass);
140                         }
141                         if (this.eメニュー種別 == Eメニュー種別.DisplaySystem)
142                         {
143                                 t項目リストの設定(Eメニュー種別.System);
144                         }
145                         else if (this.eメニュー種別 == Eメニュー種別.DisplayDrums)
146                         {
147                                 t項目リストの設定(Eメニュー種別.Drums);
148                         }
149                         else if (this.eメニュー種別 == Eメニュー種別.DisplayGuitar)
150                         {
151                                 t項目リストの設定(Eメニュー種別.Guitar);
152                         }
153                         else if (this.eメニュー種別 == Eメニュー種別.DisplayBass)
154                         {
155                                 t項目リストの設定(Eメニュー種別.Bass);
156                         }
157                         else if (this.eメニュー種別 == Eメニュー種別.EDrumsSettings)
158                         {
159                                 t項目リストの設定(Eメニュー種別.Drums);
160                         }
161                         else if (this.eメニュー種別 == Eメニュー種別.HitRangeSettings)
162                         {
163                                 t項目リストの設定(Eメニュー種別.System);
164                         }
165                         else if ( this.eメニュー種別 == Eメニュー種別.SoundSettings)
166                         {
167                                 t項目リストの設定(Eメニュー種別.System);
168                         }
169                 }
170
171                 public bool tEnter押下()
172                 {
173                         bool ret = false;
174                         CDTXMania.Instance.Skin.sound決定音.t再生する();
175
176                         if (this.b要素値にフォーカス中)
177                         {
178                                 this.b要素値にフォーカス中 = false;
179                         }
180                         else if (this.list項目リスト[this.n現在の選択項目] is COptionInteger)
181                         {
182                                 this.b要素値にフォーカス中 = true;
183                         }
184                         else if (this.list項目リスト[this.n現在の選択項目] is IOptionList || this.list項目リスト[this.n現在の選択項目] is COptionBool)
185                         {
186                                 this.list項目リスト[this.n現在の選択項目].OnNext();
187                         }
188
189                         // #27029 2012.1.5 from
190                         if (
191                                         CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.Group &&
192                                         (
193                                         (this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.eHHGroup ||
194                                          this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH)))
195                         {
196                                 // 変更禁止(何もしない)
197                         }
198                         else
199                         {
200                                 if (b現在選択されている項目はReturnToMenuである && b楽器またはシステム用メニューである)
201                                 {
202                                         ret = true;
203                                 }
204                                 this.list項目リスト[this.n現在の選択項目].OnEnter();
205                         }
206                         return ret;
207                 }
208
209                 private void tGenerateSkinSample()
210                 {
211                         string path = skinSubFolders[skins.Index];
212                         path = System.IO.Path.Combine(path, @"Graphics\ScreenTitle background.jpg");
213                         using (Bitmap bmSrc = new Bitmap(path))
214                         {
215                                 using (Bitmap bmDest = new Bitmap(bmSrc.Width / 4, bmSrc.Height / 4))
216                                 {
217                                         using (Graphics g = Graphics.FromImage(bmDest))
218                                         {
219                                                 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
220                                                 g.DrawImage(bmSrc, new Rectangle(0, 0, bmSrc.Width / 4, bmSrc.Height / 4),
221                                                                 0, 0, bmSrc.Width, bmSrc.Height, GraphicsUnit.Pixel);
222                                                 TextureFactory.tテクスチャの解放(ref txSkinSample);
223                                                 txSkinSample = TextureFactory.tテクスチャの生成(bmDest, false);
224                                         }
225                                 }
226                         }
227                 }
228
229                 // #region [ 項目リストの設定 ( Exit, KeyAssignSystem/Drums/Guitar/Bass) ]
230                 public void t項目リストの設定_Exit()
231                 {
232                         CDTXMania.Instance.SaveConfig();
233                         this.eメニュー種別 = Eメニュー種別.Unknown;
234                 }
235
236                 public void t項目リストの設定(Eメニュー種別 eMenu)
237                 {
238                         this.list項目リスト.Clear();
239
240                         Func<EPad, string, string, COptionString> PadNotifier = (pad, lbl, expl) =>
241                         {
242                                 COptionString opt = new COptionString("");
243                                 opt.Initialize(lbl, expl);
244                                 opt.OnEnterDelegate = () =>
245                                 {
246                                         CDTXMania.Instance.stageコンフィグ.tパッド選択通知(pad);
247                                 };
248                                 return opt;
249                         };
250
251                         CResources cr = CDTXMania.Instance.Resources;
252
253                         if (eMenu == Eメニュー種別.DisplaySystem)
254                         {
255                                 list項目リスト.Add(ReturnToMenu.System);
256                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bFullScreen);
257                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBGA);
258                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAVI);
259                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceScalingAVI);
260                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bVSyncWait);
261                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.Both);
262                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.Both);
263                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.DrOnly);
264                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.DrOnly);
265                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.GBOnly);
266                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.GBOnly);
267                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIX.Both);
268                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIY.Both);
269                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIX.DrOnly);
270                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIY.DrOnly);
271                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIX.GBOnly);
272                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLegacyAVIY.GBOnly);
273                                 //list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceFullMovieCentering.Both);
274                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieX.Both);
275                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieY.Both);
276                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieW.Both);
277                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieH.Both);
278                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieX.DrOnly);
279                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieY.DrOnly);
280                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieW.DrOnly);
281                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieH.DrOnly);
282                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieX.GBOnly);
283                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieY.GBOnly);
284                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieW.GBOnly);
285                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceScaledMovieH.GBOnly);
286                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nBGAlpha);
287                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nShowLagType);
288                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eJudgePriority);
289                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bShowSongPath);
290                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDebugInfo);
291                         }
292                         else if (eMenu == Eメニュー種別.DisplayDrums)
293                         {
294                                 list項目リスト.Add(ReturnToMenu.Drums);
295                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Drums.Both);
296                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Drums.DrOnly);
297                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Drums.Both);
298                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Drums.DrOnly);
299                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Drums);
300                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Drums);
301                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.LC);
302                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.HH);
303                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.SD);
304                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BD);
305                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.HT);
306                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.LT);
307                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.FT);
308                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.CY);
309                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Drums);
310                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Drums);
311                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Drums);              // 112追加
312                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Drums);
313                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Drums);              // 112追加
314                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Drums);
315                         }
316                         else if (eMenu == Eメニュー種別.DisplayGuitar)
317                         {
318                                 list項目リスト.Add(ReturnToMenu.Guitar);
319                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Guitar.Both);
320                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Guitar.GBOnly);
321                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Guitar.Both);
322                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Guitar.GBOnly);
323                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Guitar);
324                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Guitar);
325                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtR);
326                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtG);
327                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtB);
328                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Guitar);
329                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Guitar);
330                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Guitar);             // 112追加
331                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Guitar);
332                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Guitar);             // 112追加
333                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Guitar);
334                         }
335                         else if (eMenu == Eメニュー種別.DisplayBass)
336                         {
337                                 list項目リスト.Add(ReturnToMenu.Bass);
338                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Bass.Both);
339                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Bass.GBOnly);
340                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Bass.Both);
341                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Bass.GBOnly);
342                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Bass);
343                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Bass);
344                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsR);
345                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsG);
346                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsB);
347                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Bass);
348                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Bass);
349                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Bass);               // 112追加
350                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Bass);
351                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Bass);               // 112追加
352                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Bass);
353                         }
354                         else if (eMenu == Eメニュー種別.EDrumsSettings)
355                         {
356                                 list項目リスト.Add(ReturnToMenu.Drums);
357                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.LC);
358                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.HH);
359                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.SD);
360                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.BD);
361                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.HT);
362                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.LT);
363                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.FT);
364                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.CY);
365                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.RD);
366                         }
367                         else if (eMenu == Eメニュー種別.HitRangeSettings)
368                         {
369                                 list項目リスト.Add(ReturnToMenu.System);
370                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Perfect);
371                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Great);
372                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Good);
373                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Poor);
374                         }
375                         else if (eMenu == Eメニュー種別.KeyAssignSystem)
376                         {
377                                 list項目リスト.Add(ReturnToMenu.System);
378                                 list項目リスト.Add(PadNotifier(EPad.Capture, cr.Label("strCfgKeyAssignCapture"), cr.Explanation("strCfgKeyAssignCapture") ));
379                                 list項目リスト.Add(PadNotifier(EPad.Up,      cr.Label("strCfgKeyAssignUp"),      cr.Explanation("strCfgKeyAssignUp")));
380                                 list項目リスト.Add(PadNotifier(EPad.Down,    cr.Label("strCfgKeyAssignDown"),    cr.Explanation("strCfgKeyAssignDown")));
381                         }
382                         else if (eMenu == Eメニュー種別.KeyAssignDrums)
383                         {
384                                 list項目リスト.Add(ReturnToMenu.Drums);
385                                 list項目リスト.Add(PadNotifier(EPad.LC, cr.Label("strCfgKeyAssignLC"), cr.Explanation("strCfgKeyAssignLC") ));
386                                 list項目リスト.Add(PadNotifier(EPad.HH, cr.Label("strCfgKeyAssignHH"), cr.Explanation("strCfgKeyAssignHH") ));
387                                 list項目リスト.Add(PadNotifier(EPad.HHO,cr.Label("strCfgKeyAssignHHO"), cr.Explanation("strCfgKeyAssignHHO") ));
388                                 list項目リスト.Add(PadNotifier(EPad.SD, cr.Label("strCfgKeyAssignSD"), cr.Explanation("strCfgKeyAssignSD") ));
389                                 list項目リスト.Add(PadNotifier(EPad.BD, cr.Label("strCfgKeyAssignBD"), cr.Explanation("strCfgKeyAssignBD") ));
390                                 list項目リスト.Add(PadNotifier(EPad.HT, cr.Label("strCfgKeyAssignHT"), cr.Explanation("strCfgKeyAssignHT") ));
391                                 list項目リスト.Add(PadNotifier(EPad.LT, cr.Label("strCfgKeyAssignLT"), cr.Explanation("strCfgKeyAssignLT") ));
392                                 list項目リスト.Add(PadNotifier(EPad.FT, cr.Label("strCfgKeyAssignFT"), cr.Explanation("strCfgKeyAssignFT") ));
393                                 list項目リスト.Add(PadNotifier(EPad.CY, cr.Label("strCfgKeyAssignCY"), cr.Explanation("strCfgKeyAssignCY") ));
394                                 list項目リスト.Add(PadNotifier(EPad.RD, cr.Label("strCfgKeyAssignRD"), cr.Explanation("strCfgKeyAssignRD") ));
395                                 list項目リスト.Add(PadNotifier(EPad.HP, cr.Label("strCfgKeyAssignHP"), cr.Explanation("strCfgKeyAssignHP") ));
396                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHHGroup);
397                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eFTGroup);
398                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eCYGroup);
399                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eBDGroup);
400                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bCymbalFree);
401                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums);
402                         }
403                         else if (eMenu == Eメニュー種別.KeyAssignGuitar)
404                         {
405                                 list項目リスト.Add(ReturnToMenu.Guitar);
406                                 list項目リスト.Add(PadNotifier(EPad.GtR, cr.Label("strCfgKeyAssignGtR"), cr.Explanation("strCfgKeyAssignGtR") ));
407                                 list項目リスト.Add(PadNotifier(EPad.GtG, cr.Label("strCfgKeyAssignGtG"), cr.Explanation("strCfgKeyAssignGtG") ));
408                                 list項目リスト.Add(PadNotifier(EPad.GtB, cr.Label("strCfgKeyAssignGtB"), cr.Explanation("strCfgKeyAssignGtB") ));
409                                 list項目リスト.Add(PadNotifier(EPad.GtPick, cr.Label("strCfgKeyAssignGtPick"), cr.Explanation("strCfgKeyAssignGtPick") ));
410                                 list項目リスト.Add(PadNotifier(EPad.GtWail, cr.Label("strCfgKeyAssignGtWailing"), cr.Explanation("strCfgKeyAssignGtWailing") ));
411                                 list項目リスト.Add(PadNotifier(EPad.GtDecide, cr.Label("strCfgKeyAssignGtDecide"), cr.Explanation("strCfgKeyAssignGtDecide") ));
412                                 list項目リスト.Add(PadNotifier(EPad.GtCancel, cr.Label("strCfgKeyAssignGtCancel"), cr.Explanation("strCfgKeyAssignGtCancel") ));
413                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar);
414                         }
415                         else if (eMenu == Eメニュー種別.KeyAssignBass)
416                         {
417                                 list項目リスト.Add(ReturnToMenu.Bass);
418                                 list項目リスト.Add(PadNotifier(EPad.BsR, cr.Label("strCfgKeyAssignBsR"), cr.Explanation("strCfgKeyAssignBsR") ));
419                                 list項目リスト.Add(PadNotifier(EPad.BsG, cr.Label("strCfgKeyAssignBsG"), cr.Explanation("strCfgKeyAssignBsG") ));
420                                 list項目リスト.Add(PadNotifier(EPad.BsB, cr.Label("strCfgKeyAssignBsB"), cr.Explanation("strCfgKeyAssignBsB") ));
421                                 list項目リスト.Add(PadNotifier(EPad.BsPick, cr.Label("strCfgKeyAssignBsPick"), cr.Explanation("strCfgKeyAssignBsPick") ));
422                                 list項目リスト.Add(PadNotifier(EPad.BsWail, cr.Label("strCfgKeyAssignBsWailing"), cr.Explanation("strCfgKeyAssignBsWailing") ));
423                                 list項目リスト.Add(PadNotifier(EPad.BsDecide, cr.Label("strCfgKeyAssignBsDecide"), cr.Explanation("strCfgKeyAssignBsDecide") ));
424                                 list項目リスト.Add(PadNotifier(EPad.BsCancel, cr.Label("strCfgKeyAssignBsCancel"), cr.Explanation("strCfgKeyAssignBsCancel") ));
425                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass);
426                         }
427                         else if (eMenu == Eメニュー種別.System)
428                         {
429                                 list項目リスト.Add(ReturnToMenu.System);
430                                 COptionStringList langlist = new COptionStringList("default");
431                                 langlist.Initialize( "strCfgLanguage", cr.LanguageDispList );
432                                 langlist.Index = CDTXMania.Instance.Resources.LanguageCodeIndex;
433                                 langlist.OnEnterDelegate = () =>
434                                 {
435                                         int index = langlist.Index;
436                                         CDTXMania.Instance.ConfigIni.strLanguage.Value = CDTXMania.Instance.Resources.Language = CDTXMania.Instance.Resources.LanguageCodeList[ index ];
437                                          
438                                 }; 
439                                 list項目リスト.Add( langlist );
440                         
441                                 COptionString enumsongs = new COptionString("");
442                                 enumsongs.Initialize( "strCfgSysEnumSongs" );
443                                 list項目リスト.Add(enumsongs);
444                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEnumerateSongsInBoot);
445                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eDark);
446                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nRisky);
447                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eActiveInst);
448                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPlaySpeed);
449                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepPerFrameMs);
450                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepUnfocusMs);
451                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceHighPowerPlan);
452                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bStageFailed);
453                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bRandSubBox);
454                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreSoundWeightMs);
455                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreImageWeightMs);
456                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eDamageLevel);
457                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bScoreIni);
458                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nChipVolume);
459                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nAutoVolume);
460                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bStoicMode);
461                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bIsAutoResultCapture);
462                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBufferedInput);
463                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLog);
464                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLogEnumerateSongs);
465                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLogCreateRelease);
466                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLogDTX);
467                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadSoundSpeed);
468                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadDTXDetail);// #36177 2016.7.30 ikanick
469                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bUseBoxDefSkin);
470                                 list項目リスト.Add(skins);
471                                 list項目リスト.Add(SoundMenu);
472                                 list項目リスト.Add(DisplayMenu.System);
473                                 list項目リスト.Add(HitRangeMenu);
474                                 list項目リスト.Add(KeyAssignMenu.System);
475                                 enumsongs.OnEnterDelegate = () =>
476                                 {
477                                         if (CDTXMania.Instance.EnumSongs.IsEnumerating)
478                                         {
479                                                 // Debug.WriteLine( "バックグラウンドでEnumeratingSongs中だったので、一旦中断します。" );
480                                                 CDTXMania.Instance.EnumSongs.Abort();
481                                                 CDTXMania.Instance.actEnumSongs.On非活性化();
482                                         }
483
484                                         CDTXMania.Instance.EnumSongs.StartEnumFromDisk();
485                                         CDTXMania.Instance.EnumSongs.ChangeEnumeratePriority(ThreadPriority.Normal);
486                                         CDTXMania.Instance.actEnumSongs.bコマンドでの曲データ取得 = true;
487                                         CDTXMania.Instance.actEnumSongs.On活性化();
488                                 };
489                         }
490                         else if ( eMenu == Eメニュー種別.SoundSettings )
491                         {
492                                 list項目リスト.Add( ReturnToMenu.System );
493                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bTimeStretch );
494                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bWaveAdjust );
495                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bBGMPlay );
496                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bAudience );
497                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nChipVolume );
498                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nAutoVolume );
499                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nSoundDeviceType );
500                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs );
501                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI );
502                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.strASIODevice );
503                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bUseOSTimer );
504                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bDynamicBassMixerManagement );
505                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nMasterVolume );
506                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nPolyphonicSounds );
507                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nPolyphonicSoundsGB );
508                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.eClickType );
509                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickHighVolume );
510                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickLowVolume );
511                         }
512                         else if ( eMenu == Eメニュー種別.Drums )
513                         {
514                                 list項目リスト.Add(ReturnToMenu.Drums);
515                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
516                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
517                                 AllAuto.OnEnterDelegate = () =>
518                                 {
519                                         if ( AllAuto.Value == EThreeState.X )
520                                         {
521                                                 AllAuto.OnNext();
522                                         }
523                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Drums, AllAuto );
524                                 };
525                                 list項目リスト.Add(AllAuto);
526                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.LC);
527                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HH);
528                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HHO);
529                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.SD);
530                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BD);
531                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HT);
532                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.LT);
533                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.FT);
534                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.CY);
535                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.RD);
536                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums);
537                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH);
538                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT);
539                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY);
540                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bTight);
541                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bFillin);
542                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDrumsHitSound);
543                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nStrictHitSoundRange);
544                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
545                                 list項目リスト.Add(DisplayMenu.Drums);
546                                 list項目リスト.Add(EDrumsMenu.Drums);
547                                 list項目リスト.Add(KeyAssignMenu.Drums);
548                         }
549                         else if (eMenu == Eメニュー種別.Guitar)
550                         {
551                                 list項目リスト.Add(ReturnToMenu.Guitar);
552                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
553                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
554                                 AllAuto.OnEnterDelegate = () =>
555                                 {
556                                         if ( AllAuto.Value == EThreeState.X )
557                                         {
558                                                 AllAuto.OnNext();
559                                         }
560                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Guitar, AllAuto );
561                                 };
562                                 list項目リスト.Add(AllAuto);
563                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtR);
564                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtG);
565                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtB);
566                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick);
567                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail);
568                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Guitar);
569                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eRandom.Guitar);
570                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLight.Guitar);
571                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Guitar);
572                                 list項目リスト.Add(DisplayMenu.Guitar);
573                                 list項目リスト.Add(KeyAssignMenu.Guitar);
574                         }
575                         else if (eMenu == Eメニュー種別.Bass)
576                         {
577                                 list項目リスト.Add(ReturnToMenu.Bass);
578                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
579                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
580                                 AllAuto.OnEnterDelegate = () =>
581                                 {
582                                         if ( AllAuto.Value == EThreeState.X )
583                                         {
584                                                 AllAuto.OnNext();
585                                         }
586                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Bass, AllAuto );
587                                 };
588                                 list項目リスト.Add(AllAuto);
589                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsR);
590                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsG);
591                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsB);
592                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick);
593                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail);
594                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Bass);
595                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eRandom.Bass);
596                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLight.Bass);
597                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Bass);
598                                 list項目リスト.Add(DisplayMenu.Bass);
599                                 list項目リスト.Add(KeyAssignMenu.Bass);
600                         }
601                         OnListMenuの初期化();
602                         n現在の選択項目 = 0;
603                         eメニュー種別 = eMenu;
604                 }
605
606                 public void OnNext()
607                 {
608                         CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
609                         if (b要素値にフォーカス中)
610                         {
611                                 list項目リスト[n現在の選択項目].OnPrevious();
612                                 t要素値を上下に変更中の処理();
613                         }
614                         else
615                         {
616                                 n目標のスクロールカウンタ += 100;
617                         }
618                 }
619
620                 public void OnPrevious()
621                 {
622                         CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
623                         if (b要素値にフォーカス中)
624                         {
625                                 list項目リスト[n現在の選択項目].OnNext();
626                                 t要素値を上下に変更中の処理();
627                         }
628                         else
629                         {
630                                 n目標のスクロールカウンタ -= 100;
631                         }
632                 }
633
634                 private void t要素値を上下に変更中の処理()
635                 {
636                         if (this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.nMasterVolume)
637                         {
638                                 // #33700 2014.4.26 yyagi
639                                 CDTXMania.Instance.Sound管理.nMasterVolume = CDTXMania.Instance.ConfigIni.nMasterVolume;
640                         }
641                 }
642
643                 public override void On活性化()
644                 {
645                         if (b活性化してない)
646                         {
647                                 this.list項目リスト = new List<COptionBase>();
648                                 this.eメニュー種別 = Eメニュー種別.Unknown;
649
650                                 CResources cr = CDTXMania.Instance.Resources;
651                                 string fontname = cr.Explanation("strCfgConfigurationItemsFontFileName");
652                                 string path = Path.Combine(@"Graphics\fonts", fontname);
653                                 this.prvFont = new CPrivateFastFont(CSkin.Path(path), (int)(18 * Scale.Y));
654                                 this.b要素値にフォーカス中 = false;
655                                 this.n目標のスクロールカウンタ = 0;
656                                 this.n現在のスクロールカウンタ = 0;
657                                 this.nスクロール用タイマ値 = -1;
658                                 this.ct三角矢印アニメ = new CCounter();
659
660
661                                 DisplayMenu = new STDGBSValue<COptionLabel>();
662                                 KeyAssignMenu = new STDGBSValue<COptionLabel>();
663                                 EDrumsMenu = new STDGBSValue<COptionLabel>();
664                                 ReturnToMenu = new STDGBSValue<COptionLabel>();
665
666                                 //CResources cr = CDTXMania.Instance.Resources;
667                                 for ( EPart i = EPart.Drums; i <= EPart.System; ++i )
668                                 {
669                                         DisplayMenu[i] = new COptionLabel( "strCfgDisplayOption" );
670                                         KeyAssignMenu[i] = new COptionLabel( "strCfgInputOption" );
671                                         ReturnToMenu[i] = new COptionLabel( "strCfgReturnToMenu" );
672                                 }
673
674                                 EDrumsMenu[ EPart.Drums ] = new COptionLabel( "strCfgEDrumsOption" );
675                                 HitRangeMenu = new COptionLabel( "strCfgHitRangeOption" );
676                                 SoundMenu = new COptionLabel( "strCfgSoundOption" );
677
678                                 DisplayMenu.Drums.OnEnterDelegate = () =>
679                                 {
680                                         t項目リストの設定(Eメニュー種別.DisplayDrums);
681                                 };
682                                 DisplayMenu.Guitar.OnEnterDelegate = () =>
683                                 {
684                                         t項目リストの設定(Eメニュー種別.DisplayGuitar);
685                                 };
686                                 DisplayMenu.Bass.OnEnterDelegate = () =>
687                                 {
688                                         t項目リストの設定(Eメニュー種別.DisplayBass);
689                                 };
690                                 DisplayMenu.System.OnEnterDelegate = () =>
691                                 {
692                                         t項目リストの設定(Eメニュー種別.DisplaySystem);
693                                 };
694                                 KeyAssignMenu.Drums.OnEnterDelegate = () =>
695                                 {
696                                         t項目リストの設定(Eメニュー種別.KeyAssignDrums);
697                                 };
698                                 KeyAssignMenu.Guitar.OnEnterDelegate = () =>
699                                 {
700                                         t項目リストの設定(Eメニュー種別.KeyAssignGuitar);
701                                 };
702                                 KeyAssignMenu.Bass.OnEnterDelegate = () =>
703                                 {
704                                         t項目リストの設定(Eメニュー種別.KeyAssignBass);
705                                 };
706                                 KeyAssignMenu.System.OnEnterDelegate = () =>
707                                 {
708                                         t項目リストの設定(Eメニュー種別.KeyAssignSystem);
709                                 };
710
711                                 ReturnToMenu.Drums.OnEnterDelegate = () =>
712                                 {
713                                         t項目リストの設定(Eメニュー種別.Drums);
714                                 };
715                                 ReturnToMenu.Guitar.OnEnterDelegate = () =>
716                                 {
717                                         t項目リストの設定(Eメニュー種別.Guitar);
718                                 };
719                                 ReturnToMenu.Bass.OnEnterDelegate = () =>
720                                 {
721                                         t項目リストの設定(Eメニュー種別.Bass);
722                                 };
723                                 ReturnToMenu.System.OnEnterDelegate = () =>
724                                 {
725                                         t項目リストの設定(Eメニュー種別.System);
726                                 };
727                                 EDrumsMenu.Drums.OnEnterDelegate = () =>
728                                 {
729                                         t項目リストの設定(Eメニュー種別.EDrumsSettings);
730                                 };
731                                 HitRangeMenu.OnEnterDelegate = () =>
732                                 {
733                                         t項目リストの設定( Eメニュー種別.HitRangeSettings );
734                                 };
735                                 SoundMenu.OnEnterDelegate = () =>
736                                 {
737                                         t項目リストの設定( Eメニュー種別.SoundSettings );
738                                 };
739
740                                 #region [ スキン選択肢と、現在選択中のスキン(index)の準備 #28195 2012.5.2 yyagi ]
741                                 int ns = (CDTXMania.Instance.Skin.strSystemSkinSubfolders == null) ? 0 : CDTXMania.Instance.Skin.strSystemSkinSubfolders.Length;
742                                 int nb = (CDTXMania.Instance.Skin.strBoxDefSkinSubfolders == null) ? 0 : CDTXMania.Instance.Skin.strBoxDefSkinSubfolders.Length;
743
744                                 skinSubFolders = new string[ns + nb];
745                                 skinInitial = CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(true);
746                                 int initIdx = 0;
747                                 for (int i = 0; i < ns; i++)
748                                 {
749                                         skinSubFolders[i] = CDTXMania.Instance.Skin.strSystemSkinSubfolders[i];
750                                 }
751                                 for (int i = 0; i < nb; i++)
752                                 {
753                                         skinSubFolders[ns + i] = CDTXMania.Instance.Skin.strBoxDefSkinSubfolders[i];
754                                 }
755                                 Array.Sort(skinSubFolders);
756                                 skinNames = CSkin.GetSkinName(skinSubFolders);
757                                 initIdx = Array.BinarySearch(skinSubFolders, skinInitial);
758                                 if (initIdx < 0)
759                                 {
760                                         initIdx = 0;
761                                 }
762                                 skins = new COptionStringList(skinNames[initIdx]);
763                                 skins.Initialize("Skin", Properties.Resources.strCfgSysSkin, skinNames);
764
765                                 skins.OnEnterDelegate = () =>
766                                 {
767                                         CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(skinSubFolders[skins.Index], true);
768                                         CDTXMania.Instance.ConfigIni.strSystemSkinSubfolderPath.Value = skinSubFolders[skins.Index];
769                                         tGenerateSkinSample();
770                                 };
771                                 #endregion
772
773                                 // CONFIG脱出時にこの値から変更されているようなら
774                                 // サウンドデバイスを再構築する
775                                 this.InitialSystemSoundType = CDTXMania.Instance.ConfigIni.nSoundDeviceType;
776                                 this.InitialWASAPIBufferSizeMs = CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs;
777                                 this.InitialASIODevice = CDTXMania.Instance.ConfigIni.strASIODevice.Index;
778                                 this.InitialUseOSTimer = CDTXMania.Instance.ConfigIni.bUseOSTimer;
779                                 this.InitialWASAPIEventDriven = CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI;
780
781                                 this.InitialForceHighPower = CDTXMania.Instance.ConfigIni.bForceHighPowerPlan;
782
783                                 // #27795 2012.3.11 yyagi; System設定の中でDrumsの設定を参照しているため、
784                                 this.t項目リストの設定(Eメニュー種別.Bass);
785                                 // 活性化の時点でDrumsの設定も入れ込んでおかないと、System設定中に例外発生することがある。
786                                 this.t項目リストの設定(Eメニュー種別.Guitar);
787                                 this.t項目リストの設定(Eメニュー種別.Drums);
788                                 // 順番として、最後にSystemを持ってくること。設定一覧の初期位置がSystemのため。
789                                 this.t項目リストの設定(Eメニュー種別.System);
790
791                                 base.On活性化();
792                         }
793                 }
794
795                 public override void On非活性化()
796                 {
797                         if (b活性化してる)
798                         {
799                                 CDTXMania.Instance.SaveConfig();
800                                 this.list項目リスト.Clear();
801                                 this.ct三角矢印アニメ = null;
802
803                                 OnListMenuの解放();
804                                 prvFont.Dispose();
805
806                                 base.On非活性化();
807                                 #region [ Skin変更 ]
808                                 if (CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(true) != this.skinInitial)
809                                 {
810                                         CDTXMania.Instance.stageChangeSkin.tChangeSkinMain();   // #28195 2012.6.11 yyagi CONFIG脱出時にSkin更新
811                                 }
812                                 #endregion
813
814                                 // #24820 2013.1.22 yyagi CONFIGでWASAPI/ASIO/DirectSound関連の設定を変更した場合、サウンドデバイスを再構築する。
815                                 // #33689 2014.6.17 yyagi CONFIGでSoundTimerTypeの設定を変更した場合も、サウンドデバイスを再構築する。
816                                 #region [ サウンドデバイス変更 ]
817                                 if (InitialSystemSoundType != CDTXMania.Instance.ConfigIni.nSoundDeviceType ||
818                                                 InitialWASAPIBufferSizeMs != CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs ||
819                                                 InitialASIODevice != CDTXMania.Instance.ConfigIni.strASIODevice.Index ||
820                                                 InitialUseOSTimer != CDTXMania.Instance.ConfigIni.bUseOSTimer ||
821                                                 InitialWASAPIEventDriven != CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI )
822                                 {
823                                         ESoundDeviceType soundDeviceType;
824                                         switch (CDTXMania.Instance.ConfigIni.nSoundDeviceType.Value)
825                                         {
826                                                 case ESoundDeviceTypeForConfig.DSound:
827                                                         soundDeviceType = ESoundDeviceType.DirectSound;
828                                                         break;
829                                                 case ESoundDeviceTypeForConfig.ASIO:
830                                                         soundDeviceType = ESoundDeviceType.ASIO;
831                                                         break;
832                                                 case ESoundDeviceTypeForConfig.WASAPI_Exclusive:
833                                                         soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
834                                                         break;
835                                                 case ESoundDeviceTypeForConfig.WASAPI_Shared:
836                                                         soundDeviceType = ESoundDeviceType.SharedWASAPI;
837                                                         break;
838                                                 default:
839                                                         soundDeviceType = ESoundDeviceType.Unknown;
840                                                         break;
841                                         }
842
843                                         CDTXMania.Instance.Sound管理.t初期化(
844                                                         soundDeviceType,
845                                                         CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs,
846                                                         CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI,
847                                                         0,
848                                                         CDTXMania.Instance.ConfigIni.strASIODevice.Index,
849                                                         CDTXMania.Instance.ConfigIni.bUseOSTimer);
850                                         CDTXMania.Instance.ShowWindowTitleWithSoundType();
851                                 }
852                                 #endregion
853
854                                 #region [ メトロノーム音 音量設定 ]
855                                 CDTXMania.Instance.Skin.soundClickHigh.n音量 = CDTXMania.Instance.ConfigIni.nClickHighVolume;
856                                 CDTXMania.Instance.Skin.soundClickLow.n音量 = CDTXMania.Instance.ConfigIni.nClickLowVolume;
857                                 CDTXMania.Instance.Skin.soundClickBottom.n音量 = CDTXMania.Instance.ConfigIni.nClickLowVolume;
858                                 #endregion
859
860                                 #region [ サウンドのタイムストレッチモード変更 ]
861
862                                 FDK.CSound管理.bIsTimeStretch = CDTXMania.Instance.ConfigIni.bTimeStretch.Value;
863
864                                 #endregion
865                                 #region [ 電源プラン変更 ]
866                                 if ( CDTXMania.Instance.ConfigIni.bForceHighPowerPlan )
867                                 {
868                                         CPowerPlan.ChangeHighPerformance();
869                                 }
870                                 else
871                                 {
872                                         // HighPower=OFFを維持したとき、またはONからOFFにしたときは、
873                                         // 特に電源プランの変更をしない。
874                                         // 電源プランの復元は、アプリ終了時に行う。
875                                         // CPowerPlan.RestoreCurrentPowerPlan();
876                                 }
877                                 #endregion
878                         }
879                 }
880
881                 public override void OnManagedリソースの作成()
882                 {
883                         if (b活性化してる)
884                         {
885                                 this.tx通常項目行パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig itembox.png"), false);
886                                 this.txその他項目行パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig itembox other.png"), false);
887                                 this.tx三角矢印 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenConfig triangle arrow.png"), false);
888                                 // スキン選択時に動的に設定するため、ここでは初期化しない
889                                 this.txSkinSample = null;
890                                 OnListMenuの初期化();
891                                 base.OnManagedリソースの作成();
892                         }
893                 }
894
895                 public override void OnManagedリソースの解放()
896                 {
897                         if (b活性化してる)
898                         {
899                                 TextureFactory.tテクスチャの解放(ref this.txSkinSample);
900                                 TextureFactory.tテクスチャの解放(ref this.tx通常項目行パネル);
901                                 TextureFactory.tテクスチャの解放(ref this.txその他項目行パネル);
902                                 TextureFactory.tテクスチャの解放(ref this.tx三角矢印);
903
904                                 OnListMenuの解放();
905
906                                 base.OnManagedリソースの解放();
907                         }
908                 }
909
910                 private void OnListMenuの初期化()
911                 {
912                         OnListMenuの解放();
913                         this.listMenu = new stMenuItemRight[this.list項目リスト.Count];
914                 }
915
916                 /// <summary>
917                 /// 事前にレンダリングしておいたテクスチャを解放する。
918                 /// </summary>
919                 private void OnListMenuの解放()
920                 {
921                         if (listMenu != null)
922                         {
923                                 for (int i = 0; i < listMenu.Length; i++)
924                                 {
925                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txParam);
926                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txParamColored);
927                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txMenuItemRight);
928                                 }
929                                 this.listMenu = null;
930                         }
931                 }
932
933                 public override int On進行描画()
934                 {
935                         throw new InvalidOperationException("t進行描画(bool)のほうを使用してください。");
936                 }
937
938                 public int t進行描画(bool b項目リスト側にフォーカスがある)
939                 {
940                         if (this.b活性化してる)
941                         {
942                                 #region [ 初めての進行描画 ]
943                                 //-----------------
944                                 if (base.b初めての進行描画)
945                                 {
946                                         this.nスクロール用タイマ値 = CSound管理.rc演奏用タイマ.n現在時刻;
947                                         this.ct三角矢印アニメ.t開始(0, 9, 50, CDTXMania.Instance.Timer);
948
949                                         base.b初めての進行描画 = false;
950                                 }
951                                 //-----------------
952                                 #endregion
953
954                                 this.b項目リスト側にフォーカスがある = b項目リスト側にフォーカスがある;       // 記憶
955
956                                 #region [ 項目スクロールの進行 ]
957                                 //-----------------
958                                 long n現在時刻 = CDTXMania.Instance.Timer.n現在時刻;
959                                 if (n現在時刻 < this.nスクロール用タイマ値) this.nスクロール用タイマ値 = n現在時刻;
960
961                                 const int INTERVAL = 2; // [ms]
962                                 while ((n現在時刻 - this.nスクロール用タイマ値) >= INTERVAL)
963                                 {
964                                         int n目標項目までのスクロール量 = Math.Abs((int)(this.n目標のスクロールカウンタ - this.n現在のスクロールカウンタ));
965                                         int n加速度 = 0;
966
967                                         #region [ n加速度の決定;目標まで遠いほど加速する。]
968                                         //-----------------
969                                         if (n目標項目までのスクロール量 <= 100)
970                                         {
971                                                 n加速度 = 2;
972                                         }
973                                         else if (n目標項目までのスクロール量 <= 300)
974                                         {
975                                                 n加速度 = 3;
976                                         }
977                                         else if (n目標項目までのスクロール量 <= 500)
978                                         {
979                                                 n加速度 = 4;
980                                         }
981                                         else
982                                         {
983                                                 n加速度 = 8;
984                                         }
985                                         //-----------------
986                                         #endregion
987                                         #region [ this.n現在のスクロールカウンタに n加速度 を加減算。]
988                                         //-----------------
989                                         if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)
990                                         {
991                                                 this.n現在のスクロールカウンタ += n加速度;
992                                                 if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)
993                                                 {
994                                                         // 目標を超えたら目標値で停止。
995                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;
996                                                 }
997                                         }
998                                         else if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)
999                                         {
1000                                                 this.n現在のスクロールカウンタ -= n加速度;
1001                                                 if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)
1002                                                 {
1003                                                         // 目標を超えたら目標値で停止。
1004                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;
1005                                                 }
1006                                         }
1007                                         //-----------------
1008                                         #endregion
1009                                         #region [ 行超え処理、ならびに目標位置に到達したらスクロールを停止して項目変更通知を発行。]
1010                                         //-----------------
1011                                         if (this.n現在のスクロールカウンタ >= 100)
1012                                         {
1013                                                 this.n現在の選択項目 = this.t次の項目(this.n現在の選択項目);
1014                                                 this.n現在のスクロールカウンタ -= 100;
1015                                                 this.n目標のスクロールカウンタ -= 100;
1016                                                 if (this.n目標のスクロールカウンタ == 0)
1017                                                 {
1018                                                         CDTXMania.Instance.stageコンフィグ.t項目変更通知();
1019                                                 }
1020                                         }
1021                                         else if (this.n現在のスクロールカウンタ <= -100)
1022                                         {
1023                                                 this.n現在の選択項目 = this.t前の項目(this.n現在の選択項目);
1024                                                 this.n現在のスクロールカウンタ += 100;
1025                                                 this.n目標のスクロールカウンタ += 100;
1026                                                 if (this.n目標のスクロールカウンタ == 0)
1027                                                 {
1028                                                         CDTXMania.Instance.stageコンフィグ.t項目変更通知();
1029                                                 }
1030                                         }
1031                                         //-----------------
1032                                         #endregion
1033
1034                                         this.nスクロール用タイマ値 += INTERVAL;
1035                                 }
1036                                 //-----------------
1037                                 #endregion
1038
1039                                 #region [ ▲印アニメの進行 ]
1040                                 if (this.b項目リスト側にフォーカスがある && (this.n目標のスクロールカウンタ == 0))
1041                                 {
1042                                         this.ct三角矢印アニメ.t進行Loop();
1043                                 }
1044                                 #endregion
1045
1046
1047                                 // 描画
1048
1049                                 // メニューにフォーカスがあるなら、項目リストの中央は頭を出さない。
1050                                 this.ptパネルの基本座標[4].X = this.b項目リスト側にフォーカスがある ? 276 : 301;
1051
1052                                 #region [ 計11個の項目パネルを描画する。]
1053                                 //-----------------
1054                                 int nItem = this.n現在の選択項目;
1055                                 for (int i = 0; i < 4; i++)
1056                                 {
1057                                         nItem = this.t前の項目(nItem);
1058                                 }
1059
1060                                 for (int n行番号 = -4; n行番号 < 6; n行番号++)
1061                                 {
1062                                         // n行番号 == 0 がフォーカスされている項目パネル。
1063                                         #region [ 今まさに画面外に飛びだそうとしている項目パネルは描画しない。]
1064                                         if (((n行番号 == -4) && (this.n現在のスクロールカウンタ > 0)) ||
1065                                                         ((n行番号 == +5) && (this.n現在のスクロールカウンタ < 0)))
1066                                         {
1067                                                 nItem = this.t次の項目(nItem);
1068                                                 continue;
1069                                         }
1070                                         #endregion
1071
1072                                         int n移動元の行の基本位置 = n行番号 + 4;
1073                                         int n移動先の行の基本位置 = (this.n現在のスクロールカウンタ <= 0) ? ((n移動元の行の基本位置 + 1) % 10) : (((n移動元の行の基本位置 - 1) + 10) % 10);
1074                                         int x = this.ptパネルの基本座標[n移動元の行の基本位置].X + ((int)((this.ptパネルの基本座標[n移動先の行の基本位置].X - this.ptパネルの基本座標[n移動元の行の基本位置].X) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
1075                                         int y = this.ptパネルの基本座標[n移動元の行の基本位置].Y + ((int)((this.ptパネルの基本座標[n移動先の行の基本位置].Y - this.ptパネルの基本座標[n移動元の行の基本位置].Y) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
1076
1077                                         #region [ 現在の行の項目パネル枠を描画。]
1078                                         if (this.list項目リスト[nItem].type == EOptionType.Normal)
1079                                         {
1080                                                 if (this.tx通常項目行パネル != null)
1081                                                 {
1082                                                         this.tx通常項目行パネル.t2D描画(CDTXMania.Instance.Device, x * Scale.X, y * Scale.Y);
1083                                                 }
1084                                         }
1085                                         else if (this.list項目リスト[nItem].type == EOptionType.Other)
1086                                         {
1087                                                 if (this.txその他項目行パネル != null)
1088                                                 {
1089                                                         this.txその他項目行パネル.t2D描画(CDTXMania.Instance.Device, x * Scale.X, y * Scale.Y);
1090                                                 }
1091                                         }
1092                                         #endregion
1093
1094                                         #region [ 現在の行の項目名を描画。]
1095                                         if (listMenu[nItem].txMenuItemRight != null)
1096                                         {
1097                                                 // 自前のキャッシュに含まれているようなら、再レンダリングせずキャッシュを使用
1098                                                 listMenu[nItem].txMenuItemRight.t2D描画(CDTXMania.Instance.Device, (x + 0x12) * Scale.X, (y + 12) * Scale.Y - 20);
1099                                         }
1100                                         else
1101                                         {
1102                                                 using (Bitmap bmpItem = prvFont.DrawPrivateFont(this.list項目リスト[nItem].label, Color.White, Color.Black))
1103                                                 {
1104                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txMenuItemRight);
1105                                                         listMenu[nItem].txMenuItemRight = TextureFactory.tテクスチャの生成(bmpItem);
1106                                                 }
1107                                         }
1108                                         #endregion
1109
1110                                         #region [ 現在の行の項目の要素を描画。]
1111                                         string strParam = this.list項目リスト[nItem].ToString();
1112                                         //bool b強調 = false;
1113
1114                                         #region [ 最初にSkinの選択肢にきたとき(Enterを押す前)に限り、サンプル生成が発生する。 #28195 2012.5.2 yyagi ]
1115                                         if (this.list項目リスト[this.n現在の選択項目] == skins)
1116                                         {
1117                                                 if (txSkinSample == null)
1118                                                 {
1119                                                         tGenerateSkinSample();
1120                                                 }
1121                                                 if (txSkinSample != null)
1122                                                 {
1123                                                         txSkinSample.t2D描画(CDTXMania.Instance.Device, 56 * Scale.X, 300 * Scale.Y);
1124                                                 }
1125                                         }
1126                                         #endregion
1127
1128                                         #endregion
1129                                         int nIndex = this.list項目リスト[nItem].Index;
1130                                         bool bColored = list項目リスト[nItem] is COptionInteger && n行番号 == 0 && b要素値にフォーカス中;
1131                                         if (listMenu[nItem].nParam != nIndex ||
1132                                                 (listMenu[nItem].txParam == null) ||
1133                                                 (bColored && listMenu[nItem].txParamColored == null))
1134                                         {
1135                                                 listMenu[nItem].nParam = nIndex;
1136                                                 listMenu[nItem].strParam = this.list項目リスト[nItem].ToString();
1137                                                 using (Bitmap bmpStr = prvFont.DrawPrivateFont(strParam, Color.White, Color.Black))
1138                                                 {
1139                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txParam);
1140                                                         listMenu[nItem].txParam = TextureFactory.tテクスチャの生成(bmpStr, false);
1141                                                         if (bColored)
1142                                                         {
1143                                                                 using (Bitmap bmpStrColored = prvFont.DrawPrivateFont(strParam, Color.White, Color.Black, Color.Yellow, Color.OrangeRed))
1144                                                                 {
1145                                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txParamColored);
1146                                                                         listMenu[nItem].txParamColored = TextureFactory.tテクスチャの生成(bmpStrColored, false);
1147                                                                 }
1148                                                         }
1149                                                 }
1150                                         }
1151
1152                                         if (bColored)
1153                                         {
1154                                                 listMenu[nItem].txParamColored.t2D描画(CDTXMania.Instance.Device, (x + 210) * Scale.X, (y + 12) * Scale.Y - 20);
1155                                         }
1156                                         else
1157                                         {
1158                                                 listMenu[nItem].txParam.t2D描画(CDTXMania.Instance.Device, (x + 210) * Scale.X, (y + 12) * Scale.Y - 20);
1159                                         }
1160                                         nItem = this.t次の項目(nItem);
1161                                 }
1162                                 #endregion
1163
1164                                 #region [ 項目リストにフォーカスがあって、かつスクロールが停止しているなら、パネルの上下に▲印を描画する。]
1165                                 if (this.b項目リスト側にフォーカスがある && (this.n目標のスクロールカウンタ == 0))
1166                                 {
1167                                         int x;
1168                                         int y_upper;
1169                                         int y_lower;
1170
1171                                         // 位置決定。
1172
1173                                         if (this.b要素値にフォーカス中)
1174                                         {
1175                                                 // 要素値の上下あたり。
1176                                                 x = 528;
1177                                                 y_upper = 198 - this.ct三角矢印アニメ.n現在の値;
1178                                                 y_lower = 242 + this.ct三角矢印アニメ.n現在の値;
1179                                         }
1180                                         else
1181                                         {
1182                                                 // 項目名の上下あたり。
1183                                                 x = 276;
1184                                                 y_upper = 186 - this.ct三角矢印アニメ.n現在の値;
1185                                                 y_lower = 254 + this.ct三角矢印アニメ.n現在の値;
1186                                         }
1187
1188                                         // 描画。
1189
1190                                         if (this.tx三角矢印 != null)
1191                                         {
1192                                                 this.tx三角矢印.t2D描画(CDTXMania.Instance.Device, x * Scale.X,
1193                                                         y_upper * Scale.Y,
1194                                                         new Rectangle(0, 0, (int)(32 * Scale.X), (int)(16 * Scale.Y)));
1195                                                 this.tx三角矢印.t2D描画(CDTXMania.Instance.Device, x * Scale.X,
1196                                                         y_lower * Scale.Y,
1197                                                         new Rectangle(0, (int)(16 * Scale.Y), (int)(32 * Scale.X), (int)(16 * Scale.Y)));
1198                                         }
1199                                 }
1200                                 #endregion
1201                         }
1202                         return 0;
1203                 }
1204
1205
1206                 // その他
1207                 internal enum Eメニュー種別
1208                 {
1209                         System,
1210                         Drums,
1211                         Guitar,
1212                         Bass,
1213                         // #24609 2011.4.12 yyagi: 画面キャプチャキーのアサイン
1214                         KeyAssignSystem,
1215                         KeyAssignDrums,
1216                         KeyAssignGuitar,
1217                         KeyAssignBass,
1218                         DisplaySystem,
1219                         DisplayDrums,
1220                         DisplayGuitar,
1221                         DisplayBass,
1222                         EDrumsSettings,
1223                         HitRangeSettings,
1224                         SoundSettings,
1225                         Unknown
1226                 }
1227
1228                 private int t前の項目(int nItem)
1229                 {
1230                         if (--nItem < 0)
1231                         {
1232                                 nItem = this.list項目リスト.Count - 1;
1233                         }
1234                         return nItem;
1235                 }
1236
1237                 private int t次の項目(int nItem)
1238                 {
1239                         if (++nItem >= this.list項目リスト.Count)
1240                         {
1241                                 nItem = 0;
1242                         }
1243                         return nItem;
1244                 }
1245         }
1246 }