diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index cdb26612..8eacbb41 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -43434,7 +43434,7 @@ GuiResourceFolder } } - void GuiResourceFolder::InitializeResourceFolder(GuiResourcePrecompileContext& context) + void GuiResourceFolder::InitializeResourceFolder(GuiResourceInitializeContext& context) { FOREACH(Ptr, item, items.Values()) { @@ -43744,7 +43744,7 @@ GuiResource } } - void GuiResource::Initialize() + void GuiResource::Initialize(GuiResourceUsage usage) { auto precompiledFolder = GetFolder(L"Precompiled"); if (!precompiledFolder) @@ -43753,10 +43753,11 @@ GuiResource return; } - GuiResourcePrecompileContext context; + GuiResourceInitializeContext context; context.rootResource = this; context.resolver = new GuiResourcePathResolver(this, workingDirectory); context.targetFolder = precompiledFolder; + context.usage = usage; vint maxPass = GetResourceResolverManager()->GetMaxInitializePassIndex(); for (vint i = 0; i <= maxPass; i++) diff --git a/Import/GacUI.h b/Import/GacUI.h index f661e8fb..b1e378f8 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -3363,6 +3363,7 @@ Resource Structure class DocumentModel; class GuiResourcePathResolver; struct GuiResourcePrecompileContext; + struct GuiResourceInitializeContext; /// Resource item. class GuiResourceItem : public GuiResourceNodeBase, public Description @@ -3430,7 +3431,7 @@ Resource Structure void LoadResourceFolderFromBinary(DelayLoadingList& delayLoadings, stream::internal::Reader& reader, collections::List& typeNames, collections::List& errors); void SaveResourceFolderToBinary(stream::internal::Writer& writer, collections::List& typeNames); void PrecompileResourceFolder(GuiResourcePrecompileContext& context, collections::List& errors); - void InitializeResourceFolder(GuiResourcePrecompileContext& context); + void InitializeResourceFolder(GuiResourceInitializeContext& context); public: /// Create a resource folder. GuiResourceFolder(); @@ -3493,6 +3494,12 @@ Resource Structure /*********************************************************************** Resource ***********************************************************************/ + + enum class GuiResourceUsage + { + DevelopmentTool, + Application, + }; /// Resource. A resource is a root resource folder that does not have a name. class GuiResource : public GuiResourceFolder, public Description @@ -3542,7 +3549,7 @@ Resource void Precompile(collections::List& errors); /// Initialize a precompiled resource. - void Initialize(); + void Initialize(GuiResourceUsage usage); /// Get a contained document model using a path like "Packages\Application\Name". If the path does not exists or the type does not match, an exception will be thrown. /// The containd resource object. @@ -3689,6 +3696,12 @@ Resource Type Resolver virtual void Precompile(Ptr resource, GuiResourcePrecompileContext& context, collections::List& errors) = 0; }; + /// Provide a context for resource initializing + struct GuiResourceInitializeContext : GuiResourcePrecompileContext + { + GuiResourceUsage usage; + }; + /// /// Represents a precompiler for resources of a specified type. /// Current resources that needs precompiling: @@ -3706,7 +3719,7 @@ Resource Type Resolver /// The resource to initializer. /// The context for initializing. /// All collected errors during loading a resource. - virtual void Initialize(Ptr resource, GuiResourcePrecompileContext& context) = 0; + virtual void Initialize(Ptr resource, GuiResourceInitializeContext& context) = 0; }; /// Represents a symbol type for loading a resource without a preload type. diff --git a/Import/GacUIReflection.cpp b/Import/GacUIReflection.cpp index a4220c45..d5f3500c 100644 --- a/Import/GacUIReflection.cpp +++ b/Import/GacUIReflection.cpp @@ -977,12 +977,12 @@ GuiInstanceLoaderManager return GlobalStringKey::Empty; } - bool SetResource(const WString& name, Ptr resource)override + bool SetResource(const WString& name, Ptr resource, GuiResourceUsage usage)override { vint index = resources.Keys().IndexOf(name); if (index != -1) return false; - resource->Initialize(); + resource->Initialize(usage); resources.Add(name, resource); GetClassesInResource(resource, resource); return true; @@ -1588,7 +1588,7 @@ Compiled Workflow Type Resolver (Script) return 2; } - void Initialize(Ptr resource, GuiResourcePrecompileContext& context)override + void Initialize(Ptr resource, GuiResourceInitializeContext& context)override { if (auto compiled = resource->GetContent().Cast()) { @@ -1597,7 +1597,10 @@ Compiled Workflow Type Resolver (Script) case 0: if (compiled->type == GuiInstanceCompiledWorkflow::ViewModel) { - compiled->Initialize(false); + if (context.usage == GuiResourceUsage::DevelopmentTool) + { + compiled->Initialize(false); + } } break; case 1: diff --git a/Import/GacUIReflection.h b/Import/GacUIReflection.h index eed469c4..3eb75aa4 100644 --- a/Import/GacUIReflection.h +++ b/Import/GacUIReflection.h @@ -589,7 +589,7 @@ Instance Loader Manager virtual description::ITypeDescriptor* GetTypeDescriptorForType(GlobalStringKey typeName) = 0; virtual void GetVirtualTypes(collections::List& typeNames) = 0; virtual GlobalStringKey GetParentTypeForVirtualType(GlobalStringKey virtualType) = 0; - virtual bool SetResource(const WString& name, Ptr resource) = 0; + virtual bool SetResource(const WString& name, Ptr resource, GuiResourceUsage usage = GuiResourceUsage::Application) = 0; virtual Ptr GetResource(const WString& name) = 0; virtual Ptr RunInstanceConstructor(const WString& classFullName, description::Value instance) = 0; }; diff --git a/Tools/GacGen.exe b/Tools/GacGen.exe index 75a3c39e..6b7f87d0 100644 Binary files a/Tools/GacGen.exe and b/Tools/GacGen.exe differ diff --git a/Tools/ParserGen.exe b/Tools/ParserGen.exe index 3c442ab0..2bccc953 100644 Binary files a/Tools/ParserGen.exe and b/Tools/ParserGen.exe differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin b/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin index c9b56634..6ad268b8 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin and b/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin differ