diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index 129cab0f..21a75a3e 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -11032,10 +11032,10 @@ namespace vl currentTheme = nullptr; } - bool RegisterTheme(const WString& name, Ptr theme) + bool RegisterTheme(Ptr theme) { CHECK_ERROR(currentTheme != nullptr, L"vl::presentation::theme::RegisterTheme(const WString&, Ptr)#Theme has already been initialized"); - return currentTheme->RegisterTheme(name, theme); + return currentTheme->RegisterTheme(theme->Name, theme); } Ptr UnregisterTheme(const WString& name) @@ -17122,6 +17122,19 @@ GuiComboBoxListControl SelectedIndexChanged.Execute(GetNotifyEventArguments()); } + void GuiComboBoxListControl::OnAttached(GuiListControl::IItemProvider* provider) + { + } + + void GuiComboBoxListControl::OnItemModified(vint start, vint count, vint newCount) + { + vint index = GetSelectedIndex(); + if (start <= index && index < start + count) + { + DisplaySelectedContent(index); + } + } + GuiComboBoxListControl::GuiComboBoxListControl(theme::ThemeName themeName, GuiSelectableListControl* _containedListControl) :GuiComboBoxBase(themeName) , containedListControl(_containedListControl) @@ -17131,6 +17144,7 @@ GuiComboBoxListControl ContextChanged.AttachMethod(this, &GuiComboBoxListControl::OnContextChanged); VisuallyEnabledChanged.AttachMethod(this, &GuiComboBoxListControl::OnVisuallyEnabledChanged); + containedListControl->GetItemProvider()->AttachCallback(this); containedListControl->SetMultiSelect(false); containedListControl->AdoptedSizeInvalidated.AttachMethod(this, &GuiComboBoxListControl::OnListControlAdoptedSizeInvalidated); containedListControl->SelectionChanged.AttachMethod(this, &GuiComboBoxListControl::OnListControlSelectionChanged); @@ -17147,6 +17161,7 @@ GuiComboBoxListControl GuiComboBoxListControl::~GuiComboBoxListControl() { + containedListControl->GetItemProvider()->DetachCallback(this); containedListControl->GetBoundsComposition()->BoundsChanged.Detach(boundsChangedHandler); boundsChangedHandler = nullptr; } @@ -33921,10 +33936,83 @@ GuiResourceFolder } } +/*********************************************************************** +GuiResourceMetadata +***********************************************************************/ + + void GuiResourceMetadata::LoadFromXml(Ptr xml, GuiResourceLocation location, GuiResourceError::List& errors) + { + auto attrName = XmlGetAttribute(xml->rootElement, L"Name"); + auto attrVersion = XmlGetAttribute(xml->rootElement, L"Version"); + if (!attrName || !attrVersion) + { + errors.Add(GuiResourceError(location, L"[INTERNAL-ERROR] Resource metadata lacks of Name or Version attribute.")); + return; + } + name = attrName->value.value; + version = attrVersion->value.value; + dependencies.Clear(); + + if (auto xmlDeps = XmlGetElement(xml->rootElement, L"Dependencies")) + { + FOREACH(Ptr, xmlDep, XmlGetElements(xmlDeps, L"Resource")) + { + auto attrDep = XmlGetAttribute(xmlDep, L"Name"); + if (!attrDep) + { + errors.Add(GuiResourceError(location, L"[INTERNAL-ERROR] Resource dependency lacks of Name attribute.")); + } + dependencies.Add(attrDep->value.value); + } + } + } + + Ptr GuiResourceMetadata::SaveToXml() + { + auto root = MakePtr(); + root->name.value = L"ResourceMetadata"; + { + auto attr = MakePtr(); + attr->name.value = L"Name"; + attr->value.value = name; + root->attributes.Add(attr); + } + { + auto attr = MakePtr(); + attr->name.value = L"Version"; + attr->value.value = version; + root->attributes.Add(attr); + } + { + auto xmlDeps = MakePtr(); + xmlDeps->name.value = L"Dependencies"; + root->subNodes.Add(xmlDeps); + + FOREACH(WString, dep, dependencies) + { + auto xmlDep = MakePtr(); + xmlDep->name.value = L"Resource"; + xmlDeps->subNodes.Add(xmlDep); + { + auto attr = MakePtr(); + attr->name.value = L"Name"; + attr->value.value = dep; + xmlDep->attributes.Add(attr); + } + } + } + + auto doc = MakePtr(); + doc->rootElement = root; + return doc; + } + /*********************************************************************** GuiResource ***********************************************************************/ + const wchar_t* GuiResource::CurrentVersionString = L"1.0"; + void GuiResource::ProcessDelayLoading(Ptr resource, DelayLoadingList& delayLoadings, GuiResourceError::List& errors) { FOREACH(DelayLoading, delay, delayLoadings) @@ -33961,12 +34049,19 @@ GuiResource GuiResource::GuiResource() { + metadata = MakePtr(); + metadata->version = CurrentVersionString; } GuiResource::~GuiResource() { } + Ptr GuiResource::GetMetadata() + { + return metadata; + } + WString GuiResource::GetWorkingDirectory() { return workingDirectory; @@ -34021,6 +34116,23 @@ GuiResource { stream::internal::ContextFreeReader reader(stream); auto resource = MakePtr(); + { + WString metadata; + reader << metadata; + + auto parser = GetParserManager()->GetParser(L"XML"); + auto xmlMetadata = parser->Parse({ resource }, metadata, errors); + if (!xmlMetadata) return nullptr; + + resource->metadata->LoadFromXml(xmlMetadata, { resource }, errors); + if (errors.Count() != 0) return nullptr; + + if (resource->metadata->version != CurrentVersionString) + { + errors.Add(GuiResourceError({ resource }, L"Only resource binary of version \"" + WString(CurrentVersionString) + L"\" is accepted. Please recompile the resource before loading it.")); + return nullptr; + } + } List typeNames; reader << typeNames; @@ -34043,7 +34155,19 @@ GuiResource void GuiResource::SavePrecompiledBinary(stream::IStream& stream) { stream::internal::ContextFreeWriter writer(stream); - + { + auto xmlMetadata = metadata->SaveToXml(); + stream::MemoryStream memoryStream; + { + stream::StreamWriter writer(memoryStream); + XmlPrint(xmlMetadata, writer); + } + memoryStream.SeekFromBegin(0); + { + stream::StreamReader reader(memoryStream); + writer << reader.ReadToEnd(); + } + } List typeNames; CollectTypeNames(typeNames); writer << typeNames; @@ -34936,6 +35060,7 @@ namespace vl { using namespace collections; using namespace stream; + using namespace parsing::xml; using namespace reflection::description; using namespace controls; @@ -35004,9 +35129,30 @@ IGuiInstanceResourceManager protected: typedef Dictionary> ResourceMap; + List> anonymousResources; ResourceMap resources; ResourceMap instanceResources; + class PendingResource : public Object + { + public: + Ptr metadata; + GuiResourceUsage usage; + MemoryStream memoryStream; + SortedList dependencies; + + Ptr LoadResource() + { + memoryStream.SeekFromBegin(0); + List errors; + auto resource = GuiResource::LoadPrecompiledBinary(memoryStream, errors); + CHECK_ERROR(errors.Count() == 0, L"PendingResource::LoadResource()#Failed to load the resource."); + return resource; + } + }; + Group> depToPendings; + SortedList> pendingResources; + public: GUI_PLUGIN_NAME(GacUI_Res_Resource) @@ -35026,18 +35172,50 @@ IGuiInstanceResourceManager resourceManager = nullptr; } - bool SetResource(const WString& name, Ptr resource, GuiResourceUsage usage)override + bool SetResource(Ptr resource, GuiResourceUsage usage)override { - vint index = resources.Keys().IndexOf(name); - if (index != -1) return false; - - resource->Initialize(usage); - resources.Add(name, resource); - - auto record = resource->GetValueByPath(L"Precompiled/ClassNameRecord").Cast(); - FOREACH(WString, className, record->classNames) + auto metadata = resource->GetMetadata(); + if (metadata->name == L"") { - instanceResources.Add(className, resource); + if (anonymousResources.Contains(resource.Obj())) return false; + resource->Initialize(usage); + anonymousResources.Add(resource); + } + else + { + CHECK_ERROR(!resources.Keys().Contains(metadata->name), L"GuiResourceManager::SetResource(Ptr, GuiResourceUsage)#A resource with the same name has been loaded."); + + resource->Initialize(usage); + resources.Add(metadata->name, resource); + } + + if (auto record = resource->GetValueByPath(L"Precompiled/ClassNameRecord").Cast()) + { + FOREACH(WString, className, record->classNames) + { + instanceResources.Add(className, resource); + } + } + + if (metadata->name != L"") + { + vint index = depToPendings.Keys().IndexOf(metadata->name); + if (index != -1) + { + List> prs; + CopyFrom(prs, depToPendings.GetByIndex(index)); + depToPendings.Remove(metadata->name); + + FOREACH(Ptr, pr, prs) + { + pr->dependencies.Remove(metadata->name); + if (pr->dependencies.Count() == 0) + { + pendingResources.Remove(pr.Obj()); + SetResource(pr->LoadResource(), pr->usage); + } + } + } } return true; } @@ -35054,6 +35232,70 @@ IGuiInstanceResourceManager if (index == -1) return nullptr; return instanceResources.Values()[index]; } + + void UnloadResource(const WString& name) + { + vint index = resources.Keys().IndexOf(name); + if (index != -1) + { + auto resource = resources.Values()[index]; + resources.Remove(name); + + if (auto record = resource->GetValueByPath(L"Precompiled/ClassNameRecord").Cast()) + { + FOREACH(WString, className, record->classNames) + { + instanceResources.Remove(className); + } + } + } + } + + void LoadResourceOrPending(stream::IStream& stream, GuiResourceUsage usage = GuiResourceUsage::DataOnly)override + { + auto pr = MakePtr(); + pr->usage = usage; + CopyStream(stream, pr->memoryStream); + + pr->metadata = MakePtr(); + { + pr->memoryStream.SeekFromBegin(0); + stream::internal::ContextFreeReader reader(pr->memoryStream); + WString metadata; + reader << metadata; + + List errors; + auto parser = GetParserManager()->GetParser(L"XML"); + auto xmlMetadata = parser->Parse({}, metadata, errors); + CHECK_ERROR(xmlMetadata, L"GuiResourceManager::LoadResourceOrPending(stream::IStream&, GuiResourceUsage)#This resource does not contain a valid metadata."); + pr->metadata->LoadFromXml(xmlMetadata, {}, errors); + CHECK_ERROR(errors.Count() == 0, L"GuiResourceManager::LoadResourceOrPending(stream::IStream&, GuiResourceUsage)#This resource does not contain a valid metadata."); + } + + CHECK_ERROR( + pr->metadata->name != L"" || pr->dependencies.Count() == 0, + L"GuiResourceManager::LoadResourceOrPending(stream::IStream&, GuiResourceUsage)#The name of this resource cannot be empty because it has dependencies." + ); + CopyFrom(pr->dependencies, From(pr->metadata->dependencies).Except(resources.Keys())); + + if (pr->dependencies.Count() == 0) + { + SetResource(pr->LoadResource(), pr->usage); + } + else + { + pendingResources.Add(pr); + FOREACH(WString, dep, pr->dependencies) + { + depToPendings.Add(dep, pr); + } + } + } + + void GetPendingResourceNames(collections::List& names)override + { + CopyFrom(names, From(pendingResources).Select([](Ptr pr) {return pr->metadata->name; })); + } }; GUI_REGISTER_PLUGIN(GuiResourceManager) } @@ -35377,7 +35619,7 @@ namespace vl paragraph->Accept(&visitor); } { - vint32_t count = visitor.imageRuns.Count(); + vint32_t count = (vint32_t)visitor.imageRuns.Count(); stream.Write(&count, sizeof(count)); FOREACH(Ptr, imageRun, visitor.imageRuns) { @@ -35780,7 +36022,7 @@ namespace vl ResolvedStyle style = styles[styles.Count() - 1]; writer.WriteString(L"{\\f" + itow(GetFont(style.style.fontFamily))); - writer.WriteString(L"{\\fs" + itow((vint)(style.style.size * 1.5))); + writer.WriteString(L"\\fs" + itow((vint)(style.style.size * 1.5))); writer.WriteString(L"\\cf" + itow(GetColor(style.color))); writer.WriteString(L"\\cb" + itow(GetColor(style.backgroundColor))); writer.WriteString(L"\\chshdng" + itow(GetColor(style.backgroundColor))); diff --git a/Import/GacUI.h b/Import/GacUI.h index 90d8a141..967a9426 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -4214,19 +4214,38 @@ Resource DataOnly, InstanceClass, }; + + /// Resource metadata. + class GuiResourceMetadata : public Object + { + public: + WString name; + WString version; + collections::List dependencies; + + void LoadFromXml(Ptr xml, GuiResourceLocation location, GuiResourceError::List& errors); + Ptr SaveToXml(); + }; /// Resource. A resource is a root resource folder that does not have a name. class GuiResource : public GuiResourceFolder, public Description { protected: WString workingDirectory; + Ptr metadata; static void ProcessDelayLoading(Ptr resource, DelayLoadingList& delayLoadings, GuiResourceError::List& errors); public: + static const wchar_t* CurrentVersionString; + /// Create a resource. GuiResource(); ~GuiResource(); + /// Get the metadata of the resource. + /// The metadata. + Ptr GetMetadata(); + /// Get the directory where the resource is load. /// The directory. WString GetWorkingDirectory(); @@ -9283,13 +9302,15 @@ namespace vl { friend class Theme; protected: - ThemeTemplates* previous = nullptr; - ThemeTemplates* next = nullptr; + ThemeTemplates* previous = nullptr; + ThemeTemplates* next = nullptr; - controls::GuiControlHost* GetControlHostForInstance()override; + controls::GuiControlHost* GetControlHostForInstance()override; public: ~ThemeTemplates(); + WString Name; + #define GUI_DEFINE_ITEM_PROPERTY(TEMPLATE, CONTROL) TemplateProperty CONTROL; GUI_CONTROL_TEMPLATE_TYPES(GUI_DEFINE_ITEM_PROPERTY) #undef GUI_DEFINE_ITEM_PROPERTY @@ -9304,7 +9325,7 @@ namespace vl /// Returns true if this operation succeeded. /// The name of the theme. /// The control template collection object. - extern bool RegisterTheme(const WString& name, Ptr theme); + extern bool RegisterTheme(Ptr theme); /// Unregister a control template collection object. /// The registered object. Returns null if it does not exist. /// The name of the theme. @@ -15753,7 +15774,10 @@ ComboBox with GuiListControl ***********************************************************************/ /// Combo box list control. This control is a combo box with a list control in its popup. - class GuiComboBoxListControl : public GuiComboBoxBase, public Description + class GuiComboBoxListControl + : public GuiComboBoxBase + , private GuiListControl::IItemProviderCallback + , public Description { public: using ItemStyleProperty = TemplateProperty; @@ -15779,6 +15803,12 @@ ComboBox with GuiListControl void OnListControlAdoptedSizeInvalidated(compositions::GuiGraphicsComposition* sender, compositions::GuiEventArgs& arguments); void OnListControlBoundsChanged(compositions::GuiGraphicsComposition* sender, compositions::GuiEventArgs& arguments); void OnListControlSelectionChanged(compositions::GuiGraphicsComposition* sender, compositions::GuiEventArgs& arguments); + + private: + // ===================== GuiListControl::IItemProviderCallback ===================== + + void OnAttached(GuiListControl::IItemProvider* provider)override; + void OnItemModified(vint start, vint count, vint newCount)override; public: /// Create a control with a specified default theme and a list control that will be put in the popup control to show all items. /// The theme name for retriving a default control template. @@ -18919,9 +18949,12 @@ IGuiResourceManager class IGuiResourceManager : public IDescriptable, public Description { public: - virtual bool SetResource(const WString& name, Ptr resource, GuiResourceUsage usage = GuiResourceUsage::DataOnly) = 0; + virtual bool SetResource(Ptr resource, GuiResourceUsage usage = GuiResourceUsage::DataOnly) = 0; virtual Ptr GetResource(const WString& name) = 0; virtual Ptr GetResourceFromClassName(const WString& classFullName) = 0; + virtual void UnloadResource(const WString& name) = 0; + virtual void LoadResourceOrPending(stream::IStream& stream, GuiResourceUsage usage = GuiResourceUsage::DataOnly) = 0; + virtual void GetPendingResourceNames(collections::List& names) = 0; }; extern IGuiResourceManager* GetResourceManager(); diff --git a/Import/GacUICompiler.cpp b/Import/GacUICompiler.cpp index e24e33e4..5811af78 100644 --- a/Import/GacUICompiler.cpp +++ b/Import/GacUICompiler.cpp @@ -126,20 +126,19 @@ namespace vl bool WriteBinaryResource( Ptr resource, bool compress, - bool workflow, - const filesystem::FilePath& filePath) + bool includeAssemblyInResource, + Nullable resourceOutput, + Nullable assemblyOutput) { auto precompiled = resource->GetFolder(L"Precompiled"); auto folder = precompiled->GetFolder(L"Workflow"); - if (!workflow) - { - precompiled->RemoveFolder(L"Workflow"); - } - FileStream fileStream(filePath.GetFullPath(), FileStream::WriteOnly); - - if (fileStream.IsAvailable()) + if (resourceOutput) { + FileStream fileStream(resourceOutput.Value().GetFullPath(), FileStream::WriteOnly); + if (!fileStream.IsAvailable()) return false; + + if (!includeAssemblyInResource) precompiled->RemoveFolder(L"Workflow"); if (compress) { LzwEncoder encoder; @@ -150,14 +149,26 @@ namespace vl { resource->SavePrecompiledBinary(fileStream); } + if (!includeAssemblyInResource) precompiled->AddFolder(L"Workflow", folder); } - if (folder && !workflow) + if (assemblyOutput) { - precompiled->AddFolder(L"Workflow", folder); + if (auto item = folder->GetItem(L"InstanceClass")) + { + if (auto compiled = item->GetContent().Cast()) + { + if (compiled->assembly) + { + FileStream fileStream(assemblyOutput.Value().GetFullPath(), FileStream::WriteOnly); + if (!fileStream.IsAvailable()) return false; + compiled->assembly->Serialize(fileStream); + } + } + } } - return fileStream.IsAvailable(); + return true; } void WriteEmbeddedBinaryClass(MemoryStream& binaryStream, bool compress, const WString& className, const WString& prefix, StreamWriter& writer) @@ -280,8 +291,7 @@ namespace vl writer.WriteLine(L"\t\t\t\t\tMemoryStream resourceStream;"); writer.WriteLine(L"\t\t\t\t\t" + cppInput->assemblyName + L"ResourceReader::ReadToStream(resourceStream);"); writer.WriteLine(L"\t\t\t\t\tresourceStream.SeekFromBegin(0);"); - writer.WriteLine(L"\t\t\t\t\tauto resource = GuiResource::LoadPrecompiledBinary(resourceStream, errors);"); - writer.WriteLine(L"\t\t\t\t\tGetResourceManager()->SetResource(L\"" + cppInput->assemblyName + L"\", resource, GuiResourceUsage::InstanceClass);"); + writer.WriteLine(L"\t\t\t\t\tGetResourceManager()->LoadResourceOrPending(resourceStream, GuiResourceUsage::InstanceClass);"); writer.WriteLine(L"\t\t\t\t}"); writer.WriteLine(L""); writer.WriteLine(L"\t\t\t\tvoid Unload()override"); @@ -3868,20 +3878,14 @@ WorkflowGenerateCreatingVisitor void FillCtorArguments(GuiConstructorRepr* repr, IGuiInstanceLoader* loader, const IGuiInstanceLoader::TypeInfo& typeInfo, IGuiInstanceLoader::ArgumentMap& arguments) { - List ctorProps; - loader->GetPropertyNames(typeInfo, ctorProps); - WORKFLOW_ENVIRONMENT_VARIABLE_ADD - FOREACH(GlobalStringKey, prop, ctorProps) + FOREACH_INDEXER(GlobalStringKey, prop, index, repr->setters.Keys()) { - auto propInfo = loader->GetPropertyType({ typeInfo,prop }); - if (propInfo->usage != GuiInstancePropertyInfo::ConstructorArgument) continue; - - auto index = repr->setters.Keys().IndexOf(prop); - if (index == -1) continue; - auto setter = repr->setters.Values()[index]; + auto propertyResolving = resolvingResult.propertyResolvings[setter->values[0].Obj()]; + if (propertyResolving.info->usage != GuiInstancePropertyInfo::ConstructorArgument) continue; + if (setter->binding == GlobalStringKey::Empty) { FOREACH(Ptr, value, setter->values) @@ -3895,21 +3899,19 @@ WorkflowGenerateCreatingVisitor } else if (auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding)) { - auto propInfo = IGuiInstanceLoader::PropertyInfo(typeInfo, prop); - auto resolvedPropInfo = loader->GetPropertyType(propInfo); auto value = setter->values[0].Cast(); - if (auto expression = binder->GenerateConstructorArgument(precompileContext, resolvingResult, loader, propInfo, resolvedPropInfo, value->text, value->tagPosition, errors)) + if (auto expression = binder->GenerateConstructorArgument(precompileContext, resolvingResult, loader, propertyResolving.propertyInfo, propertyResolving.info, value->text, value->tagPosition, errors)) { Workflow_RecordScriptPosition(precompileContext, value->tagPosition, expression); IGuiInstanceLoader::ArgumentInfo argument; argument.expression = expression; - argument.typeInfo = resolvedPropInfo->acceptableTypes[0]; + argument.typeInfo = propertyResolving.info->acceptableTypes[0]; argument.attPosition = setter->attPosition; arguments.Add(prop, argument); } } - else + else if (setter->binding != GlobalStringKey::_Set) { errors.Add(GuiResourceError({ resolvingResult.resource }, setter->attPosition, L"[INTERNAL-ERROR] Precompile: The appropriate IGuiInstanceBinder of binding \"-" + @@ -6528,7 +6530,7 @@ IGuiInstanceLoader Ptr IGuiInstanceLoader::CreateRootInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, ArgumentMap& arguments, GuiResourceError::List& errors) { - CHECK_FAIL(L"IGuiInstanceLoader::CreateControlTemplateArgument(types::ResolvingResult&, const TypeInfo&, Ptr, collections::List&)#This function is not implemented."); + CHECK_FAIL(L"IGuiInstanceLoader::CreateRootInstance(GuiResourcePrecompileContext&, types::ResolvingResult&, const TypeInfo&, Ptr, ArgumentMap&, GuiResourceError::List&)#This function is not implemented."); } Ptr IGuiInstanceLoader::InitializeRootInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceError::List& errors) @@ -6538,17 +6540,17 @@ IGuiInstanceLoader Ptr IGuiInstanceLoader::CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors) { - CHECK_FAIL(L"IGuiInstanceLoader::CreateInstance(types::ResolvingResult&, const TypeInfo&, GlobalStringKey, ArgumentMap&, collections::List&)#This function is not implemented."); + CHECK_FAIL(L"IGuiInstanceLoader::CreateInstance(GuiResourcePrecompileContext&, types::ResolvingResult&, const TypeInfo&, GlobalStringKey, ArgumentMap&, GuiResourceTextPos, GuiResourceError::List&)#This function is not implemented."); } Ptr IGuiInstanceLoader::AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors) { - CHECK_FAIL(L"IGuiInstanceLoader::AssignParameters(types::ResolvingResult&, const TypeInfo&, GlobalStringKey, ArgumentMap&, collections::List&)#This function is not implemented."); + CHECK_FAIL(L"IGuiInstanceLoader::AssignParameters(GuiResourcePrecompileContext&, types::ResolvingResult&, const TypeInfo&, GlobalStringKey, ArgumentMap&, GuiResourceTextPos, GuiResourceError::List&)#This function is not implemented."); } Ptr IGuiInstanceLoader::GetParameter(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const PropertyInfo& propertyInfo, GlobalStringKey variableName, GuiResourceTextPos attPosition, GuiResourceError::List& errors) { - CHECK_FAIL(L"IGuiInstanceLoader::GetParameter(types::ResolvingResult&, const PropertyInfo&, GlobalStringKey, collections::List&)#This function is not implemented."); + CHECK_FAIL(L"IGuiInstanceLoader::GetParameter(GuiResourcePrecompileContext&, types::ResolvingResult&, const PropertyInfo&, GlobalStringKey, GuiResourceTextPos, GuiResourceError::List&)#This function is not implemented."); } /*********************************************************************** @@ -6918,6 +6920,39 @@ GuiDefaultInstanceLoader GetInstanceConstructor(typeInfo.typeInfo->GetTypeDescriptor()) != nullptr; } + Ptr CreateRootInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, ArgumentMap& arguments, GuiResourceError::List& errors) + { + CTOR_PARAM_PREFIX + + if (arguments.Count() > 0) + { + auto call = MakePtr(); + + auto baseTd = typeInfo.typeInfo->GetTypeDescriptor()->GetBaseTypeDescriptor(0); + auto baseTypeInfo = MakePtr(baseTd, TypeInfoHint::Normal); + call->type = GetTypeFromTypeInfo(baseTypeInfo.Obj()); + + auto ctor = baseTd->GetConstructorGroup()->GetMethod(0); + vint count = ctor->GetParameterCount(); + for (vint i = 0; i < count; i++) + { + auto key = GlobalStringKey::Get(CTOR_PARAM_NAME(ctor->GetParameter(0)->GetName())); + + vint index = arguments.Keys().IndexOf(key); + if (index == -1) + { + return nullptr; + } + else + { + call->arguments.Add(arguments.GetByIndex(index)[0].expression); + } + } + return call; + } + return nullptr; + } + Ptr CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override { CTOR_PARAM_PREFIX @@ -7591,38 +7626,33 @@ namespace vl } }; - Ptr Workflow_GetModule(GuiResourcePrecompileContext& context, const WString& path) + Ptr Workflow_GetModule(GuiResourcePrecompileContext& context, const WString& path, Nullable assemblyType) { - return context.targetFolder->GetValueByPath(path).Cast(); + auto compiled = context.targetFolder->GetValueByPath(path).Cast(); + if (assemblyType && !compiled) + { + compiled = new GuiInstanceCompiledWorkflow; + compiled->type = assemblyType.Value(); + context.targetFolder->CreateValueByPath(path, L"Workflow", compiled); + } + return compiled; } void Workflow_AddModule(GuiResourcePrecompileContext& context, const WString& path, Ptr module, GuiInstanceCompiledWorkflow::AssemblyType assemblyType, GuiResourceTextPos tagPosition) { - auto compiled = Workflow_GetModule(context, path); - if (!compiled) - { - compiled = new GuiInstanceCompiledWorkflow; - compiled->type = assemblyType; - context.targetFolder->CreateValueByPath(path, L"Workflow", compiled); - } - else - { - CHECK_ERROR(compiled->type == assemblyType, L"Workflow_AddModule(GuiResourcePrecompiledContext&, const WString&, GuiInstanceCompiledWorkflow::AssemblyType)#Unexpected assembly type."); - } + auto compiled = Workflow_GetModule(context, path, assemblyType); + CHECK_ERROR(compiled->type == assemblyType, L"Workflow_AddModule(GuiResourcePrecompiledContext&, const WString&, GuiInstanceCompiledWorkflow::AssemblyType)#Unexpected assembly type."); - if (compiled) - { - GuiInstanceCompiledWorkflow::ModuleRecord record; - record.module = module; - record.position = tagPosition; - record.shared = assemblyType == GuiInstanceCompiledWorkflow::Shared; - compiled->modules.Add(record); - } + GuiInstanceCompiledWorkflow::ModuleRecord record; + record.module = module; + record.position = tagPosition; + record.shared = assemblyType == GuiInstanceCompiledWorkflow::Shared; + compiled->modules.Add(record); } void Workflow_GenerateAssembly(GuiResourcePrecompileContext& context, const WString& path, GuiResourceError::List& errors, bool keepMetadata, IWfCompilerCallback* compilerCallback) { - auto compiled = Workflow_GetModule(context, path); + auto compiled = Workflow_GetModule(context, path, {}); if (!compiled) { return; @@ -7779,7 +7809,7 @@ Shared Script Type Resolver (Script) { case Workflow_Compile: Workflow_GenerateAssembly(context, Path_Shared, errors, false, context.compilerCallback); - if (auto compiled = Workflow_GetModule(context, Path_Shared)) + if (auto compiled = Workflow_GetModule(context, Path_Shared, {})) { for (vint i = 0; i < compiled->modules.Count(); i++) { @@ -7883,8 +7913,8 @@ Instance Type Resolver (Instance) } } -#define ENSURE_ASSEMBLY_EXISTS(PATH)\ - if (auto compiled = Workflow_GetModule(context, PATH))\ +#define ENSURE_ASSEMBLY_EXISTS(PATH, ASSEMBLY_TYPE)\ + if (auto compiled = Workflow_GetModule(context, PATH, GuiInstanceCompiledWorkflow::ASSEMBLY_TYPE))\ {\ if (!compiled->assembly)\ {\ @@ -7897,13 +7927,13 @@ Instance Type Resolver (Instance) }\ #define UNLOAD_ASSEMBLY(PATH)\ - if (auto compiled = Workflow_GetModule(context, PATH))\ + if (auto compiled = Workflow_GetModule(context, PATH, {}))\ {\ compiled->context = nullptr;\ }\ #define DELETE_ASSEMBLY(PATH)\ - if (auto compiled = Workflow_GetModule(context, PATH))\ + if (auto compiled = Workflow_GetModule(context, PATH, {}))\ {\ compiled->context = nullptr;\ compiled->assembly = nullptr;\ @@ -7933,7 +7963,7 @@ Instance Type Resolver (Instance) } break; case Instance_CollectEventHandlers: - ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass) + ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass, TemporaryClass) case Instance_CollectInstanceTypes: { if (auto obj = resource->GetContent().Cast()) @@ -7998,7 +8028,7 @@ Instance Type Resolver (Instance) break; case Instance_GenerateInstanceClass: { - ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass) + ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass, TemporaryClass) if (auto obj = resource->GetContent().Cast()) { vint previousErrorCount = errors.Count(); @@ -8028,26 +8058,30 @@ Instance Type Resolver (Instance) void PerPassPrecompile(GuiResourcePrecompileContext& context, GuiResourceError::List& errors)override { WString path; + GuiInstanceCompiledWorkflow::AssemblyType assemblyType; switch (context.passIndex) { case Instance_CompileInstanceTypes: DELETE_ASSEMBLY(Path_Shared) path = Path_TemporaryClass; + assemblyType = GuiInstanceCompiledWorkflow::TemporaryClass; break; case Instance_CompileEventHandlers: DELETE_ASSEMBLY(Path_TemporaryClass) path = Path_TemporaryClass; + assemblyType = GuiInstanceCompiledWorkflow::TemporaryClass; break; case Instance_CompileInstanceClass: UNLOAD_ASSEMBLY(Path_TemporaryClass) path = Path_InstanceClass; + assemblyType = GuiInstanceCompiledWorkflow::InstanceClass; break; default: return; } - auto sharedCompiled = Workflow_GetModule(context, Path_Shared); - auto compiled = Workflow_GetModule(context, path); + auto sharedCompiled = Workflow_GetModule(context, Path_Shared, {}); + auto compiled = Workflow_GetModule(context, path, assemblyType); if (sharedCompiled && compiled) { CopyFrom( @@ -9790,6 +9824,31 @@ Workflow_GenerateInstanceClass return block; }; + auto getDefaultType = [&](const WString& className)->Tuple, WString> + { + auto paramTd = GetTypeDescriptor(className); + if (!paramTd) + { + auto source = FindInstanceLoadingSource(resolvingResult.context, {}, className); + if (auto typeInfo = GetInstanceLoaderManager()->GetTypeInfoForType(source.typeName)) + { + paramTd = typeInfo->GetTypeDescriptor(); + } + } + + if (paramTd) + { + auto typeInfo = Workflow_GetSuggestedParameterType(paramTd); + switch (typeInfo->GetDecorator()) + { + case ITypeInfo::RawPtr: return { typeInfo,className + L"*" }; + case ITypeInfo::SharedPtr: return { typeInfo,className + L"^" }; + default: return { typeInfo,className }; + } + } + return { nullptr,className }; + }; + /////////////////////////////////////////////////////////////// // ref.Members /////////////////////////////////////////////////////////////// @@ -9825,7 +9884,30 @@ Workflow_GenerateInstanceClass if (baseWfType) { - // Fill later + auto call = MakePtr(); + ctor->baseConstructorCalls.Add(call); + call->type = CopyType(instanceClass->baseTypes[0]); + baseTypeContext = baseTypeResourceItem->GetContent().Cast(); + + FOREACH(Ptr, parameter, baseTypeContext->parameters) + { + auto parameterTypeInfoTuple = getDefaultType(parameter->className.ToString()); + auto expression = Workflow_ParseExpression( + precompileContext, + parameter->classPosition.originalLocation, + L"cast("+parameterTypeInfoTuple.f1+L") (null of object)", + parameter->classPosition, + errors, + { 0,5 } + ); + if (!expression) + { + auto nullExpr = MakePtr(); + nullExpr->value = WfLiteralValue::Null; + expression = nullExpr; + } + call->arguments.Add(expression); + } } else if (auto group = baseType->GetTypeDescriptor()->GetConstructorGroup()) { @@ -9882,34 +9964,11 @@ Workflow_GenerateInstanceClass FOREACH(Ptr, parameter, context->parameters) { - WString classNameTail; - Ptr parameterTypeInfo; - { - auto paramTd = GetTypeDescriptor(parameter->className.ToString()); - if (!paramTd) - { - auto source = FindInstanceLoadingSource(resolvingResult.context, {}, parameter->className.ToString()); - if (auto typeInfo = GetInstanceLoaderManager()->GetTypeInfoForType(source.typeName)) - { - paramTd = typeInfo->GetTypeDescriptor(); - } - } - - if (paramTd) - { - parameterTypeInfo = Workflow_GetSuggestedParameterType(paramTd); - switch (parameterTypeInfo->GetDecorator()) - { - case ITypeInfo::RawPtr: classNameTail = L"*"; break; - case ITypeInfo::SharedPtr: classNameTail = L"^"; break; - default:; - } - } - } - + auto parameterTypeInfoTuple = getDefaultType(parameter->className.ToString()); vint errorCount = errors.Count(); - auto type = Workflow_ParseType(precompileContext, { resolvingResult.resource }, parameter->className.ToString() + classNameTail, parameter->classPosition, errors); - if (!needFunctionBody && !parameterTypeInfo && errorCount == errors.Count()) + auto type = Workflow_ParseType(precompileContext, { resolvingResult.resource }, parameterTypeInfoTuple.f1, parameter->classPosition, errors); + + if (!needFunctionBody && !parameterTypeInfoTuple.f0 && errorCount == errors.Count()) { if (!type || type.Cast() || type.Cast() || type.Cast()) { @@ -9925,7 +9984,7 @@ Workflow_GenerateInstanceClass decl->name.value = L"" + parameter->name.ToString(); decl->type = CopyType(type); - decl->expression = CreateDefaultValue(parameterTypeInfo.Obj()); + decl->expression = CreateDefaultValue(parameterTypeInfoTuple.f0.Obj()); Workflow_RecordScriptPosition(precompileContext, parameter->tagPosition, (Ptr)decl); } @@ -10327,12 +10386,57 @@ namespace vl using namespace parsing; using namespace workflow::analyzer; +/*********************************************************************** +Workflow_AdjustPropertySearchType +***********************************************************************/ + + IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop) + { + if (resolvedTypeInfo.typeName.ToString() == resolvingResult.context->className) + { + if (auto propTd = resolvedTypeInfo.typeInfo->GetTypeDescriptor()) + { + vint baseCount = propTd->GetBaseTypeDescriptorCount(); + for (vint i = 0; i < baseCount; i++) + { + auto baseTd = propTd->GetBaseTypeDescriptor(i); + if (auto ctorGroup = baseTd->GetConstructorGroup()) + { + if (ctorGroup->GetMethodCount() == 1) + { + auto ctor = ctorGroup->GetMethod(0); + auto propertyName = prop.ToString(); + auto ctorArgumentName = L"" + propertyName; + vint paramCount = ctor->GetParameterCount(); + for (vint j = 0; j < paramCount; j++) + { + auto parameterInfo = ctor->GetParameter(j); + if (parameterInfo->GetName() == ctorArgumentName) + { + if (baseTd->GetPropertyByName(propertyName, false)) + { + resolvedTypeInfo.typeInfo = CopyTypeInfo(ctor->GetReturn()); + resolvedTypeInfo.typeName = GlobalStringKey::Get(baseTd->GetTypeName()); + return resolvedTypeInfo; + } + break; + } + } + } + } + } + } + } + return resolvedTypeInfo; + } + /*********************************************************************** Workflow_GetPropertyTypes ***********************************************************************/ bool Workflow_GetPropertyTypes(WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors) { + resolvedTypeInfo = Workflow_AdjustPropertySearchType(resolvingResult, resolvedTypeInfo, prop); bool reportedNotSupported = false; IGuiInstanceLoader::PropertyInfo propertyInfo(resolvedTypeInfo, prop); @@ -10663,7 +10767,7 @@ WorkflowReferenceNamesVisitor errors.Add(GuiResourceError({ resolvingResult.resource }, repr->tagPosition, L"Precompile: Missing required " + - WString(info->usage == GuiInstancePropertyInfo::ConstructorArgument ? L"constructor argument" : L"required property") + + WString(info->usage == GuiInstancePropertyInfo::ConstructorArgument ? L"constructor argument" : L"property") + L" \"" + prop.ToString() + L"\" of type \"" + @@ -10775,6 +10879,48 @@ WorkflowReferenceNamesVisitor } } + if (resolvingResult.context->instance == repr) + { + static const wchar_t Prefix[] = L""; + static const vint PrefixLength = (vint)sizeof(Prefix) / sizeof(*Prefix) - 1; + + auto source = FindInstanceLoadingSource(resolvingResult.context, repr); + if (auto baseTd = description::GetTypeDescriptor(source.typeName.ToString())) + { + if (auto ctorGroup = baseTd->GetConstructorGroup()) + { + if (ctorGroup->GetMethodCount() == 1) + { + auto ctor = ctorGroup->GetMethod(0); + vint paramCount = ctor->GetParameterCount(); + for (vint i = 0; i < paramCount; i++) + { + auto parameterInfo = ctor->GetParameter(i); + auto ctorArg = parameterInfo->GetName(); + if (ctorArg.Length() > PrefixLength && ctorArg.Left(PrefixLength) == Prefix) + { + auto propName = ctorArg.Right(ctorArg.Length() - PrefixLength); + if (baseTd->GetPropertyByName(propName, false)) + { + if (!repr->setters.Keys().Contains(GlobalStringKey::Get(propName))) + { + errors.Add(GuiResourceError({ resolvingResult.resource }, repr->tagPosition, + L"Precompile: Missing required property \"" + + propName + + L"\" of type \"" + + resolvedTypeInfo.typeName.ToString() + + L"\" for its base type \"" + + baseTd->GetTypeName() + + L"\".")); + } + } + } + } + } + } + } + } + if (resolvedTypeInfo.typeInfo) { for (vint i = 0; i < candidatePropertyTypeInfos.Count(); i++) diff --git a/Import/GacUICompiler.h b/Import/GacUICompiler.h index f86af633..a2dabb0d 100644 --- a/Import/GacUICompiler.h +++ b/Import/GacUICompiler.h @@ -624,8 +624,9 @@ namespace vl extern bool WriteBinaryResource( Ptr resource, bool compress, - bool workflow, - const filesystem::FilePath& filePath); + bool includeAssemblyInResource, + Nullable resourceOutput, + Nullable assemblyOutput); extern bool WriteEmbeddedResource(Ptr resource, Ptr cppInput, @@ -1119,6 +1120,7 @@ WorkflowCompiler (Compile) } }; + extern IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop); extern bool Workflow_GetPropertyTypes(WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors); extern Ptr Workflow_GetSuggestedParameterType(reflection::description::ITypeDescriptor* typeDescriptor); extern IGuiInstanceLoader::TypeInfo Workflow_CollectReferences(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, GuiResourceError::List& errors); diff --git a/Import/GacUIReflection.cpp b/Import/GacUIReflection.cpp index 5498fb1e..27f94386 100644 --- a/Import/GacUIReflection.cpp +++ b/Import/GacUIReflection.cpp @@ -1414,6 +1414,7 @@ Type Declaration (Extra) CLASS_MEMBER_BASE(GuiInstanceRootObject) CLASS_MEMBER_CONSTRUCTOR(Ptr(), NO_PARAMETER) + CLASS_MEMBER_FIELD(Name) #define GUI_DEFINE_ITEM_PROPERTY(TEMPLATE, CONTROL) CLASS_MEMBER_FIELD(CONTROL) GUI_CONTROL_TEMPLATE_TYPES(GUI_DEFINE_ITEM_PROPERTY) #undef GUI_DEFINE_ITEM_PROPERTY diff --git a/Import/Skins/DarkSkin/DarkSkin.cpp b/Import/Skins/DarkSkin/DarkSkin.cpp index e9bdc780..bece1aaf 100644 --- a/Import/Skins/DarkSkin/DarkSkin.cpp +++ b/Import/Skins/DarkSkin/DarkSkin.cpp @@ -26537,6 +26537,9 @@ Class (::darkskin::ThemeConstructor) { (::vl::__vwsn::This(this->__vwsn_precompile_0)->Window = LAMBDA(::vl_workflow_global::__vwsnf54_DarkSkin_darkskin_ThemeConstructor___vwsn_darkskin_Theme_Initialize_(this))); } + { + (::vl::__vwsn::This(this->__vwsn_precompile_0)->Name = ::vl::WString(L"DarkSkin", false)); + } } ThemeConstructor::ThemeConstructor() @@ -29280,9 +29283,9 @@ namespace vl class DarkSkinResourceReader { public: - static const vint parserBufferLength = 1655; // 4202 bytes before compressing + static const vint parserBufferLength = 1710; // 4288 bytes before compressing static const vint parserBufferBlock = 1024; - static const vint parserBufferRemain = 631; + static const vint parserBufferRemain = 686; static const vint parserBufferRows = 2; static const char* parserBuffer[2]; @@ -29293,8 +29296,8 @@ namespace vl }; const char* DarkSkinResourceReader::parserBuffer[] = { - "\x6A\x10\x00\x00\x6F\x06\x00\x00\x05\x00\x01\x82\x80\x08\x03\x82\x81\x82\x01\xC9\x2E\x33\x34\x39\x32\x37\x31\x65\x0D\x06\x81\x82\x89\x87\x85\x86\x0F\xE5\x13\x34\x39\x3C\x35\x33\x01\x13\x80\x20\x81\x84\x27\x37\x30\x02\x21\xA8\x81\x94\x25\x30\x3C\x3B\x07\x21\xB0\x81\x83\x2C\x31\x33\x39\x39\x4E\x61\x2D\x25\x32\x2D\x33\x31\x37\x72\x64\x21\x82\x91\x90\x86\x82\xA3\x44\x61\x32\x2B\x33\x2B\x35\x34\x37\x43\x8A\x21\x86\x03\xAA\x82\x21\x3A\x74\x74\x2F\x30\xA3\xA5\xA2\xAE\x92\x26\xF5\x3B\x8E\x34\x39\x01\x90\x01\x21\x90\x29\xB6\xA6\x9D\x30\x37\xA7\x65\x25\xA3\x22\xB5\x34\xB2\x5F\x90\x77\x81\xBC\x12\xBE\x1C\x1F\x21\xAD\x74\x75\xB4\x2F\x1D\xBB\x8D\x8F\x32\x73\x05\xDC\x9E\x80\x16\x36\x9D\x32\x3D\x22\x23\x04\x25\x36\x31\x31\x3A\x6C\x74\x2D\x0F\x26\x3D\x32\x38\x39\x69\x64\x25\x22\x1D\xBF\x9C\x36\xA0\x3E\x23\x06\x2B\xDC\xD4\x1F\x16\xD3\xA8\xAE\xC6\xDE\x8A\xC7\xC1\xC7\xC7\x91\xA3\x13\x2E\xBE\x9C\x39\x35\xAD\x9B\x9D\xDF\xC1\xD3\xD5\xD3\x37\xD3\x72\x29\xEC\xCD\xDF\xD7\xE1\xD8\x31\x6B\x30\xC9\xE3\x10\x18\x1B\x1B\x20\x43\x43\x2E\xD0\xE2\xED\xBF\x17\xD9\x65\x5E\xE0\xE9\xCE\xD4\xBF\xA0\x95\x06\xE8\xCC\x29\x3C\x85\xAD\x95\xF7\x01\xCD\x2C\xE3\x3E\xF3\x88\xAA\xFB\x02\xD2\x29\x22\x32\x33\xAD\xFA\x83\xF7\x40\x82\x43\x14\x63\x32\x17\x70\x1B\xFF\x43\x43\x4A\x41\x0B\x94\x11\x1A\x18\x09\x82\x47\x01\x48\x13\xAB\x4D\x48\x1D\x42\x2F\x18\x1D\x84\x01\x49\x01\x4A\x87\x2B\x6F\x17\x70\x43\xA0\x70\x1C\x84\x00\x01\x83\x41\x83\x15\x4F\x64\x1F\x1B\x1D\x27\x8C\x01\x4A\x8C\x01\x47\x11\x1B\x18\x47\x35\x5F\x5E\x1B\x66\x29\x17\x1B\x50\x66\x53\x4B\x82\x82\x02\x43\x10\x1C\x1C\x00\x42\x91\x49\x45\x06\x4C\x96\x90\x1C\x7F\x6D\x10\x1E\x1C\x88\x73\x15\x18\x19\x14\x21\x49\x94\x49\x4A\x4C\x5E\x52\x1B\x3D\x73\x1F\x19\x1D\x72\x10\x4E\x0B\x18\x47\x83\x92\x40\x7A\x03\x68\x79\x4F\x4E\x46\x43\x48\x51\x97\x4D\x4F\x5A\x98\x45\x4B\x82\x4E\x10\x50\x6D\x21\x1C\x1A\x42\x63\x2C\x15\x1E\x68\x6A\x53\x45\xA0\x00\x2E\x2E\x0F\x09\xA2\x8B\x8A\xA6\x8F\x18\x55\x09\x1E\x08\x1A\x77\x80\x01\x05\x48\x97\x81\x4D\x4E\x19\x1E\x63\x1E\x6F\x56\x80\x82\xA2\x69\x0E\x21\x64\xA1\x40\xA3\xA8\x8A\xAB\xA5\xA7\x9F\xAE\x1F\x08\x15\x79\x30\x11\x5C\x62\x05\xA9\x10\x1E\x56\x72\x33\x1F\x0B\x11\x75\x29\x1B\xA9\x6F\xBF\x6E\x10\x16\xA0\x67\x0F\x53\xA5\xA5\x34\x86\x49\xB3\x14\x63\xA5\x95\x1A\x11\xC7\x62\x62\x1D\x8A\x02\x41\x8C\xB0\x99\x10\x43\x5B\x01\x48\xDB\x81\x40\x14\x95\x3F\x52\x99\x1A\x47\x64\x01\x99\x79\x4C\xE8\xB3\x45\x4F\x4D\x6F\xBC\x4E\x4C\x50\x64\x04\x19\xBA\x41\x32\x40\x04\x19\x97\x73\x1F\x9A\x0E\x0E\x54\x28\x15\x1B\x4E\x18\x21\x41\xC1\x40\xF7\x8B\x59\xBF\x53\xFB\x97\x59\x57\x56\x2C\x52\x95\x4D\x60\x1A\x21\x41\xC4\xC1\xF8\xBA\xBA\x0F\x10\xFE\xA3\x1B\x19\x86\x78\x0D\xC0\x1F\xC3\x65\x1D\x01\x4A\xC8\x14\xC6\xC6\xC6\x14\x61\x24\x1F\x6E\xC2\x5A\x6E\x1E\xC4\xC8\x1F\x21\x41\xCD\xC9\x6B\x07\xCE\x1B\xBE\x72\x74\x54\x58\x13\x0F\xAE\x5F\xC9\x18\x81\x61\x01\x4A\xD0\x34\xF6\xC8\xCD\x58\x63\x74\x1C\x4A\x4B\x1C\xFF\xC1\x60\x08\x21\x50\xD5\xD2\xC5\x39\xC9\xD6\x15\x1A\x65\x37\x1E\x66\xD3\x65\x25\x01\x4A\xD7\x53\xC8\xC7\xC5\xC6\x6B\x09\x11\x61\x1B\x42\x37\x8B\x1B\x19\x06\xB5\x1E\x18\x19\x5C\xD3\xC6\x42\xDC\x05\xF5\xC6\xC5\x94\xFD\x4D\xDF\xBF\xC7\x40\xE5\x14\x09\x48\x7F\xE1\xD7\xCE\x0E\x45\x38\x10\x1E\x43\x2A\xEE\x17\x18\x65\x3F\x72\x10\xD0\x50\x5C\xD2\xD6\x42\xE4\x75\xC6\xDA\x0E\xD9\xFF\xA9\xDA\xC4\xDB\x63\xAF\xDC\xD6\x09\x21\x60\xE2\xE3\xBE\xEB\x4C\x47\xD5\xD6\x7F\x42\xAD\x1A\x1B\x48\x25\x19\xCB\xD6\x7B\xE0\xC2\xDF\x40\x74\xD5\xC2\xD9\xE9\x74\x27\xE7\x1D\xDC\x12\xC2\x45\xE6\xC5\x4B\xF4\x18\xEC\xEF\x13\x75\xE6\xCA\xD8\x54\x14\x95\x1A\xEE\x5C\xDC\x01\x4A\xF3\xA3\xFA\x09\x51\x60\x50\x29\x1A\xC4\xEC\x0E\xFD\xD3\xEE\x40\xC6\xF6\xD2\xDB\x11\x6D\xF0\x1A\xDD\xF6\x81\x57\x01\x4A\xF9\xD1\xFC\xC2\x1A\xCF\xB1\xFD\xD4\xCA\x41\xEF\xFF\xE2\xDB\x14\x68\x00\x54\x1F\x5C\x74\x0B\x15\x19\x1E\x5C\xE2\x01\x4A\xFF\xD1\x7A\x3C\x7F\x5B\x23\x0B\x8F\x69\x0C\x0E\x41\x1F\x33\x8B\x5C\x63\x66\x83\x0D\x82\x7E\x83\x62\x81\x7F\x6E\x0C\x65\xAD\x33\x0C\x6B\x2D\x01\x25\x06\x81\x8B\x3F\x09\xB6\x44\x0D\x1E\x32\x0D\x1E\x44\x06\x40\x38\x2E\x47\x0E\x14\x98\x29\xCB\x5C\x67\x05\x90\x2D\x84\x83\x03\x8E\x0F\x07\xA1\x89\x0E\xCC\x6D\x0B\x78\xED\x61\x31\x03\x83\x2F\x80\xDB\x51\x85", - "\x83\x5B\x33\x86\x67\x7C\x79\x87\x32\x29\x01\x24\x47\x90\x86\x07\xE1\x75\x71\xC3\x6F\x6D\x82\x2E\x65\x88\xD1\x06\x23\x8A\x08\xBB\x5A\x82\x41\x81\x7D\x13\x75\x25\x0E\xAE\x6F\x7B\x20\xF1\x7E\x87\x15\xC0\x82\x87\xF0\x5C\x6B\x8A\x03\x35\x8A\x18\xBA\x08\x8A\x37\x09\x0F\x27\x6E\x0A\x7C\xFB\x64\x75\x0D\x11\x21\x26\x8E\x4A\x9B\x28\xCF\x72\x07\x0D\x32\x10\x8C\x6B\x2B\x01\x25\x20\xF9\x81\x8E\xA5\x3D\x8C\x84\x6F\x06\x87\x8B\x29\x8B\x61\x28\xB4\x88\x05\x21\x30\x90\x21\xFB\x8D\x8F\x02\xAF\x28\x43\x2A\x8C\x61\x11\xF8\x86\x20\x4E\x96\x8C\x8D\x64\x93\x09\x9F\x20\x8F\x8F\x22\x83\x96\x20\xA7\x9F\x91\x1B\xA2\x9E\x4E\x36\x08\x92\x91\x28\x85\x94\x1D\xA2\x76\x20\x5A\xAA\x91\x94\xA3\x9F\x4C\x1C\xF2\x8C\x0C\xAE\x52\x96\x20\xBF\x97\x95\x0C\xAC\x90\x84\x4B\x87\x82\x96\x7C\x61\x33\x0B\x86\x2B\x98\x61\x93\x84\x0A\x22\x4C\x0C\x89\x36\x5D\x75\xD7\x72\x0C\x6B\x60\x66\x21\x36\xCE\x9C\x61\x68\x93\x98\x0E\x5B\x8E\x0D\x17\xC5\x80\x80\x83\x25\x9C\x9B\x2E\x7E\x98\x1D\x25\x47\x83\x22\x81\x76\x20\xEF\x9F\x91\x86\x0B\x6D\x0C\x02\x46\x44\x94\x99\x8E\x91\x32\xE5\x0B\x86\x81\x3D\x87\x78\x83\x68\x0A\x3D\x87\x48\x08\xC4\x5E\x24\x6B\x19\x01\x25\x42\xD1\x72\xA1\x02\x47\x44\x78\x73\x7E\x77\x1A\xC8\x09\x78\xB5\x58\x7B\x9F\xE5\x83\x23\x39\xEB\x8C\x09\xCA\x34\x0B\xA0\xF8\x8D\x92\x17\xA3\x62\xA2\x80\xBB\x5F\x5B\x6F\x0C\x6D\x95\x69\x67\x9B\x4D\xB7\x8D\xA4\xDE\x7F\x87\x19\x68\x0F\xA2\x87\xA1\xA3\x85\x45\x90\x7A\x41\x3A\xAF\x92\x90\xAC\x0C\x79\x52\x83\x68\x4C\x96\x70\x9A\x38\x3E\xA0\x99\x30\x72\x67\x50\x96\x66\x0A\x9F\x85\xA7\x6D\x07\xA5\x8B\x42\x86\x23\xAB\x4F\x8D\xAE\xA6\xBD\x85\x8B\xF6\x01\x2D\x7A\xCB\x56\x0D\xA2\xD7\x6D\xA4\x1D\xE8\x82\x20\x35\xA6\xA4\x5F\x0F\x55\x9A\xB4\x48\xAD\x6F\x0D\x21\x26\xAD\xD1\x6E\x42\x18\x6A\xA7\xA2\x90\x55\x01\x24\x77\xB1\xAF\x83\x7D\x7F\x7F\xA5\xA2\x6D\x09\x98\x3E\x37\x5B\x6E\x05\x0D\xE0\x63\x7B\x9F\x9C\x83\x22\x27\xEB\x83\x0B\xA7\x27\x0E\x23\x83\xA5\xB3\x85\x07\xB9\xA9\x89\x3F\x99\xA6\xFB\x41\x9D\x1D\x2C\xAC\xAD\xA7\x51\x6E\xAF\x83\x7A\xB2\x0D\x9D\xB5\x0C\x0F\x21\x26\xB4\xD1\x7A\xB2\x31\xD9\x25\xAF\xBE\x59\x9B\x20\xDB\x8B\x8C\x34\xA3\x4B\x9C\x5B\x6B\xB1\x81\x06\x5B\x75\x50\x93\x26\xAC\xCC\xBC\x5A\x9D\x25\x44\xB5\x12\x86\x23\xB9\x4F\xB3\xB2\x9A\xB5\xB0\x0F\x2B\xA7\x8C\x90\x9C\xB4\x8D\x9F\x01\x37\xB0\x51\xC0\xB6\x56\xCD\x9F\x71\x74\xA0\xBB\x5F\x71\xDF\x9B\xB4\xD2\x89\xB2\x20\x8B\xA7\xAF\x76\xC9\xBB\xB5\xC0\x22\xAB\x9F\x70\xA6\x21\x7A\xC6\xB4\xBA\x38\x0C\x82\xA9\xD1\x63\x09\x1D\x0C\x2F\x0D\x36\x3B\x43\x9D\xC7\x28\xA2\x42\xD9\xBF\xB7\xE3\x3E\x36\xBD\x45\x83\x62\x41\x02\xCF\x92\x16\x6F\x6B\x81\x45\x83\x28", + "\xC0\x10\x00\x00\xA6\x06\x00\x00\x4A\x00\x01\x82\x80\x00\x81\x80\x1E\x29\x65\x73\x2F\x35\x32\x3B\x31\x33\x26\x65\x74\x21\x24\x31\x32\x88\x10\x27\x61\x6D\x25\x3D\x12\x12\x10\x10\x2B\x65\x72\x33\x29\x3F\x36\x34\x8F\x18\x2E\x30\x22\x1E\x1C\x1C\x21\x32\x38\x65\x6E\x24\x31\x93\x31\x35\x85\x17\x2C\xAF\x08\x8A\x8C\x86\x84\x88\x89\x14\x92\xBE\x05\x03\x82\x80\x05\xA2\x01\xC7\x81\x89\x2E\x33\x3A\x88\x37\x0E\x8D\x08\xA0\x02\xAB\xA5\xA7\xA7\x0E\xD3\x34\x39\x3C\x35\x33\x01\xA9\x5F\x81\x84\x2F\x33\x34\x03\xA8\xB3\x01\xD4\x25\x38\x34\x3F\x07\xA8\xB7\x01\xC3\x2C\x21\x33\x3B\x38\x8C\x8D\x08\xE3\x2F\x32\x34\x33\xA8\x01\xB0\x45\xCA\x81\xC2\x84\x21\x32\x39\x35\x53\x6B\x29\x2E\x3E\xBA\x07\xA8\x03\x8F\x82\x82\x35\x34\x3C\x39\x92\xBF\x7E\x82\xC3\x82\xC3\xB3\x31\x3A\x8D\x6E\x74\x01\x13\xA2\x03\xA8\x08\xD3\x92\xF4\xA5\x2C\x3B\xC5\x31\xCF\xCF\x31\xF4\x3E\x53\xA3\xDE\x81\xCE\x96\x43\x25\xB4\x31\xD8\x9C\x1E\xAC\xAE\x09\xAC\xBF\xDD\xA0\x16\x35\x8D\x8D\x22\x23\x2E\x86\x31\x35\x38\x36\x3A\x2D\x4F\x36\x21\x92\x39\x37\x99\x95\x3C\x7A\xAC\x3B\xBE\x1B\x12\x23\xEF\xE0\xBC\x2F\x1A\xEC\xEA\xF3\xE1\x32\xC2\xDB\x84\xE6\xEA\x8C\x8F\x11\x29\xAB\xE5\x23\x34\x34\x96\x35\xE9\xE9\x72\x55\xD7\xEC\x94\xF2\x39\xEE\xF0\xE1\x63\x7F\x1B\x76\xFE\x7C\x02\x1B\x1A\xFD\x5D\x70\x0C\x0C\x37\x01\x13\x13\x10\xE2\x47\x89\x82\x79\xEA\x68\x74\x84\x70\x73\x39\x47\x6E\x5F\x68\x45\x5D\x84\x13\x69\x0E\x58\x67\x59\x24\x81\x4D\x11\x88\x63\x23\x88\x50\x64\x2B\x82\x42\x15\x1A\x62\x22\x17\x66\x8A\x03\x6C\x85\x52\x8D\x53\x23\x12\x1F\x80\x6C\x34\x83\x40\x60\x3F\x82\x44\x15\x18\x62\x3E\x82\x43\x01\x53\x48\x99\x5B\x5A\x74\x02\x1F\x18\x1E\x46\x81\x49\x03\x54\x53\xA9\x5F\x1B\x80\x4E\x55\x70\x1D\x94\x00\x36\x85\x8E\x40\x57\x0B\x64\x1B\x1B\x77\x1C\x9C\x03\x54\x67\x81\x47\x11\x18\x63\x07\x11\x4D\x6E\x6E\x26\x19\x1B\x19\x7E\x63\x68\x50\x90\x02\x40\x63\x10\x1C\x70\x04\x57\x9F\x54\x55\x45\x51\xA3\x9E\x70\x39\x6D\x18\x1C\x72\x09\x43\x1D\x19\x64\x14\x03\x56\xA3\x62\x46\x68\x62\x62\x6E\x3B\x4B\x41\x43\x65\x2E\x03\x18\x9F\x78\x81\x4D\x87\x40\x1D\xB7\x55\x1A\x66\x46\x44\x62\xA5\x62\x8B\x5D\xA4\x54\xA0\x02\x4E\x1B\x5D\x1B\x61\x2C\x1C\x53\x18\x6C\x35\x13\x4F\x69\x48\x78\xA0\x02\x0B\x2E\x2F\x0C\xAE\xAF\xBD\xAB\x93\x19\x15\x49\x2E\x08\x1A\xAA\x11\x13\x59\xB1\x40\x08\x66\x1D\x57\x7C\xF5\x73\xA5\xAF\x4C\x39\x13\x55\xB5\x40\xBF\x99\xBD\xAD\xB3\xCF\xB4\x75\x4B\x0B\x54\x39\x10\x4E\x4B\x73\x3A\x89\x18\x1C\x96\x62\x4F\x0B\x11\x75\x29\x1C\xB6\x7C\xDE\xAE\x10\x15\xAD\x67\x0B\x66\xB2\xAA\x69\x85\x59\xBF\x14\x97\x8E\x46\x13\x80\x33\x72\x1E\x96\x40\x38\xBD\xB5\x1A\x5F\x0B\x13\x59\xC1\x40\x50\x09\xAA\x5F\xA1\x69\x1D\x54\x1A\x9D\x1E\xAF\x56\xC5\x5C\x73\x75\x52\xA9\x5E\x7B\x64\x14\x13\xC5\x45\x70\x50\x00\x45\x87\x73\x14\xA6\x0E\x3A\x14\x18\x19\x19\x1A\x58\x03\x56\xCB\x01\x64\xCB\x1A\xC9\x8B\x68\xC3\x65\x65\x25\x6A\x57\xA3\x5C\xBB\x5A\x03\x56\xCF\x31\xD2\xA4\xCE\x1B\x28\xC3\x1B\xCB\x18\x6B\x0E\x98\x1E\xCE\x70\x3C\xC5\x19\x07\x53\x50\xD1\xD1\xC9\x27\xFA\x02\x17\x44\x24\x77\xC6\x66\x1B\x4C\xCE\xDF\x07\x54\x5F\xD3\xD3\xCD\xD5\xAF\x60\x64\x1C\x13\x44\xAB\x6D\xD5\x45\x65\x21\x03\x56\xDB\x62\xC3\xD8\xC9\xD9\xB1\x6A\x5C\x5A\xD2\x6B\xFB\x60\x0B\x54\x7B\xF1\xD4\xD8\x59\xB0\x61\x66\x16\x4D\x77\x21\x49\xDD\x19\x25\x13\x59\xE2\xDF\x35\xFA\x06\xD2\x7C\x6B\x09\x1B\x6D\x1B\x42\x2C\x9B\x1B\x19\x3B\xB5\x12\x4F\xE1\x40\xC5\x5D\xE6\xCC\x72\xCE\xEF\x19\x1B\x32\xB8\xDC\xC9\xD3\x6C\xE4\x03\x56\xEA\x8C\xC4\xDA\x0D\x11\x78\x30\x11\x1A\x4C\x8B\x67\x1E\x4A\x5E\x72\x15\x4B\x5F\xE1\x7D\xC5\x5D\xEC\xE8\x55\xD2\xEC\xC9\xE5\x48\xD8\xEB\x43\xE6\xA7\xCE\xD6\x0B\x54\xCB\xED\xE8\xC8\x88\x4E\x43\xE5\x1B\x1D\xB9\x75\xAD\x1A\x1B\x48\x25\x13\x46\xE1\xC9\xEC\xDD\xE7\x40\x9F\xC2\xD5\xD4\xF4\x74\x12\xF7\x1C\xE7\x3F\xC2\x40\xF1\xE3\x76\xE7\xD1\x88\x1D\xE8\xC8\x51\xF8\xD5\xEC\xC9\xA5\x1A\xF9\x87\xDC\x03\x56\xFE\xCE\xFA\x05\x63\x6E\x50\x09\x0C\xD2\x5C\x7B\x66\xEF\x69\x7D\x7F\x47\x19\x70\x1C\x26\x75\x81\xDD\x17\x03\x2A\x0F\x9D\x7C\xDA\x62\x0A\x6D\xEE\x7B\x32\x6A\x45\x38\x83\xFA\x2E\x73\x0A\x34\x3B\x2C\x0E\x9E\x34\x0F\x12\x65\x09\x0F\xC3\x62\x03\x2A\x27\x9D\x7F\x8B\x31\x45\x25\x29\x0D\x69\x0D\x74\x01\x09\x7E\x64\x47\x71\xB0\x45\x2E\x86\x1B\x88\x67\x0A\xB2\x4E\x0C\xAD\x65\x23", + "\x0E\x87\x6D\x07\x54\x42\x8A\x84\x18\x7C\x83\x4D\x6C\x1D\x2A\x1C\x79\x04\x09\x1D\x70\x0B\x4C\x77\x1D\x84\x65\x5B\x67\x71\x13\x13\x2E\x8A\x45\x8C\x86\x1B\x48\x8A\x89\x3C\x02\x7D\x0D\xE4\x75\x84\xD8\x6A\x72\x7D\xC6\x7B\x85\x24\x5C\x81\x25\x09\x96\x85\x0D\x14\x13\x2E\x8D\x59\x87\x8A\x02\xB0\x72\x76\x99\x3E\x84\x6B\x6C\x90\x6D\x51\x7A\x89\x86\xAB\x46\x88\x8D\x0A\x90\x22\x1B\x75\x07\x70\x0C\x83\x22\x83\x65\x8E\x77\x19\xDB\x8A\x81\xC3\x7A\x8B\x20\x7C\x89\x92\x0E\xFF\x8E\x0D\x24\x3A\x2E\x0D\x13\x95\x81\x03\xE5\x03\x05\xA9\x1D\x91\x8E\x25\x28\x6E\x1C\x67\x05\x0D\x3B\x87\x73\x05\x53\x28\x94\x28\x98\x96\x30\x52\x8D\x8F\x0D\x4F\x84\x4E\x14\xB8\x68\x8F\x4D\xA8\x03\x2A\xB7\x8B\x96\x28\xA4\x9E\x84\xD6\x0D\x4B\x8A\x39\x6C\x8F\x27\xC5\x23\x99\x3E\x8B\x93\x0A\xB0\x49\x8A\x29\xEC\x8A\x95\xA2\x0D\x9E\x98\x94\x88\x99\xAC\x6C\x0F\x95\x58\x91\x8B\x99\x9B\x8D\x79\x51\x5A\x90\x9A\x2D\x92\x99\x89\x96\x81\x95\xDA\x6C\x07\x71\x5C\x85\x2E\x9C\xDD\x9C\x87\x37\xEC\x0D\x96\x18\x98\x98\x75\xBB\x38\x89\x51\x72\x99\x9D\x9C\x57\x4C\x0D\x59\x47\x5D\xF6\x5B\x72\x0F\xC3\x4B\x75\x28\xFF\x95\x9C\xD7\x77\x99\x9E\x38\x02\x94\x90\x6C\x89\x85\x51\x0A\xA2\xA0\x2A\x04\xA4\x0E\x5A\x40\x88\x1B\xAC\x75\x28\x8A\xBD\x8E\x49\x38\x6D\x0D\x8E\x3B\x4A\x98\x60\xB5\x90\x9E\x65\x16\x87\x40\x38\x82\x92\x1D\x08\x0B\xA3\x3C\x48\x0B\xEC\x64\x0D\x2B\xC3\x59\x03\x2A\x2F\xBD\x7F\x49\xBA\x4C\x47\xF8\x5E\x74\x8C\xF4\x6E\x74\x12\x54\x09\x77\x01\xBD\x99\xA1\x28\x98\xA7\xD8\x0D\x7C\x09\x32\x26\x0C\x0E\x28\xBD\xA0\x2D\x85\x91\x6A\xA1\xA1\x75\x61\x6F\x18\x72\xA2\x15\x7F\xA7\x4D\x83\x9B\x20\xC5\x85\xA7\x8B\x67\x08\x0C\xA4\xB4\xA2\xA9\x54\x8C\x8C\xFF\x45\x23\xAD\x3E\x89\xAC\x0D\xF8\x79\x8F\xDB\x4E\xA5\x6A\x87\xB0\x0F\xAC\xEF\x9E\x6B\x18\xFD\x76\x0B\xB3\xAA\xA2\x26\x2D\xAC\x8D\x4C\xC5\x2B\xAF\x3E\xB5\xAF\xAB\xE4\x8C\x8F\xF7\x02\x23\x7F\xA1\xAE\x76\x0A\x3C\xB6\x70\x01\xA0\xAF\x90\x81\x11\x91\xA7\x28\x63\x4A\x18\x7B\x91\x61\xB8\xAC\x6B\x03\x53\x38\xB1\xFF\x12\xB4\xB3\xC5\x8E\x6D\x02\x53\x20\xB7\x66\xC4\x46\x85\xA0\xBD\x7D\x09\xCE\x34\x3C\x6B\x6E\x05\x0D\xF6\x4C\x80\xA4\x57\xA2\x21\x56\x90\xBA\x07\x29\x35\x75\x2B\xAB\xAD\xB4\x93\x2F\xB2\xAE\xA4\x24\xA4\xB6\x07\xB4\xAA\x65\xFA\x6C\x6E\xB6\x8D\x77\xA0\x5F\x83\xB9\x19\x1E\x03\x2A\xE6\xA7\xB1\x26\x75\x0D\x9D\x65\x1E\xBC\x6D\x7F\x83\x21\xA0\x25\xAE\xA0\x96\x10\xA7\x5C\xE9\xB2\x83\x47\xE7\x6A\xAC\x52\x0F\xB6\xB1\xC8\x8F\xA2\x4B\xCA\xB0\x8D\x51\x6A\xBD\x8E\xED\xB8\x9C\xBB\x70\x15\x98\x14\xB3\x91\xAD\x4D\xA2\xA2\x20\xBF\xA5\xBD\xCA\x67\xB7\x5D\x83\x87\x72\x9B\x03\x3C\x99\x76\xFC\xBF\xAD\x17\xBF\x93\xA9\xC2\x9E\x92\x71\xAE\x7E\xBD\x82\x92\xBB\x37\x55\xA0\xA6\x66\xC5\x23\xC3\xF6\x84\xC2\x8C\xBE\xAB\xC1\xD1\x75\x0E\x29\xD1\x70\x48\xA2\x03\x4E\xA4\x4C\x9A\xCB\xBF\x01\x74\x38\x0E\x87\x70\x65\x51\x2A\xCD\x8F\x30\x72\x24\x86\x6C\x9E\x2C", }; class DarkSkinResourceLoaderPlugin : public Object, public IGuiPlugin @@ -29317,8 +29320,7 @@ namespace vl MemoryStream resourceStream; DarkSkinResourceReader::ReadToStream(resourceStream); resourceStream.SeekFromBegin(0); - auto resource = GuiResource::LoadPrecompiledBinary(resourceStream, errors); - GetResourceManager()->SetResource(L"DarkSkin", resource, GuiResourceUsage::InstanceClass); + GetResourceManager()->LoadResourceOrPending(resourceStream, GuiResourceUsage::InstanceClass); } void Unload()override diff --git a/Import/VlppWorkflowCompiler.cpp b/Import/VlppWorkflowCompiler.cpp index 0ce842bb..336832ed 100644 --- a/Import/VlppWorkflowCompiler.cpp +++ b/Import/VlppWorkflowCompiler.cpp @@ -28683,7 +28683,10 @@ ValidateStructure(Expression) void Visit(WfVirtualCfeExpression* node)override { - ValidateExpressionStructure(manager, context, node->expandedExpression); + if (node->expandedExpression) + { + ValidateExpressionStructure(manager, context, node->expandedExpression); + } } void Visit(WfVirtualCseExpression* node)override diff --git a/Tutorial/GacUI_ControlTemplate/UIRes/BlackSkin.bin b/Tutorial/GacUI_ControlTemplate/UIRes/BlackSkin.bin index 585371f4..84970315 100644 Binary files a/Tutorial/GacUI_ControlTemplate/UIRes/BlackSkin.bin and b/Tutorial/GacUI_ControlTemplate/UIRes/BlackSkin.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin index 0976e49a..60a346ff 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin and b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/Animation.bin b/Tutorial/GacUI_Controls/UIRes/Animation.bin index b07616d0..2aae218e 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/Animation.bin and b/Tutorial/GacUI_Controls/UIRes/Animation.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/CalculatorAndStateMachine.bin b/Tutorial/GacUI_Controls/UIRes/CalculatorAndStateMachine.bin index 760e1210..bba8a929 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/CalculatorAndStateMachine.bin and b/Tutorial/GacUI_Controls/UIRes/CalculatorAndStateMachine.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/ColorPicker.bin b/Tutorial/GacUI_Controls/UIRes/ColorPicker.bin index 3a846d86..d2d1c645 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/ColorPicker.bin and b/Tutorial/GacUI_Controls/UIRes/ColorPicker.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/ContainersAndButtons.bin b/Tutorial/GacUI_Controls/UIRes/ContainersAndButtons.bin index 115e982a..c146a0c6 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/ContainersAndButtons.bin and b/Tutorial/GacUI_Controls/UIRes/ContainersAndButtons.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/DataGrid.bin b/Tutorial/GacUI_Controls/UIRes/DataGrid.bin index aa847663..18425ede 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/DataGrid.bin and b/Tutorial/GacUI_Controls/UIRes/DataGrid.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/DocumentEditor.bin b/Tutorial/GacUI_Controls/UIRes/DocumentEditor.bin index a148b376..8bbc2b33 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/DocumentEditor.bin and b/Tutorial/GacUI_Controls/UIRes/DocumentEditor.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/ListControls.bin b/Tutorial/GacUI_Controls/UIRes/ListControls.bin index fb1d9885..468de135 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/ListControls.bin and b/Tutorial/GacUI_Controls/UIRes/ListControls.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/Localization.bin b/Tutorial/GacUI_Controls/UIRes/Localization.bin index fe59eea3..f6c79908 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/Localization.bin and b/Tutorial/GacUI_Controls/UIRes/Localization.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/MenuVisibility.bin b/Tutorial/GacUI_Controls/UIRes/MenuVisibility.bin index bccf6d52..66fefd93 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/MenuVisibility.bin and b/Tutorial/GacUI_Controls/UIRes/MenuVisibility.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/ProgressAndAsync.bin b/Tutorial/GacUI_Controls/UIRes/ProgressAndAsync.bin index 683e9c15..528e887e 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/ProgressAndAsync.bin and b/Tutorial/GacUI_Controls/UIRes/ProgressAndAsync.bin differ diff --git a/Tutorial/GacUI_Controls/UIRes/TextEditor.bin b/Tutorial/GacUI_Controls/UIRes/TextEditor.bin index f22db01b..c6f7834c 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/TextEditor.bin and b/Tutorial/GacUI_Controls/UIRes/TextEditor.bin differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/CppXml.bin b/Tutorial/GacUI_HelloWorlds/UIRes/CppXml.bin index 90542b3a..b8e87f18 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/CppXml.bin and b/Tutorial/GacUI_HelloWorlds/UIRes/CppXml.bin differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin b/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin index d52ece19..b47af66e 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin and b/Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 index fb0ea328..c5ea4c78 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 and b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 index 2d58858e..131a93b2 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 and b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 differ diff --git a/Tutorial/GacUI_Layout/UIRes/Alignment.bin b/Tutorial/GacUI_Layout/UIRes/Alignment.bin index e65d94a6..24dda70f 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Alignment.bin and b/Tutorial/GacUI_Layout/UIRes/Alignment.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/Flow.bin b/Tutorial/GacUI_Layout/UIRes/Flow.bin index 45bbf960..aa65a757 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Flow.bin and b/Tutorial/GacUI_Layout/UIRes/Flow.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/Responsive1.bin b/Tutorial/GacUI_Layout/UIRes/Responsive1.bin index d90886aa..9667b0d7 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Responsive1.bin and b/Tutorial/GacUI_Layout/UIRes/Responsive1.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/Responsive2.bin b/Tutorial/GacUI_Layout/UIRes/Responsive2.bin index ffe7d05d..083d6f34 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Responsive2.bin and b/Tutorial/GacUI_Layout/UIRes/Responsive2.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/RichTextEmbedding.bin b/Tutorial/GacUI_Layout/UIRes/RichTextEmbedding.bin index b990c647..757807e7 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/RichTextEmbedding.bin and b/Tutorial/GacUI_Layout/UIRes/RichTextEmbedding.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/Stack.bin b/Tutorial/GacUI_Layout/UIRes/Stack.bin index 92346590..a4856292 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Stack.bin and b/Tutorial/GacUI_Layout/UIRes/Stack.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/Table.bin b/Tutorial/GacUI_Layout/UIRes/Table.bin index 84b27dcc..77bc6891 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/Table.bin and b/Tutorial/GacUI_Layout/UIRes/Table.bin differ diff --git a/Tutorial/GacUI_Layout/UIRes/TableSplitter.bin b/Tutorial/GacUI_Layout/UIRes/TableSplitter.bin index 4c019d22..7ac5f2b3 100644 Binary files a/Tutorial/GacUI_Layout/UIRes/TableSplitter.bin and b/Tutorial/GacUI_Layout/UIRes/TableSplitter.bin differ diff --git a/Tutorial/GacUI_Windows/UIRes/Direct2DClock.bin b/Tutorial/GacUI_Windows/UIRes/Direct2DClock.bin index b7b654f0..ee08c41e 100644 Binary files a/Tutorial/GacUI_Windows/UIRes/Direct2DClock.bin and b/Tutorial/GacUI_Windows/UIRes/Direct2DClock.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Binding_Bind.bin b/Tutorial/GacUI_Xml/UIRes/Binding_Bind.bin index f8ebf6aa..dccc47ec 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Binding_Bind.bin and b/Tutorial/GacUI_Xml/UIRes/Binding_Bind.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Binding_Eval.bin b/Tutorial/GacUI_Xml/UIRes/Binding_Eval.bin index da756989..8ec5c9c6 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Binding_Eval.bin and b/Tutorial/GacUI_Xml/UIRes/Binding_Eval.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Binding_Format.bin b/Tutorial/GacUI_Xml/UIRes/Binding_Format.bin index b5289acd..ebb99cd4 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Binding_Format.bin and b/Tutorial/GacUI_Xml/UIRes/Binding_Format.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Binding_Uri.bin b/Tutorial/GacUI_Xml/UIRes/Binding_Uri.bin index 82b7071c..d947def2 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Binding_Uri.bin and b/Tutorial/GacUI_Xml/UIRes/Binding_Uri.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Binding_ViewModel.bin b/Tutorial/GacUI_Xml/UIRes/Binding_ViewModel.bin index 7ee9fc10..ce7c3b23 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Binding_ViewModel.bin and b/Tutorial/GacUI_Xml/UIRes/Binding_ViewModel.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Event_Cpp.bin b/Tutorial/GacUI_Xml/UIRes/Event_Cpp.bin index 1f9e95da..7e23483b 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Event_Cpp.bin and b/Tutorial/GacUI_Xml/UIRes/Event_Cpp.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Event_Script.bin b/Tutorial/GacUI_Xml/UIRes/Event_Script.bin index fd4e814e..2e2466e7 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Event_Script.bin and b/Tutorial/GacUI_Xml/UIRes/Event_Script.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Event_ViewModel.bin b/Tutorial/GacUI_Xml/UIRes/Event_ViewModel.bin index 1ce1a438..c7178a1d 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Event_ViewModel.bin and b/Tutorial/GacUI_Xml/UIRes/Event_ViewModel.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Instance_Control.bin b/Tutorial/GacUI_Xml/UIRes/Instance_Control.bin index 7476155c..47bd9a87 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Instance_Control.bin and b/Tutorial/GacUI_Xml/UIRes/Instance_Control.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Instance_MultipleWindows.bin b/Tutorial/GacUI_Xml/UIRes/Instance_MultipleWindows.bin index c79f4912..3178d6d0 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Instance_MultipleWindows.bin and b/Tutorial/GacUI_Xml/UIRes/Instance_MultipleWindows.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Instance_Window.bin b/Tutorial/GacUI_Xml/UIRes/Instance_Window.bin index 83089370..82e9f901 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Instance_Window.bin and b/Tutorial/GacUI_Xml/UIRes/Instance_Window.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Member_Field.bin b/Tutorial/GacUI_Xml/UIRes/Member_Field.bin index 2cfcde0e..015eb177 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Member_Field.bin and b/Tutorial/GacUI_Xml/UIRes/Member_Field.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Member_Parameter.bin b/Tutorial/GacUI_Xml/UIRes/Member_Parameter.bin index 5e5e3dba..56a9f418 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Member_Parameter.bin and b/Tutorial/GacUI_Xml/UIRes/Member_Parameter.bin differ diff --git a/Tutorial/GacUI_Xml/UIRes/Member_Property.bin b/Tutorial/GacUI_Xml/UIRes/Member_Property.bin index b8b038b9..d4799da0 100644 Binary files a/Tutorial/GacUI_Xml/UIRes/Member_Property.bin and b/Tutorial/GacUI_Xml/UIRes/Member_Property.bin differ