Jypeli 10
The simple game programming library
MultiSelectWindow.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3using Jypeli.Controls;
5
6namespace Jypeli
7{
12 {
13 static readonly Key[] keys = { Key.D1, Key.D2, Key.D3, Key.D4, Key.D5, Key.D6, Key.D7, Key.D8, Key.D9, Key.D0 };
14
15 private int _defaultCancel = 0;
16 private List<Listener> _defaultListeners = new List<Listener>(4);
17
18 private int _selectedIndex = -1;
19 private bool _buttonColorSet = false;
20 private Font _font;
21
26
30 public PushButton[] Buttons { get; private set; }
31
35 public Font Font
36 {
37 get
38 {
39 return this._font;
40 }
41 set
42 {
43 QuestionLabel.Font = value;
44
45 for ( int i = 0; i < Buttons.Length; i++ )
46 {
47 Buttons[i].Font = value;
48 }
49 }
50 }
51
56 public int DefaultCancel
57 {
58 get { return _defaultCancel; }
59 set
60 {
61 _defaultCancel = value;
63 }
64 }
65
69 public int SelectedIndex
70 {
71 get { return _selectedIndex; }
72 set
73 {
74 if ( !IsAddedToGame ) RememberSelection = true;
75 SelectButton( value );
76 }
77 }
78
83 {
84 get { return _selectedIndex >= 0 || _selectedIndex >= Buttons.Length ? Buttons[_selectedIndex] : null; }
85 }
86
90 public override Color Color
91 {
92 get
93 {
94 return base.Color;
95 }
96 set
97 {
98 if ( !_buttonColorSet ) _setButtonColor( Color.Darker( value, 40 ) );
99 base.Color = value;
100 }
101 }
102
107 {
108 get { return SelectedButton.Color; }
109 set
110 {
111 SelectedButton.Color = value;
113 }
114 }
115
119 public bool RememberSelection { get; set; }
120
125 public event Action<int> ItemSelected;
126
132 public MultiSelectWindow( string question, params string[] buttonTexts )
133 : base()
134 {
135 if ( buttonTexts.Length == 0 ) throw new InvalidOperationException( "You must add at least one button" );
136
138 layout.LeftPadding = layout.RightPadding = 20;
139 layout.BottomPadding = 30;
140 layout.Spacing = 20;
141 this.Layout = layout;
142
143 QuestionLabel = new Label( question );
145
146 Buttons = new PushButton[buttonTexts.Length];
147 this._font = Font.Default;
148 for ( int i = 0; i < buttonTexts.Length; i++ )
149 {
150 PushButton button = new PushButton( buttonTexts[i] );
151 button.Tag = i;
152 button.Clicked += new Action( delegate { ButtonClicked( (int)button.Tag ); } );
153#if WINDOWS_PHONE
154 if ( Game.Instance.Phone.DisplayResolution == DisplayResolution.Large )
155 button.TextScale = new Vector(2, 2);
156 else if ( Game.Instance.Phone.DisplayResolution == DisplayResolution.HD720 )
157 button.TextScale = new Vector( 3, 3 );
158#endif
159 Add( button );
160 Buttons[i] = button;
161 }
162
165 }
166
167 private void InitOnAdd()
168 {
169 AddControls();
171#if !WINDOWS_PHONE && !ANDROID
173#endif
174 }
175
176 private void DeinitOnRemove()
177 {
178 _defaultListeners.ForEach(l => l.Destroy());
179 _defaultListeners.Clear();
180 }
181
182 private void SelectButton( int p )
183 {
185 if ( p < 0 || p >= Buttons.Length ) return;
186
187 _selectedIndex = p;
189 }
190
191 private void UnselectButton()
192 {
193 if ( _selectedIndex < 0 ) return;
195 _selectedIndex = -1;
196 }
197
203 public void AddItemHandler( int item, Action handler )
204 {
205 Buttons[item].Clicked += handler;
206 }
207
215 public void AddItemHandler<T1>( int item, Action<T1> handler, T1 p1 )
216 {
217 Buttons[item].Clicked += delegate { handler( p1 ); };
218 }
219
229 public void AddItemHandler<T1, T2>( int item, Action<T1, T2> handler, T1 p1, T2 p2 )
230 {
231 Buttons[item].Clicked += delegate { handler( p1, p2 ); };
232 }
233
245 public void AddItemHandler<T1, T2, T3>( int item, Action<T1, T2, T3> handler, T1 p1, T2 p2, T3 p3 )
246 {
247 Buttons[item].Clicked += delegate { handler( p1, p2, p3 ); };
248 }
249
255 public void RemoveItemHandler( int item, Action handler )
256 {
257 Buttons[item].Clicked -= handler;
258 }
259
260 private void _setButtonColor( Color color )
261 {
262 for ( int i = 0; i < Buttons.Length; i++ )
263 {
264 Buttons[i].Color = color;
265 }
267 }
268
273 public void SetButtonColor( Color color )
274 {
275 _setButtonColor( color );
276 _buttonColorSet = true;
277 }
278
283 public void SetButtonTextColor( Color color )
284 {
285 for ( int i = 0; i < Buttons.Length; i++ )
286 {
287 Buttons[i].TextColor = color;
288 }
289 }
290
291 private void AddControls()
292 {
294
295 for ( int i = 0; i < Math.Min( Buttons.Length, keys.Length ); i++ )
296 {
297 var l = Keyboard.Listen(keys[i], ButtonState.Pressed, SelectButton, null, i).InContext(this);
298 associatedListeners.Add(l);
299 }
300
301 Action selectPrev = delegate { SelectButton( _selectedIndex > 0 ? _selectedIndex - 1 : Buttons.Length - 1 ); };
302 Action selectNext = delegate { SelectButton( _selectedIndex < Buttons.Length - 1 ? _selectedIndex + 1 : 0 ); };
303 Action confirmSelect = delegate { SelectedButton.Click(); };
304
305 var l1 = Keyboard.Listen( Key.Up, ButtonState.Pressed, selectPrev, null ).InContext( this );
306 var l2 = Keyboard.Listen( Key.Down, ButtonState.Pressed, selectNext, null ).InContext( this );
307 var l3 = Keyboard.Listen( Key.Enter, ButtonState.Pressed, confirmSelect, null ).InContext( this );
308 associatedListeners.AddItems(l1, l2, l3);
309
310 foreach ( var controller in Game.Instance.GameControllers )
311 {
312 l1 = controller.Listen( Button.DPadUp, ButtonState.Pressed, selectPrev, null ).InContext( this );
313 l2 = controller.Listen( Button.DPadDown, ButtonState.Pressed, selectNext, null ).InContext( this );
314 l3 = controller.Listen( Button.A, ButtonState.Pressed, confirmSelect, null ).InContext( this );
315 associatedListeners.AddItems(l1, l2, l3);
316 }
317 }
318
319 private void AddDefaultControls()
320 {
321 _defaultListeners.ForEach(l => l.Destroy());
322 _defaultListeners.Clear();
323
324 if ( _defaultCancel >= 0 && _defaultCancel < Buttons.Length )
325 {
326 var l1 = Game.Instance.PhoneBackButton.Listen( Buttons[_defaultCancel].Click, null ).InContext( this );
327 var l2 = Game.Instance.Keyboard.Listen( Key.Escape, ButtonState.Pressed, Buttons[_defaultCancel].Click, null ).InContext( this );
329 _defaultListeners.AddItems(l1, l2, l3);
330 }
331 }
332
333 private void ButtonClicked( int index )
334 {
335 if ( ItemSelected != null )
336 ItemSelected( index );
337
338 Close();
339 }
340 }
341}
Listener Listen(Action handler, string helpText)
Kuuntelee puhelimen takaisin-näppäintä.
Definition: BackButton.cs:31
Mobiililaitteiden resoluutiovaihtoehdot
static readonly DisplayResolution HD720
HD720-tarkkuus (720p, 1280 x 720). Ei toimi kaikilla puhelimilla.
static readonly DisplayResolution Large
Suuri tarkkuus (WVGA, 800 x 480). Oletus WP8:lla.
Fontti.
Definition: Font.cs:24
static readonly Font Default
Oletusfontti.
Definition: Font.cs:31
BackButton PhoneBackButton
Puhelimen takaisin-näppäin.
Definition: Controls.cs:67
Device Phone
Phone-olio esim. puhelimen tärisyttämiseen.
Definition: Game.cs:121
GamePad ControllerOne
Ensimmäinen peliohjain.
Definition: Controls.cs:77
List< GamePad > GameControllers
Lista kaikista peliohjaimista järjestyksessä.
Definition: Controls.cs:72
Keyboard Keyboard
Näppäimistö.
Definition: Controls.cs:44
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
bool IsAddedToGame
Onko olio lisätty peliin.
ILayout Layout
Asettelija lapsiolioille. Asettaa lapsiolioiden koon sekä paikan.
Definition: Layout.cs:99
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
object Tag
Vapaasti asetettava muuttuja.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Asettelee widgetit päällekäin, järjestyksessä ylhäältä alas. Jos widgeteille ei ole tarpeeksi tilaa,...
double BottomPadding
Alareunaan jäävä tyhjä tila.
double Spacing
Olioiden väliin jäävä tyhjä tila.
double RightPadding
Oikeaan reunaan jäävä tyhjä tila.
double LeftPadding
Vasempaan reunaan jäävä tyhjä tila.
Listener Listen(Button button, ButtonState state, Action handler, string helpText)
Kuuntelee peliohjaimen nappulan painalluksia.
Definition: GamePad.cs:242
Näppäimistö.
Definition: Keyboard.cs:41
Listener Listen(Key k, ButtonState state, Action handler, string helpText)
Kuuntelee näppäinten painalluksia.
Definition: Keyboard.cs:161
Tekstikenttä.
Definition: Label.cs:70
Color TextColor
Tekstin väri.
Definition: Label.cs:204
virtual Font Font
Tekstin fontti.
Definition: Label.cs:221
Vector TextScale
Tekstin skaalaus. Oletus (1,1) ; isompi suurempi.
Definition: Label.cs:121
Ikkuna, joka antaa käyttäjän valita yhden annetuista vaihtoehdoista.
void SetButtonColor(Color color)
Asettaa jokaisen nappulan värin vastaamaan arvoa
void SetButtonTextColor(Color color)
Asettaa jokaisen nappulan tekstin värin vastaamaan arvoa
void AddItemHandler(int item, Action handler)
Lisäää nappulalle tapahtumakuuntelijan
Action< int > ItemSelected
Tapahtuma joka tapahtuu kun nappia painetaan. Ottaa parametrikseen painonapin indeksin (alkaen nollas...
void AddItemHandler< T1 >(int item, Action< T1 > handler, T1 p1)
Lisäää nappulalle tapahtumakuuntelijan
void AddItemHandler< T1, T2, T3 >(int item, Action< T1, T2, T3 > handler, T1 p1, T2 p2, T3 p3)
Lisäää nappulalle tapahtumakuuntelijan
PushButton[] Buttons
Painonappulat järjestyksessä.
int DefaultCancel
Mitä valitaan kun käyttäjä painaa esc tai takaisin-näppäintä. Laittomalla arvolla (esim....
void _setButtonColor(Color color)
PushButton? SelectedButton
Valittu nappula.
void AddItemHandler< T1, T2 >(int item, Action< T1, T2 > handler, T1 p1, T2 p2)
Lisäää nappulalle tapahtumakuuntelijan
Color SelectionColor
Valitun nappulan väri.
int SelectedIndex
Kuinka mones nappula on valittuna (alkaa nollasta)
MultiSelectWindow(string question, params string[] buttonTexts)
Luo uuden monivalintaikkunan.
void RemoveItemHandler(int item, Action handler)
Poistaa nappulalta annetun tapahtumakuuntelijan
bool RememberSelection
Muistetaanko missä kohtaa kursori oli viime kerralla kun ikkuna näytettiin.
List< Listener > _defaultListeners
static readonly Key[] keys
Painonappi.
Definition: PushButton.cs:40
override Color Color
Nappulan oletusväri. Asettaa myös hoverColor, selectedColor ja pressedColor -kenttien arvot....
Definition: PushButton.cs:147
Action Clicked
Tapahtuu kun nappia on painettu.
Definition: PushButton.cs:210
void Click()
Suoritetaan, kun nappulaa klikattiin hiiren vasemmalla näppäimellä
Definition: PushButton.cs:412
void SetState(State state)
Definition: PushButton.cs:381
List< Listener > associatedListeners
Tähän listaan lisätyt kuuntelijat tuhotaan automaattisesti kun Widget poistetaan pelistä.
Definition: Control.cs:14
Ikkuna.
Definition: Window.cs:37
void Close()
Sulkee ikkunan.
Definition: Window.cs:215
Listener InContext(ListenContext context)
Kuuntelee tapahtumaa vain tietyssä kontekstissa.
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
Button
Definition: Button.cs:36
Key
Näppäimistön näppäin.
Definition: Key.cs:39
Väri.
Definition: Color.cs:13
Color(XnaColor c)
Definition: Color.cs:38
static Color Darker(Color c, int howMuch)
Antaa tummemman värin. Vähentaa jokaista kolmea osaväriä arvon howMuch verran.
Definition: Color.cs:470
2D-vektori.
Definition: Vector.cs:67