/// <summary>
 /// Raises the button press event, event args will contain the type of node to instantiate.
 /// current graphmodels will subscribe to the library's buttonpress event so nodes can be instantiated
 /// </summary>
 /// <param name="e">E.</param>
 public void OnButtonPress(LibraryButton button, EventArgs e)
 {
     if (ButtonPressed != null)
     {
         ButtonPressed(button, e);
     }
 }
    private void OnLibraryButtonPress(LibraryButton button, EventArgs e)
    {
        //TODO clean this logic up
        //for now just check the type of library button, and perform the correct instantiation logic
        //could alternatively store this logic on the button so can just call it from here.... i like that more

        //TODO for both of these methods instantiation points should just be in front of the camera by x units

        if (button.GetType() == typeof(CustomNodeLibraryButton))
        {
            var nodeinfo = (button as CustomNodeLibraryButton).Info;
            _appmodel.CollapsedCustomGraphNodeManager.CreateCustomNodeInstance(nodeinfo.FunctionId, new Guid(), new Vector3(0, 0, 0), this, null, nodeinfo.Name);
        }

        else
        {
            var        nodetype = button.LoadedType;
            MethodInfo method   = this.GetType().GetMethod("InstantiateNode");
            MethodInfo generic  = method.MakeGenericMethod(nodetype);
            //generic is a delegate pointing towards instantiate node, we're passing the nodetype to instantiate
            //this is a fully qualified type extracted from the libraryButton
            generic.Invoke(this, new object[] { new Vector3(0, 0, 0), new Guid() });
        }
    }