fractal/session/model/room/
category.rsuse std::fmt;
use gtk::glib;
use matrix_sdk::RoomState;
use crate::session::model::SidebarSectionName;
#[derive(Debug, Default, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
#[enum_type(name = "RoomCategory")]
pub enum RoomCategory {
Invited,
Favorite,
#[default]
Normal,
LowPriority,
Left,
Outdated,
Space,
Ignored,
}
impl RoomCategory {
pub fn can_change_to(self, category: Self) -> bool {
match self {
Self::Invited => {
matches!(
category,
Self::Favorite | Self::Normal | Self::LowPriority | Self::Left
)
}
Self::Favorite => {
matches!(category, Self::Normal | Self::LowPriority | Self::Left)
}
Self::Normal => {
matches!(category, Self::Favorite | Self::LowPriority | Self::Left)
}
Self::LowPriority => {
matches!(category, Self::Favorite | Self::Normal | Self::Left)
}
Self::Left => {
matches!(category, Self::Favorite | Self::Normal | Self::LowPriority)
}
Self::Ignored | Self::Outdated | Self::Space => false,
}
}
pub fn is_state(self, state: RoomState) -> bool {
match self {
RoomCategory::Invited | RoomCategory::Ignored => state == RoomState::Invited,
RoomCategory::Favorite
| RoomCategory::Normal
| RoomCategory::LowPriority
| RoomCategory::Outdated
| RoomCategory::Space => state == RoomState::Joined,
RoomCategory::Left => state == RoomState::Left,
}
}
}
impl fmt::Display for RoomCategory {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Some(section_name) = SidebarSectionName::from_room_category(*self) else {
unimplemented!();
};
section_name.fmt(f)
}
}