source: 2013/30/MiskaK/MW2(My Warfare 2)/Paranneltu Jypeli/Widgets/MultiSelectWindow.cs @ 4507

Revision 4507, 10.2 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli.Controls;
6using Jypeli.GameObjects;
7
8namespace Jypeli.Widgets
9{
10    /// <summary>
11    /// Ikkuna, joka antaa käyttäjän valita yhden annetuista vaihtoehdoista.
12    /// </summary>
13    public class MultiSelectWindow : Window
14    {
15        static readonly Key[] keys = { Key.D1, Key.D2, Key.D3, Key.D4, Key.D5, Key.D6, Key.D7, Key.D8, Key.D9, Key.D0 };
16
17        private int _defaultCancel = 0;
18        private Listener _escListener = null;
19        private Listener _xboxListener = null;
20        private Listener _backListener = null;
21
22        private int _selectedIndex = -1;
23        private Color _selectedColor = Color.Black;
24        private Color _selectionColor = Color.Cyan;
25        private bool _buttonColorSet = false;
26
27        /// <summary>
28        /// Painonappulat järjestyksessä.
29        /// </summary>
30        public PushButton[] Buttons { get; private set; }
31
32        /// <summary>
33        /// Mitä valitaan kun käyttäjä painaa esc tai takaisin-näppäintä.
34        /// Laittomalla arvolla (esim. negatiivinen) em. näppäimistä ei tapahdu mitään.
35        /// </summary>
36        public int DefaultCancel
37        {
38            get { return _defaultCancel; }
39            set
40            {
41                _defaultCancel = value;
42                if ( Game.Instance != null ) AddDefaultControls();
43            }
44        }
45
46        /// <summary>
47        /// Valittu nappula.
48        /// </summary>
49        public PushButton SelectedButton
50        {
51            get { return _selectedIndex >= 0 || _selectedIndex >= Buttons.Length ? Buttons[_selectedIndex] : null; }
52        }
53
54        /// <summary>
55        /// Nappulan oletusväri.
56        /// </summary>
57        public override Color Color
58        {
59            get
60            {
61                return base.Color;
62            }
63            set
64            {
65                if ( !_buttonColorSet ) _setButtonColor( Color.Darker( value, 40 ) );
66                base.Color = value;
67            }
68        }
69
70        /// <summary>
71        /// Valitun nappulan väri.
72        /// </summary>
73        public Color SelectionColor
74        {
75            get { return _selectionColor; }
76            set
77            {
78                _selectionColor = value;
79                SelectButton( _selectedIndex );
80            }
81        }
82
83        /// <summary>
84        /// Tapahtuma joka tapahtuu kun nappia painetaan.
85        /// Ottaa parametrikseen painonapin indeksin (alkaen nollasta).
86        /// </summary>
87        public event Action<int> ItemSelected;
88
89        /// <summary>
90        /// Luo uuden monivalintaikkunan.
91        /// </summary>
92        /// <param name="question">Kysymys.</param>
93        /// <param name="buttonTexts">Nappien tekstit merkkijonoina.</param>
94        public MultiSelectWindow(string question, params string[] buttonTexts)
95            : base()
96        {
97            if ( buttonTexts.Length == 0 ) throw new InvalidOperationException( "You must add at least one button" );
98
99            VerticalScrollLayout layout = new VerticalScrollLayout();
100            layout.LeftPadding = layout.RightPadding = 20;
101            layout.BottomPadding = 30;
102            layout.Spacing = 20;
103            this.Layout = layout;
104
105            Label kysymysLabel = new Label( question );
106            Add( kysymysLabel );
107
108            Buttons = new PushButton[buttonTexts.Length];
109
110            for ( int i = 0; i < buttonTexts.Length; i++ )
111            {
112                PushButton button = new PushButton( buttonTexts[i] );
113                button.Tag = i;
114                button.Clicked += new Action( delegate { button_Clicked( (int)button.Tag ); } );
115#if WINDOWS_PHONE
116            if ( Game.Instance.Phone.DisplayResolution == WP7.DisplayResolution.Large )
117                button.TextScale = new Vector(2, 2);
118#endif
119                Add( button );
120                Buttons[i] = button;
121            }
122
123            Game.AssertInitialized( delegate { AddControls(); AddDefaultControls(); } );
124            AddedToGame += delegate { SelectButton( 0 ); };
125        }
126
127        /// <summary>
128        /// Luo uuden monivalintaikkunan.
129        /// </summary>
130        /// <param name="question">Kysymys.</param>
131        /// <param name="titleColor">Otsikon tekstin väri.</param>
132        /// <param name="buttonTexts">Nappien tekstit merkkijonoina.</param>
133        public MultiSelectWindow(string question, Color titleColor, params string[] buttonTexts)
134            : base()
135        {
136            if (buttonTexts.Length == 0) throw new InvalidOperationException("You must add at least one button");
137
138            VerticalScrollLayout layout = new VerticalScrollLayout();
139            layout.LeftPadding = layout.RightPadding = 20;
140            layout.BottomPadding = 30;
141            layout.Spacing = 20;
142            this.Layout = layout;
143
144            Label kysymysLabel = new Label(question);
145            kysymysLabel.TextColor = titleColor;
146            Add(kysymysLabel);
147
148            Buttons = new PushButton[buttonTexts.Length];
149
150            for (int i = 0; i < buttonTexts.Length; i++)
151            {
152                PushButton button = new PushButton(buttonTexts[i]);
153                button.Tag = i;
154                button.Clicked += new Action(delegate { button_Clicked((int)button.Tag); });
155#if WINDOWS_PHONE
156            if ( Game.Instance.Phone.DisplayResolution == WP7.DisplayResolution.Large )
157                button.TextScale = new Vector(2, 2);
158#endif
159                Add(button);
160                Buttons[i] = button;
161            }
162
163            Game.AssertInitialized(delegate { AddControls(); AddDefaultControls(); });
164            AddedToGame += delegate { SelectButton(0); };
165        }
166
167
168        private void SelectButton( int p )
169        {
170#if !WINDOWS_PHONE
171            UnselectButton();
172            if ( p < 0 || p >= Buttons.Length ) return;
173
174            _selectedIndex = p;
175            _selectedColor = SelectedButton.Color;
176            SelectedButton.Color = SelectionColor;
177#endif
178        }
179
180        private void UnselectButton()
181        {
182            if ( _selectedIndex < 0 ) return;
183            SelectedButton.Color = _selectedColor;
184            _selectedIndex = -1;
185        }
186
187        public void AddItemHandler( int item, Action handler )
188        {
189            Buttons[item].Clicked += handler;
190        }
191
192        public void AddItemHandler<T1>(int item, Action<T1> handler, T1 p1)
193        {
194            Buttons[item].Clicked += delegate { handler(p1); };
195        }
196
197        public void AddItemHandler<T1, T2>(int item, Action<T1, T2> handler, T1 p1, T2 p2)
198        {
199            Buttons[item].Clicked += delegate { handler(p1, p2); };
200        }
201
202        public void AddItemHandler<T1, T2, T3>(int item, Action<T1, T2, T3> handler, T1 p1, T2 p2, T3 p3)
203        {
204            Buttons[item].Clicked += delegate { handler(p1, p2, p3); };
205        }
206
207        public void RemoveItemHandler( int item, Action handler )
208        {
209            Buttons[item].Clicked -= handler;
210        }
211
212        private void _setButtonColor( Color color )
213        {
214            for ( int i = 0; i < Buttons.Length; i++ )
215            {
216                Buttons[i].Color = color;
217            }
218
219            // Re-set the color for selected item and reselect it
220            _selectedColor = color;
221            SelectButton( _selectedIndex );
222        }
223
224        public void SetButtonColor( Color color )
225        {
226            _setButtonColor( color );
227            _buttonColorSet = true;
228        }
229
230        public void SetButtonTextColor(Color color)
231        {
232            for (int i = 0; i < Buttons.Length; i++)
233            {
234                Buttons[i].TextColor = color;
235            }
236        }
237
238        void AddControls()
239        {
240            for ( int i = 0; i < Math.Min( Buttons.Length, keys.Length ); i++ )
241            {
242                Jypeli.Game.Instance.Keyboard.Listen( keys[i], ButtonState.Pressed, button_Clicked, null, i ).InContext( this );
243            }
244
245            Handler selectPrev = delegate { SelectButton( _selectedIndex > 0 ? _selectedIndex - 1 : Buttons.Length - 1 ); };
246            Handler selectNext = delegate { SelectButton( _selectedIndex < Buttons.Length - 1 ? _selectedIndex + 1 : 0 ); };
247            Handler confirmSelect = delegate { SelectedButton.Click(); };
248           
249            Jypeli.Game.Instance.Keyboard.Listen( Key.Up, ButtonState.Pressed, selectPrev, null ).InContext( this );
250            Jypeli.Game.Instance.Keyboard.Listen( Key.Down, ButtonState.Pressed, selectNext, null ).InContext( this );
251            Jypeli.Game.Instance.Keyboard.Listen( Key.Enter, ButtonState.Pressed, confirmSelect, null ).InContext( this );
252
253            Jypeli.Game.Instance.ControllerOne.Listen( Button.DPadUp, ButtonState.Pressed, selectPrev, null ).InContext( this );
254            Jypeli.Game.Instance.ControllerOne.Listen( Button.DPadDown, ButtonState.Pressed, selectNext, null ).InContext( this );
255            Jypeli.Game.Instance.ControllerOne.Listen( Button.A, ButtonState.Pressed, confirmSelect, null ).InContext( this );
256        }
257
258        void AddDefaultControls()
259        {
260            if ( _backListener != null ) Jypeli.Game.Instance.PhoneBackButton.Remove( _backListener );
261            if ( _escListener != null ) Jypeli.Game.Instance.Keyboard.Remove( _escListener );
262            if ( _xboxListener != null ) Jypeli.Game.Instance.Keyboard.Remove( _xboxListener );
263
264            if ( _defaultCancel >= 0 && _defaultCancel < Buttons.Length )
265            {
266                _backListener = Jypeli.Game.Instance.PhoneBackButton.Listen( Buttons[_defaultCancel].Click, null ).InContext( this );
267                _escListener = Jypeli.Game.Instance.Keyboard.Listen( Key.Escape, ButtonState.Pressed, Buttons[_defaultCancel].Click, null ).InContext( this );
268                _xboxListener = Jypeli.Game.Instance.ControllerOne.Listen( Button.B, ButtonState.Pressed, Buttons[_defaultCancel].Click, null ).InContext( this );
269            }
270        }
271
272        void button_Clicked( int index )
273        {
274            if ( ItemSelected != null )
275                ItemSelected( index );
276
277            Close();
278        }
279    }
280}
Note: See TracBrowser for help on using the repository browser.