Jypeli  9
The simple game programming library
PushButton.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 
30 using System;
31 using System.Collections.Generic;
32 using Microsoft.Xna.Framework;
33 
34 namespace Jypeli
35 {
39  public class PushButton : Label
40  {
41  private enum State
42  {
43  Released,
44  Hover,
45  LeftPressed,
46  RightPressed
47  }
48 
53 
58 
61  private Image imageHover;
62 
63  private State state = State.Released;
64 
65  private bool isPressed { get { return state == State.LeftPressed || state == State.RightPressed; } }
66 
68  private Color hoverColor;
70 
75  {
76  get { return imageReleased; }
77  set
78  {
79  imageReleased = value;
80  if ( !isPressed && !Game.Mouse.IsCursorOn( this ) )
81  Image = value;
82  }
83  }
84 
89  {
90  get { return imagePressed; }
91  set
92  {
93  imagePressed = value;
94  if ( isPressed )
95  Image = value;
96  }
97  }
98 
103  {
104  get { return imageHover; }
105  set
106  {
107  imageHover = value;
108  if ( !isPressed && Game.Mouse.IsCursorOn( this ) )
109  Image = value;
110  }
111  }
112 
113  public override Vector Size
114  {
115  get
116  {
117  return base.Size;
118  }
119  set
120  {
121  base.Size = value;
122  InitializeShape();
123  }
124  }
125 
126  public override Color Color
127  {
128  get
129  {
130  return base.Color;
131  }
132  set
133  {
134  releasedColor = value;
135  hoverColor = Color.Lighter( value, 20 );
136  pressedColor = Color.Darker( value, 20 );
137  base.Color = value;
138  }
139  }
140 
144  public event Action Clicked;
145 
149  public event Action RightClicked;
150 
151  void TouchHover( Touch touch )
152  {
153  double touchX = touch.PositionOnScreen.X;
154  double touchY = touch.PositionOnScreen.Y;
155 
156  if ( touchX >= Left && touchX <= Right && touchY >= Bottom && touchY <= Top )
157  SetState( State.Hover );
158  else if ( Game.TouchPanel.NumTouches == 1 )
159  SetState( State.Released );
160  }
161 
162  void TouchRelease( Touch touch )
163  {
164  if ( Game.TouchPanel.NumTouches <= 1 )
165  SetState( State.Released );
166  }
167 
168  void TouchClick( Touch touch )
169  {
170  Click();
171  }
172 
173  public PushButton( string text )
174  : base( text )
175  {
176  Initialize();
177  }
178 
179  public PushButton( Image image )
180  : base( image )
181  {
182  Initialize();
183  this.Image = image;
184  }
185 
191  public PushButton( double width, double height )
192  : base( width, height )
193  {
194  Initialize();
195  }
196 
197  private void Initialize()
198  {
200  InitializeShape();
201  Color = new Color( 70, 130, 180, 230 );
202  TextColor = new Color( 250, 250, 250, 240 );
203  CapturesMouse = true;
204  AddedToGame += InitializeControls;
205  }
206 
207  private void InitializeMargins()
208  {
209  XMargin = 15;
210  YMargin = 10;
211  }
212 
219  public PushButton( double width, double height, Image image )
220  : this( width, height )
221  {
222  this.Image = image;
223  }
224 
231  public PushButton( double width, double height, string text )
232  : base( width, height, text )
233  {
234  Initialize();
235  }
236 
237  private void InitializeControls()
238  {
239  var l1 = Game.Mouse.ListenOn( this, MouseButton.Left, ButtonState.Pressed, SetState, null, State.LeftPressed ).InContext( this );
240  var l2 = Game.Mouse.ListenOn( this, MouseButton.Left, ButtonState.Released, Release, null ).InContext( this );
241  var l3 = Game.Mouse.Listen( MouseButton.Left, ButtonState.Released, Release, null ).InContext( this );
242 
243  var l4 = Game.Mouse.ListenOn( this, MouseButton.Right, ButtonState.Pressed, SetState, null, State.RightPressed ).InContext( this );
244  var l5 = Game.Mouse.ListenOn( this, MouseButton.Right, ButtonState.Released, Release, null ).InContext( this );
245  var l6 = Game.Mouse.Listen( MouseButton.Right, ButtonState.Released, Release, null ).InContext( this );
246 
247  var l7 = Game.Mouse.ListenMovement( 1.0, CheckHover, null ).InContext( this );
248 
249  var l8 = Game.Instance.TouchPanel.Listen( ButtonState.Down, TouchHover, null ).InContext( this );
250  var l9 = Game.Instance.TouchPanel.ListenOn( this, ButtonState.Released, TouchRelease, null ).InContext( this );
251  var l10 = Game.Instance.TouchPanel.Listen( ButtonState.Released, TouchRelease, null ).InContext( this );
252  var l11 = Game.Instance.TouchPanel.ListenOn( this, ButtonState.Released, TouchClick, null ).InContext( this );
253 
254  associatedListeners.AddItems(l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11);
255  }
256 
257  private void InitializeShape()
258  {
259  //double edgeSize = Math.Min( Width, Height ) / 5;
260  double edgeSize = 5;
261  double relativeHorizontalSize = edgeSize / Width;
262  double relativeVerticalSize = edgeSize / Height;
263 
264  Vector topLeftOuter = new Vector( -0.5, 0.5 );
265  Vector topLeftInner = new Vector( -0.5 + relativeHorizontalSize, 0.5 - relativeVerticalSize );
266  Vector bottomLeftOuter = new Vector( -0.5, -0.5 );
267  Vector bottomLeftInner = new Vector( -0.5 + relativeHorizontalSize, -0.5 + relativeVerticalSize );
268  Vector topRightOuter = new Vector( 0.5, 0.5 );
269  Vector topRightInner = new Vector( 0.5 - relativeHorizontalSize, 0.5 - relativeVerticalSize );
270  Vector bottomRightOuter = new Vector( 0.5, -0.5 );
271  Vector bottomRightInner = new Vector( 0.5 - relativeHorizontalSize, -0.5 + relativeVerticalSize );
272 
273  IndexTriangle[] triangles = { new IndexTriangle( 0, 1, 2 ), new IndexTriangle( 1, 3, 2 ), };
274 
275  Vector[] leftSideVertices = { topLeftOuter, topLeftInner, bottomLeftOuter, bottomLeftInner, };
276  Vector[] topSideVertices = { topLeftOuter, topRightOuter, topLeftInner, topRightInner, };
277  Vector[] rightSideVertices = { topRightOuter, bottomRightOuter, topRightInner, bottomRightInner, };
278  Vector[] bottomSideVertices = { bottomRightOuter, bottomLeftOuter, bottomRightInner, bottomLeftInner, };
279 
280  leftSideShape = new ShapeCache( leftSideVertices, triangles );
281  topSideShape = new ShapeCache( topSideVertices, triangles );
282  RightSideShape = new ShapeCache( rightSideVertices, triangles );
283  BottomSideShape = new ShapeCache( bottomSideVertices, triangles );
284 
285  const double scale = 1.4;
286 
287  topLeftOuter = new Vector( -0.5, 0.5 );
288  topLeftInner = new Vector( -0.5 + relativeHorizontalSize / scale, 0.5 - relativeVerticalSize / scale );
289  bottomLeftOuter = new Vector( -0.5, -0.5 );
290  bottomLeftInner = new Vector( -0.5 + relativeHorizontalSize / scale, -0.5 + relativeVerticalSize * scale );
291  topRightOuter = new Vector( 0.5, 0.5 );
292  topRightInner = new Vector( 0.5 - relativeHorizontalSize * scale, 0.5 - relativeVerticalSize / scale );
293  bottomRightOuter = new Vector( 0.5, -0.5 );
294  bottomRightInner = new Vector( 0.5 - relativeHorizontalSize * scale, -0.5 + relativeVerticalSize * scale );
295 
296  Vector[] leftSidePressedVertices = { topLeftOuter, topLeftInner, bottomLeftOuter, bottomLeftInner, };
297  Vector[] topSidePressedVertices = { topLeftOuter, topRightOuter, topLeftInner, topRightInner, };
298  Vector[] rightSidePressedVertices = { topRightOuter, bottomRightOuter, topRightInner, bottomRightInner, };
299  Vector[] bottomSidePressedVertices = { bottomRightOuter, bottomLeftOuter, bottomRightInner, bottomLeftInner, };
300 
301  leftSidePressedShape = new ShapeCache( leftSidePressedVertices, triangles );
302  topSidePressedShape = new ShapeCache( topSidePressedVertices, triangles );
303  RightSidePressedShape = new ShapeCache( rightSidePressedVertices, triangles );
304  BottomSidePressedShape = new ShapeCache( bottomSidePressedVertices, triangles );
305  }
306 
307  private void SetState( State state )
308  {
309  this.state = state;
310 
311  switch ( state )
312  {
313  case State.Hover:
314  base.Color = hoverColor;
315  if ( ImageHover != null )
316  Image = ImageHover;
317  break;
318  case State.RightPressed:
319  case State.LeftPressed:
320  base.Color = pressedColor;
321  if ( ImagePressed != null )
323  break;
324  default:
325  base.Color = releasedColor;
326  if ( ImageReleased != null )
328  break;
329  }
330  }
331 
332  public void Click()
333  {
334  if ( Clicked != null )
335  Clicked();
336  }
337 
338  public void RightClick()
339  {
340  if ( RightClicked != null )
341  RightClicked();
342  }
343 
348  public Listener AddShortcut( Key key )
349  {
350  return Jypeli.Game.Instance.Keyboard.Listen( key, ButtonState.Pressed, Click, null ).InContext( this );
351  }
352 
357  public List<Listener> AddShortcut( Button button )
358  {
359  var listeners = new List<Listener>(Game.GameControllers.Count);
360  Game.Instance.GameControllers.ForEach( c => listeners.Add(AddShortcut( c, button )) );
361  return listeners;
362  }
363 
369  public Listener AddShortcut( int player, Button button )
370  {
371  return AddShortcut( Game.Instance.GameControllers[player], button );
372  }
373 
379  public Listener AddShortcut( GamePad controller, Button button )
380  {
381  return controller.Listen( button, ButtonState.Pressed, Click, null ).InContext( this );
382  }
383 
384  private void Release()
385  {
386  bool wasLeft = state == State.LeftPressed;
387  bool wasRight = state == State.RightPressed;
388 
389  if ( Game.Mouse.IsCursorOn( this ) )
390  {
391  SetState( State.Hover );
392  }
393  else
394  {
395  SetState( State.Released );
396  return;
397  }
398 
399  if ( wasLeft ) Click();
400  else if ( wasRight ) RightClick();
401  }
402 
403  private void CheckHover()
404  {
405  if ( isPressed ) return;
406  SetState( Game.Mouse.IsCursorOn( this ) ? State.Hover : State.Released );
407  }
408 
409  public override void Draw( Matrix parentTransformation, Matrix transformation )
410  {
411  base.Draw( parentTransformation, transformation );
412 
413  if ( Image == null )
414  {
415  Color color1 = Color.Lighter( Color, 20 );
416  Color color2 = Color.Darker( Color, 20 );
417 
418  ShapeCache left = leftSideShape;
419  ShapeCache top = topSideShape;
420  ShapeCache right = RightSideShape;
421  ShapeCache bottom = BottomSideShape;
422 
423  if ( isPressed )
424  {
425  color1 = Color.Darker( Color, 20 );
426  color2 = Color.Lighter( Color, 20 );
427  left = leftSidePressedShape;
428  top = topSidePressedShape;
429  right = RightSidePressedShape;
430  bottom = BottomSidePressedShape;
431  }
432 
433  Renderer.DrawFilledShape( left, ref transformation, color1 );
434  Renderer.DrawFilledShape( top, ref transformation, color1 );
435  Renderer.DrawFilledShape( right, ref transformation, color2 );
436  Renderer.DrawFilledShape( bottom, ref transformation, color2 );
437  }
438  }
439  }
440 }
Jypeli.PushButton.leftSideShape
ShapeCache leftSideShape
Definition: PushButton.cs:49
Jypeli.Renderer
Luokka, joka sisältää metodeita kuvioiden ja tekstuurien piirtämiseen 2D-tasossa.
Definition: Renderer.cs:48
Jypeli.Color.Lighter
static Color Lighter(Color c, int howMuch)
Antaa kirkkaamman värin. Kasvattaa jokaista kolmea osaväriä arvon howMuch verran.
Definition: Color.cs:436
Jypeli.Matrix
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
Jypeli.PushButton.isPressed
bool isPressed
Definition: PushButton.cs:65
Microsoft.Xna
Definition: JypeliContentManager.cs:6
Jypeli.PushButton.TouchClick
void TouchClick(Touch touch)
Definition: PushButton.cs:168
Jypeli.Listener
Ohjaintapahtumien kuuntelija.
Definition: Listener.cs:50
Jypeli.PushButton.imageHover
Image imageHover
Definition: PushButton.cs:61
Jypeli.Mouse.Listen
Listener Listen(MouseButton button, ButtonState state, Action handler, string helpText)
Kuuntelee hiiren nappulan painalluksia.
Definition: Mouse.cs:350
Jypeli.PushButton.CheckHover
void CheckHover()
Definition: PushButton.cs:403
Jypeli.Vector.X
double X
Definition: Vector.cs:312
Jypeli.Label.XMargin
double XMargin
Marginaali vasemmasta/oikeasta reunasta.
Definition: Label.cs:236
Jypeli.PushButton.topSideShape
ShapeCache topSideShape
Definition: PushButton.cs:50
Jypeli
Definition: Automobile.cs:5
Jypeli.Renderer.DrawFilledShape
static void DrawFilledShape(ShapeCache cache, ref Matrix matrix, Color color)
Definition: Renderer.cs:365
Jypeli.PushButton.Release
void Release()
Definition: PushButton.cs:384
Jypeli.PushButton.PushButton
PushButton(double width, double height, Image image)
Luo uuden painonapin omalla kuvalla.
Definition: PushButton.cs:219
Jypeli.ShapeCache
Sisältää valmiiksi lasketut kolmiot, joiden avulla piirtäminen on suoraviivaista.
Definition: Shapes.cs:583
Jypeli.PushButton.topSidePressedShape
ShapeCache topSidePressedShape
Definition: PushButton.cs:55
Jypeli.PushButton.ImagePressed
Image ImagePressed
Kuva kun nappi on alaspainettuna.
Definition: PushButton.cs:89
Jypeli.TouchPanel.NumTouches
int NumTouches
Kuinka monta kosketusta tällä hetkellä ruudulla.
Definition: TouchPanel.cs:57
Jypeli.PushButton.SetState
void SetState(State state)
Definition: PushButton.cs:307
Microsoft
Definition: JypeliContentManager.cs:6
Jypeli.PushButton.PushButton
PushButton(double width, double height)
Luo uuden painonapin.
Definition: PushButton.cs:191
Microsoft.Xna.Framework
Definition: JypeliContentManager.cs:6
Jypeli.Label
Tekstikenttä.
Definition: Label.cs:66
Jypeli.PushButton.leftSidePressedShape
ShapeCache leftSidePressedShape
Definition: PushButton.cs:54
Jypeli.PushButton.state
State state
Definition: PushButton.cs:63
Jypeli.PushButton.Size
override Vector Size
Definition: PushButton.cs:114
Jypeli.Image.Color
static Image Color(Image image, Color color)
Värittää kuvan.
Definition: Image.cs:991
Jypeli.PushButton.imagePressed
Image imagePressed
Definition: PushButton.cs:60
Jypeli.PushButton.ImageReleased
Image ImageReleased
Kuva kun nappi on vapautettu.
Definition: PushButton.cs:75
Jypeli.PushButton.InitializeMargins
void InitializeMargins()
Definition: PushButton.cs:207
Jypeli.Game.Mouse
Mouse Mouse
Hiiri.
Definition: Controls.cs:49
Jypeli.PushButton.InitializeShape
void InitializeShape()
Definition: PushButton.cs:257
Jypeli.PushButton.RightClicked
Action RightClicked
Tapahtuu kun nappia on painettu oikealla hiirenpainikkeella.
Definition: PushButton.cs:149
Jypeli.PushButton.RightSidePressedShape
ShapeCache RightSidePressedShape
Definition: PushButton.cs:56
Jypeli.TouchPanel.Listen
Listener Listen(ButtonState state, TouchHandler handler, string helpText)
Kuuntelee kosketusnäyttöä.
Definition: TouchPanel.cs:296
Jypeli.PushButton.ImageHover
Image ImageHover
Kuva kun hiiren kursori on napin päällä.
Definition: PushButton.cs:103
Jypeli.PushButton.RightSideShape
ShapeCache RightSideShape
Definition: PushButton.cs:51
Jypeli.Game.Instance
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:90
Jypeli.PushButton.TouchHover
void TouchHover(Touch touch)
Definition: PushButton.cs:151
Jypeli.PushButton.AddShortcut
Listener AddShortcut(int player, Button button)
Lisää pikanäppäimen yhdelle ohjaimelle.
Definition: PushButton.cs:369
Jypeli.PushButton.AddShortcut
Listener AddShortcut(Key key)
Lisää pikanäppäimen napille.
Definition: PushButton.cs:348
Jypeli.PushButton.Click
void Click()
Definition: PushButton.cs:332
Jypeli.PushButton.BottomSidePressedShape
ShapeCache BottomSidePressedShape
Definition: PushButton.cs:57
Jypeli.PushButton.Draw
override void Draw(Matrix parentTransformation, Matrix transformation)
Definition: PushButton.cs:409
Jypeli.GamePad
Definition: GamePad.cs:41
Jypeli.PushButton.State
State
Definition: PushButton.cs:42
Jypeli.PushButton.releasedColor
Color releasedColor
Definition: PushButton.cs:67
Jypeli.PushButton
Painonappi.
Definition: PushButton.cs:40
Jypeli.PushButton.Initialize
void Initialize()
Definition: PushButton.cs:197
Jypeli.Widget.CapturesMouse
bool CapturesMouse
Definition: Control.cs:24
Jypeli.PushButton.AddShortcut
List< Listener > AddShortcut(Button button)
Lisää pikanäppäimen kaikille ohjaimille.
Definition: PushButton.cs:357
Jypeli.Game.GameControllers
List< GamePad > GameControllers
Lista kaikista peliohjaimista järjestyksessä.
Definition: Controls.cs:72
Jypeli.Touch.PositionOnScreen
Vector PositionOnScreen
Kosketuksen paikka ruudulla.
Definition: Touch.cs:61
Jypeli.PushButton.pressedColor
Color pressedColor
Definition: PushButton.cs:69
Jypeli.Button
Button
Definition: Button.cs:35
Jypeli.PushButton.Color
override Color Color
Definition: PushButton.cs:127
Jypeli.Label.YMargin
double YMargin
Marginaali ylä-/alareunasta.
Definition: Label.cs:245
Jypeli.Touch
Kosketuspaneelin kosketus.
Definition: Touch.cs:39
Jypeli.Color
Väri.
Definition: Color.cs:13
Jypeli.Mouse.ListenOn
Listener ListenOn(GameObject obj, HoverState hoverstate, MouseButton button, ButtonState state, Action handler, string helpText)
Kuuntelee hiirenpainalluksia annetun peliolion päällä.
Definition: Mouse.cs:476
Jypeli.PushButton.hoverColor
Color hoverColor
Definition: PushButton.cs:68
Jypeli.PushButton.imageReleased
Image imageReleased
Definition: PushButton.cs:59
Jypeli.MouseButton
MouseButton
Hiiren napit.
Definition: MouseButton.cs:7
Jypeli.Game.Keyboard
Keyboard Keyboard
Näppäimistö.
Definition: Controls.cs:44
Jypeli.IndexTriangle
Muotojen määrityksessä käytettävä kolmio.
Definition: Shapes.cs:553
Jypeli.Label.TextColor
Color TextColor
Tekstin väri.
Definition: Label.cs:207
Jypeli.Image
Kuva.
Definition: Image.cs:29
Jypeli.Mouse.ListenMovement
Listener ListenMovement(double trigger, Action handler, string helpText)
Kuuntelee hiiren liikettä.
Definition: Mouse.cs:413
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.Mouse.IsCursorOn
static bool IsCursorOn(ScreenView screen, MouseState state, GameObject obj)
Onko hiiren kursori annetun olion päällä.
Definition: Mouse.cs:320
Jypeli.PushButton.AddShortcut
Listener AddShortcut(GamePad controller, Button button)
Lisää pikanäppäimen yhdelle ohjaimelle.
Definition: PushButton.cs:379
Jypeli.PushButton.RightClick
void RightClick()
Definition: PushButton.cs:338
Jypeli.Game.TouchPanel
TouchPanel TouchPanel
Kosketusnäyttö
Definition: Controls.cs:62
Jypeli.TouchPanel.ListenOn
Listener ListenOn(GameObject obj, HoverState hoverstate, ButtonState buttonstate, TouchHandler handler, string helpText)
Kuuntelee kosketusnäyttöä olion päällä.
Definition: TouchPanel.cs:354
Jypeli.PushButton.Clicked
Action Clicked
Tapahtuu kun nappia on painettu.
Definition: PushButton.cs:144
Jypeli.PushButton.PushButton
PushButton(Image image)
Definition: PushButton.cs:179
Jypeli.VerticalAlignment.Center
@ Center
Keskellä.
Jypeli.PushButton.PushButton
PushButton(string text)
Definition: PushButton.cs:173
Jypeli.Game
Definition: Content.cs:46
Jypeli.PushButton.InitializeControls
void InitializeControls()
Definition: PushButton.cs:237
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.PushButton.TouchRelease
void TouchRelease(Touch touch)
Definition: PushButton.cs:162
Jypeli.PushButton.PushButton
PushButton(double width, double height, string text)
Luo uuden painonapin.
Definition: PushButton.cs:231
Jypeli.Vector.Y
double Y
Definition: Vector.cs:313
Jypeli.GamePad.Listen
Listener Listen(Button button, ButtonState state, Action handler, string helpText)
Kuuntelee peliohjaimen nappulan painalluksia.
Definition: GamePad.cs:242
Jypeli.Keyboard.Listen
Listener Listen(Key k, ButtonState state, Action handler, string helpText)
Kuuntelee näppäinten painalluksia.
Definition: Keyboard.cs:161
Jypeli.PushButton.BottomSideShape
ShapeCache BottomSideShape
Definition: PushButton.cs:52