/// <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); }