1// Aseprite UI Library
2// Copyright (C) 2020-2022 Igara Studio S.A.
3// Copyright (C) 2001-2017 David Capello
4//
5// This file is released under the terms of the MIT license.
6// Read LICENSE.txt for more information.
7
8#ifndef UI_THEME_H_INCLUDED
9#define UI_THEME_H_INCLUDED
10#pragma once
11
12#include "gfx/border.h"
13#include "gfx/color.h"
14#include "gfx/rect.h"
15#include "gfx/size.h"
16#include "ui/base.h"
17#include "ui/cursor_type.h"
18#include "ui/style.h"
19
20namespace gfx {
21 class Region;
22}
23
24namespace os {
25 class Font;
26 class Surface;
27}
28
29namespace ui {
30
31 class Cursor;
32 class Graphics;
33 class PaintEvent;
34 class SizeHintEvent;
35 class Widget;
36 class Theme;
37
38 void set_theme(Theme* theme, const int uiscale);
39 Theme* get_theme();
40
41 struct PaintWidgetPartInfo {
42 gfx::Color bgColor;
43 int styleFlags; // ui::Style::Layer flags
44 const std::string* text;
45 int mnemonic;
46
47 PaintWidgetPartInfo();
48 PaintWidgetPartInfo(const Widget* widget);
49
50 static int getStyleFlagsForWidget(const Widget* widget);
51 };
52
53 class Theme {
54 friend void set_theme(Theme* theme, const int uiscale);
55 public:
56 Theme();
57 virtual ~Theme();
58
59 virtual os::Font* getDefaultFont() const = 0;
60 virtual os::Font* getWidgetFont(const Widget* widget) const = 0;
61
62 virtual ui::Cursor* getStandardCursor(CursorType type) = 0;
63 virtual void initWidget(Widget* widget) = 0;
64 virtual void getWindowMask(Widget* widget, gfx::Region& region) = 0;
65 virtual void setDecorativeWidgetBounds(Widget* widget);
66 virtual int getScrollbarSize() = 0;
67 virtual gfx::Size getEntryCaretSize(Widget* widget) = 0;
68
69 virtual void paintEntry(PaintEvent& ev) = 0;
70 virtual void paintListBox(PaintEvent& ev) = 0;
71 virtual void paintMenu(PaintEvent& ev) = 0;
72 virtual void paintMenuItem(PaintEvent& ev) = 0;
73 virtual void paintSlider(PaintEvent& ev) = 0;
74 virtual void paintComboBoxEntry(PaintEvent& ev) = 0;
75 virtual void paintTextBox(PaintEvent& ev) = 0;
76 virtual void paintViewViewport(PaintEvent& ev) = 0;
77
78 virtual void paintWidgetPart(Graphics* g,
79 const Style* style,
80 const gfx::Rect& bounds,
81 const PaintWidgetPartInfo& info);
82
83 // Default implementation to draw widgets with new ui::Styles
84 virtual void paintWidget(Graphics* g,
85 const Widget* widget,
86 const Style* style,
87 const gfx::Rect& bounds);
88
89 virtual void paintScrollBar(Graphics* g,
90 const Widget* widget,
91 const Style* style,
92 const Style* thumbStyle,
93 const gfx::Rect& bounds,
94 const gfx::Rect& thumbBounds);
95
96 virtual void paintTooltip(Graphics* g,
97 const Widget* widget,
98 const Style* style,
99 const Style* arrowStyle,
100 const gfx::Rect& bounds,
101 const int arrowAlign,
102 const gfx::Rect& target);
103
104 void paintTextBoxWithStyle(Graphics* g,
105 const Widget* widget);
106
107 virtual gfx::Size calcSizeHint(const Widget* widget,
108 const Style* style);
109 virtual gfx::Border calcBorder(const Widget* widget,
110 const Style* style);
111 virtual void calcSlices(const Widget* widget,
112 const Style* style,
113 gfx::Size& topLeft,
114 gfx::Size& center,
115 gfx::Size& bottomRight);
116 virtual void calcTextInfo(const Widget* widget,
117 const Style* style,
118 const gfx::Rect& bounds,
119 gfx::Rect& textBounds, int& textAlign);
120 virtual gfx::Color calcBgColor(const Widget* widget,
121 const Style* style);
122
123 static void drawSlices(Graphics* g,
124 os::Surface* sheet,
125 const gfx::Rect& rc,
126 const gfx::Rect& sprite,
127 const gfx::Rect& slices,
128 const gfx::Color color,
129 const bool drawCenter = true);
130
131 static void drawTextBox(Graphics* g, const Widget* textbox,
132 int* w, int* h, gfx::Color bg, gfx::Color fg);
133
134 protected:
135 virtual void onRegenerateTheme() = 0;
136
137 private:
138 void regenerateTheme();
139 void paintLayer(Graphics* g,
140 const Style* style,
141 const Style::Layer& layer,
142 const std::string& text,
143 const int mnemonic,
144 gfx::Rect& rc,
145 gfx::Color& bgColor);
146 void measureLayer(const Widget* widget,
147 const Style* style,
148 const Style::Layer& layer,
149 gfx::Border& borderHint,
150 gfx::Rect& textHint, int& textAlign,
151 gfx::Size& iconHint, int& iconAlign);
152 void calcWidgetMetrics(const Widget* widget,
153 const Style* style,
154 gfx::Size& sizeHint,
155 gfx::Border& borderHint,
156 gfx::Rect& textHint, int& textAlign);
157 };
158
159} // namespace ui
160
161#endif
162