use crate::{HasIdAndName, Name, OpenTimelineId, ReducedEntities, ReducedTimelines};
use bool_tag_expr::{BoolTagExpr, Tag, Tags};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TimelineEdit {
id: Option<OpenTimelineId>,
name: Name,
bool_expr: Option<BoolTagExpr>,
entities: Option<ReducedEntities>,
subtimelines: Option<ReducedTimelines>,
tags: Option<Tags>,
}
impl TimelineEdit {
pub fn from(
id: Option<OpenTimelineId>,
name: Name,
bool_expr: Option<BoolTagExpr>,
entities: Option<ReducedEntities>,
subtimelines: Option<ReducedTimelines>,
tags: Option<Tags>,
) -> Result<TimelineEdit, ()> {
let mut timeline = TimelineEdit {
id,
name,
bool_expr,
entities: None,
subtimelines: None,
tags: None,
};
timeline.entities = entities;
timeline.subtimelines = subtimelines;
timeline.tags = tags;
Ok(timeline)
}
pub fn clear_id(&mut self) {
self.id = None;
}
pub fn bool_expr(&self) -> &Option<BoolTagExpr> {
&self.bool_expr
}
pub fn clear_bool_expr(&mut self) {
self.bool_expr = None;
}
pub fn entities(&self) -> &Option<ReducedEntities> {
&self.entities
}
pub fn clear_entities(&mut self) {
self.entities = None;
}
pub fn subtimelines(&self) -> &Option<ReducedTimelines> {
&self.subtimelines
}
pub fn clear_subtimelines(&mut self) {
self.subtimelines = None;
}
pub fn tags(&self) -> &Option<Tags> {
&self.tags
}
pub fn tags_mut(&mut self) -> &mut Option<Tags> {
&mut self.tags
}
pub fn add_tag(&mut self, tag: Tag) {
self.tags.get_or_insert_with(Tags::new).insert(tag);
}
pub fn remove_tag(&mut self, tag: &Tag) {
if let Some(tags) = self.tags.as_mut() {
tags.remove(tag);
if tags.is_empty() {
self.tags = None
}
}
}
pub fn set_tags(&mut self, tags: Tags) {
self.tags = (!tags.is_empty()).then_some(tags);
}
pub fn clear_tags(&mut self) {
self.tags = None;
}
}
impl HasIdAndName for TimelineEdit {
fn id(&self) -> Option<OpenTimelineId> {
self.id
}
fn set_id(&mut self, id: OpenTimelineId) {
self.id = Some(id)
}
fn name(&self) -> &Name {
&self.name
}
fn set_name(&mut self, name: Name) {
self.name = name
}
}