using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace DMX2 { public class SequenceurLineaire : Sequenceur { public class Effet { string _nom; public Effet (string nom, Dictionary valeurs, TimeSpan duree, TimeSpan transition) { _nom = nom; _valeurs = new Dictionary (valeurs); _duree = duree; _transition = transition; } public string Nom { get { return _nom; } } Dictionary _valeurs; public int this [Circuit index] { get { if (!_valeurs.ContainsKey (index)) _valeurs.Add (index, 0); return _valeurs [index]; } } public void RetireCircuit (Circuit c) { _valeurs.Remove (c); } TimeSpan _duree = TimeSpan.Zero ; TimeSpan _transition = TimeSpan.Zero; public TimeSpan Duree { get { return _duree; } } public TimeSpan Transition { get { return _transition; } } } TimeSpan timeStamp = TimeSpan.Zero; List circuitsSeq = new List (); List effets = new List (); Effet effetcourrant = null; bool enTransition = false; Dictionary valeurscourantes = new Dictionary (); Dictionary valeursinitiales = new Dictionary (); Dictionary valeurschangees = new Dictionary (); SeqLinUI ui = null; public SequenceurLineaire () { } public SequenceurLineaire (int id) :base (id) { } public TimeSpan TimeStamp { get { return timeStamp; } } public ReadOnlyCollection Circuits { get { return circuitsSeq.AsReadOnly (); } } public ReadOnlyCollection Effets { get { return effets.AsReadOnly (); } } public void ChangeCircuits (System.Collections.Generic.List list) { foreach (var c in circuitsSeq.ToArray()) { if (!list.Contains (c)) RetireCircuit (c); } foreach (var c in list) if (!circuitsSeq.Contains (c)) AjouteCircuit (c); circuitsSeq = list; } void AjouteCircuit (Circuit c) { valeurscourantes [c] = 0; valeursinitiales [c] = 0; } private void RetireCircuit (Circuit c) { foreach (var ef in effets) { ef.RetireCircuit (c); } circuitsSeq.Remove (c); valeurscourantes.Remove (c); valeursinitiales.Remove (c); } public override void MajCircuitsSupprimes () { foreach (var c in circuitsSeq.ToArray()) { if (!Conduite.Courante.Circuits.Contains (c)) RetireCircuit (c); } } public override int EtatCircuit (Circuit c) { if (!circuitsSeq.Contains (c)) return 0; return valeurscourantes [c]; } public void ChangeCircuit (Circuit c, int value) { valeurschangees [c] = true; valeurscourantes [c] = value; } public bool EstChange (Circuit c) { return valeurschangees.ContainsKey (c); } public override void Tick (TimeSpan time) { timeStamp += time; if (enTransition) { if (timeStamp < effetcourrant.Transition) { foreach (Circuit c in circuitsSeq) { if (valeurscourantes [c] != effetcourrant [c] && !valeurschangees.ContainsKey (c)) { valeurscourantes [c] = (effetcourrant [c] - valeursinitiales [c]) * effetcourrant.Duree.Milliseconds / time.Milliseconds + valeursinitiales [c]; } } } else { FinDeTransition (); } } if (timeStamp >= effetcourrant.Duree) { int index = effets.IndexOf (effetcourrant) + 1; if (index < effets.Count) ChangeEffet (index); } } void FinDeTransition () { enTransition = false; foreach (Circuit c in circuitsSeq) valeurscourantes [c] = effetcourrant [c]; } public void ChangeEffet (int index) { effetcourrant = effets [index]; valeurschangees.Clear (); valeursinitiales = new Dictionary (valeurscourantes); enTransition = true; timeStamp = TimeSpan.Zero; } public void SauveEffet (string nom, TimeSpan duree, TimeSpan transition) { effets.Add (new Effet (nom, valeurscourantes, duree, transition)); } public override System.Xml.XmlElement Save () { throw new System.NotImplementedException (); } public override SequenceurUI GetUI () { if (ui == null) { ui = new SeqLinUI (this); ui.Destroyed += UiDestroyed; } return ui; } void UiDestroyed (object sender, EventArgs e) { ui = null; } } }