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
13 internal class CActSelectPopupMenu : CActivity
\r
19 public int GetIndex(int pos)
\r
21 return lciMenuItems[ pos ].GetIndex();
\r
23 public object GetObj現在値( int pos )
\r
25 return lciMenuItems[ pos ].obj現在値();
\r
27 public bool bGotoDetailConfig
\r
34 /// ソートメニュー機能を使用中かどうか。外部からこれをtrueにすると、ソートメニューが出現する。falseにすると消える。
\r
36 public bool bIsActivePopupMenu
\r
41 public virtual void tActivatePopupMenu( E楽器パート einst )
\r
43 nItemSelecting = -1; // #24757 2011.4.1 yyagi: Clear sorting status in each stating menu.
\r
45 this.bIsActivePopupMenu = true;
\r
46 this.bIsSelectingIntItem = false;
\r
47 this.bGotoDetailConfig = false;
\r
49 public virtual void tDeativatePopupMenu()
\r
51 this.bIsActivePopupMenu = false;
\r
55 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title )
\r
57 Initialize( menulist, showAllItems, title, 0 );
\r
60 public void Initialize( List<CItemBase> menulist, bool showAllItems, string title, int defaultPos )
\r
62 strMenuTitle = title;
\r
63 lciMenuItems = menulist;
\r
64 bShowAllItems = showAllItems;
\r
65 n現在の選択行 = defaultPos;
\r
69 public void tEnter押下()
\r
73 CDTXMania.Skin.sound決定音.t再生する();
\r
75 if ( this.n現在の選択行 != lciMenuItems.Count - 1 )
\r
77 if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.リスト ||
\r
78 lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.ONorOFFトグル ||
\r
79 lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.ONorOFFor不定スリーステート )
\r
81 lciMenuItems[ n現在の選択行 ].t項目値を次へ移動();
\r
83 else if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.整数 )
\r
85 bIsSelectingIntItem = !bIsSelectingIntItem; // 選択状態/選択解除状態を反転する
\r
87 else if ( lciMenuItems[ n現在の選択行 ].e種別 == CItemBase.E種別.切替リスト )
\r
93 throw new ArgumentException();
\r
95 nItemSelecting = n現在の選択行;
\r
97 tEnter押下Main( (int) lciMenuItems[ n現在の選択行 ].GetIndex() );
\r
99 this.bキー入力待ち = true;
\r
104 /// Decide押下時の処理を、継承先で記述する。
\r
106 /// <param name="val">CItemBaseの現在の設定値のindex</param>
\r
107 public virtual void tEnter押下Main( int val )
\r
111 /// Cancel押下時の追加処理があれば、継承先で記述する。
\r
113 public virtual void tCancel()
\r
117 /// 追加の描画処理。必要に応じて、継承先で記述する。
\r
119 public virtual void t進行描画sub()
\r
124 public void t次に移動()
\r
126 if ( this.bキー入力待ち )
\r
128 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
129 if ( bIsSelectingIntItem )
\r
131 lciMenuItems[ n現在の選択行 ].t項目値を前へ移動(); // 項目移動と数値上下は方向が逆になるので注意
\r
135 if ( ++this.n現在の選択行 >= this.lciMenuItems.Count )
\r
142 public void t前に移動()
\r
144 if ( this.bキー入力待ち )
\r
146 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
147 if ( bIsSelectingIntItem )
\r
149 lciMenuItems[ n現在の選択行 ].t項目値を次へ移動(); // 項目移動と数値上下は方向が逆になるので注意
\r
153 if ( --this.n現在の選択行 < 0 )
\r
155 this.n現在の選択行 = this.lciMenuItems.Count - 1;
\r
163 public override void On活性化()
\r
165 // this.n現在の選択行 = 0;
\r
166 this.bキー入力待ち = true;
\r
167 for ( int i = 0; i < 4; i++ )
\r
169 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
\r
171 base.b活性化してない = true;
\r
173 this.bIsActivePopupMenu = false;
\r
174 this.font = new CActDFPFont();
\r
175 base.list子Activities.Add( this.font );
\r
176 nItemSelecting = -1;
\r
180 public override void On非活性化()
\r
182 if ( !base.b活性化してない )
\r
184 base.list子Activities.Remove( this.font );
\r
185 this.font.On非活性化();
\r
188 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
189 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );
\r
190 for ( int i = 0; i < 4; i++ )
\r
192 this.ctキー反復用[ i ] = null;
\r
197 public override void OnManagedリソースの作成()
\r
199 if ( !base.b活性化してない )
\r
201 this.txCursor = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );
\r
202 this.txPopupMenuBackground = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect sort menu background.png" ), false );
\r
203 base.OnManagedリソースの作成();
\r
206 public override void OnManagedリソースの解放()
\r
208 if ( !base.b活性化してない )
\r
210 CDTXMania.tテクスチャの解放( ref this.txPopupMenuBackground );
\r
211 CDTXMania.tテクスチャの解放( ref this.txCursor );
\r
213 base.OnManagedリソースの解放();
\r
216 public override int On進行描画()
\r
218 throw new InvalidOperationException( "t進行描画(bool)のほうを使用してください。" );
\r
223 if ( !base.b活性化してない && this.bIsActivePopupMenu )
\r
225 if ( this.bキー入力待ち )
\r
227 #region [ Shift-F1: CONFIG画面 ]
\r
228 if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) &&
\r
229 CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) )
\r
230 { // [SHIFT] + [F1] CONFIG
\r
231 CDTXMania.Skin.sound取消音.t再生する();
\r
233 this.bGotoDetailConfig = true;
\r
236 #region [ キー入力: キャンセル ]
\r
237 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape )
\r
238 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT )
\r
239 || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) )
\r
241 CDTXMania.Skin.sound取消音.t再生する();
\r
243 this.bIsActivePopupMenu = false;
\r
247 #region [ キー入力: 決定 ]
\r
248 // E楽器パート eInst = E楽器パート.UNKNOWN;
\r
249 ESortAction eAction = ESortAction.END;
\r
250 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Decide ) )
\r
252 eInst = E楽器パート.GUITAR;
\r
253 eAction = ESortAction.Decide;
\r
255 else if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Decide ) )
\r
257 eInst = E楽器パート.BASS;
\r
258 eAction = ESortAction.Decide;
\r
261 CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.Decide ) // #24756 2011.4.1 yyagi: Add condition "Drum-Decide" to enable CY in Sort Menu.
\r
262 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD )
\r
263 || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC )
\r
264 || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) )
\r
266 eInst = E楽器パート.DRUMS;
\r
267 eAction = ESortAction.Decide;
\r
269 if ( eAction == ESortAction.Decide ) // 決定
\r
274 #region [ キー入力: 前に移動 ]
\r
275 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.t前に移動 ) );
\r
276 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.t前に移動 ) );
\r
277 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )
\r
282 #region [ キー入力: 次に移動 ]
\r
283 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.t次に移動 ) );
\r
284 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.t次に移動 ) );
\r
285 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )
\r
291 #region [ ポップアップメニュー 背景描画 ]
\r
292 if ( this.txPopupMenuBackground != null )
\r
294 this.txPopupMenuBackground.t2D描画( CDTXMania.app.Device, 160, 40 );
\r
297 #region [ ソートメニュータイトル描画 ]
\r
298 int x = 240, y = 44;
\r
299 font.t文字列描画( x, y, strMenuTitle, false, 1.0f );
\r
302 if ( this.txCursor != null )
\r
306 int curY = 46 + ( height * ( this.n現在の選択行 + 1 ) );
\r
307 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0, 0, 16, 32 ) );
\r
309 Rectangle rectangle = new Rectangle( 8, 0, 0x10, 0x20 );
\r
310 for ( int j = 0; j < 16; j++ )
\r
312 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, rectangle );
\r
315 this.txCursor.t2D描画( CDTXMania.app.Device, curX, curY, new Rectangle( 0x10, 0, 16, 32 ) );
\r
318 #region [ ソート候補文字列描画 ]
\r
319 for ( int i = 0; i < lciMenuItems.Count; i++ )
\r
321 bool bItemBold = ( i == nItemSelecting && !bShowAllItems ) ? true : false;
\r
322 font.t文字列描画( 190, 80 + i * 32, lciMenuItems[i].str項目名, bItemBold, 1.0f );
\r
324 bool bValueBold = (bItemBold || (i == nItemSelecting && bIsSelectingIntItem)) ? true : false;
\r
325 if ( bItemBold || bShowAllItems )
\r
328 switch ( lciMenuItems[i].str項目名 )
\r
332 double d = (double) ((int)lciMenuItems[ i ].obj現在値() / 20.0);
\r
333 s = "x" + d.ToString( "0.000" );
\r
336 case "ScrollSpeed":
\r
338 double d = (double) ( ( ( (int) lciMenuItems[ i ].obj現在値() ) + 1 ) / 2.0 );
\r
339 s = "x" + d.ToString( "0.0" );
\r
344 s = lciMenuItems[ i ].obj現在値().ToString();
\r
347 font.t文字列描画( 340, 80 + i * 32, s, bValueBold, 1.0f );
\r
359 #region [ private ]
\r
360 //-----------------
\r
362 private bool bキー入力待ち;
\r
364 internal int n現在の選択行;
\r
365 internal E楽器パート eInst = E楽器パート.UNKNOWN;
\r
367 private CTexture txPopupMenuBackground;
\r
368 private CTexture txCursor;
\r
369 private CActDFPFont font;
\r
371 private string strMenuTitle;
\r
372 private List<CItemBase> lciMenuItems;
\r
373 private bool bShowAllItems;
\r
374 private bool bIsSelectingIntItem;
\r
376 [StructLayout( LayoutKind.Sequential )]
\r
377 private struct STキー反復用カウンタ
\r
379 public CCounter Up;
\r
380 public CCounter Down;
\r
383 public CCounter this[ int index ]
\r
401 throw new IndexOutOfRangeException();
\r
423 throw new IndexOutOfRangeException();
\r
427 private STキー反復用カウンタ ctキー反復用;
\r
429 private enum ESortAction : int
\r
431 Cancel, Decide, Previous, Next, END
\r
433 private int nItemSelecting; // 「n現在の選択行」とは別に設ける。sortでメニュー表示直後にアイテムの中身を表示しないようにするため
\r
434 //-----------------
\r