Skip to content

Instantly share code, notes, and snippets.

@gotmachine
Created May 19, 2024 20:50
Show Gist options
  • Save gotmachine/0cc3d424fc20508bd40a97a4867e35f7 to your computer and use it in GitHub Desktop.
Save gotmachine/0cc3d424fc20508bd40a97a4867e35f7 to your computer and use it in GitHub Desktop.
KSP Dynamic PAW Items
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