60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
use gpui::{Div, Position};
|
|
|
|
use crate::prelude::*;
|
|
|
|
#[derive(Default)]
|
|
pub enum IndicatorStyle {
|
|
#[default]
|
|
Dot,
|
|
Bar,
|
|
}
|
|
|
|
#[derive(IntoElement)]
|
|
pub struct Indicator {
|
|
position: Position,
|
|
style: IndicatorStyle,
|
|
color: Color,
|
|
}
|
|
|
|
impl Indicator {
|
|
pub fn dot() -> Self {
|
|
Self {
|
|
position: Position::Relative,
|
|
style: IndicatorStyle::Dot,
|
|
color: Color::Default,
|
|
}
|
|
}
|
|
|
|
pub fn bar() -> Self {
|
|
Self {
|
|
position: Position::Relative,
|
|
style: IndicatorStyle::Dot,
|
|
color: Color::Default,
|
|
}
|
|
}
|
|
|
|
pub fn color(mut self, color: Color) -> Self {
|
|
self.color = color;
|
|
self
|
|
}
|
|
|
|
pub fn absolute(mut self) -> Self {
|
|
self.position = Position::Absolute;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl RenderOnce for Indicator {
|
|
type Output = Div;
|
|
|
|
fn render(self, cx: &mut WindowContext) -> Self::Output {
|
|
div()
|
|
.flex_none()
|
|
.map(|this| match self.style {
|
|
IndicatorStyle::Dot => this.w_1p5().h_1p5().rounded_full(),
|
|
IndicatorStyle::Bar => this.w_full().h_1p5().rounded_t_md(),
|
|
})
|
|
.when(self.position == Position::Absolute, |this| this.absolute())
|
|
.bg(self.color.color(cx))
|
|
}
|
|
}
|