308 lines
8.3 KiB
C#
308 lines
8.3 KiB
C#
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;
|
|
|
|
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(@"<big>{0:0\.0}</big>", 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;
|
|
|
|
}
|
|
|
|
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<Circuit,VScale> tirettes = new Dictionary<Circuit, VScale>();
|
|
|
|
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<Widget>(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 = "<small>" + c.ShortName + "</small>";
|
|
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 ();
|
|
}
|
|
}
|
|
|
|
|
|
protected void OnSaveActionActivated (object sender, EventArgs e)
|
|
{
|
|
//int d,t; if(!int.TryParse(dureeEntry.Text,out d) || !int.TryParse(transEntry.Text,out t)) return;
|
|
TreeIter iter;
|
|
int pos = sequenceur.SauveEffet("Nouvel Effet", TimeSpan.Zero,TimeSpan.FromSeconds(5));
|
|
UpdListeEffets();
|
|
lsEffets.IterNthChild(out iter, pos);
|
|
effetsListe.SetCursor(lsEffets.GetPath(iter),nomCol,true);
|
|
}
|
|
|
|
|
|
protected void OnGoForwardActionActivated (object sender, EventArgs e)
|
|
{
|
|
sequenceur.IndexEffetCourrant++;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
}
|
|
}
|
|
|