loupiottes/DMX-2.0/GestionMidiUI.cs
2014-05-22 11:21:50 +00:00

134 lines
3.2 KiB
C#

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.MidiDev));
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;
}
void HandleDestroyed (object sender, EventArgs e)
{
if(timer!=0)
GLib.Source.Remove(timer);
}
bool Refresh ()
{
if (MidiEventProvider.GuiRefreshFlag) {
FillLsDetect();
FillLsKnown();
}
return true;
}
void RenderMidiDev (Gtk.TreeViewColumn tree_column, Gtk.CellRenderer cell, Gtk.TreeModel tree_model, Gtk.TreeIter iter)
{
MidiEventProvider.MidiDev dev = tree_model.GetValue (iter, 0) as MidiEventProvider.MidiDev;
(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(!MidiEventProvider.IsKnownDevice(name))
lsDetect.AppendValues(name);
}
}
}
}
void FillLsKnown ()
{
lsKnown.Clear ();
foreach (var dev in MidiEventProvider.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)
{
btnDesactiv.Sensitive = (listKnown.Selection.CountSelectedRows() >0);
}
protected void OnBtnActivClicked (object sender, EventArgs e)
{
TreeIter iter;
if(!listDetect.Selection.GetSelected(out iter)) return;
string name= lsDetect.GetValue(iter,0) as string;
MidiEventProvider.ConnectDevice(name);
FillLsDetect () ;
FillLsKnown();
}
protected void OnBtnDesactivClicked (object sender, EventArgs e)
{
TreeIter iter;
if(!listKnown.Selection.GetSelected(out iter)) return;
MidiEventProvider.MidiDev dev = lsKnown.GetValue(iter,0) as MidiEventProvider.MidiDev ;
MidiEventProvider.DisconnectDevice(dev);
FillLsDetect () ;
FillLsKnown();
}
}
}