Skip to content

Commit 5b4c1ba

Browse files
authored
feat: render a HSpan in segmented axis (#50)
1 parent 27db588 commit 5b4c1ba

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

egui_plot/src/lib.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use emath::Float as _;
5555
use axis::AxisWidget;
5656
use items::{horizontal_line, rulers_color, vertical_line};
5757
use legend::LegendWidget;
58-
58+
use egui::pos2;
5959
type LabelFormatterFn<'a> = dyn Fn(&str, &PlotPoint) -> String + 'a;
6060
pub type LabelFormatter<'a> = Option<Box<LabelFormatterFn<'a>>>;
6161

@@ -1454,6 +1454,18 @@ impl<'a> Plot<'a> {
14541454

14551455
let (plot_cursors, mut hovered_plot_item) = prepared.ui(ui, &response);
14561456

1457+
if let Some(gaps) = mem.transform.segment_x_gap_screen_ranges() {
1458+
let frame = mem.transform.frame();
1459+
let gap_color = ui.visuals().extreme_bg_color;
1460+
for (left, right) in gaps {
1461+
let gap_rect =
1462+
Rect::from_min_max(pos2(left, frame.top()), pos2(right, frame.bottom()));
1463+
ui.painter()
1464+
.with_clip_rect(*frame)
1465+
.add(egui::Shape::rect_filled(gap_rect, 0.0, gap_color));
1466+
}
1467+
}
1468+
14571469
// Click/Context menu -> events
14581470
if response.clicked() {
14591471
events.push(PlotEvent::Activate {

egui_plot/src/transform.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ impl PlotTransform {
660660
let total_len: f64 = bx
661661
.segments
662662
.iter()
663-
.map(|seg| seg.len().max(f64::EPSILON)) // avoid 0
663+
.map(|seg| seg.len().max(f64::EPSILON))
664664
.sum();
665665

666666
let total_gap_px: f32 = if n >= 2 {
@@ -681,6 +681,26 @@ impl PlotTransform {
681681
self.segment_x_offset = 0.0;
682682
}
683683
}
684+
pub fn segment_x_gap_screen_ranges(&self) -> Option<Vec<(f32, f32)>> {
685+
let bx = self.segment_xaxis()?;
686+
let mut out = Vec::new();
687+
688+
let mut cursor_px = self.frame.left() + self.segment_x_offset;
689+
690+
for (i, seg) in bx.segments.iter().enumerate() {
691+
let seg_px = (seg.len() as f32) * self.pixels_per_x;
692+
cursor_px += seg_px;
693+
694+
if i + 1 < bx.segments.len() {
695+
let gap_left = cursor_px;
696+
let gap_right = cursor_px + bx.gap_px;
697+
out.push((gap_left, gap_right));
698+
cursor_px += bx.gap_px;
699+
}
700+
}
701+
702+
Some(out)
703+
}
684704

685705
#[inline]
686706
pub fn segment_x_offset(&self) -> f32 {

0 commit comments

Comments
 (0)