7#include <mousetrap/gtk_common.hpp>
8#include <mousetrap/color.hpp>
19 struct _StyleClassInternal
21 GObject parent_instance;
23 GtkCssProvider* provider;
25 std::map<std::string, std::map<std::string, std::string>>* target_to_properties;
27 using StyleClassInternal = _StyleClassInternal;
29 static bool validate_css_name(
const std::string&);
52 static void add_css(
const std::string&);
75 static inline std::vector<std::string> _named_colors = std::vector<std::string>();
76 static inline GtkCssProvider* _named_color_provider =
nullptr;
77 static inline std::map<std::string, detail::StyleClassInternal*> _style_classes = std::map<std::string, detail::StyleClassInternal*>();
80 using StyleClassTarget =
const std::string&;
92 StyleClass(detail::StyleClassInternal* internal);
98 operator NativeObject()
const;
112 void set_property(StyleClassTarget target,
const std::string& property,
const std::string& value);
117 void set_property(
const std::string& property,
const std::string& value);
123 std::string
get_property(StyleClassTarget target,
const std::string& property)
const;
129 std::string
get_property(
const std::string& property)
const;
132 detail::StyleClassInternal* _internal =
nullptr;
137 #define DEFINE_CSS_PROPERTY(NAME, value) constexpr const char* STYLE_PROPERTY_##NAME = value;
138 DEFINE_CSS_PROPERTY(FOREGROUND_COLOR,
"color")
139 DEFINE_CSS_PROPERTY(COLOR, "color")
140 DEFINE_CSS_PROPERTY(BACKGROUND_COLOR, "background-color")
141 DEFINE_CSS_PROPERTY(OPACITY, "opacity")
142 DEFINE_CSS_PROPERTY(FILTER, "filter")
143 DEFINE_CSS_PROPERTY(FONT, "font")
144 DEFINE_CSS_PROPERTY(FONT_FAMILY, "font-family")
145 DEFINE_CSS_PROPERTY(FONT_VARIANT, "font-variant")
146 DEFINE_CSS_PROPERTY(FONT_SIZE, "font-size")
147 DEFINE_CSS_PROPERTY(FONT_STYLE, "font-style")
148 DEFINE_CSS_PROPERTY(FONT_WEIGHT, "font-weight")
149 DEFINE_CSS_PROPERTY(FONT_TRANSFORM, "font-transform")
150 DEFINE_CSS_PROPERTY(CARET_COLOR, "caret-color")
151 DEFINE_CSS_PROPERTY(TEXT_DECORATION, "text-decoration")
152 DEFINE_CSS_PROPERTY(TEXT_DECORATION_COLOR, "text-decoration-color")
153 DEFINE_CSS_PROPERTY(TEXT_DECORATION_STYLE, "text-decoration-style")
154 DEFINE_CSS_PROPERTY(TEXT_SHADOW, "text-shadow")
155 DEFINE_CSS_PROPERTY(ICON_SIZE, "-gtk-icon-size")
156 DEFINE_CSS_PROPERTY(TRANSFORM, "transform")
157 DEFINE_CSS_PROPERTY(TRANSFORM_ORIGIN, "transform-origin")
158 DEFINE_CSS_PROPERTY(BORDER, "border")
159 DEFINE_CSS_PROPERTY(BORDER_STYLE, "border-style")
160 DEFINE_CSS_PROPERTY(BORDER_COLOR, "border-color")
161 DEFINE_CSS_PROPERTY(BORDER_WIDTH, "border-width")
162 DEFINE_CSS_PROPERTY(BORDER_RADIUS, "border-radius")
163 DEFINE_CSS_PROPERTY(BORDER_SPACING, "border-spacing")
164 DEFINE_CSS_PROPERTY(OUTLINE, "outline")
165 DEFINE_CSS_PROPERTY(OUTLINE_STYLE, "outline-style")
166 DEFINE_CSS_PROPERTY(OUTLINE_COLOR, "outline-color")
167 DEFINE_CSS_PROPERTY(OUTLINE_WIDTH, "outline-width")
168 DEFINE_CSS_PROPERTY(BOX_SHADOW, "box-shadow")
169 DEFINE_CSS_PROPERTY(BACKGROUND_CLIP, "background-clip")
170 DEFINE_CSS_PROPERTY(BACKGROUND_ORIGIN, "background-origin")
171 DEFINE_CSS_PROPERTY(BACKGROUND_SIZE, "background-size")
172 DEFINE_CSS_PROPERTY(BACKGROUND_POSITION, "background-position")
173 DEFINE_CSS_PROPERTY(BACKGROUND_REPEAT, "background-repeat")
174 DEFINE_CSS_PROPERTY(TRANSITION, "transition")
175 DEFINE_CSS_PROPERTY(TRANSITION_PROPERTY, "transition-property")
176 DEFINE_CSS_PROPERTY(TRANSITION_DURATION, "transition-duration")
177 DEFINE_CSS_PROPERTY(TRANSITION_TIMING_FUNCTION, "transition-timing-function")
178 DEFINE_CSS_PROPERTY(TRANSITION_DELAY, "transition-delay")
179 DEFINE_CSS_PROPERTY(ANIMATION, "animation")
180 DEFINE_CSS_PROPERTY(ANIMATION_NAME, "animation-name")
181 DEFINE_CSS_PROPERTY(ANIMATION_DURATION, "animation-duration")
182 DEFINE_CSS_PROPERTY(ANIMATION_TIMING_FUNCTION, "animation-timing-function")
183 DEFINE_CSS_PROPERTY(ANIMATION_ITERATION_COUNT, "animation-iteration-count")
184 DEFINE_CSS_PROPERTY(ANIMATION_DIRECTION, "animation-direction")
185 DEFINE_CSS_PROPERTY(ANIMATION_PLAY_STATE, "animation-play-state")
186 DEFINE_CSS_PROPERTY(ANIMATION_DELAY, "animation-delay")
187 DEFINE_CSS_PROPERTY(ANIMATION_FILL_MODE, "animation-fill-mode")
191 #define DEFINE_PRE_MADE_STYLE_CLASS(NAME, css_name) static inline const StyleClass STYLE_CLASS_##NAME = StyleClass(css_name);
192 DEFINE_PRE_MADE_STYLE_CLASS(SUGGESTED_ACTION,
"suggested-action");
193 DEFINE_PRE_MADE_STYLE_CLASS(DESTRUCTIVE_ACTION,
"destructive-action");
194 DEFINE_PRE_MADE_STYLE_CLASS(BUTTON_FLAT,
"flat");
195 DEFINE_PRE_MADE_STYLE_CLASS(BUTTON_RAISED,
"raised");
196 DEFINE_PRE_MADE_STYLE_CLASS(BUTTON_CIRCULAR,
"circular");
197 DEFINE_PRE_MADE_STYLE_CLASS(BUTTON_PILL,
"pill");
199 DEFINE_PRE_MADE_STYLE_CLASS(BOX_LINKED,
"linked");
200 DEFINE_PRE_MADE_STYLE_CLASS(TOOLBAR,
"toolbar");
201 DEFINE_PRE_MADE_STYLE_CLASS(DIMMED,
"dim-label");
203 DEFINE_PRE_MADE_STYLE_CLASS(FONT_HEADING_1,
"title-1");
204 DEFINE_PRE_MADE_STYLE_CLASS(FONT_HEADING_2,
"title-2");
205 DEFINE_PRE_MADE_STYLE_CLASS(FONT_HEADING_3,
"title-3");
206 DEFINE_PRE_MADE_STYLE_CLASS(FONT_HEADING_4,
"title-4");
207 DEFINE_PRE_MADE_STYLE_CLASS(FONT_LARGER,
"heading");
208 DEFINE_PRE_MADE_STYLE_CLASS(FONT_REGULAR,
"body");
209 DEFINE_PRE_MADE_STYLE_CLASS(FONT_CAPTION_HEADING,
"caption-heading");
210 DEFINE_PRE_MADE_STYLE_CLASS(FONT_CAPTION,
"caption");
211 DEFINE_PRE_MADE_STYLE_CLASS(FONT_MONOSPACE,
"monospace");
212 DEFINE_PRE_MADE_STYLE_CLASS(FONT_NUMERIC,
"numeric");
214 DEFINE_PRE_MADE_STYLE_CLASS(COLOR_ACCENT,
"accent");
215 DEFINE_PRE_MADE_STYLE_CLASS(COLOR_SUCCESS,
"success");
216 DEFINE_PRE_MADE_STYLE_CLASS(COLOR_WARNING,
"warning");
217 DEFINE_PRE_MADE_STYLE_CLASS(COLOR_ERROR,
"error");
219 DEFINE_PRE_MADE_STYLE_CLASS(ACTIVATABLE,
"activatable");
220 DEFINE_PRE_MADE_STYLE_CLASS(CARD,
"card");
222 DEFINE_PRE_MADE_STYLE_CLASS(LIST_VIEW_SIDEBAR,
"navigation-sidebar");
223 DEFINE_PRE_MADE_STYLE_CLASS(LIST_VIEW_RICH_LIST,
"rich-list");
224 DEFINE_PRE_MADE_STYLE_CLASS(LIST_VIEW_DATA_TABLE,
"data-table");
225 DEFINE_PRE_MADE_STYLE_CLASS(LIST_VIEW_MENUBAR,
"menu");
227 DEFINE_PRE_MADE_STYLE_CLASS(ICON_DROPSHADOW,
"icon-dropshadow");
228 DEFINE_PRE_MADE_STYLE_CLASS(ICON_SMALL,
"lowres-icon");
230 DEFINE_PRE_MADE_STYLE_CLASS(CHECK_BUTTON_ROUND,
"selection-mode");
232 DEFINE_PRE_MADE_STYLE_CLASS(ON_SCREEN_DISPLAY,
"osd");
233 DEFINE_PRE_MADE_STYLE_CLASS(BACKGROUND,
"background");
234 DEFINE_PRE_MADE_STYLE_CLASS(VIEW,
"view");
238 #define DEFINE_STYLE_CLASS_TARGET(NAME, value) constexpr const char* STYLE_TARGET_##NAME = value;
239 DEFINE_STYLE_CLASS_TARGET(SELF,
"")
243 DEFINE_STYLE_CLASS_TARGET(ACTION_BAR, "actionbar")
244 DEFINE_STYLE_CLASS_TARGET(ACTION_BAR_BOX_START, "actionbar>revealer>box>box.start")
245 DEFINE_STYLE_CLASS_TARGET(ACTION_BAR_BOX_END, "actionbar>revealer>box>box.end")
249 DEFINE_STYLE_CLASS_TARGET(ASPECT_FRAME, "aspectframe");
253 DEFINE_STYLE_CLASS_TARGET(BOX, "box");
257 DEFINE_STYLE_CLASS_TARGET(BUTTON, "button");
258 DEFINE_STYLE_CLASS_TARGET(BUTTON_PRESSED, "button:active");
262 DEFINE_STYLE_CLASS_TARGET(CENTER_BOX, "box");
266 DEFINE_STYLE_CLASS_TARGET(CHECK_BUTTON, "checkbutton");
267 DEFINE_STYLE_CLASS_TARGET(CHECK_BUTTON_CHECK_MARK_ACTIVE, "check:checked")
268 DEFINE_STYLE_CLASS_TARGET(CHECK_BUTTON_CHECK_MARK_INCONSISTENT, "check::indeterminate")
269 DEFINE_STYLE_CLASS_TARGET(CHECK_BUTTON_CHECK_MARK_INACTIVE, "check:not(:checked):not(:indeterminate)")
273 DEFINE_STYLE_CLASS_TARGET(CLAMP_FRAME, "clamp");
277 DEFINE_STYLE_CLASS_TARGET(COLUMN_VIEW, "columnview");
281 DEFINE_STYLE_CLASS_TARGET(DROP_DOWN, "dropdown");
285 DEFINE_STYLE_CLASS_TARGET(ENTRY, "entry");
286 DEFINE_STYLE_CLASS_TARGET(ENTRY_TEXT, "entry>text");
290 DEFINE_STYLE_CLASS_TARGET(EXPANDER, "expander-widget");
291 DEFINE_STYLE_CLASS_TARGET(EXPANDER_TITLE, "expander-widget>box>title");
292 DEFINE_STYLE_CLASS_TARGET(EXPANDER_TITLE_ARROW, "expander-widget>box>title>expander");
299 DEFINE_STYLE_CLASS_TARGET(FLOW_BOX, "flowbox");
300 DEFINE_STYLE_CLASS_TARGET(FLOW_BOX_CHILD, "flowbox>flowboxchild,flowboxchild");
304 DEFINE_STYLE_CLASS_TARGET(FRAME, "frame");
308 DEFINE_STYLE_CLASS_TARGET(GRID, "grid");
312 DEFINE_STYLE_CLASS_TARGET(GRID_VIEW, "gridview");
313 DEFINE_STYLE_CLASS_TARGET(GRID_VIEW_CHILDREN, "gridview>child");
314 DEFINE_STYLE_CLASS_TARGET(GRID_VIEW_SELECTED, "gridview>child:selected");
315 DEFINE_STYLE_CLASS_TARGET(GRID_VIEW_NOT_SELECTED, "gridview>child:not(:selected)");
319 DEFINE_STYLE_CLASS_TARGET(HEADER_BAR, "headerbar");
323 DEFINE_STYLE_CLASS_TARGET(IMAGE_DISPLAY, "image");
327 DEFINE_STYLE_CLASS_TARGET(LABEL, "label");
331 DEFINE_STYLE_CLASS_TARGET(LEVEL_BAR, "levelbar");
332 DEFINE_STYLE_CLASS_TARGET(LEVEL_BAR_TROUGH, "levelbar>trough");
333 DEFINE_STYLE_CLASS_TARGET(LEVEL_BAR_BLOCK_LOW, "levelbar>trough>block.low");
334 DEFINE_STYLE_CLASS_TARGET(LEVEL_BAR_BLOCK_HIGH, "levelbar>trough>block.high");
335 DEFINE_STYLE_CLASS_TARGET(LEVEL_BAR_BLOCK_FULL, "levelbar>trough>block.full");
339 DEFINE_STYLE_CLASS_TARGET(LIST_VIEW, "listview");
340 DEFINE_STYLE_CLASS_TARGET(LIST_VIEW_CHILDREN, "listview>row");
341 DEFINE_STYLE_CLASS_TARGET(LIST_VIEW_SELECTED, "listview>row:selected");
342 DEFINE_STYLE_CLASS_TARGET(LIST_VIEW_NOT_SELECTED, "listview>row:not(:selected)");
346 DEFINE_STYLE_CLASS_TARGET(MENU_BAR, "menubar");
347 DEFINE_STYLE_CLASS_TARGET(MENU_BAR_ITEM, "menubar>item");
348 DEFINE_STYLE_CLASS_TARGET(MENU_BAR_DISABLED_ITEM, "menubar>item:disabled");
349 DEFINE_STYLE_CLASS_TARGET(MENU_BAR_SELECTED_ITEM, "menubar>item:selected");
353 DEFINE_STYLE_CLASS_TARGET(NOTEBOOK, "notebook");
354 DEFINE_STYLE_CLASS_TARGET(NOTEBOOK_TABS, "notebook>header>tabs>tab")
355 DEFINE_STYLE_CLASS_TARGET(NOTEBOOK_SELECTED_TAB, "notebook>header>tabs>tab:checked")
359 DEFINE_STYLE_CLASS_TARGET(OVERLAY, "overlay");
363 DEFINE_STYLE_CLASS_TARGET(PANED, "paned");
364 DEFINE_STYLE_CLASS_TARGET(PANED_HANDLE, "paned>separator");
365 DEFINE_STYLE_CLASS_TARGET(PANED_START_CHILD, "paned>*:first-child");
366 DEFINE_STYLE_CLASS_TARGET(PANED_END_CHILD, "paned>*:last-child");
370 DEFINE_STYLE_CLASS_TARGET(POPOVER, "popover>contents");
371 DEFINE_STYLE_CLASS_TARGET(POPOVER_ARROW, "popover>arrow");
375 DEFINE_STYLE_CLASS_TARGET(POPOVER_BUTTON, "menubutton");
376 DEFINE_STYLE_CLASS_TARGET(POPOVER_BUTTON_INDICATOR, "menubutton>button arrow");
380 DEFINE_STYLE_CLASS_TARGET(POPOVER_MENU, "popover.menu>contents");
381 DEFINE_STYLE_CLASS_TARGET(POPOVER_MENU_ARROW, "popover.menu>arrow");
385 DEFINE_STYLE_CLASS_TARGET(POPUP_MESSAGE_OVERLAY, "toastoverlay");
386 DEFINE_STYLE_CLASS_TARGET(POPUP_MESSAGE_OVERLAY_POPUP_MESSAGE, "toastoverlay>toast")
387 DEFINE_STYLE_CLASS_TARGET(POPUP_MESSAGE_OVERLAY_POPUP_MESSAGE_CONTENT, "toastoverlay>toast>widget")
388 DEFINE_STYLE_CLASS_TARGET(POPUP_MESSAGE_OVERLAY_POPUP_MESSAGE_ACTION_BUTTON, "toastoverlay>toast>button")
389 DEFINE_STYLE_CLASS_TARGET(POPUP_MESSAGE_OVERLAY_POPUP_MESSAGE_CLOSE_BUTTON, "toastoverlay>toast>button.circular.
float")
393 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR, "progressbar>trough>progress");
394 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR_EMPTY, "progressbar>trough.empty");
395 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR_FULL, "progressbar>trough.full>progress");
396 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR_TROUGH, "progressbar>trough");
397 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR_TEXT, "progressbar>text");
398 DEFINE_STYLE_CLASS_TARGET(PROGRESS_BAR_DURING_PULSE, "progressbar>progressbar progress.pulse");
406 DEFINE_STYLE_CLASS_TARGET(REVEALER, "revealer");
410 DEFINE_STYLE_CLASS_TARGET(SCALE, "scale");
411 DEFINE_STYLE_CLASS_TARGET(SCALE_TROUGH, "scale>trough");
412 DEFINE_STYLE_CLASS_TARGET(SCALE_TROUGH_FILL, "scale>trough>highlight");
413 DEFINE_STYLE_CLASS_TARGET(SCALE_SLIDER, "scale>trough>slider");
414 DEFINE_STYLE_CLASS_TARGET(SCALE_VALUE_TEXT, "scale>value");
418 DEFINE_STYLE_CLASS_TARGET(SCROLLBAR, "scrollbar");
419 DEFINE_STYLE_CLASS_TARGET(SCROLLBAR_TROUGH, "scrollbar>range>trough");
420 DEFINE_STYLE_CLASS_TARGET(SCOLLBAR_SLIDER, "scrollbar>range>trough>slider");
424 DEFINE_STYLE_CLASS_TARGET(SEPARATOR, "separator");
428 DEFINE_STYLE_CLASS_TARGET(SPIN_BUTTON, "spinbutton");
429 DEFINE_STYLE_CLASS_TARGET(SPIN_BUTTON_TEXT, "spinbutton>text");
430 DEFINE_STYLE_CLASS_TARGET(SPIN_BUTTON_BUTTON_INCREASE, "spinbutton>button.up");
431 DEFINE_STYLE_CLASS_TARGET(SPIN_BUTTON_BUTTON_DECREASE, "spinbutton>button.down");
435 DEFINE_STYLE_CLASS_TARGET(SPINNER, "spinner:checked");
439 DEFINE_STYLE_CLASS_TARGET(STACK, "stack");
443 DEFINE_STYLE_CLASS_TARGET(STACK_SWITCHER, "stackswitcher");
447 DEFINE_STYLE_CLASS_TARGET(STACK_SIDEBAR, "stacksidebar");
451 DEFINE_STYLE_CLASS_TARGET(SWITCH, "switch");
452 DEFINE_STYLE_CLASS_TARGET(SWITCH_SLIDER, "switch>slider");
453 DEFINE_STYLE_CLASS_TARGET(SWITCH_NOT_ACTIVE, "switch:not(:checked)");
454 DEFINE_STYLE_CLASS_TARGET(SWITCH_ACTIVE, "switch:checked");
458 DEFINE_STYLE_CLASS_TARGET(TEXT_VIEW, "textview");
459 DEFINE_STYLE_CLASS_TARGET(TEXT_VIEW_TEXT, "textview>text");
464 DEFINE_STYLE_CLASS_TARGET(TRANSFORM_BIN, "transformbin");
468 DEFINE_STYLE_CLASS_TARGET(TOGGLE_BUTTON, "button.toggle");
469 DEFINE_STYLE_CLASS_TARGET(TOGGLE_BUTTON_ACTIVE, "button.toggle:checked");
470 DEFINE_STYLE_CLASS_TARGET(TOGGLE_BUTTON_NOT_ACTIVE, "button.toggle:not(:checked)");
474 DEFINE_STYLE_CLASS_TARGET(VIEWPORT, "scrolledwindow");
475 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_HORIZONTAL_SCROLLBAR, "scrolledwindow>scrollbar.horizontal");
476 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_HORIZONTAL_SCROLLBAR_TROUGH, "scrolledwindow>scrollbar.horizontal>range>trough");
477 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_HORIZONTAL_SCROLLBAR_SLIDER, "scrolledwindow>scrollbar.horizontal>range>trough>slider");
478 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_VERTICAL_SCROLLBAR, "scrolledwindow>scrollbar.vertical");
479 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_VERTICAL_SCROLLBAR_TROUGH, "scrolledwindow>scrollbar.vertical>range>trough");
480 DEFINE_STYLE_CLASS_TARGET(VIEWPORT_VERTICAL_SCROLLBAR_SLIDER, "scrolledwindow>scrollbar.vertical>range>trough>slider");
484 DEFINE_STYLE_CLASS_TARGET(WINDOW, "window");
488 DEFINE_STYLE_CLASS_TARGET(WIDGET, "widget");
491 DEFINE_STYLE_CLASS_TARGET(TEXT_ENTRY, "text");
492 DEFINE_STYLE_CLASS_TARGET(TEXT_SELECTION, "selection");
class that collects css information
Definition: style_manager.hpp:84
~StyleClass()
destructor
Definition: style_manager.cpp:171
std::string get_name() const
get unique name
Definition: style_manager.cpp:196
std::string serialize() const
export as string
Definition: style_manager.cpp:181
std::string get_property(StyleClassTarget target, const std::string &property) const
get property of target
Definition: style_manager.cpp:215
void set_property(StyleClassTarget target, const std::string &property, const std::string &value)
set property of target
Definition: style_manager.cpp:201
color representation in HSVA
Definition: color.hpp:76
color representation in RGBA
Definition: color.hpp:24
style class manager singleton, keeps the global list of style classes updated
Definition: style_manager.hpp:35
static StyleClass get_style_class(const std::string &)
retrieve style class
Definition: style_manager.cpp:100
static std::string color_to_css(RGBA)
convert mousetrap color to css
Definition: style_manager.cpp:126
static void remove_style_class(const StyleClass &)
remove style class
Definition: style_manager.cpp:90
static void add_style_class(const StyleClass &)
update / add a style class
Definition: style_manager.cpp:65
static void add_css(const std::string &)
run arbitrary css code
Definition: style_manager.cpp:114
static std::string define_color(const std::string &name, RGBA color)
define a color, can be used by prefixing the given name with @
Definition: style_manager.cpp:143