loupiottes/DMX-2.0/SeqLinUI.cs
2013-04-18 11:53:41 +00:00

238 lines
6.1 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;
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();
var 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));
effetsListe.AppendColumn(numCol);
effetsListe.AppendColumn(nomCol);
effetsListe.AppendColumn(dureeCol);
effetsListe.AppendColumn(transCol);
lsEffets = new ListStore(typeof(SequenceurLineaire.Effet));
effetsListe.Model = lsEffets;
#endregion
}
#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 = "";
}
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);
}
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;
sequenceur.SauveEffet("Nom", TimeSpan.FromMilliseconds(100*d),TimeSpan.FromMilliseconds(t*100));
UpdListeEffets();
}
protected void OnGoForwardActionActivated (object sender, EventArgs e)
{
sequenceur.IndexEffetCourrant++;
}
}
}