+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Diagnostics;\r
-using System.Globalization;\r
-using System.Text;\r
-using System.Runtime.InteropServices;\r
-using System.Drawing;\r
-using System.IO;\r
-using FDK;\r
-\r
-using SlimDXKey = SlimDX.DirectInput.Key;\r
-\r
-namespace DTXMania\r
-{\r
- internal class CActSelectPopupMenu : CActivity\r
- {\r
- // プロパティ\r
- public int GetIndex(int pos)\r
- {\r
- return lciMenuItems[pos].cItem.Index;\r
- }\r
-\r
- public COptionBase GetObj現在値(int pos)\r
- {\r
- return lciMenuItems[pos].cItem;\r
- }\r
-\r
- public bool bGotoDetailConfig\r
- {\r
- get;\r
- internal set;\r
- }\r
-\r
- /// <summary>\r
- /// ポップアップメニュー機能を使用中かどうか。\r
- /// 外部からこれをtrueにすると、ポップアップメニューが出現する。falseにすると消える。\r
- /// </summary>\r
- public bool bIsActivePopupMenu\r
- {\r
- get;\r
- private set;\r
- }\r
-\r
- public virtual void tActivatePopupMenu(EPart einst)\r
- {\r
- nItemSelecting = -1; // #24757 2011.4.1 yyagi: Clear sorting status in each stating menu.\r
- this.eInst = einst;\r
- this.bIsActivePopupMenu = true;\r
- this.bIsSelectingIntItem = false;\r
- this.bGotoDetailConfig = false;\r
- }\r
- public virtual void tDeativatePopupMenu()\r
- {\r
- this.bIsActivePopupMenu = false;\r
- }\r
-\r
- public void Initialize(List<COptionBase> menulist, bool showAllItems, string title, int defaultPos = 0)\r
- {\r
-\r
- prvFont = new CPrivateFastFont(CSkin.Path(@"Graphics\fonts\mplus-1p-heavy.ttf"), (int)(18 * Scale.Y));\r
-\r
- stqMenuTitle = new stQuickMenuItem();\r
- stqMenuTitle.cItem = new COptionString(title);\r
- stqMenuTitle.cItem.label = title;\r
- stqMenuTitle.txName = TextureFactory.tテクスチャの生成(prvFont.DrawPrivateFont(title, Color.White, Color.Black), false);\r
- stqMenuTitle.rectName = prvFont.RectStrings;\r
- lciMenuItems = new stQuickMenuItem[menulist.Count];\r
- for (int i = 0; i < menulist.Count; i++)\r
- {\r
- stQuickMenuItem stqm = new stQuickMenuItem();\r
- stqm.cItem = menulist[i];\r
- stqm.txName = TextureFactory.tテクスチャの生成(prvFont.DrawPrivateFont(menulist[i].label, Color.White, Color.Black), false);\r
- stqm.rectName = prvFont.RectStrings;\r
- lciMenuItems[i] = stqm;\r
- }\r
-\r
- bShowAllItems = showAllItems;\r
- n現在の選択行 = defaultPos;\r
- }\r
-\r
-\r
- public void tEnter押下()\r
- {\r
- if (this.bキー入力待ち)\r
- {\r
- CDTXMania.Instance.Skin.sound決定音.t再生する();\r
-\r
- if (this.n現在の選択行 != lciMenuItems.Length - 1)\r
- {\r
- if (lciMenuItems[n現在の選択行].cItem is IOptionList ||\r
- lciMenuItems[n現在の選択行].cItem is COptionBool)\r
- {\r
- lciMenuItems[n現在の選択行].cItem.OnNext();\r
- }\r
- else if (lciMenuItems[n現在の選択行].cItem is COptionInteger)\r
- {\r
- bIsSelectingIntItem = !bIsSelectingIntItem; // 選択状態/選択解除状態を反転する\r
- }\r
- nItemSelecting = n現在の選択行;\r
- }\r
- lciMenuItems[n現在の選択行].cItem.OnEnter();\r
- this.bキー入力待ち = true;\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// 追加の描画処理。必要に応じて、継承先で記述する。\r
- /// </summary>\r
- public virtual void t進行描画sub()\r
- {\r
- }\r
-\r
- public void t次に移動()\r
- {\r
- if (this.bキー入力待ち)\r
- {\r
- CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();\r
- if (bIsSelectingIntItem)\r
- {\r
- // 項目移動と数値上下は方向が逆になるので注意\r
- lciMenuItems[n現在の選択行].cItem.OnPrevious();\r
- }\r
- else\r
- {\r
- if (++this.n現在の選択行 >= this.lciMenuItems.Length)\r
- {\r
- this.n現在の選択行 = 0;\r
- }\r
- }\r
- }\r
- }\r
- public void t前に移動()\r
- {\r
- if (this.bキー入力待ち)\r
- {\r
- CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();\r
- if (bIsSelectingIntItem)\r
- {\r
- // 項目移動と数値上下は方向が逆になるので注意\r
- lciMenuItems[n現在の選択行].cItem.OnNext();\r
- }\r
- else\r
- {\r
- if (--this.n現在の選択行 < 0)\r
- {\r
- this.n現在の選択行 = this.lciMenuItems.Length - 1;\r
- }\r
- }\r
- }\r
- }\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.Instance.Timer);\r
- }\r
- base.b活性化してない = true;\r
-\r
- this.bIsActivePopupMenu = false;\r
- nItemSelecting = -1;\r
-\r
-\r
- base.On活性化();\r
- }\r
-\r
- public override void On非活性化()\r
- {\r
- if (!base.b活性化してない)\r
- {\r
- //TextureFactory.tテクスチャの解放(ref this.txCursor);\r
- //TextureFactory.tテクスチャの解放(ref this.txPopupMenuBackground);\r
- for (int i = 0; i < 4; i++)\r
- {\r
- this.ctキー反復用[i] = null;\r
- }\r
- base.On非活性化();\r
- }\r
- }\r
-\r
- public override void OnManagedリソースの作成()\r
- {\r
- if (!base.b活性化してない)\r
- {\r
- string pathCursor = CSkin.Path(@"Graphics\ScreenConfig menu cursor.png"); ;\r
- string pathPopupMenuBackground = CSkin.Path(@"Graphics\ScreenSelect sort menu background.png");\r
- if (File.Exists(pathCursor))\r
- {\r
- this.txCursor = TextureFactory.tテクスチャの生成(pathCursor, false);\r
- }\r
- if (File.Exists(pathPopupMenuBackground))\r
- {\r
- this.txPopupMenuBackground = TextureFactory.tテクスチャの生成(pathPopupMenuBackground, false);\r
- }\r
- base.OnManagedリソースの作成();\r
- }\r
- }\r
-\r
- public override void OnManagedリソースの解放()\r
- {\r
- if ( base.b活性化してる )\r
- {\r
- TextureFactory.tテクスチャの解放( ref this.txPopupMenuBackground );\r
- TextureFactory.tテクスチャの解放( ref this.txCursor );\r
-\r
- TextureFactory.tテクスチャの解放( ref stqMenuTitle.txName );\r
- if ( lciMenuItems != null )\r
- {\r
- for ( int i = 0; i < lciMenuItems.Length; i++ )\r
- {\r
- TextureFactory.tテクスチャの解放( ref lciMenuItems[i].txName );\r
- }\r
- }\r
- }\r
- base.OnManagedリソースの解放();\r
- }\r
-\r
- public override int On進行描画()\r
- {\r
- throw new InvalidOperationException("t進行描画(bool)のほうを使用してください。");\r
- }\r
-\r
- public int t進行描画()\r
- {\r
- if (!base.b活性化してない && this.bIsActivePopupMenu)\r
- {\r
- if (this.bキー入力待ち)\r
- {\r
- #region [ Shift-F1: CONFIG画面 ]\r
- if( ( CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.RightShift ) || CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.LeftShift ) ) &&\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.F1 ) )\r
- {\r
- // [SHIFT] + [F1] CONFIG\r
- CDTXMania.Instance.Skin.sound取消音.t再生する();\r
- // tCancel();\r
- this.bGotoDetailConfig = true;\r
- }\r
- #endregion\r
- #region [ キー入力: キャンセル ]\r
- else if( CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Escape )\r
- || CDTXMania.Instance.Pad.bCancelPadIsPressedDGB() )\r
- {\r
- // キャンセル\r
- CDTXMania.Instance.Skin.sound取消音.t再生する();\r
- // tCancel();\r
- this.bIsActivePopupMenu = false;\r
- }\r
- #endregion\r
-\r
- #region [ キー入力: 決定 ]\r
- // E楽器パート eInst = E楽器パート.UNKNOWN;\r
- ESortAction eAction = ESortAction.END;\r
- if (CDTXMania.Instance.Pad.b押された(EPad.GtDecide))\r
- {\r
- eInst = EPart.Guitar;\r
- eAction = ESortAction.Decide;\r
- }\r
- else if (CDTXMania.Instance.Pad.b押された(EPad.BsDecide))\r
- {\r
- eInst = EPart.Bass;\r
- eAction = ESortAction.Decide;\r
- }\r
- else if (\r
- CDTXMania.Instance.Pad.b押された(EPad.CY) // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.\r
- || CDTXMania.Instance.Pad.b押された(EPad.RD)\r
- || CDTXMania.Instance.Pad.b押された(EPad.LC)\r
- || (CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDXKey.Return)))\r
- {\r
- eInst = EPart.Drums;\r
- eAction = ESortAction.Decide;\r
- }\r
- if (eAction == ESortAction.Decide) // 決定\r
- {\r
- this.tEnter押下();\r
- }\r
- #endregion\r
- #region [ キー入力: 前に移動 ]\r
-\r
- this.ctキー反復用.Up.tキー反復(\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.UpArrow ),\r
- new CCounter.DGキー処理( this.t前に移動 ) );\r
-\r
- this.ctキー反復用.R.tキー反復(\r
- CDTXMania.Instance.Pad.b押されている( EPad.GtR ) || CDTXMania.Instance.Pad.b押されている( EPad.BsR ),\r
- new CCounter.DGキー処理( this.t前に移動 ) );\r
-\r
- if (CDTXMania.Instance.Pad.b押された(EPad.SD))\r
- {\r
- this.t前に移動();\r
- }\r
- #endregion\r
- #region [ キー入力: 次に移動 ]\r
- this.ctキー反復用.Down.tキー反復(\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.DownArrow ),\r
- new CCounter.DGキー処理( this.t次に移動 ) );\r
-\r
- this.ctキー反復用.B.tキー反復(\r
- CDTXMania.Instance.Pad.b押されている( EPad.GtB ) || CDTXMania.Instance.Pad.b押されている( EPad.BsB ),\r
- new CCounter.DGキー処理( this.t次に移動 ) );\r
-\r
- if (CDTXMania.Instance.Pad.b押された(EPad.LT))\r
- {\r
- this.t次に移動();\r
- }\r
- #endregion\r
- }\r
- #region [ ポップアップ背景描画 ]\r
- if (this.txPopupMenuBackground != null)\r
- {\r
- this.txPopupMenuBackground.t2D描画(CDTXMania.Instance.Device, 160 * Scale.X, 10 * Scale.Y);\r
- }\r
- #endregion\r
- #region [ タイトル描画 ]\r
- int x = (int)(240 * Scale.X), y = (int)(16 * Scale.Y);\r
- stqMenuTitle.txName.t2D描画(CDTXMania.Instance.Device, x, y);\r
- #endregion\r
- #region [ カーソル描画 ]\r
- if (this.txCursor != null)\r
- {\r
- int height = stqMenuTitle.rectName.Height;\r
- int curX = (int)(180 * Scale.X);\r
- int curY = (int)(16 * Scale.Y) + (height / 4 - 6) + (height * (this.n現在の選択行 + 1));\r
- this.txCursor.t2D描画(CDTXMania.Instance.Device, curX, curY, new Rectangle(0, 0, (int)(16 * Scale.X), (int)(32 * Scale.Y)));\r
- curX += (int)(0x10 * Scale.X);\r
- Rectangle rectangle = new Rectangle((int)(8 * Scale.X), 0, (int)(0x10 * Scale.X), (int)(0x20 * Scale.Y));\r
- for (int j = 0; j < 16 + 5; j++)\r
- {\r
- this.txCursor.t2D描画(CDTXMania.Instance.Device, curX, curY, rectangle);\r
- curX += (int)(16 * Scale.Y);\r
- }\r
- this.txCursor.t2D描画(CDTXMania.Instance.Device, curX, curY, new Rectangle((int)(0x10 * Scale.X), 0, (int)(16 * Scale.X), (int)(32 * Scale.Y)));\r
- }\r
- #endregion\r
- #region [ リスト値文字列描画 ]\r
- for (int i = 0; i < lciMenuItems.Length; i++)\r
- {\r
- bool bItemBold = (i == nItemSelecting && !bShowAllItems) ? true : false;\r
- if (lciMenuItems[i].txName != null)\r
- {\r
- int height = lciMenuItems[i].rectName.Height;\r
- lciMenuItems[i].txName.t2D描画(CDTXMania.Instance.Device, 190 * Scale.X, (50 * Scale.Y) + i * height);\r
- }\r
-\r
- bool bValueBold = (bItemBold || (i == nItemSelecting && bIsSelectingIntItem)) ? true : false;\r
- if (bItemBold || bShowAllItems)\r
- {\r
- string s = lciMenuItems[i].cItem.ToString();\r
- using (Bitmap bmpStr = bValueBold ?\r
- prvFont.DrawPrivateFont(s, Color.White, Color.Black, Color.Yellow, Color.OrangeRed) :\r
- prvFont.DrawPrivateFont(s, Color.White, Color.Black))\r
- {\r
- CTexture ctStr = TextureFactory.tテクスチャの生成(bmpStr, false);\r
- ctStr.t2D描画(CDTXMania.Instance.Device, 340 * Scale.X, (50 * Scale.Y) + i * prvFont.RectStrings.Height);\r
- TextureFactory.tテクスチャの解放(ref ctStr);\r
- }\r
- }\r
- }\r
- #endregion\r
- t進行描画sub();\r
- }\r
- return 0;\r
- }\r
-\r
-\r
- // その他\r
-\r
- #region [ private ]\r
- //-----------------\r
-\r
- private bool bキー入力待ち;\r
-\r
- internal int n現在の選択行;\r
- internal EPart eInst = EPart.Unknown;\r
-\r
- private CTexture txPopupMenuBackground;\r
- private CTexture txCursor;\r
-\r
- internal struct stQuickMenuItem\r
- {\r
- internal COptionBase cItem;\r
- internal CTexture txName;\r
- internal Rectangle rectName;\r
- }\r
- private stQuickMenuItem[] lciMenuItems;\r
- CPrivateFastFont prvFont;\r
-\r
- private stQuickMenuItem stqMenuTitle;\r
- private bool bShowAllItems;\r
- private bool bIsSelectingIntItem;\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
- // 「n現在の選択行」とは別に設ける。sortでメニュー表示直後にアイテムの中身を表示しないようにするため\r
- private int nItemSelecting;\r
-\r
- //-----------------\r
- #endregion\r
- }\r
-}\r