Skip to content

Commit 0b6310a

Browse files
committed
Inturodce the keypoint hint
1 parent 5602f6a commit 0b6310a

File tree

14 files changed

+97
-47
lines changed

14 files changed

+97
-47
lines changed

src/chart/context.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use super::mesh::MeshStyle;
88
use super::series::SeriesLabelStyle;
99

1010
use crate::coord::{
11-
AsRangedCoord, CoordTranslate, MeshLine, Ranged, RangedCoord, ReverseCoordTranslate, Shift,
12-
ValueFormatter,
11+
AsRangedCoord, CoordTranslate, KeyPointHint, MeshLine, Ranged, RangedCoord,
12+
ReverseCoordTranslate, Shift, ValueFormatter,
1313
};
1414
use crate::drawing::{DrawingArea, DrawingAreaErrorKind};
1515
use crate::element::{Drawable, DynElement, IntoDynElement, PathElement, PointCollection};
@@ -394,9 +394,9 @@ impl<'a, DB: DrawingBackend, X: Ranged, Y: Ranged> ChartContext<'a, DB, RangedCo
394394
/// The actual function that draws the mesh lines.
395395
/// It also returns the label that suppose to be there.
396396
#[allow(clippy::type_complexity)]
397-
fn draw_mesh_lines<FmtLabel>(
397+
fn draw_mesh_lines<FmtLabel, YH: KeyPointHint, XH: KeyPointHint>(
398398
&mut self,
399-
(r, c): (usize, usize),
399+
(r, c): (YH, XH),
400400
(x_mesh, y_mesh): (bool, bool),
401401
mesh_line_style: &ShapeStyle,
402402
mut fmt_label: FmtLabel,
@@ -693,9 +693,9 @@ impl<'a, DB: DrawingBackend, X: Ranged, Y: Ranged> ChartContext<'a, DB, RangedCo
693693
}
694694

695695
#[allow(clippy::too_many_arguments)]
696-
pub(super) fn draw_mesh<FmtLabel>(
696+
pub(super) fn draw_mesh<FmtLabel, YH: KeyPointHint, XH: KeyPointHint>(
697697
&mut self,
698-
(r, c): (usize, usize),
698+
(r, c): (YH, XH),
699699
mesh_line_style: &ShapeStyle,
700700
x_label_style: &TextStyle,
701701
y_label_style: &TextStyle,

src/chart/mesh.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::marker::PhantomData;
22

33
use super::builder::LabelAreaPosition;
44
use super::context::ChartContext;
5-
use crate::coord::{MeshLine, Ranged, RangedCoord, ValueFormatter};
5+
use crate::coord::{BoldPoints, MeshLine, Ranged, RangedCoord, ValueFormatter};
66
use crate::drawing::DrawingAreaErrorKind;
77
use crate::style::{
88
AsRelative, Color, FontDesc, FontFamily, FontStyle, IntoTextStyle, RGBColor, ShapeStyle,
@@ -411,7 +411,7 @@ where
411411
)?;
412412

413413
target.draw_mesh(
414-
(self.n_y_labels, self.n_x_labels),
414+
(BoldPoints(self.n_y_labels), BoldPoints(self.n_x_labels)),
415415
&mesh_style_1,
416416
&x_label_style,
417417
&y_label_style,

src/coord/datetime.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use chrono::{Date, DateTime, Datelike, Duration, NaiveDate, NaiveDateTime, TimeZone, Timelike};
33
use std::ops::{Add, Range, Sub};
44

5-
use super::{AsRangedCoord, DiscreteRanged, Ranged, ValueFormatter};
5+
use super::{AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ValueFormatter};
66

77
/// The trait that describe some time value. This is the uniformed abstraction that works
88
/// for both Date, DateTime and Duration, etc.
@@ -176,7 +176,8 @@ where
176176
TimeValue::map_coord(value, &self.0, &self.1, limit)
177177
}
178178

179-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
179+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
180+
let max_points = hint.max_num_points();
180181
let mut ret = vec![];
181182

182183
let total_days = (self.1.clone() - self.0.clone()).num_days();
@@ -263,7 +264,8 @@ impl<T: TimeValue + Clone> Ranged for Monthly<T> {
263264
T::map_coord(value, &self.0.start, &self.0.end, limit)
264265
}
265266

266-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
267+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
268+
let max_points = hint.max_num_points();
267269
let start_date = self.0.start.date_ceil();
268270
let end_date = self.0.end.date_floor();
269271

@@ -465,7 +467,8 @@ impl<T: TimeValue + Clone> Ranged for Yearly<T> {
465467
T::map_coord(value, &self.0.start, &self.0.end, limit)
466468
}
467469

468-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
470+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
471+
let max_points = hint.max_num_points();
469472
let start_date = self.0.start.date_ceil();
470473
let end_date = self.0.end.date_floor();
471474

@@ -583,7 +586,8 @@ where
583586
TimeValue::map_coord(value, &self.0, &self.1, limit)
584587
}
585588

586-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
589+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
590+
let max_points = hint.max_num_points();
587591
let total_span = self.1.clone() - self.0.clone();
588592

589593
if let Some(total_ns) = total_span.num_nanoseconds() {
@@ -665,7 +669,8 @@ impl Ranged for RangedDuration {
665669
+ (f64::from(limit.1 - limit.0) * value_days as f64 / total_days as f64 + 1e-10) as i32
666670
}
667671

668-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
672+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
673+
let max_points = hint.max_num_points();
669674
let total_span = self.1 - self.0;
670675

671676
if let Some(total_ns) = total_span.num_nanoseconds() {

src/coord/discrete.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{AsRangedCoord, Ranged, ReversibleRanged, ValueFormatter};
1+
use super::{AsRangedCoord, KeyPointHint, Ranged, ReversibleRanged, ValueFormatter};
22
use std::ops::Range;
33

44
/// The trait indicates the coordinate is discrete
@@ -161,9 +161,9 @@ impl<D: DiscreteRanged> Ranged for SegmentedCoord<D> {
161161
}
162162
}
163163

164-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
164+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<Self::ValueType> {
165165
self.0
166-
.key_points(max_points)
166+
.key_points(hint)
167167
.into_iter()
168168
.map(SegmentValue::CenterOf)
169169
.collect()

src/coord/group_by.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::numeric::RangedCoordusize;
2-
use super::{AsRangedCoord, DiscreteRanged, Ranged, ValueFormatter};
2+
use super::{AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ValueFormatter};
33
use std::ops::Range;
44

55
/// The ranged value spec that needs to be grouped.
@@ -62,13 +62,13 @@ impl<T: DiscreteRanged> Ranged for GroupBy<T> {
6262
fn range(&self) -> Range<T::ValueType> {
6363
self.0.range()
6464
}
65-
// TODO: See issue #88
66-
fn key_points(&self, max_points: usize) -> Vec<T::ValueType> {
65+
// TODO: See issue issue #88
66+
fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<T::ValueType> {
6767
let range = 0..(self.0.size() + self.1 - 1) / self.1;
6868
let logic_range: RangedCoordusize = range.into();
6969

7070
logic_range
71-
.key_points(max_points)
71+
.key_points(hint)
7272
.into_iter()
7373
.map(|x| self.0.from_index(x * self.1).unwrap())
7474
.collect()

src/coord/linspace.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use super::{numeric::RangedCoordusize, AsRangedCoord, DiscreteRanged, Ranged, ValueFormatter};
1+
use super::{
2+
numeric::RangedCoordusize, AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ValueFormatter,
3+
};
24
use std::cmp::{Ordering, PartialOrd};
35
use std::marker::PhantomData;
46
use std::ops::{Add, Range, Sub};
@@ -284,14 +286,14 @@ where
284286
self.inner.map(value, limit)
285287
}
286288

287-
fn key_points(&self, n: usize) -> Vec<T::ValueType> {
289+
fn key_points<Hint: KeyPointHint>(&self, hint: Hint) -> Vec<T::ValueType> {
288290
if self.grid_value.len() == 0 {
289291
return vec![];
290292
}
291293
let idx_range: RangedCoordusize = (0..(self.grid_value.len() - 1)).into();
292294

293295
idx_range
294-
.key_points(n)
296+
.key_points(hint)
295297
.into_iter()
296298
.map(|x| self.grid_value[x].clone())
297299
.collect()

src/coord/logarithmic.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{AsRangedCoord, Ranged, RangedCoordf64};
1+
use super::{AsRangedCoord, KeyPointHint, Ranged, RangedCoordf64};
22
use std::marker::PhantomData;
33
use std::ops::Range;
44

@@ -90,7 +90,8 @@ impl<V: LogScalable> Ranged for LogCoord<V> {
9090
self.linear.map(&value, limit)
9191
}
9292

93-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
93+
fn key_points<Hint: KeyPointHint>(&self, hint: Hint) -> Vec<Self::ValueType> {
94+
let max_points = hint.max_num_points();
9495
let tier_1 = (self.logic.end.as_f64() / self.logic.start.as_f64())
9596
.log10()
9697
.abs()

src/coord/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ pub use numeric::{
4444
RangedCoordu128, RangedCoordu32, RangedCoordu64,
4545
};
4646
pub use ranged::{
47-
AsRangedCoord, DefaultFormatting, MeshLine, NoDefaultFormatting, Ranged, RangedCoord,
48-
ReversibleRanged, ValueFormatter,
47+
AsRangedCoord, BoldPoints, DefaultFormatting, KeyPointHint, KeyPointWeight, MeshLine,
48+
NoDefaultFormatting, Ranged, RangedCoord, ReversibleRanged, ValueFormatter,
4949
};
5050

5151
pub use partial_axis::{make_partial_axis, IntoPartialAxis};

src/coord/nested.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{AsRangedCoord, DiscreteRanged, Ranged, ValueFormatter};
1+
use super::{AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ValueFormatter};
22
use std::ops::Range;
33

44
/// Describe a value for a nested coordinate
@@ -99,12 +99,12 @@ impl<P: DiscreteRanged, S: Ranged> Ranged for NestedRange<P, S> {
9999
}
100100
}
101101

102-
fn key_points(&self, max_points: usize) -> Vec<Self::ValueType> {
102+
fn key_points<Hint: KeyPointHint>(&self, hint: Hint) -> Vec<Self::ValueType> {
103103
// TODO: Currently it's tricky to control the labels.
104104
// The problem is if we need to emit the nested keypoint in this vector?
105105
// Once we introduce the additional metadata on the key points, we probably have better way to handle this.
106106
self.primary
107-
.key_points(max_points)
107+
.key_points(hint)
108108
.into_iter()
109109
.map(|x| NestedValue::Category(x))
110110
.collect()

src/coord/numeric.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::convert::TryFrom;
22
use std::ops::Range;
33

4-
use super::{AsRangedCoord, DiscreteRanged, Ranged, ReversibleRanged};
4+
use super::{AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ReversibleRanged};
55

66
macro_rules! impl_discrete_trait {
77
($name:ident) => {
@@ -85,8 +85,8 @@ macro_rules! make_numeric_coord {
8585

8686
return limit.0 + (actual_length as f64 * logic_length + 1e-3).floor() as i32;
8787
}
88-
fn key_points(&self, max_points: usize) -> Vec<$type> {
89-
$key_points((self.0, self.1), max_points)
88+
fn key_points<Hint: KeyPointHint>(&self, hint: Hint) -> Vec<$type> {
89+
$key_points((self.0, self.1), hint.max_num_points())
9090
}
9191
fn range(&self) -> Range<$type> {
9292
return self.0..self.1;

0 commit comments

Comments
 (0)