mirror of
https://github.com/ratspeak/ratdeck.git
synced 2026-10-11 12:17:20 +00:00
227 lines
9.3 KiB
C++
227 lines
9.3 KiB
C++
#include "LvTheme.h"
|
|
#include "Theme.h"
|
|
#include <Arduino.h>
|
|
#include "fonts/fonts.h"
|
|
|
|
namespace LvTheme {
|
|
|
|
// Existing styles (16)
|
|
static lv_style_t s_screen;
|
|
static lv_style_t s_label;
|
|
static lv_style_t s_labelMuted;
|
|
static lv_style_t s_labelAccent;
|
|
static lv_style_t s_btn;
|
|
static lv_style_t s_btnPressed;
|
|
static lv_style_t s_bar;
|
|
static lv_style_t s_barIndicator;
|
|
static lv_style_t s_switch;
|
|
static lv_style_t s_switchChecked;
|
|
static lv_style_t s_textarea;
|
|
static lv_style_t s_list;
|
|
static lv_style_t s_listBtn;
|
|
static lv_style_t s_listBtnFocused;
|
|
static lv_style_t s_dropdown;
|
|
static lv_style_t s_slider;
|
|
|
|
// New styles (6)
|
|
static lv_style_t s_btnFocused;
|
|
static lv_style_t s_textareaFocused;
|
|
static lv_style_t s_sectionHeader;
|
|
static lv_style_t s_modal;
|
|
static lv_style_t s_scrollbar;
|
|
static lv_style_t s_roller;
|
|
|
|
void init(lv_disp_t* disp) {
|
|
// Screen background (LV_USE_THEME_DEFAULT is disabled in lv_conf.h,
|
|
// so there's no default blue focus outline to worry about)
|
|
lv_style_init(&s_screen);
|
|
lv_style_set_bg_color(&s_screen, lv_color_hex(Theme::BG));
|
|
lv_style_set_bg_opa(&s_screen, LV_OPA_COVER);
|
|
lv_style_set_text_color(&s_screen, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_text_font(&s_screen, &lv_font_ratdeck_14);
|
|
|
|
// Labels
|
|
lv_style_init(&s_label);
|
|
lv_style_set_text_color(&s_label, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
|
|
lv_style_init(&s_labelMuted);
|
|
lv_style_set_text_color(&s_labelMuted, lv_color_hex(Theme::TEXT_SECONDARY));
|
|
|
|
lv_style_init(&s_labelAccent);
|
|
lv_style_set_text_color(&s_labelAccent, lv_color_hex(Theme::ACCENT));
|
|
|
|
// Buttons
|
|
lv_style_init(&s_btn);
|
|
lv_style_set_bg_color(&s_btn, lv_color_hex(Theme::BG_ELEVATED));
|
|
lv_style_set_bg_opa(&s_btn, LV_OPA_COVER);
|
|
lv_style_set_border_color(&s_btn, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_border_width(&s_btn, 1);
|
|
lv_style_set_text_color(&s_btn, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_radius(&s_btn, 4);
|
|
lv_style_set_pad_all(&s_btn, 8);
|
|
|
|
lv_style_init(&s_btnPressed);
|
|
lv_style_set_bg_color(&s_btnPressed, lv_color_hex(Theme::PRIMARY_SUBTLE));
|
|
lv_style_set_border_color(&s_btnPressed, lv_color_hex(Theme::PRIMARY));
|
|
lv_style_set_border_width(&s_btnPressed, 1);
|
|
lv_style_set_text_color(&s_btnPressed, lv_color_hex(Theme::ACCENT));
|
|
|
|
lv_style_init(&s_btnFocused);
|
|
lv_style_set_border_color(&s_btnFocused, lv_color_hex(Theme::PRIMARY));
|
|
lv_style_set_border_width(&s_btnFocused, 2);
|
|
|
|
// Bar
|
|
lv_style_init(&s_bar);
|
|
lv_style_set_bg_color(&s_bar, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_bg_opa(&s_bar, LV_OPA_COVER);
|
|
lv_style_set_radius(&s_bar, 3);
|
|
|
|
lv_style_init(&s_barIndicator);
|
|
lv_style_set_bg_color(&s_barIndicator, lv_color_hex(Theme::PRIMARY));
|
|
lv_style_set_bg_opa(&s_barIndicator, LV_OPA_COVER);
|
|
lv_style_set_radius(&s_barIndicator, 3);
|
|
|
|
// Switch (LV_USE_SWITCH currently 0; kept for future lv_menu rewrite)
|
|
lv_style_init(&s_switch);
|
|
lv_style_set_bg_color(&s_switch, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_bg_opa(&s_switch, LV_OPA_COVER);
|
|
lv_style_set_radius(&s_switch, LV_RADIUS_CIRCLE);
|
|
|
|
lv_style_init(&s_switchChecked);
|
|
lv_style_set_bg_color(&s_switchChecked, lv_color_hex(Theme::PRIMARY));
|
|
|
|
// Textarea
|
|
lv_style_init(&s_textarea);
|
|
lv_style_set_bg_color(&s_textarea, lv_color_hex(Theme::BG_ELEVATED));
|
|
lv_style_set_bg_opa(&s_textarea, LV_OPA_COVER);
|
|
lv_style_set_border_color(&s_textarea, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_border_width(&s_textarea, 1);
|
|
lv_style_set_text_color(&s_textarea, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_radius(&s_textarea, 4);
|
|
lv_style_set_pad_all(&s_textarea, 6);
|
|
|
|
lv_style_init(&s_textareaFocused);
|
|
lv_style_set_border_color(&s_textareaFocused, lv_color_hex(Theme::PRIMARY));
|
|
lv_style_set_border_width(&s_textareaFocused, 1);
|
|
|
|
// List container
|
|
lv_style_init(&s_list);
|
|
lv_style_set_bg_color(&s_list, lv_color_hex(Theme::BG));
|
|
lv_style_set_bg_opa(&s_list, LV_OPA_COVER);
|
|
lv_style_set_pad_all(&s_list, 0);
|
|
lv_style_set_pad_row(&s_list, 0);
|
|
lv_style_set_border_width(&s_list, 0);
|
|
|
|
// List items
|
|
lv_style_init(&s_listBtn);
|
|
lv_style_set_bg_color(&s_listBtn, lv_color_hex(Theme::BG));
|
|
lv_style_set_bg_opa(&s_listBtn, LV_OPA_COVER);
|
|
lv_style_set_text_color(&s_listBtn, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_border_color(&s_listBtn, lv_color_hex(Theme::DIVIDER));
|
|
lv_style_set_border_width(&s_listBtn, 1);
|
|
lv_style_set_border_side(&s_listBtn, LV_BORDER_SIDE_BOTTOM);
|
|
lv_style_set_pad_all(&s_listBtn, 6);
|
|
lv_style_set_pad_left(&s_listBtn, 8);
|
|
lv_style_set_radius(&s_listBtn, 0);
|
|
|
|
// List item focused — left-bar indicator + hover background
|
|
lv_style_init(&s_listBtnFocused);
|
|
lv_style_set_bg_color(&s_listBtnFocused, lv_color_hex(Theme::BG_HOVER));
|
|
lv_style_set_bg_opa(&s_listBtnFocused, LV_OPA_COVER);
|
|
lv_style_set_text_color(&s_listBtnFocused, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_border_color(&s_listBtnFocused, lv_color_hex(Theme::PRIMARY));
|
|
lv_style_set_border_width(&s_listBtnFocused, 2);
|
|
lv_style_set_border_side(&s_listBtnFocused, LV_BORDER_SIDE_LEFT);
|
|
|
|
// Dropdown
|
|
lv_style_init(&s_dropdown);
|
|
lv_style_set_bg_color(&s_dropdown, lv_color_hex(Theme::BG_ELEVATED));
|
|
lv_style_set_bg_opa(&s_dropdown, LV_OPA_COVER);
|
|
lv_style_set_border_color(&s_dropdown, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_border_width(&s_dropdown, 1);
|
|
lv_style_set_text_color(&s_dropdown, lv_color_hex(Theme::TEXT_PRIMARY));
|
|
lv_style_set_radius(&s_dropdown, 4);
|
|
lv_style_set_pad_all(&s_dropdown, 4);
|
|
|
|
// Slider
|
|
lv_style_init(&s_slider);
|
|
lv_style_set_bg_color(&s_slider, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_bg_opa(&s_slider, LV_OPA_COVER);
|
|
lv_style_set_radius(&s_slider, 3);
|
|
|
|
// Section header (for list section dividers like "Contacts (3)")
|
|
lv_style_init(&s_sectionHeader);
|
|
lv_style_set_bg_opa(&s_sectionHeader, LV_OPA_TRANSP);
|
|
lv_style_set_text_color(&s_sectionHeader, lv_color_hex(Theme::TEXT_SECONDARY));
|
|
lv_style_set_text_font(&s_sectionHeader, &lv_font_ratdeck_10);
|
|
lv_style_set_text_letter_space(&s_sectionHeader, 1);
|
|
lv_style_set_border_color(&s_sectionHeader, lv_color_hex(Theme::DIVIDER));
|
|
lv_style_set_border_width(&s_sectionHeader, 1);
|
|
lv_style_set_border_side(&s_sectionHeader, LV_BORDER_SIDE_BOTTOM);
|
|
lv_style_set_pad_top(&s_sectionHeader, 8);
|
|
lv_style_set_pad_bottom(&s_sectionHeader, 4);
|
|
lv_style_set_pad_left(&s_sectionHeader, 8);
|
|
|
|
// Modal overlay
|
|
lv_style_init(&s_modal);
|
|
lv_style_set_bg_color(&s_modal, lv_color_hex(Theme::BG_SURFACE));
|
|
lv_style_set_bg_opa(&s_modal, LV_OPA_COVER);
|
|
lv_style_set_border_color(&s_modal, lv_color_hex(Theme::BORDER));
|
|
lv_style_set_border_width(&s_modal, 1);
|
|
lv_style_set_radius(&s_modal, 6);
|
|
lv_style_set_pad_all(&s_modal, 12);
|
|
lv_style_set_pad_row(&s_modal, 4);
|
|
lv_style_set_shadow_width(&s_modal, 8);
|
|
lv_style_set_shadow_color(&s_modal, lv_color_hex(0x000000));
|
|
lv_style_set_shadow_opa(&s_modal, LV_OPA_50);
|
|
|
|
// Scrollbar
|
|
lv_style_init(&s_scrollbar);
|
|
lv_style_set_bg_color(&s_scrollbar, lv_color_hex(Theme::TEXT_MUTED));
|
|
lv_style_set_bg_opa(&s_scrollbar, LV_OPA_40);
|
|
lv_style_set_radius(&s_scrollbar, LV_RADIUS_CIRCLE);
|
|
lv_style_set_width(&s_scrollbar, 3);
|
|
lv_style_set_pad_right(&s_scrollbar, 2);
|
|
|
|
// Roller — no border so selected row highlight extends edge-to-edge
|
|
lv_style_init(&s_roller);
|
|
lv_style_set_bg_color(&s_roller, lv_color_hex(Theme::BG));
|
|
lv_style_set_bg_opa(&s_roller, LV_OPA_COVER);
|
|
lv_style_set_text_color(&s_roller, lv_color_hex(Theme::TEXT_SECONDARY));
|
|
lv_style_set_text_font(&s_roller, &lv_font_ratdeck_14);
|
|
lv_style_set_border_width(&s_roller, 0);
|
|
|
|
// Apply screen style to default theme
|
|
lv_obj_add_style(lv_scr_act(), &s_screen, 0);
|
|
|
|
Serial.println("[LVGL] Ratspeak theme initialized");
|
|
}
|
|
|
|
// Existing accessors (16)
|
|
lv_style_t* styleScreen() { return &s_screen; }
|
|
lv_style_t* styleLabel() { return &s_label; }
|
|
lv_style_t* styleLabelMuted() { return &s_labelMuted; }
|
|
lv_style_t* styleLabelAccent() { return &s_labelAccent; }
|
|
lv_style_t* styleBtn() { return &s_btn; }
|
|
lv_style_t* styleBtnPressed() { return &s_btnPressed; }
|
|
lv_style_t* styleBar() { return &s_bar; }
|
|
lv_style_t* styleBarIndicator() { return &s_barIndicator; }
|
|
lv_style_t* styleSwitch() { return &s_switch; }
|
|
lv_style_t* styleSwitchChecked() { return &s_switchChecked; }
|
|
lv_style_t* styleTextarea() { return &s_textarea; }
|
|
lv_style_t* styleList() { return &s_list; }
|
|
lv_style_t* styleListBtn() { return &s_listBtn; }
|
|
lv_style_t* styleListBtnFocused() { return &s_listBtnFocused; }
|
|
lv_style_t* styleDropdown() { return &s_dropdown; }
|
|
lv_style_t* styleSlider() { return &s_slider; }
|
|
|
|
// New accessors (6)
|
|
lv_style_t* styleBtnFocused() { return &s_btnFocused; }
|
|
lv_style_t* styleTextareaFocused() { return &s_textareaFocused; }
|
|
lv_style_t* styleSectionHeader() { return &s_sectionHeader; }
|
|
lv_style_t* styleModal() { return &s_modal; }
|
|
lv_style_t* styleScrollbar() { return &s_scrollbar; }
|
|
lv_style_t* styleRoller() { return &s_roller; }
|
|
|
|
} // namespace LvTheme
|