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}