SyntaxEditor: Allow retrieving syntax theme, optimize updates to theme

This commit is contained in:
Jeremy Soller 2023-11-02 12:55:45 -06:00
parent 241c4ca357
commit ac389d9eeb
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
2 changed files with 25 additions and 6 deletions

View file

@ -3,7 +3,7 @@ use alloc::{string::String, vec::Vec};
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::{fs, io, path::Path}; use std::{fs, io, path::Path};
use syntect::highlighting::{ use syntect::highlighting::{
FontStyle, HighlightState, Highlighter, RangedHighlightIterator, Theme, ThemeSet, FontStyle, HighlightState, Highlighter, RangedHighlightIterator, ThemeSet,
}; };
use syntect::parsing::{ParseState, ScopeStack, SyntaxReference, SyntaxSet}; use syntect::parsing::{ParseState, ScopeStack, SyntaxReference, SyntaxSet};
@ -12,6 +12,8 @@ use crate::{
Shaping, Style, Weight, Wrap, Shaping, Style, Weight, Wrap,
}; };
pub use syntect::highlighting::Theme as SyntaxTheme;
#[derive(Debug)] #[derive(Debug)]
pub struct SyntaxSystem { pub struct SyntaxSystem {
pub syntax_set: SyntaxSet, pub syntax_set: SyntaxSet,
@ -35,7 +37,7 @@ pub struct SyntaxEditor<'a> {
editor: Editor, editor: Editor,
syntax_system: &'a SyntaxSystem, syntax_system: &'a SyntaxSystem,
syntax: &'a SyntaxReference, syntax: &'a SyntaxReference,
theme: &'a Theme, theme: &'a SyntaxTheme,
highlighter: Highlighter<'a>, highlighter: Highlighter<'a>,
syntax_cache: Vec<(ParseState, HighlightState)>, syntax_cache: Vec<(ParseState, HighlightState)>,
} }
@ -65,9 +67,11 @@ impl<'a> SyntaxEditor<'a> {
/// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing /// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing
pub fn update_theme(&mut self, theme_name: &str) -> bool { pub fn update_theme(&mut self, theme_name: &str) -> bool {
if let Some(theme) = self.syntax_system.theme_set.themes.get(theme_name) { if let Some(theme) = self.syntax_system.theme_set.themes.get(theme_name) {
self.theme = theme; if self.theme != theme {
self.highlighter = Highlighter::new(theme); self.theme = theme;
self.syntax_cache.clear(); self.highlighter = Highlighter::new(theme);
self.syntax_cache.clear();
}
true true
} else { } else {
@ -130,6 +134,11 @@ impl<'a> SyntaxEditor<'a> {
Color::rgb(0xFF, 0xFF, 0xFF) Color::rgb(0xFF, 0xFF, 0xFF)
} }
} }
/// Get the current syntect theme
pub fn theme(&self) -> &SyntaxTheme {
self.theme
}
} }
impl<'a> Edit for SyntaxEditor<'a> { impl<'a> Edit for SyntaxEditor<'a> {

View file

@ -4,7 +4,7 @@ use unicode_segmentation::UnicodeSegmentation;
use crate::{ use crate::{
Action, AttrsList, BorrowedWithFontSystem, Buffer, Color, Cursor, Edit, FontSystem, Action, AttrsList, BorrowedWithFontSystem, Buffer, Color, Cursor, Edit, FontSystem,
SyntaxEditor, SyntaxEditor, SyntaxTheme,
}; };
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
@ -37,6 +37,11 @@ impl<'a> ViEditor<'a> {
} }
} }
/// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing
pub fn update_theme(&mut self, theme_name: &str) -> bool {
self.editor.update_theme(theme_name)
}
/// Load text from a file, and also set syntax to the best option /// Load text from a file, and also set syntax to the best option
#[cfg(feature = "std")] #[cfg(feature = "std")]
pub fn load_text<P: AsRef<std::path::Path>>( pub fn load_text<P: AsRef<std::path::Path>>(
@ -58,6 +63,11 @@ impl<'a> ViEditor<'a> {
self.editor.foreground_color() self.editor.foreground_color()
} }
/// Get the current syntect theme
pub fn theme(&self) -> &SyntaxTheme {
self.editor.theme()
}
/// Set passthrough mode (true will turn off vi features) /// Set passthrough mode (true will turn off vi features)
pub fn set_passthrough(&mut self, passthrough: bool) { pub fn set_passthrough(&mut self, passthrough: bool) {
if passthrough != (self.mode == ViMode::Passthrough) { if passthrough != (self.mode == ViMode::Passthrough) {