summaryrefslogtreecommitdiff
path: root/src/touchmanager.h
blob: f67a2b72d5215a759d8d001665bf514be30af884 (plain) (blame)
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
/*
 *  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 <http://www.gnu.org/licenses/>.
 */

#ifndef TOUCHMANAGER_H
#define TOUCHMANAGER_H

#include "listeners/configlistener.h"

#include "enums/input/inputaction.h"

#include "gui/rect.h"

#include <vector>

#include "localconsts.h"

class Image;
class ImageCollection;
class ImageRect;
class MouseInput;

typedef void (*TouchFuncPtr) (const MouseInput &restrict mouseInput);

const int actionsSize = static_cast<int>(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<TouchItem*> 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<int>(index) >= 0 &&
                static_cast<int>(index) < actionsSize)
            {
                mActions[static_cast<size_t>(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