void Nav(int direction, bool addToSelection = false)
        {
            var newObj = direction * workDirection < 0 ? Track.PrevTrack.gameObject : Track.NextTrack.gameObject;

            if (!addToSelection)
            {
                Selection.activeGameObject = newObj;
            }
            else
            {
                TrackEditorUtil.AddToSelection(newObj);
            }
        }
        protected void RenderMultiSelectNavOptions()
        {
            var firstTrack = Selection.activeGameObject.GetComponent <Track>();

            if (!firstTrack)
            {
                return;                 //not a track.
            }
            GUILayout.BeginVertical("box");

            GUILayout.Label("Tools");

            GUILayout.BeginHorizontal(GUIStyle.none);
            {
                //Keep the spacing balanced when switching to multi-select
                GUI.enabled = false;
                GUILayout.Button("");

                GUI.enabled = firstTrack.PrevTrack;
                if (GUILayout.Button("< Select Prev"))
                {
                    if (Event.current.shift)
                    {
                        TrackEditorUtil.AddToSelection(firstTrack.PrevTrack.gameObject);
                    }
                    else
                    {
                        Selection.activeGameObject = firstTrack.PrevTrack.gameObject;
                    }
                }

                GUI.enabled = firstTrack.NextTrack;
                if (GUILayout.Button("Select Next >"))
                {
                    if (Event.current.shift)
                    {
                        TrackEditorUtil.AddToSelection(firstTrack.NextTrack.gameObject);
                    }
                    else
                    {
                        Selection.activeGameObject = firstTrack.NextTrack.gameObject;
                    }
                }

                GUI.enabled = false;
                GUILayout.Button("");

                GUI.enabled = true;
            }
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal(GUIStyle.none);
            {
                var selectionOrder = TrackEditorUtil.IsContiguousSelection(serializedObject.targetObjects);
                GUI.enabled = selectionOrder != null;
                if (GUILayout.Button("Merge"))
                {
                    EditorApplication.delayCall += () => MergeTracks(selectionOrder);
                }
                GUI.enabled = true;
                if (GUILayout.Button("Select Connected"))
                {
                    //todolater: only selects the loop of the main selection, not all selected loops
                    TrackEditorUtil.SelectConnected(firstTrack);
                }
            }
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
        }
        protected void RenderNavOptions()
        {
            Track track = target as Track;

            GUILayout.BeginVertical("box");

            GUILayout.Label("Navigation");

            //prev/next and create
            GUILayout.BeginHorizontal(GUIStyle.none);

            GUI.enabled = !(bool)track.PrevTrack;
            if (GUILayout.Button("+ Create Prev"))
            {
                Selection.activeGameObject = AddTrack(track, true).gameObject;
                Undo.RegisterCreatedObjectUndo(Selection.activeGameObject, "Create Track");
            }

            GUI.enabled = (bool)track.PrevTrack;
            if (GUILayout.Button("< Select Prev"))
            {
                if (Event.current.shift)
                {
                    TrackEditorUtil.AddToSelection(track.PrevTrack.gameObject);
                }
                else
                {
                    Selection.activeGameObject = track.PrevTrack.gameObject;
                }
            }
            GUI.enabled = (bool)track.NextTrack;
            if (GUILayout.Button("Select Next >"))
            {
                if (Event.current.shift)
                {
                    TrackEditorUtil.AddToSelection(track.NextTrack.gameObject);
                }
                else
                {
                    Selection.activeGameObject = track.NextTrack.gameObject;
                }
            }

            GUI.enabled = !(bool)track.NextTrack;
            if (GUILayout.Button("Create Next +"))
            {
                Selection.activeGameObject = AddTrack(track, false).gameObject;
                Undo.RegisterCreatedObjectUndo(Selection.activeGameObject, "Create Track");
            }

            GUI.enabled = true;
            GUILayout.EndHorizontal();


            //snap me/snap to me
            GUILayout.BeginHorizontal(GUIStyle.none);
            string what = track.PrevTrack ? "Prev" : "Nearest";

            if (GUILayout.Button("Snap " + what))
            {
                FindAndSnap(track, false, false);
            }
            if (GUILayout.Button("Snap to " + what))
            {
                FindAndSnap(track, true, false);
            }

            what = track.NextTrack ? "Next" : "Nearest";
            if (GUILayout.Button("Snap to " + what))
            {
                FindAndSnap(track, true, true);
            }
            if (GUILayout.Button("Snap " + what))
            {
                FindAndSnap(track, false, true);
            }
            GUILayout.EndHorizontal();


            GUILayout.EndVertical();
            GUILayout.BeginVertical("box");

            GUILayout.Label("Tools");

            GUILayout.BeginHorizontal(GUIStyle.none);
            {
                if (GUILayout.Button(TrackWindow.WindowName))
                {
                    TrackWindow.OpenIt();
                }

//			if (GUILayout.Button("Straight")) {
//				Undo.RecordObjects(GetObjectsInvolvedWithTrack(track), "Straighten");
//				var length = track.TrackEnd.position.magnitude;
//
//				var newEnd = new SimpleTransform(new Vector3(0, 0, length));
//				track.TrackEnd = newEnd;
//				if (track.NextTrack) track.NextTrack.TrackAbsoluteStart = track.TrackAbsoluteEnd;
//			}
//
//			if (GUILayout.Button("Short")) {
//				Undo.RecordObjects(GetObjectsInvolvedWithTrack(track), "Make short");
//				track.TrackEnd = new SimpleTransform(new Vector3(0, 0, 3));
//				if (track.NextTrack) track.NextTrack.TrackAbsoluteStart = track.TrackAbsoluteEnd;
//			}

//			if (GUILayout.Button("Ends Flat")) {
//				Undo.RecordObjects(GetObjectsInvolvedWithTrack(track), "Flatten");
//				var endPos = track.TrackAbsoluteEnd;
//				endPos.rotation = Quaternion.identity;
//				track.TrackAbsoluteEnd = endPos;
//				if (track.NextTrack) track.NextTrack.TrackAbsoluteStart = track.TrackAbsoluteEnd;
//			}
            }
            GUILayout.EndHorizontal();

            //Linking buttons
            GUILayout.BeginHorizontal(GUIStyle.none);

            if (GUILayout.Button("Split"))
            {
                SplitTrack();
            }

            if (GUILayout.Button("Unlink"))
            {
                Undo.RecordObjects(GetObjectsInvolvedWithTrack(track), "Unlink");

                if (track.PrevTrack)
                {
                    var adj = track.PrevTrack;
                    if (adj.PrevTrack == track)
                    {
                        adj.PrevTrack = null;
                    }
                    if (adj.NextTrack == track)
                    {
                        adj.NextTrack = null;
                    }
                }
                if (track.NextTrack)
                {
                    var adj = track.NextTrack;
                    if (adj.PrevTrack == track)
                    {
                        adj.PrevTrack = null;
                    }
                    if (adj.NextTrack == track)
                    {
                        adj.NextTrack = null;
                    }
                }

                track.PrevTrack = null;
                track.NextTrack = null;
            }

            if (GUILayout.Button("Select Connected"))
            {
                TrackEditorUtil.SelectConnected(track);
            }

            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
        }