1
0
Fork 0

Draw ticks for the vizia PeakMeter

They are just slightly blurry.
This commit is contained in:
Robbert van der Helm 2022-03-21 23:45:55 +01:00
parent b8ff936b21
commit d84b456edb
4 changed files with 59 additions and 6 deletions

View file

@ -230,7 +230,7 @@ where
Background::Color(Color::TRANSPARENT),
);
// Beneat the bar we want to draw the names of the ticks
// Beneath the bar we want to draw the names of the ticks
for tick_db in text_ticks {
let x_coordinate = db_to_x_coord(tick_db as f32);

View file

@ -47,6 +47,17 @@ peak-meter .bar {
border-width: 1px;
border-color: #0a0a0a;
}
peak-meter .ticks {
height: 50%;
}
peak-meter .ticks__tick {
background-color: #0a0a0a;
top: 0;
width: 1px;
height: 30%;
}
peak-meter .ticks__label {
top: 4px; /* In pixels in an attempt to get this to better align to the grid */
font-size: 10.5; /* 14px */
}

View file

@ -16,6 +16,9 @@ const TICK_GAP: f32 = 1.0;
const MIN_TICK: f32 = -90.0;
/// The decibel value corresponding to the very right of the bar.
const MAX_TICK: f32 = 20.0;
/// The ticks that will be shown beneath the peak meter's bar. The first value is shown as
/// -infinity, and at the last position we'll draw the `dBFS` string.
const TEXT_TICKS: [i32; 6] = [-80, -60, -40, -20, 0, 12];
/// A simple horizontal peak meter.
///
@ -24,7 +27,7 @@ const MAX_TICK: f32 = 20.0;
pub struct PeakMeter;
/// The bar bit for the peak meter, manually drawn using vertical lines.
struct PeakMeterInner<L, P>
struct PeakMeterBar<L, P>
where
L: Lens<Target = f32>,
P: Lens<Target = f32>,
@ -76,15 +79,54 @@ impl PeakMeter {
.map(|_level| -> f32 { util::MINUS_INFINITY_DB }),
};
PeakMeterInner {
PeakMeterBar {
level_dbfs,
peak_dbfs,
}
.build(cx)
.class("bar");
// TODO: Ticks
ZStack::new(cx, |cx| {
const WIDTH_PCT: f32 = 50.0;
for tick_db in TEXT_TICKS {
let tick_fraction = (tick_db as f32 - MIN_TICK) / (MAX_TICK - MIN_TICK);
let tick_pct = tick_fraction * 100.0;
ZStack::new(cx, |cx| {
let first_tick = tick_db == TEXT_TICKS[0];
let last_tick = tick_db == TEXT_TICKS[TEXT_TICKS.len() - 1];
if !last_tick {
// FIXME: This is not aligned to the pixel grid and some ticks will look
// blurry, is there a way to fix this?
Element::new(cx).class("ticks__tick");
}
if first_tick {
Label::new(cx, "-inf")
.class("ticks__label")
.class("ticks__label--inf");
} else if last_tick {
// This is only inclued in the array to make positioning this easier
Label::new(cx, "dBFS")
.class("ticks__label")
.class("ticks__label--dbfs");
} else {
Label::new(cx, &tick_db.to_string()).class("ticks__label");
};
})
.height(Stretch(1.0))
.left(Percentage(tick_pct - (WIDTH_PCT / 2.0)))
.width(Percentage(WIDTH_PCT))
.child_left(Stretch(1.0))
.child_right(Stretch(1.0))
.overflow(Overflow::Visible);
}
})
.class("ticks")
.overflow(Overflow::Visible);
})
.overflow(Overflow::Visible)
}
}
@ -94,7 +136,7 @@ impl View for PeakMeter {
}
}
impl<L, P> View for PeakMeterInner<L, P>
impl<L, P> View for PeakMeterBar<L, P>
where
L: Lens<Target = f32>,
P: Lens<Target = f32>,

View file

@ -26,7 +26,7 @@ impl Model for Data {}
// Makes sense to also define this here, makes it a bit easier to keep track of
pub(crate) fn default_state() -> Arc<ViziaState> {
ViziaState::from_size(200, 250)
ViziaState::from_size(200, 150)
}
pub(crate) fn create(