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