Created
May 19, 2024 20:50
-
-
Save gotmachine/0cc3d424fc20508bd40a97a4867e35f7 to your computer and use it in GitHub Desktop.
KSP Dynamic PAW Items
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class DynamicPAWModule : PartModule | |
{ | |
private DynamicPAWToggle mainToggle; | |
private DynamicPAWToggle auxToggle; | |
private BasePAWGroup group; | |
public override void OnStart(StartState state) | |
{ | |
group = new BasePAWGroup(nameof(DynamicPAWModule), "My Dynamic Module", false); | |
mainToggle = new DynamicPAWToggle(this, UI_Scene.All, group); | |
mainToggle.pawField.guiActive = true; | |
mainToggle.pawField.guiActiveEditor = true; | |
mainToggle.pawField.guiName = "MyToggle"; | |
mainToggle.uiControl.enabledText = "on"; | |
mainToggle.uiControl.disabledText = "off"; | |
mainToggle.uiControl.onFieldChanged += OnToggleMain; | |
mainToggle.uiControl.affectSymCounterparts = UI_Scene.None; | |
} | |
private void OnToggleMain(BaseField field, object state) | |
{ | |
if (mainToggle.toggleState) | |
{ | |
auxToggle = new DynamicPAWToggle(this, UI_Scene.All, group); | |
auxToggle.pawField.guiActive = true; | |
auxToggle.pawField.guiActiveEditor = true; | |
auxToggle.pawField.guiName = "MyDynamicToggle"; | |
auxToggle.uiControl.enabledText = "on"; | |
auxToggle.uiControl.disabledText = "off"; | |
} | |
else | |
{ | |
auxToggle.Destroy(); | |
auxToggle = null ; | |
} | |
} | |
} | |
public class DynamicPAWToggle | |
{ | |
private static readonly FieldInfo fieldInfo = typeof(DynamicPAWToggle).GetField(nameof(toggleState)); | |
private static readonly UI_Toggle dummyUIControl = new UI_Toggle(); | |
public bool toggleState; | |
private PartModule module; | |
private BasePAWGroup pawGroup; | |
public BaseField pawField; | |
public UI_Toggle uiControl; | |
public DynamicPAWToggle(PartModule module, UI_Scene uiScene, BasePAWGroup pawGroup = null) | |
{ | |
this.pawGroup = pawGroup; | |
this.module = module; | |
uiControl = new UI_Toggle(); | |
uiControl.scene = uiScene; | |
// Propagating to symmetry counterparts doesn't work due to a silly issue in the stock code. | |
// I have an unreleased KSPCF patch fixing it (and allowing other stuff like KSPField-like persistance) | |
uiControl.affectSymCounterparts = UI_Scene.None; | |
pawField = new BaseField(dummyUIControl, fieldInfo, this); | |
if (HighLogic.LoadedSceneIsEditor && (uiScene == UI_Scene.All || uiScene == UI_Scene.Editor)) | |
pawField.uiControlEditor = uiControl; | |
else if (HighLogic.LoadedSceneIsFlight && (uiScene == UI_Scene.All || uiScene == UI_Scene.Flight)) | |
pawField.uiControlFlight = uiControl; | |
pawField.group = pawGroup; | |
module.Fields.Add(pawField); | |
if (module.part.PartActionWindow != null) | |
module.part.PartActionWindow.displayDirty = true; | |
} | |
public void Destroy(bool destroyGroup = false) | |
{ | |
// _fields is private, either use a publicizer or get it with reflection | |
module.Fields._fields.Remove(pawField); | |
if (module.part.PartActionWindow != null) | |
{ | |
module.part.PartActionWindow.RemoveFieldControl(pawField, module.part, module); | |
if (destroyGroup && pawGroup != null) | |
module.part.PartActionWindow.RemoveGroup(pawGroup.name); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment