OSDN Git Service

#26982 5段階目までの実装をコミット。Auto関連の実装を追加。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 05.選曲 / CActSelectPopupMenu.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Diagnostics;\r
4 using System.Globalization;\r
5 using System.Text;\r
6 using System.Runtime.InteropServices;\r
7 using System.Drawing;\r
8 using FDK;\r
9 \r
10 \r
11 namespace DTXMania\r
12 {\r
13         internal class CActSelectPopupMenu : CActivity\r
14         {\r
15 \r
16                 // プロパティ\r
17 \r
18         \r
19                 public int GetIndex(int pos)\r
20                 {\r
21                         return lciMenuItems[ pos ].GetIndex();\r
22                 }\r
23                 public object GetObj現在値( int pos )\r
24                 {\r
25                         return lciMenuItems[ pos ].obj現在値();\r
26                 }\r
27                 public bool bGotoDetailConfig\r
28                 {\r
29                         get;\r
30                         internal set;\r
31                 }\r
32 \r
33                 /// <summary>\r
34                 /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。\r
35                 /// </summary>\r
36                 public bool bIsActivePopupMenu\r
37                 {\r
38                         get;\r
39                         private set;\r
40                 }\r
41                 public virtual void tActivatePopupMenu( E楽器パート einst )\r
42                 {\r
43                         nItemSelecting = -1;            // #24757 2011.4.1 yyagi: Clear sorting status in each stating menu.\r
44                         this.eInst = einst;\r
45                         this.bIsActivePopupMenu = true;\r
46                         this.bIsSelectingIntItem = false;\r
47                         this.bGotoDetailConfig = false;\r
48                 }\r
49                 public virtual void tDeativatePopupMenu()\r
50                 {\r
51                         this.bIsActivePopupMenu = false;\r
52                 }\r
53 \r
54 \r
55                 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title )\r
56                 {\r
57                         Initialize( menulist, showAllItems, title, 0 );\r
58                 }\r
59 \r
60                 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title, int defaultPos )\r
61                 {\r
62                         strMenuTitle = title;\r
63                         lciMenuItems = menulist;\r
64                         bShowAllItems = showAllItems;\r
65                         n現在の選択行 = defaultPos;\r
66                 }\r
67 \r
68 \r
69                 public void tEnter押下()\r
70                 {\r
71                         if ( this.bキー入力待ち )\r
72                         {\r
73                                 CDTXMania.Skin.sound決定音.t再生する();\r
74 \r
75                                 if ( this.n現在の選択行 != lciMenuItems.Count - 1 )\r
76                                 {\r
77                                         if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.リスト ||\r
78                                                  lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.ONorOFFトグル ||\r
79                                                  lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.ONorOFFor不定スリーステート  )\r
80                                         {\r
81                                                 lciMenuItems[ n現在の選択行 ].t項目値を次へ移動();\r
82                                         }\r
83                                         else if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.整数 )\r
84                                         {\r
85                                                 bIsSelectingIntItem = !bIsSelectingIntItem;             // 選択状態/選択解除状態を反転する\r
86                                         }\r
87                                         else if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.切替リスト )\r
88                                         {\r
89                                                 // 特に何もしない\r
90                                         }\r
91                                         else\r
92                                         {\r
93                                                 throw new ArgumentException();\r
94                                         }\r
95                                         nItemSelecting = n現在の選択行;\r
96                                 }\r
97                                 tEnter押下Main( (int) lciMenuItems[ n現在の選択行 ].GetIndex() );\r
98 \r
99                                 this.bキー入力待ち = true;\r
100                         }\r
101                 }\r
102 \r
103                 /// <summary>\r
104                 /// Decide押下時の処理を、継承先で記述する。\r
105                 /// </summary>\r
106                 /// <param name="val">CItemBaseの現在の設定値のindex</param>\r
107                 public virtual void tEnter押下Main( int val )\r
108                 {\r
109                 }\r
110                 /// <summary>\r
111                 /// Cancel押下時の追加処理があれば、継承先で記述する。\r
112                 /// </summary>\r
113                 public virtual void tCancel()\r
114                 {\r
115                 }\r
116                 /// <summary>\r
117                 /// 追加の描画処理。必要に応じて、継承先で記述する。\r
118                 /// </summary>\r
119                 public virtual void t進行描画sub()\r
120                 {\r
121                 }\r
122 \r
123 \r
124                 public void t次に移動()\r
125                 {\r
126                         if ( this.bキー入力待ち )\r
127                         {\r
128                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
129                                 if ( bIsSelectingIntItem )\r
130                                 {\r
131                                          lciMenuItems[ n現在の選択行 ].t項目値を前へ移動();               // 項目移動と数値上下は方向が逆になるので注意\r
132                                 }\r
133                                 else\r
134                                 {\r
135                                         if ( ++this.n現在の選択行 >= this.lciMenuItems.Count )\r
136                                         {\r
137                                                 this.n現在の選択行 = 0;\r
138                                         }\r
139                                 }\r
140                         }\r
141                 }\r
142                 public void t前に移動()\r
143                 {\r
144                         if ( this.bキー入力待ち )\r
145                         {\r
146                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
147                                 if ( bIsSelectingIntItem )\r
148                                 {\r
149                                         lciMenuItems[ n現在の選択行 ].t項目値を次へ移動();                // 項目移動と数値上下は方向が逆になるので注意\r
150                                 }\r
151                                 else\r
152                                 {\r
153                                         if ( --this.n現在の選択行 < 0 )\r
154                                         {\r
155                                                 this.n現在の選択行 = this.lciMenuItems.Count - 1;\r
156                                         }\r
157                                 }\r
158                         }\r
159                 }\r
160 \r
161                 // CActivity 実装\r
162 \r
163                 public override void On活性化()\r
164                 {\r
165         //              this.n現在の選択行 = 0;\r
166                         this.bキー入力待ち = true;\r
167                         for ( int i = 0; i < 4; i++ )\r
168                         {\r
169                                 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
170                         }\r
171                         base.b活性化してない = true;\r
172 \r
173                         this.bIsActivePopupMenu = false;\r
174                         this.font = new CActDFPFont();\r
175                         base.list子Activities.Add( this.font );\r
176                         nItemSelecting = -1;\r
177 \r
178                         base.On活性化();\r
179                 }\r
180                 public override void On非活性化()\r
181                 {\r
182                         if ( !base.b活性化してない )\r
183                         {\r
184                                 base.list子Activities.Remove( this.font );\r
185                                 this.font.On非活性化();\r
186                                 this.font = null;\r
187 \r
188                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
189                                 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );\r
190                                 for ( int i = 0; i < 4; i++ )\r
191                                 {\r
192                                         this.ctキー反復用[ i ] = null;\r
193                                 }\r
194                                 base.On非活性化();\r
195                         }\r
196                 }\r
197                 public override void OnManagedリソースの作成()\r
198                 {\r
199                         if ( !base.b活性化してない )\r
200                         {\r
201                                 this.txCursor = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );\r
202                                 this.txPopupMenuBackground = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" ), false );\r
203                                 base.OnManagedリソースの作成();\r
204                         }\r
205                 }\r
206                 public override void OnManagedリソースの解放()\r
207                 {\r
208                         if ( !base.b活性化してない )\r
209                         {\r
210                                 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );\r
211                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
212                         }\r
213                         base.OnManagedリソースの解放();\r
214                 }\r
215 \r
216                 public override int On進行描画()\r
217                 {\r
218                         throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );\r
219                 }\r
220 \r
221                 public int t進行描画()\r
222                 {\r
223                         if ( !base.b活性化してない && this.bIsActivePopupMenu )\r
224                         {\r
225                                 if ( this.bキー入力待ち )\r
226                                 {\r
227                                         #region [ Shift-F1: CONFIG画面 ]\r
228                                         if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) &&\r
229                                                 CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) )\r
230                                         {       // [SHIFT] + [F1] CONFIG\r
231                                                 CDTXMania.Skin.sound取消音.t再生する();\r
232                                                 tCancel();\r
233                                                 this.bGotoDetailConfig = true;\r
234                                         }\r
235                                         #endregion\r
236                                         #region [ キー入力: キャンセル ]\r
237                                         else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )\r
238                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )\r
239                                                 || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )\r
240                                         {       // キャンセル\r
241                                                 CDTXMania.Skin.sound取消音.t再生する();\r
242                                                 tCancel();\r
243                                                 this.bIsActivePopupMenu = false;\r
244                                         }\r
245                                         #endregion\r
246 \r
247                                         #region [ キー入力: 決定 ]\r
248                                         // E楽器パート eInst = E楽器パート.UNKNOWN;\r
249                                         ESortAction eAction = ESortAction.END;\r
250                                         if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )\r
251                                         {\r
252                                                 eInst = E楽器パート.GUITAR;\r
253                                                 eAction = ESortAction.Decide;\r
254                                         }\r
255                                         else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )\r
256                                         {\r
257                                                 eInst = E楽器パート.BASS;\r
258                                                 eAction = ESortAction.Decide;\r
259                                         }\r
260                                         else if (\r
261                                                 CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.Decide )        // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.\r
262                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD )\r
263                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )\r
264                                                 || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )\r
265                                         {\r
266                                                 eInst = E楽器パート.DRUMS;\r
267                                                 eAction = ESortAction.Decide;\r
268                                         }\r
269                                         if ( eAction == ESortAction.Decide )    // 決定\r
270                                         {\r
271                                                 this.tEnter押下();\r
272                                         }\r
273                                         #endregion\r
274                                         #region [ キー入力: 前に移動 ]\r
275                                         this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );\r
276                                         this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );\r
277                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
278                                         {\r
279                                                 this.t前に移動();\r
280                                         }\r
281                                         #endregion\r
282                                         #region [ キー入力: 次に移動 ]\r
283                                         this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );\r
284                                         this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );\r
285                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
286                                         {\r
287                                                 this.t次に移動();\r
288                                         }\r
289                                         #endregion\r
290                                 }\r
291                                 #region [ ポップアップメニュー 背景描画 ]\r
292                                 if ( this.txPopupMenuBackground != null )\r
293                                 {\r
294                                         this.txPopupMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );\r
295                                 }\r
296                                 #endregion\r
297                                 #region [ ソートメニュータイトル描画 ]\r
298                                 int x = 240, y = 44;\r
299                                 font.t文字列描画( x, y, strMenuTitle, false, 1.0f );\r
300                                 #endregion\r
301                                 #region [ カーソル描画 ]\r
302                                 if ( this.txCursor != null )\r
303                                 {\r
304                                         int height = 32;\r
305                                         int curX = 180;\r
306                                         int curY = 46 + ( height * ( this.n現在の選択行 + 1 ) );\r
307                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, 16, 32 ) );\r
308                                         curX += 0x10;\r
309                                         Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );\r
310                                         for ( int j = 0; j < 16; j++ )\r
311                                         {\r
312                                                 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );\r
313                                                 curX += 16;\r
314                                         }\r
315                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );\r
316                                 }\r
317                                 #endregion\r
318                                 #region [ ソート候補文字列描画 ]\r
319                                 for ( int i = 0; i < lciMenuItems.Count; i++ )\r
320                                 {\r
321                                         bool bItemBold = ( i == nItemSelecting && !bShowAllItems ) ? true : false;\r
322                                         font.t文字列描画( 190, 80 + i * 32, lciMenuItems[i].str項目名, bItemBold, 1.0f );\r
323 \r
324                                         bool bValueBold = (bItemBold || (i == nItemSelecting && bIsSelectingIntItem)) ? true : false;\r
325                                         if ( bItemBold || bShowAllItems )\r
326                                         {\r
327                                                 string s;\r
328                                                 switch ( lciMenuItems[i].str項目名 )\r
329                                                 {\r
330                                                         case "PlaySpeed":\r
331                                                                 {\r
332                                                                         double d = (double) ((int)lciMenuItems[ i ].obj現在値() / 20.0);\r
333                                                                         s = "x" + d.ToString( "0.000" );\r
334                                                                 }\r
335                                                                 break;\r
336                                                         case "ScrollSpeed":\r
337                                                                 {\r
338                                                                         double d = (double) ( ( ( (int) lciMenuItems[ i ].obj現在値() ) + 1 ) / 2.0 );\r
339                                                                         s = "x" + d.ToString( "0.0" );\r
340                                                                 }\r
341                                                                 break;\r
342 \r
343                                                         default:\r
344                                                                 s = lciMenuItems[ i ].obj現在値().ToString();\r
345                                                                 break;\r
346                                                 }\r
347                                                 font.t文字列描画( 340, 80 + i * 32, s, bValueBold, 1.0f );\r
348                                         }\r
349                                 }\r
350                                 #endregion\r
351                                 t進行描画sub();\r
352                         }\r
353                         return 0;\r
354                 }\r
355 \r
356 \r
357                 // その他\r
358 \r
359                 #region [ private ]\r
360                 //-----------------\r
361 \r
362                 private bool bキー入力待ち;\r
363 \r
364                 internal int n現在の選択行;\r
365                 internal E楽器パート eInst = E楽器パート.UNKNOWN;\r
366 \r
367                 private CTexture txPopupMenuBackground;\r
368                 private CTexture txCursor;\r
369                 private CActDFPFont font;\r
370 \r
371                 private string strMenuTitle;\r
372                 private List<CItemBase> lciMenuItems;\r
373                 private bool bShowAllItems;\r
374                 private bool bIsSelectingIntItem;\r
375 \r
376                 [StructLayout( LayoutKind.Sequential )]\r
377                 private struct STキー反復用カウンタ\r
378                 {\r
379                         public CCounter Up;\r
380                         public CCounter Down;\r
381                         public CCounter R;\r
382                         public CCounter B;\r
383                         public CCounter this[ int index ]\r
384                         {\r
385                                 get\r
386                                 {\r
387                                         switch ( index )\r
388                                         {\r
389                                                 case 0:\r
390                                                         return this.Up;\r
391 \r
392                                                 case 1:\r
393                                                         return this.Down;\r
394 \r
395                                                 case 2:\r
396                                                         return this.R;\r
397 \r
398                                                 case 3:\r
399                                                         return this.B;\r
400                                         }\r
401                                         throw new IndexOutOfRangeException();\r
402                                 }\r
403                                 set\r
404                                 {\r
405                                         switch ( index )\r
406                                         {\r
407                                                 case 0:\r
408                                                         this.Up = value;\r
409                                                         return;\r
410 \r
411                                                 case 1:\r
412                                                         this.Down = value;\r
413                                                         return;\r
414 \r
415                                                 case 2:\r
416                                                         this.R = value;\r
417                                                         return;\r
418 \r
419                                                 case 3:\r
420                                                         this.B = value;\r
421                                                         return;\r
422                                         }\r
423                                         throw new IndexOutOfRangeException();\r
424                                 }\r
425                         }\r
426                 }\r
427                 private STキー反復用カウンタ ctキー反復用;\r
428 \r
429                 private enum ESortAction : int\r
430                 {\r
431                         Cancel, Decide, Previous, Next, END\r
432                 }\r
433                 private int nItemSelecting;             // 「n現在の選択行」とは別に設ける。sortでメニュー表示直後にアイテムの中身を表示しないようにするため\r
434                 //-----------------\r
435                 #endregion\r
436         }\r
437 }\r