aboutsummaryrefslogtreecommitdiff
path: root/backends/common/virtual-keyboard.cpp
diff options
context:
space:
mode:
authorStephen Kennedy2008-07-30 13:47:54 +0000
committerStephen Kennedy2008-07-30 13:47:54 +0000
commite2a2a672f591f36fb596bb6cb849978c70611c3e (patch)
tree73cc81ea173bdb4a35cfe437bb115e38f405f1d7 /backends/common/virtual-keyboard.cpp
parenta051061e38bfcbd7cfac81deb3acf69f154dc681 (diff)
downloadscummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.tar.gz
scummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.tar.bz2
scummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.zip
- major re-factoring of VK - all GUI-related code has been abstracted to VirtualKeyboardGUI class
- fixed bug with parsing modifiers in VirtualKeyboardParser - fixed numerous GCC warnings svn-id: r33448
Diffstat (limited to 'backends/common/virtual-keyboard.cpp')
-rw-r--r--backends/common/virtual-keyboard.cpp314
1 files changed, 76 insertions, 238 deletions
diff --git a/backends/common/virtual-keyboard.cpp b/backends/common/virtual-keyboard.cpp
index e6ef87b946..45a0a47568 100644
--- a/backends/common/virtual-keyboard.cpp
+++ b/backends/common/virtual-keyboard.cpp
@@ -24,14 +24,9 @@
*/
#include "backends/common/virtual-keyboard.h"
+#include "backends/common/virtual-keyboard-gui.h"
#include "backends/common/virtual-keyboard-parser.h"
-#include "common/config-manager.h"
-#include "common/events.h"
-#include "common/unzip.h"
-#include "graphics/cursorman.h"
#include "graphics/imageman.h"
-#include "graphics/surface-keycolored.h"
-#include "gui/newgui.h"
namespace Common {
@@ -40,43 +35,37 @@ VirtualKeyboard::VirtualKeyboard() : _currentMode(0), _keyDown(0) {
_system = g_system;
_parser = new VirtualKeyboardParser(this);
- _loaded = _displaying = _drag = false;
- _lastScreenChanged = _system->getScreenChangeID();
-
- memset(_cursor, 0xFF, sizeof(_cursor));
+ _kbdGUI = new VirtualKeyboardGUI(this);
+ _loaded = false;
}
VirtualKeyboard::~VirtualKeyboard() {
- // TODO: clean up event data pointers
- deleteEventData();
+ deleteEvents();
+ delete _kbdGUI;
delete _parser;
}
+void VirtualKeyboard::deleteEvents() {
+ ModeMap::iterator it_m;
+ EventMap::iterator it_e;
+ for (it_m = _modes.begin(); it_m != _modes.end(); it_m++) {
+ EventMap *evt = &(it_m->_value.events);
+ for (it_e = evt->begin(); it_e != evt->end(); it_e++)
+ delete it_e->_value;
+ }
+}
+
void VirtualKeyboard::reset() {
- // TODO: clean up event data pointers
- deleteEventData();
+ deleteEvents();
_modes.clear();
_initialMode = _currentMode = 0;
- _kbdBound.left = _kbdBound.top
- = _kbdBound.right = _kbdBound.bottom = 0;
_hAlignment = kAlignCentre;
_vAlignment = kAlignBottom;
_keyQueue.clear();
_keyDown = 0;
_keyFlags = 0;
- _displaying = _drag = false;
- _firstRun = true;
- _lastScreenChanged = _system->getScreenChangeID();
-}
-
-void VirtualKeyboard::deleteEventData() {
- ModeMap::iterator it_m;
- EventMap::iterator it_e;
- for (it_m = _modes.begin(); it_m != _modes.end(); it_m++) {
- EventMap *evt = &(it_m->_value.events);
- for (it_e = evt->begin(); it_e != evt->end(); it_e++)
- delete it_e->_value.data;
- }
+ _loaded = false;
+ _kbdGUI->reset();
}
bool VirtualKeyboard::loadKeyboardPack(Common::String packName) {
@@ -127,79 +116,25 @@ bool VirtualKeyboard::loadKeyboardPack(Common::String packName) {
return _loaded;
}
-void VirtualKeyboard::setDefaultPosition()
-{
- int16 scrW = _system->getOverlayWidth(), scrH = _system->getOverlayHeight();
- int16 kbdW = _kbdBound.width(), kbdH = _kbdBound.height();
- int16 posX = 0, posY = 0;
- if (scrW != kbdW) {
- switch (_hAlignment) {
- case kAlignLeft:
- posX = 0;
- break;
- case kAlignCentre:
- posX = (scrW - kbdW) / 2;
- break;
- case kAlignRight:
- posX = scrW - kbdW;
- break;
- }
- }
- if (scrH != kbdH) {
- switch (_vAlignment) {
- case kAlignTop:
- posY = 0;
- break;
- case kAlignMiddle:
- posY = (scrH - kbdH) / 2;
- break;
- case kAlignBottom:
- posY = scrH - kbdH;
- break;
- }
- }
- _kbdBound.moveTo(posX, posY);
-}
-
bool VirtualKeyboard::checkModeResolutions()
{
_parser->setParseMode(kParseCheckResolutions);
_loaded = _parser->parse();
return _loaded;
}
-
-void VirtualKeyboard::move(int16 x, int16 y) {
- // snap to edge of screen
- if (ABS(x) < SNAP_WIDTH)
- x = 0;
- int16 x2 = _system->getOverlayWidth() - _kbdBound.width();
- if (ABS(x - x2) < SNAP_WIDTH)
- x = x2;
- if (ABS(y) < SNAP_WIDTH)
- y = 0;
- int16 y2 = _system->getOverlayHeight() - _kbdBound.height();
- if (ABS(y - y2) < SNAP_WIDTH)
- y = y2;
-
- _kbdBound.moveTo(x, y);
-}
Common::String VirtualKeyboard::findArea(int16 x, int16 y) {
- x -= _kbdBound.left;
- y -= _kbdBound.top;
- if (x < 0 || x > _kbdBound.width()) return "";
- if (y < 0 || y > _kbdBound.height()) return "";
return _currentMode->imageMap.findMapArea(x, y);
}
-void VirtualKeyboard::processClick(const Common::String& area) {
+void VirtualKeyboard::processAreaClick(const Common::String& area) {
if (!_currentMode->events.contains(area)) return;
- Event evt = _currentMode->events[area];
+ Event *evt = _currentMode->events[area];
- switch (evt.type) {
+ switch (evt->type) {
case kEventKey: {
// add virtual keypress to queue
- Common::KeyState key = *(Common::KeyState*)evt.data;
+ Common::KeyState key = *(Common::KeyState*)evt->data;
key.flags ^= _keyFlags;
if ((key.keycode >= Common::KEYCODE_a) && (key.keycode <= Common::KEYCODE_z))
key.ascii = (key.flags & Common::KBD_SHIFT) ? key.keycode - 32 : key.keycode;
@@ -208,25 +143,23 @@ void VirtualKeyboard::processClick(const Common::String& area) {
break;
}
case kEventModifier:
- _keyFlags ^= *(byte*)(evt.data);
+ _keyFlags ^= *(byte*)(evt->data);
break;
case kEventSwitchMode:
// switch to new mode
- switchMode(*(Common::String *)evt.data);
+ switchMode(*(Common::String *)evt->data);
_keyFlags = 0;
break;
case kEventClose:
// close virtual keyboard
- _displaying = false;
+ _kbdGUI->hide();
break;
}
}
void VirtualKeyboard::switchMode(Mode *newMode) {
- _kbdBound.setWidth(newMode->image->w);
- _kbdBound.setHeight(newMode->image->h);
+ _kbdGUI->setKeyboardSurface(newMode->image, newMode->transparentColor);
_currentMode = newMode;
- _needRedraw = true;
}
void VirtualKeyboard::switchMode(const Common::String& newMode) {
@@ -237,6 +170,20 @@ void VirtualKeyboard::switchMode(const Common::String& newMode) {
switchMode(&_modes[newMode]);
}
+void VirtualKeyboard::handleMouseDown(int16 x, int16 y) {
+ _areaDown = findArea(x, y);
+ if (_areaDown.empty())
+ _kbdGUI->startDrag(x, y);
+}
+
+void VirtualKeyboard::handleMouseUp(int16 x, int16 y) {
+ if (!_areaDown.empty() && _areaDown == findArea(x, y)) {
+ processAreaClick(_areaDown);
+ _areaDown.clear();
+ }
+ _kbdGUI->endDrag();
+}
+
void VirtualKeyboard::show() {
if (!_loaded) {
// if not loaded then load default "vkeybd" pack
@@ -245,90 +192,12 @@ void VirtualKeyboard::show() {
return;
}
}
- if (_lastScreenChanged != _system->getScreenChangeID())
- screenChanged();
switchMode(_initialMode);
- _displaying = true;
- if (_firstRun) {
- _firstRun = false;
- setDefaultPosition();
- }
-
- if (!g_gui.isActive()) {
- _system->showOverlay();
- _system->clearOverlay();
- }
- _overlayBackup.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor));
- _system->grabOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w);
- setupCursor();
-
- runLoop();
-
- removeCursor();
- _system->copyRectToOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w, 0, 0, _overlayBackup.w, _overlayBackup.h);
- if (!g_gui.isActive()) _system->hideOverlay();
- _overlayBackup.free();
-}
-void VirtualKeyboard::hide() {
- _displaying = false;
-}
-
-void VirtualKeyboard::screenChanged() {
- _lastScreenChanged = _system->getScreenChangeID();
- if (!checkModeResolutions())
- _displaying = false;
-}
+ _kbdGUI->run();
-void VirtualKeyboard::runLoop() {
- Common::EventManager *eventMan = _system->getEventManager();
-
- while (_displaying) {
- if (_needRedraw) redraw();
-
- animateCursor();
- _system->updateScreen();
- Common::Event event;
- while (eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_LBUTTONDOWN:
- if (_kbdBound.contains(event.mouse)) {
- _areaDown = findArea(event.mouse.x, event.mouse.y);
- if (_areaDown.empty()) {
- _drag = true;
- _dragPoint.x = event.mouse.x - _kbdBound.left;
- _dragPoint.y = event.mouse.y - _kbdBound.top;
- }
- } else
- _areaDown.clear();
- break;
- case Common::EVENT_LBUTTONUP:
- if (_drag) _drag = false;
- if (!_areaDown.empty() && _areaDown == findArea(event.mouse.x, event.mouse.y)) {
- processClick(_areaDown);
- _areaDown.clear();
- }
- break;
- case Common::EVENT_MOUSEMOVE:
- if (_drag) {
- move(event.mouse.x - _dragPoint.x,
- event.mouse.y - _dragPoint.y);
- _needRedraw = true;
- }
- break;
- case Common::EVENT_SCREEN_CHANGED:
- screenChanged();
- break;
- case Common::EVENT_QUIT:
- _system->quit();
- return;
- default:
- break;
- }
- }
- // Delay for a moment
- _system->delayMillis(10);
- }
+ EventManager *eventMan = _system->getEventManager();
+ assert(eventMan);
// push keydown & keyup events into the event manager
Common::Event evt;
@@ -342,62 +211,20 @@ void VirtualKeyboard::runLoop() {
}
}
-void VirtualKeyboard::redraw() {
- Graphics::SurfaceKeyColored surf;
-
- surf.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor));
-
- memcpy(surf.pixels, _overlayBackup.pixels, surf.w * surf.h * sizeof(OverlayColor));
- surf.blit(_currentMode->image, _kbdBound.left, _kbdBound.top, _currentMode->transparentColor);
-
- _system->copyRectToOverlay((OverlayColor*)surf.pixels, surf.w, 0, 0, surf.w, surf.h);
-
- surf.free();
-
- _needRedraw = false;
-}
-
-void VirtualKeyboard::setupCursor() {
- const byte palette[] = {
- 255, 255, 255, 0,
- 255, 255, 255, 0,
- 171, 171, 171, 0,
- 87, 87, 87, 0
- };
-
- CursorMan.pushCursorPalette(palette, 0, 4);
- CursorMan.pushCursor(NULL, 0, 0, 0, 0);
- CursorMan.showMouse(true);
-}
-
-void VirtualKeyboard::animateCursor() {
- int time = _system->getMillis();
- if (time > _cursorAnimateTimer + kCursorAnimateDelay) {
- for (int i = 0; i < 15; i++) {
- if ((i < 6) || (i > 8)) {
- _cursor[16 * 7 + i] = _cursorAnimateCounter;
- _cursor[16 * i + 7] = _cursorAnimateCounter;
- }
- }
-
- CursorMan.replaceCursor(_cursor, 16, 16, 7, 7);
-
- _cursorAnimateTimer = time;
- _cursorAnimateCounter = (_cursorAnimateCounter + 1) % 4;
- }
+void VirtualKeyboard::hide() {
+ _kbdGUI->hide();
}
-void VirtualKeyboard::removeCursor() {
- CursorMan.popCursor();
- CursorMan.popCursorPalette();
+bool VirtualKeyboard::isDisplaying() {
+ return _kbdGUI->isDisplaying();
}
-VirtualKeyboard::Queue::Queue() {
- _keyPos = _keys.begin();
+VirtualKeyboard::KeyPressQueue::KeyPressQueue() {
+ _keyPos = _keys.end();
_strPos = 0;
}
-void VirtualKeyboard::Queue::insertKey(KeyState key) {
+void VirtualKeyboard::KeyPressQueue::insertKey(KeyState key) {
switch (key.keycode) {
case KEYCODE_LEFT:
moveLeft();
@@ -408,6 +235,8 @@ void VirtualKeyboard::Queue::insertKey(KeyState key) {
case KEYCODE_BACKSPACE:
deleteKey();
return;
+ default:
+ ;
}
String keyStr;
@@ -429,10 +258,11 @@ void VirtualKeyboard::Queue::insertKey(KeyState key) {
kp.key = key;
kp.strLen = keyStr.size();
_keys.insert(_keyPos, kp);
- _keyPos++;
+
+ printf("%s %d\n", _str.c_str(), kp.strLen);
}
-void VirtualKeyboard::Queue::deleteKey() {
+void VirtualKeyboard::KeyPressQueue::deleteKey() {
if (_keyPos == _keys.begin())
return;
List<VirtualKeyPress>::iterator it = _keyPos;
@@ -443,41 +273,49 @@ void VirtualKeyboard::Queue::deleteKey() {
_keys.erase(it);
}
-void VirtualKeyboard::Queue::moveLeft() {
+void VirtualKeyboard::KeyPressQueue::moveLeft() {
if (_keyPos == _keys.begin())
return;
_keyPos--;
_strPos -= _keyPos->strLen;
}
-void VirtualKeyboard::Queue::moveRight() {
- List<VirtualKeyPress>::iterator it = _keyPos;
- it++;
- if (it == _keys.end())
+void VirtualKeyboard::KeyPressQueue::moveRight() {
+ if (_keyPos == _keys.end())
return;
_strPos += _keyPos->strLen;
- _keyPos = it;
+ _keyPos++;
}
-KeyState VirtualKeyboard::Queue::pop() {
- KeyState ret = _keys.begin()->key;
+KeyState VirtualKeyboard::KeyPressQueue::pop() {
+ bool front = (_keyPos == _keys.begin());
+ VirtualKeyPress kp = *(_keys.begin());
_keys.pop_front();
- return ret;
+
+ if (front)
+ _keyPos = _keys.begin();
+ else
+ _strPos -= kp.strLen;
+
+ while (kp.strLen-- > 0)
+ _str.deleteChar(0);
+
+ return kp.key;
}
-void VirtualKeyboard::Queue::clear() {
+void VirtualKeyboard::KeyPressQueue::clear() {
_keys.clear();
- _keyPos = _keys.begin();
+ _keyPos = _keys.end();
_str.clear();
_strPos = 0;
}
-bool VirtualKeyboard::Queue::empty()
+bool VirtualKeyboard::KeyPressQueue::empty()
{
return _keys.empty();
}
-String VirtualKeyboard::Queue::getString()
+const String& VirtualKeyboard::KeyPressQueue::getString()
{
return _str;
}