View Source Generation
HaikaraではRoslyn Source Generator
を使ってView側のコードを生成します。
Requirements
Source Generatorは次の条件に当てはまるクラスと、対応する.uxmlを紐づけ、ソースを生成します。
- クラスの所属する
Assembly Definition
が明確に分けられている HaikaraUI Attribute
を持つIHaikaraView
を実装する- .uxmlファイルと同階層、同ファイル名を持つ
Viewのクラスが含まれる.asmdefのAssembly Definition References
にHaikara.Runtime.asmdef
を追加する必要があります。
例えば、次のようなファイルの配置を行う必要があります。
ディレクトリはどのような構造でも問題ありません。
Assets
└ Scripts
└ Sample
├ Sample.asmdef
├ SampleViewModel.cs
└ Views
├ Layout.uxml
└ Layout.cs
上記のようなファイル構造の場合、次のようなクラスを実装します。
csharp
[HaikaraUI]
public partial class Layout : HaikaraViewBaseWithViewModel<SampleViewModel>
{
}
HaikaraViewBaseWithViewModel
はIHaikaraView
を実装した抽象クラスです。
コードは、Viewクラスのpartial
クラスとして生成されます。
上記の例では、次のようなコードとなります。
#nullable enable
public partial class Layout
{
public const string UxmlGuid = "d25cc33d0344b9a47b1860fd32f7c221";
public override string GetGuid()
{
return UxmlGuid;
}
public override Haikara.Runtime.AssetReferenceMode AssetReferenceMode => Haikara.Runtime.AssetReferenceMode.Resource;
protected override void InitializeComponentInternal()
{
ElementProperties.SortElementPropertiesByPriority();
}
private struct ElementNames
{
public const string FirstSampleLabel = "first-sample__label";
}
private struct TemplateInfoList
{
}
}
#nullable restore
UxmlGuid
対応する.uxmlのGuidです。View Installer
やUI Catalog
など、 Viewクラスから対応するUIアセットを決定する際に使われます。
ElementNames
対応する.uxmlに存在するVisual Element
に設定されたnameの一覧を生成します。
Bindable PropertyのelementNameInfo
で指定し、 バインディングするVisual Element
の決定を行うために使用することができます。
TemplateInfoList
Template Property
.uxml上に配置されたTemplate
の情報を次のように生成します。
csharp
private struct TemplateInfoList
{
public static readonly TemplateInfo SameVmTemplate = new TemplateInfo(
elementName: "same-vm-template",
viewGuid: "e6b1e3896e54450dab0f5c3865de2a1b",
templateId: "CounterSameViewModelTemplate"
);
public static readonly TemplateInfo ChildVmTemplate = new TemplateInfo(
elementName: "child-vm-template",
viewGuid: "5e392d8c8077f6c4182c12d106691fb2",
templateId: "CounterSub"
);
}
TemplateInfo
elementName
.uxml上に配置されたTemplateに設定されたnameです。 こちらもバインディング対象の選択に使われます。viewGuid
Templateの実体となるUIアセットのGuidです。templateId
.uxml上のTemplateのIdです。
Templateとなる.uxmlのファイル名と同値です