bool MigratePropertyValue(UObject* SourceObject, UProperty* SourceProperty, UObject* DestinationObject, UProperty* DestinationProperty) { FString SourceValue; // Get the property addresses for the source and destination objects. uint8* SourceAddr = SourceProperty->ContainerPtrToValuePtr<uint8>(SourceObject); uint8* DestionationAddr = DestinationProperty->ContainerPtrToValuePtr<uint8>(DestinationObject); if ( SourceAddr == NULL || DestionationAddr == NULL ) { return false; } // Get the current value from the source object. SourceProperty->ExportText_Direct(SourceValue, SourceAddr, SourceAddr, NULL, PPF_Localized); if ( !DestinationObject->HasAnyFlags(RF_ClassDefaultObject) ) { FEditPropertyChain PropertyChain; PropertyChain.AddHead(DestinationProperty); DestinationObject->PreEditChange(PropertyChain); } // Set the value on the destination object. DestinationProperty->ImportText(*SourceValue, DestionationAddr, 0, DestinationObject); if ( !DestinationObject->HasAnyFlags(RF_ClassDefaultObject) ) { FPropertyChangedEvent PropertyEvent(DestinationProperty); DestinationObject->PostEditChangeProperty(PropertyEvent); } return true; }
//命令信息 BOOL CPropertyBar::OnCommand(WPARAM wParam, LPARAM lParam) { //辅助处理 struct DealWithList { WORD wCommandID; UINT uFunctionPar; }CommandList[]= { IDC_BT_FLOWER1, FLOWER_1, IDC_BT_FLOWER2, FLOWER_2, IDC_BT_FLOWER3, FLOWER_3, IDC_BT_FLOWER4, FLOWER_4, IDC_BT_FLOWER5, FLOWER_5, IDC_BT_FLOWER6, FLOWER_6, IDC_BT_FLOWER7, FLOWER_7, IDC_BT_FLOWER8, FLOWER_8, IDC_BT_FLOWER9, FLOWER_9, IDC_BT_FLOWER10, FLOWER_10, IDC_BT_FLOWER11, FLOWER_11, IDC_BT_PROPERTY1, PROP_DOUBLE, IDC_BT_PROPERTY2, PROP_FOURDOLD, IDC_BT_PROPERTY3, PROP_NEGAGIVE, IDC_BT_PROPERTY4, PROP_FLEE, IDC_BT_PROPERTY5, PROP_BUGLE, IDC_BT_PROPERTY6, PROP_KICK, IDC_BT_PROPERTY7, PROP_SHIELD, IDC_BT_PROPERTY8, PROP_MEMBER_1, IDC_BT_PROPERTY9, PROP_MEMBER_2, IDC_BT_PROPERTY10, PROP_MEMBER_3, IDC_BT_PROPERTY11, PROP_MEMBER_4, IDC_BT_PROPERTY12, PROP_MEMBER_5, IDC_BT_PROPERTY13, PROP_MEMBER_6, IDC_BT_PROPERTY14, PROP_MEMBER_7, IDC_BT_PROPERTY15, PROP_MEMBER_7, }; //查找信息 WORD wContorlID = LOWORD(wParam); for(WORD i=0;i<CountArray(CommandList);i++) { if(wContorlID!=CommandList[i].wCommandID)continue; //处理信息 if(i<FLOWER_COUNT)FlowerEvent(CommandList[i].uFunctionPar); else PropertyEvent(CommandList[i].uFunctionPar); return TRUE; } return CDialog::OnCommand(wParam, lParam); }
void FAdvancedPreviewScene::SetEnvironmentVisibility(const bool bVisible, const bool bDirect) { // If not direct set visibility in profile and refresh the scene if (!bDirect) { UProperty* EnvironmentProperty = FindField<UProperty>(FPreviewSceneProfile::StaticStruct(), GET_MEMBER_NAME_CHECKED(FPreviewSceneProfile, bShowEnvironment)); DefaultSettings->Profiles[CurrentProfileIndex].bShowEnvironment = bVisible; FPropertyChangedEvent PropertyEvent(EnvironmentProperty); DefaultSettings->PostEditChangeProperty(PropertyEvent); } else { // Otherwise set visiblity directly on the component SkyComponent->SetVisibility(bVisible ? DefaultSettings->Profiles[CurrentProfileIndex].bShowEnvironment : bVisible); } }
void FAdvancedPreviewScene::SetFloorVisibility(const bool bVisible, const bool bDirect) { // If not direct set visibility in profile and refresh the scene if (!bDirect) { FName PropertyName("bShowFloor"); UProperty* FloorProperty = FindField<UProperty>(FPreviewSceneProfile::StaticStruct(), PropertyName); DefaultSettings->Profiles[CurrentProfileIndex].bShowFloor = bVisible; FPropertyChangedEvent PropertyEvent(FloorProperty); DefaultSettings->PostEditChangeProperty(PropertyEvent); } else { // Otherwise set visiblity directly on the component FloorMeshComponent->SetVisibility(bVisible ? DefaultSettings->Profiles[CurrentProfileIndex].bShowFloor : bVisible); } }
/** * Nulls out references to a given object * * @param InObject - Object to null references to */ void NullReferencesToObject(UObject* InObject) { TArray<UObject*> ReplaceableObjects; TMap<UObject*, UObject*> ReplacementMap; ReplacementMap.Add(InObject, NULL); ReplacementMap.GenerateKeyArray(ReplaceableObjects); // Find all the properties (and their corresponding objects) that refer to any of the objects to be replaced TMap< UObject*, TArray<UProperty*> > ReferencingPropertiesMap; for (FObjectIterator ObjIter; ObjIter; ++ObjIter) { UObject* CurObject = *ObjIter; // Find the referencers of the objects to be replaced FFindReferencersArchive FindRefsArchive(CurObject, ReplaceableObjects); // Inform the object referencing any of the objects to be replaced about the properties that are being forcefully // changed, and store both the object doing the referencing as well as the properties that were changed in a map (so that // we can correctly call PostEditChange later) TMap<UObject*, int32> CurNumReferencesMap; TMultiMap<UObject*, UProperty*> CurReferencingPropertiesMMap; if (FindRefsArchive.GetReferenceCounts(CurNumReferencesMap, CurReferencingPropertiesMMap) > 0) { TArray<UProperty*> CurReferencedProperties; CurReferencingPropertiesMMap.GenerateValueArray(CurReferencedProperties); ReferencingPropertiesMap.Add(CurObject, CurReferencedProperties); for (TArray<UProperty*>::TConstIterator RefPropIter(CurReferencedProperties); RefPropIter; ++RefPropIter) { CurObject->PreEditChange(*RefPropIter); } } } // Iterate over the map of referencing objects/changed properties, forcefully replacing the references and then // alerting the referencing objects the change has completed via PostEditChange int32 NumObjsReplaced = 0; for (TMap< UObject*, TArray<UProperty*> >::TConstIterator MapIter(ReferencingPropertiesMap); MapIter; ++MapIter) { ++NumObjsReplaced; UObject* CurReplaceObj = MapIter.Key(); const TArray<UProperty*>& RefPropArray = MapIter.Value(); FArchiveReplaceObjectRef<UObject> ReplaceAr(CurReplaceObj, ReplacementMap, false, true, false); for (TArray<UProperty*>::TConstIterator RefPropIter(RefPropArray); RefPropIter; ++RefPropIter) { FPropertyChangedEvent PropertyEvent(*RefPropIter); CurReplaceObj->PostEditChangeProperty(PropertyEvent); } if (!CurReplaceObj->HasAnyFlags(RF_Transient) && CurReplaceObj->GetOutermost() != GetTransientPackage()) { if (!CurReplaceObj->RootPackageHasAnyFlags(PKG_CompiledIn)) { CurReplaceObj->MarkPackageDirty(); } } } }
void AActor::SetActorLabelInternal( const FString& NewActorLabelDirty, bool bMakeGloballyUniqueFName, bool bMarkDirty ) { // Clean up the incoming string a bit FString NewActorLabel = NewActorLabelDirty; NewActorLabel.Trim(); NewActorLabel.TrimTrailing(); // First, update the actor label { // Has anything changed? if( FCString::Strcmp( *NewActorLabel, *GetActorLabel() ) != 0 ) { // Store new label Modify( bMarkDirty ); ActorLabel = NewActorLabel; } } // Next, update the actor's name { // Generate an object name for the actor's label const FName OldActorName = GetFName(); FName NewActorName = MakeObjectNameFromDisplayLabel( GetActorLabel(), OldActorName ); // Has anything changed? if( OldActorName != NewActorName ) { // Try to rename the object UObject* NewOuter = NULL; // Outer won't be changing ERenameFlags RenFlags = bMakeGloballyUniqueFName ? (REN_DontCreateRedirectors | REN_ForceGlobalUnique) : REN_DontCreateRedirectors; bool bCanRename = Rename( *NewActorName.ToString(), NewOuter, REN_Test | REN_DoNotDirty | REN_NonTransactional | RenFlags ); if( bCanRename ) { // NOTE: Will assert internally if rename fails const bool bWasRenamed = Rename( *NewActorName.ToString(), NewOuter, RenFlags ); } else { // Unable to rename the object. Use a unique object name variant. NewActorName = MakeUniqueObjectName( bMakeGloballyUniqueFName ? ANY_PACKAGE : GetOuter(), GetClass(), NewActorName ); bCanRename = Rename( *NewActorName.ToString(), NewOuter, REN_Test | REN_DoNotDirty | REN_NonTransactional | RenFlags ); if( bCanRename ) { // NOTE: Will assert internally if rename fails const bool bWasRenamed = Rename( *NewActorName.ToString(), NewOuter, RenFlags ); } else { // Unable to rename the object. Oh well, not a big deal. } } } } FPropertyChangedEvent PropertyEvent( FindField<UProperty>( AActor::StaticClass(), "ActorLabel" ) ); PostEditChangeProperty(PropertyEvent); FCoreDelegates::OnActorLabelChanged.Broadcast(this); }