OSDN Git Service

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