// Dynamically generates a Menu where all Courses are listed
        // Have to call LoadAddCourseInfos first.
        public void GenerateCoursesMenu(GameObject coursesMenuButtonCollection)
        {
            foreach (CourseInfoHolder info in courses.Courses)
            {
                // Create Button for a specific course
                GameObject newButton = Instantiate(buttonPrefab);
                newButton.transform.localScale += new Vector3(2, 2, 0);
                newButton.name = info.CourseTitle;
                var buttonConfigHelper = newButton.GetComponent <ButtonConfigHelper>();

                buttonConfigHelper.MainLabelText = info.CourseTitle;

                // On Focus give user more information on the course
                var onFocusReciever = newButton.GetComponent <Interactable>().GetReceiver <InteractableOnFocusReceiver>();
                if (onFocusReciever == null)
                {
                    onFocusReciever = newButton.GetComponent <Interactable>().AddReceiver <InteractableOnFocusReceiver>();
                }
                onFocusReciever.OnFocusOn.AddListener(() => ActivateDetails());
                onFocusReciever.OnFocusOn.AddListener(() => SetCourseDetails(info.CourseID));
                onFocusReciever.OnFocusOff.AddListener(() => DeactivateDetails());

                // On Click open the menu of the particular course
                var onClickReciever = newButton.GetComponent <Interactable>().GetReceiver <InteractableOnPressReceiver>();
                if (onClickReciever == null)
                {
                    onClickReciever = newButton.GetComponent <Interactable>().AddReceiver <InteractableOnPressReceiver>();
                }
                onClickReciever.OnPress.AddListener(() => MenuObject.GetComponent <MenuHelper>().SelectedMenuOption(info.CourseID));

                // Add Button to the Collection and display it
                newButton.SetActive(true);
                newButton.transform.SetParent(coursesMenuButtonCollection.transform);
            }

            Microsoft.MixedReality.Toolkit.Utilities.GridObjectCollection objCollectionComponent =
                coursesMenuButtonCollection.GetComponent <Microsoft.MixedReality.Toolkit.Utilities.GridObjectCollection>();
            // Update, so Button are displayed on the grid instead of on top of each other
            objCollectionComponent.UpdateCollection();
        }
        // Dynamically generates a Menu where all steps and coreographies of a course are listed or all coreographies of all courses are listed.
        private void GenerateCourseMenu()
        {
            for (int i = 0; i < steps.Count + coreographies.Count; i++)
            {
                // Create button for step/coreography
                GameObject newButton = Instantiate(buttonPrefab);

                newButton.transform.localScale += new Vector3(2, 2, 0);

                newButton.name = "Button" + i;
                var    buttonConfigHelper = newButton.GetComponent <ButtonConfigHelper>();
                int    pos;
                string movementLocation;
                if (steps.ContainsKey(i))
                {
                    buttonConfigHelper.MainLabelText = steps[i].Name;
                    pos = steps[i].Position;
                    movementLocation = steps[i].Blocks[0].FileLocation;
                }
                else if (coreographies.ContainsKey(i))
                {
                    buttonConfigHelper.MainLabelText = "<color=\"yellow\">" + coreographies[i].Name + "</color>";
                    pos = coreographies[i].Position;
                    movementLocation = coreographies[i].FileLocation;
                }
                else
                {
                    Debug.Log("Step/coreography not found.");
                    return;
                }
                // x is used in callback methods where the ref of i would be already changed and result in error
                int x = i;

                // On Focus give user more information on the step/coreo
                // On press starts the coreo or step
                var onPressReciever = newButton.GetComponent <Interactable>().GetReceiver <InteractableOnPressReceiver>();
                var onFocusReciever = newButton.GetComponent <Interactable>().GetReceiver <InteractableOnFocusReceiver>();
                if (onFocusReciever == null)
                {
                    onFocusReciever = newButton.GetComponent <Interactable>().AddReceiver <InteractableOnFocusReceiver>();
                }
                if (onPressReciever == null)
                {
                    onPressReciever = newButton.GetComponent <Interactable>().AddReceiver <InteractableOnPressReceiver>();
                }
                onFocusReciever.OnFocusOn.AddListener(() => ActivateDetails());
                if (isTraining)
                {
                    onFocusReciever.OnFocusOn.AddListener(() => CourseMenuHelperObject.GetComponent <CourseMenuHelper>().SetMoveDetails(pos));
                }
                else
                {
                    onFocusReciever.OnFocusOn.AddListener(() => CourseMenuHelperObject.GetComponent <CourseMenuHelper>().SetMoveDetails(x));
                }
                onPressReciever.OnPress.AddListener(() => MainObject.GetComponent <PoseteacherMain>().SetTeacherFile(movementLocation));
                onFocusReciever.OnFocusOff.AddListener(() => DeactivateDetails());

                if (steps.ContainsKey(i))
                {
                    onPressReciever.OnPress.AddListener(() => CourseMenuHelperObject.GetComponent <CourseMenuHelper>().StartStep(pos));
                }
                else if (coreographies.ContainsKey(i))
                {
                    if (isTraining)
                    {
                        onPressReciever.OnPress.AddListener(() => CourseMenuHelperObject.GetComponent <CourseMenuHelper>().StartCoreography(pos));
                    }
                    else
                    {
                        onPressReciever.OnPress.AddListener(() => CourseMenuHelperObject.GetComponent <CourseMenuHelper>().StartCoreography(x));
                    }
                }
                onPressReciever.OnPress.AddListener(() => DeactivateDetails(true));

                // Add Button to the Collection and display it
                newButton.SetActive(true);
                newButton.transform.SetParent(CourseButtonCollection.transform);
            }

            Microsoft.MixedReality.Toolkit.Utilities.GridObjectCollection objCollectionComponent =
                CourseButtonCollection.GetComponent <Microsoft.MixedReality.Toolkit.Utilities.GridObjectCollection>();
            // Update, so Button are displayed on the grid instead of on top of each other
            objCollectionComponent.UpdateCollection();
        }