Esempio n. 1
0
        void itemGUI(Rect rect, int index, bool isActive, bool isFocused)
        {
            var item = sorted[index];
            var r    = getRects(rect);

            if (item.gameObject == Selection.activeGameObject)
            {
                DTHandles.DrawSolidRectangleWithOutline(rect.ScaleBy(4, 2), new Color(0, 0, 0.2f, 0.1f), new Color(.24f, .37f, .59f));
            }
            else if (index > 0)
            {
                DTHandles.PushHandlesColor(new Color(0.1f, 0.1f, 0.1f));
                Handles.DrawLine(new Vector2(rect.xMin - 5, rect.yMin), new Vector2(rect.xMax + 4, rect.yMin));
                DTHandles.PopHandlesColor();
            }

            bool repaint = false;
            var  cnt     = new GUIContent(item.ToString(), "Click to select");

            r[0].width = DTStyles.HtmlLinkLabel.CalcSize(cnt).x;
            if (DTGUI.LinkButton(r[0], cnt, ref repaint))// EditorStyles.label))
            {
                DTSelection.SetGameObjects(sorted[index]);
            }
            if (repaint)
            {
                Repaint();
            }

            item.ConnectionSyncPosition = GUI.Toggle(r[1], item.ConnectionSyncPosition, "");
            item.ConnectionSyncRotation = GUI.Toggle(r[8], item.ConnectionSyncRotation, "");
            if (GUI.Button(r[2], new GUIContent(CurvyStyles.DeleteSmallTexture, "Delete"), CurvyStyles.ImageButton))
            {
                item.Disconnect();
                CurvyProject.Instance.ScanConnections();
                GUIUtility.ExitGUI();
            }
            if (item.CanHaveFollowUp)
            {
                GUI.Label(r[3], "Head to");
                doFollowUpPopup(r[4], item);
                bool b = item.FollowUpHeading == ConnectionHeadingEnum.Minus;
                if (GUI.Toggle(r[5], b, new GUIContent("", "Head to spline start")) != b)
                {
                    item.FollowUpHeading = (!b) ? ConnectionHeadingEnum.Minus : ConnectionHeadingEnum.Auto;
                }
                b = item.FollowUpHeading == ConnectionHeadingEnum.Sharp;
                if (GUI.Toggle(r[6], b, new GUIContent("", "No Heading")) != b)
                {
                    item.FollowUpHeading = (!b) ? ConnectionHeadingEnum.Sharp : ConnectionHeadingEnum.Auto;
                }
                b = item.FollowUpHeading == ConnectionHeadingEnum.Plus;
                if (GUI.Toggle(r[7], b, new GUIContent("", "Head to spline end")) != b)
                {
                    item.FollowUpHeading = (!b) ? ConnectionHeadingEnum.Plus : ConnectionHeadingEnum.Auto;
                }
            }
        }
Esempio n. 2
0
        public override void OnModuleSceneDebugGUI()
        {
            var data = Target.SimulatedSpots;

            if (data)
            {
                Handles.matrix = Target.Generator.transform.localToWorldMatrix;
                DTGUI.PushColor(Color.red);
                for (int i = 0; i < data.Points.Length; i++)
                {
                    var Q = data.Points[i].Rotation * Quaternion.Euler(-90, 0, 0);
                    Handles.ArrowCap(0, data.Points[i].Position, Q, 2);

                    Handles.Label(data.Points[i].Position, data.Points[i].Index.ToString(), EditorStyles.boldLabel);
                }
                DTGUI.PopColor();
                Handles.matrix = Matrix4x4.identity;
            }
        }
Esempio n. 3
0
        public new void OnSceneGUI()
        {
            CurvySplineSegment cp;
            var cam = SceneView.currentDrawingSceneView.camera;

            if (cam && Target)
            {
                List <string> samePos = new List <string>();

                for (int i = 0; i < Target.ControlPoints.Count; i++)
                {
                    cp = Target.ControlPoints[i];
                    Color c = Color.black;
                    if (cp.ConnectionSyncPosition)
                    {
                        samePos.Add(cp.ToString());
                        c = new Color(1, 0, 0);
                    }
                    else
                    {
                        if (cp.ConnectionSyncRotation)
                        {
                            c = new Color(1, 1, 0);
                        }

                        DTGUI.PushColor(c);
                        Handles.Label(DTHandles.TranslateByPixel(cp.transform.position, 12, -12), new GUIContent(cp.ToString()));
                        DTGUI.PopColor();
                    }
                }
                if (samePos.Count > 0)
                {
                    DTGUI.PushColor(Color.white);
                    var P1 = cam.ScreenToWorldPoint(cam.WorldToScreenPoint(Target.transform.position) + new Vector3(12, -12, 0));
                    Handles.Label(P1, new GUIContent(string.Join("\n", samePos.ToArray())));
                    DTGUI.PopColor();
                }
            }
        }
Esempio n. 4
0
        void OnModuleWindowSlotGUI(CGModule module)
        {
            int   i = 0;
            float h = 18;

            while (module.Input.Count > i || module.Output.Count > i)
            {
                float y = CurvyStyles.ModuleWindowTitleHeight + h * i;
                GUILayout.BeginHorizontal();

                if (module.Input.Count > i)
                {
                    CGModuleInputSlot slot      = module.Input[i];
                    Color             slotColor = getTypeColor(slot.Info.DataTypes);
                    if (Canvas.IsLinkDrag && !slot.IsValidTarget(Canvas.LinkDragFrom))
                    {
                        slotColor = new Color(0.2f, 0.2f, 0.2f).SkinAwareColor(true);
                    }
                    DTGUI.PushColor(slotColor);
                    GUILayout.Box("<", CurvyStyles.Slot);
                    DTGUI.PopColor();
                    string postfix = "";
                    if (slot.Info.Array)
                    {
                        postfix = (slot.LastDataCountINTERNAL > 0) ? "[" + slot.LastDataCountINTERNAL.ToString() + "]" : "[]";
                    }
                    GUILayout.Label(new GUIContent(ObjectNames.NicifyVariableName(slot.Info.Name) + postfix, slot.Info.Tooltip), CurvyStyles.GetSlotLabelStyle(slot));
                    slot.DropZone = new Rect(0, y, module.Properties.Dimensions.width / 2, h);
                    slot.Origin   = new Vector2(module.Properties.Dimensions.xMin, module.Properties.Dimensions.yMin + y + h / 2);

                    // LinkDrag?
                    if (Canvas.IsLinkDrag)
                    {
                        // If ending drag over dropzone, create static link
                        if (EV.type == EventType.MouseUp && slot.DropZone.Contains(EV.mousePosition) && slot.IsValidTarget(Canvas.LinkDragFrom))
                        {
                            finishLink(slot);
                        }
                    }
                    // Clicking on Dropzone to pick existing link
                    else if (LMB && slot.Count == 1 && slot.DropZone.Contains(EV.mousePosition))
                    {
                        var linkedOutSlot = slot.SourceSlot();
                        linkedOutSlot.UnlinkFrom(slot);
                        EditorUtility.SetDirty(slot.Module);
                        startLinkDrag(linkedOutSlot);
                        GUIUtility.ExitGUI();
                    }
                }

                if (module.Output.Count > i)
                {
                    CGModuleOutputSlot slot    = module.Output[i];
                    string             postfix = "";
                    if (slot.Info.Array)
                    {
                        postfix = (slot.Data != null && slot.Data.Length > 1) ? "[" + slot.Data.Length.ToString() + "]" : "";
                    }

                    GUILayout.Label(new GUIContent(ObjectNames.NicifyVariableName(slot.Info.Name) + postfix, slot.Info.Tooltip), CurvyStyles.GetSlotLabelStyle(slot));
                    DTGUI.PushColor(getTypeColor(slot.Info.DataTypes));
                    GUILayout.Box(">", CurvyStyles.Slot);
                    DTGUI.PopColor();
                    // Debug

                    /*
                     * if (Generator.ShowDebug)
                     * {
                     *  GUI.enabled = slot.Data != null && slot.Data.Length>0;
                     *  if (GUILayout.Button(new GUIContent(CurvyStyles.DebugTexture, "Show Dump"), CurvyStyles.SmallButton, GUILayout.Width(16), GUILayout.Height(16)))
                     *      DTDebugWindow.Open(slot.Data[0].GetType().Name + ":", slot.Data[0].ToDumpString());
                     *  GUI.enabled = true;
                     * }
                     */
                    slot.DropZone = new Rect(module.Properties.Dimensions.width / 2, y, module.Properties.Dimensions.width / 2, h);
                    slot.Origin   = new Vector2(module.Properties.Dimensions.xMax, module.Properties.Dimensions.yMin + y + h / 2);
                    // Start Linking?
                    if (LMB && !Canvas.IsSelectionRectDrag && slot.DropZone.Contains(EV.mousePosition))
                    {
                        startLinkDrag(slot);
                    }
                }
                GUILayout.EndHorizontal();
                i++;
            }
        }
Esempio n. 5
0
        void OnModuleWindowCB(int id)
        {
            // something happened in the meantime?
            if (id >= Modules.Count || mModuleCount != Modules.Count)
            {
                return;
            }
            CGModule mod = Modules[id];

            //if (LMB && Sel.SelectedModules.Count<=1)
            if (EV.type == EventType.MouseUp && !Sel.SelectedModules.Contains(mod))
            {
                Sel.Select(Modules[id]);
            }

            Rect winRect = mod.Properties.Dimensions;

            // Draw Title Buttons
            // Enabled
            EditorGUI.BeginChangeCheck();
            mod.Active = GUI.Toggle(new Rect(2, 2, 16, 16), mod.Active, "");
            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(Generator);
            }

            //Edit Title & Color
            if (editTitleModule == mod)
            {
                GUI.SetNextControlName("editTitle" + id);
                mod.ModuleName = GUI.TextField(new Rect(30, 5, winRect.width - 120, 16), mod.ModuleName);
                mod.Properties.BackgroundColor = EditorGUI.ColorField(new Rect(winRect.width - 70, 5, 32, 16), mod.Properties.BackgroundColor);
            }


            if (GUI.Button(new Rect(winRect.width - 32, 6, 16, 16), new GUIContent(CurvyStyles.EditTexture, "Rename"), CurvyStyles.BorderlessButton))
            {
                editTitleModule = mod;
                Sel.Select(mod);
                EditorGUI.FocusTextInControl("editTitle" + id);
            }

            // Help
            if (GUI.Button(new Rect(winRect.width - 16, 6, 16, 16), new GUIContent(CurvyStyles.HelpTexture, "Help"), CurvyStyles.BorderlessButton))
            {
                var url = DTUtility.GetHelpUrl(mod);
                if (!string.IsNullOrEmpty(url))
                {
                    Application.OpenURL(url);
                }
            }



            // Check errors
            if (mod.CircularReferenceError)
            {
                EditorGUILayout.HelpBox("Circular Reference", MessageType.Error);
            }
            // Draw Slots
            DTGUI.PushColor(mod.Properties.BackgroundColor.SkinAwareColor(true));
            EditorGUILayout.BeginVertical(CurvyStyles.ModuleWindowSlotBackground);
            DTGUI.PopColor();
            OnModuleWindowSlotGUI(mod);
            EditorGUILayout.EndVertical();

            var ed = GetModuleEditor(mod);

            if (ed && ed.target != null)
            {
                if (EditorGUILayout.BeginFadeGroup(mShowDebug.faded))
                {
                    ed.OnInspectorDebugGUIINTERNAL(Repaint);
                }
                EditorGUILayout.EndFadeGroup();

                // Draw Module Options

                mod.Properties.Expanded.valueChanged.RemoveListener(Repaint);
                mod.Properties.Expanded.valueChanged.AddListener(Repaint);

                if (!CurvyProject.Instance.CGAutoModuleDetails)
                {
                    mod.Properties.Expanded.target = GUILayout.Toggle(mod.Properties.Expanded.target, new GUIContent(mod.Properties.Expanded.target ? CurvyStyles.CollapseTexture : CurvyStyles.ExpandTexture, "Show Details"), EditorStyles.toolbarButton);
                }

                // === Module Details ===
                // Handle Auto-Folding
                if (DTGUI.IsLayout && CurvyProject.Instance.CGAutoModuleDetails)
                {
                    mod.Properties.Expanded.target = (mod == Sel.SelectedModule);
                }

                if (EditorGUILayout.BeginFadeGroup(mod.Properties.Expanded.faded))
                {
                    EditorGUIUtility.labelWidth = (mod.Properties.LabelWidth);
                    // Draw Inspectors using Modules Background color
                    DTGUI.PushColor(ed.Target.Properties.BackgroundColor.SkinAwareColor(true));
                    EditorGUILayout.BeginVertical(CurvyStyles.ModuleWindowBackground);
                    DTGUI.PopColor();

                    ed.RenderGUI(true);
                    if (ed.NeedRepaint)
                    {
                        mDoRepaint = true;
                    }
                    GUILayout.Space(2);
                    EditorGUILayout.EndVertical();
                }
                EditorGUILayout.EndFadeGroup();
            }

            // Make it dragable
            GUI.DragWindow(new Rect(0, 0, winRect.width, CurvyStyles.ModuleWindowTitleHeight));
        }
Esempio n. 6
0
        void DrawModules()
        {
            CGModule curSel = Sel.SelectedModule;

            // Begin drawing Module Windows
            BeginWindows();
            for (int i = 0; i < Modules.Count; i++)
            {
                var mod = Modules[i];
                if (mod != null)
                {
                    mod.Properties.Dimensions.width  = Mathf.Max(mod.Properties.Dimensions.width, mod.Properties.MinWidth);
                    mod.Properties.Dimensions.height = 0; // will be set by GUILayout.Window
                    // Render title
                    string title = mod.ModuleName;
                    if (!mod.IsConfigured)
                    {
                        title = string.Format("<color={0}>{1}</color>", new Color(1, 0.2f, 0.2f).SkinAwareColor().ToHtml(), mod.ModuleName);
                    }
                    //"<color=#ff3333>" + mod.ModuleName + "</color>";
                    else if (mod is IOnRequestProcessing)
                    {
                        title = string.Format("<color={0}>{1}</color>", CurvyStyles.IOnRequestProcessingTitleColor.SkinAwareColor().ToHtml(), mod.ModuleName);
                    }

#if CURVY_DEBUG
                    title = mod.UniqueID + ":" + title;
#endif

                    // the actual window
                    Vector2 oldPos = mod.Properties.Dimensions.position;

                    Rect newWindowRect = GUILayout.Window(i, mod.Properties.Dimensions, OnModuleWindowCB, title, CurvyStyles.ModuleWindow);


                    if (!Application.isPlaying && oldPos != newWindowRect.position)

#if UNITY_5_0 || UNITY_5_1 || UNITY_5_2
                    { EditorApplication.MarkSceneDirty(); }
#else
                    { UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty(); }
#endif

                    if (Sel.SelectedModules.Count > 1) // Multi-Module move in OnGUI()
                    {
                        mod.Properties.Dimensions = newWindowRect.SetPosition(oldPos);
                    }
                    else
                    {
                        if (EV.alt && Canvas.IsModuleDrag && Sel.SelectedModule == mod)
                        {
                            newWindowRect.position = newWindowRect.position.Snap(CurvyProject.Instance.CGGraphSnapping);
                        }
                        mod.Properties.Dimensions = newWindowRect;
                    }



                    // Debugging
                    var lastUpdateDelta = (System.DateTime.Now - mod.DEBUG_LastUpdateTime).TotalMilliseconds;
                    if (lastUpdateDelta < 1500)
                    {
                        float alpha = Mathf.SmoothStep(1, 0, (float)lastUpdateDelta / 1500f);
                        DTGUI.PushBackgroundColor(new Color(0, 1, 0, alpha));
                        GUI.Box(mod.Properties.Dimensions.ScaleBy(9), "", CurvyStyles.GlowBox);
                        DTGUI.PopBackgroundColor();
                        Repaint();
                    }
                    // Track Window Movement for Viewport calculation
                    Canvas.ViewPortRegisterWindow(mod);
                }
            }
            EndWindows();
            if (Sel.SelectedModule != curSel)
            {
                Canvas.FocusSelection();
            }
        }
Esempio n. 7
0
        void OnGUI()
        {
            mDoRepaint = false;
            if (!Generator)
            {
                return;
            }
            if (!Generator.IsInitialized)
            {
                Generator.Initialize();
            }


            Modules      = new List <CGModule>(Generator.Modules.ToArray());
            mModuleCount = Modules.Count; // store count to be checked in window GUI

            if (!Application.isPlaying && !Generator.IsInitialized)
            {
                Repaint();
            }

            DrawToolbar();
            Canvas.SetClientRect(0, GUILayoutUtility.GetLastRect().yMax, 0, mStatusbarHeight);


            // Scrollable Canvas
            if (Canvas.Scroll.isAnimating)
            {
                GUI.BeginScrollView(Canvas.ClientRect, Canvas.Scroll.value, Canvas.CanvasRect);
            }
            else
            {
                Canvas.Scroll.value = GUI.BeginScrollView(Canvas.ClientRect, Canvas.Scroll.value, Canvas.CanvasRect);
            }


            // render background
            DTGUI.PushColor(Color.black.SkinAwareColor(true));
            GUI.Box(Canvas.ViewPort, "");
            DTGUI.PopColor();

#if CURVY_DEBUG
            GUILayout.BeginArea(Canvas.ViewPort);
            GUILayout.Label("Canvas ClientRect: " + Canvas.ClientRect);
            GUILayout.Label("Canvas Rect: " + Canvas.CanvasRect);
            GUILayout.Label("Canvas Scroll: " + Canvas.Scroll);
            GUILayout.Label("Canvas ViewPort: " + Canvas.ViewPort);

            GUILayout.Label("Mouse: " + EV.mousePosition);
            GUILayout.Label("IsWindowDrag: " + Canvas.IsWindowDrag);
            GUILayout.Label("IsSelectionDrag: " + Canvas.IsSelectionRectDrag);
            GUILayout.Label("IsLinkDrag: " + Canvas.IsLinkDrag);
            GUILayout.Label("IsCanvasDrag: " + Canvas.IsCanvasDrag);
            GUILayout.Label("IsModuleDrag: " + Canvas.IsModuleDrag);
            GUILayout.Label("MouseOverModule: " + Canvas.MouseOverModule);
            GUILayout.Label("MouseOverCanvas: " + Canvas.IsMouseOverCanvas);
            GUILayout.Label("SelectedLink: " + Sel.SelectedLink);
            GUILayout.Label("Selected Module: " + Sel.SelectedModule);
            GUILayout.EndArea();
#endif

            if (CurvyProject.Instance.CGShowHelp)
            {
                var r = new Rect(Canvas.ViewPort);
                r.x      = r.width - 210;
                r.y      = 10;
                r.width  = 200;
                r.height = 190;
                GUILayout.BeginArea(r, GUI.skin.box);
                GUI.Label(new Rect(10, 5, 200, 20), "<i><b>General</b></i>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 25, 50, 20), "<b>RMB</b>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(70, 25, 150, 20), "Context Menu", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 40, 150, 40), "<b>MMB/\nSpace</b>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(70, 40, 150, 20), "Drag Canvas", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 70, 150, 20), "<b>Alt</b>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(70, 70, 150, 20), "Hold to snap to grid", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 85, 150, 20), "<b>Del</b>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(70, 85, 150, 20), "Delete selection", DTStyles.HtmlLabel);


                GUI.Label(new Rect(10, 110, 200, 20), "<i><b>Add Modules</b></i>", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 130, 180, 40), "Hold <b>Ctrl</b> while releasing a\nlink to create & connect", DTStyles.HtmlLabel);
                GUI.Label(new Rect(20, 160, 180, 40), "Drag & Drop splines to create\nPath module", DTStyles.HtmlLabel);



                GUILayout.EndArea();
            }

            DrawLinks();

            // Init and early catch some events
            Canvas.BeginGUI();

            DrawModules();

            Canvas.EndGUI();

            // Draw Selection

            DTGUI.PushBackgroundColor(Color.white);//.SkinAwareColor());
            foreach (var mod in Sel.SelectedModules)
            {
                GUI.Box(mod.Properties.Dimensions.ScaleBy(2), "", CurvyStyles.RoundRectangle);
            }
            DTGUI.PopBackgroundColor();

            // Keep dragged Module in view and handle multiselection move
            if (Canvas.IsModuleDrag && !DTGUI.IsLayout)
            {
                Vector2 delta = EV.delta;
                deltaAccu += EV.delta;
                if (EV.alt)
                {
                    delta = deltaAccu.Snap(CurvyProject.Instance.CGGraphSnapping);
                    if (delta == deltaAccu)
                    {
                        delta = Vector2.zero;
                    }
                }
                if (Sel.SelectedModules.Count > 1)
                {
                    foreach (CGModule mod in Sel.SelectedModules)
                    {
                        mod.Properties.Dimensions.position += delta;
                    }
                    if (!EV.alt || delta != Vector2.zero)
                    {
                        deltaAccu = Vector2.zero;
                    }
                }
                var m = (Canvas.MouseOverModule) ? Canvas.MouseOverModule : Sel.SelectedModule;
                if (m)
                {
                    GUI.ScrollTowards(m.Properties.Dimensions, 0.8f);
                }
            }

            // Linking in progress?
            if (Canvas.IsLinkDrag)
            {
                var linkstyle = (Canvas.LinkDragFrom.OnRequestModule != null) ? CurvyStyles.RequestLineTexture : CurvyStyles.LineTexture;
                Handles.DrawBezier(Canvas.LinkDragFrom.Origin, EV.mousePosition, Canvas.LinkDragFrom.Origin + new Vector2(40, 0), EV.mousePosition + new Vector2(-40, 0), Color.white, linkstyle, 2);
            }

            GUI.EndScrollView(true);

            // Selection
            if (Canvas.IsSelectionRectDrag)
            {
                DrawSelectionRect();
            }

            // Statusbar
            DrawStatusbar();

            // IPE
            SyncIPE();

            mDoRepaint = mDoRepaint || Canvas.IsCanvasDrag || Canvas.IsLinkDrag || Canvas.IsSelectionRectDrag || EV.type == EventType.MouseMove || mShowDebug.isAnimating || Canvas.Scroll.isAnimating;


            // Disable Title edit mode?
            if (editTitleModule != null)
            {
                if ((EV.isKey && (EV.keyCode == KeyCode.Escape || EV.keyCode == KeyCode.Return)) ||
                    Sel.SelectedModule != editTitleModule
                    )
                {
                    editTitleModule = null;
                    //GUI.FocusControl("");
                    mDoRepaint = true;
                }
            }


            if (mDoRepaint)
            {
                Repaint();
            }
        }
Esempio n. 8
0
        void OnGUI()
        {
            GUILayout.BeginVertical();
            GUILayout.Label(new GUIContent(CurvyStyles.TexLogoBig));
            var r = new Rect(250, 70, 215, 40);

            DTGUI.PushContentColor(Color.black);

            var st = new GUIStyle(EditorStyles.label);

            st.alignment = TextAnchor.UpperRight;
            st.richText  = true;
            GUI.Label(r, "<b>Curvy " + CurvySpline.VERSION + "</b>\n(c) 2013-2015 Fluffy Underware", st);
            r.y += 40;
            GUI.Label(r, "<b>DevTools " + DT.VERSION + "</b>\n(c) 2015 Fluffy Underware", st);
            DTGUI.PopContentColor();
            GUILayout.Space(10);

            head("What's new?");

            if (buttonCol("Release notes", "View release notes and upgrade instructions!"))
            {
                OpenReleaseNotes();
            }
            foot();
            head("Learning Resources");
            if (buttonCol("View Examples", "Show examples folder"))
            {
                ShowExamples();
            }
            if (buttonCol("Tutorials", "Watch some tutorials"))
            {
                OpenTutorials();
            }
            if (buttonCol("Documentation", "Manuals! That magic source of wisdom!"))
            {
                OpenDocs();
            }
            if (buttonCol("API Reference", "Browse the API reference"))
            {
                OpenAPIDocs();
            }
            if (buttonCol("Support Forum", "Visit Support forum"))
            {
                OpenForum();
            }

            foot();
            head("Links");
            if (buttonCol("Website", "Visit Curvy's product website"))
            {
                OpenWeb();
            }

            if (buttonCol("Submit a bug report", "Found a bug? Please issue a bug report!"))
            {
                CurvyEditorUtility.SendBugReport();
            }
            foot();

            GUILayout.EndVertical();

            if (!heightHasBeenSet && Event.current.type == EventType.repaint)
            {
                setHeightToContent();
            }
        }