summaryrefslogtreecommitdiff
path: root/src/gui/skin.h
blob: 30f7f360d32df63a6ff60de7136335340b36daf0 (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
/*
 *  Gui Skinning
 *  Copyright (C) 2008  The Legend of Mazzeroth Development Team
 *  Copyright (C) 2009  Aethyra Development Team
 *
 *  This file is part of The Mana World.
 *
 *  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, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef SKIN_H
#define SKIN_H

#include <map>
#include <string>

#include "../graphics.h"

class ConfigListener;
class Image;

class Skin
{
    public:
        Skin(ImageRect skin, Image *close, Image *stickyUp, Image *stickyDown,
             const std::string &filePath,
             const std::string &name = "");

        ~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.
         */
        std::string getName() const { return mName; }

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

        /**
         * Returns the background skin.
         */
        ImageRect getBorder() const { return border; }

        /**
         * Returns the image used by a close button for this skin.
         */
        Image *getCloseImage() const { return closeImage; }

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

        /**
         * Returns the number of instances which use this skin.
         */
        int getNumberOfInstances() const { return instances; }

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

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

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

        int instances;

    private:
        std::string mFilePath;     /**< File name path for the skin */
        std::string mName;         /**< Name of the skin to use */
        ImageRect border;          /**< The window border and background */
        Image *closeImage;         /**< Close Button Image */
        Image *stickyImageUp;      /**< Sticky Button Image */
        Image *stickyImageDown;    /**< Sticky Button Image */
};

// Map containing all window skins
typedef std::map<std::string, Skin*> Skins;

// Iterator for window skins
typedef Skins::iterator SkinIterator;

class SkinLoader 
{
    public:
        friend class SkinConfigListener;

        SkinLoader();
        ~SkinLoader();

        /**
         * Loads a skin
         */
        Skin *load(const std::string &filename,
                   const std::string &defaultPath);

        /**
         * Updates the alpha values of all of the skins
         */
        void updateAlpha();

    private:
        Skins mSkins;

        /**
         * The config listener that listens to changes relevant to all skins.
         */
        static ConfigListener *skinConfigListener;
};

extern SkinLoader *skinLoader;

#endif