--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Diagnostics;\r
+using System.Text;\r
+using System.Runtime.InteropServices;\r
+using System.Drawing;\r
+using FDK;\r
+\r
+namespace DTXMania\r
+{\r
+ internal class CActSortSongs : CActivity\r
+ {\r
+\r
+ // プロパティ\r
+\r
+ /// <summary>\r
+ /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。\r
+ /// </summary>\r
+ public bool bIsActiveSortMenu\r
+ {\r
+ get; private set;\r
+ }\r
+\r
+ // コンストラクタ\r
+\r
+ public CActSortSongs()\r
+ {\r
+ base.b活性化してない = true;\r
+ this.bキー入力待ち = true;\r
+ this.bIsActiveSortMenu = false;\r
+ this.font = new CActDFPFont();\r
+ base.list子Activities.Add( this.font );\r
+ this.n現在の選択行 = 0;\r
+ nSortType = (int) ESortItem.Default;\r
+ nSortOrder = (int) ESortOrder.Descend;\r
+ }\r
+\r
+\r
+ // メソッド\r
+ public void tActivateSortMenu( ref CActSelect曲リスト ca )\r
+ {\r
+ this.act曲リスト = ca;\r
+ this.bIsActiveSortMenu = true;\r
+ }\r
+ public void tDeativateSortMenu()\r
+ {\r
+ this.bIsActiveSortMenu = false;\r
+ }\r
+\r
+ public void tEnter押下(E楽器パート eInst)\r
+ {\r
+ if( this.bキー入力待ち )\r
+ {\r
+ CDTXMania.Skin.sound決定音.t再生する();\r
+\r
+ if ( this.n現在の選択行 != (int) ESortItem.Return )\r
+ {\r
+ nSortOrder = ( nSortType == n現在の選択行 )? -nSortOrder : (int)ESortOrder.Ascend;\r
+ nSortType = n現在の選択行;\r
+ }\r
+\r
+ switch( this.n現在の選択行 )\r
+ {\r
+ case (int) ESortItem.Title:\r
+// this.act曲リスト.t曲リストのソート2_タイトル順( eInst, nSortOrder );\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート2_タイトル順, eInst, nSortOrder\r
+ );\r
+ break;\r
+ case (int) ESortItem.Level:\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート4_LEVEL順, eInst, nSortOrder,\r
+ this.act曲リスト.n現在のアンカ難易度レベル\r
+ );\r
+ break;\r
+ case (int) ESortItem.BestRank:\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート5_BestRank順, eInst, nSortOrder,\r
+ this.act曲リスト.n現在のアンカ難易度レベル\r
+ );\r
+ break;\r
+ case (int) ESortItem.PlayCount:\r
+// this.act曲リスト.t曲リストのソート3_演奏回数の多い順( eInst, nSortOrder );\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート3_演奏回数の多い順, eInst, nSortOrder,\r
+ this.act曲リスト.n現在のアンカ難易度レベル\r
+ );\r
+ break;\r
+// case (int) ESortItem.Author:\r
+// break;\r
+ case (int) ESortItem.SkillPoint:\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート6_SkillPoint順, eInst, nSortOrder,\r
+ this.act曲リスト.n現在のアンカ難易度レベル\r
+ );\r
+ break;\r
+// case (int) ESortItem.BPM:\r
+// break;\r
+ case (int) ESortItem.Date:\r
+ this.act曲リスト.t曲リストのソート(\r
+ CDTXMania.Songs管理.t曲リストのソート7_更新日時順, eInst, nSortOrder,\r
+ this.act曲リスト.n現在のアンカ難易度レベル\r
+ );\r
+ break;\r
+ case (int)ESortItem.Return:\r
+ this.tDeativateSortMenu();\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ this.bキー入力待ち = true;\r
+ }\r
+ }\r
+ public void t次に移動()\r
+ {\r
+ if( this.bキー入力待ち )\r
+ {\r
+ CDTXMania.Skin.soundカーソル移動音.t再生する();\r
+ this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % (int)ESortItem.END;\r
+ }\r
+ }\r
+ public void t前に移動()\r
+ {\r
+ if( this.bキー入力待ち )\r
+ {\r
+ CDTXMania.Skin.soundカーソル移動音.t再生する();\r
+ this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + (int)ESortItem.END ) % (int)ESortItem.END;\r
+ }\r
+ }\r
+\r
+ \r
+ // CActivity 実装\r
+\r
+ public override void On活性化()\r
+ {\r
+ this.n現在の選択行 = 0;\r
+ this.bキー入力待ち = true;\r
+ for ( int i = 0; i < 4; i++ )\r
+ {\r
+ this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
+ }\r
+ base.On活性化();\r
+ }\r
+ public override void On非活性化()\r
+ {\r
+ if( !base.b活性化してない )\r
+ {\r
+ CDTXMania.tテクスチャの解放( ref this.txCursor );\r
+ CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
+ for ( int i = 0; i < 4; i++ )\r
+ {\r
+ this.ctキー反復用[ i ] = null;\r
+ }\r
+ base.On非活性化();\r
+ }\r
+ }\r
+ public override void OnManagedリソースの作成()\r
+ {\r
+ if( !base.b活性化してない )\r
+ {\r
+ this.txCursor = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );\r
+ this.txSortMenuBackground = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" ), false );\r
+ base.OnManagedリソースの作成();\r
+ }\r
+ }\r
+ public override void OnManagedリソースの解放()\r
+ {\r
+ if ( !base.b活性化してない )\r
+ {\r
+ CDTXMania.tテクスチャの解放( ref this.txSortMenuBackground );\r
+ CDTXMania.tテクスチャの解放( ref this.txCursor );\r
+ }\r
+ base.OnManagedリソースの解放();\r
+ }\r
+\r
+ public override int On進行描画()\r
+ {\r
+ throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );\r
+ }\r
+ public int t進行描画( bool bIsActive )\r
+ {\r
+ if( !base.b活性化してない && bIsActive )\r
+ {\r
+ if( this.bキー入力待ち )\r
+ {\r
+\r
+ #region [ キー入力: キャンセル ]\r
+ if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )\r
+ || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )\r
+ || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )\r
+ { // キャンセル\r
+ CDTXMania.Skin.sound取消音.t再生する();\r
+ //this.bキー入力待ち = false;\r
+ this.bIsActiveSortMenu = false;\r
+ }\r
+ #endregion\r
+ #region [ キー入力: 決定 ]\r
+ E楽器パート eInst = E楽器パート.UNKNOWN;\r
+ ESortAction eAction = ESortAction.END;\r
+ if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )\r
+ {\r
+ eInst = E楽器パート.GUITAR;\r
+ eAction = ESortAction.Decide;\r
+ }\r
+ else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )\r
+ {\r
+ eInst = E楽器パート.BASS;\r
+ eAction = ESortAction.Decide;\r
+ }\r
+ else if (\r
+ CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) \r
+ || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )\r
+ || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )\r
+ {\r
+ eInst = E楽器パート.DRUMS;\r
+ eAction = ESortAction.Decide;\r
+ }\r
+ if (eAction == ESortAction.Decide) // 決定\r
+ {\r
+ this.tEnter押下(eInst);\r
+ }\r
+ #endregion\r
+ #region [ キー入力: 前に移動 ]\r
+ this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );\r
+ this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );\r
+ if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
+ {\r
+ this.t前に移動();\r
+ }\r
+ #endregion\r
+ #region [ キー入力: 次に移動 ]\r
+ this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );\r
+ this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );\r
+ if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
+ {\r
+ this.t次に移動();\r
+ }\r
+ #endregion\r
+ }\r
+ #region [ ソートメニュー 背景描画 ]\r
+ if ( this.txSortMenuBackground != null )\r
+ {\r
+ this.txSortMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );\r
+ }\r
+ #endregion\r
+ #region [ ソートメニュータイトル描画 ]\r
+ int x = 240, y = 44;\r
+ font.t文字列描画( x, y, "SORT MENU", false, 1.0f);\r
+ #endregion\r
+ #region [ カーソル描画 ]\r
+ if ( this.txCursor != null )\r
+ {\r
+ int height = 32;\r
+ int curX = 180;\r
+ int curY = 46 + ( height * ( this.n現在の選択行 + 1 ) );\r
+ this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, 16, 32 ) );\r
+ curX += 0x10;\r
+ Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );\r
+ for( int j = 0; j < 16; j++ )\r
+ {\r
+ this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );\r
+ curX += 16;\r
+ }\r
+ this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );\r
+ }\r
+ #endregion\r
+ #region [ ソート候補文字列描画 ]\r
+ string[] strSortItem = {\r
+ "Title", "Level", "Best Rank", "PlayCount",\r
+ //"Author",\r
+ "SkillPoint",\r
+ //"BPM",\r
+ "Date",\r
+ "Return"\r
+ };\r
+ string[] strSortOrder = {\r
+ "Descend", "", "Ascend"\r
+ };\r
+ for ( int i = 0; i < strSortItem.Length; i++ )\r
+ {\r
+ bool bBold = ( i == nSortType ) ? true : false;\r
+ font.t文字列描画( 190, 80 + i * 32, strSortItem[ i ], bBold, 1.0f );\r
+ if ( bBold )\r
+ {\r
+ // nSortOder+1 == 0(Ascend), (1,) 2(Descend)\r
+ font.t文字列描画( 350, 80 + i * 32, strSortOrder[ nSortOrder + 1 ], bBold, 1.0f );\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ }\r
+ return 0;\r
+ }\r
+\r
+\r
+ // その他\r
+\r
+ #region [ private ]\r
+ //-----------------\r
+\r
+ private bool bキー入力待ち;\r
+\r
+ private int n現在の選択行;\r
+ private CTexture txSortMenuBackground;\r
+ private CTexture txCursor;\r
+ private CActDFPFont font;\r
+ private CActSelect曲リスト act曲リスト;\r
+\r
+ [StructLayout( LayoutKind.Sequential )]\r
+ private struct STキー反復用カウンタ\r
+ {\r
+ public CCounter Up;\r
+ public CCounter Down;\r
+ public CCounter R;\r
+ public CCounter B;\r
+ public CCounter this[ int index ]\r
+ {\r
+ get\r
+ {\r
+ switch ( index )\r
+ {\r
+ case 0:\r
+ return this.Up;\r
+\r
+ case 1:\r
+ return this.Down;\r
+\r
+ case 2:\r
+ return this.R;\r
+\r
+ case 3:\r
+ return this.B;\r
+ }\r
+ throw new IndexOutOfRangeException();\r
+ }\r
+ set\r
+ {\r
+ switch ( index )\r
+ {\r
+ case 0:\r
+ this.Up = value;\r
+ return;\r
+\r
+ case 1:\r
+ this.Down = value;\r
+ return;\r
+\r
+ case 2:\r
+ this.R = value;\r
+ return;\r
+\r
+ case 3:\r
+ this.B = value;\r
+ return;\r
+ }\r
+ throw new IndexOutOfRangeException();\r
+ }\r
+ }\r
+ }\r
+ private STキー反復用カウンタ ctキー反復用;\r
+\r
+ private enum ESortAction : int\r
+ {\r
+ Cancel, Decide, Previous, Next, END\r
+ }\r
+ private enum ESortItem : int\r
+ {\r
+ Title = 0, Level, BestRank, PlayCount,\r
+ //Author,\r
+ SkillPoint,\r
+ //BPM,\r
+ Date,\r
+ Return, END,\r
+ Default = 99\r
+ };\r
+ private enum ESortOrder : int\r
+ {\r
+ Ascend = 1, Descend = -1\r
+ }\r
+ private int nSortType, nSortOrder;\r
+\r
+ //-----------------\r
+ #endregion\r
+ }\r
+\r
+\r
+}\r