My TreeControl buttons aren't working

goishin

19-04-2013 15:19:12

Hi guys,
I was wondering if someone could point me in the right direction. My tree control expander buttons aren't working, and I'm having trouble figuring out why. It looks like most of using the tree control is pretty simple, and almost everything in the tree control works, but I've borked something up. I can get my nodes to expand by clicking on the word in the tree control item. It's just the plus signs next to the items that don't seem to be registering events. When I click on them, they do change color, they just don't expand. Any ideas?

Here is my header file for the implementation

ATTRIBUTE_CLASS_LAYOUT(ManagersPanel, "ObjectBrowser.layout");
class ManagersPanel :
public wraps::BaseLayout, public GuiControls::Menu
{
public:
ManagersPanel( Ogre::String Name, MyGUI::Widget* _parent = nullptr);
virtual ~ManagersPanel();

MyGUI::Widget* GetWidget(){ return mMainWidget; }
virtual void AddDelegates();
bool MessageHandler( Events::Message& message );

//buttons callbacks
void notifyCreateActorButtonClick( MyGUI::Widget* sender );
void notifyRemoveActorButtonClick( MyGUI::Widget* sender );
void notifyCreateArchetypeButtonClick( MyGUI::Widget* sender );
void notifyRemoveArchetypeButtonClick( MyGUI::Widget* sender );
void notifyCreateResourceButtonClick( MyGUI::Widget* sender );
void notifyRemoveResourceButtonClick( MyGUI::Widget* sender );
void notifyCreatePropertyButtonClick( MyGUI::Widget* sender );
void notifyRemovePropertyButtonClick( MyGUI::Widget* sender );

//actors tree control stuff
void notifyActorsTreeNodePrepare(MyGUI::TreeControl* pTreeControl, MyGUI::TreeControl::Node* pNode);
void notifyWindowPressed(MyGUI::Window* _widget, const std::string& _name);
void setActorsDataSource( std::vector< Actors::actor* >* actors ){ mActorsDataSource = actors; }
void notifyActorsTreeNodeActivated(MyGUI::TreeControl* pTreeControl, MyGUI::TreeControl::Node* pNode);
void ActorsRebuildTree();
void Update( const Ogre::FrameEvent& evt );

private:
//%LE Widget_Declaration list start
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mCreateActorButtonButton, "CreateActorButton");
MyGUI::Button* mCreateActorButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mRemoveActorButtonButton, "RemoveActorButton");
MyGUI::Button* mRemoveActorButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mCreateArchetypeButtonButton, "CreateArchetypeButton");
MyGUI::Button* mCreateArchetypeButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mRemoveArchetypeButtonButton, "RemoveArchetypeButton");
MyGUI::Button* mRemoveArchetypeButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mCreateResourceButtonButton, "CreateResourceButton");
MyGUI::Button* mCreateResourceButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mRemoveResourceButtonButton, "RemoveResourceButton");
MyGUI::Button* mRemoveResourceButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mCreatePropertyButtonButton, "CreatePropertyButton");
MyGUI::Button* mCreatePropertyButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mRemovePropertyButtonButton, "RemovePropertyButton");
MyGUI::Button* mRemovePropertyButtonButton;
ATTRIBUTE_FIELD_WIDGET_NAME(ManagersPanel, mActorsTreeControl, "ActorTreeControl");
MyGUI::TreeControl* mActorsTreeControl;
//%LE Widget_Declaration list end

std::vector< Actors::actor* >* mActorsDataSource;

PropertiesPanel propertiesPanel;
};



And then the implementation

ManagersPanel::ManagersPanel(Ogre::String Name, MyGUI::Widget* _parent):
GuiControls::Menu( Name ), mActorsDataSource( nullptr ), propertiesPanel( "PropertiesPanel" )
{
initialiseByAttributes(this, _parent);
assignWidget(mActorsTreeControl, "ActorTreeControl");
AddDelegates();
ActorsRebuildTree();
}

void ManagersPanel::AddDelegates()
{
//add panel delegates
MyGUI::Widget* widget = GetWidget();

//add button delegates
mCreateActorButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyCreateActorButtonClick );
mRemoveActorButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyRemoveActorButtonClick );
mCreateArchetypeButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyCreateArchetypeButtonClick );
mRemoveArchetypeButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyRemoveArchetypeButtonClick );
mCreateResourceButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyCreateResourceButtonClick );
mRemoveResourceButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyRemoveResourceButtonClick );
mCreatePropertyButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyCreatePropertyButtonClick );
mRemovePropertyButtonButton->eventMouseButtonClick += MyGUI::newDelegate( this, &ManagersPanel::notifyRemovePropertyButtonClick );

//add tree control delegates
mActorsTreeControl->eventTreeNodePrepare += MyGUI::newDelegate( this, &ManagersPanel::notifyActorsTreeNodePrepare );
mActorsTreeControl->eventTreeNodeActivated += MyGUI::newDelegate( this, &ManagersPanel::notifyActorsTreeNodeActivated );

//add window control delegates
MyGUI::Window* windowwidget = widget->castType<MyGUI::Window>();
windowwidget->eventWindowButtonPressed += MyGUI::newDelegate( this, &ManagersPanel::notifyWindowPressed);
}

void ManagersPanel::ActorsRebuildTree()
{
printf( "Entered %s\n", __FUNCTION__ );

MyGUI::TreeControl::Node* pRoot = mActorsTreeControl->getRoot();
if( mActorsDataSource != nullptr )
{
for (auto item = mActorsDataSource->begin(); item != mActorsDataSource->end(); ++item)
{
MyGUI::TreeControl::Node* pNode = new MyGUI::TreeControl::Node((*item)->GetName()/*, "Data"*/);
pNode->setData( (*item)->GetMyAddress() );
pRoot->add(pNode);
}
}
}

void ManagersPanel::notifyActorsTreeNodePrepare(MyGUI::TreeControl* pTreeControl, MyGUI::TreeControl::Node* pNode)
{
if ( pNode == pTreeControl->getRoot() )
return;

pNode->removeAll();
Events::MessageAddress* pNodeAddress = pNode->getData<Events::MessageAddress>();
if( pNodeAddress != 0 )
{
Actors::actor* child = static_cast<Actors::actor*>( TheEventManager->GetReceiver( *pNodeAddress ) );
if( child )
{
auto iter = child->GetChildActors().begin();
while ( iter != child->GetChildActors().end() )
{
Ogre::String name = (*iter)->GetName();
if( name == Ogre::String("") )
{
name = Ogre::String("No Name");
}
MyGUI::TreeControl::Node* pTemp = new MyGUI::TreeControl::Node( name, /*"Folder", */pNode);
Events::MessageAddress& addr = (*iter)->GetMyAddress();
pTemp->setData( addr );
iter++;
}
}
}
}

void ManagersPanel::notifyActorsTreeNodeActivated(MyGUI::TreeControl* pTreeControl, MyGUI::TreeControl::Node* pNode)
{
printf( "%s\n", __FUNCTION__ );
pTreeControl->setSelection( pNode );

Events::MessageAddress* pNodeAddress = pNode->getData<Events::MessageAddress>();
if( pNodeAddress != 0 )
{
Actors::actor* child = static_cast<Actors::actor*>( TheEventManager->GetReceiver( *pNodeAddress ) );
if( child )
{
printf( "activating %s \n", child->GetName().c_str() );
propertiesPanel.Activate( child );
MyGUI::IntCoord coordinates( propertiesPanel.GetWidget()->getCoord() );
MyGUI::IntCoord parentcoord( GetWidget()->getCoord() );
coordinates.left = parentcoord.left + parentcoord.width;
coordinates.top = parentcoord.top;
propertiesPanel.GetWidget()->setCoord( coordinates );
}
}
}

goishin

20-04-2013 00:55:16

I figured it out :)

MyGUI does everything for me. It's great about that. Provided, of course, I give it everything it needs. And I wasn't injecting mouse input properly. Sorry about that :/