summaryrefslogtreecommitdiff
path: root/src/text.h
blob: cb105fc32d1dd415e3a7fc633e887b252abf5f7a (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
/*
 *  The ManaPlus Client
 *  Copyright (C) 2008  Douglas Boffey <DougABoffey@netscape.net>
 *  Copyright (C) 2008-2009  The Mana World Development Team
 *  Copyright (C) 2009-2010  The Mana Developers
 *  Copyright (C) 2011-2019  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 TEXT_H
#define TEXT_H

#include "enums/simpletypes/move.h"
#include "enums/simpletypes/speech.h"

#include "gui/fonts/textchunk.h"

#include "render/graphics.h"

#include "localconsts.h"

class Font;

class Text notfinal
{
    friend class TextManager;

    public:
        /**
         * Constructor creates a text object to display on the screen.
         */
        Text(const std::string &text,
             const int x, const int y,
             const Graphics::Alignment alignment,
             const Color *const color,
             const Speech isSpeech,
             Font *const font);

        A_DELETE_COPY(Text)

        /**
         * Destructor. The text is removed from the screen.
         */
        virtual ~Text();

        void setColor(const Color *const color);

        int getWidth() const noexcept2 A_WARN_UNUSED
        { return mWidth; }

        int getHeight() const noexcept2 A_WARN_UNUSED
        { return mHeight; }

        /**
         * Allows the originator of the text to specify the ideal coordinates.
         */
        void adviseXY(const int x, const int y, const Move move);

        /**
         * Draws the text.
         */
        virtual void draw(Graphics *const graphics,
                          const int xOff, const int yOff) A_NONNULL(2);

//        int getWidth() A_WARN_UNUSED;

        int getX() const noexcept2 A_WARN_UNUSED
        { return mX; }

        int getY() const noexcept2 A_WARN_UNUSED
        { return mY; }

    private:
        Font *mFont;           /**< The font of the text */
        TextChunk mTextChunk;
        int mX;                /**< Actual x-value of left of text written. */
        int mY;                /**< Actual y-value of top of text written. */
        int mWidth;            /**< The width of the text. */
        int mHeight;           /**< The height of the text. */
        int mXOffset;          /**< The offset of mX from the desired x. */
        static int mInstances; /**< Instances of text. */
        std::string mText;     /**< The text to display. */
        const Color *mColor;   /**< The color of the text. */
        Color mOutlineColor;
        Speech mIsSpeech;      /**< Is this text a speech bubble? */
        bool mTextChanged;

    protected:
        static ImageRect mBubble;   /**< Speech bubble graphic */
};

class FlashText final : public Text
{
    public:
        FlashText(const std::string &text, const int x, const int y,
                  const Graphics::Alignment alignment,
                  const Color *const color,
                  Font *const font = nullptr);

        A_DELETE_COPY(FlashText)

        /**
         * Flash the text for so many refreshes.
         */
        void flash(const int time)
        { mTime = time; }

        /**
         * Draws the text.
         */
        void draw(Graphics *const graphics,
                  const int xOff,
                  const int yOff) override final A_NONNULL(2);

    private:
        int mTime;             /**< Time left for flashing */
};

#endif  // TEXT_H