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(@"{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; } 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 (); } } 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(); } } }