Jypeli 10
The simple game programming library
ListWidget.cs
Siirry tämän tiedoston dokumentaatioon.
1#region MIT License
2/*
3 * Copyright (c) 2009-2011 University of Jyväskylä, Department of Mathematical
4 * Information Technology.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#endregion
25
26/*
27 * Authors: Tomi Karppinen, Tero Jäntti
28 */
29
30using System.ComponentModel;
31using Microsoft.Xna.Framework;
33
34namespace Jypeli
35{
40 [EditorBrowsable( EditorBrowsableState.Never )]
41 public class ScrollableList<O> : Widget where O : Widget
42 {
46 public bool IsAtTop
47 {
48 get { return _layout.StartIndex == 0; }
49 }
50
54 public bool IsAtBottom
55 {
56 get { return _layout.EndIndex == _childObjects.Count; }
57 }
58
62 public int ItemCount { get { return _childObjects.Count; } }
63
65
70 : base( new VerticalScrollLayout() )
71 {
74 HorizontalSizing = Sizing.Expanding;
75 VerticalSizing = Sizing.Expanding;
77 }
78
80 {
81#if WINDOWS_PHONE || ANDROID
82 // TODO: gestures
83 //Game.TouchPanel.ListenGestureOn( this, GestureType.VerticalDrag, Scroll, null ).InContext( this );
84#endif
85 }
86
87#if WINDOWS_PHONE || ANDROID
88 const double MaxMoves = 5;
89
90 double velocity = 0;
91 Queue<double> lastMoves = new Queue<double>();
92
93 void Scroll( Touch touch )
94 {
95 if ( _childObjects == null || _childObjects.Count == 0 )
96 return;
97
98 // Works better when divided by 2. Don't know why :)
99 double movement = touch.MovementOnScreen.Y / 2;
100
101 if ( lastMoves.Count >= MaxMoves )
102 lastMoves.Dequeue();
103 lastMoves.Enqueue( movement );
104
105 velocity = lastMoves.Average();
106
107 List<GameObject> widgets = _childObjects.FindAll( o => o is Widget );
108 _layout.Scroll( widgets, movement );
109 }
110
111 public override void Update( Time time )
112 {
113 if ( Math.Abs( velocity ) > float.Epsilon && _childObjects != null && _childObjects.Count > 0 )
114 {
115 List<GameObject> widgets = _childObjects.FindAll( o => o is Widget );
116 _layout.Scroll( widgets, velocity );
117 }
118
119 velocity *= 0.98;
120 base.Update( time );
121 }
122#endif
123
127 public void ScrollUp()
128 {
129 _layout.ScrollUp( Objects.items );
130 }
131
135 public void ScrollDown()
136 {
137 _layout.ScrollDown( Objects.items );
138 }
139
143 public override void Clear()
144 {
146 _layout.EndIndex = 0;
147 base.Clear();
148 }
149
155 public O this[int index]
156 {
157 get { return (O)_childObjects[index]; }
158 set { _childObjects[index] = value; }
159 }
160 }
161
162
172 [EditorBrowsable( EditorBrowsableState.Never )]
173 public abstract class ListWidget<T, O> : Widget
174 where O : Widget
175 {
176 static Image upImage = null;
177 static Image downImage = null;
178 static Image transparentImage = null;
179
182
184
188 internal protected ScrollableList<O> Content;
189
194 {
195 get { return List; }
196 }
197
204 : base( new HorizontalLayout() )
205 {
208
209 Bind( list );
210
212 }
213
217 internal protected abstract O CreateWidget( T item );
218
219 private void AddListeners()
220 {
221 var l1 = Game.Instance.Keyboard.Listen( Key.Up, ButtonState.Pressed, scrollUp, null ).InContext( this );
222 var l2 = Game.Instance.Keyboard.Listen( Key.Down, ButtonState.Pressed, scrollDown, null ).InContext( this );
223 associatedListeners.AddItems(l1, l2);
224 }
225
227 {
228 Widget scrollPanel = new Widget( new VerticalLayout() ) { Color = Color.Transparent, HorizontalSizing = Sizing.FixedSize };
229
230 if ( upImage == null )
231 {
232 upImage = Game.LoadImageFromResources( "UpArrow.png" );
233 downImage = Game.LoadImageFromResources( "DownArrow.png" );
235 }
236
239 scrollPanel.Add( scrollUpButton );
240
241 scrollPanel.Add( new VerticalSpacer() );
242
245 scrollPanel.Add( scrollDownButton );
246
247 return scrollPanel;
248 }
249
253 protected void Reset()
254 {
255 Content.Clear();
256
257 foreach ( var item in List )
258 {
259 Content.Add( CreateWidget( item ) );
260 }
261
262 // This is a bit tricky case. Because the clear call above doesn't take
263 // effect immediately, calling UpdateLayout() uses old objects when updating
264 // layout. Thus, let's just wait for at least one update to occur.
265 Game.DoNextUpdate( delegate { if ( !Content.IsAtBottom ) ShowDownButton(); } );
266 }
267
268 private void ShowUpButton()
269 {
271 }
272
273 private void ShowDownButton()
274 {
276 }
277
278 private void Hide(PushButton button)
279 {
280 button.Image = transparentImage;
281 }
282
283
284 private void scrollDown()
285 {
286 Content.ScrollDown();
287
288 if ( !Content.IsAtTop )
289 {
290 ShowUpButton();
291 }
292
293 if ( Content.IsAtBottom )
294 {
296 }
297 }
298
299 private void scrollUp()
300 {
301 Content.ScrollUp();
302
303 if ( Content.IsAtTop )
304 {
306 }
307 }
308
309 private void listChanged()
310 {
311 Reset();
312 }
313
318 public void Bind( INotifyList<T> list )
319 {
320 this.List = list;
321 list.Changed += listChanged;
322 Reset();
323 }
324
328 public void Unbind()
329 {
330 List.Changed -= listChanged;
331 }
332 }
333}
static Image LoadImageFromResources(string name)
Lataa kuvan Jypelin sisäisistä resursseista.
Definition: Content.cs:91
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
Keyboard Keyboard
Näppäimistö.
Definition: Controls.cs:44
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
virtual Sizing HorizontalSizing
Koon asettaminen vaakasuunnassa, kun olio on asettelijan sisällä.
Definition: Layout.cs:18
SynchronousList< GameObject > Objects
Olion lapsioliot. Saa muuttaa.
Definition: ChildObjects.cs:46
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Definition: GameObject.cs:164
SynchronousList< GameObject > _childObjects
Definition: ChildObjects.cs:39
virtual Sizing VerticalSizing
Koon asettaminen pystysuunnassa, kun olio on asettelijan sisällä.
Definition: Layout.cs:37
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.
Image Image
Olion kuva. Voi olla null, jolloin piirretään vain väri.
Asettelee widgetit päällekäin, järjestyksessä ylhäältä alas. Jos widgeteille ei ole tarpeeksi tilaa,...
int StartIndex
Ylhäältä lukien ensimmäisen piirtoalueen sisällä olevan widgetin indeksi.
int EndIndex
Viimeisen piirtoalueella olevan widgetin jälkeinen indeksi.
void Scroll(IList< GameObject > objects, double amount)
Listan portaaton vieritys.
void ScrollUp(IList< GameObject > objects)
void ScrollDown(IList< GameObject > objects)
Asettelee widgetit riviin vaakasuunnassa.
Kuva.
Definition: Image.cs:30
int Width
Leveys pikseleinä.
Definition: Image.cs:374
int Height
Korkeus pikseleinä.
Definition: Image.cs:382
static Image FromColor(int imageWidth, int imageHeight, Color color)
Luo yksivärisen kuvan.
Definition: Image.cs:889
Listener Listen(Key k, ButtonState state, Action handler, string helpText)
Kuuntelee näppäinten painalluksia.
Definition: Keyboard.cs:161
Listakomponentti. Voidaan liittää listaan, joka toteuttaa INotifyList-rajapinnan. Tällöin listaan teh...
Definition: ListWidget.cs:175
abstract O CreateWidget(T item)
Luo annettua alkiota vastaavan listan rivin.
INotifyList< T > List
Definition: ListWidget.cs:183
Widget CreateVerticalScrollPanel()
Definition: ListWidget.cs:226
ListWidget(INotifyList< T > list)
Listakomponentti. Liitetään annettuun listaa, tälle tehdyt muutokset päivittyvät annetun listan kompo...
Definition: ListWidget.cs:203
INotifyList< T > Items
Listan alkiot.
Definition: ListWidget.cs:194
void Unbind()
Poistaa yhteyden olemassaolevaan listaan.
Definition: ListWidget.cs:328
ScrollableList< O > Content
Listan sisältö
Definition: ListWidget.cs:188
void Hide(PushButton button)
Definition: ListWidget.cs:278
void Bind(INotifyList< T > list)
Sitoo olemassaolevan listan tähän näyttöön. Kun listaa muutetaan, näytetyt arvot päivittyvät automaat...
Definition: ListWidget.cs:318
static Image transparentImage
Definition: ListWidget.cs:178
static Image downImage
Definition: ListWidget.cs:177
void Reset()
Tyhjentää widgetin sisällön
Definition: ListWidget.cs:253
PushButton scrollDownButton
Definition: ListWidget.cs:181
void ShowDownButton()
Definition: ListWidget.cs:273
PushButton scrollUpButton
Definition: ListWidget.cs:180
static Image upImage
Definition: ListWidget.cs:176
Painonappi.
Definition: PushButton.cs:40
Action Clicked
Tapahtuu kun nappia on painettu.
Definition: PushButton.cs:210
Rullattava lista widgeteille
Definition: ListWidget.cs:42
VerticalScrollLayout _layout
Definition: ListWidget.cs:64
void ScrollDown()
Kelaa listan alas
Definition: ListWidget.cs:135
int ItemCount
Lisättyjen kappaleiden määrä
Definition: ListWidget.cs:62
bool IsAtBottom
Onko lista kelattu alas
Definition: ListWidget.cs:55
bool IsAtTop
Onko lista kelattu ylös
Definition: ListWidget.cs:47
void ScrollUp()
Kelaa listan ylös
Definition: ListWidget.cs:127
override void Clear()
Tyhjentää listan
Definition: ListWidget.cs:143
ScrollableList()
Rullattava lista
Definition: ListWidget.cs:69
Kosketuspaneelin kosketus.
Definition: Touch.cs:39
Vector MovementOnScreen
Kosketuksen liike ruudulla.
Definition: Touch.cs:105
Asettelee widgetit päällekäin, järjestyksessä ylhäältä alas.
Pystysuuntainen väli
Definition: ILayout.cs:72
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
Widget(Animation animation)
Alustaa widgetin.
Definition: Widget.cs:14
List< Listener > associatedListeners
Tähän listaan lisätyt kuuntelijat tuhotaan automaattisesti kun Widget poistetaan pelistä.
Definition: Control.cs:14
Lista, joka ilmoittaa muutoksistaan.
Definition: INotifyList.cs:11
Action Changed
Tapahtuu kun listan sisältö muuttuu.
Definition: INotifyList.cs:15
Listener InContext(ListenContext context)
Kuuntelee tapahtumaa vain tietyssä kontekstissa.
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
Sizing
Olion koon asettaminen asettelijan sisällä.
Definition: ILayout.cs:39
Key
Näppäimistön näppäin.
Definition: Key.cs:39
Väri.
Definition: Color.cs:13
static readonly Color Transparent
Läpinäkyvä väri.
Definition: Color.cs:931
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339