using System;
using System.Collections.Generic;
using Gtk;
namespace DMX2
{
[System.ComponentModel.ToolboxItem(true)]
public partial class SeqLinUI : SequenceurUI
{
bool fullUpdFlag = true;
SequenceurLineaire sequenceur;
ListStore lsEffets=null;
TreeViewColumn nomCol;
bool effetChange = false;
public void EffetChange ()
{
effetChange = true;
}
public SeqLinUI (SequenceurLineaire s ) : base (s)
{
this.Build ();
titreLabel.Text = s.Name;
sequenceur = s;
Update(true);
#region Construction listeEffets
// Construction de la liste d'effets
var numCol = new TreeViewColumn();
nomCol = new TreeViewColumn();
var dureeCol = new TreeViewColumn();
var transCol = new TreeViewColumn();
var numCell = new CellRendererText();
var nomCell = new CellRendererText();
var dureeCell = new CellRendererText();
var transCell = new CellRendererText();
numCol.Title = "N°";
nomCol.Title = "Effet";
dureeCol.Title = "Duree";
transCol.Title = "Transition";
numCol.PackEnd(numCell,true);
nomCol.PackStart(nomCell,true);
dureeCol.PackEnd(dureeCell,true);
transCol.PackEnd(transCell,true);
numCol.SetCellDataFunc(numCell, new TreeCellDataFunc(RenderNum));
nomCol.SetCellDataFunc(nomCell, new TreeCellDataFunc(RenderNom));
dureeCol.SetCellDataFunc(dureeCell, new TreeCellDataFunc(RenderDuree));
transCol.SetCellDataFunc(transCell, new TreeCellDataFunc(RenderTrans));
nomCol.MinWidth = 150;
nomCol.Expand=true;
dureeCol.MaxWidth=50;
transCol.MaxWidth=50;
effetsListe.AppendColumn(numCol);
effetsListe.AppendColumn(nomCol);
effetsListe.AppendColumn(transCol);
effetsListe.AppendColumn(dureeCol);
lsEffets = new ListStore(typeof(SequenceurLineaire.Effet));
effetsListe.Model = lsEffets;
nomCell.Editable = true;
dureeCell.Editable = true;
transCell.Editable = true;
nomCell.Edited += EditNom;
dureeCell.Edited += EditDuree;
transCell.Edited += EditTrans;
#endregion
}
void EditNom (object o, EditedArgs args)
{
Gtk.TreeIter iter;
lsEffets.GetIter (out iter, new Gtk.TreePath (args.Path));
SequenceurLineaire.Effet e = lsEffets.GetValue(iter,0) as SequenceurLineaire.Effet;
e.Nom = args.NewText;
}
void EditDuree (object o, EditedArgs args)
{
Gtk.TreeIter iter;int d;
lsEffets.GetIter (out iter, new Gtk.TreePath (args.Path));
SequenceurLineaire.Effet e = lsEffets.GetValue(iter,0) as SequenceurLineaire.Effet;
if(int.TryParse(args.NewText , out d))
e.Duree = TimeSpan.FromMilliseconds(d * 100);
}
void EditTrans (object o, EditedArgs args)
{
Gtk.TreeIter iter; int t;
lsEffets.GetIter (out iter, new Gtk.TreePath (args.Path));
SequenceurLineaire.Effet e = lsEffets.GetValue(iter,0) as SequenceurLineaire.Effet;
if(int.TryParse(args.NewText , out t))
e.Transition = TimeSpan.FromMilliseconds(t * 100);
}
#region Affichage Liste d'Effets
void RenderNum (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
{
SequenceurLineaire.Effet e = tree_model.GetValue (iter, 0) as SequenceurLineaire.Effet;
(cell as Gtk.CellRendererText).Text = (sequenceur.Effets.IndexOf(e)+1).ToString() ;
}
void RenderNom (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
{
SequenceurLineaire.Effet e = tree_model.GetValue (iter, 0) as SequenceurLineaire.Effet;
(cell as Gtk.CellRendererText).Text = e.Nom;
}
void RenderDuree (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
{
SequenceurLineaire.Effet e = tree_model.GetValue (iter, 0) as SequenceurLineaire.Effet;
(cell as Gtk.CellRendererText).Text = (e.Duree.TotalMilliseconds/100).ToString();
}
void RenderTrans (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
{
SequenceurLineaire.Effet e = tree_model.GetValue (iter, 0) as SequenceurLineaire.Effet;
(cell as Gtk.CellRendererText).Text = (e.Transition.TotalMilliseconds/100).ToString();
}
void UpdListeEffets ()
{
lsEffets.Clear();
foreach (var effet in sequenceur.Effets) {
lsEffets.AppendValues(effet);
}
}
#endregion
public override void Update (bool full)
{
if(fullUpdFlag || full) FullUpdate();
UpdateValues();
timeLabel.LabelProp = string.Format(@"{0:0\.0}", sequenceur.TimeStamp.TotalMilliseconds/100);
if(sequenceur.EffetCourrant.Duree != TimeSpan.Zero )
pbDuree.Fraction = Math.Min(1.0d, sequenceur.TimeStamp.TotalMilliseconds / sequenceur.EffetCourrant.Duree.TotalMilliseconds);
else
pbDuree.Fraction = 0.0d;
if(sequenceur.EffetCourrant.Transition != TimeSpan.Zero )
pbTrans.Fraction = Math.Min(1.0d, sequenceur.TimeStamp.TotalMilliseconds / sequenceur.EffetCourrant.Transition.TotalMilliseconds);
else
pbTrans.Fraction = 0.0d;
if (effetChange)
SelectionneEffet(sequenceur.IndexEffetCourrant);
}
void SelectionneEffet (int index)
{
if(index <0 ) return;
effetsListe.SetCursor( new TreePath( new int[1] {index }) ,null,false);
effetChange = false;
}
protected void OnCircuitsActionActivated (object sender, EventArgs e)
{
var dlg = new SelSeqCircuits (sequenceur.Circuits);
if ((ResponseType)dlg.Run () == ResponseType.Ok) {
sequenceur.ChangeCircuits(dlg.GetResultList());
}
dlg.Destroy();
fullUpdFlag = true;
}
protected void OnCloseActionActivated (object sender, EventArgs e)
{
Destroy();
}
Dictionary tirettes = new Dictionary();
static VScale NouvelleTirette ()
{
VScale tirette = new VScale (null);
tirette.WidthRequest = 25;
tirette.HeightRequest = 150;
tirette.CanFocus = true;
tirette.Inverted = true;
tirette.Adjustment.Upper = 255;
tirette.Adjustment.PageIncrement = 10;
tirette.Adjustment.StepIncrement = 1;
tirette.DrawValue = true;
tirette.Digits = 0;
return tirette;
}
static Label NouveauLabel ()
{
Label l = new Label();
l.WidthRequest = 50;
l.HeightRequest = 66;
l.Xalign = 1F;
l.Yalign = 0F;
l.UseMarkup = true;
l.Angle = 65;
return l;
}
int lastKnownWidth =0;
object circuitKey = new object();
protected void FullUpdate ()
{
fullUpdFlag=true;
// TODO : ici : Remise a plat de l'UI , Ajout/agencement des tirettes et descriptions
lastKnownWidth = zoneWid.Allocation.Width;
foreach (Widget wid in new List(zoneWid.Children))
zoneWid.Remove (wid);
tirettes.Clear();
int xpos=10, ypos=0;
VScale tirette; Fixed.FixedChild fx;
Label label;
foreach (Circuit c in sequenceur.Circuits) {
tirettes[c] = tirette = NouvelleTirette();
zoneWid.Add(tirette);
fx = ( zoneWid[tirette] as Fixed.FixedChild);
fx.X = xpos; fx.Y = ypos;
tirette.Show();
tirette.ValueChanged += TiretteActionee;
tirette.Data.Add(circuitKey,c);
label = NouveauLabel();
zoneWid.Add(label);
fx = ( zoneWid[label] as Fixed.FixedChild);
fx.X = xpos-30;
fx.Y = ypos+150;
label.LabelProp = "" + c.ShortName + "";
label.Show();
xpos+=30;
if(lastKnownWidth < xpos +30)
{
xpos = 10;
ypos += 215;
}
}
fullUpdFlag=false;
}
bool updating=false;
void TiretteActionee (object sender, EventArgs e)
{
if (updating)return;
VScale t = sender as VScale;
Circuit c = t.Data[circuitKey] as Circuit;
sequenceur.ChangeValeur(c,(int)(t.Value));
}
protected void UpdateValues()
{
updating = true;
foreach (Circuit c in tirettes.Keys) {
tirettes[c].Value = sequenceur.ValeurCircuit(c);
}
updating=false;
}
protected void OnZoneWidSizeAllocated (object o, SizeAllocatedArgs args)
{
if (!fullUpdFlag) {
if(lastKnownWidth != args.Allocation.Width)
FullUpdate ();
}
}
int IndexEffetSelectionne()
{
var sel = effetsListe.Selection.GetSelectedRows();
if(sel.Length ==0) return -1;
return effetsListe.Selection.GetSelectedRows()[0].Indices[0];
}
protected void OnSaveActionActivated (object sender, EventArgs e)
{
int pos = sequenceur.SauveEffet("Nouvel Effet", TimeSpan.Zero,TimeSpan.FromSeconds(5));
UpdListeEffets();
effetsListe.SetCursor(new TreePath( new int[1] {pos}) ,nomCol,true);
}
protected void OnGoForwardActionActivated (object sender, EventArgs e)
{
if(sequenceur.IndexEffetCourrant == IndexEffetSelectionne())
sequenceur.IndexEffetCourrant++;
else
sequenceur.IndexEffetCourrant = IndexEffetSelectionne();
}
protected void OnGoBackActionActivated (object sender, EventArgs e)
{
sequenceur.IndexEffetCourrant--;
}
protected void OnMediaPauseActionActivated (object sender, EventArgs e)
{
sequenceur.Paused = ! sequenceur.Paused;
}
protected void OnMediaNextActionActivated (object sender, EventArgs e)
{
sequenceur.FinDeTransition();
}
protected void OnApplyActionActivated (object sender, EventArgs e)
{
int pos = IndexEffetSelectionne();
sequenceur.RemplaceEffet(pos);
UpdListeEffets();
effetsListe.SetCursor(new TreePath( new int[1] {pos}) ,null,false);
}
protected void OnSaveAfterActionActivated (object sender, EventArgs e)
{
int pos = sequenceur.InsereEffetApres(IndexEffetSelectionne(),"Nouvel Effet",TimeSpan.Zero,TimeSpan.FromSeconds(5));
UpdListeEffets();
effetsListe.SetCursor(new TreePath( new int[1] {pos}) ,nomCol,true);
}
protected void OnDeleteActionActivated (object sender, EventArgs e)
{
sequenceur.SupprimeEffet(IndexEffetSelectionne());
UpdListeEffets();
}
protected void OnMoveUpActionActivated (object sender, EventArgs e)
{
int pos = IndexEffetSelectionne();
if(pos==-1) return;
pos = sequenceur.MonteEffet(pos);
UpdListeEffets();
effetsListe.SetCursor(new TreePath( new int[1] {pos}) ,null,false);
}
protected void OnMoveDownActionActivated (object sender, EventArgs e)
{
int pos = IndexEffetSelectionne();
if(pos==-1) return;
pos = sequenceur.BaisseEffet(pos);
UpdListeEffets();
effetsListe.SetCursor(new TreePath( new int[1] {pos}) ,null,false);
}
}
}