From c3f84b10ad05179dd3ae80fba3447aca10ec62cd Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 18:10:23 -0500 Subject: [PATCH 1/8] wip: styling: bold text --- result | 0 src/book/mod.rs | 10 ---------- src/ui/mod.rs | 12 ++++++++++++ src/ui/test.rs | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) mode change 120000 => 100644 result diff --git a/result b/result deleted file mode 120000 index 774cfe9..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/mvnsm5ndvx4psah2d3y6yd2vwkypy9m7-sheetui-0.1.0 \ No newline at end of file diff --git a/result b/result new file mode 100644 index 0000000..774cfe9 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/mvnsm5ndvx4psah2d3y6yd2vwkypy9m7-sheetui-0.1.0 \ No newline at end of file diff --git a/src/book/mod.rs b/src/book/mod.rs index 6651a82..9f9225f 100644 --- a/src/book/mod.rs +++ b/src/book/mod.rs @@ -343,12 +343,6 @@ impl Book { sheet: u32, col_idx: usize, ) -> Result<()> { - // TODO(jeremy): This is a little hacky and the underlying model - // supports a better mechanism but UserModel doesn't support it yet. - // https://github.com/ironcalc/IronCalc/issues/273 - // https://github.com/ironcalc/IronCalc/pull/276 is the coming fix. - // NOTE(jwall): Because of the number of cells required to modify - // this is crazy slow let area = self.get_col_range(sheet, col_idx); self.set_cell_style(style, &area)?; Ok(()) @@ -373,10 +367,6 @@ impl Book { sheet: u32, row_idx: usize, ) -> Result<()> { - // TODO(jeremy): This is a little hacky and the underlying model - // supports a better mechanism but UserModel doesn't support it yet. - // https://github.com/ironcalc/IronCalc/issues/273 - // https://github.com/ironcalc/IronCalc/pull/276 is the coming fix. let area = self.get_row_range(sheet, row_idx); self.set_cell_style(style, &area)?; Ok(()) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 662426d..aa6f2c1 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -831,6 +831,18 @@ impl<'ws> Workspace<'ws> { self.state.char_queue.push('g'); } } + KeyCode::Char('b') => { + let address = self.book.location.clone(); + self.book.set_cell_style( + &[("font.b", "true")], + &Area { + sheet: self.book.current_sheet, + row: address.row as i32, + column: address.col as i32, + width: 1, + height: 1, + })?; + } _ => { // noop self.state.char_queue.clear(); diff --git a/src/ui/test.rs b/src/ui/test.rs index 356b695..0446e8a 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -1272,6 +1272,24 @@ fn test_color_col() { } } +#[test] +fn test_bold_text() { + let mut ws = new_workspace(); + let before_style = ws + .book + .get_cell_style(0, &Address { row: 1, col: 1 }) + .expect("Failed to get style"); + assert!(!before_style.font.b); + script() + .char('b') + .run(&mut ws) + .expect("Unable to run script"); + let style = ws + .book + .get_cell_style(0, &Address { row: 1, col: 1 }) + .expect("Failed to get style"); + assert!(style.font.b); +} fn new_workspace<'a>() -> Workspace<'a> { Workspace::new_empty("en", "America/New_York").expect("Failed to get empty workbook") From db0397b8f48d84b3ddcfca8828212a75b2b68d4d Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 18:10:23 -0500 Subject: [PATCH 2/8] chore: update example sheet --- examples/test.xlsx | Bin 3872 -> 3961 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/test.xlsx b/examples/test.xlsx index ac5e7f903956b8f562daadacf378b5c8505ab5bb..f0a336f1006b5a6ca36819627d9375dada3e2cfb 100644 GIT binary patch delta 1758 zcmZ1=_fw89z?+#xgn@y9gW<%csHly68H_9-#^fqSWe8&-fu6X1Ma;LuCswY)-8FxN8k;&YX>#q{MM8x*ex|oYhOBMt;a7x+wvTNSW7L0l6 zZ?svw!P;Deb!vstr%-FM4$Gh>A_< zfALSkukPztUZ&k8@-3SS4qV*v=cHuqd2T^p+Z|zBSDP%;U%0MkvfUSXS4Xvj+{<;^ zroVaN-nl?;$MNYOwivU1TKBK^V!Y$!#|dj|+-}hh0On<)alii;B88(yV zsJ^lBi=1=MXOc?t^P2@fZuXR4+0Sl2?e_2g>TyRnyKg>i*{DUDVwC|LtCJmA6u^~;p4|w?KAjn{HKO_N0mjjzF(xineFSS=(cQ|D`y`0fWq|oBZrrh$+$BnY` zy>BjNEAQw#8dqJ<9z5~8&KX_3(tC*=#tt{r zwF@o2cmEYHykZ`9IeYhm*pq4J&I-m}EfueGs+s#Gpz)iH$~mIwoWJ||Zg!E3!!9Rxh)h_Re<8zn{iVqv?y<}>4luQx3&{1^ekelR zbc@gVRQ5w@S}UW{)~x1>DCdf>tQXlTGugnW;Iveu+aa&N?TV{cX(niQpBHP9ROGTS zE~|+(pX+9#D?PjTHw)J)o~IYHCM)<{Uii71S>1Lc^Y#;Qrxq8-o#MI4EU~Sgm9LfY zwfnRc?B@k%)>c)poRhsV@7d!!hfNR6v)Wp}J9lQHN$4k$6%(T@l*_~X7mIw~w!$LP z-CQr~qRlQ<&2@7cDj2tMoL8LZd_jIw>vUbVn~yf>eA{$motayVMjr(^K3g z&Hn6g`iEUq+%Xk7<2$uy9-b83@Za_edw@41lO8jooSl4z+ZLQ7C-d?cLl`bRR-B+1 z0GG3q+j-0&!UuVzOs!cM7~+dkbBguR%@N;bZt;?Vfx(-Jfq@$-OD}1RpDe&D1u;U8 zS4zB)6`IG<+!4{gf-#TV}2TnZsZJ delta 1709 zcmew{3@Q1^0Y&)*#rnzlMX7ofxjDU)0{sse2pqrvSH%0i`}T!y;u4(_Lc*Rt4H-47 z-!e{Jn|rHyV}AbjgA7j(ZohZ;f8E}H)y)_8ooJSgP~R#wX@~ek29fJdtFBJac{ce& zBMaY5A)V`7ZA+Nk-Rf_iZJ0eJn>#;DdV|J6R=FiHr_N4TBk1e3@^QAtjMtT|pN=lw z#_BA8OVqR{{{~lvkn8s?3@J^Di%ktoWGBi@Xe#&EytR^9V2%?Xt44{*yQ5#0xNd0O zed|KVxhbtjP8|q+x$(xz?|x;6HtAHS?w|PUXYwz@+PS9wyh~TDedMqypf8VRV(ZJ@#r!H=f&kA1cFVl3i3Ei*%OM6AN&YLCKo#Gb{z9=&jXf)TzeQOhT@Au>9KU-2f zr`%~P6gt-bS;K4c?Jf8JuQ|T^g*{`p+2Ozc)$c96cvtcxN5-+|a{DfA%Q|lFdiIyr zm*2+DZMU1}h6g|Qp7)ml7MTp-$eirSq5zJ=&ABXm&}gk^l?4k;UckB!9IX?!t!pi0 zWMJTDW?yr!g$q$GxK@brFEJt zQYQ-oCWUQSKHqtP$XgS=jsGp?*Uw35zsIm!^ZC}JbKaXppA!k&cJ0QqKd(dV_7^>C zJ`&aBI`y+-Wu3-6BYC!fc}S~FQuqg_=sr^~yyE?iN~f_U921fo(wy z$17OxpY6J9u5-2Kn&tA{J$lb3)D>}k%A01>CH}fbRp*V(d=8X^NK!l!{QK< zAvddYh(V*ykrR?5H)nA2LWL^1Gq?PPV;E{g^8Y);$X*Gap*K5Vkw-0*8tCak^Y zaKR&5vsmll+pjO*F?R4D3UP{VR;^jwuDd_6xitO00-F%yvFR6DF63%_-E=VQ$JDnM zj`-xpYCDzO?fi9a;fiC6!s;*A?A^C~Z2+6vp<}U!H&Q5{mrnw$rr2%@ z<4pzz22&;m1}P*pOByvMAK}x41mZ_NDMri5Jp2%2;fa@tfk6UAOX_3~er>ir+#o>! D9(a>t From 8da0ebda4e3c19e3ac77a1bda1c07e85f5d7698d Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 18:10:23 -0500 Subject: [PATCH 3/8] chore: cleanup: formatting and unnecessary file --- result | 1 - src/ui/test.rs | 22 ++++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) delete mode 100644 result diff --git a/result b/result deleted file mode 100644 index 774cfe9..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/mvnsm5ndvx4psah2d3y6yd2vwkypy9m7-sheetui-0.1.0 \ No newline at end of file diff --git a/src/ui/test.rs b/src/ui/test.rs index 0446e8a..847c589 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -320,7 +320,7 @@ fn test_input_navitation_enter_key() { #[test] fn test_input_navitation_tab_key() { let mut ws = new_workspace(); - let col = dbg!(ws.book.location.col); + let col = ws.book.location.col; assert_eq!(Some(&Modality::Navigate), ws.state.modality_stack.last()); script() .tab() @@ -352,7 +352,7 @@ fn test_input_navitation_shift_enter_key() { #[test] fn test_input_navitation_shift_tab_key() { let mut ws = new_workspace(); - let col = dbg!(ws.book.location.col); + let col = ws.book.location.col; assert_eq!(Some(&Modality::Navigate), ws.state.modality_stack.last()); script() .tab() @@ -931,7 +931,6 @@ fn test_edit_mode_paste() { assert_eq!(Some(&Modality::Navigate), ws.state.modality_stack.last()); ws.state.range_select.start = Some(Address { row: 1, col: 1 }); ws.state.range_select.end = Some(Address { row: 2, col: 2 }); - dbg!(ws.selected_range_to_string()); script() .char('e') .ctrl('p') @@ -1130,7 +1129,6 @@ macro_rules! assert_range_copy { Some(&Modality::RangeSelect), ws.state.modality_stack.iter().last() ); - dbg!(ws.state.range_select.get_range()); $script.run(&mut ws).expect("failed to run script"); assert!(ws.state.clipboard.is_some()); match ws.state.clipboard.unwrap() { @@ -1234,7 +1232,13 @@ fn test_color_row() { for ci in [1, book::LAST_COLUMN] { let style = ws .book - .get_cell_style(ws.book.current_sheet, &Address { row: 1, col: ci as usize }) + .get_cell_style( + ws.book.current_sheet, + &Address { + row: 1, + col: ci as usize, + }, + ) .expect("failed to get style"); assert_eq!( "#800000", @@ -1259,7 +1263,13 @@ fn test_color_col() { for ri in [1, book::LAST_ROW] { let style = ws .book - .get_cell_style(ws.book.current_sheet, &Address { row: ri as usize, col: 1 }) + .get_cell_style( + ws.book.current_sheet, + &Address { + row: ri as usize, + col: 1, + }, + ) .expect("failed to get style"); assert_eq!( "#800000", From dae3d71c545740d59d29e7327c0b25cdb6ed75e7 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 18:21:19 -0500 Subject: [PATCH 4/8] wip: styling: use ctrl-i or ctrl-b --- src/ui/mod.rs | 36 ++++++++++++++++++++++++------------ src/ui/test.rs | 21 ++++++++++++++++++++- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index aa6f2c1..f334de8 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -669,6 +669,30 @@ impl<'ws> Workspace<'ws> { self.state.reset_n_prefix(); self.state.char_queue.clear(); } + KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => { + let address = self.book.location.clone(); + self.book.set_cell_style( + &[("font.b", "true")], + &Area { + sheet: self.book.current_sheet, + row: address.row as i32, + column: address.col as i32, + width: 1, + height: 1, + })?; + } + KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::CONTROL) => { + let address = self.book.location.clone(); + self.book.set_cell_style( + &[("font.i", "true")], + &Area { + sheet: self.book.current_sheet, + row: address.row as i32, + column: address.col as i32, + width: 1, + height: 1, + })?; + } KeyCode::Char(d) if d.is_ascii_digit() => { self.handle_numeric_prefix(d); } @@ -831,18 +855,6 @@ impl<'ws> Workspace<'ws> { self.state.char_queue.push('g'); } } - KeyCode::Char('b') => { - let address = self.book.location.clone(); - self.book.set_cell_style( - &[("font.b", "true")], - &Area { - sheet: self.book.current_sheet, - row: address.row as i32, - column: address.col as i32, - width: 1, - height: 1, - })?; - } _ => { // noop self.state.char_queue.clear(); diff --git a/src/ui/test.rs b/src/ui/test.rs index 847c589..21cc249 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -1291,7 +1291,7 @@ fn test_bold_text() { .expect("Failed to get style"); assert!(!before_style.font.b); script() - .char('b') + .ctrl('b') .run(&mut ws) .expect("Unable to run script"); let style = ws @@ -1301,6 +1301,25 @@ fn test_bold_text() { assert!(style.font.b); } +#[test] +fn test_italic_text() { + let mut ws = new_workspace(); + let before_style = ws + .book + .get_cell_style(0, &Address { row: 1, col: 1 }) + .expect("Failed to get style"); + assert!(!before_style.font.i); + script() + .ctrl('i') + .run(&mut ws) + .expect("Unable to run script"); + let style = ws + .book + .get_cell_style(0, &Address { row: 1, col: 1 }) + .expect("Failed to get style"); + assert!(style.font.i); +} + fn new_workspace<'a>() -> Workspace<'a> { Workspace::new_empty("en", "America/New_York").expect("Failed to get empty workbook") } From ba5ea3c6275885733bfbe6fdc016e7e32f8a7359 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 20:00:46 -0500 Subject: [PATCH 5/8] wip: styling: toggle bold and italic --- src/ui/mod.rs | 60 ++++++++++++++++++++++++++------------- src/ui/render/viewport.rs | 27 +++++++++++++----- src/ui/test.rs | 10 +++++++ 3 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index f334de8..8ee1ae4 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -670,28 +670,10 @@ impl<'ws> Workspace<'ws> { self.state.char_queue.clear(); } KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => { - let address = self.book.location.clone(); - self.book.set_cell_style( - &[("font.b", "true")], - &Area { - sheet: self.book.current_sheet, - row: address.row as i32, - column: address.col as i32, - width: 1, - height: 1, - })?; + self.toggle_bold()?; } KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::CONTROL) => { - let address = self.book.location.clone(); - self.book.set_cell_style( - &[("font.i", "true")], - &Area { - sheet: self.book.current_sheet, - row: address.row as i32, - column: address.col as i32, - width: 1, - height: 1, - })?; + self.toggle_italic()?; } KeyCode::Char(d) if d.is_ascii_digit() => { self.handle_numeric_prefix(d); @@ -864,6 +846,44 @@ impl<'ws> Workspace<'ws> { return Ok(None); } + fn toggle_italic(&mut self) -> Result<(), anyhow::Error> { + let address = self.book.location.clone(); + let value = if let Some(style) = self.book.get_cell_style(self.book.current_sheet, &address) { + if style.font.i { "false" } else { "true" } + } else { + "true" + }; + self.book.set_cell_style( + &[("font.i", value)], + &Area { + sheet: self.book.current_sheet, + row: address.row as i32, + column: address.col as i32, + width: 1, + height: 1, + })?; + Ok(()) + } + + fn toggle_bold(&mut self) -> Result<(), anyhow::Error> { + let address = self.book.location.clone(); + let value = if let Some(style) = self.book.get_cell_style(self.book.current_sheet, &address) { + if style.font.b { "false" } else { "true" } + } else { + "true" + }; + self.book.set_cell_style( + &[("font.b", value)], + &Area { + sheet: self.book.current_sheet, + row: address.row as i32, + column: address.col as i32, + width: 1, + height: 1, + })?; + Ok(()) + } + fn paste_range(&mut self) -> Result<(), anyhow::Error> { match &self.state.clipboard { Some(ClipboardContents::Cell(contents)) => { diff --git a/src/ui/render/viewport.rs b/src/ui/render/viewport.rs index e3bf60e..847951a 100644 --- a/src/ui/render/viewport.rs +++ b/src/ui/render/viewport.rs @@ -193,15 +193,28 @@ impl<'ws> Viewport<'ws> { ci: usize, mut cell: Cell<'widget>, ) -> Cell<'widget> { - let style = self + // TODO(zaphar): Should probably create somekind of formatter abstraction. + if let Some(style) = self .book - .get_cell_style(self.book.current_sheet, &Address { row: ri, col: ci }); + .get_cell_style(self.book.current_sheet, &Address { row: ri, col: ci }) { + cell = self.compute_cell_colors(&style, ri, ci, cell); + cell = if style.font.b { + cell.bold() + } else { cell }; + cell = if style.font.i { + cell.italic() + } else { cell }; + } + cell + } + + fn compute_cell_colors<'widget>(&self, style: &ironcalc::base::types::Style, ri: usize, ci: usize, mut cell: Cell<'widget>) -> Cell<'widget> { let bg_color = map_color( - style.as_ref().map(|s| s.fill.bg_color.as_ref()).flatten(), + style.fill.bg_color.as_ref(), Color::Rgb(35, 33, 54), ); let fg_color = map_color( - style.as_ref().map(|s| s.fill.fg_color.as_ref()).flatten(), + style.fill.fg_color.as_ref(), Color::White, ); if let Some((start, end)) = &self.range_selection.map_or(None, |r| r.get_range()) { @@ -212,12 +225,12 @@ impl<'ws> Viewport<'ws> { } else { cell = cell.bg(bg_color).fg(fg_color); } - match (self.book.location.row == ri, self.book.location.col == ci) { + cell = 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() + }; + cell } } diff --git a/src/ui/test.rs b/src/ui/test.rs index 21cc249..f9568e7 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -1299,6 +1299,11 @@ fn test_bold_text() { .get_cell_style(0, &Address { row: 1, col: 1 }) .expect("Failed to get style"); assert!(style.font.b); + script() + .ctrl('b') + .run(&mut ws) + .expect("Unable to run script"); + assert!(!before_style.font.b); } #[test] @@ -1318,6 +1323,11 @@ fn test_italic_text() { .get_cell_style(0, &Address { row: 1, col: 1 }) .expect("Failed to get style"); assert!(style.font.i); + script() + .ctrl('i') + .run(&mut ws) + .expect("Unable to run script"); + assert!(!before_style.font.i); } fn new_workspace<'a>() -> Workspace<'a> { From 4623a911f4a8105947c8ae119b82cdba2f8a85a4 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 26 Feb 2025 20:14:22 -0500 Subject: [PATCH 6/8] wip: styling: resusable toggle func --- src/ui/mod.rs | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 8ee1ae4..1b4cd9a 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -670,10 +670,14 @@ impl<'ws> Workspace<'ws> { self.state.char_queue.clear(); } KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => { - self.toggle_bold()?; + let address = self.book.location.clone(); + let style = self.book.get_cell_style(self.book.current_sheet, &address).map(|s| s.font.b); + self.toggle_bool_style(style, "font.b", &address)?; } KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::CONTROL) => { - self.toggle_italic()?; + let address = self.book.location.clone(); + let style = self.book.get_cell_style(self.book.current_sheet, &address).map(|s| s.font.i); + self.toggle_bool_style(style, "font.i", &address)?; } KeyCode::Char(d) if d.is_ascii_digit() => { self.handle_numeric_prefix(d); @@ -846,34 +850,14 @@ impl<'ws> Workspace<'ws> { return Ok(None); } - fn toggle_italic(&mut self) -> Result<(), anyhow::Error> { - let address = self.book.location.clone(); - let value = if let Some(style) = self.book.get_cell_style(self.book.current_sheet, &address) { - if style.font.i { "false" } else { "true" } + fn toggle_bool_style(&mut self, current_val: Option, path: &str, address: &Address) -> Result<(), anyhow::Error> { + let value = if let Some(b_val) = current_val { + if b_val { "false" } else { "true" } } else { "true" }; self.book.set_cell_style( - &[("font.i", value)], - &Area { - sheet: self.book.current_sheet, - row: address.row as i32, - column: address.col as i32, - width: 1, - height: 1, - })?; - Ok(()) - } - - fn toggle_bold(&mut self) -> Result<(), anyhow::Error> { - let address = self.book.location.clone(); - let value = if let Some(style) = self.book.get_cell_style(self.book.current_sheet, &address) { - if style.font.b { "false" } else { "true" } - } else { - "true" - }; - self.book.set_cell_style( - &[("font.b", value)], + &[(path, value)], &Area { sheet: self.book.current_sheet, row: address.row as i32, From 621c35d7c4b2b01d0c5f57459d2af86c345092af Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Thu, 27 Feb 2025 18:45:42 -0500 Subject: [PATCH 7/8] wip: different keybinds for bold and italic --- examples/test.xlsx | Bin 3961 -> 4066 bytes src/ui/mod.rs | 4 ++-- src/ui/test.rs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/test.xlsx b/examples/test.xlsx index f0a336f1006b5a6ca36819627d9375dada3e2cfb..3276b32b66473c6e9751a3a742706de2ef5095d6 100644 GIT binary patch delta 1897 zcmew<_eh>Mz?+#xgn@y9gJJdF=#9LYjLfU|Mo+F}Q~}cq7~gWN-Wwft#^-Iyj^Zlh|j~On8sW^CeC@31TJknE1W4Wc`W#e^!-j=(&c-7t|{r)cg zygxlXzI19$6aTGQmM7IEJr8)S-V%B4e)Zaq*h@k_PTsjfpcU|Q<`OkRyC4vy9d zuiTU(m8Z%~%zL_8Zh=ZGSC)Z9hTX}RVcid27i?I#{*6X<@7m_(OTL96^{lpBvzN^@ zan#s7+x z*vi?JN_13Ty!9f{EWp#GgTE|KtN-ZHr;oa(=p$t7jW7Hv0IdbCWB?b*j4ANJq03koTJW0|taV1DR=39s(3 z?259G{eIb0L(IRof98cl!jjwal4iJ0)!5h?w&Zrk+0yQlpLNPTj>Z(t-y`y7{jA+` zwTE>VEm2n1IZgVcaul_G@r!oJEWwb-b?Hr0vtNAL;5!q{i{P{wb@Kc2V>=lc7*?|~Fz_-kFjVB|7nfA#q!#N{kK@s=koih7dfwgB+!$mtZo^w`|PvjMYk5M;j-Cv zYpI4*{Sgny!gI!&Fiy2lO?tqTfT8@zRP|(Vfoxv!^75W=iKK!n&T>ej;Uy7cK2KR z-3$J93CG2J+4JFPR72=&g83A#A9ySE4{kH z_~nGjmfvkHt0WTsFmH2DH}Y-E+W)De!*<$coq0=jLhhuBF3(%EKcH`y((JY$hrYZG zJz5@~`v1p-waemn?zngL>AuCqf^tlGE>$~~8ocCmRl2heopI(Zou#k&{@nSTuUshc zyjhJy9Fl|`IKhR`=5$Uzh(HCGCOAz8U4GbF#>l`B!#sICmwf%?`~J-a0>|(F)%KWw z<;>Kw{o)BX=cw6P*S>#nCc&t;U}^x%nn%ZuFae+=B`UFuQS5tniL!ppUG(d-90PdsHAx1=+~w7ytTy7NfHQFo0Q zQe8qjRxWW8^O+qYw?RvFL;aFGtsRY3C6kC z!jG>B(cqeN=E|E|8_vv*YbiSwSsrSvaNnO^5H|P5X7iieg_}-#3n@KrNc$arLh)Kc zQPPA}=X55`^k?m#@O)a%o}U@*HyCdO?*90Gi|%C|t|b=Ln-(53i@3d_%cDWN{<6sS z<fxhGEOe(2-$mHeu3pKi-;ZXTyN)IU$R%MOmuPfGlBm_ zJTGndUnU&e`|RPl&q?2tUF-wA8JYB$MHtwjmB(Zi9y?GOG`WyZdU6AgB$z#i#~M+A z+~+X|3rg}Df@xn~Gceu8s|Su(q_XM|uSpcB_(IS03{bG7v49P&2!Oc<>YOM+GX?Xv z3=9lSj0_C?P;DS;Nn^<506sae&4ql@jCqrL`6T2)mKEDgVZ6z}z+lS6z#s)u3dKtr sr%pb?rwP{aflr!o*<>DmS+EX7N@QS=fT{*jOBydt_TblMtK$Lj0BnXl)c^nh delta 1767 zcmaDP|5J`Pz?+#xgn@y9gW<%csExdtjLauCMNO_`Q~}cq7~gW7*c27zvir~B$y1r+ z>+}5&83-J^|66m~KKZ*{_2M%+rG$ljeOfYV!f!KcMc>}So_zmaUNfVY&$mV8-|wv7 zzTAA*-6^hH*q%?lm^_J3NT^ZFP0Ln(^2;ZN`_v}7uT$0UX)|1TaPsXxIVw47Jo8kULs<9Xpk95|(Hec3hdW(&r=^f%iwl{t0ghHV8wyR^T(>J8t!Vbv-} z)10M=|EARKvDv?Mzm)df2-Sus7d^UoM8zibzxXHNSNHWRFVpT4`IgNE2QKdTb5gSQ zJhz~)?T)amtLsgc=`UQ@GuiHoysM+yLGI-`ZPVYpaPM58x8wNq4_k~`Kdt*$dokYe z^5cZHHSRWD+uX`GH}*6+My5Ys_sMQg{S2E)b5!5h_(jgS=QBwq`T5O)A2)l-uk2@^ zcKi2#^|&LP-8Y}MY}BcFd6lt{J>$4Iqn-J>cgOC#zx|cP^ZRp~jCgpowf{1{={Elv zVG+jwinz%hEQ+8A+nmF~4~fA#RyjUU%pKnRY}*6|28Q(vlUK1y)tmM@avd@daQ!|{ z>C8R9Qbi@tT>>_Zatd3Lr8Cq_jYaqFeR=3;`~M#`^WNHJn&oQ=8CzSJ=t?}Y2W>uvY8m!b4cX_GqS5jhr@yHGJS%->F)}dB zVrF3AWnf^a$k8t@smw_&)~m?PSvvV(-eU!Uw)ek9I(|#?j ztUV4VFs^)LSDW4=eEj&TeFmS6|I{$=sIsUQcyFdAzG2$;a%;_cow9=#GFd-=UHbP& z+x3)GZ(GB*X_I|FE&Lg{)TXi4E^0QbWx}ebhR;9F4_av*wf=IfgzhCD`9;@fUb0wW z;!Et7WI&90TEFp+cz@MqB@UjqZB%O@e2l#Ns{S!nHxB zQ=@cdt>WKNnzV4`rS^*J4yWpErw&N8_s5gC~C1 zIissrdM~lV*x_cH+>AqvIhr0Bs{)_rC~uq6p;|Z7?G@Y0l9gU}MK;{Dn($oF#o4^{ zb<~n&Ot;gUI`S+&%{aWG!sz(}O#?rEMpJ`lsYit-@h?!V%NSIomMXYYOx zdou0ZS;5$=rQ&r?HFLiNG=8(OJi)i#CVT&r%yZeRQ_KFYp5>1ckDC)Y#39MBniE`* zY+l642NBrJr3p@#@-zQrcrY?BG%`(o#U)=qDb~N)K&0*cU(qGuS$~mIwoWJ|| zZg!E3!!9Rxh)h_Re<8zn{iVqv?y<}>4luQx3&{1^ekelRbc@gVRQ5w@S}UW{)~x1> zDCdf>tQXlTGugnW;Iveu+aa&N?TV{cX(niQpBHP9ROGTSE~|+(pX+9#D?PjTHw)J) zo~IYHCM)<{Uii71S>1Lc^Y#;Qrxq8-o#MI4EU~Sgm9LfYwfnRc?B@k%)>c)poRhsV z@7d!!hfNR6v)Wp}J9lQHN$4k$6%(T@l*_~X7mIw~w!$L9-CQr~qRlQ<&2@7cDj2tM zoL8LZd_jIw>vUbVn~yf>eA{$motayVMjr(^K3g&Hn6g`iEUq+%Xk7<2$uy z9-b83@Za_edw@41lO8j?M4#NtV+Sf2CZFRm0n@C!)`$|_gV!7^*u-lHrnm8$f$8_W zdf-SxDm=9LOyoi333?7?fPy8BA(QL)WWd_z@<}sFPTt8U2j-pQk(M#$1n1@WqSTyX zeRL-Z@=G&CaZcXIDKpuNp9icbl3&_3n+vR`JijQrI3qQ+1VdvKA`LMxNI=~IqLwsH OpS+P@n@yAl!~+1(?e{ Workspace<'ws> { self.state.reset_n_prefix(); self.state.char_queue.clear(); } - KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => { + KeyCode::Char('B') => { let address = self.book.location.clone(); let style = self.book.get_cell_style(self.book.current_sheet, &address).map(|s| s.font.b); self.toggle_bool_style(style, "font.b", &address)?; } - KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::CONTROL) => { + KeyCode::Char('I') => { let address = self.book.location.clone(); let style = self.book.get_cell_style(self.book.current_sheet, &address).map(|s| s.font.i); self.toggle_bool_style(style, "font.i", &address)?; diff --git a/src/ui/test.rs b/src/ui/test.rs index f9568e7..64a7c9a 100644 --- a/src/ui/test.rs +++ b/src/ui/test.rs @@ -1291,7 +1291,7 @@ fn test_bold_text() { .expect("Failed to get style"); assert!(!before_style.font.b); script() - .ctrl('b') + .char('B') .run(&mut ws) .expect("Unable to run script"); let style = ws @@ -1300,7 +1300,7 @@ fn test_bold_text() { .expect("Failed to get style"); assert!(style.font.b); script() - .ctrl('b') + .char('B') .run(&mut ws) .expect("Unable to run script"); assert!(!before_style.font.b); @@ -1315,7 +1315,7 @@ fn test_italic_text() { .expect("Failed to get style"); assert!(!before_style.font.i); script() - .ctrl('i') + .char('I') .run(&mut ws) .expect("Unable to run script"); let style = ws @@ -1324,7 +1324,7 @@ fn test_italic_text() { .expect("Failed to get style"); assert!(style.font.i); script() - .ctrl('i') + .char('I') .run(&mut ws) .expect("Unable to run script"); assert!(!before_style.font.i); From 2aa9fd69b1762d7b231136a737c06bdba724ebf9 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Thu, 27 Feb 2025 18:49:08 -0500 Subject: [PATCH 8/8] wip: update docs for bold and italic --- docs/navigation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/navigation.md b/docs/navigation.md index 54ba0ea..dff745e 100644 --- a/docs/navigation.md +++ b/docs/navigation.md @@ -29,6 +29,7 @@ will clear the numeric prefix if you want to cancel it. **Modifying the Sheet or Cells** * `e` or `i` will enter CellEdit mode for the current cell. +* 'I' will toggle italic on the cell. 'B' will toggle bold. * `Ctrl-h` will shorten the width of the column you are on. * `Ctrl-l` will lengthen the width of the column you are on.