inLimbo
TUI Music Player that keeps you in Limbo.
 
Loading...
Searching...
No Matches
colors.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <ftxui/screen/color.hpp>
5#include <iostream>
6#include <regex>
7#include <string>
8#include <unordered_map>
9
10using namespace ftxui;
11
12namespace TrueColors
13{
14
22
69
76auto GetColor(Color color) -> ftxui::Color
77{
78 switch (color)
79 {
80 case Color::Black:
81 return ftxui::Color::RGB(0, 0, 0);
82 case Color::White:
83 return ftxui::Color::RGB(255, 255, 255);
84 case Color::Red:
85 return ftxui::Color::RGB(255, 0, 0);
86 case Color::LightRed:
87 return ftxui::Color::RGB(255, 102, 102);
88 case Color::Green:
89 return ftxui::Color::RGB(0, 255, 0);
91 return ftxui::Color::RGB(144, 238, 144);
92 case Color::Blue:
93 return ftxui::Color::RGB(0, 0, 255);
95 return ftxui::Color::RGB(173, 216, 230);
96 case Color::Yellow:
97 return ftxui::Color::RGB(255, 255, 0);
99 return ftxui::Color::RGB(255, 255, 153);
100 case Color::Cyan:
101 return ftxui::Color::RGB(0, 255, 255);
102 case Color::LightCyan:
103 return ftxui::Color::RGB(224, 255, 255);
104 case Color::Magenta:
105 return ftxui::Color::RGB(255, 0, 255);
107 return ftxui::Color::RGB(255, 153, 255);
108 case Color::Gray:
109 return ftxui::Color::RGB(128, 128, 128);
110 case Color::LightGray:
111 return ftxui::Color::RGB(211, 211, 211);
112 case Color::DarkGray:
113 return ftxui::Color::RGB(64, 64, 64);
114 case Color::Orange:
115 return ftxui::Color::RGB(255, 165, 0);
117 return ftxui::Color::RGB(255, 200, 124);
118 case Color::Purple:
119 return ftxui::Color::RGB(128, 0, 128);
121 return ftxui::Color::RGB(216, 191, 216);
122 case Color::Pink:
123 return ftxui::Color::RGB(255, 192, 203);
124 case Color::LightPink:
125 return ftxui::Color::RGB(255, 182, 193);
126 case Color::Teal:
127 return ftxui::Color::RGB(0, 128, 128);
128 case Color::LightTeal:
129 return ftxui::Color::RGB(144, 224, 224);
130 case Color::SkyBlue:
131 return ftxui::Color::RGB(135, 206, 235);
132 case Color::Coral:
133 return ftxui::Color::RGB(255, 127, 80);
134 case Color::Lime:
135 return ftxui::Color::RGB(191, 255, 0);
136 case Color::Lavender:
137 return ftxui::Color::RGB(230, 230, 250);
138 case Color::Crimson:
139 return ftxui::Color::RGB(220, 20, 60);
140 case Color::Gold:
141 return ftxui::Color::RGB(255, 215, 0);
142 case Color::Indigo:
143 return ftxui::Color::RGB(75, 0, 130);
144 case Color::Mint:
145 return ftxui::Color::RGB(152, 255, 152);
146 case Color::Navy:
147 return ftxui::Color::RGB(0, 0, 128);
148 case Color::Peach:
149 return ftxui::Color::RGB(255, 218, 185);
150 case Color::Sand:
151 return ftxui::Color::RGB(244, 164, 96);
152 case Color::SeaGreen:
153 return ftxui::Color::RGB(46, 139, 87);
155 return ftxui::Color::RGB(152, 255, 204);
156 case Color::SlateBlue:
157 return ftxui::Color::RGB(106, 90, 205);
159 return ftxui::Color::RGB(176, 196, 222);
161 return ftxui::Color::RGB(255, 99, 71);
162 case Color::Turquoise:
163 return ftxui::Color::RGB(64, 224, 208);
165 return ftxui::Color::RGB(175, 238, 238);
166 }
167 return ftxui::Color::RGB(0, 0, 0); // Default to black
168}
169
170} // namespace TrueColors
171
180
182{
185 ftxui::Color album_name_bg;
186 ftxui::Color album_name_fg;
187 ftxui::Color menu_cursor_bg;
189 ftxui::Color artists_title_bg;
190 ftxui::Color artists_title_fg;
192 ftxui::Color songs_title_bg;
193 ftxui::Color songs_title_fg;
195 ftxui::Color song_queue_menu_fg;
198 ftxui::Color volume_bar_col;
199 ftxui::Color status_bar_bg;
204};
205
213
214auto parseHexColor(const std::string& hex) -> ftxui::Color
215{
216 // Validate hex format
217 std::regex hex_regex("^#([0-9a-fA-F]{6})$"); // Matches #RRGGBB
218 std::smatch match;
219
220 if (!std::regex_match(hex, match, hex_regex))
221 {
222 std::cerr << "Error: Invalid hexadecimal color format: '" << hex
223 << "'. Use a string like `#RRGGBB`." << std::endl;
224 std::exit(EXIT_FAILURE);
225 }
226
227 // Extract RGB components from the validated hex string
228 int r = std::stoi(hex.substr(1, 2), nullptr, 16);
229 int g = std::stoi(hex.substr(3, 2), nullptr, 16);
230 int b = std::stoi(hex.substr(5, 2), nullptr, 16);
231
232 return ftxui::Color::RGB(r, g, b);
233}
234
242auto parseColor(const std::string& color_name, const std::string& color_field,
243 bool verbose_logging) -> ftxui::Color
244{
245 if (color_name[0] == '#')
246 {
247 if (verbose_logging)
248 {
249 std::cout << "[COLORS] Parsing HEX color: " << color_name << " for field: " << color_field
250 << std::endl;
251 }
252 return parseHexColor(color_name);
253 }
254
255 auto reportError = [](const std::string& field, const std::string_view& key)
256 {
257 std::cerr << "** Error: ⚠ Unsupported or empty color '" << key << "' detected for field '"
258 << field << "'. Modify or remove that color field. **" << std::endl;
259 std::exit(EXIT_FAILURE);
260 };
261
262 static const std::unordered_map<std::string, ftxui::Color> color_map = {
306
307 auto it = color_map.find(color_name);
308 if (it != color_map.end())
309 {
310 if (verbose_logging)
311 {
312 std::cout << "[COLORS] Parsing predefined color **" << color_name
313 << "** for field: " << color_field << std::endl;
314 }
315 return it->second;
316 }
317
318 reportError(color_field, color_name);
319 std::exit(EXIT_FAILURE);
320}
321
328{
329 InLimboColors colors;
330
331 // Mapping of fields in the InLimboColors struct
332 const std::unordered_map<std::string, ftxui::Color*> field_map = {
333 {"active_win_border_color", &colors.active_win_border_color},
334 {"inactive_win_border_color", &colors.inactive_win_border_color},
335 {"album_name_bg", &colors.album_name_bg},
336 {"album_name_fg", &colors.album_name_fg},
337 {"menu_cursor_bg", &colors.menu_cursor_bg},
338 {"inactive_menu_cursor_bg", &colors.inactive_menu_cursor_bg},
339 {"artists_title_bg", &colors.artists_title_bg},
340 {"artists_title_fg", &colors.artists_title_fg},
341 {"artists_menu_col_bg", &colors.artists_menu_col_bg},
342 {"songs_title_bg", &colors.songs_title_bg},
343 {"songs_title_fg", &colors.songs_title_fg},
344 {"song_queue_menu_bor_col", &colors.song_queue_menu_bor_col},
345 {"song_queue_menu_fg", &colors.song_queue_menu_fg},
346 {"progress_bar_playing_col", &colors.progress_bar_playing_col},
347 {"progress_bar_not_playing_col", &colors.progress_bar_not_playing_col},
348 {"volume_bar_col", &colors.volume_bar_col},
349 {"status_bar_bg", &colors.status_bar_bg},
350 {"status_bar_artist_col", &colors.status_bar_artist_col},
351 {"status_bar_song_col", &colors.status_bar_song_col},
352 {"status_bar_addn_info_col", &colors.status_bar_addn_info_col},
353 {"curr_playing_song_col", &colors.curr_playing_song_col}
354
355 };
356
358
359 if (verbose_logging)
360 {
361 cout << "[COLORS] Parsing Colors in config.toml ...." << endl;
362 }
363
364 for (const auto& [field, member_color] : field_map)
365 {
366 std::string color_name = std::string(parseTOMLField(PARENT_COLORS, field));
367 *member_color = parseColor(color_name, field, verbose_logging);
368 }
369
370 return colors;
371}
auto parseHexColor(const std::string &hex) -> ftxui::Color
Parses a hexadecimal color string into an ftxui::Color::RGB value.
Definition colors.hpp:214
auto parseColor(const std::string &color_name, const std::string &color_field, bool verbose_logging) -> ftxui::Color
Parses a color name or hex value into an ftxui::Color.
Definition colors.hpp:242
auto parseColors() -> InLimboColors
Parses colors from a TOML configuration into an InLimboColors struct.
Definition colors.hpp:327
Definition colors.hpp:13
auto GetColor(Color color) -> ftxui::Color
Maps a predefined color enum to its corresponding ftxui::Color::RGB value.
Definition colors.hpp:76
Color
Enumeration for predefined true colors.
Definition colors.hpp:24
@ Cyan
Definition colors.hpp:35
@ LightSlateBlue
Definition colors.hpp:64
@ Navy
Definition colors.hpp:58
@ White
Definition colors.hpp:26
@ Crimson
Definition colors.hpp:54
@ SeaGreen
Definition colors.hpp:61
@ LightSeaGreen
Definition colors.hpp:62
@ SunsetOrange
Definition colors.hpp:65
@ LightTeal
Definition colors.hpp:49
@ LightOrange
Definition colors.hpp:43
@ LightBlue
Definition colors.hpp:32
@ Yellow
Definition colors.hpp:33
@ Peach
Definition colors.hpp:59
@ Coral
Definition colors.hpp:51
@ LightGreen
Definition colors.hpp:30
@ Indigo
Definition colors.hpp:56
@ Pink
Definition colors.hpp:46
@ Orange
Definition colors.hpp:42
@ DarkGray
Definition colors.hpp:41
@ Blue
Definition colors.hpp:31
@ Gold
Definition colors.hpp:55
@ Gray
Definition colors.hpp:39
@ Magenta
Definition colors.hpp:37
@ Purple
Definition colors.hpp:44
@ LightPink
Definition colors.hpp:47
@ SlateBlue
Definition colors.hpp:63
@ LightCyan
Definition colors.hpp:36
@ Mint
Definition colors.hpp:57
@ SkyBlue
Definition colors.hpp:50
@ Sand
Definition colors.hpp:60
@ Green
Definition colors.hpp:29
@ Turquoise
Definition colors.hpp:66
@ Teal
Definition colors.hpp:48
@ Lavender
Definition colors.hpp:53
@ LightTurquoise
Definition colors.hpp:67
@ Black
Definition colors.hpp:25
@ Red
Definition colors.hpp:27
@ LightMagenta
Definition colors.hpp:38
@ LightRed
Definition colors.hpp:28
@ LightYellow
Definition colors.hpp:34
@ LightGray
Definition colors.hpp:40
@ Lime
Definition colors.hpp:52
@ LightPurple
Definition colors.hpp:45
Definition image_view.cpp:17
Represents a collection of colors used in the application.
Definition colors.hpp:182
ftxui::Color status_bar_bg
Definition colors.hpp:199
ftxui::Color volume_bar_col
Definition colors.hpp:198
ftxui::Color status_bar_artist_col
Definition colors.hpp:200
ftxui::Color progress_bar_not_playing_col
Definition colors.hpp:197
ftxui::Color inactive_menu_cursor_bg
Definition colors.hpp:188
ftxui::Color active_win_border_color
Definition colors.hpp:183
ftxui::Color songs_title_fg
Definition colors.hpp:193
ftxui::Color progress_bar_playing_col
Definition colors.hpp:196
ftxui::Color album_name_bg
Definition colors.hpp:185
ftxui::Color inactive_win_border_color
Definition colors.hpp:184
ftxui::Color menu_cursor_bg
Definition colors.hpp:187
ftxui::Color album_name_fg
Definition colors.hpp:186
ftxui::Color song_queue_menu_fg
Definition colors.hpp:195
ftxui::Color songs_title_bg
Definition colors.hpp:192
ftxui::Color artists_menu_col_bg
Definition colors.hpp:191
ftxui::Color artists_title_bg
Definition colors.hpp:189
ftxui::Color status_bar_addn_info_col
Definition colors.hpp:202
ftxui::Color status_bar_song_col
Definition colors.hpp:201
ftxui::Color curr_playing_song_col
Definition colors.hpp:203
ftxui::Color artists_title_fg
Definition colors.hpp:190
ftxui::Color song_queue_menu_bor_col
Definition colors.hpp:194
#define PARENT_DBG
Definition toml_parser.hpp:25
#define PARENT_DBG_FIELD_COLORS_PARSER_LOG
Definition toml_parser.hpp:28
auto parseTOMLFieldBool(const string &parent, const string &field) -> bool
Definition toml_parser.hpp:202
auto parseTOMLField(string parent, string field) -> string_view
Parses a string field from the TOML configuration.
Definition toml_parser.hpp:144
#define PARENT_COLORS
Definition toml_parser.hpp:37