use super::effect::TrackImportEffect;
use crate::core::cell::{Cell, CellEvent};
use crate::core::cell_note::CellNote;
use crate::core::effect::{
GlobalEffect, MidiMacroType, NavigationEffect, SongLevelEffect, TrackEffect,
};
use crate::core::fixed::units::Volume;
use core::fmt::*;
use serde::{Deserialize, Serialize};
use alloc::vec;
use alloc::vec::Vec;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TrackImportUnit {
pub note: CellNote,
pub velocity: Volume,
pub instrument: Option<usize>,
pub effects: Vec<TrackImportEffect>,
pub navigation: Vec<NavigationEffect>,
pub song_level: Vec<SongLevelEffect>,
pub midi_macros: Vec<MidiMacroType>,
}
impl Default for TrackImportUnit {
fn default() -> Self {
Self {
note: CellNote::default(),
velocity: Volume::FULL,
instrument: None,
effects: vec![],
navigation: vec![],
song_level: vec![],
midi_macros: vec![],
}
}
}
impl TrackImportUnit {
pub fn prepare_cell(&self) -> Cell {
let mut effects = TrackImportEffect::to_track_effects(&self.effects);
for m in &self.midi_macros {
effects.push(TrackEffect::MidiMacro(m.clone()));
}
Cell {
event: CellEvent::from_columns(self.note, self.instrument, self.velocity),
effects,
}
}
pub fn push_global(&mut self, ge: GlobalEffect) {
match ge {
GlobalEffect::Navigation(n) => self.navigation.push(n),
GlobalEffect::SongLevel(s) => self.song_level.push(s),
GlobalEffect::MidiMacro(m) => self.midi_macros.push(m),
}
}
#[inline]
pub fn has_any_global(&self) -> bool {
!self.navigation.is_empty() || !self.song_level.is_empty() || !self.midi_macros.is_empty()
}
}