Skip to content

View Source Generation

HaikaraではRoslyn Source Generatorを使ってView側のコードを生成します。

Requirements

Source Generatorは次の条件に当てはまるクラスと、対応する.uxmlを紐づけ、ソースを生成します。

  • クラスの所属するAssembly Definitionが明確に分けられている
  • HaikaraUI Attribute を持つ
  • IHaikaraView を実装する
  • .uxmlファイルと同階層、同ファイル名を持つ

Viewのクラスが含まれる.asmdefのAssembly Definition ReferencesHaikara.Runtime.asmdefを追加する必要があります。

例えば、次のようなファイルの配置を行う必要があります。
ディレクトリはどのような構造でも問題ありません。

Assets
└ Scripts
    └ Sample
        ├ Sample.asmdef
        ├ SampleViewModel.cs
        └ Views
            ├ Layout.uxml
            └ Layout.cs

上記のようなファイル構造の場合、次のようなクラスを実装します。

csharp
    [HaikaraUI]
    public partial class Layout : HaikaraViewBaseWithViewModel<SampleViewModel>
    {
    
    }

HaikaraViewBaseWithViewModelIHaikaraViewを実装した抽象クラスです。
コードは、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 InstallerUI Catalogなど、 Viewクラスから対応するUIアセットを決定する際に使われます。

ElementNames

対応する.uxmlに存在するVisual Elementに設定されたnameの一覧を生成します。
Bindable PropertyelementNameInfoで指定し、 バインディングする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のファイル名と同値です