OpenTTD Source: src/osk_gui.cpp Source File

OpenTTD Source 1.11.0-RC1

osk_gui.cpp
Go to the documentation of this file.
1 /*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10 #include "stdafx.h"
11 #include "string_func.h"
12 #include "strings_func.h"
13 #include "debug.h"
14 #include "window_func.h"
15 #include "gfx_func.h"
16 #include "querystring_gui.h"
17 #include "video/video_driver.hpp"
18
19 #include "widgets/osk_widget.h"
20
21 #include "table/sprites.h"
22 #include "table/strings.h"
23
24 #include "safeguards.h"
25
26 char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
27 static WChar _keyboard[2][OSK_KEYBOARD_ENTRIES];
28
29 enum KeyStateBits {
30 KEYS_NONE,
31 KEYS_SHIFT,
32 KEYS_CAPS
33 };
34 static byte _keystate = KEYS_NONE;
35
36 struct OskWindow : public Window {
37 StringID caption;
38 QueryString *qs;
39 int text_btn;
40 Textbuf *text;
41 char *orig_str_buf;
42 bool shift;
43
44 OskWindow(WindowDesc *desc, Window *parent, int button) : Window(desc)
45 {
46 this->parent = parent;
47 assert(parent != nullptr);
48
49 NWidgetCore *par_wid = parent->GetWidget<NWidgetCore>(button);
50 assert(par_wid != nullptr);
51
52 assert(parent->querystrings.Contains(button));
53 this->qs = parent->querystrings.Find(button)->second;
54 this->caption = (par_wid->widget_data != STR_NULL) ? par_wid->widget_data : this->qs->caption;
55 this->text_btn = button;
56 this->text = &this->qs->text;
57 this->querystrings[WID_OSK_TEXT] = this->qs;
58
59 /* make a copy in case we need to reset later */
60 this->orig_str_buf = stredup(this->qs->text.buf);
61
62 this->InitNested(0);
63 this->SetFocusedWidget(WID_OSK_TEXT);
64
65 /* Not needed by default. */
66 this->DisableWidget(WID_OSK_SPECIAL);
67
68 this->UpdateOskState();
69 }
70
71 ~OskWindow()
72 {
73 free(this->orig_str_buf);
74 }
75
81 void UpdateOskState()
82 {
83 this->shift = HasBit(_keystate, KEYS_CAPS) ^ HasBit(_keystate, KEYS_SHIFT);
84
85 for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
86 this->SetWidgetDisabledState(WID_OSK_LETTERS + i,
87 !IsValidChar(_keyboard[this->shift][i], this->qs->text.afilter) || _keyboard[this->shift][i] == ' ');
88 }
89 this->SetWidgetDisabledState(WID_OSK_SPACE, !IsValidChar(' ', this->qs->text.afilter));
90
91 this->SetWidgetLoweredState(WID_OSK_SHIFT, HasBit(_keystate, KEYS_SHIFT));
92 this->SetWidgetLoweredState(WID_OSK_CAPS, HasBit(_keystate, KEYS_CAPS));
93 }
94
95 void SetStringParameters(int widget) const override
96 {
97 if (widget == WID_OSK_CAPTION) SetDParam(0, this->caption);
98 }
99
100 void DrawWidget(const Rect &r, int widget) const override
101 {
102 if (widget < WID_OSK_LETTERS) return;
103
104 widget -= WID_OSK_LETTERS;
105 DrawCharCentered(_keyboard[this->shift][widget],
106 r.left + 8,
107 r.top + 3,
108 TC_BLACK);
109 }
110
111 void OnClick(Point pt, int widget, int click_count) override
112 {
113 /* clicked a letter */
114 if (widget >= WID_OSK_LETTERS) {
115 WChar c = _keyboard[this->shift][widget - WID_OSK_LETTERS];
116
117 if (!IsValidChar(c, this->qs->text.afilter)) return;
118
119 if (this->qs->text.InsertChar(c)) this->OnEditboxChanged(WID_OSK_TEXT);
120
121 if (HasBit(_keystate, KEYS_SHIFT)) {
122 ToggleBit(_keystate, KEYS_SHIFT);
123 this->UpdateOskState();
124 this->SetDirty();
125 }
126 return;
127 }
128
129 switch (widget) {
130 case WID_OSK_BACKSPACE:
131 if (this->qs->text.DeleteChar(WKC_BACKSPACE)) this->OnEditboxChanged(WID_OSK_TEXT);
132 break;
133
134 case WID_OSK_SPECIAL:
135 /*
136 * Anything device specific can go here.
137 * The button itself is hidden by default, and when you need it you
138 * can not hide it in the create event.
139 */
140 break;
141
142 case WID_OSK_CAPS:
143 ToggleBit(_keystate, KEYS_CAPS);
144 this->UpdateOskState();
145 this->SetDirty();
146 break;
147
148 case WID_OSK_SHIFT:
149 ToggleBit(_keystate, KEYS_SHIFT);
150 this->UpdateOskState();
151 this->SetDirty();
152 break;
153
154 case WID_OSK_SPACE:
155 if (this->qs->text.InsertChar(' ')) this->OnEditboxChanged(WID_OSK_TEXT);
156 break;
157
158 case WID_OSK_LEFT:
159 if (this->qs->text.MovePos(WKC_LEFT)) this->InvalidateData();
160 break;
161
162 case WID_OSK_RIGHT:
163 if (this->qs->text.MovePos(WKC_RIGHT)) this->InvalidateData();
164 break;
165
166 case WID_OSK_OK:
167 if (this->qs->orig == nullptr || strcmp(this->qs->text.buf, this->qs->orig) != 0) {
168 /* pass information by simulating a button press on parent window */
169 if (this->qs->ok_button >= 0) {
170 this->parent->OnClick(pt, this->qs->ok_button, 1);
171 /* Window gets deleted when the parent window removes itself. */
172 return;
173 }
174 }
175 delete this;
176 break;
177
178 case WID_OSK_CANCEL:
179 if (this->qs->cancel_button >= 0) { // pass a cancel event to the parent window
180 this->parent->OnClick(pt, this->qs->cancel_button, 1);
181 /* Window gets deleted when the parent window removes itself. */
182 return;
183 } else { // or reset to original string
184 qs->text.Assign(this->orig_str_buf);
185 qs->text.MovePos(WKC_END);
186 this->OnEditboxChanged(WID_OSK_TEXT);
187 delete this;
188 }
189 break;
190 }
191 }
192
193 void OnEditboxChanged(int widget) override
194 {
195 this->SetWidgetDirty(WID_OSK_TEXT);
196 this->parent->OnEditboxChanged(this->text_btn);
197 this->parent->SetWidgetDirty(this->text_btn);
198 }
199
200 void OnInvalidateData(int data = 0, bool gui_scope = true) override
201 {
202 if (!gui_scope) return;
203 this->SetWidgetDirty(WID_OSK_TEXT);
204 this->parent->SetWidgetDirty(this->text_btn);
205 }
206
207 void OnFocusLost() override
208 {
209 VideoDriver::GetInstance()->EditBoxLostFocus();
210 delete this;
211 }
212 };
213
214 static const int HALF_KEY_WIDTH = 7; // Width of 1/2 key in pixels.
215 static const int INTER_KEY_SPACE = 2; // Number of pixels between two keys.
216
228 static void AddKey(NWidgetHorizontal *hor, int height, int num_half, WidgetType widtype, int widnum, uint16 widdata, int *biggest_index)
229 {
230 int key_width = HALF_KEY_WIDTH + (INTER_KEY_SPACE + HALF_KEY_WIDTH) * (num_half - 1);
231
232 if (widtype == NWID_SPACER) {
233 if (!hor->IsEmpty()) key_width += INTER_KEY_SPACE;
234 NWidgetSpacer *spc = new NWidgetSpacer(key_width, height);
235 hor->Add(spc);
236 } else {
237 if (!hor->IsEmpty()) {
238 NWidgetSpacer *spc = new NWidgetSpacer(INTER_KEY_SPACE, height);
239 hor->Add(spc);
240 }
241 NWidgetLeaf *leaf = new NWidgetLeaf(widtype, COLOUR_GREY, widnum, widdata, STR_NULL);
242 leaf->SetMinimalSize(key_width, height);
243 hor->Add(leaf);
244 }
245
246 *biggest_index = std::max(*biggest_index, widnum);
247 }
248
250 static NWidgetBase *MakeTopKeys(int *biggest_index)
251 {
252 NWidgetHorizontal *hor = new NWidgetHorizontal();
253 int key_height = FONT_HEIGHT_NORMAL + 2;
254
255 AddKey(hor, key_height, 6 * 2, WWT_TEXTBTN, WID_OSK_CANCEL, STR_BUTTON_CANCEL, biggest_index);
256 AddKey(hor, key_height, 6 * 2, WWT_TEXTBTN, WID_OSK_OK, STR_BUTTON_OK, biggest_index);
257 AddKey(hor, key_height, 2 * 2, WWT_PUSHIMGBTN, WID_OSK_BACKSPACE, SPR_OSK_BACKSPACE, biggest_index);
258 return hor;
259 }
260
262 static NWidgetBase *MakeNumberKeys(int *biggest_index)
263 {
264 NWidgetHorizontal *hor = new NWidgetHorizontalLTR();
265 int key_height = FONT_HEIGHT_NORMAL + 6;
266
267 for (int widnum = WID_OSK_NUMBERS_FIRST; widnum <= WID_OSK_NUMBERS_LAST; widnum++) {
268 AddKey(hor, key_height, 2, WWT_PUSHBTN, widnum, 0x0, biggest_index);
269 }
270 return hor;
271 }
272
274 static NWidgetBase *MakeQwertyKeys(int *biggest_index)
275 {
276 NWidgetHorizontal *hor = new NWidgetHorizontalLTR();
277 int key_height = FONT_HEIGHT_NORMAL + 6;
278
279 AddKey(hor, key_height, 3, WWT_PUSHIMGBTN, WID_OSK_SPECIAL, SPR_OSK_SPECIAL, biggest_index);
280 for (int widnum = WID_OSK_QWERTY_FIRST; widnum <= WID_OSK_QWERTY_LAST; widnum++) {
281 AddKey(hor, key_height, 2, WWT_PUSHBTN, widnum, 0x0, biggest_index);
282 }
283 AddKey(hor, key_height, 1, NWID_SPACER, 0, 0, biggest_index);
284 return hor;
285 }
286
288 static NWidgetBase *MakeAsdfgKeys(int *biggest_index)
289 {
290 NWidgetHorizontal *hor = new NWidgetHorizontalLTR();
291 int key_height = FONT_HEIGHT_NORMAL + 6;
292
293 AddKey(hor, key_height, 4, WWT_IMGBTN, WID_OSK_CAPS, SPR_OSK_CAPS, biggest_index);
294 for (int widnum = WID_OSK_ASDFG_FIRST; widnum <= WID_OSK_ASDFG_LAST; widnum++) {
295 AddKey(hor, key_height, 2, WWT_PUSHBTN, widnum, 0x0, biggest_index);
296 }
297 return hor;
298 }
299
301 static NWidgetBase *MakeZxcvbKeys(int *biggest_index)
302 {
303 NWidgetHorizontal *hor = new NWidgetHorizontalLTR();
304 int key_height = FONT_HEIGHT_NORMAL + 6;
305
306 AddKey(hor, key_height, 3, WWT_IMGBTN, WID_OSK_SHIFT, SPR_OSK_SHIFT, biggest_index);
307 for (int widnum = WID_OSK_ZXCVB_FIRST; widnum <= WID_OSK_ZXCVB_LAST; widnum++) {
308 AddKey(hor, key_height, 2, WWT_PUSHBTN, widnum, 0x0, biggest_index);
309 }
310 AddKey(hor, key_height, 1, NWID_SPACER, 0, 0, biggest_index);
311 return hor;
312 }
313
315 static NWidgetBase *MakeSpacebarKeys(int *biggest_index)
316 {
317 NWidgetHorizontal *hor = new NWidgetHorizontal();
318 int key_height = FONT_HEIGHT_NORMAL + 6;
319
320 AddKey(hor, key_height, 8, NWID_SPACER, 0, 0, biggest_index);
321 AddKey(hor, key_height, 13, WWT_PUSHTXTBTN, WID_OSK_SPACE, STR_EMPTY, biggest_index);
322 AddKey(hor, key_height, 3, NWID_SPACER, 0, 0, biggest_index);
323 AddKey(hor, key_height, 2, WWT_PUSHIMGBTN, WID_OSK_LEFT, SPR_OSK_LEFT, biggest_index);
324 AddKey(hor, key_height, 2, WWT_PUSHIMGBTN, WID_OSK_RIGHT, SPR_OSK_RIGHT, biggest_index);
325 return hor;
326 }
327
328
329 static const NWidgetPart _nested_osk_widgets[] = {
330 NWidget(WWT_CAPTION, COLOUR_GREY, WID_OSK_CAPTION), SetDataTip(STR_WHITE_STRING, STR_NULL),
331 NWidget(WWT_PANEL, COLOUR_GREY),
332 NWidget(WWT_EDITBOX, COLOUR_GREY, WID_OSK_TEXT), SetMinimalSize(252, 12), SetPadding(2, 2, 2, 2),
333 EndContainer(),
334 NWidget(WWT_PANEL, COLOUR_GREY), SetPIP(5, 2, 3),
335 NWidgetFunction(MakeTopKeys), SetPadding(0, 3, 0, 3),
336 NWidgetFunction(MakeNumberKeys), SetPadding(0, 3, 0, 3),
337 NWidgetFunction(MakeQwertyKeys), SetPadding(0, 3, 0, 3),
338 NWidgetFunction(MakeAsdfgKeys), SetPadding(0, 3, 0, 3),
339 NWidgetFunction(MakeZxcvbKeys), SetPadding(0, 3, 0, 3),
340 NWidgetFunction(MakeSpacebarKeys), SetPadding(0, 3, 0, 3),
341 EndContainer(),
342 };
343
344 static WindowDesc _osk_desc(
345 WDP_CENTER, "query_osk", 0, 0,
346 WC_OSK, WC_NONE,
347 0,
348 _nested_osk_widgets, lengthof(_nested_osk_widgets)
349 );
350
355 void GetKeyboardLayout()
356 {
357 char keyboard[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
358 char errormark[2][OSK_KEYBOARD_ENTRIES + 1]; // used for marking invalid chars
359 bool has_error = false; // true when an invalid char is detected
360
361 if (StrEmpty(_keyboard_opt[0])) {
362 GetString(keyboard[0], STR_OSK_KEYBOARD_LAYOUT, lastof(keyboard[0]));
363 } else {
364 strecpy(keyboard[0], _keyboard_opt[0], lastof(keyboard[0]));
365 }
366
367 if (StrEmpty(_keyboard_opt[1])) {
368 GetString(keyboard[1], STR_OSK_KEYBOARD_LAYOUT_CAPS, lastof(keyboard[1]));
369 } else {
370 strecpy(keyboard[1], _keyboard_opt[1], lastof(keyboard[1]));
371 }
372
373 for (uint j = 0; j < 2; j++) {
374 const char *kbd = keyboard[j];
375 bool ended = false;
376 for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
377 _keyboard[j][i] = Utf8Consume(&kbd);
378
379 /* Be lenient when the last characters are missing (is quite normal) */
380 if (_keyboard[j][i] == '\0' || ended) {
381 ended = true;
382 _keyboard[j][i] = ' ';
383 continue;
384 }
385
386 if (IsPrintable(_keyboard[j][i])) {
387 errormark[j][i] = ' ';
388 } else {
389 has_error = true;
390 errormark[j][i] = '^';
391 _keyboard[j][i] = ' ';
392 }
393 }
394 }
395
396 if (has_error) {
397 ShowInfoF("The keyboard layout you selected contains invalid chars. Please check those chars marked with ^.");
398 ShowInfoF("Normal keyboard: %s", keyboard[0]);
399 ShowInfoF(" %s", errormark[0]);
400 ShowInfoF("Caps Lock: %s", keyboard[1]);
401 ShowInfoF(" %s", errormark[1]);
402 }
403 }
404
410 void ShowOnScreenKeyboard(Window *parent, int button)
411 {
412 DeleteWindowById(WC_OSK, 0);
413
414 GetKeyboardLayout();
415 new OskWindow(&_osk_desc, parent, button);
416 }
417
425 void UpdateOSKOriginalText(const Window *parent, int button)
426 {
427 OskWindow *osk = dynamic_cast<OskWindow *>(FindWindowById(WC_OSK, 0));
428 if (osk == nullptr || osk->parent != parent || osk->text_btn != button) return;
429
430 free(osk->orig_str_buf);
431 osk->orig_str_buf = stredup(osk->qs->text.buf);
432
433 osk->SetDirty();
434 }
435
442 bool IsOSKOpenedFor(const Window *w, int button)
443 {
444 OskWindow *osk = dynamic_cast<OskWindow *>(FindWindowById(WC_OSK, 0));
445 return osk != nullptr && osk->parent == w && osk->text_btn == button;
446 }
OskWindow
Definition: osk_gui.cpp:36
OskWindow::OnFocusLost
void OnFocusLost() override
Called when window loses focus.
Definition: osk_gui.cpp:207
WID_OSK_QWERTY_LAST
@ WID_OSK_QWERTY_LAST
Last widget of the qwerty row.
Definition: osk_widget.h:32
NWidgetFunction
static NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
Definition: widget_type.h:1145
QueryString::ok_button
int ok_button
Widget button of parent window to simulate when pressing OK in OSK.
Definition: querystring_gui.h:27
WChar
char32_t WChar
Type for wide characters, i.e.
Definition: string_type.h:35
querystring_gui.h
Window::OnEditboxChanged
virtual void OnEditboxChanged(int widget)
The text in an editbox has been edited.
Definition: window_gui.h:730
OskWindow::OnEditboxChanged
void OnEditboxChanged(int widget) override
The text in an editbox has been edited.
Definition: osk_gui.cpp:193
SetPadding
static NWidgetPart SetPadding(uint8 top, uint8 right, uint8 bottom, uint8 left)
Widget part function for setting additional space around a widget.
Definition: widget_type.h:1045
_keyboard_opt
char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES *4+1]
The number of characters has to be OSK_KEYBOARD_ENTRIES.
Definition: osk_gui.cpp:26
WID_OSK_SPECIAL
@ WID_OSK_SPECIAL
Special key (at keyboards often used for tab key).
Definition: osk_widget.h:20
WID_OSK_OK
@ WID_OSK_OK
Ok key.
Definition: osk_widget.h:18
WID_OSK_ZXCVB_FIRST
@ WID_OSK_ZXCVB_FIRST
First widget of the zxcvb row.
Definition: osk_widget.h:37
WID_OSK_BACKSPACE
@ WID_OSK_BACKSPACE
Backspace key.
Definition: osk_widget.h:19
NWidgetContainer::Add
void Add(NWidgetBase *wid)
Append widget wid to container.
Definition: widget.cpp:951
MakeQwertyKeys
static NWidgetBase * MakeQwertyKeys(int *biggest_index)
Construct the qwerty row keys.
Definition: osk_gui.cpp:274
WWT_CAPTION
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:59
MakeSpacebarKeys
static NWidgetBase * MakeSpacebarKeys(int *biggest_index)
Construct the spacebar row keys.
Definition: osk_gui.cpp:315
WWT_IMGBTN
@ WWT_IMGBTN
(Toggle) Button with image
Definition: widget_type.h:50
Textbuf::Assign
void Assign(StringID string)
Render a string into the textbuffer.
Definition: textbuf.cpp:396
Textbuf::MovePos
bool MovePos(uint16 keycode)
Handle text navigation with arrow keys left/right.
Definition: textbuf.cpp:319
FindWindowById
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition: window.cpp:1133
HasBit
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Definition: bitmath_func.hpp:103
NWidgetSpacer
Spacer widget.
Definition: widget_type.h:528
WID_OSK_ZXCVB_LAST
@ WID_OSK_ZXCVB_LAST
Last widget of the zxcvb row.
Definition: osk_widget.h:38
NWidgetLeaf
Leaf widget.
Definition: widget_type.h:769
WID_OSK_SHIFT
@ WID_OSK_SHIFT
Shift(lock) key.
Definition: osk_widget.h:22
WC_OSK
@ WC_OSK
On Screen Keyboard; Window numbers:
Definition: window_type.h:155
IsOSKOpenedFor
bool IsOSKOpenedFor(const Window *w, int button)
Check whether the OSK is opened for a specific editbox.
Definition: osk_gui.cpp:442
WID_OSK_LETTERS
@ WID_OSK_LETTERS
First widget of the 'normal' keys.
Definition: osk_widget.h:26
osk_widget.h
OskWindow::DrawWidget
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Definition: osk_gui.cpp:100
WID_OSK_CAPTION
@ WID_OSK_CAPTION
Caption of window.
Definition: osk_widget.h:15
MakeZxcvbKeys
static NWidgetBase * MakeZxcvbKeys(int *biggest_index)
Construct the zxcvb row keys.
Definition: osk_gui.cpp:301
WID_OSK_RIGHT
@ WID_OSK_RIGHT
Cursor right key.
Definition: osk_widget.h:25
SetDParam
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:199
NWidgetPart
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:909
SetDataTip
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1013
QueryString
Data stored about a string that can be modified in the GUI.
Definition: querystring_gui.h:20
NWidgetCore::widget_data
uint32 widget_data
Data of the widget.
Definition: widget_type.h:304
Textbuf::buf
char *const buf
buffer in which text is saved
Definition: textbuf_type.h:32
Window::querystrings
SmallMap< int, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
Definition: window_gui.h:328
gfx_func.h
WindowDesc
High level window description.
Definition: window_gui.h:166
Window::GetWidget
const NWID * GetWidget(uint widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition: window_gui.h:844
WID_OSK_LEFT
@ WID_OSK_LEFT
Cursor left key.
Definition: osk_widget.h:24
WWT_PUSHBTN
@ WWT_PUSHBTN
Normal push-button (no toggle button) with custom drawing.
Definition: widget_type.h:101
MakeNumberKeys
static NWidgetBase * MakeNumberKeys(int *biggest_index)
Construct the row containing the digit keys.
Definition: osk_gui.cpp:262
AddKey
static void AddKey(NWidgetHorizontal *hor, int height, int num_half, WidgetType widtype, int widnum, uint16 widdata, int *biggest_index)
Add a key widget to a row of the keyboard.
Definition: osk_gui.cpp:228
Window::InitNested
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1861
WWT_EDITBOX
@ WWT_EDITBOX
a textbox for typing
Definition: widget_type.h:69
Window::SetDirty
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:984
WWT_PUSHTXTBTN
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition: widget_type.h:102
NWidgetBase
Baseclass for nested widgets.
Definition: widget_type.h:124
OSK_KEYBOARD_ENTRIES
static const uint OSK_KEYBOARD_ENTRIES
The number of 'characters' on the on-screen keyboard.
Definition: textbuf_gui.h:35
Window::SetWidgetDisabledState
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition: window_gui.h:392
Window::parent
Window * parent
Parent window.
Definition: window_gui.h:337
safeguards.h
IsValidChar
bool IsValidChar(WChar key, CharSetFilter afilter)
Only allow certain keys.
Definition: string.cpp:383
Textbuf::DeleteChar
bool DeleteChar(uint16 keycode)
Delete a character from a textbuffer, either with 'Delete' or 'Backspace' The character is delete fro...
Definition: textbuf.cpp:53
StrEmpty
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
Definition: string_func.h:60
WID_OSK_ASDFG_LAST
@ WID_OSK_ASDFG_LAST
Last widget of the asdfg row.
Definition: osk_widget.h:35
sprites.h
Point
Coordinates of a point in 2D.
Definition: geometry_type.hpp:21
Textbuf::afilter
CharSetFilter afilter
Allowed characters.
Definition: textbuf_type.h:31
Window::SetFocusedWidget
bool SetFocusedWidget(int widget_index)
Set focus within this window to the given widget.
Definition: window.cpp:495
stdafx.h
GetKeyboardLayout
void GetKeyboardLayout()
Retrieve keyboard layout from language string or (if set) config file.
Definition: osk_gui.cpp:355
Window::InvalidateData
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition: window.cpp:3261
VideoDriver::GetInstance
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
Definition: video_driver.hpp:187
WC_NONE
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:38
WidgetType
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition: widget_type.h:44
DrawCharCentered
void DrawCharCentered(WChar c, int x, int y, TextColour colour)
Draw single character horizontally centered around (x,y)
Definition: gfx.cpp:899
OskWindow::caption
StringID caption
the caption for this window.
Definition: osk_gui.cpp:37
NWidgetContainer::IsEmpty
bool IsEmpty()
Return whether the container is empty.
Definition: widget_type.h:376
OskWindow::SetStringParameters
void SetStringParameters(int widget) const override
Initialize string parameters for a widget.
Definition: osk_gui.cpp:95
string_func.h
StringID
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
WWT_PUSHIMGBTN
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
Definition: widget_type.h:103
Window::OnClick
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Definition: window_gui.h:622
QueryString::cancel_button
int cancel_button
Widget button of parent window to simulate when pressing CANCEL in OSK.
Definition: querystring_gui.h:28
EndContainer
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:998
strings_func.h
DeleteWindowById
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
Definition: window.cpp:1165
MakeTopKeys
static NWidgetBase * MakeTopKeys(int *biggest_index)
Construct the top row keys (cancel, ok, backspace).
Definition: osk_gui.cpp:250
NWidgetHorizontal
Horizontal container.
Definition: widget_type.h:453
FONT_HEIGHT_NORMAL
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
Definition: gfx_func.h:179
OskWindow::text_btn
int text_btn
widget number of parent's text field
Definition: osk_gui.cpp:39
MakeAsdfgKeys
static NWidgetBase * MakeAsdfgKeys(int *biggest_index)
Construct the asdfg row keys.
Definition: osk_gui.cpp:288
video_driver.hpp
NWidget
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1113
SetMinimalSize
static NWidgetPart SetMinimalSize(int16 x, int16 y)
Widget part function for setting the minimal size.
Definition: widget_type.h:946
UpdateOSKOriginalText
void UpdateOSKOriginalText(const Window *parent, int button)
Updates the original text of the OSK so when the 'parent' changes the original and you press on cance...
Definition: osk_gui.cpp:425
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition: widget_type.h:48
WID_OSK_ASDFG_FIRST
@ WID_OSK_ASDFG_FIRST
First widget of the asdfg row.
Definition: osk_widget.h:34
WID_OSK_CANCEL
@ WID_OSK_CANCEL
Cancel key.
Definition: osk_widget.h:17
ShowInfoF
void CDECL ShowInfoF(const char *str,...)
Shows some information on the console/a popup box depending on the OS.
Definition: openttd.cpp:153
WID_OSK_NUMBERS_FIRST
@ WID_OSK_NUMBERS_FIRST
First widget of the numbers row.
Definition: osk_widget.h:28
NWID_SPACER
@ NWID_SPACER
Invisible widget that takes some space.
Definition: widget_type.h:77
WID_OSK_TEXT
@ WID_OSK_TEXT
Edit box.
Definition: osk_widget.h:16
stredup
char * stredup(const char *s, const char *last)
Create a duplicate of the given string.
Definition: string.cpp:137
SmallMap::Find
std::vector< Pair >::const_iterator Find(const T &key) const
Finds given key in this map.
Definition: smallmap_type.hpp:41
OskWindow::UpdateOskState
void UpdateOskState()
Only show valid characters; do not show characters that would only insert a space when we have a spac...
Definition: osk_gui.cpp:81
window_func.h
ToggleBit
static T ToggleBit(T &x, const uint8 y)
Toggles a bit in a variable.
Definition: bitmath_func.hpp:181
lengthof
#define lengthof(x)
Return the length of an fixed size array.
Definition: stdafx.h:367
SetPIP
static NWidgetPart SetPIP(uint8 pre, uint8 inter, uint8 post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1075
NWidgetHorizontalLTR
Horizontal container that doesn't change the direction of the widgets for RTL languages.
Definition: widget_type.h:465
ShowOnScreenKeyboard
void ShowOnScreenKeyboard(Window *parent, int button)
Show the on-screen keyboard (osk) associated with a given textbox.
Definition: osk_gui.cpp:410
VideoDriver::EditBoxLostFocus
virtual void EditBoxLostFocus()
An edit box lost the input focus.
Definition: video_driver.hpp:145
OskWindow::shift
bool shift
Is the shift effectively pressed?
Definition: osk_gui.cpp:42
Window
Data structure for an opened window.
Definition: window_gui.h:276
OskWindow::OnClick
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: osk_gui.cpp:111
OskWindow::text
Textbuf * text
pointer to parent's textbuffer (to update caret position)
Definition: osk_gui.cpp:40
strecpy
char * strecpy(char *dst, const char *src, const char *last)
Copies characters from one buffer to another.
Definition: string.cpp:112
free
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
Definition: stdafx.h:454
WID_OSK_CAPS
@ WID_OSK_CAPS
Capslock key.
Definition: osk_widget.h:21
NWidgetCore
Base class for a 'real' widget.
Definition: widget_type.h:282
Window::SetWidgetDirty
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:597
Textbuf::InsertChar
bool InsertChar(WChar key)
Insert a character to a textbuffer.
Definition: textbuf.cpp:132
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition: geometry_type.hpp:47
OskWindow::qs
QueryString * qs
text-input
Definition: osk_gui.cpp:38
Window::DisableWidget
void DisableWidget(byte widget_index)
Sets a widget to disabled.
Definition: window_gui.h:402
lastof
#define lastof(x)
Get the last element of an fixed size array.
Definition: stdafx.h:383
NWidgetResizeBase::SetMinimalSize
void SetMinimalSize(uint min_x, uint min_y)
Set minimal size of the widget.
Definition: widget.cpp:815
WDP_CENTER
@ WDP_CENTER
Center the window.
Definition: window_gui.h:155
Window::SetWidgetLoweredState
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:453
OskWindow::OnInvalidateData
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition: osk_gui.cpp:200
OskWindow::orig_str_buf
char * orig_str_buf
Original string.
Definition: osk_gui.cpp:41
WID_OSK_QWERTY_FIRST
@ WID_OSK_QWERTY_FIRST
First widget of the qwerty row.
Definition: osk_widget.h:31
WWT_TEXTBTN
@ WWT_TEXTBTN
(Toggle) Button with text
Definition: widget_type.h:53
WID_OSK_SPACE
@ WID_OSK_SPACE
Space bar.
Definition: osk_widget.h:23
WID_OSK_NUMBERS_LAST
@ WID_OSK_NUMBERS_LAST
Last widget of the numbers row.
Definition: osk_widget.h:29
debug.h
Textbuf
Helper/buffer for input fields.
Definition: textbuf_type.h:30
SmallMap::Contains
bool Contains(const T &key) const
Tests whether a key is assigned in this map.
Definition: smallmap_type.hpp:79