use crate::enums::chart::XlLegendPosition;
use crate::text::font::Font;
#[derive(Debug, Clone)]
pub struct Legend {
position: XlLegendPosition,
include_in_layout: bool,
overlay: bool,
font: Option<Font>,
entries: Vec<LegendEntry>,
horz_offset: Option<f64>,
}
impl Legend {
#[must_use]
pub const fn new() -> Self {
Self {
position: XlLegendPosition::Right,
include_in_layout: true,
overlay: false,
font: None,
entries: Vec::new(),
horz_offset: None,
}
}
#[must_use]
pub const fn position(&self) -> XlLegendPosition {
self.position
}
pub fn set_position(&mut self, position: XlLegendPosition) {
self.position = position;
}
#[must_use]
pub const fn include_in_layout(&self) -> bool {
self.include_in_layout
}
pub fn set_include_in_layout(&mut self, value: bool) {
self.include_in_layout = value;
}
#[must_use]
pub const fn overlay(&self) -> bool {
self.overlay
}
pub fn set_overlay(&mut self, value: bool) {
self.overlay = value;
}
#[must_use]
pub const fn font(&self) -> Option<&Font> {
self.font.as_ref()
}
pub fn font_mut(&mut self) -> &mut Font {
self.font.get_or_insert_with(Font::new)
}
pub fn set_font(&mut self, font: Font) {
self.font = Some(font);
}
#[must_use]
pub fn legend_entries(&self) -> &[LegendEntry] {
&self.entries
}
pub fn add_legend_entry(&mut self, entry: LegendEntry) {
self.entries.push(entry);
}
#[must_use]
pub const fn horz_offset(&self) -> Option<f64> {
self.horz_offset
}
pub fn set_horz_offset(&mut self, value: Option<f64>) {
self.horz_offset = value;
}
}
impl Default for Legend {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct LegendEntry {
index: usize,
is_deleted: bool,
font: Option<Font>,
}
impl LegendEntry {
#[must_use]
pub const fn new(index: usize) -> Self {
Self {
index,
is_deleted: false,
font: None,
}
}
#[must_use]
pub const fn index(&self) -> usize {
self.index
}
#[must_use]
pub const fn is_deleted(&self) -> bool {
self.is_deleted
}
pub fn set_deleted(&mut self, value: bool) {
self.is_deleted = value;
}
#[must_use]
pub const fn font(&self) -> Option<&Font> {
self.font.as_ref()
}
pub fn set_font(&mut self, font: Font) {
self.font = Some(font);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::text::font::RgbColor;
#[test]
fn test_legend_font() {
let mut legend = Legend::new();
assert!(legend.font().is_none());
let font = legend.font_mut();
font.bold = Some(true);
font.size = Some(12.0);
assert!(legend.font().is_some());
assert_eq!(legend.font().unwrap().bold, Some(true));
}
#[test]
fn test_legend_entries() {
let mut legend = Legend::new();
assert!(legend.legend_entries().is_empty());
let mut entry = LegendEntry::new(0);
entry.set_deleted(true);
legend.add_legend_entry(entry);
let entry = LegendEntry::new(1);
legend.add_legend_entry(entry);
assert_eq!(legend.legend_entries().len(), 2);
assert!(legend.legend_entries()[0].is_deleted());
assert!(!legend.legend_entries()[1].is_deleted());
}
#[test]
fn test_legend_entry_font() {
let mut entry = LegendEntry::new(0);
assert!(entry.font().is_none());
let mut font = Font::new();
font.color = Some(RgbColor::new(255, 0, 0));
entry.set_font(font);
assert!(entry.font().is_some());
}
#[test]
fn test_legend_horz_offset() {
let mut legend = Legend::new();
assert!(legend.horz_offset().is_none());
legend.set_horz_offset(Some(0.5));
assert_eq!(legend.horz_offset(), Some(0.5));
legend.set_horz_offset(Some(-0.3));
assert_eq!(legend.horz_offset(), Some(-0.3));
legend.set_horz_offset(None);
assert!(legend.horz_offset().is_none());
}
#[test]
fn test_legend_horz_offset_bounds() {
let mut legend = Legend::new();
legend.set_horz_offset(Some(1.0));
assert_eq!(legend.horz_offset(), Some(1.0));
legend.set_horz_offset(Some(-1.0));
assert_eq!(legend.horz_offset(), Some(-1.0));
}
}