use crate::enums::chart::{XlAxisCrosses, XlCategoryType, XlTickLabelPosition, XlTickMark};
use super::super::chart::ChartFormat;
use super::{AxisTitle, TickLabels};
#[derive(Debug, Clone)]
#[allow(clippy::struct_excessive_bools)]
pub struct CategoryAxis {
has_title: bool,
title: Option<String>,
axis_title: Option<AxisTitle>,
visible: bool,
major_tick_mark: XlTickMark,
minor_tick_mark: XlTickMark,
tick_label_position: XlTickLabelPosition,
has_major_gridlines: bool,
has_minor_gridlines: bool,
crosses: XlAxisCrosses,
category_type: XlCategoryType,
number_format: String,
reverse_order: bool,
tick_labels: Option<TickLabels>,
format: Option<ChartFormat>,
major_gridline_format: Option<ChartFormat>,
minor_gridline_format: Option<ChartFormat>,
}
impl CategoryAxis {
#[must_use]
pub fn new() -> Self {
Self {
has_title: false,
title: None,
axis_title: None,
visible: true,
major_tick_mark: XlTickMark::Outside,
minor_tick_mark: XlTickMark::None,
tick_label_position: XlTickLabelPosition::NextToAxis,
has_major_gridlines: false,
has_minor_gridlines: false,
crosses: XlAxisCrosses::Automatic,
category_type: XlCategoryType::AutomaticScale,
number_format: "General".to_string(),
reverse_order: false,
tick_labels: None,
format: None,
major_gridline_format: None,
minor_gridline_format: None,
}
}
#[must_use]
pub const fn has_title(&self) -> bool {
self.has_title
}
pub fn set_has_title(&mut self, value: bool) {
self.has_title = value;
if !value {
self.title = None;
self.axis_title = None;
}
}
#[must_use]
pub fn title(&self) -> Option<&str> {
self.title.as_deref()
}
pub fn set_title(&mut self, title: &str) {
self.has_title = true;
self.title = Some(title.to_string());
self.axis_title = Some(AxisTitle::from_text(title));
}
#[must_use]
pub const fn axis_title(&self) -> Option<&AxisTitle> {
self.axis_title.as_ref()
}
pub fn axis_title_mut(&mut self) -> &mut AxisTitle {
self.has_title = true;
self.axis_title.get_or_insert_with(AxisTitle::new)
}
pub fn set_axis_title(&mut self, axis_title: AxisTitle) {
self.has_title = true;
self.title = axis_title.text();
self.axis_title = Some(axis_title);
}
#[must_use]
pub const fn visible(&self) -> bool {
self.visible
}
pub fn set_visible(&mut self, value: bool) {
self.visible = value;
}
#[must_use]
pub const fn major_tick_mark(&self) -> XlTickMark {
self.major_tick_mark
}
pub fn set_major_tick_mark(&mut self, value: XlTickMark) {
self.major_tick_mark = value;
}
#[must_use]
pub const fn minor_tick_mark(&self) -> XlTickMark {
self.minor_tick_mark
}
pub fn set_minor_tick_mark(&mut self, value: XlTickMark) {
self.minor_tick_mark = value;
}
#[must_use]
pub const fn tick_label_position(&self) -> XlTickLabelPosition {
self.tick_label_position
}
pub fn set_tick_label_position(&mut self, value: XlTickLabelPosition) {
self.tick_label_position = value;
}
#[must_use]
pub const fn has_major_gridlines(&self) -> bool {
self.has_major_gridlines
}
pub fn set_has_major_gridlines(&mut self, value: bool) {
self.has_major_gridlines = value;
}
#[must_use]
pub const fn has_minor_gridlines(&self) -> bool {
self.has_minor_gridlines
}
pub fn set_has_minor_gridlines(&mut self, value: bool) {
self.has_minor_gridlines = value;
}
#[must_use]
pub const fn crosses(&self) -> XlAxisCrosses {
self.crosses
}
pub fn set_crosses(&mut self, value: XlAxisCrosses) {
self.crosses = value;
}
#[must_use]
pub const fn category_type(&self) -> XlCategoryType {
self.category_type
}
#[must_use]
pub fn number_format(&self) -> &str {
&self.number_format
}
pub fn set_number_format(&mut self, format: &str) {
self.number_format = format.to_string();
}
#[must_use]
pub const fn reverse_order(&self) -> bool {
self.reverse_order
}
pub fn set_reverse_order(&mut self, value: bool) {
self.reverse_order = value;
}
#[must_use]
pub const fn tick_labels(&self) -> Option<&TickLabels> {
self.tick_labels.as_ref()
}
pub fn tick_labels_mut(&mut self) -> &mut TickLabels {
self.tick_labels.get_or_insert_with(TickLabels::new)
}
pub fn set_tick_labels(&mut self, tick_labels: TickLabels) {
self.tick_labels = Some(tick_labels);
}
#[must_use]
pub const fn format(&self) -> Option<&ChartFormat> {
self.format.as_ref()
}
pub fn format_mut(&mut self) -> &mut ChartFormat {
self.format.get_or_insert_with(ChartFormat::new)
}
pub fn set_format(&mut self, format: ChartFormat) {
self.format = Some(format);
}
#[must_use]
pub const fn major_gridline_format(&self) -> Option<&ChartFormat> {
self.major_gridline_format.as_ref()
}
pub fn major_gridline_format_mut(&mut self) -> &mut ChartFormat {
self.major_gridline_format
.get_or_insert_with(ChartFormat::new)
}
#[must_use]
pub const fn minor_gridline_format(&self) -> Option<&ChartFormat> {
self.minor_gridline_format.as_ref()
}
pub fn minor_gridline_format_mut(&mut self) -> &mut ChartFormat {
self.minor_gridline_format
.get_or_insert_with(ChartFormat::new)
}
}
impl Default for CategoryAxis {
fn default() -> Self {
Self::new()
}
}