summaryrefslogtreecommitdiff
path: root/src/gui/skin.h
blob: c1bc5484e346a53fca68a74c24a7804563b8c328 (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
/*
 *  The ManaPlus Client
 *  Copyright (C) 2008  The Legend of Mazzeroth Development Team
 *  Copyright (C) 2009  Aethyra Development Team
 *  Copyright (C) 2009  The Mana World Development Team
 *  Copyright (C) 2009-2010  The Mana Developers
 *  Copyright (C) 2011-2020  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 GUI_SKIN_H
#define GUI_SKIN_H

#include "utils/stringmap.h"

#include "localconsts.h"

class Image;
class ImageRect;

class Skin final
{
    public:
        Skin(ImageRect *const restrict skin,
             const ImageRect *const restrict images,
             const std::string &filePath,
             const std::string &name,
             const int padding,
             const int titlePadding,
             StringIntMap *restrict const options) A_NONNULL(8);

        A_DELETE_COPY(Skin)

        ~Skin();

        /**
         * Returns the skin's name. Useful for giving a human friendly skin
         * name if a dialog for skin selection for a specific window type is
         * done.
         */
        const std::string &getName() const noexcept2 A_WARN_UNUSED
        { return mName; }

        /**
         * Returns the skin's xml file path.
         */
        const std::string &getFilePath() const noexcept2 A_WARN_UNUSED
        { return mFilePath; }

        /**
         * Returns the background skin.
         */
        const ImageRect &getBorder() const noexcept2 A_WARN_UNUSED
        { return *mBorder; }

        /**
         * Returns the image used by a close button for this skin.
         */
        const Image *getCloseImage(const bool state) const
                                   noexcept2 A_WARN_UNUSED
        { return state ? mCloseImageHighlighted : mCloseImage; }

        /**
         * Returns the image used by a sticky button for this skin.
         */
        const Image *getStickyImage(const bool state) const
                                    noexcept2 A_WARN_UNUSED
        { return state ? mStickyImageDown : mStickyImageUp; }

        /**
         * Returns the minimum width which can be used with this skin.
         */
        int getMinWidth() const A_WARN_UNUSED;

        /**
         * Returns the minimum height which can be used with this skin.
         */
        int getMinHeight() const A_WARN_UNUSED;

        /**
         * Updates the alpha value of the skin
         */
        void updateAlpha(const float minimumOpacityAllowed);

        int getPadding() const noexcept2 A_WARN_UNUSED
        { return mPadding; }

        int getTitlePadding() const noexcept2 A_WARN_UNUSED
        { return mTitlePadding; }

        int getOption(const std::string &name) const A_WARN_UNUSED
        {
            if (mOptions->find(name) != mOptions->end())
                return (*mOptions)[name];
            return 0;
        }

        int getOption(const std::string &name,
                      const int def) const A_WARN_UNUSED
        {
            if (mOptions->find(name) != mOptions->end())
                return (*mOptions)[name];
            return def;
        }

        int instances;

    private:
        std::string mFilePath;     /**< File name path for the skin */
        std::string mName;         /**< Name of the skin to use */
        ImageRect *mBorder;        /**< The window border and background */
        Image *mCloseImage;        /**< Close Button Image */
        Image *mCloseImageHighlighted; /**< Highlighted close Button Image */
        Image *mStickyImageUp;     /**< Sticky Button Image */
        Image *mStickyImageDown;   /**< Sticky Button Image */
        int mPadding;
        int mTitlePadding;
        StringIntMap *mOptions A_NONNULLPOINTER;
};

#endif  // GUI_SKIN_H