#ifndef XTC_GUI_THEME_HPP #define XTC_GUI_THEME_HPP #include #include #include #include #include #include #include /* Shared flat palette. No gradients, shadows, textures or external assets. */ namespace xtc_ui { constexpr Fl_Boxtype flat = static_cast(FL_FREE_BOXTYPE); constexpr Fl_Boxtype pressed = static_cast(FL_FREE_BOXTYPE+1); inline Fl_Color background() { return fl_rgb_color(25,28,33); } inline Fl_Color panel() { return fl_rgb_color(34,38,44); } inline Fl_Color border() { return fl_rgb_color(58,64,73); } inline Fl_Color text() { return fl_rgb_color(231,235,240); } inline Fl_Color muted() { return fl_rgb_color(163,174,188); } inline Fl_Color accent() { return fl_rgb_color(92,211,184); } inline Fl_Color track(uint64_t id) { static const unsigned char colors[][3] = {{74,155,184},{111,143,206},{160,123,191}, {74,163,139},{191,145,78},{183,113,139}}; const auto &c = colors[id % 6]; return fl_rgb_color(c[0],c[1],c[2]); } inline void flat_box(int x, int y, int w, int h, Fl_Color color) { fl_color(color); fl_rectf(x,y,w,h); fl_color(border()); fl_rect(x,y,w,h); } inline void pressed_box(int x, int y, int w, int h, Fl_Color color) { flat_box(x,y,w,h,fl_darker(color)); } inline void configure_boxes() { Fl::set_boxtype(flat,flat_box,1,1,2,2); Fl::set_boxtype(pressed,pressed_box,1,1,2,2); Fl::set_boxtype(FL_UP_BOX,flat_box,1,1,2,2); Fl::set_boxtype(FL_DOWN_BOX,pressed_box,1,1,2,2); Fl::set_boxtype(FL_THIN_UP_BOX,flat_box,1,1,2,2); Fl::set_boxtype(FL_THIN_DOWN_BOX,pressed_box,1,1,2,2); Fl::set_boxtype(FL_ENGRAVED_BOX,flat_box,1,1,2,2); Fl::set_boxtype(FL_BORDER_BOX,flat_box,1,1,2,2); } inline void initialize() { static bool initialized = false; if (initialized) return; initialized = true; Fl::background(34,38,44); Fl::background2(25,28,33); Fl::foreground(231,235,240); Fl::set_color(FL_SELECTION_COLOR,53,116,111); configure_boxes(); Fl::scrollbar_size(12); } inline void style(Fl_Widget *widget) { widget->labelfont(FL_HELVETICA); widget->labelsize(12); widget->labelcolor(text()); widget->color(panel()); widget->selection_color(fl_rgb_color(53,116,111)); if (widget->box() != FL_NO_BOX && widget->box() != FL_FLAT_BOX) widget->box(flat); if (auto *button = dynamic_cast(widget)) { button->box(flat); button->down_box(pressed); button->color(fl_rgb_color(45,51,59)); } if (auto *group = dynamic_cast(widget)) { for (int i = 0; i < group->children(); ++i) style(group->child(i)); if (auto *scroll = dynamic_cast(group)) { scroll->scrollbar.box(flat); scroll->hscrollbar.box(flat); scroll->scrollbar.slider(FL_FLAT_BOX); scroll->hscrollbar.slider(FL_FLAT_BOX); } } } } #endif