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, cx: &mut WindowContext) -> impl IntoElement {
33 let avatar_size = self.avatar_size.unwrap_or_else(|| cx.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}