/// <summary>
        /// Initializes the listener for a mod, passing in needed information
        /// </summary>
        /// <param name="button">Game button</param>
        /// <param name="gameDelegateMethod">Method from the game which will be the last delegate called if all previous button delegates continue to call the NextDelegate method</param>
        /// <param name="modName"></param>
        public static void InitializeListener(UnityEngine.UI.Button button, UnityAction gameDelegateMethod, string modName = null)
        {
            if (instance == null)
            {
                instance = new BtnManager();
                instance.InitEvent();
            }
            if (HighLogic.CurrentGame.Parameters.CustomParams <BM>().debugMode&& modName != null)
            {
                Log.Detail("InitializeListener: " + modName);
            }

            SceneButton sb = new SceneButton(button, gameDelegateMethod, activeSceneButtons.Count);

            // If already in this scene, just return, will happen if another mod has already initialized it
            if (activeSceneButtons.ContainsKey(sb.UniqueKey))
            {
                return;
            }

            activeSceneButtons.Add(sb.UniqueKey, sb);
            if (!allButtonsRef.ContainsKey(sb.UniqueKey))
            {
                allButtonsRef.Add(sb.UniqueKey, sb);
            }

            button.onClick.RemoveAllListeners();

            // Each listener a button gets a unique delegate method
            switch (activeSceneButtons.Count - 1)
            {
            case 0: launchDelegate = new UnityAction(DelegateCall_0); break;

            case 1: launchDelegate = new UnityAction(DelegateCall_1); break;

            case 2: launchDelegate = new UnityAction(DelegateCall_2); break;

            case 3: launchDelegate = new UnityAction(DelegateCall_3); break;

            case 4: launchDelegate = new UnityAction(DelegateCall_4); break;

            case 5: launchDelegate = new UnityAction(DelegateCall_5); break;

            case 6: launchDelegate = new UnityAction(DelegateCall_6); break;

            case 7: launchDelegate = new UnityAction(DelegateCall_7); break;

            case 8: launchDelegate = new UnityAction(DelegateCall_8); break;

            case 9: launchDelegate = new UnityAction(DelegateCall_9); break;

            case 10: launchDelegate = new UnityAction(DelegateCall_10); break;
            }

            button.onClick.AddListener(launchDelegate);
            delegateIdToSceneButton[activeSceneButtons.Count - 1] = sb.UniqueKey;
        }
        /// <summary>
        /// Common code to call a delegate
        /// </summary>
        /// <param name="scb"></param>
        static void CommonDelegateCall(SceneButton scb)
        {
            //ModDelegateDefinition bdd = scb.sortedListRef.Values[scb.index];

            var bdd = scb.listEnumerator.Current.Value;

            if (HighLogic.CurrentGame.Parameters.CustomParams <BM>().debugMode)
            {
                Log.Detail("CommonDelegateCall mod: " + bdd.modDisplayName);
            }

            bdd.delegateMethod();
        }
        /// <summary>
        /// Adds a new listener to a specified button
        /// </summary>
        /// <param name="button">Game button</param>
        /// <param name="delegateMethod">Method to call in the mod when this button is pressed</param>
        /// <param name="modName"></param>
        /// <param name="modDisplayName"></param>
        /// <param name="priority"></param>
        /// <returns>delegateID assigned to this listener</returns>
        public static int AddListener(UnityEngine.UI.Button button, UnityAction delegateMethod, string modName, string modDisplayName, int priority = 5)
        {
            if (HighLogic.CurrentGame.Parameters.CustomParams <BM>().debugMode)
            {
                Log.Detail("AddListener: " + modName);
            }

            string uniqueKey = SceneButton.GetUniqueKey(HighLogic.LoadedScene, button.gameObject.name);

            if (!activeSceneButtons.ContainsKey(uniqueKey))
            {
                Log.Error("Unknown button passed in to AddListener");
                return(-1);
            }

            priority = Math.Max(Math.Min(priority, 10), 1);

            var bd = new ModDelegateDefinition(button, activeSceneButtons[uniqueKey].sortedListRef.Count, priority, delegateMethod, modName, modDisplayName);

            if (allSavedDelegateRef.ContainsKey(bd.UniqueKey))
            {
                bd.userPriority = allSavedDelegateRef[bd.UniqueKey].userPriority;
                allSavedDelegateRef.Remove(bd.UniqueKey);
            }
            Log.Info("AddListener 2");

            if (allDelegateRef.ContainsKey(bd.UniqueKey))
            {
                Log.Info("AddListener 2.1");
                var oldBd = allDelegateRef[bd.UniqueKey];
                oldBd.UpdateButton(button);
                if (oldBd.SortKey != "")
                {
                    string sortKey = oldBd.SortKey;
                    activeSceneButtons[uniqueKey].sortedListRef.Add(oldBd.SortKey, oldBd);
                }
            }
            else
            {
                Log.Info("AddListener 2.2");
                allDelegateRef.Add(bd.UniqueKey, bd);
                string sortKey = bd.SortKey;
                activeSceneButtons[uniqueKey].sortedListRef.Add(bd.SortKey, bd);
            }

            return(activeSceneButtons[uniqueKey].id);
        }