Jypeli  5
The simple game programming library
Layout.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Jypeli.GameObjects;
6 
7 namespace Jypeli
8 {
9  public partial class GameObject
10  {
11  private ILayout _layout = null;
12 
13  private Sizing _horizontalSizing = Sizing.FixedSize;
14  private Sizing _verticalSizing = Sizing.FixedSize;
15  private Vector _preferredSize = new Vector( 50, 50 );
16  private bool _sizeByLayout = true;
17  private bool _layoutNeedsRefreshing = false;
18 
23  public virtual Sizing HorizontalSizing
24  {
25  get
26  {
27  if ( SizingByLayout && ( Layout != null ) )
28  return Layout.HorizontalSizing;
29  return _horizontalSizing;
30  }
31  set
32  {
33  _horizontalSizing = value;
35  }
36  }
37 
42  public virtual Sizing VerticalSizing
43  {
44  get
45  {
46  if ( SizingByLayout && ( Layout != null ) )
47  return Layout.VerticalSizing;
48  return _verticalSizing;
49  }
50  set
51  {
52  _verticalSizing = value;
54  }
55  }
56 
61  public virtual Vector PreferredSize
62  {
63  get
64  {
65  if ( Layout != null )
66  return Layout.PreferredSize;
67  return _preferredSize;
68  }
69  set
70  {
71  _preferredSize = value;
73  }
74  }
75 
76  public bool SizingByLayout
77  {
78  get { return _sizeByLayout; }
79  set { _sizeByLayout = value; }
80  }
81 
86  internal protected void NotifyParentAboutChangedSizingAttributes()
87  {
88  if ( Parent == null )
89  {
90  _layoutNeedsRefreshing = true;
91  }
92  else if ( Parent is GameObject )
93  {
94  ( (GameObject)Parent ).NotifyParentAboutChangedSizingAttributes();
95  }
96  }
97 
101  public ILayout Layout
102  {
103  get { return _layout; }
104  set
105  {
106  if ( _layout != null )
107  {
108  ILayout old = _layout;
109  _layout = null;
110  old.Parent = null;
111  }
112 
113  InitChildren();
114  _layout = value;
115  _layout.Parent = this;
117  }
118  }
119 
120  public void InitLayout( double width, double height )
121  {
122  autoResizeChildObjects = false;
123  this.PreferredSize = new Vector( width, height );
124  }
125 
126  public void InitLayout( double width, double height, ILayout layout )
127  {
128  this.Layout = layout;
129  InitLayout( width, height );
130  }
131 
141  public void RefreshLayout()
142  {
143  if ( Layout != null )
144  {
145  _childObjects.UpdateChanges();
146 
147  // First, lets ask how big the child objects need to be.
148  UpdateSizeHints();
149 
150  // Then, lets set the size accordingly, if we are allowed to do so.
151  if ( SizingByLayout )
152  {
153  Vector newSize = Layout.PreferredSize;
154  Vector maxSize = this.GetMaximumSize();
155 
156  if ( newSize.X > maxSize.X )
157  newSize.X = maxSize.X;
158  if ( newSize.Y > maxSize.Y )
159  newSize.Y = maxSize.Y;
160 
161  _size = newSize;
162  }
163 
164  // Finally, lets position the child objects into the space we have available
165  // for them.
166  UpdateLayout( _size );
167  }
168  }
169 
174  private void UpdateSizeHints()
175  {
176  if ( _childObjects == null ) return;
177 
178  foreach ( var child in _childObjects )
179  {
180  child.UpdateSizeHints();
181  }
182 
183  if ( Layout != null )
184  Layout.UpdateSizeHints( _childObjects.items );
185  }
186 
194  private void UpdateLayout( Vector maximumSize )
195  {
196  if ( Layout != null )
197  Layout.Update( Objects.items, maximumSize );
198 
199  if ( _childObjects != null )
200  {
201  foreach ( var child in _childObjects )
202  {
203  child.UpdateLayout( child.Size );
204  }
205  }
206  }
207 
214  protected virtual Vector GetMaximumSize()
215  {
216  return new Vector( double.PositiveInfinity, double.PositiveInfinity );
217  }
218  }
219 }
void InitLayout(double width, double height, ILayout layout)
Definition: Layout.cs:126
void UpdateSizeHints(IList< GameObject > objects)
GameObject(double width, double height)
Alustaa uuden peliolion.
Rajapinta asettelijalle. Asettelija asettelee widgetin lapsioliot siten, että ne mahtuvat widgetin si...
Definition: ILayout.cs:83
Sizing VerticalSizing
Definition: ILayout.cs:88
virtual Vector PreferredSize
Koko, jota oliolla tulisi olla asettelijan sisällä. Todellinen koko voi olla pienempi, jos tilaa ei ole tarpeeksi.
Definition: Layout.cs:62
void InitLayout(double width, double height)
Definition: Layout.cs:120
Sizing
Olion koon asettaminen asettelijan sisällä.
Definition: ILayout.cs:38
virtual void InitChildren()
Definition: ChildObjects.cs:93
ILayout Layout
Asettelija lapsiolioille. Asettaa lapsiolioiden koon sekä paikan.
Definition: Layout.cs:102
IEnumerable< IGameObject > Objects
Olion lapsioliot. Ei voi muokata.
Definition: __GameObject.cs:84
bool SizingByLayout
Definition: Layout.cs:77
double Y
Definition: Vector.cs:275
virtual Sizing VerticalSizing
Koon asettaminen pystysuunnassa, kun olio on asettelijan sisällä.
Definition: Layout.cs:43
virtual Sizing HorizontalSizing
Koon asettaminen vaakasuunnassa, kun olio on asettelijan sisällä.
Definition: Layout.cs:24
virtual Vector GetMaximumSize()
Antaa widgetin maksimikoon siinä tapauksessa, että kokoa ei ole annettu rakentajassa (tai tarkemmin s...
Definition: Layout.cs:214
double X
Definition: Vector.cs:274
void NotifyParentAboutChangedSizingAttributes()
Should be called whenever properties that might affect layouts are changed.
Definition: Layout.cs:86
IGameObject Parent
Olio, jonka lapsiolio tämä olio on. Jos null, olio ei ole minkään olion lapsiolio.
void Update(IList< GameObject > objects, Vector maximumSize)
bool autoResizeChildObjects
Definition: ChildObjects.cs:40
Sizing HorizontalSizing
Definition: ILayout.cs:87
GameObject Parent
Definition: ILayout.cs:85
2D-vektori.
Definition: Vector.cs:56
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
void RefreshLayout()
Päivittää lapsiolioiden paikat ja koot, jos widgetille on asetettu asettelija. Tätä metodia EI yleens...
Definition: Layout.cs:141
Vector PreferredSize
Definition: ILayout.cs:90