From 45c081c51236f1e7590ce1a9c1f022f471f3f86c Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Sun, 19 Jan 2025 16:49:42 -0500 Subject: [PATCH 1/7] wip: refactor cell styling into a separte method. --- src/ui/render/viewport.rs | 40 +++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/ui/render/viewport.rs b/src/ui/render/viewport.rs index c91d975..0651771 100644 --- a/src/ui/render/viewport.rs +++ b/src/ui/render/viewport.rs @@ -159,24 +159,7 @@ impl<'ws> Viewport<'ws> { .book .get_cell_addr_rendered(&Address { row: ri, col: *ci }) .unwrap(); - let mut cell = Cell::new(Text::raw(content)); - if let Some((start, end)) = - &self.range_selection.map_or(None, |r| r.get_range()) - { - if ri >= start.row - && ri <= end.row - && *ci >= start.col - && *ci <= end.col - { - // This is a selected range - cell = cell.fg(Color::Black).bg(Color::LightBlue) - } - } - match (self.book.location.row == ri, self.book.location.col == *ci) { - (true, true) => cell.fg(Color::White).bg(Color::Rgb(57, 61, 71)), - _ => cell, - } - .bold() + self.compute_cell_style(ri, ci, Cell::new(Text::raw(content))) }, )); Row::new(cells) @@ -208,6 +191,27 @@ impl<'ws> Viewport<'ws> { .column_spacing(0) .flex(Flex::Start)) } + + fn compute_cell_style<'widget>(&self, ri: usize, ci: &usize, mut cell: Cell<'widget>) -> Cell<'widget> { + if let Some((start, end)) = + &self.range_selection.map_or(None, |r| r.get_range()) + { + if ri >= start.row + && ri <= end.row + && *ci >= start.col + && *ci <= end.col + { + // This is a selected range + cell = cell.fg(Color::Black).bg(Color::LightBlue) + } + } + match (self.book.location.row == ri, self.book.location.col == *ci) { + (true, true) => cell.fg(Color::White).bg(Color::Rgb(57, 61, 71)), + // TODO(zaphar): Support ironcalc style options + _ => cell, + } + .bold() + } } impl<'ws> StatefulWidget for Viewport<'ws> { From 9db2eb91ad8139daa326496813199c56ae869415 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Sun, 19 Jan 2025 17:57:51 -0500 Subject: [PATCH 2/7] wip: color mapping from style color names --- Cargo.lock | 7 ++++++ Cargo.toml | 1 + src/book/mod.rs | 13 +++++++++- src/ui/render/test.rs | 28 +++++++++++++++++++++ src/ui/render/viewport.rs | 52 +++++++++++++++++++++++++++++++++++---- 5 files changed, 95 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e096f7e..f7d3e8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -369,6 +369,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "colorsys" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54261aba646433cb567ec89844be4c4825ca92a4f8afba52fc4dd88436e31bbd" + [[package]] name = "compact_str" version = "0.8.0" @@ -1483,6 +1489,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "colorsys", "crossterm", "csvx", "futures", diff --git a/Cargo.toml b/Cargo.toml index d337a2a..5da5cb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,4 @@ tui-prompts = "0.5.0" slice-utils = { git = "https://dev.zaphar.net/zaphar/slice-cursor-rs.git", ref = "main" } tui-popup = "0.6.0" serde_json = "1.0.133" +colorsys = "0.6.7" diff --git a/src/book/mod.rs b/src/book/mod.rs index 91c11b9..e2c2103 100644 --- a/src/book/mod.rs +++ b/src/book/mod.rs @@ -3,7 +3,7 @@ use std::cmp::max; use anyhow::{anyhow, Result}; use ironcalc::{ base::{ - types::{SheetData, Worksheet}, + types::{CellStyleXfs, CellStyles, SheetData, Style, Worksheet}, worksheet::WorksheetDimension, Model, }, @@ -240,6 +240,17 @@ impl Book { Ok(self.get_cell_addr_rendered(&self.location)?) } + pub fn get_cell_style(&self, sheet: u32, cell: &Address) -> Option