cleanup
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 10 Apr 2025 01:01:15 +0000 (18:01 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 10 Apr 2025 01:01:15 +0000 (18:01 -0700)
rust/pspp/src/output/pivot/look_xml.rs
rust/pspp/src/output/pivot/mod.rs
rust/pspp/src/output/pivot/output.rs
rust/pspp/src/output/pivot/tlo.rs
rust/pspp/src/output/table.rs

index 58fdeea77eb2e18ca75f0f652592ab8380eb3e4c..d72e89b6f75b8d41e87b4f22f2308eee24150335 100644 (file)
@@ -28,8 +28,8 @@ impl From<TableProperties> for Look {
                 omit_empty: table_properties.general_properties.hide_empty_rows,
                 row_label_position: table_properties.general_properties.row_label_position,
                 heading_widths: enum_map! {
-                    HeadingRegion::ColumnHeadings => table_properties.general_properties.minimum_column_width..=table_properties.general_properties.maximum_column_width,
-                    HeadingRegion::RowHeadings => table_properties.general_properties.minimum_row_width..=table_properties.general_properties.maximum_row_width,
+                    HeadingRegion::Columns => table_properties.general_properties.minimum_column_width..=table_properties.general_properties.maximum_column_width,
+                    HeadingRegion::Rows => table_properties.general_properties.minimum_row_width..=table_properties.general_properties.maximum_row_width,
                 }.map(|_k, r|(*r.start()).try_into().unwrap_or_default()..=(*r.end()).try_into().unwrap_or_default()),
                 footnote_marker_type: table_properties.footnote_properties.marker_type,
                 footnote_marker_position: table_properties.footnote_properties.marker_position,
@@ -53,14 +53,14 @@ impl From<TableProperties> for Look {
                     Border::InnerFrame(BoxBorder::Top) => table_properties.border_properties.top_inner_frame,
                     Border::InnerFrame(BoxBorder::Right) => table_properties.border_properties.right_inner_frame,
                     Border::InnerFrame(BoxBorder::Bottom) => table_properties.border_properties.bottom_inner_frame,
-                    Border::Dimensions(RowColBorder::ColHorz) => table_properties.border_properties.horizontal_dimension_border_columns,
-                    Border::Dimensions(RowColBorder::ColVert) => table_properties.border_properties.vertical_dimension_border_columns,
-                    Border::Dimensions(RowColBorder::RowHorz) => table_properties.border_properties.horizontal_dimension_border_rows,
-                    Border::Dimensions(RowColBorder::RowVert) => table_properties.border_properties.vertical_dimension_border_rows,
-                    Border::Categories(RowColBorder::ColHorz) => table_properties.border_properties.horizontal_category_border_columns,
-                    Border::Categories(RowColBorder::ColVert) => table_properties.border_properties.vertical_category_border_columns,
-                    Border::Categories(RowColBorder::RowHorz) => table_properties.border_properties.horizontal_category_border_rows,
-                    Border::Categories(RowColBorder::RowVert) => table_properties.border_properties.vertical_category_border_rows,
+                    Border::Dimension(RowColBorder(HeadingRegion::Columns, Axis2::X)) => table_properties.border_properties.horizontal_dimension_border_columns,
+                    Border::Dimension(RowColBorder(HeadingRegion::Columns, Axis2::Y)) => table_properties.border_properties.vertical_category_border_columns,
+                    Border::Dimension(RowColBorder(HeadingRegion::Rows, Axis2::X)) => table_properties.border_properties.horizontal_dimension_border_rows,
+                    Border::Dimension(RowColBorder(HeadingRegion::Rows, Axis2::Y)) => table_properties.border_properties.vertical_category_border_rows,
+                    Border::Category(RowColBorder(HeadingRegion::Columns, Axis2::X)) => table_properties.border_properties.horizontal_category_border_columns,
+                    Border::Category(RowColBorder(HeadingRegion::Columns, Axis2::Y)) => table_properties.border_properties.vertical_category_border_columns,
+                    Border::Category(RowColBorder(HeadingRegion::Rows, Axis2::X)) => table_properties.border_properties.horizontal_category_border_rows,
+                    Border::Category(RowColBorder(HeadingRegion::Rows, Axis2::Y)) => table_properties.border_properties.vertical_category_border_rows,
                     Border::DataLeft => table_properties.border_properties.data_area_left,
                     Border::DataTop => table_properties.border_properties.data_area_top,
                 },
index 5d25d0b9cab542d99a733b33bb82a9b13f29eb0b..096691764c264970e2dff92d37b94d6f2e27c446 100644 (file)
@@ -164,8 +164,8 @@ pub enum Border {
     Title,
     OuterFrame(BoxBorder),
     InnerFrame(BoxBorder),
-    Dimensions(RowColBorder),
-    Categories(RowColBorder),
+    Dimension(RowColBorder),
+    Category(RowColBorder),
     DataLeft,
     DataTop,
 }
@@ -174,8 +174,10 @@ impl Border {
     pub fn default_stroke(self) -> Stroke {
         match self {
             Self::InnerFrame(_) | Self::DataLeft | Self::DataTop => Stroke::Thick,
-            Self::Dimensions(side) if side != RowColBorder::RowVert => Stroke::Solid,
-            Self::Categories(RowColBorder::ColHorz | RowColBorder::ColVert) => Stroke::Solid,
+            Self::Dimension(
+                RowColBorder(HeadingRegion::Columns, _) | RowColBorder(_, Axis2::X),
+            )
+            | Self::Category(RowColBorder(HeadingRegion::Columns, _)) => Stroke::Solid,
             _ => Stroke::None,
         }
     }
@@ -193,8 +195,8 @@ impl Border {
             | Self::InnerFrame(_)
             | Self::DataLeft
             | Self::DataTop
-            | Self::Categories(_) => self,
-            Self::Dimensions(row_col_border) => Self::Categories(row_col_border),
+            | Self::Category(_) => self,
+            Self::Dimension(row_col_border) => Self::Category(row_col_border),
         }
     }
 }
@@ -210,12 +212,12 @@ pub enum BoxBorder {
 
 /// Borders between rows and columns.
 #[derive(Copy, Clone, Debug, Enum, PartialEq, Eq)]
-pub enum RowColBorder {
-    RowHorz,
-    RowVert,
-    ColHorz,
-    ColVert,
-}
+pub struct RowColBorder(
+    /// Row or column headings.
+    HeadingRegion,
+    /// Horizontal ([Axis2::X]) or vertical ([Axis2::Y]) borders.
+    Axis2,
+);
 
 /// Sizing for rows or columns of a rendered table.
 ///
@@ -882,8 +884,8 @@ impl Default for Look {
             omit_empty: true,
             row_label_position: LabelPosition::default(),
             heading_widths: EnumMap::from_fn(|region| match region {
-                HeadingRegion::RowHeadings => 36..=72,
-                HeadingRegion::ColumnHeadings => 36..=120,
+                HeadingRegion::Rows => 36..=72,
+                HeadingRegion::Columns => 36..=120,
             }),
             footnote_marker_type: FootnoteMarkerType::default(),
             footnote_marker_position: FootnoteMarkerPosition::default(),
@@ -1007,8 +1009,8 @@ pub enum LabelPosition {
 /// ```
 #[derive(Copy, Clone, Debug, PartialEq, Eq, Enum)]
 pub enum HeadingRegion {
-    RowHeadings,
-    ColumnHeadings,
+    Rows,
+    Columns,
 }
 
 #[derive(Clone, Debug)]
index 58d5c1f873fc7b7b241ab012a0d251afa1a05edf..3499cf547a3f2e84f1f96391eebef4edefb9ca92 100644 (file)
@@ -5,7 +5,7 @@ use itertools::Itertools;
 use smallvec::SmallVec;
 
 use crate::output::{
-    pivot::{Group, LabelPosition, Leaf},
+    pivot::{Group, HeadingRegion, LabelPosition, Leaf},
     table::{CellInner, Table},
 };
 
@@ -177,16 +177,14 @@ impl PivotTable {
         column_headings.render(
             &mut body,
             row_headings.height(),
-            RowColBorder::ColHorz,
-            RowColBorder::ColVert,
+            HeadingRegion::Columns,
             self.rotate_outer_row_labels,
             false,
         );
         row_headings.render(
             &mut body,
             column_headings.height(),
-            RowColBorder::RowVert,
-            RowColBorder::RowHorz,
+            HeadingRegion::Rows,
             false,
             self.rotate_inner_column_labels,
         );
@@ -398,8 +396,7 @@ impl<'a> Heading<'a> {
         h: Axis2,
         h_ofs: usize,
         v_ofs: usize,
-        col_horz: RowColBorder,
-        col_vert: RowColBorder,
+        region: HeadingRegion,
         rotate_inner_labels: bool,
         rotate_outer_labels: bool,
         inner: bool,
@@ -457,10 +454,11 @@ impl<'a> Heading<'a> {
                 // |aaaa1#aaaa2#aaaa3|aaaa1#aaaa2#aaaa3|aaaa1#aaaa2#aaaa3|
                 // +-----+-----+-----+-----+-----+-----+-----+-----+-----+
                 //     ```
+                let row_col = RowColBorder(region, v);
                 let border = if row == self.height - 1 && inner {
-                    Border::Categories(col_vert)
+                    Border::Category(row_col)
                 } else {
-                    Border::Dimensions(col_vert)
+                    Border::Dimension(row_col)
                 };
                 for x in [x1, x2] {
                     if !vrules[x] {
@@ -487,7 +485,11 @@ impl<'a> Heading<'a> {
                 // +-----+-----+-----+-----+-----+-----+-----+-----+-----+
                 // ```
                 if row > 0 {
-                    table.draw_line(Border::Categories(col_horz), (h, y1), h_ofs..table.n[h]);
+                    table.draw_line(
+                        Border::Category(RowColBorder(region, h)),
+                        (h, y1),
+                        h_ofs..table.n[h],
+                    );
                 }
             }
         }
@@ -530,8 +532,7 @@ impl<'a> Headings<'a> {
         &self,
         table: &mut Table,
         h_ofs: usize,
-        col_horz: RowColBorder,
-        col_vert: RowColBorder,
+        region: HeadingRegion,
         rotate_inner_labels: bool,
         rotate_outer_labels: bool,
     ) {
@@ -554,8 +555,7 @@ impl<'a> Headings<'a> {
                 h,
                 h_ofs,
                 v_ofs,
-                col_horz,
-                col_vert,
+                region,
                 rotate_inner_labels,
                 rotate_outer_labels,
                 inner,
@@ -576,7 +576,11 @@ impl<'a> Headings<'a> {
                 // |aaaa1|aaaa2|aaaa3|aaaa1|aaaa2|aaaa3|aaaa1|aaaa2|aaaa3| _|
                 // +-----+-----+-----+-----+-----+-----+-----+-----+-----+
                 // ```
-                table.draw_line(Border::Dimensions(col_horz), (h, v_ofs), h_ofs..table.n[h]);
+                table.draw_line(
+                    Border::Dimension(RowColBorder(region, h)),
+                    (h, v_ofs),
+                    h_ofs..table.n[h],
+                );
             }
         }
     }
index 6697d3a6a8d760dd48dd5ad6208ba34e589c43bf..512024635f22de10a1896ee5484719b206043e61 100644 (file)
@@ -64,8 +64,8 @@ impl From<TableLook> for Look {
                 LabelPosition::Corner
             },
             heading_widths: enum_map! {
-                    HeadingRegion::ColumnHeadings => look.v2_styles.min_column_width..=look.v2_styles.max_column_width,
-                    HeadingRegion::RowHeadings => look.v2_styles.min_row_width..=look.v2_styles.max_row_width,
+                    HeadingRegion::Columns => look.v2_styles.min_column_width..=look.v2_styles.max_column_width,
+                    HeadingRegion::Rows => look.v2_styles.min_row_width..=look.v2_styles.max_row_width,
                 }.map(|_k, range| pt_to_px(*range.start())..=pt_to_px(*range.end())),
             footnote_marker_type: if (flags & 4) != 0 {
                 FootnoteMarkerType::Numeric
@@ -97,14 +97,22 @@ impl From<TableLook> for Look {
                     Border::InnerFrame(BoxBorder::Top) => look.v2_styles.top_inner_frame,
                     Border::InnerFrame(BoxBorder::Right) => look.v2_styles.right_inner_frame,
                     Border::InnerFrame(BoxBorder::Bottom) => look.v2_styles.bottom_inner_frame,
-                    Border::Dimensions(RowColBorder::ColHorz) => look.pv_separator_style.horizontal_dimension_columns,
-                    Border::Dimensions(RowColBorder::ColVert) => look.pv_separator_style.vertical_dimension_columns,
-                    Border::Dimensions(RowColBorder::RowHorz) => look.pv_separator_style.vertical_dimension_rows,
-                    Border::Dimensions(RowColBorder::RowVert) => look.pv_separator_style.vertical_dimension_rows,
-                    Border::Categories(RowColBorder::ColHorz) => look.pv_separator_style.horizontal_category_columns,
-                    Border::Categories(RowColBorder::ColVert) => look.pv_separator_style.vertical_category_columns,
-                    Border::Categories(RowColBorder::RowHorz) => look.pv_separator_style.vertical_category_rows,
-                    Border::Categories(RowColBorder::RowVert) => look.pv_separator_style.vertical_category_rows,
+                    Border::Dimension(RowColBorder(region, direction)) => {
+                        match (region, direction) {
+                            (HeadingRegion::Columns, Axis2::X) => look.pv_separator_style.horizontal_dimension_columns,
+                            (HeadingRegion::Columns, Axis2::Y) => look.pv_separator_style.vertical_dimension_columns,
+                            (HeadingRegion::Rows, Axis2::X) => look.pv_separator_style.horizontal_dimension_rows,
+                            (HeadingRegion::Rows, Axis2::Y) => look.pv_separator_style.vertical_dimension_rows,
+                        }
+                    },
+                    Border::Category(RowColBorder(region, direction)) => {
+                        match (region, direction) {
+                            (HeadingRegion::Columns, Axis2::X) => look.pv_separator_style.horizontal_category_columns,
+                            (HeadingRegion::Columns, Axis2::Y) => look.pv_separator_style.vertical_category_columns,
+                            (HeadingRegion::Rows, Axis2::X) => look.pv_separator_style.horizontal_category_rows,
+                            (HeadingRegion::Rows, Axis2::Y) => look.pv_separator_style.vertical_category_rows,
+                        }
+                    },
                     Border::DataLeft => look.v2_styles.data_left,
                     Border::DataTop => look.v2_styles.data_top
                 },
index 2ca155ef622e53cb0e12e305868b41508d9a5c0b..4a774404fdd0641909caebcdf2acaccb50510df5 100644 (file)
@@ -274,9 +274,9 @@ impl Table {
     /// The heading region that `pos` is part of, if any.
     pub fn heading_region(&self, pos: Coord2) -> Option<HeadingRegion> {
         if pos.x() < self.h.x() {
-            Some(HeadingRegion::RowHeadings)
+            Some(HeadingRegion::Rows)
         } else if pos.y() < self.h.y() {
-            Some(HeadingRegion::ColumnHeadings)
+            Some(HeadingRegion::Columns)
         } else {
             None
         }