aboutsummaryrefslogtreecommitdiff
path: root/backends/vkeybd/virtual-keyboard-gui.h
blob: a2000adea02c0edd33f258c504e054a76ac2f7bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program 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; either version 2
* of the License, or (at your option) any later version.
*
* This program 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.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/

#ifndef COMMON_VIRTUAL_KEYBOARD_GUI_H
#define COMMON_VIRTUAL_KEYBOARD_GUI_H

#include "common/scummsys.h"

#ifdef ENABLE_VKEYBD

#include "backends/vkeybd/virtual-keyboard.h"
#include "common/rect.h"
#include "common/system.h"
#include "graphics/font.h"
#include "graphics/surface.h"

namespace Common {

/**
 * Class to handle the drawing of the virtual keyboard to the overlay, and the
 * execution of the keyboard's main loop.
 * This includes the blitting of the appropriate bitmap in the correct location,
 * as well as the drawing of the virtual keyboard display.
 */
class VirtualKeyboardGUI {

public:

	VirtualKeyboardGUI(VirtualKeyboard *kbd);
	~VirtualKeyboardGUI();

	/**
	 * Updates the GUI when the Mode of the keyboard is changes
	 */
	void initMode(VirtualKeyboard::Mode *mode);

	/**
	 * Starts the drawing of the keyboard, and runs the main event loop.
	 */
	void run();

	/**
	 * Interrupts the event loop and resets the overlay to its initial state.
	 */
	void close();

	bool isDisplaying() { return _displaying; }

	/**
	 * Reset the class to an initial state
	 */
	void reset();

	/**
	 * Activates drag mode. Takes the keyboard-relative coordinates of the
	 * cursor as an argument.
	 */
	void startDrag(int16 x, int16 y);

	/**
	 * Deactivates drag mode
	 * */
	void endDrag();

	/**
	 * Checks for a screen change in the backend and re-inits the virtual
	 * keyboard if it has.
	 */
	void checkScreenChanged();

	/**
	 * Sets the GUI's internal screen size variables
	 */
	void initSize(int16 w, int16 h);

private:

	OSystem *_system;

	VirtualKeyboard *_kbd;
	Rect _kbdBound;
	Graphics::Surface *_kbdSurface;
	uint32 _kbdTransparentColor;

	Point _dragPoint;
	bool _drag;
	static const int SNAP_WIDTH = 10;

	Graphics::Surface _overlayBackup;
	Rect _dirtyRect;

	bool _displayEnabled;
	Graphics::Surface _dispSurface;
	const Graphics::Font *_dispFont;
	int16 _dispX, _dispY;
	uint _dispI;
	uint32 _dispForeColor, _dispBackColor;

	int _lastScreenChanged;
	int16 _screenW, _screenH;

	bool _displaying;
	bool _firstRun;

	void setupDisplayArea(Rect &r, uint32 forecolor);
	void move(int16 x, int16 y);
	void moveToDefaultPosition();
	void screenChanged();
	void mainLoop();
	void extendDirtyRect(const Rect &r);
	void resetDirtyRect();
	void redraw();
	void forceRedraw();
	void updateDisplay();
	bool fontIsSuitable(const Graphics::Font *font, const Rect &rect);
	uint calculateEndIndex(const String &str, uint startIndex);

	bool _drawCaret;
	int16 _caretX;
	static const int kCaretBlinkTime = 500;
	void animateCaret();

	static const int kCursorAnimateDelay = 250;
	int _cursorAnimateCounter;
	int _cursorAnimateTimer;
	byte _cursor[2048];
	void setupCursor();
	void removeCursor();
	void animateCursor();

};

} // End of namespace Common

#endif // #ifdef ENABLE_VKEYBD

#endif // #ifndef COMMON_VIRTUAL_KEYBOARD_GUI_H