OSDN Git Service

#23615 Authorでのソート機能を追加。
[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                                                 this.act曲リスト.t曲リストのソート(\r
94                                                         CDTXMania.Songs管理.t曲リストのソート8_アーティスト名順, eInst, nSortOrder,\r
95                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
96                                                 );\r
97                                                 break;\r
98                                         case (int) ESortItem.SkillPoint:\r
99                                                 this.act曲リスト.t曲リストのソート(\r
100                                                         CDTXMania.Songs管理.t曲リストのソート6_SkillPoint順, eInst, nSortOrder,\r
101                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
102                                                 );\r
103                                                 break;\r
104 #if TEST_SORTBGM\r
105                                                 case (int) ESortItem.BPM:\r
106                                                 this.act曲リスト.t曲リストのソート(\r
107                                                         CDTXMania.Songs管理.t曲リストのソート9_BPM順, eInst, nSortOrder,\r
108                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
109                                                 );\r
110                                                 break;\r
111 #endif\r
112                                         case (int) ESortItem.Date:\r
113                                                 this.act曲リスト.t曲リストのソート(\r
114                                                         CDTXMania.Songs管理.t曲リストのソート7_更新日時順, eInst, nSortOrder,\r
115                                                         this.act曲リスト.n現在のアンカ難易度レベル\r
116                                                 );\r
117                                                 break;\r
118                                         case (int)ESortItem.Return:\r
119                                                 this.tDeativateSortMenu();\r
120                                                 break;\r
121                                         default:\r
122                                                 break;\r
123                                 }\r
124 \r
125                                 this.bキー入力待ち = true;\r
126                         }\r
127                 }\r
128                 public void t次に移動()\r
129                 {\r
130                         if( this.bキー入力待ち )\r
131                         {\r
132                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
133                                 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % (int)ESortItem.END;\r
134                         }\r
135                 }\r
136                 public void t前に移動()\r
137                 {\r
138                         if( this.bキー入力待ち )\r
139                         {\r
140                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
141                                 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + (int)ESortItem.END ) % (int)ESortItem.END;\r
142                         }\r
143                 }\r
144 \r
145                 \r
146                 // CActivity 実装\r
147 \r
148                 public override void On活性化()\r
149                 {\r
150                         this.n現在の選択行 = 0;\r
151                         this.bキー入力待ち = true;\r
152                         for ( int i = 0; i < 4; i++ )\r
153                         {\r
154                                 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
155                         }\r
156                         base.On活性化();\r
157                 }\r
158                 public override void On非活性化()\r
159                 {\r
160                         if( !base.b活性化してない )\r
161                         {\r
162                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
163                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
164                                 for ( int i = 0; i < 4; i++ )\r
165                                 {\r
166                                         this.ctキー反復用[ i ] = null;\r
167                                 }\r
168                                 base.On非活性化();\r
169                         }\r
170                 }\r
171                 public override void OnManagedリソースの作成()\r
172                 {\r
173                         if( !base.b活性化してない )\r
174                         {\r
175                                 this.txCursor = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );\r
176                                 this.txSortMenuBackground = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" ), false );\r
177                                 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
178                                 base.OnManagedリソースの作成();\r
179                         }\r
180                 }\r
181                 public override void OnManagedリソースの解放()\r
182                 {\r
183                         if ( !base.b活性化してない )\r
184                         {\r
185                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuChoices );\r
186                                 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
187                                 CDTXMania.tテクスチャの解放( ref this.txCursor );\r
188                         }\r
189                         base.OnManagedリソースの解放();\r
190                 }\r
191 \r
192                 public override int On進行描画()\r
193                 {\r
194                         throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );\r
195                 }\r
196                 public int t進行描画( bool bIsActive )\r
197                 {\r
198                         if( !base.b活性化してない && bIsActive )\r
199                         {\r
200                                 if( this.bキー入力待ち )\r
201                                 {\r
202 \r
203                                         #region [ キー入力: キャンセル ]\r
204                                         if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )\r
205                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )\r
206                                                 || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )\r
207                                         {       // キャンセル\r
208                                                 CDTXMania.Skin.sound取消音.t再生する();\r
209                                                 //this.bキー入力待ち = false;\r
210                                                 this.bIsActiveSortMenu = false;\r
211                                         }\r
212                                         #endregion\r
213                                         #region [ キー入力: 決定 ]\r
214                                         E楽器パート eInst = E楽器パート.UNKNOWN;\r
215                                         ESortAction eAction = ESortAction.END;\r
216                                         if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )\r
217                                         {\r
218                                                 eInst = E楽器パート.GUITAR;\r
219                                                 eAction = ESortAction.Decide;\r
220                                         }\r
221                                         else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )\r
222                                         {\r
223                                                 eInst = E楽器パート.BASS;\r
224                                                 eAction = ESortAction.Decide;\r
225                                         }\r
226                                         else if (\r
227                                                 CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.Decide )        // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.\r
228                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) \r
229                                                 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )\r
230                                                 || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )\r
231                                         {\r
232                                                 eInst = E楽器パート.DRUMS;\r
233                                                 eAction = ESortAction.Decide;\r
234                                         }\r
235                                         if (eAction == ESortAction.Decide)      // 決定\r
236                                         {\r
237                                                 this.tEnter押下(eInst);\r
238                                         }\r
239                                         #endregion\r
240                                         #region [ キー入力: 前に移動 ]\r
241                                         this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );\r
242                                         this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );\r
243                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
244                                         {\r
245                                                 this.t前に移動();\r
246                                         }\r
247                                         #endregion\r
248                                         #region [ キー入力: 次に移動 ]\r
249                                         this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );\r
250                                         this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );\r
251                                         if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
252                                         {\r
253                                                 this.t次に移動();\r
254                                         }\r
255                                         #endregion\r
256                                 }\r
257                                 #region [ ソートメニュー 背景描画 ]\r
258                                 if ( this.txSortMenuBackground != null )\r
259                                 {\r
260                                         this.txSortMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );\r
261                                 }\r
262                                 #endregion\r
263                                 #region [ ソートメニュータイトル描画 ]\r
264                                 int x = 240, y = 44;\r
265                                 font.t文字列描画( x, y, "SORT MENU", false, 1.0f);\r
266                                 #endregion\r
267                                 #region [ カーソル描画 ]\r
268                                 if ( this.txCursor != null )\r
269                                 {\r
270                                         int height = 32;\r
271                                         int curX = 180;\r
272                                         int curY = 46 + ( height * ( this.n現在の選択行 + 1 ) );\r
273                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, 16, 32 ) );\r
274                                         curX += 0x10;\r
275                                         Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );\r
276                                         for( int j = 0; j < 16; j++ )\r
277                                         {\r
278                                                 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );\r
279                                                 curX += 16;\r
280                                         }\r
281                                         this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );\r
282                                 }\r
283                                 #endregion\r
284                                 #region [ ソート候補文字列描画 ]\r
285                                 //string[] strSortItem = {\r
286                                 //    "Title", "Level", "Best Rank", "PlayCount",\r
287                                 //    //"Author",\r
288                                 //    "SkillPoint",\r
289                                 //    //"BPM",\r
290                                 //    "Date",\r
291                                 //    "Return"\r
292                                 //};\r
293                                 //string[] strSortOrder = {\r
294                                 //    "Descend", "", "Ascend"\r
295                                 //};\r
296                                 string[ , ] strSortItem = {\r
297                                         { "Title",              "Z,Y,X,...",    "A,B,C,..." },\r
298                                         { "Level",              "99,98,97,...", "1,2,3,..." },\r
299                                         { "Best Rank",  "E,D,C,...",    "SS,S,A,..." },\r
300                                         { "PlayCount",  "10,9,8,...",   "1,2,3,..." },\r
301                                         { "Author",             "Z,Y,X,...",    "A,B,C,..." },\r
302                                         { "SkillPoint", "100,99,98,...","1,2,3,..." },\r
303 #if TEST_SORTBGM\r
304                                         { "BPM",                "300,200,...",  "70,80,90,..." },\r
305 #endif\r
306                                         { "Date",               "Dec.31,30,...","Jan.1,2,..." },\r
307                                         { "Return",             "",                             "" }\r
308                                 };\r
309 \r
310                                 for ( int i = 0; i < strSortItem.GetLength(0); i++ )\r
311                                 {\r
312                                         bool bBold = ( i == nSortType ) ? true : false;\r
313                                         font.t文字列描画( 190, 80 + i * 32, strSortItem[ i, 0 ], bBold, 1.0f );\r
314                                         if ( bBold )\r
315                                         {\r
316                                                 // nSortOder+1 == 0(Ascend), (1,) 2(Descend)\r
317 //                                              if ( bIsJapanLocale )\r
318 //                                              {       // #24758 2011.4.1 yyagi: for JP locale, 昇順/降順 is used instead of ascend/descend.\r
319 //                                                      Rectangle rect = new Rectangle( 0, this.txSortMenuChoices.sz画像サイズ.Height / 2 * (nSortOrder+1)/2, this.txSortMenuChoices.sz画像サイズ.Width, this.txSortMenuChoices.sz画像サイズ.Height / 2 );\r
320 //                                                      this.txSortMenuChoices.t2D描画( CDTXMania.app.Device, 350, 78 + i * 32, rect );\r
321 //                                              }\r
322 //                                              else\r
323 //                                              {\r
324                                                         font.t文字列描画( 340, 80 + i * 32, strSortItem[ i, (nSortOrder + 1)/2+1 ], bBold, 1.0f );\r
325 //                                              }\r
326                                         }\r
327                                 }\r
328                                 #endregion\r
329 \r
330                         }\r
331                         return 0;\r
332                 }\r
333 \r
334 \r
335                 // その他\r
336 \r
337                 #region [ private ]\r
338                 //-----------------\r
339 \r
340                 private bool bキー入力待ち;\r
341 \r
342                 private int n現在の選択行;\r
343                 private CTexture txSortMenuBackground;\r
344                 private CTexture txSortMenuChoices;\r
345                 private CTexture txCursor;\r
346                 private CActDFPFont font;\r
347                 private CActSelect曲リスト act曲リスト;\r
348                 private bool bIsJapanLocale;\r
349 \r
350                 [StructLayout( LayoutKind.Sequential )]\r
351                 private struct STキー反復用カウンタ\r
352                 {\r
353                         public CCounter Up;\r
354                         public CCounter Down;\r
355                         public CCounter R;\r
356                         public CCounter B;\r
357                         public CCounter this[ int index ]\r
358                         {\r
359                                 get\r
360                                 {\r
361                                         switch ( index )\r
362                                         {\r
363                                                 case 0:\r
364                                                         return this.Up;\r
365 \r
366                                                 case 1:\r
367                                                         return this.Down;\r
368 \r
369                                                 case 2:\r
370                                                         return this.R;\r
371 \r
372                                                 case 3:\r
373                                                         return this.B;\r
374                                         }\r
375                                         throw new IndexOutOfRangeException();\r
376                                 }\r
377                                 set\r
378                                 {\r
379                                         switch ( index )\r
380                                         {\r
381                                                 case 0:\r
382                                                         this.Up = value;\r
383                                                         return;\r
384 \r
385                                                 case 1:\r
386                                                         this.Down = value;\r
387                                                         return;\r
388 \r
389                                                 case 2:\r
390                                                         this.R = value;\r
391                                                         return;\r
392 \r
393                                                 case 3:\r
394                                                         this.B = value;\r
395                                                         return;\r
396                                         }\r
397                                         throw new IndexOutOfRangeException();\r
398                                 }\r
399                         }\r
400                 }\r
401                 private STキー反復用カウンタ ctキー反復用;\r
402 \r
403                 private enum ESortAction : int\r
404                 {\r
405                         Cancel, Decide, Previous, Next, END\r
406                 }\r
407                 private enum ESortItem : int\r
408                 {\r
409                         Title = 0, Level, BestRank, PlayCount,\r
410                         Author,\r
411                         SkillPoint,\r
412 #if TEST_SORTBGM\r
413                         BPM,\r
414 #endif\r
415                         Date,\r
416                         Return, END,\r
417                         Default = 99\r
418                 };\r
419                 private enum ESortOrder : int\r
420                 {\r
421                         Ascend = 1, Descend = -1\r
422                 }\r
423                 private int nSortType, nSortOrder;\r
424 \r
425                 //-----------------\r
426                 #endregion\r
427         }\r
428 \r
429 \r
430 }\r