From 0dd86eb658325bf02e4328540461dd977379a5ee Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Wed, 3 Jun 2026 20:13:30 +0300 Subject: [PATCH] feat(tablestyle): editable General section (margins, flow-suppress toggles) The Table Style editor's General fields are now editable: H/V cell margins (buffers + Apply) and title/header row-suppressed toggles, loaded from the selected style on select. Per-cell (Data/Header/Title) text/fill/border editing remains a follow-up. Co-Authored-By: Claude Opus 4.8 --- src/app/mod.rs | 12 +++++++++ src/app/update.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++ src/app/view.rs | 2 ++ src/ui/tablestyle.rs | 40 ++++++++++++++++++++++++---- 4 files changed, 111 insertions(+), 5 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index e638ec2c7..a17e09c6d 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -296,6 +296,9 @@ pub(super) struct OpenCADStudio { // ── TableStyle Dialog ───────────────────────────────────────────────── tablestyle_selected: String, + /// Edit buffers for the table style's general margins. + ts_hmargin: String, + ts_vmargin: String, // ── TextStyle Font Browser ──────────────────────────────────────────── textstyle_selected: String, @@ -987,6 +990,13 @@ pub enum Message { TableStyleDialogDelete, /// Toggle the Annotative flag on the selected table style. TableStyleToggleAnnotative, + /// Toggle a boolean flag (title_suppressed / header_suppressed / flow) on + /// the selected table style. + TableStyleToggle(&'static str), + /// Update a general edit buffer (hmargin / vmargin). + TableStyleEdit { field: &'static str, value: String }, + /// Write the general edit buffers back into the selected table style. + TableStyleApply, // ── MLineStyle Dialog ───────────────────────────────────────────────── MlStyleDialogOpen, #[allow(dead_code)] @@ -1158,6 +1168,8 @@ impl OpenCADStudio { textstyle_ttf: String::new(), // TableStyle dialog tablestyle_selected: "Standard".to_string(), + ts_hmargin: "1.5".to_string(), + ts_vmargin: "1.5".to_string(), // MLineStyle dialog mlstyle_selected: "Standard".to_string(), // DimStyle dialog diff --git a/src/app/update.rs b/src/app/update.rs index 3faa74218..a12e97c56 100644 --- a/src/app/update.rs +++ b/src/app/update.rs @@ -5740,7 +5740,69 @@ impl OpenCADStudio { } } Message::TableStyleDialogSelect(name) => { + use acadrust::objects::ObjectType; self.tablestyle_selected = name; + let i = self.active_tab; + for obj in self.tabs[i].scene.document.objects.values() { + if let ObjectType::TableStyle(s) = obj { + if s.name == self.tablestyle_selected { + self.ts_hmargin = format!("{:.4}", s.horizontal_margin); + self.ts_vmargin = format!("{:.4}", s.vertical_margin); + } + } + } + Task::none() + } + + Message::TableStyleEdit { field, value } => { + match field { + "hmargin" => self.ts_hmargin = value, + "vmargin" => self.ts_vmargin = value, + _ => {} + } + Task::none() + } + + Message::TableStyleApply => { + use acadrust::objects::ObjectType; + let i = self.active_tab; + let name = self.tablestyle_selected.clone(); + let h: Option = self.ts_hmargin.trim().parse().ok(); + let v: Option = self.ts_vmargin.trim().parse().ok(); + self.push_undo_snapshot(i, "TABLESTYLE EDIT"); + for obj in self.tabs[i].scene.document.objects.values_mut() { + if let ObjectType::TableStyle(s) = obj { + if s.name == name { + if let Some(h) = h { + s.horizontal_margin = h; + } + if let Some(v) = v { + s.vertical_margin = v; + } + } + } + } + self.tabs[i].dirty = true; + Task::none() + } + + Message::TableStyleToggle(field) => { + use acadrust::objects::ObjectType; + let i = self.active_tab; + let name = self.tablestyle_selected.clone(); + self.push_undo_snapshot(i, "TABLESTYLE EDIT"); + for obj in self.tabs[i].scene.document.objects.values_mut() { + if let ObjectType::TableStyle(s) = obj { + if s.name == name { + match field { + "title_sup" => s.title_suppressed = !s.title_suppressed, + "header_sup" => s.header_suppressed = !s.header_suppressed, + _ => {} + } + } + } + } + self.tabs[i].dirty = true; Task::none() } diff --git a/src/app/view.rs b/src/app/view.rs index ecbdeeb41..b6c1653d3 100644 --- a/src/app/view.rs +++ b/src/app/view.rs @@ -117,6 +117,8 @@ impl OpenCADStudio { styles, &self.tablestyle_selected, selected_style, + &self.ts_hmargin, + &self.ts_vmargin, ); } if Some(window_id) == self.mlstyle_window { diff --git a/src/ui/tablestyle.rs b/src/ui/tablestyle.rs index fb27756ab..b6688b90d 100644 --- a/src/ui/tablestyle.rs +++ b/src/ui/tablestyle.rs @@ -1,7 +1,7 @@ //! Table Style Manager window — fills the entire OS window. use crate::app::Message; -use iced::widget::{button, checkbox, column, container, row, scrollable, text, Space}; +use iced::widget::{button, checkbox, column, container, row, scrollable, text, text_input, Space}; use iced::{Background, Border, Color, Element, Fill, Theme}; const TB: Color = Color { @@ -129,6 +129,8 @@ pub fn view_window<'a>( styles: Vec, selected: &'a str, selected_style: Option<&'a acadrust::objects::TableStyle>, + hmargin_buf: &'a str, + vmargin_buf: &'a str, ) -> Element<'a, Message> { // ── Toolbar ─────────────────────────────────────────────────────────── let toolbar = container( @@ -227,10 +229,38 @@ pub fn view_window<'a>( .on_toggle(|_| Message::TableStyleToggleAnnotative) .size(14) .text_size(11), - info_row("H Margin:", format!("{:.4}", s.horizontal_margin)), - info_row("V Margin:", format!("{:.4}", s.vertical_margin)), - info_row("Title Suppressed:", s.title_suppressed.to_string()), - info_row("Header Suppressed:", s.header_suppressed.to_string()), + row![ + text("H Margin:").size(11).color(DIM).width(160), + text_input("1.5", hmargin_buf) + .on_input(|v| Message::TableStyleEdit { field: "hmargin", value: v }) + .size(11) + .width(100), + ] + .spacing(8) + .align_y(iced::Center), + row![ + text("V Margin:").size(11).color(DIM).width(160), + text_input("1.5", vmargin_buf) + .on_input(|v| Message::TableStyleEdit { field: "vmargin", value: v }) + .size(11) + .width(100), + ] + .spacing(8) + .align_y(iced::Center), + checkbox(s.title_suppressed) + .label("Title row suppressed") + .on_toggle(|_| Message::TableStyleToggle("title_sup")) + .size(14) + .text_size(11), + checkbox(s.header_suppressed) + .label("Header row suppressed") + .on_toggle(|_| Message::TableStyleToggle("header_sup")) + .size(14) + .text_size(11), + button(text("Apply margins").size(11)) + .on_press(Message::TableStyleApply) + .style(btn_s(true)) + .padding([4, 12]), row_info("Data Row:", &s.data_row_style), row_info("Header Row:", &s.header_row_style), row_info("Title Row:", &s.title_row_style),