avatar_availability_indicator.rs

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