wxMenu and wxUpdateUIEvent

Patrik Mueller paddi.m at gmx.net
Tue Feb 5 12:25:54 PST 2008


Hi,

I'm a newbie with wxWidgets - so I have a problem:

I have derived a class fromwxMenu (code attached at the end of this 
question. The connection for the selection of a wxMenuItem is ok - but I 
don't receive an update event. Where's my mistake?

Thanks in advance,

Patrik



#pragma once
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "Im_Entity3D.h"

class Im_Entity3DMenu : public wxMenu
{
public:
	void SetEntity(Im_Entity3DPtr theEntity);
	void BuildItems();
	Im_Entity3DMenu();
	virtual ~Im_Entity3DMenu(void);
protected:
	void SetPointStyle( wxCommandEvent& event );
	void SetCheckPointStyle(wxUpdateUIEvent& event);
	void SetBoxStyle( wxCommandEvent& event );
	void SetCheckBoxStyle(wxUpdateUIEvent& event);
	void SetWireframeStyle( wxCommandEvent& event );
	void SetCheckWireframeStyle(wxUpdateUIEvent& event);
	void SetShadedStyle( wxCommandEvent& event );
	void SetCheckShadedStyle(wxUpdateUIEvent& event);
	void ChangeMaterial( wxCommandEvent& event );
	void ChangeLayer( wxCommandEvent& event );
	void SetVisibility( wxCommandEvent& event );
	void SetCheckVisibility(wxUpdateUIEvent& event);
	void RenameEntity( wxCommandEvent& event );
	void DeleteEntity( wxCommandEvent& event );
	void Triangulate( wxCommandEvent& event );
	void ToShape( wxCommandEvent& event );
	void Decimate( wxCommandEvent& event );
	void Smooth( wxCommandEvent& event );
protected:
	wxMenu* m_appearance;
	wxMenu* m_viewstyle;
	wxMenu* m_actions;
	Im_Entity3DPtr m_entity;

};


#include "Im_Entity3DMenu.h"

#include "Im_Group3D.h"
#include "Im_Mesh.h"
#include "Im_Shape3D.h"

Im_Entity3DMenu::Im_Entity3DMenu() : wxMenu()
{
}

Im_Entity3DMenu::~Im_Entity3DMenu(void)
{
	if (m_entity)
	{
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetPointStyle));
		Disconnect( wxID_ANY, wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckPointStyle));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetBoxStyle));
		Disconnect( wxID_ANY, wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckBoxStyle));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetWireframeStyle));
		Disconnect( wxID_ANY, wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckWireframeStyle));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetShadedStyle));
		Disconnect( wxID_ANY, wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckShadedStyle));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::ChangeMaterial));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetVisibility));
		Disconnect( wxID_ANY, wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckVisibility));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::RenameEntity));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::DeleteEntity));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Triangulate));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::ToShape));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Decimate));
		Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Smooth));
	}
}

void Im_Entity3DMenu::SetEntity(Im_Entity3DPtr theEntity)
{
	m_entity = theEntity;
}

void Im_Entity3DMenu::BuildItems()
{
	if (m_entity)
	{
		Im_Group3DPtr tmpGroup = 
boost::dynamic_pointer_cast<Im_Group3D>(m_entity);
		Im_MeshPtr tmpMesh = boost::dynamic_pointer_cast<Im_Mesh>(m_entity);
		Im_Shape3DPtr tmpShape = 
boost::dynamic_pointer_cast<Im_Shape3D>(m_entity);

		m_appearance = new wxMenu();
		m_viewstyle = new wxMenu();
		
		wxMenuItem* m_points;
		m_points = new wxMenuItem( m_viewstyle, wxID_ANY, wxString( 
_("Points") ) , wxEmptyString, wxITEM_CHECK  );
		m_viewstyle->Append( m_points );
		
		wxMenuItem* m_box;
		m_box = new wxMenuItem( m_viewstyle, wxID_ANY, wxString( _("Box") ) , 
wxEmptyString, wxITEM_CHECK  );
		m_viewstyle->Append( m_box );
		
		wxMenuItem* m_wireframe;
		m_wireframe = new wxMenuItem( m_viewstyle, wxID_ANY, wxString( _("Wire 
frame") ) , wxEmptyString, wxITEM_CHECK  );
		m_viewstyle->Append( m_wireframe );
		
		wxMenuItem* m_shaded;
		m_shaded = new wxMenuItem( m_viewstyle, wxID_ANY, wxString( 
_("Shaded") ) , wxEmptyString, wxITEM_CHECK  );
		m_viewstyle->Append( m_shaded );
		
		m_appearance->Append( -1, _("View style"), m_viewstyle );
		
		if (!tmpGroup)
		{
			wxMenuItem* m_material;
			m_material = new wxMenuItem( m_appearance, wxID_ANY, wxString( 
_("Material...") ) , wxEmptyString, wxITEM_NORMAL );
			m_appearance->Append( m_material );

			Connect( m_material->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::ChangeMaterial));
		}

		wxMenuItem* m_layer;
		m_layer = new wxMenuItem( m_appearance, wxID_ANY, wxString( 
_("Layer...") ) , wxEmptyString, wxITEM_NORMAL );
		m_appearance->Append( m_layer );

		wxMenuItem* m_visible;
		m_visible = new wxMenuItem( m_appearance, wxID_ANY, wxString( 
_("Visible") ) , wxEmptyString, wxITEM_CHECK  );
		m_appearance->Append( m_visible );
		Append( -1, _("Appearance"), m_appearance );
		
		m_actions = new wxMenu();
		wxMenuItem* m_rename;
		m_rename = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Rename...") ) , wxEmptyString, wxITEM_NORMAL );
		m_actions->Append( m_rename );
		
		wxMenuItem* m_delete;
		m_delete = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Delete...") ) , wxEmptyString, wxITEM_NORMAL );
		m_actions->Append( m_delete );
		
		if (tmpGroup)
		{
			wxMenuItem* m_import;
			m_import = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Import...") ) , wxEmptyString, wxITEM_NORMAL );
			m_actions->Append( m_import );
		}

		wxMenuItem* m_export;
		m_export = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Export...") ) , wxEmptyString, wxITEM_NORMAL );
		m_actions->Append( m_export );

		if (tmpShape)
		{
			wxMenuItem* triangulate;
			triangulate = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Triangulate...") ) , wxEmptyString, wxITEM_NORMAL );
			m_actions->Append( triangulate );
			Connect( triangulate->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Triangulate));
		}

		if (tmpMesh)
		{
			wxMenuItem* m_toshape;
			m_toshape = new wxMenuItem( m_actions, wxID_ANY, wxString( _("To 
shape...") ) , wxEmptyString, wxITEM_NORMAL );
			m_actions->Append( m_toshape );
			
			wxMenuItem* m_decimate;
			m_decimate = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Decimate...") ) , wxEmptyString, wxITEM_NORMAL );
			m_actions->Append( m_decimate );
			
			wxMenuItem* m_smooth;
			m_smooth = new wxMenuItem( m_actions, wxID_ANY, wxString( 
_("Smooth...") ) , wxEmptyString, wxITEM_NORMAL );
			m_actions->Append( m_smooth );

			Connect( m_toshape->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::ToShape));
			Connect( m_decimate->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Decimate));
			Connect( m_smooth->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::Smooth));

		}		
		Append( -1, _("Actions"), m_actions );

		Connect( m_points->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetPointStyle));
		Connect( m_points->GetId(), wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckPointStyle));
		Connect( m_box->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetBoxStyle));
		Connect( m_box->GetId(), wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckBoxStyle));
		Connect( m_wireframe->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetWireframeStyle));
		Connect( m_wireframe->GetId(), wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckWireframeStyle));
		Connect( m_shaded->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetShadedStyle));
		Connect( m_shaded->GetId(), wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckShadedStyle));
		Connect( m_visible->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::SetVisibility));
		Connect( m_visible->GetId(), wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(Im_Entity3DMenu::SetCheckVisibility));
		Connect( m_layer->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::ChangeLayer));

		Connect( m_rename->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::RenameEntity));
		Connect( m_delete->GetId(), wxEVT_COMMAND_MENU_SELECTED, 
wxCommandEventHandler(Im_Entity3DMenu::DeleteEntity));

	}
}

void Im_Entity3DMenu::SetCheckVisibility( wxUpdateUIEvent& event )
{
	event.Check(m_entity->GetIsVisible());
}

void Im_Entity3DMenu::SetCheckPointStyle( wxUpdateUIEvent& event )
{
	event.Check(Im_Entity3D::Im_Points == m_entity->GetDisplayMode());
}

void Im_Entity3DMenu::SetCheckBoxStyle( wxUpdateUIEvent& event )
{
	event.Check(Im_Entity3D::Im_Box == m_entity->GetDisplayMode());
}

void Im_Entity3DMenu::SetCheckWireframeStyle( wxUpdateUIEvent& event )
{
	event.Check(Im_Entity3D::Im_WireFrame == m_entity->GetDisplayMode());
}

void Im_Entity3DMenu::SetCheckShadedStyle( wxUpdateUIEvent& event )
{
	event.Check(Im_Entity3D::Im_Shading == m_entity->GetDisplayMode());
}

void Im_Entity3DMenu::SetPointStyle( wxCommandEvent& event )
{
	wxMessageBox(L"SetPointStyle",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::SetBoxStyle( wxCommandEvent& event )
{
	wxMessageBox(L"SetBoxStyle",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::SetWireframeStyle( wxCommandEvent& event )
{
	wxMessageBox(L"SetWireframeStyle",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::SetShadedStyle( wxCommandEvent& event )
{
	wxMessageBox(L"SetShadedStyle",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::ChangeMaterial( wxCommandEvent& event )
{
	wxMessageBox(L"ChangeMaterial",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::ChangeLayer( wxCommandEvent& event )
{
	wxMessageBox(L"ChangeLayer",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::SetVisibility( wxCommandEvent& event )
{
	wxMessageBox(L"SetVisibility",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::RenameEntity( wxCommandEvent& event )
{
	wxMessageBox(L"RenameEntity",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::DeleteEntity( wxCommandEvent& event )
{
	wxMessageBox(L"DeleteEntity",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::Triangulate( wxCommandEvent& event )
{
	wxMessageBox(L"Triangulate",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::ToShape( wxCommandEvent& event )
{
	wxMessageBox(L"ToShape",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::Decimate( wxCommandEvent& event )
{
	wxMessageBox(L"Decimate",L"Im_Entity3DMenu");
}

void Im_Entity3DMenu::Smooth( wxCommandEvent& event )
{
	wxMessageBox(L"Smooth",L"Im_Entity3DMenu");
}





More information about the wx-users mailing list