use super::{Showing, Workspace};
use crate::model::state;
use artifact::layout::Kind as MemberKind;
use bezel::gpui::Context;
impl Workspace {
pub fn entry_of(&self, project: usize, showing: Showing) -> Option<state::Entry> {
let member = self.member_of(project, showing)?;
let kind = match member.kind {
MemberKind::Session => state::Kind::Session,
MemberKind::Board => state::Kind::Board,
MemberKind::Article => state::Kind::Article,
MemberKind::Table => state::Kind::Table,
};
Some(state::Entry {
kind,
id: member.id,
})
}
pub fn rank_of(&self, project: usize, showing: Showing) -> Option<usize> {
let path = &self.projects.get(project)?.path;
let entry = self.entry_of(project, showing)?;
self.order
.get(path)?
.iter()
.position(|held| held.kind == entry.kind && held.id == entry.id)
}
pub fn pin_rank(&self, project: usize, showing: Showing) -> Option<usize> {
let path = &self.projects.get(project)?.path;
let entry = self.entry_of(project, showing)?;
self.pinned
.get(path)?
.iter()
.position(|held| held.kind == entry.kind && held.id == entry.id)
}
pub fn is_pinned(&self, project: usize, showing: Showing) -> bool {
self.pin_rank(project, showing).is_some()
}
pub fn pin(&mut self, project: usize, showing: Showing, on: bool, cx: &mut Context<Self>) {
let Some(entry) = self.entry_of(project, showing) else {
return;
};
let Some(open) = self.projects.get(project) else {
return;
};
let held = self.pinned.entry(open.path.clone()).or_default();
held.retain(|pin| !(pin.kind == entry.kind && pin.id == entry.id));
if on {
held.push(entry);
}
self.save();
cx.notify();
}
pub fn unpin_entry(&mut self, project: usize, showing: Showing) {
let Some(entry) = self.entry_of(project, showing) else {
return;
};
let Some(open) = self.projects.get(project) else {
return;
};
if let Some(held) = self.pinned.get_mut(&open.path) {
held.retain(|pin| !(pin.kind == entry.kind && pin.id == entry.id));
}
self.save();
}
pub fn set_order(&mut self, project: usize, order: Vec<state::Entry>, cx: &mut Context<Self>) {
let Some(open) = self.projects.get(project) else {
return;
};
self.order.insert(open.path.clone(), order);
self.save();
cx.notify();
}
pub fn set_pinned(
&mut self,
project: usize,
pinned: Vec<state::Entry>,
cx: &mut Context<Self>,
) {
let Some(open) = self.projects.get(project) else {
return;
};
self.pinned.insert(open.path.clone(), pinned);
self.save();
cx.notify();
}
}
#[cfg(test)]
#[path = "../../../tests/unit/entry_order.rs"]
mod order_tests;