Jypeli 10
The simple game programming library
InputBox.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, Rami Pasanen, Mikko Röyskö
28 */
29
30using System;
31using Microsoft.Xna.Framework;
32
33namespace Jypeli
34{
38 public class InputBox : Label
39 {
41
45 public InputBox()
46 : this(15)
47 {
48 }
49
53 public int WidthInCharacters { get; set; }
54
58 public int MaxCharacters { get; set; }
59
63 public Widget Cursor { get; set; }
64
68 public int CursorPos { get; set; }
69
70 private int distFromEnd = 0;
71 private int firstVisibleChar = 0;
72
74 public override Vector PreferredSize
75 {
76 get
77 {
79 }
80 }
81
83 public override Vector Size
84 {
85 get { return base.Size; }
86 set
87 {
88 base.Size = value;
89 if ( Cursor != null )
91 }
92 }
93
98 public override string Text
99 {
100 get { return base.Text; }
101 set
102 {
103 base.Text = value.Length > MaxCharacters ?
104 base.Text = value.Substring (0, MaxCharacters) : value;
105
107 }
108 }
109
113 public event Action<string> TextChanged;
114
118 protected void OnTextChanged()
119 {
120 if ( TextChanged != null )
121 TextChanged( Text );
122 }
123
124#if ANDROID
125 private bool vkSubscribed = false;
126#endif
127
135 public InputBox( int characters )
136 : base()
137 {
138 MaxCharacters = int.MaxValue;
139 WidthInCharacters = characters;
141 HorizontalSizing = Sizing.Expanding;
142 XMargin = 7;
143 YMargin = 2;
145 Color = new Color( 0, 255, 255, 150 );
146 BorderColor = new Color( 200, 200, 200 );
147 SizeMode = TextSizeMode.None;
149
151 Cursor.Color = new Color(255, 0, 0, 100);
152 Add( Cursor );
154
155 cursorBlinkTimer = new Timer();
158
161 }
162
163 private void OnAdded()
164 {
166
167 // TODO: Should also work on android
168#if ANDROID
169 ShowVirtualKeyboard();
170#endif
171
172 Game.Instance.Window.TextInput += InputText;
176 // TODO: Jos nuolta pitää hetken pohjassa, alkaa kursori liikkua nopeasti sivusuunnassa.
177 }
178
179#if ANDROID
180
181 private void ShowVirtualKeyboard()
182 {
183 // For some reason OnAdded() gets called twice on Android but only once on Windows
184 // when using EasyHighScore. What makes it even more odd is that when subscribing
185 // to AddedToGame from outside, the event is only fired once.
186 // We use vkSubscribed as a work-around to avoid subscribing to the key events
187 // multiple times.
188 Game.VirtualKeyboard.Show();
189 if (!vkSubscribed)
190 {
191 Game.VirtualKeyboard.InputEntered += VirtualKeyboard_InputEntered;
192 Game.VirtualKeyboard.EnterPressed += VirtualKeyboard_EnterPressed;
193 Game.VirtualKeyboard.BackspacePressed += VirtualKeyboard_BackspacePressed;
194 }
196 vkSubscribed = true;
197 }
198
199 private void VirtualKeyboard_BackspacePressed(object sender, EventArgs e)
200 {
201 EraseText();
202 }
203
204 private void VirtualKeyboard_EnterPressed(object sender, EventArgs e)
205 {
206 HideVirtualKeyboard();
207 }
208
209 private void VirtualKeyboard_InputEntered(object sender, Controls.Keyboard.VirtualKeyboardInputEventArgs e)
210 {
211 AddText(e.Text);
212 }
213
214 private void HideVirtualKeyboard()
215 {
216 Game.VirtualKeyboard.Hide();
217 Game.VirtualKeyboard.InputEntered -= VirtualKeyboard_InputEntered;
218 Game.VirtualKeyboard.EnterPressed -= VirtualKeyboard_EnterPressed;
219 Game.VirtualKeyboard.BackspacePressed -= VirtualKeyboard_BackspacePressed;
221 Cursor.IsVisible = false;
222 vkSubscribed = false;
223 }
224
225#endif
226
227 private new void OnRemoved()
228 {
230#if ANDROID
231 HideVirtualKeyboard();
232#endif
233 Game.Instance.Window.TextInput -= InputText;
234 }
235
236 private void BlinkCursor()
237 {
239 }
240
241 private void UpdateCursorPosition()
242 {
244 string shownText = ShownText();
245 int endPos = CursorPos - firstVisibleChar;
246 double strLen = Font.MeasureSize(shownText.Substring(0, endPos < 0 ? 0 : endPos > shownText.Length ? shownText.Length : endPos)).X;
247 Cursor.Left = Left + strLen + Cursor.Width*2;
248
249 }
250
251 private void MoveCursor(int dir)
252 {
253 if (CursorPos > 0 && dir == -1)
254 {
255 CursorPos--;
256 while (CursorPos < firstVisibleChar) {
257 ShownText();
258 distFromEnd++;
259 }
260 }
261
262 if (CursorPos < Text.Length && dir == 1)
263 {
264 CursorPos++;
265 while (CursorPos > Text.Length - distFromEnd)
266 {
267 distFromEnd--;
268 ShownText();
269 }
270 }
271
273 }
274
275 private void InputText( object sender, TextInputEventArgs e )
276 {
277 if ( !this.ControlContext.Active ) return;
278 char input = e.Character;
279 if ( input == 0x7F || input == 0x08 || input == 0x1B ) return; // delete, backspace, esc
280
281 // TODO: Ei välttämättä tarvi välittää
282 /*
283 if ( !this.Font.XnaFont.Characters.Contains( e.Character ) )
284 {
285 // Unsupported character
286 return;
287 }
288 */
289 AddText(input.ToString());
290 }
291
292
293 private void AddText(string text)
294 {
295 Text = Text.Insert(CursorPos, text);
296 CursorPos++;
299 }
300
301 private void EraseText()
302 {
303 if (Text.Length == 0 || CursorPos == 0) return;
304 Text = Text.Remove(CursorPos-1, 1);
305 CursorPos--;
308 }
309
310 private string ShownText()
311 {
312 string shownText = "";
313
314 for ( int i = Text.Length - 1 - distFromEnd; i >= 0; i-- )
315 {
316 string newText = Text[i] + shownText;
317
318 if (Font.XnaFont.MeasureString(newText).X >= Width - XMargin * 2)
319 {
320 firstVisibleChar = i + 1;
321 break;
322 }
323
325 shownText = newText;
326 }
327
328 return shownText;
329 }
330
332 public override void Draw(Matrix parentTransformation, Matrix transformation)
333 {
334 if(!IsTruncated)
335 base.Draw(parentTransformation, transformation, Text);
336 else
337 base.Draw(parentTransformation, transformation, ShownText());
338 }
339 }
340}
Fontti.
Definition: Font.cs:24
DynamicSpriteFont XnaFont
Definition: Font.cs:50
double CharacterHeight
Merkin korkeus.
Definition: Font.cs:137
Vector MeasureSize(string str)
Laskee tekstin koon fontilla.
Definition: Font.cs:279
double CharacterWidth
Merkin leveys.
Definition: Font.cs:129
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
bool IsVisible
Piirretäänkö oliota ruudulle.
Definition: Appearance.cs:43
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
virtual Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Definition: Appearance.cs:65
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Left
Olion vasemman reunan x-koordinaatti.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Laatikko, johon käyttäjä voi syöttää tekstiä.
Definition: InputBox.cs:39
void EraseText()
Definition: InputBox.cs:301
InputBox()
Alustaa uuden syöttökentän.
Definition: InputBox.cs:45
int firstVisibleChar
Definition: InputBox.cs:71
override Vector Size
Definition: InputBox.cs:84
int MaxCharacters
Suurin määrä merkkejä joita tekstilaatikkoon voi kirjoittaa.
Definition: InputBox.cs:58
Action< string > TextChanged
Tapahtuma tekstin muuttumiselle.
Definition: InputBox.cs:113
int CursorPos
Kursorin sijainti tekstissä.
Definition: InputBox.cs:68
override Vector PreferredSize
Definition: InputBox.cs:75
void OnTextChanged()
Kun tekstin sisältö muuttuu
Definition: InputBox.cs:118
void BlinkCursor()
Definition: InputBox.cs:236
int WidthInCharacters
Tekstilaatikon pituus kirjaimissa.
Definition: InputBox.cs:53
void OnAdded()
Definition: InputBox.cs:163
InputBox(int characters)
Alustaa uuden syöttökentän.
Definition: InputBox.cs:135
new void OnRemoved()
Definition: InputBox.cs:227
void UpdateCursorPosition()
Definition: InputBox.cs:241
Widget Cursor
Kursori.
Definition: InputBox.cs:63
string ShownText()
Definition: InputBox.cs:310
void InputText(object sender, TextInputEventArgs e)
Definition: InputBox.cs:275
Timer cursorBlinkTimer
Definition: InputBox.cs:40
void MoveCursor(int dir)
Definition: InputBox.cs:251
override void Draw(Matrix parentTransformation, Matrix transformation)
Piirtää elementin ruudulle
Definition: InputBox.cs:332
void AddText(string text)
Definition: InputBox.cs:293
override string? Text
Laatikkoon kirjoitettu teksti. Jos asetetaan teksti joka on pidempi kuin MaxCharacters,...
Definition: InputBox.cs:99
Listener Listen(Key k, ButtonState state, Action handler, string helpText)
Kuuntelee näppäinten painalluksia.
Definition: Keyboard.cs:161
Tekstikenttä.
Definition: Label.cs:70
double XMargin
Marginaali vasemmasta/oikeasta reunasta.
Definition: Label.cs:244
Color TextColor
Tekstin väri.
Definition: Label.cs:204
TextSizeMode SizeMode
Kuinka tekstikentän koko määräytyy.
Definition: Label.cs:190
double YMargin
Marginaali ylä-/alareunasta.
Definition: Label.cs:253
bool IsTruncated
Onko tekstiä katkaistu
Definition: Label.cs:111
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:38
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Definition: Timer.cs:87
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Definition: Timer.cs:292
Action Timeout
Tapahtuu väliajoin.
Definition: Timer.cs:44
void Start()
Käynnistää ajastimen.
Definition: Timer.cs:257
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
Color BorderColor
Reunojen väri.
Definition: Appearance.cs:10
ListenContext ControlContext
Tämän Widgetin ohjainkuuntelijoiden konteksti
Definition: Control.cs:19
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
TextSizeMode
Kuinka tekstikentän kokoa käsitellään.
Definition: Label.cs:42
Key
Näppäimistön näppäin.
Definition: Key.cs:39
HorizontalAlignment
Asemointi vaakasuunnassa.
Definition: View.cs:466
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
Väri.
Definition: Color.cs:13
static readonly Color Black
Musta.
Definition: Color.cs:556
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
double X
Vektorin X-komponentti.
Definition: Vector.cs:334