ewol/sources/ewol/widget/Menu.cpp

236 lines
6.9 KiB
C++

/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license BSD v3 (see license file)
*/
#include <ewol/ewol.h>
#include <ewol/eObject/EObject.h>
#include <ewol/widget/WidgetManager.h>
#include <ewol/widget/Menu.h>
#include <ewol/widget/Button.h>
#include <ewol/widget/ContextMenu.h>
#include <ewol/widget/Composer.h>
#include <ewol/widget/Label.h>
#undef __class__
#define __class__ "Menu"
widget::Menu::Menu(void)
{
m_staticId = 0;
m_widgetContextMenu = NULL;
}
widget::Menu::~Menu(void)
{
Clear();
}
void widget::Menu::SubWidgetRemoveAll(void)
{
Clear();
widget::Sizer::SubWidgetRemoveAll();
}
void widget::Menu::SubWidgetAdd(ewol::Widget* newWidget)
{
EWOL_ERROR("Not availlable");
}
void widget::Menu::SubWidgetRemove(ewol::Widget* newWidget)
{
EWOL_ERROR("Not availlable");
}
void widget::Menu::SubWidgetUnLink(ewol::Widget* newWidget)
{
EWOL_ERROR("Not availlable");
}
void widget::Menu::Clear(void)
{
for( int32_t iii=0; iii < m_listElement.Size(); iii++) {
if (m_listElement[iii] != NULL) {
delete(m_listElement[iii]);
m_listElement[iii] = NULL;
}
}
m_listElement.Clear();
}
int32_t widget::Menu::AddTitle(etk::UString label, etk::UString image, const char * generateEvent, const etk::UString message)
{
return Add(-1, label, image, generateEvent, message);
}
int32_t widget::Menu::Add(int32_t parent, etk::UString label, etk::UString image, const char * generateEvent, const etk::UString message)
{
widget::MenuElement * tmpObject = new widget::MenuElement();
if (NULL == tmpObject) {
EWOL_ERROR("Allocation problem");
return -1;
}
tmpObject->m_localId = m_staticId++;
tmpObject->m_parentId = parent;
tmpObject->m_widgetPointer = NULL;
tmpObject->m_label = etk::UString("<left>") + label + "</left>";
tmpObject->m_image = image;
tmpObject->m_generateEvent = generateEvent;
tmpObject->m_message = message;
m_listElement.PushBack(tmpObject);
if (-1 == tmpObject->m_parentId) {
widget::Button * myButton = NULL;
myButton = new widget::Button();
if (NULL == myButton) {
EWOL_ERROR("Allocation button error");
return tmpObject->m_localId;
}
if (tmpObject->m_image.Size()!=0) {
myButton->SetSubWidget(
new widget::Composer(widget::Composer::String,
etk::UString("<composer>\n") +
" <sizer mode=\"hori\">\n"
" <image src=\"" + tmpObject->m_image + "\" size=\"8,8mm\"/>\n"
" <label>" + label + "</label>\n"
" </sizer>\n"
"</composer\n"));
} else {
myButton->SetSubWidget( new widget::Label(label) );
}
// add it in the widget list
widget::Sizer::SubWidgetAdd(myButton);
// keep the specific event ...
myButton->RegisterOnEvent(this, widget::Button::eventPressed, widget::Button::eventPressed);
tmpObject->m_widgetPointer = myButton;
}
return tmpObject->m_localId;
}
void widget::Menu::AddSpacer(void)
{
EWOL_TODO("NOT now...");
}
void widget::Menu::OnReceiveMessage(const ewol::EMessage& _msg)
{
/*
if (true == ewol::Sizer$::OnReceiveMessage(_msg) {
return true;
}
*/
if (_msg.GetMessage() == widget::Button::eventPressed) {
for(int32_t iii=0; iii<m_listElement.Size(); iii++) {
if (_msg.GetCaller() == m_listElement[iii]->m_widgetPointer) {
// 2 posible case (have a message or have a child ...
if (m_listElement[iii]->m_generateEvent != NULL) {
EWOL_DEBUG("Menu ==> Generate Event");
// Send a multicast event ...
SendMultiCast(m_listElement[iii]->m_generateEvent, m_listElement[iii]->m_message);
if (NULL != m_widgetContextMenu) {
EWOL_DEBUG("Mark the menu to remove ...");
m_widgetContextMenu->RemoveObject();
m_widgetContextMenu = NULL;
}
return;
} else{
EWOL_DEBUG("Menu ==> Load Sub Menu");
bool findChild = false;
for(int32_t jjj=0; jjj<m_listElement.Size(); jjj++) {
if (m_listElement[iii]->m_localId == m_listElement[jjj]->m_parentId) {
findChild = true;
break;
}
}
if (false == findChild) {
EWOL_WARNING("Event on menu element with no child an no event... label=" << m_listElement[iii]->m_label);
return;
}
// create a context menu :
m_widgetContextMenu = new widget::ContextMenu();
if (NULL == m_widgetContextMenu) {
EWOL_ERROR("Allocation Error");
return;
}
// Get the button widget :
vec2 newPosition;
ewol::Widget * eventFromWidget = static_cast<ewol::Widget*>(_msg.GetCaller());
if (NULL != eventFromWidget) {
vec2 tmpOri = eventFromWidget->GetOrigin();
vec2 tmpSize = eventFromWidget->GetSize();
// calculate the correct position
newPosition.setValue(tmpOri.x() + tmpSize.x()/2,
tmpOri.y() );
}
m_widgetContextMenu->SetPositionMark(widget::CONTEXT_MENU_MARK_TOP, newPosition );
widget::Sizer * mySizer = NULL;
widget::Button * myButton = NULL;
// TODO : Set a gird ...
mySizer = new widget::Sizer(widget::Sizer::modeVert);
mySizer->LockExpand(vec2(true,true));
// set it in the pop-up-system :
m_widgetContextMenu->SetSubWidget(mySizer);
for(int32_t jjj=m_listElement.Size()-1; jjj>=0; jjj--) {
if (m_listElement[iii]!=NULL) {
if (m_listElement[iii]->m_localId == m_listElement[jjj]->m_parentId) {
myButton = new widget::Button();
if (NULL == myButton) {
EWOL_ERROR("Allocation Error");
} else {
/*if (m_listElement[jjj]->m_image.Size()!=0) {
myButton->SetSubWidget(
new widget::Composer(widget::Composer::String,
etk::UString("<composer>\n") +
" <sizer mode=\"hori\">\n"
" <image src=\"" + m_listElement[jjj]->m_image + "\" size=\"8,8mm\"/>\n"
" <label exand=\"true,false\">" + m_listElement[jjj]->m_label + "</label>\n"
" </sizer>\n"
"</composer\n"));
} else */ {
myButton->SetSubWidget( new widget::Label(etk::UString("<left>") + m_listElement[jjj]->m_label + "</left>") );
}
// set the image if one is present ...
myButton->RegisterOnEvent(this, widget::Button::eventPressed, widget::Button::eventPressed);
myButton->SetExpand(bvec2(true,false));
myButton->SetFill(bvec2(true,false));
// add it in the widget list
mySizer->SubWidgetAdd(myButton);
m_listElement[jjj]->m_widgetPointer = myButton;
}
}
}
}
ewol::WindowsPopUpAdd(m_widgetContextMenu);
}
return;
}
}
}
}
void widget::Menu::OnObjectRemove(ewol::EObject * _removeObject)
{
widget::Sizer::OnObjectRemove(_removeObject);
if (m_widgetContextMenu == _removeObject) {
m_widgetContextMenu = NULL;
}
for(int32_t jjj=0; jjj<m_listElement.Size(); jjj++) {
if (NULL != m_listElement[jjj]) {
if (m_listElement[jjj]->m_widgetPointer == _removeObject) {
m_listElement[jjj]->m_widgetPointer = NULL;
}
}
}
}