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
14 internal class CActSelectPopupMenu : CActivity
\r
20 public int GetIndex(int pos)
\r
22 return lciMenuItems[ pos ].cItem.GetIndex();
\r
24 public object GetObj現在値( int pos )
\r
26 return lciMenuItems[ pos ].cItem.obj現在値();
\r
28 public bool bGotoDetailConfig
\r
35 /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。
\r
37 public bool bIsActivePopupMenu
\r
42 public virtual void tActivatePopupMenu( E楽器パート einst )
\r
44 nItemSelecting = -1; // #24757 2011.4.1 yyagi: Clear sorting status in each stating menu.
\r
46 this.bIsActivePopupMenu = true;
\r
47 this.bIsSelectingIntItem = false;
\r
48 this.bGotoDetailConfig = false;
\r
50 public virtual void tDeativatePopupMenu()
\r
52 this.bIsActivePopupMenu = false;
\r
56 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title )
\r
58 Initialize( menulist, showAllItems, title, 0 );
\r
61 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title, int defaultPos )
\r
64 prvFont = new CPrivateFastFont( CSkin.Path( @"Graphics\fonts\mplus-1p-heavy.ttf" ), (int) ( 18 * Scale.Y ) );
\r
66 stqMenuTitle = new stQuickMenuItem();
\r
67 stqMenuTitle.cItem = new CItemBase();
\r
68 stqMenuTitle.cItem.str項目名 = title;
\r
69 stqMenuTitle.txName = CDTXMania.tテクスチャの生成( prvFont.DrawPrivateFont( title, Color.White, Color.Black ), false );
\r
70 stqMenuTitle.rectName = prvFont.RectStrings;
\r
71 lciMenuItems = new stQuickMenuItem[ menulist.Count ];
\r
72 for (int i = 0; i < menulist.Count; i++ )
\r
74 stQuickMenuItem stqm = new stQuickMenuItem();
\r
75 stqm.cItem = menulist[ i ];
\r
76 stqm.txName = CDTXMania.tテクスチャの生成( prvFont.DrawPrivateFont( menulist[ i ].str項目名, Color.White, Color.Black ), false );
\r
77 stqm.rectName = prvFont.RectStrings;
\r
78 lciMenuItems[ i ] = stqm;
\r
81 bShowAllItems = showAllItems;
\r
82 n現在の選択行 = defaultPos;
\r
86 public void tEnter押下()
\r
90 CDTXMania.Skin.sound決定音.t再生する();
\r
92 if ( this.n現在の選択行 != lciMenuItems.Length - 1 )
\r
94 if ( lciMenuItems[ n現在の選択行 ].cItem.e種別 == CItemBase.E種別.リスト ||
\r
95 lciMenuItems[ n現在の選択行 ].cItem.e種別 == CItemBase.E種別.ONorOFFトグル ||
\r
96 lciMenuItems[ n現在の選択行 ].cItem.e種別 == CItemBase.E種別.ONorOFFor不定スリーステート )
\r
98 lciMenuItems[ n現在の選択行 ].cItem.t項目値を次へ移動();
\r
100 else if ( lciMenuItems[ n現在の選択行 ].cItem.e種別 == CItemBase.E種別.整数 )
\r
102 bIsSelectingIntItem = !bIsSelectingIntItem; // 選択状態/選択解除状態を反転する
\r
104 else if ( lciMenuItems[ n現在の選択行 ].cItem.e種別 == CItemBase.E種別.切替リスト )
\r
110 throw new ArgumentException();
\r
112 nItemSelecting = n現在の選択行;
\r
114 tEnter押下Main( (int) lciMenuItems[ n現在の選択行 ].cItem.GetIndex() );
\r
116 this.bキー入力待ち = true;
\r
121 /// Decide押下時の処理を、継承先で記述する。
\r
123 /// <param name="val">CItemBaseの現在の設定値のindex</param>
\r
124 public virtual void tEnter押下Main( int val )
\r
128 /// Cancel押下時の追加処理があれば、継承先で記述する。
\r
130 public virtual void tCancel()
\r
134 /// 追加の描画処理。必要に応じて、継承先で記述する。
\r
136 public virtual void t進行描画sub()
\r
141 public void t次に移動()
\r
143 if ( this.bキー入力待ち )
\r
145 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
146 if ( bIsSelectingIntItem )
\r
148 lciMenuItems[ n現在の選択行 ].cItem.t項目値を前へ移動(); // 項目移動と数値上下は方向が逆になるので注意
\r
152 if ( ++this.n現在の選択行 >= this.lciMenuItems.Length )
\r
159 public void t前に移動()
\r
161 if ( this.bキー入力待ち )
\r
163 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
164 if ( bIsSelectingIntItem )
\r
166 lciMenuItems[ n現在の選択行 ].cItem.t項目値を次へ移動(); // 項目移動と数値上下は方向が逆になるので注意
\r
170 if ( --this.n現在の選択行 < 0 )
\r
172 this.n現在の選択行 = this.lciMenuItems.Length - 1;
\r
180 public override void On活性化()
\r
182 // this.n現在の選択行 = 0;
\r
183 this.bキー入力待ち = true;
\r
184 for ( int i = 0; i < 4; i++ )
\r
186 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
\r
188 base.b活性化してない = true;
\r
190 this.bIsActivePopupMenu = false;
\r
191 // this.font = new CActDFPFont();
\r
192 // base.list子Activities.Add( this.font );
\r
193 nItemSelecting = -1;
\r
198 public override void On非活性化()
\r
200 if ( !base.b活性化してない )
\r
202 // base.list子Activities.Remove( this.font );
\r
203 // this.font.On非活性化();
\r
204 // this.font = null;
\r
206 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
207 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );
\r
208 for ( int i = 0; i < 4; i++ )
\r
210 this.ctキー反復用[ i ] = null;
\r
214 //if ( lciMenuItems != null )
\r
216 // for ( int i = 0; i < lciMenuItems.Length; i++ )
\r
218 // lciMenuItems[ i ].cItem = null;
\r
219 // CDTXMania.tテクスチャの解放( ref lciMenuItems[ i ].txName );
\r
220 // lciMenuItems[ i ].txName = null;
\r
222 // lciMenuItems = null;
\r
224 //CDTXMania.tテクスチャの解放( ref txMenuTitle );
\r
229 public override void OnManagedリソースの作成()
\r
231 if ( !base.b活性化してない )
\r
233 string pathCursor = CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" );;
\r
234 string pathPopupMenuBackground = CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" );
\r
235 if ( File.Exists ( pathCursor ) )
\r
237 this.txCursor = CDTXMania.tテクスチャの生成( pathCursor, false );
\r
239 if ( File.Exists( pathPopupMenuBackground ) )
\r
241 this.txPopupMenuBackground = CDTXMania.tテクスチャの生成( pathPopupMenuBackground, false );
\r
243 base.OnManagedリソースの作成();
\r
246 public override void OnManagedリソースの解放()
\r
248 if ( !base.b活性化してない )
\r
250 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );
\r
251 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
253 base.OnManagedリソースの解放();
\r
256 public override int On進行描画()
\r
258 throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );
\r
263 if ( !base.b活性化してない && this.bIsActivePopupMenu )
\r
265 if ( this.bキー入力待ち )
\r
267 #region [ Shift-F1: CONFIG画面 ]
\r
268 if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) &&
\r
269 CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) )
\r
270 { // [SHIFT] + [F1] CONFIG
\r
271 CDTXMania.Skin.sound取消音.t再生する();
\r
273 this.bGotoDetailConfig = true;
\r
276 #region [ キー入力: キャンセル ]
\r
277 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )
\r
278 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )
\r
279 || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )
\r
281 CDTXMania.Skin.sound取消音.t再生する();
\r
283 this.bIsActivePopupMenu = false;
\r
287 #region [ キー入力: 決定 ]
\r
288 // E楽器パート eInst = E楽器パート.UNKNOWN;
\r
289 ESortAction eAction = ESortAction.END;
\r
290 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )
\r
292 eInst = E楽器パート.GUITAR;
\r
293 eAction = ESortAction.Decide;
\r
295 else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )
\r
297 eInst = E楽器パート.BASS;
\r
298 eAction = ESortAction.Decide;
\r
301 CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.Decide ) // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.
\r
302 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD )
\r
303 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )
\r
304 || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )
\r
306 eInst = E楽器パート.DRUMS;
\r
307 eAction = ESortAction.Decide;
\r
309 if ( eAction == ESortAction.Decide ) // 決定
\r
314 #region [ キー入力: 前に移動 ]
\r
315 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );
\r
316 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );
\r
317 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )
\r
322 #region [ キー入力: 次に移動 ]
\r
323 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );
\r
324 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );
\r
325 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )
\r
331 #region [ ポップアップメニュー 背景描画 ]
\r
332 if ( this.txPopupMenuBackground != null )
\r
334 this.txPopupMenuBackground.t2D描画( CDTXMania.app.Device, 160 * Scale.X, 10 * Scale.Y );
\r
337 #region [ ソートメニュータイトル描画 ]
\r
338 int x = (int) ( 240 * Scale.X ), y = (int) ( 16 * Scale.Y );
\r
339 stqMenuTitle.txName.t2D描画( CDTXMania.app.Device, x, y ); //font.t文字列描画( x, y, strMenuTitle, false, 1.0f );
\r
342 if ( this.txCursor != null )
\r
344 int height = stqMenuTitle.rectName.Height;
\r
345 int curX = (int)(180 * Scale.X);
\r
346 int curY = (int)(16 * Scale.Y) + ( height / 4 - 6) + ( height * ( this.n現在の選択行 + 1 ) );
\r
347 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, (int)(16 * Scale.X), (int)(32 * Scale.Y) ) );
\r
348 curX += (int)(0x10 * Scale.X);
\r
349 Rectangle rectangle = new Rectangle( (int)(8 * Scale.X), 0, (int)(0x10 * Scale.X), (int)(0x20 * Scale.Y) );
\r
350 for ( int j = 0; j < 16 + 3; j++ )
\r
352 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );
\r
353 curX += (int)(16 * Scale.Y);
\r
355 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( (int)(0x10 * Scale.X), 0, (int)(16 * Scale.X), (int)(32 * Scale.Y) ) );
\r
358 #region [ ソート候補文字列描画 ]
\r
359 for ( int i = 0; i < lciMenuItems.Length; i++ )
\r
361 bool bItemBold = ( i == nItemSelecting && !bShowAllItems ) ? true : false;
\r
362 //font.t文字列描画( 190, 80 + i * 32, lciMenuItems[i].cItem.str項目名, bItemBold, 1.0f );
\r
363 if ( lciMenuItems[ i ].txName != null )
\r
365 int height = lciMenuItems[ i ].rectName.Height;
\r
366 lciMenuItems[ i ].txName.t2D描画( CDTXMania.app.Device, 190 * Scale.X, ( 50 * Scale.Y ) + i * height );
\r
369 bool bValueBold = (bItemBold || (i == nItemSelecting && bIsSelectingIntItem)) ? true : false;
\r
370 if ( bItemBold || bShowAllItems )
\r
373 switch ( lciMenuItems[i].cItem.str項目名 )
\r
377 double d = (double) ((int)lciMenuItems[ i ].cItem.obj現在値() / 20.0);
\r
378 s = "x" + d.ToString( "0.000" );
\r
381 case "ScrollSpeed":
\r
383 double d = (double) ( ( ( (int) lciMenuItems[ i ].cItem.obj現在値() ) + 1 ) / 2.0 );
\r
384 s = "x" + d.ToString( "0.0" );
\r
389 s = lciMenuItems[ i ].cItem.obj現在値().ToString();
\r
392 //font.t文字列描画( (int)(340 * Scale.X), (int)(80 + i * 32), s, bValueBold, 1.0f * Scale.Y);
\r
393 Bitmap bmpStr = bValueBold?
\r
394 prvFont.DrawPrivateFont( s, Color.White, Color.Black, Color.Yellow, Color.OrangeRed ) :
\r
395 prvFont.DrawPrivateFont( s, Color.White, Color.Black );
\r
396 CTexture ctStr = CDTXMania.tテクスチャの生成( bmpStr, false );
\r
397 ctStr.t2D描画( CDTXMania.app.Device, 340 * Scale.X, ( 50 * Scale.Y ) + i * prvFont.RectStrings.Height );
\r
398 CDTXMania.tテクスチャの解放( ref ctStr );
\r
410 #region [ private ]
\r
411 //-----------------
\r
413 private bool bキー入力待ち;
\r
415 internal int n現在の選択行;
\r
416 internal E楽器パート eInst = E楽器パート.UNKNOWN;
\r
418 private CTexture txPopupMenuBackground;
\r
419 private CTexture txCursor;
\r
420 //private CActDFPFont font;
\r
422 internal struct stQuickMenuItem
\r
424 internal CItemBase cItem;
\r
425 internal CTexture txName;
\r
426 internal Rectangle rectName;
\r
428 private stQuickMenuItem[] lciMenuItems;
\r
429 CPrivateFastFont prvFont;
\r
431 private stQuickMenuItem stqMenuTitle;
\r
432 private bool bShowAllItems;
\r
433 private bool bIsSelectingIntItem;
\r
435 [StructLayout( LayoutKind.Sequential )]
\r
436 private struct STキー反復用カウンタ
\r
438 public CCounter Up;
\r
439 public CCounter Down;
\r
442 public CCounter this[ int index ]
\r
460 throw new IndexOutOfRangeException();
\r
482 throw new IndexOutOfRangeException();
\r
486 private STキー反復用カウンタ ctキー反復用;
\r
488 private enum ESortAction : int
\r
490 Cancel, Decide, Previous, Next, END
\r
492 private int nItemSelecting; // 「n現在の選択行」とは別に設ける。sortでメニュー表示直後にアイテムの中身を表示しないようにするため
\r
493 //-----------------
\r