From 38e782f30d15a0fceabf863e40ffe66124cef8a8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 29 Dec 2015 00:59:00 +0300 Subject: Move touchmanager into touch directory. --- src/CMakeLists.txt | 4 +- src/Makefile.am | 4 +- src/client.cpp | 3 +- src/dyetool/client.cpp | 3 +- src/game.cpp | 3 +- src/gui/gui.cpp | 3 +- src/gui/windowmanager.cpp | 3 +- src/gui/windows/setupwindow.cpp | 3 +- src/input/inputmanager.cpp | 3 +- src/input/touch/touchmanager.cpp | 675 +++++++++++++++++++++++++++++++++++++++ src/input/touch/touchmanager.h | 203 ++++++++++++ src/touchactions.cpp | 4 +- src/touchmanager.cpp | 675 --------------------------------------- src/touchmanager.h | 203 ------------ 14 files changed, 898 insertions(+), 891 deletions(-) create mode 100644 src/input/touch/touchmanager.cpp create mode 100644 src/input/touch/touchmanager.h delete mode 100644 src/touchmanager.cpp delete mode 100644 src/touchmanager.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c07b1d2c3..4ea2407af 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1195,8 +1195,8 @@ SET(SRCS resources/map/tileset.h touchactions.cpp touchactions.h - touchmanager.cpp - touchmanager.h + input/touch/touchmanager.cpp + input/touch/touchmanager.h units.cpp units.h variabledata.h diff --git a/src/Makefile.am b/src/Makefile.am index 10f5afb7a..51322dbf2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -654,8 +654,8 @@ SRC += events/actionevent.h \ textmanager.h \ touchactions.cpp \ touchactions.h \ - touchmanager.cpp \ - touchmanager.h \ + input/touch/touchmanager.cpp \ + input/touch/touchmanager.h \ variabledata.h \ vector.cpp \ vector.h \ diff --git a/src/client.cpp b/src/client.cpp index ec5adcfd1..622aaef3d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -34,7 +34,6 @@ #include "spellmanager.h" #include "statuseffect.h" #include "units.h" -#include "touchmanager.h" #include "being/playerinfo.h" #include "being/playerrelations.h" @@ -45,6 +44,8 @@ #include "input/joystick.h" #include "input/keyboardconfig.h" +#include "input/touch/touchmanager.h" + #include "gui/dialogsmanager.h" #include "gui/gui.h" #include "gui/skin.h" diff --git a/src/dyetool/client.cpp b/src/dyetool/client.cpp index 3055cc80b..400c402aa 100644 --- a/src/dyetool/client.cpp +++ b/src/dyetool/client.cpp @@ -28,12 +28,13 @@ #include "graphicsmanager.h" #include "settings.h" #include "soundmanager.h" -#include "touchmanager.h" #include "input/inputmanager.h" #include "input/joystick.h" #include "input/keyboardconfig.h" +#include "input/touch/touchmanager.h" + #include "gui/dialogsmanager.h" #include "gui/gui.h" #include "gui/skin.h" diff --git a/src/game.cpp b/src/game.cpp index 1cec9efbd..b5be417b4 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -30,7 +30,6 @@ #include "gamemodifiers.h" #include "soundmanager.h" #include "settings.h" -#include "touchmanager.h" #include "being/crazymoves.h" #include "being/localplayer.h" @@ -48,6 +47,8 @@ #include "input/joystick.h" #include "input/keyboardconfig.h" +#include "input/touch/touchmanager.h" + #include "gui/dialogsmanager.h" #include "gui/gui.h" #include "gui/popupmanager.h" diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 146558032..02b0d3f08 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -79,7 +79,6 @@ #include "resources/image.h" #endif #include "settings.h" -#include "touchmanager.h" #include "listeners/focuslistener.h" #include "listeners/guiconfiglistener.h" @@ -87,6 +86,8 @@ #include "input/inputmanager.h" +#include "input/touch/touchmanager.h" + #include "render/renderers.h" #include "resources/imageset.h" diff --git a/src/gui/windowmanager.cpp b/src/gui/windowmanager.cpp index 49c0b859e..1793bcbea 100644 --- a/src/gui/windowmanager.cpp +++ b/src/gui/windowmanager.cpp @@ -27,7 +27,6 @@ #include "game.h" #include "settings.h" #include "spellmanager.h" -#include "touchmanager.h" #include "gui/gui.h" #include "gui/userpalette.h" @@ -52,6 +51,8 @@ #include "gui/widgets/createwidget.h" #include "gui/widgets/desktop.h" +#include "input/touch/touchmanager.h" + #include "utils/delete2.h" #include "utils/files.h" #include "utils/sdlcheckutils.h" diff --git a/src/gui/windows/setupwindow.cpp b/src/gui/windows/setupwindow.cpp index 674668cf7..85a999e46 100644 --- a/src/gui/windows/setupwindow.cpp +++ b/src/gui/windows/setupwindow.cpp @@ -24,7 +24,6 @@ #include "configuration.h" #include "game.h" -#include "touchmanager.h" #include "gui/windows/chatwindow.h" @@ -50,6 +49,8 @@ #include "gui/widgets/label.h" #include "gui/widgets/tabbedarea.h" +#include "input/touch/touchmanager.h" + #include "utils/delete2.h" #include "utils/dtor.h" #include "utils/gettext.h" diff --git a/src/input/inputmanager.cpp b/src/input/inputmanager.cpp index fcee4066c..f06fa1a5b 100644 --- a/src/input/inputmanager.cpp +++ b/src/input/inputmanager.cpp @@ -23,7 +23,6 @@ #include "configuration.h" #include "game.h" #include "settings.h" -#include "touchmanager.h" #include "being/localplayer.h" #include "being/playerinfo.h" @@ -36,6 +35,8 @@ #include "input/multitouchmanager.h" #endif +#include "input/touch/touchmanager.h" + #include "gui/gui.h" #include "gui/sdlinput.h" diff --git a/src/input/touch/touchmanager.cpp b/src/input/touch/touchmanager.cpp new file mode 100644 index 000000000..3107b62c8 --- /dev/null +++ b/src/input/touch/touchmanager.cpp @@ -0,0 +1,675 @@ +/* + * The ManaPlus Client + * Copyright (C) 2012-2015 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 "input/touch/touchmanager.h" + +#include "configuration.h" +#include "graphicsvertexes.h" +#include "touchactions.h" + +#include "input/mouseinput.h" + +#include "gui/gui.h" +#include "gui/skin.h" + +#include "gui/fonts/font.h" + +#include "input/inputmanager.h" + +#include "gui/theme.h" + +#include "resources/image.h" +#include "resources/imagerect.h" + +#include "utils/delete2.h" + +#include "debug.h" + +TouchManager touchManager; + +extern RenderType openGLMode; + +TouchManager::TouchManager() : + mKeyboard(nullptr), + mPad(nullptr), + mObjects(), + mVertexes(new ImageCollection), + mRedraw(true), + mShowJoystick(false), + mShowButtons(false), + mShowKeyboard(false), + mButtonsSize(1), + mJoystickSize(1), + mButtonsFormat(0), + mWidth(0), + mHeight(0), + mShow(false), + mInGame(false), + mTempHideButtons(false) +{ + for (int f = 0; f < actionsSize; f ++) + mActions[f] = false; + for (int f = 0; f < buttonsCount; f ++) + mButtons[f] = nullptr; +} + +TouchManager::~TouchManager() +{ + clear(); + delete2(mVertexes); + CHECKLISTENERS +} + +void TouchManager::shutdown() restrict2 +{ + config.removeListeners(this); +} + +void TouchManager::init() restrict2 +{ + config.addListener("showScreenJoystick", this); + config.addListener("showScreenButtons", this); + config.addListener("showScreenKeyboard", this); + config.addListener("screenButtonsSize", this); + config.addListener("screenJoystickSize", this); + config.addListener("screenButtonsFormat", this); + + mShowJoystick = config.getBoolValue("showScreenJoystick"); + mShowButtons = config.getBoolValue("showScreenButtons"); + mShowKeyboard = config.getBoolValue("showScreenKeyboard"); + mButtonsSize = config.getIntValue("screenButtonsSize"); + mJoystickSize = config.getIntValue("screenJoystickSize"); + mButtonsFormat = config.getIntValue("screenButtonsFormat"); + + setHalfJoyPad(getPadSize() / 2); + + if (mShowKeyboard) + loadKeyboard(); + if (mShowJoystick) + loadPad(); + if (mShowButtons) + loadButtons(); + mWidth = mainGraphics->mWidth; + mHeight = mainGraphics->mHeight; +} + +void TouchManager::loadTouchItem(TouchItem **restrict item, + const std::string &restrict name, + const std::string &restrict imageName, + const std::string &restrict text, + int x, int y, + const int width, const int height, + const int type, + const std::string &restrict eventPressed, + const std::string &restrict eventReleased, + const TouchFuncPtr fAll, + const TouchFuncPtr fPressed, + const TouchFuncPtr fReleased, + const TouchFuncPtr fOut) restrict2 +{ + *item = nullptr; + if (!theme) + return; + ImageRect *images = new ImageRect; + for (int f = 0; f < 9; f ++) + images->grid[f] = nullptr; + + Image *icon; + if (imageName.empty()) + icon = nullptr; + else + icon = Theme::getImageFromThemeXml(imageName, ""); + + Skin *const skin = theme->loadSkinRect(*images, name, ""); + if (skin) + { + Image *const image = images->grid[0]; + if (image) + { + if (x == -1) + x = skin->getOption("x", 10); + if (y == -1) + y = skin->getOption("y", 10); + const int pad = skin->getPadding(); + const int pad2 = 2 * pad; + const int border = skin->getOption("clickborder"); + const int border2 = border * 2; + const int diff = pad - border; + switch (type) + { + case LEFT: + y += (mainGraphics->mHeight - height) / 2; + break; + case RIGHT: + x = mainGraphics->mWidth - width - pad2 - x; + y = mainGraphics->mHeight - height - pad2 - y; + break; + case NORMAL: + default: + break; + } + *item = new TouchItem(text, Rect(x + diff, y + diff, + width + border2, height + border2), type, + eventPressed, eventReleased, images, icon, + x + pad, y + pad, width, height, + fAll, fPressed, fReleased, fOut); + mObjects.push_back(*item); + } + else + { + delete images; + } + theme->unload(skin); + } + else + { + delete images; + } + mRedraw = true; +} + +void TouchManager::clear() restrict2 +{ + FOR_EACH (TouchItemVectorCIter, it, mObjects) + unload(*it); + mObjects.clear(); + mRedraw = true; +} + +void TouchManager::draw() restrict2 +{ + if (mRedraw) + { + mRedraw = false; + mVertexes->clear(); + FOR_EACH (TouchItemVectorCIter, it, mObjects) + { + const TouchItem *const item = *it; + if (item && item->images && (mShow || + (item == mKeyboard && mShowKeyboard))) + { + mainGraphics->calcWindow(mVertexes, item->x, item->y, + item->width, item->height, *item->images); + const Image *const icon = item->icon; + if (icon) + { + mainGraphics->calcTileCollection(mVertexes, icon, + item->x + (item->width - icon->mBounds.w) / 2, + item->y + (item->height - icon->mBounds.h) / 2); + } + } + } + mainGraphics->finalize(mVertexes); + } + mainGraphics->drawTileCollection(mVertexes); + drawText(); +} + +void TouchManager::safeDraw() restrict2 +{ + FOR_EACH (TouchItemVectorCIter, it, mObjects) + { + const TouchItem *const item = *it; + if (item && item->images && (mShow || + (item == mKeyboard && mShowKeyboard))) + { + mainGraphics->drawImageRect(item->x, item->y, + item->width, item->height, *item->images); + const Image *const icon = item->icon; + if (icon) + { + mainGraphics->drawImage(icon, + item->x + (item->width - icon->mBounds.w) / 2, + item->y + (item->height - icon->mBounds.h) / 2); + } + } + } + drawText(); +} + +void TouchManager::drawText() restrict2 +{ + if (!gui) + return; + + Font *const font = boldFont; + const Color &color1 = theme->getColor(ThemeColorId::TEXT, 255); + const Color &color2 = theme->getColor(ThemeColorId::TEXT_OUTLINE, 255); + + FOR_EACH (TouchItemVectorCIter, it, mObjects) + { + const TouchItem *const item = *it; + if (item && mShow && !item->text.empty()) + { + const std::string str = item->text; + const int textX = (item->rect.width - font->getWidth(str)) + / 2 + item->x; + const int textY = (item->rect.height - font->getHeight()) + / 2 + item->y; + font->drawString(mainGraphics, + color1, + color2, + str, textX, textY); + } + } +} + +bool TouchManager::processEvent(const MouseInput &mouseInput) restrict2 +{ + const int x = mouseInput.getTouchX(); + const int y = mouseInput.getTouchY(); + + FOR_EACH (TouchItemVectorCIter, it, mObjects) + { + const TouchItem *const item = *it; + if (!item || (!mShow && (item != mKeyboard || !mShowKeyboard))) + continue; + const Rect &rect = item->rect; + if (rect.isPointInRect(x, y)) + { + MouseInput event = mouseInput; + event.setX(event.getTouchX() - item->x); + event.setY(event.getTouchY() - item->y); + if (item->funcAll) + item->funcAll(event); + + switch (mouseInput.getType()) + { + case MouseEventType::PRESSED: + if (!item->eventPressed.empty()) + executeAction(item->eventPressed); + else if (item->funcPressed) + item->funcPressed(event); + break; + case MouseEventType::RELEASED: + if (!item->eventReleased.empty()) + executeAction(item->eventReleased); + else if (item->funcReleased) + item->funcReleased(event); + break; + default: + case MouseEventType::MOVED: + case MouseEventType::WHEEL_MOVED_DOWN: + case MouseEventType::WHEEL_MOVED_UP: + case MouseEventType::CLICKED: + case MouseEventType::ENTERED: + case MouseEventType::EXITED: + case MouseEventType::DRAGGED: + case MouseEventType::RELEASED2: + break; + } + return true; + } + else if (item->funcOut) + { + item->funcOut(mouseInput); + } + } + return false; +} + +bool TouchManager::isActionActive(const InputActionT index) restrict2 const +{ + if (static_cast(index) < 0 || + static_cast(index) >= actionsSize) + { + return false; + } + return mActions[static_cast(index)]; +} + +void TouchManager::resize(const int width, const int height) restrict2 +{ + mRedraw = true; + const int maxHeight = mHeight; + const int diffW = width - mWidth; + const int diffH = height - maxHeight; + FOR_EACH (TouchItemVectorCIter, it, mObjects) + { + TouchItem *const item = *it; + if (!item) + continue; + + switch (item->type) + { + case LEFT: + if (height != maxHeight) + { + item->y = (height - item->height) / 2; + item->rect.y = (height - item->rect.y) / 2; + } + break; + case RIGHT: + { + item->x += diffW; + item->rect.x += diffW; + item->y += diffH; + item->rect.y += diffH; + break; + } + case NORMAL: + default: + break; + } + } + mWidth = mainGraphics->mWidth; + mHeight = mainGraphics->mHeight; +} + +void TouchManager::unload(TouchItem *restrict const item) +{ + if (item) + { + if (item->images) + { + Theme::unloadRect(*item->images); + delete2(item->images); + if (item->icon) + { + item->icon->decRef(); + item->icon = nullptr; + } + } + delete item; + } +} + +void TouchManager::unloadTouchItem(TouchItem *restrict *unloadItem) restrict2 +{ + FOR_EACH (TouchItemVectorIter, it, mObjects) + { + TouchItem *item = *it; + if (item && *unloadItem == item) + { + mObjects.erase(it); + unload(item); + return; + } + } +} + +void TouchManager::loadPad() restrict2 +{ + const int sz = (mJoystickSize + 2) * 50; + loadTouchItem(&mPad, "dpad.xml", "dpad_image.xml", "", -1, -1, sz, sz, + LEFT, "", "", &padEvents, &padClick, &padUp, &padOut); +} + +void TouchManager::loadButtons() restrict2 +{ + const int sz = (mButtonsSize + 1) * 50; + if (!theme) + return; + Skin *const skin = theme->load("dbutton.xml", ""); + + if (skin) + { + const int x = skin->getOption("x", 10); + const int y = skin->getOption("y", 10); + const int pad = skin->getPadding(); + const int pad2 = 2 * pad + sz; + const int skipWidth = pad2 + x; + const int skipHeight = pad2 + y; + + switch (mButtonsFormat) + { + // 2x1 + case 0: + default: + { + loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", + "2", x, y, sz, sz, RIGHT, "screenActionButton1", ""); + loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", + "1", skipWidth, y, sz, sz, RIGHT, + "screenActionButton0", ""); + break; + } + // 2x2 + case 1: + { + loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", + "4", x, y, sz, sz, RIGHT, "screenActionButton3", ""); + loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", + "3", skipWidth, y, sz, sz, RIGHT, + "screenActionButton2", ""); + loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", + "2", x, skipHeight, sz, sz, RIGHT, + "screenActionButton1", ""); + loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", + "1", skipWidth, skipHeight, sz, sz, RIGHT, + "screenActionButton0", ""); + break; + } + // 3x3 + case 2: + { + const int pad4 = pad2 * 2; + const int skipWidth2 = pad4 + x; + const int skipHeight2 = pad4 + y; + loadTouchItem(&mButtons[8], "dbutton.xml", "dbutton_image.xml", + "9", x, y, sz, sz, RIGHT, "screenActionButton8", ""); + loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", + "8", skipWidth, y, sz, sz, RIGHT, + "screenActionButton7", ""); + loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", + "7", skipWidth2, y, sz, sz, RIGHT, + "screenActionButton6", ""); + loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", + "6", x, skipHeight, sz, sz, RIGHT, + "screenActionButton5", ""); + loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", + "5", skipWidth, skipHeight, sz, sz, RIGHT, + "screenActionButton4", ""); + loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", + "4", skipWidth2, skipHeight, sz, sz, RIGHT, + "screenActionButton3", ""); + loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", + "3", x, skipHeight2, sz, sz, RIGHT, + "screenActionButton2", ""); + loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", + "2", skipWidth, skipHeight2, sz, sz, RIGHT, + "screenActionButton1", ""); + loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", + "1", skipWidth2, skipHeight2, sz, sz, RIGHT, + "screenActionButton0", ""); + break; + } + // 4x2 + case 3: + { + const int skipWidth2 = pad2 * 2 + x; + const int skipWidth3 = pad2 * 3 + x; + loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", + "8", x, y, sz, sz, RIGHT, "screenActionButton7", ""); + loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", + "7", skipWidth, y, sz, sz, RIGHT, + "screenActionButton6", ""); + loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", + "6", skipWidth2, y, sz, sz, RIGHT, + "screenActionButton5", ""); + loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", + "5", skipWidth3, y, sz, sz, RIGHT, + "screenActionButton4", ""); + loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", + "4", x, skipHeight, sz, sz, RIGHT, + "screenActionButton3", ""); + loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", + "3", skipWidth, skipHeight, sz, sz, RIGHT, + "screenActionButton2", ""); + loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", + "2", skipWidth2, skipHeight, sz, sz, RIGHT, + "screenActionButton1", ""); + loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", + "1", skipWidth3, skipHeight, sz, sz, RIGHT, + "screenActionButton0", ""); + break; + } + // 4x3 + case 4: + { + const int skipWidth2 = pad2 * 2 + x; + const int skipWidth3 = pad2 * 3 + x; + const int skipHeight2 = pad2 * 2 + y; + loadTouchItem(&mButtons[11], "dbutton.xml", + "dbutton_image.xml", "12", x, y, sz, sz, RIGHT, + "screenActionButton11", ""); + loadTouchItem(&mButtons[10], "dbutton.xml", + "dbutton_image.xml", "11", skipWidth, y, sz, sz, RIGHT, + "screenActionButton10", ""); + loadTouchItem(&mButtons[9], "dbutton.xml", "dbutton_image.xml", + "10", skipWidth2, y, sz, sz, RIGHT, + "screenActionButton9", ""); + loadTouchItem(&mButtons[8], "dbutton.xml", "dbutton_image.xml", + "9", skipWidth3, y, sz, sz, RIGHT, + "screenActionButton8", ""); + loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", + "8", x, skipHeight, sz, sz, RIGHT, + "screenActionButton7", ""); + loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", + "7", skipWidth, skipHeight, sz, sz, RIGHT, + "screenActionButton6", ""); + loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", + "6", skipWidth2, skipHeight, sz, sz, RIGHT, + "screenActionButton5", ""); + loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", + "5", skipWidth3, skipHeight, sz, sz, RIGHT, + "screenActionButton4", ""); + loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", + "4", x, skipHeight2, sz, sz, RIGHT, + "screenActionButton3", ""); + loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", + "3", skipWidth, skipHeight2, sz, sz, RIGHT, + "screenActionButton2", ""); + loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", + "2", skipWidth2, skipHeight2, sz, sz, RIGHT, + "screenActionButton1", ""); + loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", + "1", skipWidth3, skipHeight2, sz, sz, RIGHT, + "screenActionButton0", ""); + break; + } + }; + theme->unload(skin); + } +} + +void TouchManager::loadKeyboard() restrict2 +{ + loadTouchItem(&mKeyboard, "keyboard_icon.xml", "", "", -1, -1, 28, 28, + NORMAL, "", "screenActionKeyboard"); +} + +void TouchManager::optionChanged(const std::string &value) restrict2 +{ + if (value == "showScreenJoystick") + { + if (mShowJoystick == config.getBoolValue("showScreenJoystick")) + return; + mShowJoystick = config.getBoolValue("showScreenJoystick"); + if (mShowJoystick) + loadPad(); + else + unloadTouchItem(&mPad); + mRedraw = true; + } + else if (value == "showScreenButtons") + { + if (mShowButtons == config.getBoolValue("showScreenButtons")) + return; + mShowButtons = config.getBoolValue("showScreenButtons"); + if (mShowButtons) + { + loadButtons(); + } + else + { + for (int f = 0; f < buttonsCount; f ++) + unloadTouchItem(&mButtons[f]); + } + mRedraw = true; + } + else if (value == "showScreenKeyboard") + { + if (mShowKeyboard == config.getBoolValue("showScreenKeyboard")) + return; + mShowKeyboard = config.getBoolValue("showScreenKeyboard"); + if (mShowKeyboard) + loadKeyboard(); + else + unloadTouchItem(&mKeyboard); + mRedraw = true; + } + else if (value == "screenButtonsSize") + { + if (mButtonsSize == config.getIntValue("screenButtonsSize")) + return; + mButtonsSize = config.getIntValue("screenButtonsSize"); + if (mShowButtons) + { + for (int f = 0; f < buttonsCount; f ++) + unloadTouchItem(&mButtons[f]); + loadButtons(); + } + } + else if (value == "screenJoystickSize") + { + if (mJoystickSize == config.getIntValue("screenJoystickSize")) + return; + mJoystickSize = config.getIntValue("screenJoystickSize"); + setHalfJoyPad(getPadSize() / 2); + if (mShowJoystick) + { + unloadTouchItem(&mPad); + loadPad(); + } + } + else if (value == "screenButtonsFormat") + { + if (mButtonsFormat == config.getIntValue("screenButtonsFormat")) + return; + mButtonsFormat = config.getIntValue("screenButtonsFormat"); + if (mShowButtons) + { + for (int f = 0; f < buttonsCount; f ++) + unloadTouchItem(&mButtons[f]); + loadButtons(); + } + } +} + +void TouchManager::setInGame(const bool b) restrict2 +{ + mInGame = b; + mShow = mInGame && !mTempHideButtons; + mRedraw = true; +} + +void TouchManager::setTempHide(const bool b) restrict2 +{ + mTempHideButtons = b; + mShow = mInGame && !mTempHideButtons; + mRedraw = true; +} + +void TouchManager::executeAction(const std::string &restrict event) +{ + inputManager.executeAction(static_cast( + config.getIntValue(event))); +} diff --git a/src/input/touch/touchmanager.h b/src/input/touch/touchmanager.h new file mode 100644 index 000000000..f12bb850a --- /dev/null +++ b/src/input/touch/touchmanager.h @@ -0,0 +1,203 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 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 INPUT_TOUCH_TOUCHMANAGER_H +#define INPUT_TOUCH_TOUCHMANAGER_H + +#include "listeners/configlistener.h" + +#include "enums/input/inputaction.h" + +#include "gui/rect.h" + +#include + +#include "localconsts.h" + +class Image; +class ImageCollection; +class ImageRect; +class MouseInput; + +typedef void (*TouchFuncPtr) (const MouseInput &restrict mouseInput); + +const int actionsSize = static_cast(InputAction::TOTAL); +const int buttonsCount = 12; + +struct TouchItem final +{ + TouchItem(const std::string &text0, + const Rect &rect0, + const int type0, + const std::string &restrict eventPressed0, + const std::string &restrict eventReleased0, + ImageRect *restrict const images0, + Image *restrict const icon0, + const int x0, const int y0, + const int width0, const int height0, + const TouchFuncPtr ptrAll, + const TouchFuncPtr ptrPressed, + const TouchFuncPtr ptrReleased, + const TouchFuncPtr ptrOut) : + text(text0), + rect(rect0), + type(type0), + eventPressed(eventPressed0), + eventReleased(eventReleased0), + images(images0), + icon(icon0), + x(x0), + y(y0), + width(width0), + height(height0), + funcAll(ptrAll), + funcPressed(ptrPressed), + funcReleased(ptrReleased), + funcOut(ptrOut) + { + } + + A_DELETE_COPY(TouchItem) + + std::string text; + Rect rect; + int type; + std::string eventPressed; + std::string eventReleased; + ImageRect *images; + Image *icon; + int x; + int y; + int width; + int height; + TouchFuncPtr funcAll; + TouchFuncPtr funcPressed; + TouchFuncPtr funcReleased; + TouchFuncPtr funcOut; +}; + +typedef std::vector TouchItemVector; +typedef TouchItemVector::const_iterator TouchItemVectorCIter; +typedef TouchItemVector::iterator TouchItemVectorIter; + +class TouchManager final : public ConfigListener +{ + public: + TouchManager(); + + ~TouchManager(); + + A_DELETE_COPY(TouchManager) + + enum Types + { + NORMAL = 0, + LEFT = 1, + RIGHT = 2 + }; + + void init() restrict2; + + void loadTouchItem(TouchItem **restrict item, + const std::string &restrict name, + const std::string &restrict imageName, + const std::string &restrict text, + int x, int y, + const int width, const int height, + const int type, + const std::string &restrict eventPressed, + const std::string &restrict eventReleased, + const TouchFuncPtr fAll = nullptr, + const TouchFuncPtr fPressed = nullptr, + const TouchFuncPtr fReleased = nullptr, + const TouchFuncPtr fOut = nullptr) + restrict2 A_NONNULL(2); + + void clear() restrict2; + + void draw() restrict2; + + void safeDraw() restrict2; + + void drawText() restrict2; + + bool processEvent(const MouseInput &mouseInput) restrict2; + + bool isActionActive(const InputActionT index) restrict2 const; + + void setActionActive(const InputActionT index, + const bool value) restrict2 + { + if (static_cast(index) >= 0 && + static_cast(index) < actionsSize) + { + mActions[static_cast(index)] = value; + } + } + + void resize(const int width, const int height) restrict2; + + static void unload(TouchItem *restrict const item); + + void unloadTouchItem(TouchItem *restrict *unloadItem) restrict2; + + void optionChanged(const std::string &value) restrict2 override final; + + void loadPad() restrict2; + + void loadButtons() restrict2; + + void loadKeyboard() restrict2; + + int getPadSize() restrict2 const + { return (mJoystickSize + 2) * 50; } + + void setInGame(const bool b) restrict2; + + void setTempHide(const bool b) restrict2; + + void shutdown() restrict2; + + static void executeAction(const std::string &restrict event); + + private: + TouchItem *mKeyboard; + TouchItem *mPad; + TouchItem *mButtons[buttonsCount] A_NONNULLPOINTER; + TouchItemVector mObjects; + ImageCollection *mVertexes A_NONNULLPOINTER; + bool mActions[actionsSize]; + bool mRedraw; + bool mShowJoystick; + bool mShowButtons; + bool mShowKeyboard; + int mButtonsSize; + int mJoystickSize; + int mButtonsFormat; + int mWidth; + int mHeight; + bool mShow; + bool mInGame; + bool mTempHideButtons; +}; + +extern TouchManager touchManager; + +#endif // INPUT_TOUCH_TOUCHMANAGER_H diff --git a/src/touchactions.cpp b/src/touchactions.cpp index c2d34463f..3d3d38408 100644 --- a/src/touchactions.cpp +++ b/src/touchactions.cpp @@ -20,11 +20,11 @@ #include "touchactions.h" -#include "touchmanager.h" - #include "input/inputmanager.h" #include "input/mouseinput.h" +#include "input/touch/touchmanager.h" + #include "debug.h" bool padClicked(false); diff --git a/src/touchmanager.cpp b/src/touchmanager.cpp deleted file mode 100644 index 1a8d78cf6..000000000 --- a/src/touchmanager.cpp +++ /dev/null @@ -1,675 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2012-2015 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 "configuration.h" -#include "graphicsvertexes.h" -#include "touchactions.h" - -#include "input/mouseinput.h" - -#include "gui/gui.h" -#include "gui/skin.h" - -#include "gui/fonts/font.h" - -#include "input/inputmanager.h" - -#include "gui/theme.h" - -#include "resources/image.h" -#include "resources/imagerect.h" - -#include "utils/delete2.h" - -#include "debug.h" - -TouchManager touchManager; - -extern RenderType openGLMode; - -TouchManager::TouchManager() : - mKeyboard(nullptr), - mPad(nullptr), - mObjects(), - mVertexes(new ImageCollection), - mRedraw(true), - mShowJoystick(false), - mShowButtons(false), - mShowKeyboard(false), - mButtonsSize(1), - mJoystickSize(1), - mButtonsFormat(0), - mWidth(0), - mHeight(0), - mShow(false), - mInGame(false), - mTempHideButtons(false) -{ - for (int f = 0; f < actionsSize; f ++) - mActions[f] = false; - for (int f = 0; f < buttonsCount; f ++) - mButtons[f] = nullptr; -} - -TouchManager::~TouchManager() -{ - clear(); - delete2(mVertexes); - CHECKLISTENERS -} - -void TouchManager::shutdown() restrict2 -{ - config.removeListeners(this); -} - -void TouchManager::init() restrict2 -{ - config.addListener("showScreenJoystick", this); - config.addListener("showScreenButtons", this); - config.addListener("showScreenKeyboard", this); - config.addListener("screenButtonsSize", this); - config.addListener("screenJoystickSize", this); - config.addListener("screenButtonsFormat", this); - - mShowJoystick = config.getBoolValue("showScreenJoystick"); - mShowButtons = config.getBoolValue("showScreenButtons"); - mShowKeyboard = config.getBoolValue("showScreenKeyboard"); - mButtonsSize = config.getIntValue("screenButtonsSize"); - mJoystickSize = config.getIntValue("screenJoystickSize"); - mButtonsFormat = config.getIntValue("screenButtonsFormat"); - - setHalfJoyPad(getPadSize() / 2); - - if (mShowKeyboard) - loadKeyboard(); - if (mShowJoystick) - loadPad(); - if (mShowButtons) - loadButtons(); - mWidth = mainGraphics->mWidth; - mHeight = mainGraphics->mHeight; -} - -void TouchManager::loadTouchItem(TouchItem **restrict item, - const std::string &restrict name, - const std::string &restrict imageName, - const std::string &restrict text, - int x, int y, - const int width, const int height, - const int type, - const std::string &restrict eventPressed, - const std::string &restrict eventReleased, - const TouchFuncPtr fAll, - const TouchFuncPtr fPressed, - const TouchFuncPtr fReleased, - const TouchFuncPtr fOut) restrict2 -{ - *item = nullptr; - if (!theme) - return; - ImageRect *images = new ImageRect; - for (int f = 0; f < 9; f ++) - images->grid[f] = nullptr; - - Image *icon; - if (imageName.empty()) - icon = nullptr; - else - icon = Theme::getImageFromThemeXml(imageName, ""); - - Skin *const skin = theme->loadSkinRect(*images, name, ""); - if (skin) - { - Image *const image = images->grid[0]; - if (image) - { - if (x == -1) - x = skin->getOption("x", 10); - if (y == -1) - y = skin->getOption("y", 10); - const int pad = skin->getPadding(); - const int pad2 = 2 * pad; - const int border = skin->getOption("clickborder"); - const int border2 = border * 2; - const int diff = pad - border; - switch (type) - { - case LEFT: - y += (mainGraphics->mHeight - height) / 2; - break; - case RIGHT: - x = mainGraphics->mWidth - width - pad2 - x; - y = mainGraphics->mHeight - height - pad2 - y; - break; - case NORMAL: - default: - break; - } - *item = new TouchItem(text, Rect(x + diff, y + diff, - width + border2, height + border2), type, - eventPressed, eventReleased, images, icon, - x + pad, y + pad, width, height, - fAll, fPressed, fReleased, fOut); - mObjects.push_back(*item); - } - else - { - delete images; - } - theme->unload(skin); - } - else - { - delete images; - } - mRedraw = true; -} - -void TouchManager::clear() restrict2 -{ - FOR_EACH (TouchItemVectorCIter, it, mObjects) - unload(*it); - mObjects.clear(); - mRedraw = true; -} - -void TouchManager::draw() restrict2 -{ - if (mRedraw) - { - mRedraw = false; - mVertexes->clear(); - FOR_EACH (TouchItemVectorCIter, it, mObjects) - { - const TouchItem *const item = *it; - if (item && item->images && (mShow || - (item == mKeyboard && mShowKeyboard))) - { - mainGraphics->calcWindow(mVertexes, item->x, item->y, - item->width, item->height, *item->images); - const Image *const icon = item->icon; - if (icon) - { - mainGraphics->calcTileCollection(mVertexes, icon, - item->x + (item->width - icon->mBounds.w) / 2, - item->y + (item->height - icon->mBounds.h) / 2); - } - } - } - mainGraphics->finalize(mVertexes); - } - mainGraphics->drawTileCollection(mVertexes); - drawText(); -} - -void TouchManager::safeDraw() restrict2 -{ - FOR_EACH (TouchItemVectorCIter, it, mObjects) - { - const TouchItem *const item = *it; - if (item && item->images && (mShow || - (item == mKeyboard && mShowKeyboard))) - { - mainGraphics->drawImageRect(item->x, item->y, - item->width, item->height, *item->images); - const Image *const icon = item->icon; - if (icon) - { - mainGraphics->drawImage(icon, - item->x + (item->width - icon->mBounds.w) / 2, - item->y + (item->height - icon->mBounds.h) / 2); - } - } - } - drawText(); -} - -void TouchManager::drawText() restrict2 -{ - if (!gui) - return; - - Font *const font = boldFont; - const Color &color1 = theme->getColor(ThemeColorId::TEXT, 255); - const Color &color2 = theme->getColor(ThemeColorId::TEXT_OUTLINE, 255); - - FOR_EACH (TouchItemVectorCIter, it, mObjects) - { - const TouchItem *const item = *it; - if (item && mShow && !item->text.empty()) - { - const std::string str = item->text; - const int textX = (item->rect.width - font->getWidth(str)) - / 2 + item->x; - const int textY = (item->rect.height - font->getHeight()) - / 2 + item->y; - font->drawString(mainGraphics, - color1, - color2, - str, textX, textY); - } - } -} - -bool TouchManager::processEvent(const MouseInput &mouseInput) restrict2 -{ - const int x = mouseInput.getTouchX(); - const int y = mouseInput.getTouchY(); - - FOR_EACH (TouchItemVectorCIter, it, mObjects) - { - const TouchItem *const item = *it; - if (!item || (!mShow && (item != mKeyboard || !mShowKeyboard))) - continue; - const Rect &rect = item->rect; - if (rect.isPointInRect(x, y)) - { - MouseInput event = mouseInput; - event.setX(event.getTouchX() - item->x); - event.setY(event.getTouchY() - item->y); - if (item->funcAll) - item->funcAll(event); - - switch (mouseInput.getType()) - { - case MouseEventType::PRESSED: - if (!item->eventPressed.empty()) - executeAction(item->eventPressed); - else if (item->funcPressed) - item->funcPressed(event); - break; - case MouseEventType::RELEASED: - if (!item->eventReleased.empty()) - executeAction(item->eventReleased); - else if (item->funcReleased) - item->funcReleased(event); - break; - default: - case MouseEventType::MOVED: - case MouseEventType::WHEEL_MOVED_DOWN: - case MouseEventType::WHEEL_MOVED_UP: - case MouseEventType::CLICKED: - case MouseEventType::ENTERED: - case MouseEventType::EXITED: - case MouseEventType::DRAGGED: - case MouseEventType::RELEASED2: - break; - } - return true; - } - else if (item->funcOut) - { - item->funcOut(mouseInput); - } - } - return false; -} - -bool TouchManager::isActionActive(const InputActionT index) restrict2 const -{ - if (static_cast(index) < 0 || - static_cast(index) >= actionsSize) - { - return false; - } - return mActions[static_cast(index)]; -} - -void TouchManager::resize(const int width, const int height) restrict2 -{ - mRedraw = true; - const int maxHeight = mHeight; - const int diffW = width - mWidth; - const int diffH = height - maxHeight; - FOR_EACH (TouchItemVectorCIter, it, mObjects) - { - TouchItem *const item = *it; - if (!item) - continue; - - switch (item->type) - { - case LEFT: - if (height != maxHeight) - { - item->y = (height - item->height) / 2; - item->rect.y = (height - item->rect.y) / 2; - } - break; - case RIGHT: - { - item->x += diffW; - item->rect.x += diffW; - item->y += diffH; - item->rect.y += diffH; - break; - } - case NORMAL: - default: - break; - } - } - mWidth = mainGraphics->mWidth; - mHeight = mainGraphics->mHeight; -} - -void TouchManager::unload(TouchItem *restrict const item) -{ - if (item) - { - if (item->images) - { - Theme::unloadRect(*item->images); - delete2(item->images); - if (item->icon) - { - item->icon->decRef(); - item->icon = nullptr; - } - } - delete item; - } -} - -void TouchManager::unloadTouchItem(TouchItem *restrict *unloadItem) restrict2 -{ - FOR_EACH (TouchItemVectorIter, it, mObjects) - { - TouchItem *item = *it; - if (item && *unloadItem == item) - { - mObjects.erase(it); - unload(item); - return; - } - } -} - -void TouchManager::loadPad() restrict2 -{ - const int sz = (mJoystickSize + 2) * 50; - loadTouchItem(&mPad, "dpad.xml", "dpad_image.xml", "", -1, -1, sz, sz, - LEFT, "", "", &padEvents, &padClick, &padUp, &padOut); -} - -void TouchManager::loadButtons() restrict2 -{ - const int sz = (mButtonsSize + 1) * 50; - if (!theme) - return; - Skin *const skin = theme->load("dbutton.xml", ""); - - if (skin) - { - const int x = skin->getOption("x", 10); - const int y = skin->getOption("y", 10); - const int pad = skin->getPadding(); - const int pad2 = 2 * pad + sz; - const int skipWidth = pad2 + x; - const int skipHeight = pad2 + y; - - switch (mButtonsFormat) - { - // 2x1 - case 0: - default: - { - loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", - "2", x, y, sz, sz, RIGHT, "screenActionButton1", ""); - loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", - "1", skipWidth, y, sz, sz, RIGHT, - "screenActionButton0", ""); - break; - } - // 2x2 - case 1: - { - loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", - "4", x, y, sz, sz, RIGHT, "screenActionButton3", ""); - loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", - "3", skipWidth, y, sz, sz, RIGHT, - "screenActionButton2", ""); - loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", - "2", x, skipHeight, sz, sz, RIGHT, - "screenActionButton1", ""); - loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", - "1", skipWidth, skipHeight, sz, sz, RIGHT, - "screenActionButton0", ""); - break; - } - // 3x3 - case 2: - { - const int pad4 = pad2 * 2; - const int skipWidth2 = pad4 + x; - const int skipHeight2 = pad4 + y; - loadTouchItem(&mButtons[8], "dbutton.xml", "dbutton_image.xml", - "9", x, y, sz, sz, RIGHT, "screenActionButton8", ""); - loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", - "8", skipWidth, y, sz, sz, RIGHT, - "screenActionButton7", ""); - loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", - "7", skipWidth2, y, sz, sz, RIGHT, - "screenActionButton6", ""); - loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", - "6", x, skipHeight, sz, sz, RIGHT, - "screenActionButton5", ""); - loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", - "5", skipWidth, skipHeight, sz, sz, RIGHT, - "screenActionButton4", ""); - loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", - "4", skipWidth2, skipHeight, sz, sz, RIGHT, - "screenActionButton3", ""); - loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", - "3", x, skipHeight2, sz, sz, RIGHT, - "screenActionButton2", ""); - loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", - "2", skipWidth, skipHeight2, sz, sz, RIGHT, - "screenActionButton1", ""); - loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", - "1", skipWidth2, skipHeight2, sz, sz, RIGHT, - "screenActionButton0", ""); - break; - } - // 4x2 - case 3: - { - const int skipWidth2 = pad2 * 2 + x; - const int skipWidth3 = pad2 * 3 + x; - loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", - "8", x, y, sz, sz, RIGHT, "screenActionButton7", ""); - loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", - "7", skipWidth, y, sz, sz, RIGHT, - "screenActionButton6", ""); - loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", - "6", skipWidth2, y, sz, sz, RIGHT, - "screenActionButton5", ""); - loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", - "5", skipWidth3, y, sz, sz, RIGHT, - "screenActionButton4", ""); - loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", - "4", x, skipHeight, sz, sz, RIGHT, - "screenActionButton3", ""); - loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", - "3", skipWidth, skipHeight, sz, sz, RIGHT, - "screenActionButton2", ""); - loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", - "2", skipWidth2, skipHeight, sz, sz, RIGHT, - "screenActionButton1", ""); - loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", - "1", skipWidth3, skipHeight, sz, sz, RIGHT, - "screenActionButton0", ""); - break; - } - // 4x3 - case 4: - { - const int skipWidth2 = pad2 * 2 + x; - const int skipWidth3 = pad2 * 3 + x; - const int skipHeight2 = pad2 * 2 + y; - loadTouchItem(&mButtons[11], "dbutton.xml", - "dbutton_image.xml", "12", x, y, sz, sz, RIGHT, - "screenActionButton11", ""); - loadTouchItem(&mButtons[10], "dbutton.xml", - "dbutton_image.xml", "11", skipWidth, y, sz, sz, RIGHT, - "screenActionButton10", ""); - loadTouchItem(&mButtons[9], "dbutton.xml", "dbutton_image.xml", - "10", skipWidth2, y, sz, sz, RIGHT, - "screenActionButton9", ""); - loadTouchItem(&mButtons[8], "dbutton.xml", "dbutton_image.xml", - "9", skipWidth3, y, sz, sz, RIGHT, - "screenActionButton8", ""); - loadTouchItem(&mButtons[7], "dbutton.xml", "dbutton_image.xml", - "8", x, skipHeight, sz, sz, RIGHT, - "screenActionButton7", ""); - loadTouchItem(&mButtons[6], "dbutton.xml", "dbutton_image.xml", - "7", skipWidth, skipHeight, sz, sz, RIGHT, - "screenActionButton6", ""); - loadTouchItem(&mButtons[5], "dbutton.xml", "dbutton_image.xml", - "6", skipWidth2, skipHeight, sz, sz, RIGHT, - "screenActionButton5", ""); - loadTouchItem(&mButtons[4], "dbutton.xml", "dbutton_image.xml", - "5", skipWidth3, skipHeight, sz, sz, RIGHT, - "screenActionButton4", ""); - loadTouchItem(&mButtons[3], "dbutton.xml", "dbutton_image.xml", - "4", x, skipHeight2, sz, sz, RIGHT, - "screenActionButton3", ""); - loadTouchItem(&mButtons[2], "dbutton.xml", "dbutton_image.xml", - "3", skipWidth, skipHeight2, sz, sz, RIGHT, - "screenActionButton2", ""); - loadTouchItem(&mButtons[1], "dbutton.xml", "dbutton_image.xml", - "2", skipWidth2, skipHeight2, sz, sz, RIGHT, - "screenActionButton1", ""); - loadTouchItem(&mButtons[0], "dbutton.xml", "dbutton_image.xml", - "1", skipWidth3, skipHeight2, sz, sz, RIGHT, - "screenActionButton0", ""); - break; - } - }; - theme->unload(skin); - } -} - -void TouchManager::loadKeyboard() restrict2 -{ - loadTouchItem(&mKeyboard, "keyboard_icon.xml", "", "", -1, -1, 28, 28, - NORMAL, "", "screenActionKeyboard"); -} - -void TouchManager::optionChanged(const std::string &value) restrict2 -{ - if (value == "showScreenJoystick") - { - if (mShowJoystick == config.getBoolValue("showScreenJoystick")) - return; - mShowJoystick = config.getBoolValue("showScreenJoystick"); - if (mShowJoystick) - loadPad(); - else - unloadTouchItem(&mPad); - mRedraw = true; - } - else if (value == "showScreenButtons") - { - if (mShowButtons == config.getBoolValue("showScreenButtons")) - return; - mShowButtons = config.getBoolValue("showScreenButtons"); - if (mShowButtons) - { - loadButtons(); - } - else - { - for (int f = 0; f < buttonsCount; f ++) - unloadTouchItem(&mButtons[f]); - } - mRedraw = true; - } - else if (value == "showScreenKeyboard") - { - if (mShowKeyboard == config.getBoolValue("showScreenKeyboard")) - return; - mShowKeyboard = config.getBoolValue("showScreenKeyboard"); - if (mShowKeyboard) - loadKeyboard(); - else - unloadTouchItem(&mKeyboard); - mRedraw = true; - } - else if (value == "screenButtonsSize") - { - if (mButtonsSize == config.getIntValue("screenButtonsSize")) - return; - mButtonsSize = config.getIntValue("screenButtonsSize"); - if (mShowButtons) - { - for (int f = 0; f < buttonsCount; f ++) - unloadTouchItem(&mButtons[f]); - loadButtons(); - } - } - else if (value == "screenJoystickSize") - { - if (mJoystickSize == config.getIntValue("screenJoystickSize")) - return; - mJoystickSize = config.getIntValue("screenJoystickSize"); - setHalfJoyPad(getPadSize() / 2); - if (mShowJoystick) - { - unloadTouchItem(&mPad); - loadPad(); - } - } - else if (value == "screenButtonsFormat") - { - if (mButtonsFormat == config.getIntValue("screenButtonsFormat")) - return; - mButtonsFormat = config.getIntValue("screenButtonsFormat"); - if (mShowButtons) - { - for (int f = 0; f < buttonsCount; f ++) - unloadTouchItem(&mButtons[f]); - loadButtons(); - } - } -} - -void TouchManager::setInGame(const bool b) restrict2 -{ - mInGame = b; - mShow = mInGame && !mTempHideButtons; - mRedraw = true; -} - -void TouchManager::setTempHide(const bool b) restrict2 -{ - mTempHideButtons = b; - mShow = mInGame && !mTempHideButtons; - mRedraw = true; -} - -void TouchManager::executeAction(const std::string &restrict event) -{ - inputManager.executeAction(static_cast( - config.getIntValue(event))); -} diff --git a/src/touchmanager.h b/src/touchmanager.h deleted file mode 100644 index f67a2b72d..000000000 --- a/src/touchmanager.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2015 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 "listeners/configlistener.h" - -#include "enums/input/inputaction.h" - -#include "gui/rect.h" - -#include - -#include "localconsts.h" - -class Image; -class ImageCollection; -class ImageRect; -class MouseInput; - -typedef void (*TouchFuncPtr) (const MouseInput &restrict mouseInput); - -const int actionsSize = static_cast(InputAction::TOTAL); -const int buttonsCount = 12; - -struct TouchItem final -{ - TouchItem(const std::string &text0, - const Rect &rect0, - const int type0, - const std::string &restrict eventPressed0, - const std::string &restrict eventReleased0, - ImageRect *restrict const images0, - Image *restrict const icon0, - const int x0, const int y0, - const int width0, const int height0, - const TouchFuncPtr ptrAll, - const TouchFuncPtr ptrPressed, - const TouchFuncPtr ptrReleased, - const TouchFuncPtr ptrOut) : - text(text0), - rect(rect0), - type(type0), - eventPressed(eventPressed0), - eventReleased(eventReleased0), - images(images0), - icon(icon0), - x(x0), - y(y0), - width(width0), - height(height0), - funcAll(ptrAll), - funcPressed(ptrPressed), - funcReleased(ptrReleased), - funcOut(ptrOut) - { - } - - A_DELETE_COPY(TouchItem) - - std::string text; - Rect rect; - int type; - std::string eventPressed; - std::string eventReleased; - ImageRect *images; - Image *icon; - int x; - int y; - int width; - int height; - TouchFuncPtr funcAll; - TouchFuncPtr funcPressed; - TouchFuncPtr funcReleased; - TouchFuncPtr funcOut; -}; - -typedef std::vector TouchItemVector; -typedef TouchItemVector::const_iterator TouchItemVectorCIter; -typedef TouchItemVector::iterator TouchItemVectorIter; - -class TouchManager final : public ConfigListener -{ - public: - TouchManager(); - - ~TouchManager(); - - A_DELETE_COPY(TouchManager) - - enum Types - { - NORMAL = 0, - LEFT = 1, - RIGHT = 2 - }; - - void init() restrict2; - - void loadTouchItem(TouchItem **restrict item, - const std::string &restrict name, - const std::string &restrict imageName, - const std::string &restrict text, - int x, int y, - const int width, const int height, - const int type, - const std::string &restrict eventPressed, - const std::string &restrict eventReleased, - const TouchFuncPtr fAll = nullptr, - const TouchFuncPtr fPressed = nullptr, - const TouchFuncPtr fReleased = nullptr, - const TouchFuncPtr fOut = nullptr) - restrict2 A_NONNULL(2); - - void clear() restrict2; - - void draw() restrict2; - - void safeDraw() restrict2; - - void drawText() restrict2; - - bool processEvent(const MouseInput &mouseInput) restrict2; - - bool isActionActive(const InputActionT index) restrict2 const; - - void setActionActive(const InputActionT index, - const bool value) restrict2 - { - if (static_cast(index) >= 0 && - static_cast(index) < actionsSize) - { - mActions[static_cast(index)] = value; - } - } - - void resize(const int width, const int height) restrict2; - - static void unload(TouchItem *restrict const item); - - void unloadTouchItem(TouchItem *restrict *unloadItem) restrict2; - - void optionChanged(const std::string &value) restrict2 override final; - - void loadPad() restrict2; - - void loadButtons() restrict2; - - void loadKeyboard() restrict2; - - int getPadSize() restrict2 const - { return (mJoystickSize + 2) * 50; } - - void setInGame(const bool b) restrict2; - - void setTempHide(const bool b) restrict2; - - void shutdown() restrict2; - - static void executeAction(const std::string &restrict event); - - private: - TouchItem *mKeyboard; - TouchItem *mPad; - TouchItem *mButtons[buttonsCount] A_NONNULLPOINTER; - TouchItemVector mObjects; - ImageCollection *mVertexes A_NONNULLPOINTER; - bool mActions[actionsSize]; - bool mRedraw; - bool mShowJoystick; - bool mShowButtons; - bool mShowKeyboard; - int mButtonsSize; - int mJoystickSize; - int mButtonsFormat; - int mWidth; - int mHeight; - bool mShow; - bool mInGame; - bool mTempHideButtons; -}; - -extern TouchManager touchManager; - -#endif // TOUCHMANAGER_H -- cgit v1.2.3-60-g2f50