GCallbackEvent->Send(CALLBACK_ObjectPropertyChanged, Obj);
不過有兩個問題:
- 如果第二個參數傳入NULL,那整個屬性視窗樹都會重建(請參考WxPropertyWindow::Rebuild()),這個動作可能會很慢。
- 如果指定物件,WxPropertyWindow::Rebuild()只會檢查指定物件是否在第一層才更新(請參考WxPropertyWindow::ContainsObject())。但如是是第一層以下的子物件才擁被修改的屬性,那麼將不會更新視窗。
只更新單一屬性
當編輯器要提供高頻率更新的操作時(例如使用滑鼠滾輪變更屬性值),使用CALLBACK_ObjectPropertyChanged通知可能會拖慢更新速度。所以自行撰寫只更新指定屬性的程式會比較好。以下程式可以只更新指定物件的指定屬性
void UpdatePropertyControl(WxPropertyWindowHost* PropertyWindowHost, UObject* Object, FString PropertyName)
{
WxPropertyWindow* Window = PropertyWindowHost->GetPropertyWindowForCallbacks();
FObjectPropertyNode* Root = Window->GetRoot();
if( FObjectPropertyNode* ObjectNode = FindPropertyNodeByObject(Root, Objmect) )
{
if( FPropertyNode* Node = ObjectNode->FindPropertyNode(PropertyName) )
{
UpdatePropertyNodeSubtree( Node );
}
}
}
void FObjectPropertyNode* FindPropertyNodeByObject(FPropertyNode* Node, UObject Object)
{
FObjectPropertyNode* ObjectNode = dynamic_cast<FObjectPropertyNode*>( Node );
if( ObjectNode )
{
for( FObjectPropertyNode::TObjectIterator i = ObjectNode->ObjectIterator(); i; i++)
{
if( *i = Object )
{
return ObjectNode;
}
}
}
for(INT i=0; i<Node->GetNumCHildNodes(); i++)
{
FObjectPropertyNode* Child = FindPropertyNodeByObject( Node->GetChildNode(i), Object );
if( Child )
{
return Child;
}
}
return NULL;
}
void UpdatePropertyNodeSubtree(FPropertyNode* Node)
{
for(INT i=0; i<Node->GetNumChildNodes(); i++)
{
FPropertyNode* Child = Node->GetChildNode(i);
UpdatePropertyNodeSubtree( Child );
}
UpdatePropertyNode( Node );
}
void UpdatePropertyNode(FPropertyNode* Node)
{
FObjectPropertyNode* ObjectNode = Node->FindObjectItemParent();
if( ObjectNode && ObjectNode->GetNumObjects() )
{
UPropertyInputProxy* InputProxy = Node->GetNodeWindow()->InputProxy;
if( InputProxy )
{
BYTE* Value = (BYTE*) Node->GetValueBaseAddress( (BYTE*) ObjectNode->GetObject(0) );
if( UPropertyInputRotation* RotationProxy = Cast<UPropertyInputRotation>(InputProxy) )
{
if( RotationProxy->TextCtrl )
{
INT UnrRot = *((INT*) Value);
RotationProxy->TextCtrl->SetValue( *MakeRotationText(UnrRot) );
RotationProxy->Equation = appItoa(UnrRot);
}
}
else
{
InputProxy->RefreshControlValue( Node->GetProperty(), Value );
}
}
}
}
FString MakeRotationText(INT UnrRot)
{
FLOAT Degree = 360.f * (UnrRot / 65536.f);
if( Abs(Degree) > 359.f )
{
INT Revolutions = Degree / 360.f;
Degree -= Revolutins * 360;
return FString::Printf( TEXT("%.2f%c %s %d"), Degree, 176, (Revolutions<0) ? TEXT("-") : TEXT("+"), Abs(Revolutions) );
}
else
{
return FString::Printf( TEXT("%.2f%c"), Degree, 176 );
}
}
沒有留言:
張貼留言