1 // Aseprite UI Library
2 // Copyright (C) 2017  David Capello
3 //
4 // This file is released under the terms of the MIT license.
5 // Read LICENSE.txt for more information.
6 
7 #ifndef UI_STYLE_H_INCLUDED
8 #define UI_STYLE_H_INCLUDED
9 #pragma once
10 
11 #include "gfx/border.h"
12 #include "gfx/color.h"
13 #include "gfx/point.h"
14 #include "gfx/rect.h"
15 #include "gfx/size.h"
16 #include "ui/base.h"
17 
18 #include <string>
19 #include <vector>
20 
21 namespace she {
22   class Font;
23   class Surface;
24 }
25 
26 namespace ui {
27 
28   class Style {
29   public:
30     class Layer {
31     public:
32       enum class Type {
33         kNone,
34         kBackground,
35         kBackgroundBorder,
36         kBorder,
37         kIcon,
38         kText,
39         kNewLayer,
40       };
41 
42       // Flags (in which state the widget must be to show this layer)
43       enum {
44         kMouse = 1,
45         kFocus = 2,
46         kSelected = 4,
47         kDisabled = 8,
48       };
49 
Layer()50       Layer()
51         : m_type(Type::kNone)
52         , m_flags(0)
53         , m_align(CENTER | MIDDLE)
54         , m_color(gfx::ColorNone)
55         , m_icon(nullptr)
56         , m_spriteSheet(nullptr)
57         , m_offset(0, 0) {
58       }
59 
type()60       Type type() const { return m_type; }
flags()61       int flags() const { return m_flags; }
align()62       int align() const { return m_align; }
63 
color()64       gfx::Color color() const { return m_color; }
icon()65       she::Surface* icon() const { return m_icon; }
spriteSheet()66       she::Surface* spriteSheet() const { return m_spriteSheet; }
spriteBounds()67       const gfx::Rect& spriteBounds() const { return m_spriteBounds; }
slicesBounds()68       const gfx::Rect& slicesBounds() const { return m_slicesBounds; }
offset()69       const gfx::Point& offset() const { return m_offset; }
70 
setType(const Type type)71       void setType(const Type type) { m_type = type; }
setFlags(const int flags)72       void setFlags(const int flags) { m_flags = flags; }
setAlign(const int align)73       void setAlign(const int align) { m_align = align; }
setColor(gfx::Color color)74       void setColor(gfx::Color color) { m_color = color; }
setIcon(she::Surface * icon)75       void setIcon(she::Surface* icon) { m_icon = icon; }
setSpriteSheet(she::Surface * spriteSheet)76       void setSpriteSheet(she::Surface* spriteSheet) { m_spriteSheet = spriteSheet; }
setSpriteBounds(const gfx::Rect & bounds)77       void setSpriteBounds(const gfx::Rect& bounds) { m_spriteBounds = bounds; }
setSlicesBounds(const gfx::Rect & bounds)78       void setSlicesBounds(const gfx::Rect& bounds) { m_slicesBounds = bounds; }
setOffset(const gfx::Point & offset)79       void setOffset(const gfx::Point& offset) { m_offset = offset; }
80 
81     private:
82       Type m_type;
83       int m_flags;
84       int m_align;
85       gfx::Color m_color;
86       she::Surface* m_icon;
87       she::Surface* m_spriteSheet;
88       gfx::Rect m_spriteBounds;
89       gfx::Rect m_slicesBounds;
90       gfx::Point m_offset;
91     };
92 
93     typedef std::vector<Layer> Layers;
94 
95     static gfx::Border UndefinedBorder();
96 
97     Style(const Style* base);
98 
id()99     const std::string& id() const { return m_id; }
margin()100     const gfx::Border& margin() const { return m_margin; }
border()101     const gfx::Border& border() const { return m_border; }
padding()102     const gfx::Border& padding() const { return m_padding; }
font()103     she::Font* font() const { return m_font; }
layers()104     const Layers& layers() const { return m_layers; }
layers()105     Layers& layers() { return m_layers; }
106 
setId(const std::string & id)107     void setId(const std::string& id) { m_id = id; }
setMargin(const gfx::Border & value)108     void setMargin(const gfx::Border& value) { m_margin = value; }
setBorder(const gfx::Border & value)109     void setBorder(const gfx::Border& value) { m_border = value; }
setPadding(const gfx::Border & value)110     void setPadding(const gfx::Border& value) { m_padding = value; }
setFont(she::Font * font)111     void setFont(she::Font* font) { m_font = font; }
112     void addLayer(const Layer& layer);
113 
114   private:
115     std::string m_id;         // Just for debugging purposes
116     Layers m_layers;
117     int m_insertionPoint;
118     gfx::Border m_margin;
119     gfx::Border m_border;
120     gfx::Border m_padding;
121     she::Font* m_font;
122   };
123 
124 } // namespace ui
125 
126 #endif
127