OSDN Git Service

#24756 ソートメニュー内の決定を右シンバルでできなかった問題を修正。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 05.選曲 / CActSortSongs.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 namespace DTXMania\r
11 {\r
12         internal class CActSortSongs : CActivity\r
13         {\r
14 \r
15                 // プロパティ\r
16 \r
17                 /// <summary>\r
18                 /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。\r
19                 /// </summary>\r
20                 public bool bIsActiveSortMenu\r
21                 {\r
22                         get; private set;\r
23                 }\r
24 \r
25                 // コンストラクタ\r
26 \r
27                 public CActSortSongs()\r
28                 {\r
29                         base.b活性化してない = true;\r
30                         this.bキー入力待ち = true;\r
31                         this.bIsActiveSortMenu = false;\r
32                         this.font = new CActDFPFont();\r
33                         base.list子Activities.Add( this.font );\r
34                         this.n現在の選択行 = 0;\r
35                         nSortType = (int) ESortItem.Default;\r
36                         nSortOrder = (int) ESortOrder.Descend;\r
37                         bIsJapanLocale = ( CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja" );       // #24758 2011.4.1 yyagi add; To check JP locale\r
38                 }\r
39 \r
40 \r
41                 // メソッド\r
42                 public void tActivateSortMenu( ref CActSelect曲リスト ca )\r
43                 {\r
44                         this.act曲リスト = ca;\r
45                         nSortType = (int) ESortItem.Default;            // #24757 2011.4.1 yyagi: Clear sorting status in each stating menu.\r
46                         nSortOrder = (int) ESortOrder.Descend;          //\r
47                         this.bIsActiveSortMenu = true;\r
48                 }\r
49                 public void tDeativateSortMenu()\r
50                 {\r
51                         this.bIsActiveSortMenu = false;\r
52                 }\r
53 \r
54                 public void tEnter押下(E楽器パート eInst)\r
55                 {\r
56                         if( this.bキー入力待ち )\r
57                         {\r
58                                 CDTXMania.Skin.sound決定音.t再生する();\r
59 \r
60                                 if ( this.n現在の選択行 != (int) ESortItem.Return )\r
61                                 {\r
62                                         nSortOrder = ( nSortType == n現在の選択行 )? -nSortOrder : (int)ESortOrder.Ascend;\r
63                                         nSortType = n現在の選択行;\r
64                                 }\r
65 \r
66                                 switch( this.n現在の選択行 )\r
67                                 {\r
68                                         case (int) ESortItem.Title:\r
69                                                 this.act曲リスト.t曲リストのソート(\r
70                                                         CDTXMania.Songs管理.t曲リストのソート2_タイトル順, eInst, nSortOrder\r
71                                                 );\r
72                                                 break;\r
73                                         case (int) ESortItem.Level:\r
74                                                 this.act曲リスト.t曲リストのソート(\r
75                                                         CDTXMania.Songs管理.t曲リストのソート4_LEVEL順, eInst, nSortOrder,\r
76                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
77                                                 );\r
78                                                 break;\r
79                                         case (int) ESortItem.BestRank:\r
80                                                 this.act曲リスト.t曲リストのソート(\r
81                                                         CDTXMania.Songs管理.t曲リストのソート5_BestRank順, eInst, nSortOrder,\r
82                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
83                                                 );\r
84                                                 break;\r
85                                         case (int) ESortItem.PlayCount:\r
86 //                                              this.act曲リスト.t曲リストのソート3_演奏回数の多い順( eInst, nSortOrder );\r
87                                                 this.act曲リスト.t曲リストのソート(\r
88                                                         CDTXMania.Songs管理.t曲リストのソート3_演奏回数の多い順, eInst, nSortOrder,\r
89                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
90                                                 );\r
91                                                 break;\r
92 //                                      case (int) ESortItem.Author:\r
93 //                                              break;\r
94                                         case (int) ESortItem.SkillPoint:\r
95                                                 this.act曲リスト.t曲リストのソート(\r
96                                                         CDTXMania.Songs管理.t曲リストのソート6_SkillPoint順, eInst, nSortOrder,\r
97                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
98                                                 );\r
99                                                 break;\r
100 //                                      case (int) ESortItem.BPM:\r
101 //                                              break;\r
102                                         case (int) ESortItem.Date:\r
103                                                 this.act曲リスト.t曲リストのソート(\r
104                                                         CDTXMania.Songs管理.t曲リストのソート7_更新日時順, eInst, nSortOrder,\r
105                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
106                                                 );\r
107                                                 break;\r
108                                         case (int)ESortItem.Return:\r
109                                                 this.tDeativateSortMenu();\r
110                                                 break;\r
111                                         default:\r
112                                                 break;\r
113                                 }\r
114 \r
115                                 this.bキー入力待ち = true;\r
116                         }\r
117                 }\r
118                 public void t次に移動()\r
119                 {\r
120                         if( this.bキー入力待ち )\r
121                         {\r
122                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
123                                 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % (int)ESortItem.END;\r
124                         }\r
125                 }\r
126                 public void t前に移動()\r
127                 {\r
128                         if( this.bキー入力待ち )\r
129                         {\r
130                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
131                                 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + (int)ESortItem.END ) % (int)ESortItem.END;\r
132                         }\r
133                 }\r
134 \r
135                 \r
136                 // CActivity 実装\r
137 \r
138                 public override void On活性化()\r
139                 {\r
140                         this.n現在の選択行 = 0;\r
141                         this.bキー入力待ち = true;\r
142                         for ( int i = 0; i < 4; i++ )\r
143                         {\r
144                                 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
145                         }\r
146                         base.On活性化();\r
147                 }\r
148                 public override void On非活性化()\r
149                 {\r
150                         if( !base.b活性化してない )\r
151                         {\r
152                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
153                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
154                                 for ( int i = 0; i < 4; i++ )\r
155                                 {\r
156                                         this.ctキー反復用[ i ] = null;\r
157                                 }\r
158                                 base.On非活性化();\r
159                         }\r
160                 }\r
161                 public override void OnManagedリソースの作成()\r
162                 {\r
163                         if( !base.b活性化してない )\r
164                         {\r
165                                 this.txCursor = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );\r
166                                 this.txSortMenuBackground = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" ), false );\r
167                                 this.txSortMenuChoices = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu choices.png" ), false );    // #24758 2011.4.1 yyagi; for JP locale, Japanese 昇順/降順 (ascend/descend) png parts.\r
168                                 base.OnManagedリソースの作成();\r
169                         }\r
170                 }\r
171                 public override void OnManagedリソースの解放()\r
172                 {\r
173                         if ( !base.b活性化してない )\r
174                         {\r
175                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuChoices );\r
176                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
177                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
178                         }\r
179                         base.OnManagedリソースの解放();\r
180                 }\r
181 \r
182                 public override int On進行描画()\r
183                 {\r
184                         throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );\r
185                 }\r
186                 public int t進行描画( bool bIsActive )\r
187                 {\r
188                         if( !base.b活性化してない && bIsActive )\r
189                         {\r
190                                 if( this.bキー入力待ち )\r
191                                 {\r
192 \r
193                                         #region [ キー入力: キャンセル ]\r
194                                         if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )\r
195                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )\r
196                                                 || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )\r
197                                         {       // キャンセル\r
198                                                 CDTXMania.Skin.sound取消音.t再生する();\r
199                                                 //this.bキー入力待ち = false;\r
200                                                 this.bIsActiveSortMenu = false;\r
201                                         }\r
202                                         #endregion\r
203                                         #region [ キー入力: 決定 ]\r
204                                         E楽器パート eInst = E楽器パート.UNKNOWN;\r
205                                         ESortAction eAction = ESortAction.END;\r
206                                         if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )\r
207                                         {\r
208                                                 eInst = E楽器パート.GUITAR;\r
209                                                 eAction = ESortAction.Decide;\r
210                                         }\r
211                                         else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )\r
212                                         {\r
213                                                 eInst = E楽器パート.BASS;\r
214                                                 eAction = ESortAction.Decide;\r
215                                         }\r
216                                         else if (\r
217                                                 CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.Decide )        // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.\r
218                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) \r
219                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )\r
220                                                 || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )\r
221                                         {\r
222                                                 eInst = E楽器パート.DRUMS;\r
223                                                 eAction = ESortAction.Decide;\r
224                                         }\r
225                                         if (eAction == ESortAction.Decide)      // 決定\r
226                                         {\r
227                                                 this.tEnter押下(eInst);\r
228                                         }\r
229                                         #endregion\r
230                                         #region [ キー入力: 前に移動 ]\r
231                                         this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );\r
232                                         this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );\r
233                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
234                                         {\r
235                                                 this.t前に移動();\r
236                                         }\r
237                                         #endregion\r
238                                         #region [ キー入力: 次に移動 ]\r
239                                         this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );\r
240                                         this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );\r
241                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
242                                         {\r
243                                                 this.t次に移動();\r
244                                         }\r
245                                         #endregion\r
246                                 }\r
247                                 #region [ ソートメニュー 背景描画 ]\r
248                                 if ( this.txSortMenuBackground != null )\r
249                                 {\r
250                                         this.txSortMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );\r
251                                 }\r
252                                 #endregion\r
253                                 #region [ ソートメニュータイトル描画 ]\r
254                                 int x = 240, y = 44;\r
255                                 font.t文字列描画( x, y, "SORT MENU", false, 1.0f);\r
256                                 #endregion\r
257                                 #region [ カーソル描画 ]\r
258                                 if ( this.txCursor != null )\r
259                                 {\r
260                                         int height = 32;\r
261                                         int curX = 180;\r
262                                         int curY = 46 + ( height * ( this.n現在の選択行 + 1 ) );\r
263                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, 16, 32 ) );\r
264                                         curX += 0x10;\r
265                                         Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );\r
266                                         for( int j = 0; j < 16; j++ )\r
267                                         {\r
268                                                 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );\r
269                                                 curX += 16;\r
270                                         }\r
271                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );\r
272                                 }\r
273                                 #endregion\r
274                                 #region [ ソート候補文字列描画 ]\r
275                                 string[] strSortItem = {\r
276                                         "Title", "Level", "Best Rank", "PlayCount",\r
277                                         //"Author",\r
278                                         "SkillPoint",\r
279                                         //"BPM",\r
280                                         "Date",\r
281                                         "Return"\r
282                                 };\r
283                                 string[] strSortOrder = {\r
284                                         "Descend", "", "Ascend"\r
285                                 };\r
286                                 for ( int i = 0; i < strSortItem.Length; i++ )\r
287                                 {\r
288                                         bool bBold = ( i == nSortType ) ? true : false;\r
289                                         font.t文字列描画( 190, 80 + i * 32, strSortItem[ i ], bBold, 1.0f );\r
290                                         if ( bBold )\r
291                                         {\r
292                                                 // nSortOder+1 == 0(Ascend), (1,) 2(Descend)\r
293                                                 if ( bIsJapanLocale )\r
294                                                 {       // #24758 2011.4.1 yyagi: for JP locale, 昇順/降順 is used instead of ascend/descend.\r
295                                                         Rectangle rect = new Rectangle( 0, this.txSortMenuChoices.sz画像サイズ.Height / 2 * (nSortOrder+1)/2, this.txSortMenuChoices.sz画像サイズ.Width, this.txSortMenuChoices.sz画像サイズ.Height / 2 );\r
296                                                         this.txSortMenuChoices.t2D描画( CDTXMania.app.Device, 350, 78 + i * 32, rect );\r
297                                                 }\r
298                                                 else\r
299                                                 {\r
300                                                         font.t文字列描画( 350, 80 + i * 32, strSortOrder[ nSortOrder + 1 ], bBold, 1.0f );\r
301                                                 }\r
302                                         }\r
303                                 }\r
304                                 #endregion\r
305 \r
306                         }\r
307                         return 0;\r
308                 }\r
309 \r
310 \r
311                 // その他\r
312 \r
313                 #region [ private ]\r
314                 //-----------------\r
315 \r
316                 private bool bキー入力待ち;\r
317 \r
318                 private int n現在の選択行;\r
319                 private CTexture txSortMenuBackground;\r
320                 private CTexture txSortMenuChoices;\r
321                 private CTexture txCursor;\r
322                 private CActDFPFont font;\r
323                 private CActSelect曲リスト act曲リスト;\r
324                 private bool bIsJapanLocale;\r
325 \r
326                 [StructLayout( LayoutKind.Sequential )]\r
327                 private struct STキー反復用カウンタ\r
328                 {\r
329                         public CCounter Up;\r
330                         public CCounter Down;\r
331                         public CCounter R;\r
332                         public CCounter B;\r
333                         public CCounter this[ int index ]\r
334                         {\r
335                                 get\r
336                                 {\r
337                                         switch ( index )\r
338                                         {\r
339                                                 case 0:\r
340                                                         return this.Up;\r
341 \r
342                                                 case 1:\r
343                                                         return this.Down;\r
344 \r
345                                                 case 2:\r
346                                                         return this.R;\r
347 \r
348                                                 case 3:\r
349                                                         return this.B;\r
350                                         }\r
351                                         throw new IndexOutOfRangeException();\r
352                                 }\r
353                                 set\r
354                                 {\r
355                                         switch ( index )\r
356                                         {\r
357                                                 case 0:\r
358                                                         this.Up = value;\r
359                                                         return;\r
360 \r
361                                                 case 1:\r
362                                                         this.Down = value;\r
363                                                         return;\r
364 \r
365                                                 case 2:\r
366                                                         this.R = value;\r
367                                                         return;\r
368 \r
369                                                 case 3:\r
370                                                         this.B = value;\r
371                                                         return;\r
372                                         }\r
373                                         throw new IndexOutOfRangeException();\r
374                                 }\r
375                         }\r
376                 }\r
377                 private STキー反復用カウンタ ctキー反復用;\r
378 \r
379                 private enum ESortAction : int\r
380                 {\r
381                         Cancel, Decide, Previous, Next, END\r
382                 }\r
383                 private enum ESortItem : int\r
384                 {\r
385                         Title = 0, Level, BestRank, PlayCount,\r
386                         //Author,\r
387                         SkillPoint,\r
388                         //BPM,\r
389                         Date,\r
390                         Return, END,\r
391                         Default = 99\r
392                 };\r
393                 private enum ESortOrder : int\r
394                 {\r
395                         Ascend = 1, Descend = -1\r
396                 }\r
397                 private int nSortType, nSortOrder;\r
398 \r
399                 //-----------------\r
400                 #endregion\r
401         }\r
402 \r
403 \r
404 }\r