syntax highlighting example is now fine

This commit is contained in:
Priec
2025-08-19 00:58:21 +02:00
parent 0215f2824a
commit 7bf2b81229

View File

@@ -38,41 +38,67 @@ struct SyntaxTextAreaDemo {
has_unsaved_changes: bool, has_unsaved_changes: bool,
debug_message: String, debug_message: String,
current_language: String, current_language: String,
current_theme: String,
} }
impl SyntaxTextAreaDemo { impl SyntaxTextAreaDemo {
fn new() -> Self { fn new() -> Self {
let initial_text = r#"// 🎯 Syntax Highlighting Demo let initial_text = r#"// 🎯 Multi-language Syntax Highlighting Demo
// ==========================
// Rust
// ==========================
fn main() { fn main() {
println!("Hello, world!"); println!("Hello, Rust 🦀");
let nums = vec![1, 2, 3, 4, 5];
let numbers = vec![1, 2, 3, 4, 5]; for n in nums {
let doubled: Vec<i32> = numbers println!("n = {}", n);
.iter()
.map(|x| x * 2)
.collect();
for num in &doubled {
println!("Number: {}", num);
} }
} }
// Try pressing F5-F8 to switch languages! // ==========================
// F1/F2: Switch overflow modes // Python
// F3/F4: Adjust wrap indent"#; // ==========================
# 🐍 Python example
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
print([fib(i) for i in range(6)])
# ==========================
// JavaScript
// ==========================
// 🟨 JavaScript example
function greet(name) {
console.log(`Hello, ${name}!`);
}
greet("World");
// ==========================
// Scheme
// ==========================
;; 🎭 Scheme example
(define (square x) (* x x))
(display (square 5))
(newline)
"#;
let mut textarea = TextAreaSyntaxState::from_text(initial_text); let mut textarea = TextAreaSyntaxState::from_text(initial_text);
textarea.set_placeholder("Start typing code..."); textarea.set_placeholder("Start typing code...");
// Set up syntax highlighting // Pick a colorful default theme
let _ = textarea.set_syntax_theme("InspiredGitHub"); let default_theme = "base16-ocean.dark";
let _ = textarea.set_syntax_theme(default_theme);
// Default to Rust syntax
let _ = textarea.set_syntax_by_extension("rs"); let _ = textarea.set_syntax_by_extension("rs");
Self { Self {
textarea, textarea,
has_unsaved_changes: false, has_unsaved_changes: false,
debug_message: "🎯 Syntax highlighting enabled - Rust".to_string(), debug_message: format!("🎯 Syntax highlighting enabled - Rust ({})", default_theme),
current_language: "Rust".to_string(), current_language: "Rust".to_string(),
current_theme: default_theme.to_string(),
} }
} }
@@ -84,7 +110,7 @@ fn main() {
fn switch_to_rust(&mut self) { fn switch_to_rust(&mut self) {
let _ = self.textarea.set_syntax_by_extension("rs"); let _ = self.textarea.set_syntax_by_extension("rs");
self.current_language = "Rust".to_string(); self.current_language = "Rust".to_string();
self.debug_message = "🦀 Switched to Rust syntax".to_string(); self.debug_message = format!("🦀 Switched to Rust syntax ({})", self.current_theme);
let rust_code = r#"// Rust example let rust_code = r#"// Rust example
fn fibonacci(n: u32) -> u32 { fn fibonacci(n: u32) -> u32 {
@@ -101,12 +127,13 @@ fn main() {
} }
}"#; }"#;
self.textarea.set_text(rust_code); self.textarea.set_text(rust_code);
self.has_unsaved_changes = false;
} }
fn switch_to_python(&mut self) { fn switch_to_python(&mut self) {
let _ = self.textarea.set_syntax_by_extension("py"); let _ = self.textarea.set_syntax_by_extension("py");
self.current_language = "Python".to_string(); self.current_language = "Python".to_string();
self.debug_message = "🐍 Switched to Python syntax".to_string(); self.debug_message = format!("🐍 Switched to Python syntax ({})", self.current_theme);
let python_code = r#"# Python example let python_code = r#"# Python example
def fibonacci(n): def fibonacci(n):
@@ -121,12 +148,13 @@ def main():
if __name__ == "__main__": if __name__ == "__main__":
main()"#; main()"#;
self.textarea.set_text(python_code); self.textarea.set_text(python_code);
self.has_unsaved_changes = false;
} }
fn switch_to_javascript(&mut self) { fn switch_to_javascript(&mut self) {
let _ = self.textarea.set_syntax_by_extension("js"); let _ = self.textarea.set_syntax_by_extension("js");
self.current_language = "JavaScript".to_string(); self.current_language = "JavaScript".to_string();
self.debug_message = "🟨 Switched to JavaScript syntax".to_string(); self.debug_message = format!("🟨 Switched to JavaScript syntax ({})", self.current_theme);
let js_code = r#"// JavaScript example let js_code = r#"// JavaScript example
function fibonacci(n) { function fibonacci(n) {
@@ -142,12 +170,13 @@ function main() {
main();"#; main();"#;
self.textarea.set_text(js_code); self.textarea.set_text(js_code);
self.has_unsaved_changes = false;
} }
fn switch_to_scheme(&mut self) { fn switch_to_scheme(&mut self) {
let _ = self.textarea.set_syntax_by_name("Scheme"); let _ = self.textarea.set_syntax_by_name("Scheme");
self.current_language = "Scheme".to_string(); self.current_language = "Scheme".to_string();
self.debug_message = "🎭 Switched to Scheme syntax".to_string(); self.debug_message = format!("🎭 Switched to Scheme syntax ({})", self.current_theme);
let scheme_code = r#";; Scheme example let scheme_code = r#";; Scheme example
(define (fibonacci n) (define (fibonacci n)
@@ -163,14 +192,35 @@ main();"#;
(main)"#; (main)"#;
self.textarea.set_text(scheme_code); self.textarea.set_text(scheme_code);
self.has_unsaved_changes = false;
}
fn cycle_theme(&mut self) {
let themes = [
"InspiredGitHub",
"base16-ocean.dark",
"base16-eighties.dark",
"Solarized (dark)",
"Monokai Extended",
];
let current_pos = themes.iter().position(|t| *t == self.current_theme);
let next_pos = match current_pos {
Some(p) => (p + 1) % themes.len(),
None => 0,
};
let next_theme = themes[next_pos];
let _ = self.textarea.set_syntax_theme(next_theme);
self.current_theme = next_theme.to_string();
self.debug_message = format!("🎨 Theme switched to {}", next_theme);
} }
fn get_cursor_info(&self) -> String { fn get_cursor_info(&self) -> String {
format!( format!(
"Line {}, Col {} | Lang: {}", "Line {}, Col {} | Lang: {} | Theme: {}",
self.textarea.current_field() + 1, self.textarea.current_field() + 1,
self.textarea.cursor_position() + 1, self.textarea.cursor_position() + 1,
self.current_language self.current_language,
self.current_theme
) )
} }
@@ -212,24 +262,27 @@ fn handle_key_press(
(KeyCode::F(7), _) => editor.switch_to_javascript(), (KeyCode::F(7), _) => editor.switch_to_javascript(),
(KeyCode::F(8), _) => editor.switch_to_scheme(), (KeyCode::F(8), _) => editor.switch_to_scheme(),
// Theme cycling
(KeyCode::F(9), _) => editor.cycle_theme(),
// Overflow modes // Overflow modes
(KeyCode::F(1), _) => { (KeyCode::F(1), _) => {
editor.textarea.use_overflow_indicator('$'); editor.textarea.use_overflow_indicator('$');
editor.set_debug_message("Overflow: indicator '$' (wrap OFF)".to_string()); editor.set_debug_message(format!("Overflow: indicator '$' (wrap OFF) | Theme: {}", editor.current_theme));
} }
(KeyCode::F(2), _) => { (KeyCode::F(2), _) => {
editor.textarea.use_wrap(); editor.textarea.use_wrap();
editor.set_debug_message("Overflow: wrap ON".to_string()); editor.set_debug_message(format!("Overflow: wrap ON | Theme: {}", editor.current_theme));
} }
// Wrap indent // Wrap indent
(KeyCode::F(3), _) => { (KeyCode::F(3), _) => {
editor.textarea.set_wrap_indent_cols(4); editor.textarea.set_wrap_indent_cols(4);
editor.set_debug_message("Wrap indent: 4 columns".to_string()); editor.set_debug_message(format!("Wrap indent: 4 columns | Theme: {}", editor.current_theme));
} }
(KeyCode::F(4), _) => { (KeyCode::F(4), _) => {
editor.textarea.set_wrap_indent_cols(0); editor.textarea.set_wrap_indent_cols(0);
editor.set_debug_message("Wrap indent: 0 columns".to_string()); editor.set_debug_message(format!("Wrap indent: 0 columns | Theme: {}", editor.current_theme));
} }
// Info // Info
@@ -318,7 +371,7 @@ fn render_status_and_help(f: &mut Frame, area: ratatui::layout::Rect, editor: &S
let help_text = "🎨 SYNTAX HIGHLIGHTING DEMO\n\ let help_text = "🎨 SYNTAX HIGHLIGHTING DEMO\n\
F5=Rust, F6=Python, F7=JavaScript, F8=Scheme\n\ F5=Rust, F6=Python, F7=JavaScript, F8=Scheme\n\
F1/F2=overflow modes, F3/F4=wrap indent\n\ F1/F2=overflow modes, F3/F4=wrap indent\n\
?=info, Ctrl+Q=quit"; F9=cycle themes, ?=info, Ctrl+Q=quit";
let help = Paragraph::new(help_text) let help = Paragraph::new(help_text)
.block(Block::default().borders(Borders::ALL).title("🚀 Help")) .block(Block::default().borders(Borders::ALL).title("🚀 Help"))