ttx 0.1.0
Loading...
Searching...
No Matches
palette.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/types/byte.h"
4#include "di/util/to_underlying.h"
5#include "di/vocab/array/array.h"
7
8namespace ttx::terminal {
10enum class ThemeMode {
13};
14
15constexpr static auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<ThemeMode>) {
16 using enum ThemeMode;
17 return di::make_enumerators<"ThemeMode">(di::enumerator<"light", Light>, di::enumerator<"dark", Dark>);
18}
19
49
50constexpr static auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<PaletteIndex>) {
51 using enum PaletteIndex;
52 return di::make_enumerators<"PaletteIndex">(
53 di::enumerator<"SpecialBold", SpecialBold>, di::enumerator<"SpecialUnderline", SpecialUnderline>,
54 di::enumerator<"SpecialBlink", SpecialBlink>, di::enumerator<"SpecialReverse", SpecialReverse>,
55 di::enumerator<"SpecialItalic", SpecialItalic>, di::enumerator<"Foreground", Foreground>,
56 di::enumerator<"Background", Background>, di::enumerator<"Cursor", Cursor>,
57 di::enumerator<"CursorText", CursorText>, di::enumerator<"SelectionBackground", SelectionBackground>,
58 di::enumerator<"SelectionForeground", SelectionForeground>, di::enumerator<"Unknown", Unknown>);
59}
60
69class Palette {
70public:
77
78 auto operator==(Palette const&) const -> bool = default;
79
80 auto get(PaletteIndex index) const -> Color { return m_colors[di::to_underlying(index)]; }
81 void set(PaletteIndex index, Color value) {
82 if (value.is_dynamic() && !supports_dynamic(index)) {
83 return;
84 }
85 if (!value.is_default()) {
86 m_modified = true;
87 }
88 m_colors[di::to_underlying(index)] = value;
89 }
90
91 auto resolve(Color color) const -> Color {
92 if (color.is_palette()) {
93 return get(PaletteIndex(color.r)).value_or(color);
94 }
95 return color;
96 }
97
98 auto resolve_foreground(Color color) const -> Color {
99 color = resolve(color);
100 if (color.is_default()) {
102 }
103 return color;
104 }
105
106 auto resolve_background(Color color) const -> Color {
107 color = resolve(color);
108 if (color.is_default()) {
110 }
111 return color;
112 }
113
114 static auto supports_dynamic(PaletteIndex index) -> bool {
115 switch (index) {
120 return true;
121 default:
122 return false;
123 }
124 }
125
126 void reset() {
127 m_colors = {};
128 m_modified = false;
129 }
130
131 auto modified() const -> bool { return m_modified; }
132 void maybe_clear_modifed() { m_modified = di::any_of(m_colors, di::not_fn(&Color::is_default)); }
133
134 auto theme_mode() const -> ThemeMode {
135 return resolve_background(Color()).brightness() >= 0.5 ? ThemeMode::Light : ThemeMode::Dark;
136 }
137
138 auto to_string() const -> di::String;
139
140private:
141 di::Array<Color, di::to_underlying(PaletteIndex::Count)> m_colors;
142 bool m_modified { false };
143};
144}
Definition palette.h:69
auto resolve(Color color) const -> Color
Definition palette.h:91
auto get(PaletteIndex index) const -> Color
Definition palette.h:80
static auto supports_dynamic(PaletteIndex index) -> bool
Definition palette.h:114
void maybe_clear_modifed()
Definition palette.h:132
auto modified() const -> bool
Definition palette.h:131
auto theme_mode() const -> ThemeMode
Definition palette.h:134
static auto default_global() -> Palette
Definition palette.h:71
auto resolve_foreground(Color color) const -> Color
Definition palette.h:98
auto operator==(Palette const &) const -> bool=default
auto resolve_background(Color color) const -> Color
Definition palette.h:106
void set(PaletteIndex index, Color value)
Definition palette.h:81
auto to_string() const -> di::String
Definition palette.cpp:6
void reset()
Definition palette.h:126
Definition absolute_position.h:6
PaletteIndex
Extended palette index which includes dynamic colors.
Definition palette.h:27
@ CursorText
Definition palette.h:42
@ StaticEnd
Definition palette.h:29
@ Foreground
Definition palette.h:39
@ StaticBegin
Definition palette.h:28
@ SelectionForeground
Definition palette.h:44
@ SpecialBold
Definition palette.h:32
@ SpecialItalic
Definition palette.h:36
@ SpecialEnd
Definition palette.h:37
@ SpecialBegin
Definition palette.h:31
@ SpecialReverse
Definition palette.h:35
@ Cursor
Definition palette.h:41
@ Background
Definition palette.h:40
@ SelectionBackground
Definition palette.h:43
@ SpecialUnderline
Definition palette.h:33
@ Count
Definition palette.h:46
@ SpecialBlink
Definition palette.h:34
constexpr auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Color::Type >)
Definition color.h:92
@ Unknown
Terminal doesn't know this mode.
Definition mode.h:184
ThemeMode
Theme mode (light or dark).
Definition palette.h:10
@ Light
Definition palette.h:11
@ Dark
Definition palette.h:12
Definition color.h:10
auto is_dynamic() const
Compute the perceived brightness of a color.
Definition color.h:55
auto is_default() const
Definition color.h:52
@ Dynamic
Color is dynamic (e.g. for selection use reverse video).
Definition color.h:17
Represents the current cursor position of the terminal.
Definition cursor.h:8