diff options
-rw-r--r-- | src/touchmanager.cpp | 119 | ||||
-rw-r--r-- | src/touchmanager.h | 16 |
2 files changed, 108 insertions, 27 deletions
diff --git a/src/touchmanager.cpp b/src/touchmanager.cpp index 5b04b2023..359eebbf9 100644 --- a/src/touchmanager.cpp +++ b/src/touchmanager.cpp @@ -47,6 +47,7 @@ TouchManager::TouchManager() : TouchManager::~TouchManager() { + config.removeListeners(this); clear(); delete mVertexes; mVertexes = nullptr; @@ -54,23 +55,21 @@ TouchManager::~TouchManager() void TouchManager::init() { + config.addListener("showScreenJoystick", this); + config.addListener("showScreenButtons", this); + + mShowJoystick = config.getBoolValue("showScreenJoystick"); + mShowButtons = config.getBoolValue("showScreenButtons"); + #ifdef ANDROID loadTouchItem(&mKeyboard, "keyboard_icon.xml", 28, 28, NORMAL, nullptr, nullptr, &showKeyboard, nullptr); #endif - if (config.getBoolValue("showScreenJoystick")) - { - loadTouchItem(&mPad, "dpad.xml", 100, 100, LEFT, - &padEvents, &padClick, &padUp, &padOut); - } - if (config.getBoolValue("showScreenButtons")) - { - loadTouchItem(&mAttack, "dpad_attack.xml", 60, 60, RIGHT, - nullptr, &attackClick, nullptr, nullptr); - loadTouchItem(&mCancel, "dpad_cancel.xml", 60, 60, RIGHT, - nullptr, &cancelClick, nullptr, nullptr); - } + if (mShowJoystick) + loadPad(); + if (mShowButtons) + loadButtons(); } void TouchManager::loadTouchItem(TouchItem **item, std::string name, @@ -122,26 +121,13 @@ void TouchManager::loadTouchItem(TouchItem **item, std::string name, void TouchManager::clear() { -// unloadTouchItem(&mPad); -// unloadTouchItem(&mKeyboard); - Theme *theme = Theme::instance(); if (!theme) return; for (TouchItemVectorCIter it = mObjects.begin(), it_end = mObjects.end(); it != it_end; ++ it) { - TouchItem *item = *it; - if (item) - { - if (item->images) - { - theme->unloadRect(*item->images); - delete item->images; - item->images = nullptr; - } - delete item; - } + unload(*it); } mObjects.clear(); mRedraw = true; @@ -270,3 +256,84 @@ void TouchManager::resize(int width, int height) } } } + +void TouchManager::unload(TouchItem *item) +{ + if (item) + { + Theme *const theme = Theme::instance(); + if (!theme) + return; + if (item->images) + { + theme->unloadRect(*item->images); + delete item->images; + item->images = nullptr; + } + delete item; + } +} + +void TouchManager::unloadTouchItem(TouchItem **unloadItem) +{ + Theme *theme = Theme::instance(); + if (!theme) + return; + for (TouchItemVectorIter it = mObjects.begin(), it_end = mObjects.end(); + it != it_end; ++ it) + { + TouchItem *item = *it; + if (item && *unloadItem == item) + { + mObjects.erase(it); + unload(item); + return; + } + } +} + +void TouchManager::loadPad() +{ + loadTouchItem(&mPad, "dpad.xml", 100, 100, LEFT, + &padEvents, &padClick, &padUp, &padOut); +} + +void TouchManager::loadButtons() +{ + loadTouchItem(&mAttack, "dpad_attack.xml", 60, 60, RIGHT, + nullptr, &attackClick, nullptr, nullptr); + loadTouchItem(&mCancel, "dpad_cancel.xml", 60, 60, RIGHT, + nullptr, &cancelClick, nullptr, nullptr); +} + +void TouchManager::optionChanged(const std::string &value) +{ + logger->log("changed"); + 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 + { + unloadTouchItem(&mAttack); + unloadTouchItem(&mCancel); + } + mRedraw = true; + } +} diff --git a/src/touchmanager.h b/src/touchmanager.h index fb81a0beb..e3d76d910 100644 --- a/src/touchmanager.h +++ b/src/touchmanager.h @@ -23,6 +23,7 @@ #include "resources/image.h" +#include "configlistener.h" #include "keydata.h" #include <guichan/mouseinput.hpp> @@ -80,8 +81,9 @@ struct TouchItem final typedef std::vector<TouchItem*> TouchItemVector; typedef TouchItemVector::const_iterator TouchItemVectorCIter; +typedef TouchItemVector::iterator TouchItemVectorIter; -class TouchManager final +class TouchManager final : public ConfigListener { public: TouchManager(); @@ -120,6 +122,16 @@ class TouchManager final void resize(int width, int height); + void unload(TouchItem *item); + + void unloadTouchItem(TouchItem **unloadItem); + + void optionChanged(const std::string &value); + + void loadPad(); + + void loadButtons(); + private: TouchItem *mKeyboard; TouchItem *mPad; @@ -129,6 +141,8 @@ class TouchManager final ImageCollection *mVertexes; bool mActions[actionsSize]; bool mRedraw; + bool mShowJoystick; + bool mShowButtons; }; extern TouchManager touchManager; |