From e77f0366f601e0c5088c82efcdc46bc7d6641577 Mon Sep 17 00:00:00 2001 From: Adrian Wozniak Date: Sat, 5 Jan 2019 09:58:17 +0100 Subject: [PATCH] Improve highlights, add icons files --- assets/gear-64x64.bmp | Bin 0 -> 12426 bytes assets/gear-64x64.png | Bin 0 -> 15812 bytes assets/gear-64x64.raw | Bin 0 -> 15343 bytes assets/gear.jpg | Bin 0 -> 51938 bytes src/app/mod.rs | 8 +- src/themes/caret_color.rs | 39 ++++ src/themes/code_highlighting_color.rs | 123 ++++++++++++ src/themes/config_creator.rs | 261 +++++++++++++------------- src/themes/diff_color.rs | 37 ++++ src/themes/mod.rs | 257 ++----------------------- src/themes/predef/default.rs | 5 + src/themes/predef/mod.rs | 2 + src/themes/predef/railscasts.rs | 43 +++++ src/themes/serde_color.rs | 26 +++ src/themes/theme.rs | 91 +++++++++ src/themes/theme_config.rs | 30 +++ src/ui/caret.rs | 4 + 17 files changed, 546 insertions(+), 380 deletions(-) create mode 100644 assets/gear-64x64.bmp create mode 100644 assets/gear-64x64.png create mode 100644 assets/gear-64x64.raw create mode 100644 assets/gear.jpg create mode 100644 src/themes/caret_color.rs create mode 100644 src/themes/code_highlighting_color.rs create mode 100644 src/themes/diff_color.rs create mode 100644 src/themes/predef/default.rs create mode 100644 src/themes/predef/mod.rs create mode 100644 src/themes/predef/railscasts.rs create mode 100644 src/themes/serde_color.rs create mode 100644 src/themes/theme.rs create mode 100644 src/themes/theme_config.rs diff --git a/assets/gear-64x64.bmp b/assets/gear-64x64.bmp new file mode 100644 index 0000000000000000000000000000000000000000..962ec6e6ee6043fbcda43669733b7891855bf8a6 GIT binary patch literal 12426 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 literal 0 HcmV?d00001 diff --git a/assets/gear-64x64.raw b/assets/gear-64x64.raw new file mode 100644 index 0000000000000000000000000000000000000000..21b478d2088c91f18fdf06bed975aa133fddfa6a GIT binary patch literal 15343 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

5mh7OKKw~wenm#e|prf{UXl=N7; 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 QW@ Self { + Self { + bright: ThemeConfig::new( + SerdeColor::new(0, 0, 0, 0), + false, + false, + ), + blur: ThemeConfig::new( + SerdeColor::new(0, 0, 0, 0), + false, + false, + ), + } + } +} + +impl CaretColor { + pub fn new(bright: ThemeConfig, blur: ThemeConfig) -> Self { + Self { bright, blur } + } + + pub fn bright(&self) -> &ThemeConfig { + &self.bright + } + + pub fn blur(&self) -> &ThemeConfig { + &self.blur + } +} diff --git a/src/themes/code_highlighting_color.rs b/src/themes/code_highlighting_color.rs new file mode 100644 index 0000000..4ae0def --- /dev/null +++ b/src/themes/code_highlighting_color.rs @@ -0,0 +1,123 @@ +use crate::themes::SerdeColor; +use crate::themes::ThemeConfig; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct CodeHighlightingColor { + pub comment: ThemeConfig, + pub constant: ThemeConfig, + pub error: ThemeConfig, + pub warning: ThemeConfig, + pub identifier: ThemeConfig, + pub keyword: ThemeConfig, + pub literal: ThemeConfig, + pub number: ThemeConfig, + pub operator: ThemeConfig, + pub separator: ThemeConfig, + pub statement: ThemeConfig, + pub string: ThemeConfig, + pub title: ThemeConfig, + pub type_: ThemeConfig, + pub todo: ThemeConfig, + pub pre_proc: ThemeConfig, + pub special: ThemeConfig, + pub whitespace: ThemeConfig, +} + +impl Default for CodeHighlightingColor { + fn default() -> Self { + Self { + comment: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + constant: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + error: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + warning: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + identifier: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + keyword: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + literal: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + number: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + operator: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + separator: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + statement: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + string: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + title: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + type_: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + todo: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + pre_proc: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + special: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + whitespace: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + } + } +} + +impl CodeHighlightingColor { + pub fn comment(&self) -> &ThemeConfig { + &self.comment + } + + pub fn constant(&self) -> &ThemeConfig { + &self.constant + } + + pub fn error(&self) -> &ThemeConfig { + &self.error + } + + pub fn warning(&self) -> &ThemeConfig { + &self.warning + } + + pub fn identifier(&self) -> &ThemeConfig { + &self.identifier + } + + pub fn keyword(&self) -> &ThemeConfig { + &self.keyword + } + + pub fn literal(&self) -> &ThemeConfig { + &self.literal + } + + pub fn number(&self) -> &ThemeConfig { + &self.number + } + + pub fn operator(&self) -> &ThemeConfig { + &self.operator + } + + pub fn separator(&self) -> &ThemeConfig { + &self.separator + } + + pub fn statement(&self) -> &ThemeConfig { + &self.statement + } + + pub fn string(&self) -> &ThemeConfig { + &self.string + } + + pub fn title(&self) -> &ThemeConfig { + &self.title + } + + pub fn type_(&self) -> &ThemeConfig { + &self.type_ + } + + pub fn todo(&self) -> &ThemeConfig { + &self.todo + } + + pub fn pre_proc(&self) -> &ThemeConfig { + &self.pre_proc + } + + pub fn special(&self) -> &ThemeConfig { + &self.special + } + + pub fn whitespace(&self) -> &ThemeConfig { + &self.whitespace + } +} diff --git a/src/themes/config_creator.rs b/src/themes/config_creator.rs index 9d0d4a1..70b750f 100644 --- a/src/themes/config_creator.rs +++ b/src/themes/config_creator.rs @@ -1,4 +1,5 @@ use crate::config::directories::*; +use crate::themes::predef::*; use crate::themes::*; use dirs; use std::fs; @@ -14,142 +15,142 @@ pub fn create() { fn write_theme(theme: &Theme) { let mut theme_path = themes_dir(); - theme_path.push(format!("{}.json", theme.name)); + theme_path.push(format!("{}.json", theme.name())); let contents = serde_json::to_string_pretty(&theme).unwrap(); fs::write(&theme_path, contents.clone()) .unwrap_or_else(|_| panic!("Failed to crate theme config file")); } fn default_styles() -> Vec { - vec![default_theme(), railscasts_theme()] + vec![default::build_theme(), railscasts::build_theme()] } -fn default_theme() -> Theme { - Theme::default() -} +//fn default_theme() -> Theme { +// Theme::default() +//} -fn railscasts_theme() -> Theme { - Theme { - name: "railscasts".to_string(), - background: SerdeColor { - r: 60, - g: 60, - b: 60, - a: 0, - }, - caret: CaretColor { - bright: ThemeConfig { - color: SerdeColor { - r: 121, - g: 121, - b: 121, - a: 0, - }, - italic: false, - bold: false, - }, - blur: ThemeConfig { - color: SerdeColor { - r: 21, - g: 21, - b: 21, - a: 0, - }, - italic: false, - bold: false, - }, - }, - code_highlighting: CodeHighlightingColor { - whitespace: ThemeConfig { - color: SerdeColor { - r: 220, - g: 220, - b: 220, - a: 90, - }, - italic: false, - bold: false, - }, - keyword: ThemeConfig { - color: SerdeColor { - r: 203, - g: 120, - b: 50, - a: 0, - }, - italic: false, - bold: true, - }, - string: ThemeConfig { - color: SerdeColor { - r: 164, - g: 194, - b: 96, - a: 0, - }, - italic: false, - bold: false, - }, - number: ThemeConfig { - color: SerdeColor { - r: 164, - g: 194, - b: 96, - a: 0, - }, - italic: false, - bold: false, - }, - identifier: ThemeConfig { - color: SerdeColor { - r: 121, - g: 121, - b: 121, - a: 0, - }, - italic: false, - bold: false, - }, - literal: ThemeConfig { - color: SerdeColor { - r: 121, - g: 121, - b: 121, - a: 0, - }, - italic: false, - bold: false, - }, - comment: ThemeConfig { - color: SerdeColor { - r: 188, - g: 147, - b: 88, - a: 0, - }, - italic: true, - bold: false, - }, - operator: ThemeConfig { - color: SerdeColor { - r: 200, - g: 0, - b: 0, - a: 0, - }, - italic: false, - bold: false, - }, - separator: ThemeConfig { - color: SerdeColor { - r: 221, - g: 221, - b: 221, - a: 0, - }, - italic: false, - bold: false, - }, - }, - } -} +//fn railscasts_theme() -> Theme { +// Theme { +// name: "railscasts".to_string(), +// background: SerdeColor { +// r: 60, +// g: 60, +// b: 60, +// a: 0, +// }, +// caret: CaretColor { +// bright: ThemeConfig { +// color: SerdeColor { +// r: 121, +// g: 121, +// b: 121, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// blur: ThemeConfig { +// color: SerdeColor { +// r: 21, +// g: 21, +// b: 21, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// }, +// code_highlighting: CodeHighlightingColor { +// whitespace: ThemeConfig { +// color: SerdeColor { +// r: 220, +// g: 220, +// b: 220, +// a: 90, +// }, +// italic: false, +// bold: false, +// }, +// keyword: ThemeConfig { +// color: SerdeColor { +// r: 175, +// g: 95, +// b: 0, +// a: 0, +// }, +// italic: false, +// bold: true, +// }, +// string: ThemeConfig { +// color: SerdeColor { +// r: 135, +// g: 175, +// b: 95, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// number: ThemeConfig { +// color: SerdeColor { +// r: 135, +// g: 175, +// b: 95, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// identifier: ThemeConfig { +// color: SerdeColor { +// r: 175, +// g: 75, +// b: 75, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// literal: ThemeConfig { +// color: SerdeColor { +// r: 121, +// g: 121, +// b: 121, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// comment: ThemeConfig { +// color: SerdeColor { +// r: 175, +// g: 135, +// b: 95, +// a: 0, +// }, +// italic: true, +// bold: false, +// }, +// operator: ThemeConfig { +// color: SerdeColor { +// r: 200, +// g: 0, +// b: 0, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// separator: ThemeConfig { +// color: SerdeColor { +// r: 221, +// g: 221, +// b: 221, +// a: 0, +// }, +// italic: false, +// bold: false, +// }, +// }, +// } +//} diff --git a/src/themes/diff_color.rs b/src/themes/diff_color.rs new file mode 100644 index 0000000..398df64 --- /dev/null +++ b/src/themes/diff_color.rs @@ -0,0 +1,37 @@ +use crate::themes::SerdeColor; +use crate::themes::ThemeConfig; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct DiffColor { + pub add: ThemeConfig, + pub delete: ThemeConfig, + pub change: ThemeConfig, + pub text: ThemeConfig, +} + +impl Default for DiffColor { + fn default() -> Self { + Self { + add: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + delete: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + change: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + text: ThemeConfig::new(SerdeColor::new(0, 0, 0, 0), false, false), + } + } +} + +impl DiffColor { + pub fn new( + add: ThemeConfig, + delete: ThemeConfig, + change: ThemeConfig, + text: ThemeConfig, + ) -> Self { + Self { + add, + delete, + change, + text, + } + } +} diff --git a/src/themes/mod.rs b/src/themes/mod.rs index 6819cd2..ef08ffb 100644 --- a/src/themes/mod.rs +++ b/src/themes/mod.rs @@ -6,249 +6,18 @@ use std::env; use std::fs; use std::path::PathBuf; +pub mod caret_color; +pub mod code_highlighting_color; pub mod config_creator; +pub mod diff_color; +pub mod predef; +pub mod serde_color; +pub mod theme; +pub mod theme_config; -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct SerdeColor { - pub r: u8, - pub g: u8, - pub b: u8, - pub a: u8, -} - -impl SerdeColor { - pub fn new(r: u8, g: u8, b: u8, a: u8) -> Self { - Self { r, g, b, a } - } -} - -impl Into for &SerdeColor { - fn into(self) -> Color { - Color { - r: self.r, - g: self.g, - b: self.b, - a: self.a, - } - } -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct ThemeConfig { - color: SerdeColor, - italic: bool, - bold: bool, -} - -impl ThemeConfig { - pub fn color(&self) -> &SerdeColor { - &self.color - } - - pub fn italic(&self) -> bool { - self.italic - } - - pub fn bold(&self) -> bool { - self.bold - } -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct CaretColor { - bright: ThemeConfig, - blur: ThemeConfig, -} - -impl Default for CaretColor { - fn default() -> Self { - Self { - bright: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - italic: false, - bold: false, - }, - blur: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - italic: false, - bold: false, - }, - } - } -} - -impl CaretColor { - pub fn bright(&self) -> &ThemeConfig { - &self.bright - } - - pub fn blur(&self) -> &ThemeConfig { - &self.blur - } -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct CodeHighlightingColor { - whitespace: ThemeConfig, - keyword: ThemeConfig, - string: ThemeConfig, - number: ThemeConfig, - identifier: ThemeConfig, - literal: ThemeConfig, - comment: ThemeConfig, - operator: ThemeConfig, - separator: ThemeConfig, -} - -impl Default for CodeHighlightingColor { - fn default() -> Self { - Self { - whitespace: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - keyword: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - string: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - number: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - identifier: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - literal: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - comment: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - operator: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - separator: ThemeConfig { - color: SerdeColor::new(0, 0, 0, 0), - bold: false, - italic: false, - }, - } - } -} - -impl CodeHighlightingColor { - pub fn whitespace(&self) -> &ThemeConfig { - &self.whitespace - } - - pub fn keyword(&self) -> &ThemeConfig { - &self.keyword - } - - pub fn string(&self) -> &ThemeConfig { - &self.string - } - - pub fn number(&self) -> &ThemeConfig { - &self.number - } - - pub fn identifier(&self) -> &ThemeConfig { - &self.identifier - } - - pub fn literal(&self) -> &ThemeConfig { - &self.literal - } - - pub fn comment(&self) -> &ThemeConfig { - &self.comment - } - - pub fn operator(&self) -> &ThemeConfig { - &self.operator - } - - pub fn separator(&self) -> &ThemeConfig { - &self.separator - } -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct Theme { - name: String, - background: SerdeColor, - caret: CaretColor, - code_highlighting: CodeHighlightingColor, -} - -impl Default for Theme { - fn default() -> Self { - use crate::themes::config_creator; - Self { - name: "default".to_string(), - background: SerdeColor::new(255, 255, 255, 0), - caret: CaretColor::default(), - code_highlighting: CodeHighlightingColor::default(), - } - } -} - -impl Theme { - pub fn name(&self) -> &String { - &self.name - } - - pub fn background(&self) -> &SerdeColor { - &self.background - } - - pub fn caret(&self) -> &CaretColor { - &self.caret - } - - pub fn code_highlighting(&self) -> &CodeHighlightingColor { - &self.code_highlighting - } - - pub fn load(theme_name: String) -> Self { - use dirs; - let home_dir = dirs::config_dir().unwrap(); - let mut config_dir = home_dir.clone(); - config_dir.push("rider"); - fs::create_dir_all(&config_dir) - .unwrap_or_else(|_| panic!("Cannot create config directory")); - Self::load_content(format!("{}.json", theme_name).as_str()) - } - - fn load_content(file_name: &str) -> Theme { - let mut config_file = themes_dir(); - config_file.push(file_name); - let contents = match fs::read_to_string(&config_file) { - Ok(s) => s, - Err(_) => { - use crate::themes::config_creator; - config_creator::create(); - fs::read_to_string(&config_file) - .unwrap_or_else(|_| panic!("Failed to load theme config file")) - } - }; - serde_json::from_str(&contents).unwrap_or_default() - } -} +pub use crate::themes::caret_color::CaretColor; +pub use crate::themes::code_highlighting_color::CodeHighlightingColor; +pub use crate::themes::diff_color::DiffColor; +pub use crate::themes::serde_color::SerdeColor; +pub use crate::themes::theme::Theme; +pub use crate::themes::theme_config::ThemeConfig; diff --git a/src/themes/predef/default.rs b/src/themes/predef/default.rs new file mode 100644 index 0000000..14e6bb2 --- /dev/null +++ b/src/themes/predef/default.rs @@ -0,0 +1,5 @@ +use crate::themes::Theme; + +pub fn build_theme() -> Theme { + Theme::default() +} diff --git a/src/themes/predef/mod.rs b/src/themes/predef/mod.rs new file mode 100644 index 0000000..b6d02fc --- /dev/null +++ b/src/themes/predef/mod.rs @@ -0,0 +1,2 @@ +pub mod default; +pub mod railscasts; diff --git a/src/themes/predef/railscasts.rs b/src/themes/predef/railscasts.rs new file mode 100644 index 0000000..a89f5f9 --- /dev/null +++ b/src/themes/predef/railscasts.rs @@ -0,0 +1,43 @@ +use crate::themes::caret_color::CaretColor; +use crate::themes::CodeHighlightingColor; +use crate::themes::DiffColor; +use crate::themes::SerdeColor; +use crate::themes::Theme; +use crate::themes::ThemeConfig; + +pub fn build_theme() -> Theme { + Theme::new( + "railscasts".to_string(), + SerdeColor::new(18, 18, 18, 0), + CaretColor::new( + ThemeConfig::new(SerdeColor::new(121, 121, 121, 0), false, false), + ThemeConfig::new(SerdeColor::new(21, 21, 21, 0), false, false), + ), + CodeHighlightingColor { + comment: ThemeConfig::new(SerdeColor::new(175, 135, 95, 0), false, false), + constant: ThemeConfig::new(SerdeColor::new(109, 156, 190, 0), false, false), + error: ThemeConfig::new(SerdeColor::new(255, 255, 255, 0), false, false), + warning: ThemeConfig::new(SerdeColor::new(128, 0, 0, 0), false, false), + identifier: ThemeConfig::new(SerdeColor::new(175, 95, 95, 0), false, false), + keyword: ThemeConfig::new(SerdeColor::new(175, 95, 0, 0), false, false), + literal: ThemeConfig::new(SerdeColor::new(228, 228, 228, 0), false, false), + number: ThemeConfig::new(SerdeColor::new(135, 175, 95, 0), false, false), + operator: ThemeConfig::new(SerdeColor::new(228, 228, 228, 0), false, false), + separator: ThemeConfig::new(SerdeColor::new(228, 228, 228, 0), false, false), + statement: ThemeConfig::new(SerdeColor::new(175, 95, 0, 0), false, false), + string: ThemeConfig::new(SerdeColor::new(135, 175, 95, 0), false, false), + title: ThemeConfig::new(SerdeColor::new(255, 255, 255, 0), false, false), + type_: ThemeConfig::new(SerdeColor::new(223, 95, 95, 0), false, false), + todo: ThemeConfig::new(SerdeColor::new(223, 95, 95, 0), false, false), + pre_proc: ThemeConfig::new(SerdeColor::new(255, 135, 0, 0), false, false), + special: ThemeConfig::new(SerdeColor::new(0, 95, 0, 0), false, false), + whitespace: ThemeConfig::new(SerdeColor::new(220, 220, 220, 90), false, false), + }, + DiffColor::new( + ThemeConfig::new(SerdeColor::new(228, 228, 228, 0), false, false), + ThemeConfig::new(SerdeColor::new(102, 0, 0, 0), false, false), + ThemeConfig::new(SerdeColor::new(135, 0, 135, 0), false, false), + ThemeConfig::new(SerdeColor::new(18, 18, 18, 0), false, false), + ), + ) +} diff --git a/src/themes/serde_color.rs b/src/themes/serde_color.rs new file mode 100644 index 0000000..c269de1 --- /dev/null +++ b/src/themes/serde_color.rs @@ -0,0 +1,26 @@ +use sdl2::pixels::Color; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct SerdeColor { + pub r: u8, + pub g: u8, + pub b: u8, + pub a: u8, +} + +impl SerdeColor { + pub fn new(r: u8, g: u8, b: u8, a: u8) -> Self { + Self { r, g, b, a } + } +} + +impl Into for &SerdeColor { + fn into(self) -> Color { + Color { + r: self.r, + g: self.g, + b: self.b, + a: self.a, + } + } +} diff --git a/src/themes/theme.rs b/src/themes/theme.rs new file mode 100644 index 0000000..496c529 --- /dev/null +++ b/src/themes/theme.rs @@ -0,0 +1,91 @@ +use crate::config::directories::themes_dir; +use crate::themes::CaretColor; +use crate::themes::CodeHighlightingColor; +use crate::themes::DiffColor; +use crate::themes::SerdeColor; +use dirs; +use std::fs; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct Theme { + name: String, + background: SerdeColor, + caret: CaretColor, + code_highlighting: CodeHighlightingColor, + diff: DiffColor, +} + +impl Default for Theme { + fn default() -> Self { + use crate::themes::config_creator; + Self { + name: "default".to_string(), + background: SerdeColor::new(255, 255, 255, 0), + caret: CaretColor::default(), + code_highlighting: CodeHighlightingColor::default(), + diff: DiffColor::default(), + } + } +} + +impl Theme { + pub fn new( + name: String, + background: SerdeColor, + caret: CaretColor, + code_highlighting: CodeHighlightingColor, + diff: DiffColor, + ) -> Self { + Self { + name, + background, + caret, + code_highlighting, + diff, + } + } + + pub fn name(&self) -> &String { + &self.name + } + + pub fn background(&self) -> &SerdeColor { + &self.background + } + + pub fn caret(&self) -> &CaretColor { + &self.caret + } + + pub fn diff(&self) -> &DiffColor { + &self.diff + } + + pub fn code_highlighting(&self) -> &CodeHighlightingColor { + &self.code_highlighting + } + + pub fn load(theme_name: String) -> Self { + let home_dir = dirs::config_dir().unwrap(); + let mut config_dir = home_dir.clone(); + config_dir.push("rider"); + fs::create_dir_all(&config_dir) + .unwrap_or_else(|_| panic!("Cannot create config directory")); + Self::load_content(format!("{}.json", theme_name).as_str()) + } + + fn load_content(file_name: &str) -> Theme { + let mut config_file = themes_dir(); + config_file.push(file_name); + let contents = match fs::read_to_string(&config_file) { + Ok(s) => s, + Err(_) => { + use crate::themes::config_creator; + config_creator::create(); + fs::read_to_string(&config_file) + .unwrap_or_else(|_| panic!("Failed to load theme config file")) + } + }; + serde_json::from_str(&contents).unwrap_or_default() + } +} diff --git a/src/themes/theme_config.rs b/src/themes/theme_config.rs new file mode 100644 index 0000000..66e542a --- /dev/null +++ b/src/themes/theme_config.rs @@ -0,0 +1,30 @@ +use crate::themes::SerdeColor; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct ThemeConfig { + color: SerdeColor, + italic: bool, + bold: bool, +} + +impl ThemeConfig { + pub fn new(color: SerdeColor, italic: bool, bold: bool) -> Self { + Self { + color, + italic, + bold, + } + } + + pub fn color(&self) -> &SerdeColor { + &self.color + } + + pub fn italic(&self) -> bool { + self.italic + } + + pub fn bold(&self) -> bool { + self.bold + } +} diff --git a/src/ui/caret.rs b/src/ui/caret.rs index 4eb22f4..cd54920 100644 --- a/src/ui/caret.rs +++ b/src/ui/caret.rs @@ -121,6 +121,10 @@ pub struct CaretColor { } impl CaretColor { + pub fn new(bright: Color, blur: Color) -> Self { + Self { bright, blur } + } + pub fn bright(&self) -> &Color { &self.bright }