v1 Documentation
If possible, it is recommended to now use the PrefabsV2 API.
Quickstart
You mark your prefab extensions based on one of the IPrefabPatch
descendants and marking it with PrefabExtension
attribute, therefore enabling you to make additions to the specified Movie's XML data.
Example of inserting XML
at a specific position:
[PrefabExtension("Insert", "descendant::OptionsScreenWidget[@Id='Options']/Children/Standard.TopPanel/Children/ListPanel/Children")]
internal class TestPrefabExtensionInsertPatch : PrefabExtensionInsertPatch
{
public override string Id => "Insert";
public override int Position => 3;
private XmlDocument XmlDocument { get; } = new XmlDocument();
public TestPrefabExtensionInsertPatch()
{
XmlDocument.LoadXml("<OptionsTabToggle Id=\"Insert\" />");
}
public override XmlDocument GetPrefabExtension() => XmlDocument;
}
Example of replacing XML
:
[PrefabExtension("Replace", "descendant::OptionsScreenWidget[@Id='Options']/Children/Standard.TopPanel/Children/ListPanel/Children/OptionsTabToggle[@Id='Replace']")]
internal class TestPrefabExtensionReplacePatch : PrefabExtensionReplacePatch
{
public override string Id => "Replace";
private XmlDocument XmlDocument { get; } = new XmlDocument();
public TestPrefabExtensionReplacePatch()
{
XmlDocument.LoadXml("<OptionsTabToggle Id=\"Replaced\" />");
}
public override XmlDocument GetPrefabExtension() => XmlDocument;
}
Example of inserting XML
after a specific element:
[PrefabExtension("InsertAsSiblingAppend", "descendant::OptionsScreenWidget[@Id='Options']/Children/Standard.TopPanel/Children/ListPanel/Children/OptionsTabToggle[@Id='InsertAsSibling']")]
internal class TestPrefabExtensionInsertAsSiblingAppendPatch : PrefabExtensionInsertAsSiblingPatch
{
public override string Id => "InsertAsSiblingAppend";
public override InsertType Type => InsertType.Append;
private XmlDocument XmlDocument { get; } = new XmlDocument();
public TestPrefabExtensionInsertAsSiblingAppendPatch()
{
XmlDocument.LoadXml("<OptionsTabToggle Id=\"InsertAsSiblingAppend\" />");
}
public override XmlDocument GetPrefabExtension() => XmlDocument;
}
Example of adding or replacing XML
attribute:
[PrefabExtension("SetAttribute", "descendant::OptionsScreenWidget[@Id='Options']/Children/Standard.TopPanel/Children/ListPanel/Children/OptionsTabToggle[@Id='SetAttribute']")]
internal class TestPrefabExtensionSetAttributePatch : PrefabExtensionSetAttributePatch
{
public override string Id => "SetAttribute";
public override string Attribute => "CustomAttribute";
public override string Value => "Value";
}
Example of inserting XML
before a specific element:
[PrefabExtension("InsertAsSiblingPrepend", "descendant::OptionsScreenWidget[@Id='Options']/Children/Standard.TopPanel/Children/ListPanel/Children/OptionsTabToggle[@Id='InsertAsSibling']")]
internal class TestPrefabExtensionInsertAsSiblingPrependPatch : PrefabExtensionInsertAsSiblingPatch
{
public override string Id => "InsertAsSiblingPrepend";
public override InsertType Type => InsertType.Prepend;
private XmlDocument XmlDocument { get; } = new XmlDocument();
public TestPrefabExtensionInsertAsSiblingPrependPatch()
{
XmlDocument.LoadXml("<OptionsTabToggle Id=\"InsertAsSiblingPrepend\" />");
}
public override XmlDocument GetPrefabExtension() => XmlDocument;
}
In order to add data to the prefab, you need to add properties to the target datasource class, this is done by making a mixin class, inheriting from BaseViewModelMixin<T>
and marking it with ViewModelMixin
attribute. This class will be mixed in to the target view model T
, making fields and methods accessible in the prefab:
[ViewModelMixin]
public class OptionsVMMixin : BaseViewModelMixin<OptionsVM>
{
private readonly ModOptionsVM _modOptions;
[DataSourceProperty]
public ModOptionsVM ModOptions
{
get
{
return _modOptions;
}
}
public OptionsVMMixin(OptionsVM vm) : base(vm)
{
_modOptions = new ModOptionsVM();
}
[DataSourceMethod]
public void ExecuteCloseOptions()
{
ModOptions.ExecuteCancelInternal(false);
ViewModel?.ExecuteCloseOptions();
}
}
The last thing is to call UIExtender.Register
and UIExtender.Enable
to apply your extensions:
public class CustomSubModule : MBSubModuleBase
{
protected override void OnSubModuleLoad()
{
base.OnSubModuleLoad();
_extender = new UIExtender("ModuleName");
_extender.Register(typeof(CustomSubModule).Assembly);
_extender.Enable();
}
}
To use the OnRefresh
overload you will need to specify for UIExtenderEx the underlying method that acts as the conceptual 'Refresh' method in the ViewModel
.
For example, MapInfoVM
has a method Refresh
.
If such method exists, specify it in the ViewModelMixin
like this:
[ViewModelMixin("Refresh")] // or [ViewModelMixin(nameof(MapInfoVM.Refresh))] // if the method is public
public class MapInfoMixin : BaseViewModelMixin<MapInfoVM>
Examples
This page was last modified at 01/30/2021 12:02:00 +03:00 (UTC).
Commit Message
Author: Vitaly Mikhailov
Commit: 863e84bf5292bccb681ce1eb027f70c93a9187b0
Update