public ReflectedObjectGUINode(ReflectedObjectGUINode parent, AddTweakableParamGUI gui, FieldInfo fieldInfo, string field, bool isLeaf, string inputMin, string inputMax, string inputStep, bool setOnlyOnLaunchPad)
 {
     m_parent = parent;
     m_gui = gui;
     m_fieldInfo = fieldInfo;
     m_field = field;
     m_isLeaf = isLeaf;
     if (inputMin != null)
         m_inputMin = inputMin;
     if (inputMax != null)
         m_inputMax = inputMax;
     if (inputStep != null)
         m_inputStep = inputStep;
     m_setOnlyOnLaunchPad = setOnlyOnLaunchPad;
 }
        private void GenerateGUINodes()
        {
            if (m_selectedPart == null) return;

            //Debug.Log("Generating nodes...");
            FieldInfo[] fields = m_selectedPart.GetType().GetFields();
            foreach (FieldInfo fi in fields)
            {
                //Debug.Log("Iterating all fields: " + fi.FieldType.Name + " " + fi.Name + " (" + (fi.IsPublic ? "public" : "non-public") + ")");
                if (fi.IsPublic == false)
                {
                    //Debug.Log("Non-public field, skipping...");
                    continue;
                }
                if
                (
                    fi.FieldType.Equals(typeof(Double)) ||
                    fi.FieldType.Equals(typeof(Single))
                )
                {
                    // This is a valid node.
                    ReflectedObjectGUINode node = new ReflectedObjectGUINode(null, this, fi, fi.Name, true, "0.0", "1.0", "0.1", false);
                    RegisterGUINode(node);
                }
                else if
                (
                    fi.FieldType.Equals(typeof(UInt32)) ||
                    fi.FieldType.Equals(typeof(Int32))
                )
                {
                    // This is a valid node.
                    ReflectedObjectGUINode node = new ReflectedObjectGUINode(null, this, fi, fi.Name, true, "0", "10", "1", false);
                    RegisterGUINode(node);
                }
                else if
                (
                    fi.FieldType.Equals(typeof(FloatCurve))
                )
                {
                    // This is a float-curve node.
                    Debug.Log("Float curve detected.");
                    ReflectedCurveGUINode node = new ReflectedCurveGUINode(null, this, fi, fi.Name, true, "1", "-1", "0", false);
                    RegisterGUINode(node);
                }
            }

            for (int i = 0; i < m_selectedPart.Modules.Count; ++i)
            {
                PartModule partModule = m_selectedPart.Modules.GetModule(i);
                //Debug.Log("Iterating all part modules: " + partModule.GetType().Name);
                string partModuleTypeName = partModule.GetType().Name;
                if (partModuleTypeName != "ModuleTweakableParam")
                {
                    // This is a valid node.
                    ReflectedObjectGUINode node = new ReflectedObjectGUINode(null, this, null, "Module(" + partModule.GetType().Name + ")", false, null, null, null, false);

                    FieldInfo[] moduleFields = partModule.GetType().GetFields();
                    foreach (FieldInfo fi in moduleFields)
                    {
                        //Debug.Log("Iterating all fields: " + fi.FieldType.ToString() + " " + fi.Name + " (" + (fi.IsPublic ? "public" : "non-public") + ")");
                        if (fi.IsPublic == false)
                        {
                            //Debug.Log("Non-public field, skipping...");
                            continue;
                        }
                        if
                        (
                            fi.FieldType.Equals(typeof(Double)) ||
                            fi.FieldType.Equals(typeof(Single))
                        )
                        {
                            // This is a valid node.
                            ReflectedObjectGUINode subNode = new ReflectedObjectGUINode(node, this, fi, fi.Name, true, "0.0", "1.0", "0.1", false);
                            node.m_subNodes.Add(subNode);
                        }
                        else if
                        (
                            fi.FieldType.Equals(typeof(UInt32)) ||
                            fi.FieldType.Equals(typeof(Int32))
                        )
                        {
                            // This is a valid node.
                            ReflectedObjectGUINode subNode = new ReflectedObjectGUINode(node, this, fi, fi.Name, true, "0", "10", "1", false);
                            node.m_subNodes.Add(subNode);
                        }
                        else if
                        (
                            fi.FieldType.Equals(typeof(FloatCurve))
                        )
                        {
                            // This is a float-curve node.
                            Debug.Log("Float curve detected.");
                            ReflectedCurveGUINode subNode = new ReflectedCurveGUINode(node, this, fi, fi.Name, true, "1", "-1", "0", false);
                            node.m_subNodes.Add(subNode);
                        }
                    }
                    RegisterGUINode(node);
                }
            }

            for (int i = 0; i < m_selectedPart.Resources.Count; ++i)
            {
                PartResource partResource = m_selectedPart.Resources.list[i];
                string resourceName = partResource.resourceName;
                //Debug.Log("Iterating all part resources: " + resourceName);
                // This is a valid node.
                ReflectedObjectGUINode node = new ReflectedObjectGUINode(null, this, null, "Resource(" + resourceName + ")", false, null, null, null, false);

                FieldInfo[] resourceFields = partResource.GetType().GetFields();
                foreach (FieldInfo fi in resourceFields)
                {
                    //Debug.Log("Iterating all fields: " + fi.FieldType.Name + " " + fi.Name);
                    if (fi.IsPublic == false)
                    {
                        //Debug.Log("Non-public field, skipping...");
                        continue;
                    }
                    if
                    (
                        fi.FieldType.Equals(typeof(Double)) ||
                        fi.FieldType.Equals(typeof(Single))
                    )
                    {
                        if (fi.Name == "amount")
                        {
                            // This is a special node.
                            double maxValue = partResource.maxAmount;
                            double stepValue = maxValue / 10.0;
                            ReflectedObjectGUINode subNode = new ReflectedObjectGUINode(node, this, fi, fi.Name, true, "0.0", maxValue.ToString(), stepValue.ToString(), true);
                            node.m_subNodes.Add(subNode);
                        }
                        else if (fi.Name == "maxAmount")
                        {
                            // This is a special node.
                            double maxValue = partResource.maxAmount;
                            double stepValue = maxValue / 10.0;
                            ReflectedObjectGUINode subNode = new ReflectedObjectGUINode(node, this, fi, fi.Name, true, "0.0", maxValue.ToString(), stepValue.ToString(), false);
                            node.m_subNodes.Add(subNode);
                        }
                        else
                        {
                            // This is a valid node.
                            ReflectedObjectGUINode subNode = new ReflectedObjectGUINode(node, this, fi, fi.Name, true, "0.0", "1.0", "0.1", false);
                            node.m_subNodes.Add(subNode);
                        }
                    }
                }
                RegisterGUINode(node);
            }
        }
 public ReflectedCurveGUINode(ReflectedObjectGUINode parent, AddTweakableParamGUI gui, FieldInfo fieldInfo, string field, bool isLeaf, string inputMin, string inputMax, string inputStep, bool setOnlyOnLaunchPad)
     : base(parent, gui, fieldInfo, field, isLeaf, inputMin, inputMax,inputStep, setOnlyOnLaunchPad)
 {
     inputMin = "0";
     inputMax = "0";
     inputStep = "0";
     setOnlyOnLaunchPad = false;
 }
        public void RegisterGUINode(ReflectedObjectGUINode node)
        {
            if (m_guiNodes.Count == 0)
                AddGUI();

            if (m_guiNodes.Contains(node)) return;

            m_guiNodes.Add(node);
        }