using System; using Gtk; namespace DMX2 { public partial class GestionMidiUI : Gtk.Dialog { Gtk.ListStore lsDetect; Gtk.ListStore lsKnown; uint timer=0; public GestionMidiUI () { this.Build (); lsDetect = new Gtk.ListStore (typeof(string)); lsKnown = new Gtk.ListStore (typeof(MidiEventProvider.MidiDevice)); var nameCol = new Gtk.TreeViewColumn (); var nameCell = new Gtk.CellRendererText (); nameCol.Title = "Interfaces"; nameCol.PackStart (nameCell, true); nameCol.AddAttribute (nameCell, "text", 0); this.listDetect.AppendColumn (nameCol); var mdCol = new Gtk.TreeViewColumn (); var mdCell = new Gtk.CellRendererText (); mdCol.Title = "Interfaces"; mdCol.PackStart (mdCell, true); mdCol.SetCellDataFunc (mdCell, new Gtk.TreeCellDataFunc (RenderMidiDev)); this.listKnown.AppendColumn (mdCol); listDetect.Model = lsDetect; listKnown.Model = lsKnown; FillLsDetect (); FillLsKnown (); timer = GLib.Timeout.Add (500, Refresh); Destroyed += HandleDestroyed; spinNbPage.Value = Conduite.Courante.Midi.Maxpage; spinPageDown.Value = Conduite.Courante.Midi.PageDownCC; spinPageUp.Value = Conduite.Courante.Midi.PageUpCC; spinMax14b.Sensitive = chkFourteenBits.Active = Conduite.Courante.Midi.Use14bCC; if (Conduite.Courante.Midi.UnpaginatedChannels.Count == 0) { spinUPCh.Sensitive = false; chkPg.Active = false; } else { spinUPCh.Sensitive = true; spinUPCh.Value = Conduite.Courante.Midi.UnpaginatedChannels [0] + 1; chkPg.Active = true; } spinMax14b.Value = Conduite.Courante.Midi.Max14bValue; } void HandleDestroyed (object sender, EventArgs e) { if(timer!=0) GLib.Source.Remove(timer); } bool Refresh () { if (Conduite.Courante.Midi.GuiRefreshFlag) { FillLsDetect(); FillLsKnown(); } return true; } void RenderMidiDev (Gtk.TreeViewColumn tree_column, Gtk.CellRenderer cell, Gtk.TreeModel tree_model, Gtk.TreeIter iter) { MidiEventProvider.MidiDevice dev = tree_model.GetValue (iter, 0) as MidiEventProvider.MidiDevice; (cell as Gtk.CellRendererText).Text = dev.ConnectedPorts.Count>0 ?string.Format("{0} ({1} connectés)",dev.Name,dev.ConnectedPorts.Count) :string.Format("{0} (Déconnecté)",dev.Name); } void FillLsDetect () { lsDetect.Clear (); foreach (var dev in AlsaSeqLib.EnumClients ()) { if(dev.Id== AlsaSeqLib.ClientId || dev.Id == 0 || dev.Id == 14 ) continue; foreach(var port in dev.Ports){ if((port.Caps & AlsaSeqLib.SND_SEQ_PORT_CAP_READ) == AlsaSeqLib.SND_SEQ_PORT_CAP_READ){ string name = dev.Name+":"+port.Name; if(!Conduite.Courante.Midi.IsKnownDevice(name)) lsDetect.AppendValues(name); } } } } void FillLsKnown () { lsKnown.Clear (); foreach (var dev in Conduite.Courante.Midi.KnownDevices) { lsKnown.AppendValues(dev); } } protected void OnButtonCloseClicked (object sender, EventArgs e) { Destroy(); } protected void OnListDetectCursorChanged (object sender, EventArgs e) { btnActiv.Sensitive = (listDetect.Selection.CountSelectedRows() >0); } protected void OnListKnownCursorChanged (object sender, EventArgs e) { chkFB.Sensitive = btnDesactiv.Sensitive = (listKnown.Selection.CountSelectedRows() >0); TreeIter iter; if(!listKnown.Selection.GetSelected(out iter)) return; MidiEventProvider.MidiDevice dev = lsKnown.GetValue(iter,0) as MidiEventProvider.MidiDevice ; chkFB.Active = dev.HasFeedback; } protected void OnBtnActivClicked (object sender, EventArgs e) { TreeIter iter; if(!listDetect.Selection.GetSelected(out iter)) return; string name= lsDetect.GetValue(iter,0) as string; Conduite.Courante.Midi.ConnectDevice(name); FillLsDetect () ; FillLsKnown(); } protected void OnBtnDesactivClicked (object sender, EventArgs e) { TreeIter iter; if(!listKnown.Selection.GetSelected(out iter)) return; MidiEventProvider.MidiDevice dev = lsKnown.GetValue(iter,0) as MidiEventProvider.MidiDevice ; Conduite.Courante.Midi.DisconnectDevice(dev); FillLsDetect () ; FillLsKnown(); } protected void OnChkFBToggled (object sender, EventArgs e) { TreeIter iter; if(!listKnown.Selection.GetSelected(out iter)) return; MidiEventProvider.MidiDevice dev = lsKnown.GetValue(iter,0) as MidiEventProvider.MidiDevice ; dev.HasFeedback = chkFB.Active; Conduite.Courante.Midi.RefreshFeedback(dev.Name); } protected void OnSpinPageUPValueChanged (object sender, EventArgs e) { Conduite.Courante.Midi.Maxpage = (uint) spinNbPage.ValueAsInt; } protected void OnSpinUPChValueChanged (object sender, EventArgs e) { Conduite.Courante.Midi.UnpaginatedChannels.Clear(); if (spinUPCh.ValueAsInt == 0) return; Conduite.Courante.Midi.UnpaginatedChannels.Add((byte)(spinUPCh.ValueAsInt-1)); } protected void OnChkPgToggled (object sender, EventArgs e) { Conduite.Courante.Midi.UnpaginatedChannels.Clear (); if (!chkPg.Active) { spinUPCh.Sensitive=false; return; } spinUPCh.Sensitive=true; Conduite.Courante.Midi.UnpaginatedChannels.Add((byte)(spinUPCh.ValueAsInt-1)); } protected void OnChkFourteenBitsToggled (object sender, EventArgs e) { spinMax14b.Sensitive = Conduite.Courante.Midi.Use14bCC = chkFourteenBits.Active; } protected void OnSpinPageDownValueChanged (object sender, EventArgs e) { Conduite.Courante.Midi.PageDownCC = (uint)spinPageDown.ValueAsInt; } protected void OnSpinPageUpValueChanged (object sender, EventArgs e) { Conduite.Courante.Midi.PageUpCC = (uint)spinPageUp.ValueAsInt; } protected void OnSpinMax14bValueChanged (object sender, EventArgs e) { Conduite.Courante.Midi.Max14bValue = spinMax14b.ValueAsInt; } protected void OnBtnClearEventsClicked (object sender, EventArgs e) { Conduite.Courante.EventManager.ClearAll (); } } }