Jypeli  9
The simple game programming library
MultiSelectWindow.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using Jypeli.Controls;
4 using Jypeli.GameObjects;
5 
6 namespace Jypeli
7 {
11  public class MultiSelectWindow : Window
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;
21  private bool _buttonColorSet = false;
22  private Font _font;
23 
28 
32  public PushButton[] Buttons { get; private set; }
33 
37  public Font Font
38  {
39  get
40  {
41  return this._font;
42  }
43  set
44  {
45  QuestionLabel.Font = value;
46 
47  for ( int i = 0; i < Buttons.Length; i++ )
48  {
49  Buttons[i].Font = value;
50  }
51  }
52  }
53 
58  public int DefaultCancel
59  {
60  get { return _defaultCancel; }
61  set
62  {
63  _defaultCancel = value;
64  if ( IsAddedToGame ) AddDefaultControls();
65  }
66  }
67 
71  public int SelectedIndex
72  {
73  get { return _selectedIndex; }
74  set
75  {
76  if ( !IsAddedToGame ) RememberSelection = true;
77  SelectButton( value );
78  }
79  }
80 
85  {
86  get { return _selectedIndex >= 0 || _selectedIndex >= Buttons.Length ? Buttons[_selectedIndex] : null; }
87  }
88 
92  public override Color Color
93  {
94  get
95  {
96  return base.Color;
97  }
98  set
99  {
100  if ( !_buttonColorSet ) _setButtonColor( Color.Darker( value, 40 ) );
101  base.Color = value;
102  }
103  }
104 
109  {
110  get { return _selectionColor; }
111  set
112  {
113  _selectionColor = value;
115  }
116  }
117 
121  public bool RememberSelection { get; set; }
122 
127  public event Action<int> ItemSelected;
128 
134  public MultiSelectWindow( string question, params string[] buttonTexts )
135  : base()
136  {
137  if ( buttonTexts.Length == 0 ) throw new InvalidOperationException( "You must add at least one button" );
138 
140  layout.LeftPadding = layout.RightPadding = 20;
141  layout.BottomPadding = 30;
142  layout.Spacing = 20;
143  this.Layout = layout;
144 
145  QuestionLabel = new Label( question );
146  Add( QuestionLabel );
147 
148  Buttons = new PushButton[buttonTexts.Length];
149  this._font = Font.Default;
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 { ButtonClicked( (int)button.Tag ); } );
155 #if WINDOWS_PHONE
156  if ( Game.Instance.Phone.DisplayResolution == DisplayResolution.Large )
157  button.TextScale = new Vector(2, 2);
158  else if ( Game.Instance.Phone.DisplayResolution == DisplayResolution.HD720 )
159  button.TextScale = new Vector( 3, 3 );
160 #endif
161  Add( button );
162  Buttons[i] = button;
163  }
164 
165  AddedToGame += InitOnAdd;
166  Removed += DeinitOnRemove;
167  }
168 
169  private void InitOnAdd()
170  {
171  AddControls();
173 #if !WINDOWS_PHONE && !ANDROID
175 #endif
176  }
177 
178  private void DeinitOnRemove()
179  {
180  _defaultListeners.ForEach(l => l.Destroy());
181  _defaultListeners.Clear();
182  }
183 
184  private void SelectButton( int p )
185  {
186  UnselectButton();
187  if ( p < 0 || p >= Buttons.Length ) return;
188 
189  _selectedIndex = p;
192  }
193 
194  private void UnselectButton()
195  {
196  if ( _selectedIndex < 0 ) return;
198  _selectedIndex = -1;
199  }
200 
201  public void AddItemHandler( int item, Action handler )
202  {
203  Buttons[item].Clicked += handler;
204  }
205 
206  public void AddItemHandler<T1>( int item, Action<T1> handler, T1 p1 )
207  {
208  Buttons[item].Clicked += delegate { handler( p1 ); };
209  }
210 
211  public void AddItemHandler<T1, T2>( int item, Action<T1, T2> handler, T1 p1, T2 p2 )
212  {
213  Buttons[item].Clicked += delegate { handler( p1, p2 ); };
214  }
215 
216  public void AddItemHandler<T1, T2, T3>( int item, Action<T1, T2, T3> handler, T1 p1, T2 p2, T3 p3 )
217  {
218  Buttons[item].Clicked += delegate { handler( p1, p2, p3 ); };
219  }
220 
221  public void RemoveItemHandler( int item, Action handler )
222  {
223  Buttons[item].Clicked -= handler;
224  }
225 
226  private void _setButtonColor( Color color )
227  {
228  for ( int i = 0; i < Buttons.Length; i++ )
229  {
230  Buttons[i].Color = color;
231  }
232 
233  // Re-set the color for selected item and reselect it
234  _selectedColor = color;
236  }
237 
238  public void SetButtonColor( Color color )
239  {
240  _setButtonColor( color );
241  _buttonColorSet = true;
242  }
243 
244  public void SetButtonTextColor( Color color )
245  {
246  for ( int i = 0; i < Buttons.Length; i++ )
247  {
248  Buttons[i].TextColor = color;
249  }
250  }
251 
252  private void AddControls()
253  {
255 
256  for ( int i = 0; i < Math.Min( Buttons.Length, keys.Length ); i++ )
257  {
258  var l = Keyboard.Listen(keys[i], ButtonState.Pressed, SelectButton, null, i).InContext(this);
259  associatedListeners.Add(l);
260  }
261 
262  Action selectPrev = delegate { SelectButton( _selectedIndex > 0 ? _selectedIndex - 1 : Buttons.Length - 1 ); };
263  Action selectNext = delegate { SelectButton( _selectedIndex < Buttons.Length - 1 ? _selectedIndex + 1 : 0 ); };
264  Action confirmSelect = delegate { SelectedButton.Click(); };
265 
266  var l1 = Keyboard.Listen( Key.Up, ButtonState.Pressed, selectPrev, null ).InContext( this );
267  var l2 = Keyboard.Listen( Key.Down, ButtonState.Pressed, selectNext, null ).InContext( this );
268  var l3 = Keyboard.Listen( Key.Enter, ButtonState.Pressed, confirmSelect, null ).InContext( this );
269  associatedListeners.AddItems(l1, l2, l3);
270 
271  foreach ( var controller in Game.Instance.GameControllers )
272  {
273  l1 = controller.Listen( Button.DPadUp, ButtonState.Pressed, selectPrev, null ).InContext( this );
274  l2 = controller.Listen( Button.DPadDown, ButtonState.Pressed, selectNext, null ).InContext( this );
275  l3 = controller.Listen( Button.A, ButtonState.Pressed, confirmSelect, null ).InContext( this );
276  associatedListeners.AddItems(l1, l2, l3);
277  }
278  }
279 
280  private void AddDefaultControls()
281  {
282  _defaultListeners.ForEach(l => l.Destroy());
283  _defaultListeners.Clear();
284 
285  if ( _defaultCancel >= 0 && _defaultCancel < Buttons.Length )
286  {
287  var l1 = Game.Instance.PhoneBackButton.Listen( Buttons[_defaultCancel].Click, null ).InContext( this );
288  var l2 = Game.Instance.Keyboard.Listen( Key.Escape, ButtonState.Pressed, Buttons[_defaultCancel].Click, null ).InContext( this );
289  var l3 = Game.Instance.ControllerOne.Listen( Button.B, ButtonState.Pressed, Buttons[_defaultCancel].Click, null ).InContext( this );
290  _defaultListeners.AddItems(l1, l2, l3);
291  }
292  }
293 
294  private void ButtonClicked( int index )
295  {
296  if ( ItemSelected != null )
297  ItemSelected( index );
298 
299  Close();
300  }
301  }
302 }
Jypeli.MultiSelectWindow.AddItemHandler< T1 >
void AddItemHandler< T1 >(int item, Action< T1 > handler, T1 p1)
Definition: MultiSelectWindow.cs:206
Jypeli.MultiSelectWindow.AddItemHandler< T1, T2 >
void AddItemHandler< T1, T2 >(int item, Action< T1, T2 > handler, T1 p1, T2 p2)
Definition: MultiSelectWindow.cs:211
Jypeli.MultiSelectWindow.RememberSelection
bool RememberSelection
Muistetaanko missä kohtaa kursori oli viime kerralla kun ikkuna näytettiin.
Definition: MultiSelectWindow.cs:121
Jypeli.MultiSelectWindow
Ikkuna, joka antaa käyttäjän valita yhden annetuista vaihtoehdoista.
Definition: MultiSelectWindow.cs:12
Jypeli.MultiSelectWindow.AddDefaultControls
void AddDefaultControls()
Definition: MultiSelectWindow.cs:280
Jypeli.MultiSelectWindow.AddItemHandler< T1, T2, T3 >
void AddItemHandler< T1, T2, T3 >(int item, Action< T1, T2, T3 > handler, T1 p1, T2 p2, T3 p3)
Definition: MultiSelectWindow.cs:216
Jypeli.Color.Black
static readonly Color Black
Musta.
Definition: Color.cs:503
Jypeli.GameObjects.VerticalScrollLayout.LeftPadding
double LeftPadding
Vasempaan reunaan jäävä tyhjä tila.
Definition: VerticalScrollLayout.cs:91
Jypeli.MultiSelectWindow.DeinitOnRemove
void DeinitOnRemove()
Definition: MultiSelectWindow.cs:178
Jypeli.MultiSelectWindow.SelectButton
void SelectButton(int p)
Definition: MultiSelectWindow.cs:184
Jypeli
Definition: Automobile.cs:5
Jypeli.MultiSelectWindow.SelectionColor
Color SelectionColor
Valitun nappulan väri.
Definition: MultiSelectWindow.cs:109
Jypeli.MultiSelectWindow.Buttons
PushButton[] Buttons
Painonappulat järjestyksessä.
Definition: MultiSelectWindow.cs:32
Jypeli.Font.Default
static readonly Font Default
Oletusfontti.
Definition: Font.cs:30
Jypeli.MultiSelectWindow.RemoveItemHandler
void RemoveItemHandler(int item, Action handler)
Definition: MultiSelectWindow.cs:221
Jypeli.Window.Close
void Close()
Sulkee ikkunan.
Definition: Window.cs:213
Jypeli.Label
Tekstikenttä.
Definition: Label.cs:66
Jypeli.MultiSelectWindow.keys
static readonly Key[] keys
Definition: MultiSelectWindow.cs:13
Jypeli.MultiSelectWindow.DefaultCancel
int DefaultCancel
Mitä valitaan kun käyttäjä painaa esc tai takaisin-näppäintä. Laittomalla arvolla (esim....
Definition: MultiSelectWindow.cs:59
Jypeli.GameObjects.VerticalScrollLayout
Asettelee widgetit päällekäin, järjestyksessä ylhäältä alas. Jos widgeteille ei ole tarpeeksi tilaa,...
Definition: VerticalScrollLayout.cs:43
Jypeli.MultiSelectWindow._defaultCancel
int _defaultCancel
Definition: MultiSelectWindow.cs:15
Jypeli.Label.TextScale
Vector TextScale
Tekstin skaalaus. Oletus (1,1) ; isompi suurempi.
Definition: Label.cs:117
Jypeli.Game.PhoneBackButton
BackButton PhoneBackButton
Puhelimen takaisin-näppäin.
Definition: Controls.cs:67
Jypeli.Game.Phone
Device Phone
Phone-olio esim. puhelimen tärisyttämiseen.
Definition: Game.cs:109
Jypeli.MultiSelectWindow.InitOnAdd
void InitOnAdd()
Definition: MultiSelectWindow.cs:169
Jypeli.MultiSelectWindow.SelectedIndex
int SelectedIndex
Kuinka mones nappula on valittuna (alkaa nollasta)
Definition: MultiSelectWindow.cs:72
Jypeli.GameObjects
Definition: GameObjectBase.cs:5
Jypeli.Game.Instance
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:90
Jypeli.DisplayResolution.HD720
static readonly DisplayResolution HD720
HD720-tarkkuus (720p, 1280 x 720). Ei toimi kaikilla puhelimilla.
Definition: DisplayResolution.cs:23
Jypeli.PushButton.Click
void Click()
Definition: PushButton.cs:332
Jypeli.MultiSelectWindow.ItemSelected
Action< int > ItemSelected
Tapahtuma joka tapahtuu kun nappia painetaan. Ottaa parametrikseen painonapin indeksin (alkaen nollas...
Definition: MultiSelectWindow.cs:127
Jypeli.MultiSelectWindow.SetButtonTextColor
void SetButtonTextColor(Color color)
Definition: MultiSelectWindow.cs:244
Jypeli.Game.ControllerOne
GamePad ControllerOne
Ensimmäinen peliohjain.
Definition: Controls.cs:77
Jypeli.MultiSelectWindow._selectionColor
Color _selectionColor
Definition: MultiSelectWindow.cs:20
Jypeli.PushButton
Painonappi.
Definition: PushButton.cs:40
Jypeli.Controls
Definition: Controller.cs:34
Jypeli.MultiSelectWindow.ButtonClicked
void ButtonClicked(int index)
Definition: MultiSelectWindow.cs:294
Jypeli.BackButton.Listen
Listener Listen(Action handler, string helpText)
Kuuntelee puhelimen takaisin-näppäintä.
Definition: BackButton.cs:31
Jypeli.Game.GameControllers
List< GamePad > GameControllers
Lista kaikista peliohjaimista järjestyksessä.
Definition: Controls.cs:72
Jypeli.GameObjects.VerticalScrollLayout.BottomPadding
double BottomPadding
Alareunaan jäävä tyhjä tila.
Definition: VerticalScrollLayout.cs:82
Jypeli.MultiSelectWindow._buttonColorSet
bool _buttonColorSet
Definition: MultiSelectWindow.cs:21
Jypeli.Button
Button
Definition: Button.cs:35
Jypeli.DisplayResolution.Large
static readonly DisplayResolution Large
Suuri tarkkuus (WVGA, 800 x 480). Oletus WP8:lla.
Definition: DisplayResolution.cs:17
Jypeli.MultiSelectWindow._defaultListeners
List< Listener > _defaultListeners
Definition: MultiSelectWindow.cs:16
Jypeli.PushButton.Color
override Color Color
Definition: PushButton.cs:127
Jypeli.Label.Font
virtual Font Font
Tekstin fontti.
Definition: Label.cs:213
Jypeli.MultiSelectWindow.AddItemHandler
void AddItemHandler(int item, Action handler)
Definition: MultiSelectWindow.cs:201
Jypeli.GameObjects.VerticalScrollLayout.RightPadding
double RightPadding
Oikeaan reunaan jäävä tyhjä tila.
Definition: VerticalScrollLayout.cs:100
Jypeli.GameObjects.VerticalScrollLayout.Spacing
double Spacing
Olioiden väliin jäävä tyhjä tila.
Definition: VerticalScrollLayout.cs:64
Jypeli.Color
Väri.
Definition: Color.cs:13
Jypeli.MultiSelectWindow.UnselectButton
void UnselectButton()
Definition: MultiSelectWindow.cs:194
Jypeli.MultiSelectWindow._selectedColor
Color _selectedColor
Definition: MultiSelectWindow.cs:19
Jypeli.Game.Keyboard
Keyboard Keyboard
Näppäimistö.
Definition: Controls.cs:44
Jypeli.MultiSelectWindow.QuestionLabel
Label QuestionLabel
Kysymys.
Definition: MultiSelectWindow.cs:27
Jypeli.Label.TextColor
Color TextColor
Tekstin väri.
Definition: Label.cs:207
Jypeli.MultiSelectWindow.MultiSelectWindow
MultiSelectWindow(string question, params string[] buttonTexts)
Luo uuden monivalintaikkunan.
Definition: MultiSelectWindow.cs:134
Jypeli.MultiSelectWindow.SelectedButton
PushButton? SelectedButton
Valittu nappula.
Definition: MultiSelectWindow.cs:85
Jypeli.MultiSelectWindow.SetButtonColor
void SetButtonColor(Color color)
Definition: MultiSelectWindow.cs:238
Jypeli.MultiSelectWindow._selectedIndex
int _selectedIndex
Definition: MultiSelectWindow.cs:18
Jypeli.ButtonState
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
System
Definition: CFFauxAttributes.cs:29
Jypeli.Widget.associatedListeners
List< Listener > associatedListeners
Tähän listaan lisätyt kuuntelijat tuhotaan automaattisesti kun Widget poistetaan pelistä.
Definition: Control.cs:14
Jypeli.Color.Darker
static Color Darker(Color c, int howMuch)
Antaa tummemman värin. Vähentaa jokaista kolmea osaväriä arvon howMuch verran.
Definition: Color.cs:417
Jypeli.Color.Cyan
static readonly Color Cyan
Syaani.
Definition: Color.cs:543
Jypeli.Window
Ikkuna.
Definition: Window.cs:37
Jypeli.Font
Fontti.
Definition: Font.cs:23
Jypeli.Keyboard
Näppäimistö.
Definition: Keyboard.cs:41
Jypeli.PushButton.Clicked
Action Clicked
Tapahtuu kun nappia on painettu.
Definition: PushButton.cs:144
Jypeli.MultiSelectWindow.AddControls
void AddControls()
Definition: MultiSelectWindow.cs:252
Jypeli.Game
Definition: Content.cs:46
Jypeli.Color.Color
Color(XnaColor c)
Definition: Color.cs:38
Jypeli.Key
Key
Näppäimistön näppäin.
Definition: Key.cs:38
Jypeli.DisplayResolution
Definition: DisplayResolution.cs:6
Jypeli.GamePad.Listen
Listener Listen(Button button, ButtonState state, Action handler, string helpText)
Kuuntelee peliohjaimen nappulan painalluksia.
Definition: GamePad.cs:242
Jypeli.MultiSelectWindow._setButtonColor
void _setButtonColor(Color color)
Definition: MultiSelectWindow.cs:226
Jypeli.Keyboard.Listen
Listener Listen(Key k, ButtonState state, Action handler, string helpText)
Kuuntelee näppäinten painalluksia.
Definition: Keyboard.cs:161
Jypeli.MultiSelectWindow._font
Font _font
Definition: MultiSelectWindow.cs:22