criterion_plot/key.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
//! Key (or legend)
use std::borrow::Cow;
use crate::traits::Set;
use crate::{Default, Display, Script, Title};
/// Properties of the key
#[derive(Clone)]
pub struct Properties {
boxed: bool,
hidden: bool,
justification: Option<Justification>,
order: Option<Order>,
position: Option<Position>,
stacked: Option<Stacked>,
title: Option<Cow<'static, str>>,
}
impl Default for Properties {
fn default() -> Properties {
Properties {
boxed: false,
hidden: false,
justification: None,
order: None,
position: None,
stacked: None,
title: None,
}
}
}
impl Properties {
/// Hides the key
pub fn hide(&mut self) -> &mut Properties {
self.hidden = true;
self
}
/// Shows the key
///
/// **Note** The key is shown by default
pub fn show(&mut self) -> &mut Properties {
self.hidden = false;
self
}
}
impl Script for Properties {
// Allow clippy::format_push_string even with older versions of rust (<1.62) which
// don't have it defined.
#[allow(clippy::all)]
fn script(&self) -> String {
let mut script = if self.hidden {
return String::from("set key off\n");
} else {
String::from("set key on ")
};
match self.position {
None => {}
Some(Position::Inside(v, h)) => {
script.push_str(&format!("inside {} {} ", v.display(), h.display()))
}
Some(Position::Outside(v, h)) => {
script.push_str(&format!("outside {} {} ", v.display(), h.display()))
}
}
if let Some(stacked) = self.stacked {
script.push_str(stacked.display());
script.push(' ');
}
if let Some(justification) = self.justification {
script.push_str(justification.display());
script.push(' ');
}
if let Some(order) = self.order {
script.push_str(order.display());
script.push(' ');
}
if let Some(ref title) = self.title {
script.push_str(&format!("title '{}' ", title))
}
if self.boxed {
script.push_str("box ")
}
script.push('\n');
script
}
}
impl Set<Boxed> for Properties {
/// Select if the key will be surrounded with a box or not
///
/// **Note** The key is not boxed by default
fn set(&mut self, boxed: Boxed) -> &mut Properties {
match boxed {
Boxed::No => self.boxed = false,
Boxed::Yes => self.boxed = true,
}
self
}
}
impl Set<Justification> for Properties {
/// Changes the justification of the text of each entry
///
/// **Note** The text is `RightJustified` by default
fn set(&mut self, justification: Justification) -> &mut Properties {
self.justification = Some(justification);
self
}
}
impl Set<Order> for Properties {
/// How to order each entry
///
/// **Note** The default order is `TextSample`
fn set(&mut self, order: Order) -> &mut Properties {
self.order = Some(order);
self
}
}
impl Set<Position> for Properties {
/// Selects where to place the key
///
/// **Note** By default, the key is placed `Inside(Vertical::Top, Horizontal::Right)`
fn set(&mut self, position: Position) -> &mut Properties {
self.position = Some(position);
self
}
}
impl Set<Stacked> for Properties {
/// Changes how the entries of the key are stacked
fn set(&mut self, stacked: Stacked) -> &mut Properties {
self.stacked = Some(stacked);
self
}
}
impl Set<Title> for Properties {
fn set(&mut self, title: Title) -> &mut Properties {
self.title = Some(title.0);
self
}
}
/// Whether the key is surrounded by a box or not
#[allow(missing_docs)]
#[derive(Clone, Copy)]
pub enum Boxed {
No,
Yes,
}
/// Horizontal position of the key
#[derive(Clone, Copy)]
pub enum Horizontal {
/// Center of the figure
Center,
/// Left border of the figure
Left,
/// Right border of the figure
Right,
}
/// Text justification of the key
#[allow(missing_docs)]
#[derive(Clone, Copy)]
pub enum Justification {
Left,
Right,
}
/// Order of the elements of the key
#[derive(Clone, Copy)]
pub enum Order {
/// Sample first, then text
SampleText,
/// Text first, then sample
TextSample,
}
/// Position of the key
// TODO XY position
#[derive(Clone, Copy)]
pub enum Position {
/// Inside the area surrounded by the four (BottomX, TopX, LeftY and RightY) axes
Inside(Vertical, Horizontal),
/// Outside of that area
Outside(Vertical, Horizontal),
}
/// How the entries of the key are stacked
#[allow(missing_docs)]
#[derive(Clone, Copy)]
pub enum Stacked {
Horizontally,
Vertically,
}
/// Vertical position of the key
#[derive(Clone, Copy)]
pub enum Vertical {
/// Bottom border of the figure
Bottom,
/// Center of the figure
Center,
/// Top border of the figure
Top,
}