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(crate) fn can_change_to(self, category: TargetRoomCategory) -> bool {
match self {
Self::Invited => {
matches!(
category,
TargetRoomCategory::Favorite
| TargetRoomCategory::Normal
| TargetRoomCategory::LowPriority
| TargetRoomCategory::Left
)
}
Self::Favorite => {
matches!(
category,
TargetRoomCategory::Normal
| TargetRoomCategory::LowPriority
| TargetRoomCategory::Left
)
}
Self::Normal => {
matches!(
category,
TargetRoomCategory::Favorite
| TargetRoomCategory::LowPriority
| TargetRoomCategory::Left
)
}
Self::LowPriority => {
matches!(
category,
TargetRoomCategory::Favorite
| TargetRoomCategory::Normal
| TargetRoomCategory::Left
)
}
Self::Left => {
matches!(
category,
TargetRoomCategory::Favorite
| TargetRoomCategory::Normal
| TargetRoomCategory::LowPriority
)
}
Self::Ignored | Self::Outdated | Self::Space => false,
}
}
pub(crate) 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,
}
}
pub(crate) fn to_target_room_category(self) -> Option<TargetRoomCategory> {
let target = match self {
RoomCategory::Favorite => TargetRoomCategory::Favorite,
RoomCategory::Normal => TargetRoomCategory::Normal,
RoomCategory::LowPriority => TargetRoomCategory::LowPriority,
RoomCategory::Left => TargetRoomCategory::Left,
RoomCategory::Invited
| RoomCategory::Outdated
| RoomCategory::Space
| RoomCategory::Ignored => return None,
};
Some(target)
}
}
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)
}
}
#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::Enum)]
#[enum_type(name = "TargetRoomCategory")]
pub enum TargetRoomCategory {
Favorite,
Normal,
LowPriority,
Left,
}
impl From<TargetRoomCategory> for RoomCategory {
fn from(value: TargetRoomCategory) -> Self {
match value {
TargetRoomCategory::Favorite => Self::Favorite,
TargetRoomCategory::Normal => Self::Normal,
TargetRoomCategory::LowPriority => Self::LowPriority,
TargetRoomCategory::Left => Self::Left,
}
}
}
impl PartialEq<RoomCategory> for TargetRoomCategory {
fn eq(&self, other: &RoomCategory) -> bool {
match self {
Self::Favorite => *other == RoomCategory::Favorite,
Self::Normal => *other == RoomCategory::Normal,
Self::LowPriority => *other == RoomCategory::LowPriority,
Self::Left => *other == RoomCategory::Left,
}
}
}
impl PartialEq<TargetRoomCategory> for RoomCategory {
fn eq(&self, other: &TargetRoomCategory) -> bool {
other.eq(self)
}
}