2 using System.Collections.Generic;
\r
3 using System.Diagnostics;
\r
4 using System.Globalization;
\r
6 using System.Runtime.InteropServices;
\r
7 using System.Drawing;
\r
12 internal class CActSortSongs : CActivity
\r
18 /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。
\r
20 public bool bIsActiveSortMenu
\r
27 public CActSortSongs()
\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
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
42 public void tActivateSortMenu( ref CActSelect曲リスト 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
49 public void tDeativateSortMenu()
\r
51 this.bIsActiveSortMenu = false;
\r
54 public void tEnter押下(E楽器パート eInst)
\r
58 CDTXMania.Skin.sound決定音.t再生する();
\r
60 if ( this.n現在の選択行 != (int) ESortItem.Return )
\r
62 nSortOrder = ( nSortType == n現在の選択行 )? -nSortOrder : (int)ESortOrder.Ascend;
\r
63 nSortType = n現在の選択行;
\r
66 switch( this.n現在の選択行 )
\r
68 case (int) ESortItem.Title:
\r
69 this.act曲リスト.t曲リストのソート(
\r
70 CDTXMania.Songs管理.t曲リストのソート2_タイトル順, eInst, nSortOrder
\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
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
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
92 case (int) ESortItem.Author:
\r
93 this.act曲リスト.t曲リストのソート(
\r
94 CDTXMania.Songs管理.t曲リストのソート8_アーティスト名順, eInst, nSortOrder,
\r
95 this.act曲リスト.n現在のアンカ難易度レベル
\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
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
112 case (int) ESortItem.Date:
\r
113 this.act曲リスト.t曲リストのソート(
\r
114 CDTXMania.Songs管理.t曲リストのソート7_更新日時順, eInst, nSortOrder,
\r
115 this.act曲リスト.n現在のアンカ難易度レベル
\r
118 case (int)ESortItem.Return:
\r
119 this.tDeativateSortMenu();
\r
125 this.bキー入力待ち = true;
\r
128 public void t次に移動()
\r
132 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
133 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % (int)ESortItem.END;
\r
136 public void t前に移動()
\r
140 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
141 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + (int)ESortItem.END ) % (int)ESortItem.END;
\r
148 public override void On活性化()
\r
151 this.bキー入力待ち = true;
\r
152 for ( int i = 0; i < 4; i++ )
\r
154 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
\r
158 public override void On非活性化()
\r
160 if( !base.b活性化してない )
\r
162 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
163 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );
\r
164 for ( int i = 0; i < 4; i++ )
\r
166 this.ctキー反復用[ i ] = null;
\r
171 public override void OnManagedリソースの作成()
\r
173 if( !base.b活性化してない )
\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
181 public override void OnManagedリソースの解放()
\r
183 if ( !base.b活性化してない )
\r
185 CDTXMania.tテクスチャの解放( ref this.txSortMenuChoices );
\r
186 CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );
\r
187 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
189 base.OnManagedリソースの解放();
\r
192 public override int On進行描画()
\r
194 throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );
\r
196 public int t進行描画( bool bIsActive )
\r
198 if( !base.b活性化してない && bIsActive )
\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
208 CDTXMania.Skin.sound取消音.t再生する();
\r
209 //this.bキー入力待ち = false;
\r
210 this.bIsActiveSortMenu = false;
\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
218 eInst = E楽器パート.GUITAR;
\r
219 eAction = ESortAction.Decide;
\r
221 else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )
\r
223 eInst = E楽器パート.BASS;
\r
224 eAction = ESortAction.Decide;
\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
232 eInst = E楽器パート.DRUMS;
\r
233 eAction = ESortAction.Decide;
\r
235 if (eAction == ESortAction.Decide) // 決定
\r
237 this.tEnter押下(eInst);
\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
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
257 #region [ ソートメニュー 背景描画 ]
\r
258 if ( this.txSortMenuBackground != null )
\r
260 this.txSortMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );
\r
263 #region [ ソートメニュータイトル描画 ]
\r
264 int x = 240, y = 44;
\r
265 font.t文字列描画( x, y, "SORT MENU", false, 1.0f);
\r
268 if ( this.txCursor != null )
\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
275 Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );
\r
276 for( int j = 0; j < 16; j++ )
\r
278 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );
\r
281 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );
\r
284 #region [ ソート候補文字列描画 ]
\r
285 //string[] strSortItem = {
\r
286 // "Title", "Level", "Best Rank", "PlayCount",
\r
293 //string[] strSortOrder = {
\r
294 // "Descend", "", "Ascend"
\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
304 { "BPM", "300,200,...", "70,80,90,..." },
\r
306 { "Date", "Dec.31,30,...","Jan.1,2,..." },
\r
307 { "Return", "", "" }
\r
310 for ( int i = 0; i < strSortItem.GetLength(0); i++ )
\r
312 bool bBold = ( i == nSortType ) ? true : false;
\r
313 font.t文字列描画( 190, 80 + i * 32, strSortItem[ i, 0 ], bBold, 1.0f );
\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
324 font.t文字列描画( 340, 80 + i * 32, strSortItem[ i, (nSortOrder + 1)/2+1 ], bBold, 1.0f );
\r
337 #region [ private ]
\r
338 //-----------------
\r
340 private bool bキー入力待ち;
\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
350 [StructLayout( LayoutKind.Sequential )]
\r
351 private struct STキー反復用カウンタ
\r
353 public CCounter Up;
\r
354 public CCounter Down;
\r
357 public CCounter this[ int index ]
\r
375 throw new IndexOutOfRangeException();
\r
397 throw new IndexOutOfRangeException();
\r
401 private STキー反復用カウンタ ctキー反復用;
\r
403 private enum ESortAction : int
\r
405 Cancel, Decide, Previous, Next, END
\r
407 private enum ESortItem : int
\r
409 Title = 0, Level, BestRank, PlayCount,
\r
419 private enum ESortOrder : int
\r
421 Ascend = 1, Descend = -1
\r
423 private int nSortType, nSortOrder;
\r
425 //-----------------
\r