This commit is contained in:
2026-02-21 21:10:12 -05:00
parent 8ce92b435b
commit 3450d6db9b
5 changed files with 92 additions and 33 deletions

View File

@@ -3,3 +3,4 @@
// SPDX-License-Identifier: GNU General Public License v3.0 or later // SPDX-License-Identifier: GNU General Public License v3.0 or later
pub mod fs; pub mod fs;
pub mod theme;

5
libclide/src/theme.rs Normal file
View File

@@ -0,0 +1,5 @@
// SPDX-FileCopyrightText: 2026, Shaun Reed <shaunrd0@gmail.com>
//
// SPDX-License-Identifier: GNU General Public License v3.0 or later
pub mod colors;

View File

@@ -0,0 +1,52 @@
// SPDX-FileCopyrightText: 2026, Shaun Reed <shaunrd0@gmail.com>
//
// SPDX-License-Identifier: GNU General Public License v3.0 or later
pub struct Colors {}
impl Colors {
pub const HOVERED: &str = "#303234";
pub const UNHOVERED: &str = "#3c3f41";
pub const PRESSED: &str = "#4b4f51";
pub const MENUBAR: &str = "#262626";
pub const MENUBAR_BORDER: &str = "#575757";
pub const SCROLLBAR: &str = "#4b4f51";
pub const SCROLLBAR_ACTIVE: &str = "#4b4f51";
pub const SCROLLBAR_GUTTER: &str = "#3b3b3b";
pub const LINENUMBER: &str = "#94989b";
pub const ACTIVE: &str = "#a9acb0";
pub const INACTIVE: &str = "#FFF";
pub const EDITOR_BACKGROUND: &str = "#1E1F22";
pub const EDITOR_TEXT: &str = "#acaea3";
pub const EDITOR_HIGHLIGHTED_TEXT: &str = "#ccced3";
pub const EDITOR_HIGHLIGHT: &str = "#ccced3";
pub const GUTTER: &str = "#1e1f22";
pub const EXPLORER_HOVERED: &str = "#4c5053";
pub const EXPLORER_TEXT: &str = "#FFF";
pub const EXPLORER_TEXT_SELECTED: &str = "#262626";
pub const EXPLORER_BACKGROUND: &str = "#1E1F22";
pub const EXPLORER_FOLDER: &str = "#54585b";
pub const EXPLORER_FOLDER_OPEN: &str = "#393B40";
pub const TERMINAL_BACKGROUND: &str = "#111111";
pub const INFO_LOG: &str = "#C4FFFF";
pub const DEBUG_LOG: &str = "#9148AF";
pub const WARN_LOG: &str = "#C4A958";
pub const ERROR_LOG: &str = "#ff5555";
pub const TRACE_LOG: &str = "#ffaa00";
pub fn css_to_u32(css: &str) -> Result<u32, String> {
let hex = css.trim_start_matches('#');
// Expand shorthand #RGB to #RRGGBB
let hex_full = match hex.len() {
3 => hex.chars()
.map(|c| std::iter::repeat(c).take(2).collect::<String>())
.collect::<String>(),
6 => hex.to_string(),
_ => return Err(format!("Invalid hex color length: {}", hex)),
};
// Parse the hex string as u32, masking to ensure the top byte is 0x00.
u32::from_str_radix(&hex_full, 16)
.map(|rgb| rgb & 0x00FF_FFFF)
.map_err(|e| format!("Failed to parse hex: {}", e))
}
}

View File

@@ -2,8 +2,10 @@
// //
// SPDX-License-Identifier: GNU General Public License v3.0 or later // SPDX-License-Identifier: GNU General Public License v3.0 or later
#[cxx_qt::bridge] use cxx_qt_lib::QColor;
use libclide::theme::colors::Colors;
#[cxx_qt::bridge]
pub mod qobject { pub mod qobject {
unsafe extern "C++" { unsafe extern "C++" {
include!("cxx-qt-lib/qcolor.h"); include!("cxx-qt-lib/qcolor.h");
@@ -46,8 +48,6 @@ pub mod qobject {
} }
} }
use cxx_qt_lib::QColor;
pub struct RustColorsImpl { pub struct RustColorsImpl {
hovered: QColor, hovered: QColor,
unhovered: QColor, unhovered: QColor,
@@ -82,34 +82,34 @@ pub struct RustColorsImpl {
impl Default for RustColorsImpl { impl Default for RustColorsImpl {
fn default() -> Self { fn default() -> Self {
Self { Self {
hovered: QColor::try_from("#303234").unwrap(), hovered: QColor::try_from(Colors::HOVERED).unwrap(),
unhovered: QColor::try_from("#3c3f41").unwrap(), unhovered: QColor::try_from(Colors::UNHOVERED).unwrap(),
pressed: QColor::try_from("#4b4f51").unwrap(), pressed: QColor::try_from(Colors::PRESSED).unwrap(),
menubar: QColor::try_from("#262626").unwrap(), menubar: QColor::try_from(Colors::MENUBAR).unwrap(),
menubar_border: QColor::try_from("#575757").unwrap(), menubar_border: QColor::try_from(Colors::MENUBAR_BORDER).unwrap(),
scrollbar: QColor::try_from("#4b4f51").unwrap(), scrollbar: QColor::try_from(Colors::SCROLLBAR).unwrap(),
scrollbar_active: QColor::try_from("#4b4f51").unwrap(), scrollbar_active: QColor::try_from(Colors::SCROLLBAR_ACTIVE).unwrap(),
scrollbar_gutter: QColor::try_from("#3b3b3b").unwrap(), scrollbar_gutter: QColor::try_from(Colors::SCROLLBAR_GUTTER).unwrap(),
linenumber: QColor::try_from("#94989b").unwrap(), linenumber: QColor::try_from(Colors::LINENUMBER).unwrap(),
active: QColor::try_from("#a9acb0").unwrap(), active: QColor::try_from(Colors::ACTIVE).unwrap(),
inactive: QColor::try_from("#FFF").unwrap(), inactive: QColor::try_from(Colors::INACTIVE).unwrap(),
editor_background: QColor::try_from("#1E1F22").unwrap(), editor_background: QColor::try_from(Colors::EDITOR_BACKGROUND).unwrap(),
editor_text: QColor::try_from("#acaea3").unwrap(), editor_text: QColor::try_from(Colors::EDITOR_TEXT).unwrap(),
editor_highlighted_text: QColor::try_from("#ccced3").unwrap(), editor_highlighted_text: QColor::try_from(Colors::EDITOR_HIGHLIGHTED_TEXT).unwrap(),
editor_highlight: QColor::try_from("#ccced3").unwrap(), editor_highlight: QColor::try_from(Colors::EDITOR_HIGHLIGHT).unwrap(),
gutter: QColor::try_from("#1e1f22").unwrap(), gutter: QColor::try_from(Colors::GUTTER).unwrap(),
explorer_hovered: QColor::try_from("#4c5053").unwrap(), explorer_hovered: QColor::try_from(Colors::EXPLORER_HOVERED).unwrap(),
explorer_text: QColor::try_from("#FFF").unwrap(), explorer_text: QColor::try_from(Colors::EXPLORER_TEXT).unwrap(),
explorer_text_selected: QColor::try_from("#262626").unwrap(), explorer_text_selected: QColor::try_from(Colors::EXPLORER_TEXT_SELECTED).unwrap(),
explorer_background: QColor::try_from("#1E1F22").unwrap(), explorer_background: QColor::try_from(Colors::EXPLORER_BACKGROUND).unwrap(),
explorer_folder: QColor::try_from("#54585b").unwrap(), explorer_folder: QColor::try_from(Colors::EXPLORER_FOLDER).unwrap(),
explorer_folder_open: QColor::try_from("#393B40").unwrap(), explorer_folder_open: QColor::try_from(Colors::EXPLORER_FOLDER_OPEN).unwrap(),
terminal_background: QColor::try_from("#111111").unwrap(), terminal_background: QColor::try_from(Colors::TERMINAL_BACKGROUND).unwrap(),
info_log: QColor::try_from("#C4FFFF").unwrap(), info_log: QColor::try_from(Colors::INFO_LOG).unwrap(),
debug_log: QColor::try_from("#9148AF").unwrap(), debug_log: QColor::try_from(Colors::DEBUG_LOG).unwrap(),
warn_log: QColor::try_from("#C4A958").unwrap(), warn_log: QColor::try_from(Colors::WARN_LOG).unwrap(),
error_log: QColor::try_from("#ff5555").unwrap(), error_log: QColor::try_from(Colors::ERROR_LOG).unwrap(),
trace_log: QColor::try_from("#ffaa00").unwrap(), trace_log: QColor::try_from(Colors::TRACE_LOG).unwrap(),
} }
} }
} }

View File

@@ -7,6 +7,7 @@
use crate::tui::component::Focus::Inactive; use crate::tui::component::Focus::Inactive;
use Focus::Active; use Focus::Active;
use anyhow::Result; use anyhow::Result;
use libclide::theme::colors::Colors;
use log::trace; use log::trace;
use ratatui::crossterm::event::{Event, KeyEvent, MouseEvent}; use ratatui::crossterm::event::{Event, KeyEvent, MouseEvent};
use ratatui::style::Color; use ratatui::style::Color;
@@ -98,8 +99,8 @@ pub enum Focus {
impl Focus { impl Focus {
pub(crate) fn get_active_color(&self) -> Color { pub(crate) fn get_active_color(&self) -> Color {
match self { match self {
Active => Color::LightYellow, Active => Color::from_u32(Colors::css_to_u32(Colors::ACTIVE)?),
Inactive => Color::White, Inactive => Color::from_u32(Colors::css_to_u32(Colors::INACTIVE)?),
} }
} }
} }