avatar_availability_indicator.rs

 1use crate::prelude::*;
 2
 3#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
 4pub enum Availability {
 5    Free,
 6    Busy,
 7}
 8
 9#[derive(IntoElement)]
10pub struct AvatarAvailabilityIndicator {
11    availability: Availability,
12    avatar_size: Option<Pixels>,
13}
14
15impl AvatarAvailabilityIndicator {
16    pub fn new(availability: Availability) -> Self {
17        Self {
18            availability,
19            avatar_size: None,
20        }
21    }
22
23    /// Sets the size of the [`Avatar`](crate::Avatar) this indicator appears on.
24    pub fn avatar_size(mut self, size: impl Into<Option<Pixels>>) -> Self {
25        self.avatar_size = size.into();
26        self
27    }
28}
29
30impl RenderOnce for AvatarAvailabilityIndicator {
31    fn render(self, cx: &mut WindowContext) -> impl IntoElement {
32        let avatar_size = self.avatar_size.unwrap_or_else(|| cx.rem_size());
33
34        // HACK: non-integer sizes result in oval indicators.
35        let indicator_size = (avatar_size * 0.4).round();
36
37        div()
38            .absolute()
39            .bottom_0()
40            .right_0()
41            .size(indicator_size)
42            .rounded(indicator_size)
43            .bg(match self.availability {
44                Availability::Free => cx.theme().status().created,
45                Availability::Busy => cx.theme().status().deleted,
46            })
47    }
48}