From 363223352ee9c4c7c1d65e49cf48b38b538abaf2 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 9 Nov 2012 01:53:40 +0300 Subject: Moving Android on screen keyboard button from SDL to ManaPlus. Also add basic functions for handling other on screen buttons. --- src/CMakeLists.txt | 4 ++ src/Makefile.am | 4 ++ src/client.cpp | 3 ++ src/gui/gui.cpp | 42 ++++++++++++++++ src/gui/gui.h | 3 ++ src/gui/theme.cpp | 6 +++ src/gui/theme.h | 9 ++++ src/guichan/gui.cpp | 33 ------------- src/mobileopenglgraphics.cpp | 2 + src/touchactions.cpp | 36 ++++++++++++++ src/touchactions.h | 30 ++++++++++++ src/touchmanager.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++ src/touchmanager.h | 90 ++++++++++++++++++++++++++++++++++ 13 files changed, 343 insertions(+), 33 deletions(-) create mode 100644 src/touchactions.cpp create mode 100644 src/touchactions.h create mode 100644 src/touchmanager.cpp create mode 100644 src/touchmanager.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f25ae995d..0610d23b3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -644,6 +644,10 @@ SET(SRCS textparticle.h textrenderer.h tileset.h + touchactions.cpp + touchactions.h + touchmanager.cpp + touchmanager.h units.cpp units.h variabledata.h diff --git a/src/Makefile.am b/src/Makefile.am index 2140f85cc..124fb4c86 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -648,6 +648,10 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ textparticle.h \ textrenderer.h \ tileset.h \ + touchactions.cpp \ + touchactions.h \ + touchmanager.cpp \ + touchmanager.h \ units.cpp \ units.h \ variabledata.h \ diff --git a/src/client.cpp b/src/client.cpp index e71ae370b..338a474c1 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -44,6 +44,7 @@ #include "sound.h" #include "statuseffect.h" #include "units.h" +#include "touchmanager.h" #include "gui/buydialog.h" #include "gui/buyselldialog.h" @@ -557,6 +558,7 @@ void Client::gameInit() mainGraphics->_beginDraw(); Theme::selectSkin(); + touchManager.init(); // Theme::prepareThemePath(); // Initialize the item and emote shortcuts. @@ -775,6 +777,7 @@ void Client::gameClear() ActorSprite::unload(); + touchManager.clear(); ResourceManager::deleteInstance(); if (logger) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 956b9e8b3..f0171ede4 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -36,6 +36,7 @@ #include "keydata.h" #include "keyevent.h" #include "keyinput.h" +#include "touchmanager.h" #include "resources/image.h" #include "resources/imageset.h" @@ -395,6 +396,7 @@ void Gui::draw() BLOCK_START("Gui::draw 1") mGraphics->pushClipArea(getTop()->getDimension()); getTop()->draw(mGraphics); + touchManager.draw(); int mouseX, mouseY; const uint8_t button = SDL_GetMouseState(&mouseX, &mouseY); @@ -650,3 +652,43 @@ void Gui::getAbsolutePosition(gcn::Widget *widget, int &x, int &y) widget = widget->getParent(); } } + +void Gui::handleMouseInput() +{ + BLOCK_START("Gui::handleMouseInput") + while (!mInput->isMouseQueueEmpty()) + { + const gcn::MouseInput mouseInput = mInput->dequeueMouseInput(); + + if (touchManager.processEvent(mouseInput)) + continue; + + // Save the current mouse state. It will be needed if modal focus + // changes or modal mouse input focus changes. + mLastMouseX = mouseInput.getX(); + mLastMouseY = mouseInput.getY(); + + switch (mouseInput.getType()) + { + case gcn::MouseInput::PRESSED: + handleMousePressed(mouseInput); + break; + case gcn::MouseInput::RELEASED: + handleMouseReleased(mouseInput); + break; + case gcn::MouseInput::MOVED: + handleMouseMoved(mouseInput); + break; + case gcn::MouseInput::WHEEL_MOVED_DOWN: + handleMouseWheelMovedDown(mouseInput); + break; + case gcn::MouseInput::WHEEL_MOVED_UP: + handleMouseWheelMovedUp(mouseInput); + break; + default: + throw GCN_EXCEPTION("Unknown mouse input type."); + break; + } + } + BLOCK_END("Gui::handleMouseInput") +} diff --git a/src/gui/gui.h b/src/gui/gui.h index 74c5404aa..db373193a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -24,6 +24,7 @@ #define GUI_H #include "resources/cursor.h" +#include "resources/image.h" #include @@ -144,6 +145,8 @@ class Gui final : public gcn::Gui protected: void handleMouseMoved(const gcn::MouseInput &mouseInput); + void handleMouseInput(); + void distributeMouseEvent(gcn::Widget* source, int type, int button, int x, int y, bool force = false, bool toSourceOnly = false); diff --git a/src/gui/theme.cpp b/src/gui/theme.cpp index 7331724d1..46506ecb4 100644 --- a/src/gui/theme.cpp +++ b/src/gui/theme.cpp @@ -46,6 +46,9 @@ static std::string defaultThemePath; std::string Theme::mThemePath; std::string Theme::mThemeName; Theme *Theme::mInstance = nullptr; +#ifdef ANDROID +SDL_Rect *Theme::mKeybRect = nullptr; +#endif // Set the theme path... static void initDefaultThemePath() @@ -634,6 +637,9 @@ void Theme::fillSoundsList(StringVect &list) void Theme::selectSkin() { prepareThemePath(); +#ifdef ANDROID + mKeybRect = SDL_GetScreenKeyboardBlock(); +#endif } void Theme::prepareThemePath() diff --git a/src/gui/theme.h b/src/gui/theme.h index a19e93812..bd5e27708 100644 --- a/src/gui/theme.h +++ b/src/gui/theme.h @@ -361,6 +361,12 @@ class Theme final : public Palette, public ConfigListener static ThemeInfo *loadInfo(const std::string &themeName) A_WARN_UNUSED; + static SDL_Rect *getKeybRect() +#ifdef ANDROID + { return mKeybRect; } +#else + { return nullptr; } +#endif private: Theme(); @@ -391,6 +397,9 @@ class Theme final : public Palette, public ConfigListener typedef std::vector ProgressColors; ProgressColors mProgressColors; +#ifdef ANDROID + static SDL_Rect *mKeybRect; +#endif }; #endif diff --git a/src/guichan/gui.cpp b/src/guichan/gui.cpp index ed4417650..f77a121d3 100644 --- a/src/guichan/gui.cpp +++ b/src/guichan/gui.cpp @@ -161,39 +161,6 @@ namespace gcn void Gui::handleMouseInput() { - BLOCK_START("Gui::handleMouseInput") - while (!mInput->isMouseQueueEmpty()) - { - const MouseInput mouseInput = mInput->dequeueMouseInput(); - - // Save the current mouse state. It will be needed if modal focus - // changes or modal mouse input focus changes. - mLastMouseX = mouseInput.getX(); - mLastMouseY = mouseInput.getY(); - - switch (mouseInput.getType()) - { - case MouseInput::PRESSED: - handleMousePressed(mouseInput); - break; - case MouseInput::RELEASED: - handleMouseReleased(mouseInput); - break; - case MouseInput::MOVED: - handleMouseMoved(mouseInput); - break; - case MouseInput::WHEEL_MOVED_DOWN: - handleMouseWheelMovedDown(mouseInput); - break; - case MouseInput::WHEEL_MOVED_UP: - handleMouseWheelMovedUp(mouseInput); - break; - default: - throw GCN_EXCEPTION("Unknown mouse input type."); - break; - } - } - BLOCK_END("Gui::handleMouseInput") } void Gui::handleKeyInput() diff --git a/src/mobileopenglgraphics.cpp b/src/mobileopenglgraphics.cpp index 7cb445342..504df6897 100644 --- a/src/mobileopenglgraphics.cpp +++ b/src/mobileopenglgraphics.cpp @@ -745,7 +745,9 @@ void MobileOpenGLGraphics::updateScreen() BLOCK_START("Graphics::updateScreen") // glFlush(); // glFinish(); +// setTexturingAndBlending(true); SDL_GL_SwapBuffers(); +// mLastImage = 0; // may be need clear? // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); BLOCK_END("Graphics::updateScreen") diff --git a/src/touchactions.cpp b/src/touchactions.cpp new file mode 100644 index 000000000..5fcaa1802 --- /dev/null +++ b/src/touchactions.cpp @@ -0,0 +1,36 @@ +/* + * The ManaPlus Client + * Copyright (C) 2012 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#include "touchactions.h" + +#include "logger.h" + +#ifdef ANDROID +#include +#endif + +#include "debug.h" + +void showKeyboard(const gcn::MouseInput &mouseInput) +{ +#ifdef ANDROID + SDL_ANDROID_ToggleScreenKeyboardTextInput(nullptr); +#endif +} diff --git a/src/touchactions.h b/src/touchactions.h new file mode 100644 index 000000000..0c9cdd23a --- /dev/null +++ b/src/touchactions.h @@ -0,0 +1,30 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2012 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#ifndef TOUCHACTIONS_H +#define TOUCHACTIONS_H + +#include + +#include "localconsts.h" + +void showKeyboard(const gcn::MouseInput &mouseInput); + +#endif diff --git a/src/touchmanager.cpp b/src/touchmanager.cpp new file mode 100644 index 000000000..0278b9ddb --- /dev/null +++ b/src/touchmanager.cpp @@ -0,0 +1,114 @@ +/* + * The ManaPlus Client + * Copyright (C) 2012 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#include "touchmanager.h" + +#include "graphics.h" +#include "touchactions.h" + +#include "gui/theme.h" + +#include "debug.h" + +TouchManager touchManager; + +TouchManager::TouchManager() +{ +} + +TouchManager::~TouchManager() +{ + clear(); +} + +void TouchManager::init() +{ +#ifdef ANDROID + Image *image = Theme::getImageFromThemeXml("keyboard_icon.xml", ""); + TouchItem *keyboard = new TouchItem(gcn::Rectangle(10, 10, + image->getWidth(), image->getHeight()), image, 10, 10, + nullptr, nullptr, &showKeyboard); + mObjects.push_back(keyboard); +#endif +} + +void TouchManager::clear() +{ + for (TouchItemVectorCIter it = mObjects.begin(), it_end = mObjects.end(); + it != it_end; ++ it) + { + const TouchItem *const item = *it; + if (item) + { + if (item->image) + item->image->decRef(); + delete *it; + } + } + mObjects.clear(); +} + +void TouchManager::draw() +{ + for (TouchItemVectorCIter it = mObjects.begin(), it_end = mObjects.end(); + it != it_end; ++ it) + { + const TouchItem *const item = *it; + if (item && item->image) + mainGraphics->drawImage(item->image, item->x, item->y); + } +} + +bool TouchManager::processEvent(const gcn::MouseInput &mouseInput) +{ + const int x = mouseInput.getX(); + const int y = mouseInput.getY(); + + for (TouchItemVectorCIter it = mObjects.begin(), it_end = mObjects.end(); + it != it_end; ++ it) + { + const TouchItem *const item = *it; + if (item && item->rect.isPointInRect(x, y)) + { + if (item->funcAll) + { + item->funcAll(mouseInput); + } + else + { + switch (mouseInput.getType()) + { + case gcn::MouseInput::PRESSED: + if (item->funcPressed) + item->funcPressed(mouseInput); + break; + case gcn::MouseInput::RELEASED: + if (item->funcReleased) + item->funcReleased(mouseInput); + break; + default: + break; + } + } + return true; + } + } + return false; +} diff --git a/src/touchmanager.h b/src/touchmanager.h new file mode 100644 index 000000000..c37a1aeae --- /dev/null +++ b/src/touchmanager.h @@ -0,0 +1,90 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2012 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#ifndef TOUCHMANAGER_H +#define TOUCHMANAGER_H + +#include "resources/image.h" + +#include +#include + +#include +#include +#include + +#include "localconsts.h" + +typedef void (*TouchFuncPtr) (const gcn::MouseInput &mouseInput); + +struct TouchItem final +{ + TouchItem(const gcn::Rectangle rect0, Image *const img, int x0, int y0, + TouchFuncPtr ptrAll, TouchFuncPtr ptrPressed, + TouchFuncPtr ptrReleased) : + rect(rect0), + image(img), + x(x0), + y(y0), + funcAll(ptrAll), + funcPressed(ptrPressed), + funcReleased(ptrReleased) + { + } + + A_DELETE_COPY(TouchItem) + + gcn::Rectangle rect; + Image *image; + int x; + int y; + TouchFuncPtr funcAll; + TouchFuncPtr funcPressed; + TouchFuncPtr funcReleased; +}; + +typedef std::vector TouchItemVector; +typedef TouchItemVector::const_iterator TouchItemVectorCIter; + +class TouchManager final +{ + public: + TouchManager(); + + ~TouchManager(); + + A_DELETE_COPY(TouchManager) + + void init(); + + void clear(); + + void draw(); + + bool processEvent(const gcn::MouseInput &mouseInput); + + private: + TouchItemVector mObjects; + +// std::map mNameToRect; +}; + +extern TouchManager touchManager; +#endif -- cgit v1.2.3-60-g2f50