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 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
|
/* 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_H
#define COMMON_VIRTUAL_KEYBOARD_H
#include "common/scummsys.h"
#ifdef ENABLE_VKEYBD
class OSystem;
#include "common/events.h"
#include "common/hashmap.h"
#include "common/hash-str.h"
#include "common/keyboard.h"
#include "common/list.h"
#include "common/str.h"
#include "common/fs.h"
#include "backends/vkeybd/image-map.h"
#include "graphics/surface.h"
namespace Common {
class Archive;
class VirtualKeyboardGUI;
class VirtualKeyboardParser;
/**
* Class that handles the functionality of the virtual keyboard.
* This includes storage of the virtual key press events when the user clicks
* a key and delivery of them when the keyboard is closed, as well as managing
* the internal state of the keyboard, such as its active mode.
*/
class VirtualKeyboard {
protected:
/**
* Enum to describe the different types of events that can be associated
* with an area of the virtual keyboard bitmap.
*/
enum VKEventType {
/** Standard key press event */
kVKEventKey,
/** Modifier key press event */
kVKEventModifier,
/** Switch the mode of the keyboard */
kVKEventSwitchMode,
/** Close the keyboard, submitting all keypresses */
kVKEventSubmit,
/** Close the keyboard, without submitting keypresses */
kVKEventCancel,
/** Clear the virtual keypress queue */
kVKEventClear,
/** Move the keypress queue insert position backwards */
kVKEventMoveLeft,
/** Move the keypress queue insert position forwards */
kVKEventMoveRight,
/** Delete keypress from queue at the current insert position */
kVKEventDelete
};
/** VKEvent struct encapsulates data on a virtual keyboard event */
struct VKEvent {
String name;
VKEventType type;
/**
* Void pointer that will point to different types of data depending
* on the type of the event, these are:
* - KeyState struct for kVKEventKey events
* - a flags byte for kVKEventModifier events
* - c-string stating the name of the new mode for kSwitchMode events
*/
void *data;
VKEvent() : data(0) {}
~VKEvent() {
if (data)
free(data);
}
};
typedef HashMap<String, VKEvent *> VKEventMap;
/**
* Mode struct encapsulates all the data for each mode of the keyboard
*/
struct Mode {
String name;
String resolution;
String bitmapName;
Graphics::Surface *image;
uint32 transparentColor;
ImageMap imageMap;
VKEventMap events;
Rect displayArea;
uint32 displayFontColor;
Mode() : image(0) {}
~Mode() {
if (image) {
image->free();
delete image;
image = 0;
}
}
};
typedef HashMap<String, Mode, IgnoreCase_Hash, IgnoreCase_EqualTo> ModeMap;
enum HorizontalAlignment {
kAlignLeft,
kAlignCenter,
kAlignRight
};
enum VerticalAlignment {
kAlignTop,
kAlignMiddle,
kAlignBottom
};
struct VirtualKeyPress {
KeyState key;
/** length of the key presses description string */
uint strLen;
};
/**
* Class that stores the queue of virtual key presses, as well as
* maintaining a string that represents a preview of the queue
*/
class KeyPressQueue {
public:
KeyPressQueue();
void toggleFlags(byte fl);
void clearFlags();
void insertKey(KeyState key);
void deleteKey();
void moveLeft();
void moveRight();
KeyState pop();
void clear();
bool empty();
String getString();
uint getInsertIndex();
bool hasStringChanged();
private:
byte _flags;
String _flagsStr;
typedef List<VirtualKeyPress> KeyPressList;
KeyPressList _keys;
String _keysStr;
bool _strChanged;
KeyPressList::iterator _keyPos;
uint _strPos;
};
public:
VirtualKeyboard();
virtual ~VirtualKeyboard();
/**
* Loads the keyboard pack with the given name.
* The system first looks for an uncompressed keyboard pack by searching
* for packName.xml in the filesystem, if this does not exist then it
* searches for a compressed keyboard pack by looking for packName.zip.
* @param packName name of the keyboard pack
*/
bool loadKeyboardPack(const String &packName);
/**
* Shows the keyboard, starting an event loop that will intercept all
* user input (like a modal GUI dialog).
* It is assumed that the game has been paused, before this is called
*/
void show();
/**
* Hides the keyboard, ending the event loop.
* @param submit if true all accumulated key presses are submitted to
* the event manager
*/
void close(bool submit);
/**
* Returns true if the keyboard is currently being shown
*/
bool isDisplaying();
/**
* Returns true if the keyboard is loaded and ready to be shown
*/
bool isLoaded() {
return _loaded;
}
protected:
OSystem *_system;
Archive *_fileArchive;
friend class VirtualKeyboardGUI;
VirtualKeyboardGUI *_kbdGUI;
KeyPressQueue _keyQueue;
friend class VirtualKeyboardParser;
VirtualKeyboardParser *_parser;
void reset();
bool openPack(const String &packName, const FSNode &node);
void deleteEvents();
bool checkModeResolutions();
void switchMode(Mode *newMode);
void switchMode(const String &newMode);
void handleMouseDown(int16 x, int16 y);
void handleMouseUp(int16 x, int16 y);
String findArea(int16 x, int16 y);
void processAreaClick(const String &area);
bool _loaded;
ModeMap _modes;
Mode *_initialMode;
Mode *_currentMode;
HorizontalAlignment _hAlignment;
VerticalAlignment _vAlignment;
String _areaDown;
bool _submitKeys;
};
} // End of namespace Common
#endif // #ifdef ENABLE_VKEYBD
#endif // #ifndef COMMON_VIRTUAL_KEYBOARD_H
|