#include "ortooluserdata_tool.h"
#define ORTOOLUSERDATA__CLASS ORTOOLUSERDATA__CLASSNAME
#define ORTOOLUSERDATA__LABEL "User Data"
#define ORTOOLUSERDATA__DESC "OR - User Data Tool Description"
ORTOOLUSERDATA__LABEL,
ORTOOLUSERDATA__DESC,
bool ORToolUserData::FBCreate()
{
StartSize[0] = 400;
StartSize[1] = 280;
mUserId = 99;
UICreate ();
UIConfigure ();
return true;
}
void ORToolUserData::FBDestroy()
{
mSystem.OnUIIdle.Remove(
this, (
FBCallback) &ORToolUserData::EventIdleAnim );
mSystem.OnConnectionStateNotify.Remove(
this, (
FBCallback) &ORToolUserData::ConnectionStateNotify);
}
void ORToolUserData::UICreate()
{
int lS = 4;
AddRegion("LabelDirections","LabelDirections",
AddRegion("TabPanel","TabPanel",
AddRegion("Layout", "Layout",
SetControl( "LabelDirections", mLabelDirections );
SetControl( "TabPanel", mTabPanel );
SetControl( "Layout", mLayoutNodes );
UICreateLayoutNodes();
UICreateLayoutRemove();
UICreateLayoutExtras();
}
void ORToolUserData::UICreateLayoutNodes()
{
int lH = 18;
int lS = 4;
mLayoutNodes.AddRegion( "LabelDirectionsNodes", "LabelDirectionsNodes",
mLayoutNodes.AddRegion( "ButtonAddToSelected", "ButtonAddToSelected",
mLayoutNodes.AddRegion( "LabelId", "LabelId",
mLayoutNodes.AddRegion( "LabelName", "LabelName",
mLayoutNodes.AddRegion( "LabelType", "LabelType",
mLayoutNodes.AddRegion( "EditNumberUserId1", "EditNumberUserId1",
mLayoutNodes.AddRegion( "EditName1", "EditName1",
mLayoutNodes.AddRegion( "ListType1", "ListType1",
mLayoutNodes.SetControl( "LabelDirectionsNodes", mLabelDirectionsNodes );
mLayoutNodes.SetControl( "LabelId", mLabelId );
mLayoutNodes.SetControl( "LabelName", mLabelName );
mLayoutNodes.SetControl( "LabelType", mLabelType );
mLayoutNodes.SetControl( "ButtonAddToSelected", mButtonAddToSelected );
mLayoutNodes.SetControl( "EditNumberUserId1", mEditNumberUserId );
mLayoutNodes.SetControl( "EditName1", mEditName );
mLayoutNodes.SetControl( "ListType1", mListType );
}
void ORToolUserData::UICreateLayoutRemove()
{
int lS = 4;
int lH = 23;
mLayoutRemove.AddRegion( "LabelDirectionsRemove", "LabelDirectionsRemove",
mLayoutRemove.AddRegion( "ContainerModel", "ContainerModel",
mLayoutRemove.AddRegion( "ButtonRemoveNodes", "ButtonRemoveNodes",
mLayoutRemove.AddRegion( "ListUserNodes", "ListUserNodes",
mLayoutRemove.SetControl( "LabelDirectionsRemove", mLabelDirectionsRemove );
mLayoutRemove.SetControl( "ButtonRemoveNodes", mButtonRemoveNodes );
mLayoutRemove.SetControl( "ContainerModel", mContainerModel );
mLayoutRemove.SetControl( "ListUserNodes", mListUserNodes );
}
void ORToolUserData::UICreateLayoutExtras()
{
int lS=4;
int lH=18;
int lW=150;
mLayoutExtras.AddRegion( "LabelDirectionsExtras", "LabelDirectionsExtras",
mLayoutExtras.AddRegion( "ButtonJLCooperTest", "ButtonJLCooperTest",
mLayoutExtras.AddRegion( "ButtonFBXTest", "ButtonFBXTest",
mLayoutExtras.SetControl( "LabelDirectionsExtras", mLabelDirectionsExtras );
mLayoutExtras.SetControl( "ButtonJLCooperTest", mButtonJLCooperTest );
mLayoutExtras.SetControl( "ButtonFBXTest", mButtonFBXTest );
}
void ORToolUserData::UIConfigure()
{
mLabelDirections.Caption = "This tool enables the user to add user-specified connectors to any\n"
"element in the scene. There is also a section for some other sample\n"
"code (loading FBX files, communicating with a JLCooper device, etc..).";
mTabPanel.Items.SetString("Add Custom Properties~Remove Custom Properties~Extras");
mTabPanel.OnChange.Add(
this, (
FBCallback)&ORToolUserData::EventTabPanelChange );
mSystem.OnConnectionStateNotify.Add(
this, (
FBCallback) &ORToolUserData::ConnectionStateNotify);
UIConfigureLayoutNodes();
UIConfigureLayoutRemove();
UIConfigureLayoutExtras();
}
void ORToolUserData::UIConfigureLayoutNodes()
{
mLabelDirectionsNodes.Caption = "1. Select a model in the scene.\n"
"2. Configure the properties to be added.\n"
"3. Click 'add to selected' to add.\n"
"You can see the added properties in a relations constraint";
mButtonAddToSelected.Caption = "Add Properties To Selected";
mLabelId.Caption = "Id";
mLabelName.Caption = "Name";
mLabelType.Caption = "Type";
mEditNumberUserId.Value = 99;
mEditNumberUserId.Precision = 3.0;
mEditNumberUserId.Min = 0;
mEditNumberUserId.Max = 1000;
mEditName.Text = "Custom";
mButtonAddToSelected.OnClick.Add (
this, (
FBCallback) &ORToolUserData::EventButtonAddToSelected );
}
void ORToolUserData::UIConfigureLayoutRemove()
{
mLabelDirectionsRemove.Caption = "1. Drag a model into the container\n"
"2. Select the properties to remove\n"
"3. Double-click the container to unselect";
mButtonRemoveNodes.Caption = "Remove Properties";
mListUserNodes.MultiSelect = true;
mButtonRemoveNodes.OnClick.Add (
this, (
FBCallback) &ORToolUserData::EventButtonRemoveSelectedClick );
mContainerModel.OnDragAndDrop.Add (
this, (
FBCallback) &ORToolUserData::EventContainerModelDragAndDrop );
mContainerModel.OnDblClick.Add (
this, (
FBCallback) &ORToolUserData::EventContainerModelDblClick );
}
void ORToolUserData::UIConfigureLayoutExtras()
{
mLabelDirectionsExtras.Caption = "1. Click on JLCooperTest to send a message to a loaded JLCooper console\n"
"2. Click on FBXTest to open a file using the FBFbxManager class";
mButtonJLCooperTest.Caption = "Send JLCooper Message";
mButtonJLCooperTest.OnClick.Add (
this, (
FBCallback) &ORToolUserData::EventButtonSendMessage );
mButtonFBXTest.Caption = "FBXTest";
mButtonFBXTest.OnClick.Add (
this, (
FBCallback) &ORToolUserData::EventButtonFBXTest );
}
void ORToolUserData::UIReset()
{
}
void ORToolUserData::EventButtonFBXTest(
HISender pSender,
HKEvent pEvent )
{
FBFilePopup lPopup;
lPopup.Caption = "FBX file to load";
FBString lScenesPath( mSystem.ApplicationPath );
lScenesPath += "\\..\\OpenRealitySDK\\Scenes";
lPopup.Path = (char*)lScenesPath;
lPopup.Filter = "*.fbx";
if( lPopup.Execute() )
{
FBApplication::TheOne().FileMerge(lPopup.FullFilename);
}
}
void ORToolUserData::EventButtonSendMessage(
HISender pSender,
HKEvent pEvent )
{
static bool lOn = false;
FBJLCooper lJLCooper;
if( ! lOn )
{
lOn = true;
lJLCooper.LCDClearScreen();
mSystem.OnUIIdle.Add(
this, (
FBCallback)&ORToolUserData::EventIdleAnim );
}
else
{
lOn = false;
mSystem.OnUIIdle.Remove(
this, (
FBCallback)&ORToolUserData::EventIdleAnim );
lJLCooper.LCDClearScreen();
}
}
{
FBJLCooper lJLCooper;
FBTime lTime;
lTime = mSystem.LocalTime;
lJLCooper.LCDSendString( lTime.GetTimeString() );
lJLCooper.TCSetTime( lTime );
}
void ORToolUserData::EventButtonRemoveSelectedClick(
HISender pSender,
HKEvent pEvent )
{
FBProperty* lProperty;
if( mHdlModel.Ok())
{
for( i=0; i< mListUserNodes.Items.GetCount(); i++ )
{
if( mListUserNodes.IsSelected( i ) )
{
lProperty = (FBProperty*) mListUserNodes.Items.GetReferenceAt( i );
mHdlModel->PropertyRemove( lProperty );
}
}
RefreshRemoveNodes();
}
}
void ORToolUserData::RefreshRemoveNodes()
{
mContainerModel.Items.Clear();
mListUserNodes.Items.Clear();
if( !mHdlModel.Ok())
{
return;
}
mContainerModel.Items.Add( mHdlModel->Name, (kReference)mHdlModel() );
for( i=0; i< mHdlModel->PropertyList.GetCount(); i++ )
{
FBProperty* Property = mHdlModel->PropertyList[
i];
if( Property->IsUserProperty() )
{
mListUserNodes.Items.Add( Property->GetName(), (kReference) Property );
}
}
}
void ORToolUserData::EventContainerModelDragAndDrop(
HISender pSender,
HKEvent pEvent )
{
FBEventDragAndDrop lDragAndDrop( pEvent );
switch( lDragAndDrop.State )
{
{
lDragAndDrop.Accept();
}
break;
{
mHdlModel = (FBModel*) lDragAndDrop.Get(0);
RefreshRemoveNodes();
}
break;
}
}
void ORToolUserData::EventContainerModelDblClick(
HISender pSender,
HKEvent pEvent )
{
mContainerModel.Items.Clear();
mListUserNodes.Items.Clear();
}
void ORToolUserData::EventButtonAddToSelected(
HISender pSender,
HKEvent pEvent )
{
FBModel* lRoot = mSystem.SceneRootModel;
mUserId = mEditNumberUserId.Value;
mName = mEditName.Text;
mDataType = mListType.Items[ mListType.ItemIndex ];
mType = (
FBPropertyType)mListType.Items.GetReferenceAt( mListType.ItemIndex );
AddNodesToModel( lRoot );
RefreshRemoveNodes();
}
void ORToolUserData::EventTabPanelChange(
HISender pSender,
HKEvent pEvent )
{
switch( mTabPanel.ItemIndex )
{
case 0: SetControl("Layout", mLayoutNodes ); break;
case 1: SetControl("Layout", mLayoutRemove ); break;
case 2: SetControl("Layout", mLayoutExtras ); break;
}
}
void ORToolUserData::AddNodesToModel( FBModel* pModel, bool pRecursive, bool pSelected )
{
if( ! pSelected || ((bool)pModel->Selected) )
{
FBProperty* lProperty = pModel->PropertyCreate( mName, mType,mDataType, true, true );
if (lProperty->IsAnimatable())
{
FBPropertyAnimatable* lPropertyAnimatable = (FBPropertyAnimatable*)lProperty;
lPropertyAnimatable->SetAnimated( true );
FBAnimationNode* lAnimationNode = lPropertyAnimatable->GetAnimationNode();
if (lAnimationNode)
{
lAnimationNode->Reference = mUserId;
}
}
}
if( pRecursive )
{
for( i=0; i<pModel->Children.GetCount(); i++)
{
AddNodesToModel( pModel->Children[i], pRecursive, pSelected );
}
}
}
{
FBEventConnectionStateNotify lEvent(pEvent);
{
FBPlug* lPlug = lEvent.Plug;
FBModel* lModel = (FBModel*)lPlug;
if( lModel == mHdlModel )
{
mContainerModel.Items.Clear();
mListUserNodes.Items.Clear();
}
}
}