loupiottes/DMX-2.0/SequenceurLineaire.cs

200 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace DMX2
{
public class SequenceurLineaire : Sequenceur
{
TimeSpan timeStamp = TimeSpan.Zero;
public TimeSpan TimeStamp {
get {
return timeStamp;
}
}
public class Effet {
string _nom;
public Effet(string nom, Dictionary<Circuit,int> valeurs, TimeSpan duree, TimeSpan transition)
{
_nom=nom;
_valeurs = new Dictionary<Circuit, int>(valeurs);
_duree=duree;
_transition=transition;
}
public string Nom {
get {
return _nom;
}
}
Dictionary<Circuit,int> _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;
}
}
}
List<Circuit> circuitsSeq = new List<Circuit>();
public ReadOnlyCollection<Circuit> Circuits {
get {
return circuitsSeq.AsReadOnly();
}
}
public void ChangeCircuits (System.Collections.Generic.List<Circuit> list)
{
foreach (var c in circuitsSeq) {
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);
}
}
List<Effet> effets = new List<Effet>();
public ReadOnlyCollection<Effet> Effets {
get {
return effets.AsReadOnly() ;
}
}
Effet effetcourrant=null;
bool enTransition=false;
Dictionary<Circuit,int> valeurscourantes = new Dictionary<Circuit, int>();
Dictionary<Circuit,int> valeursinitiales = new Dictionary<Circuit, int>();
public SequenceurLineaire ()
{
}
public SequenceurLineaire (int id) :base (id)
{
}
public override int EtatCircuit (Circuit c)
{
if (!circuitsSeq.Contains (c))
return 0;
return valeurscourantes[c];
}
public override void Tick (TimeSpan time)
{
timeStamp += time;
if (enTransition) {
if(timeStamp<effetcourrant.Duree){
foreach( Circuit c in circuitsSeq)
{
if(valeurscourantes[c] != effetcourrant[c])
{
valeurscourantes[c] = (effetcourrant[c]-valeursinitiales[c]) * effetcourrant.Duree.Milliseconds / time.Milliseconds + valeursinitiales[c];
}
}
}
else
{
FinDeTransition();
}
}
}
void FinDeTransition ()
{
enTransition = false;
foreach( Circuit c in circuitsSeq)
valeurscourantes[c]=effetcourrant[c];
}
public void ChangeEffet(Effet effet)
{
effetcourrant = effet;
valeursinitiales = new Dictionary<Circuit, int>(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 ();
}
SeqLinUI ui=null;
public override SequenceurUI GetUI ()
{
if (ui == null) {
ui = new SeqLinUI (this);
ui.Destroyed += UiDestroyed;;
}
return ui;
}
void UiDestroyed (object sender, EventArgs e)
{
ui=null;
}
}
}