/** * @author Edouard DUPIN * * @copyright 2011, Edouard DUPIN, all right reserved * * @license BSD v3 (see license file) */ #include #include #include #include #include #include #include #include #undef __class__ #define __class__ "Menu" ewol::widget::Menu::Menu() { addObjectType("ewol::widget::Menu"); m_staticId = 0; m_widgetContextMenu = nullptr; } ewol::widget::Menu::~Menu() { clear(); } void ewol::widget::Menu::subWidgetRemoveAll() { clear(); ewol::widget::Sizer::subWidgetRemoveAll(); } int32_t ewol::widget::Menu::subWidgetAdd(ewol::object::Shared _newWidget) { EWOL_ERROR("Not availlable"); return -1; } void ewol::widget::Menu::subWidgetRemove(ewol::object::Shared _newWidget) { EWOL_ERROR("Not availlable"); } void ewol::widget::Menu::subWidgetUnLink(ewol::object::Shared _newWidget) { EWOL_ERROR("Not availlable"); } void ewol::widget::Menu::clear() { for (size_t iii=0; iii < m_listElement.size(); iii++) { if (m_listElement[iii] != nullptr) { delete(m_listElement[iii]); m_listElement[iii] = nullptr; } } m_listElement.clear(); } int32_t ewol::widget::Menu::addTitle(std::string _label, std::string _image, const char * _generateEvent, const std::string _message) { return add(-1, _label, _image, _generateEvent, _message); } int32_t ewol::widget::Menu::add(int32_t _parent, std::string _label, std::string _image, const char *_generateEvent, const std::string _message) { ewol::widget::MenuElement *tmpObject = new ewol::widget::MenuElement(); if (nullptr == tmpObject) { EWOL_ERROR("Allocation problem"); return -1; } tmpObject->m_localId = m_staticId++; tmpObject->m_parentId = _parent; tmpObject->m_widgetPointer = nullptr; tmpObject->m_label = std::string("") + _label + ""; tmpObject->m_image = _image; tmpObject->m_generateEvent = _generateEvent; tmpObject->m_message = _message; m_listElement.push_back(tmpObject); if (-1 == tmpObject->m_parentId) { ewol::widget::Button *myButton = nullptr; myButton = new ewol::widget::Button(); if (nullptr == myButton) { EWOL_ERROR("Allocation button error"); return tmpObject->m_localId; } if (tmpObject->m_image.size()!=0) { std::string composeString ="\n"; if (std::end_with(tmpObject->m_image, ".edf") == true) { composeString+=" m_image + "\" size=\"8,8mm\" distance-field='true'/>\n"; } else { composeString+=" m_image + "\" size=\"8,8mm\"/>\n"; } composeString+=" \n"; composeString+="\n"; myButton->setSubWidget(new ewol::widget::Composer(widget::Composer::String, composeString)); } else { myButton->setSubWidget(new ewol::widget::Label(tmpObject->m_label) ); } // add it in the widget list ewol::widget::Sizer::subWidgetAdd(myButton); // keep the specific event ... myButton->registerOnEvent(this, ewol::widget::Button::eventPressed, widget::Button::eventPressed); tmpObject->m_widgetPointer = myButton; } return tmpObject->m_localId; } void ewol::widget::Menu::addSpacer() { EWOL_TODO("NOT now..."); } void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { /* if (true == ewol::sizer::onReceiveMessage(_msg) { return true; } */ EWOL_ERROR(" receive message : " << _msg); if (_msg.getMessage() == ewol::widget::Button::eventPressed) { for (size_t iii=0; iiim_widgetPointer) { // 2 posible case (have a message or have a child ... if (m_listElement[iii]->m_generateEvent != nullptr) { EWOL_DEBUG("Menu == > generate Event"); // Send a multicast event ... sendMultiCast(m_listElement[iii]->m_generateEvent, m_listElement[iii]->m_message); if (nullptr != m_widgetContextMenu) { EWOL_DEBUG("Mark the menu to remove ..."); m_widgetContextMenu->removeObject(); m_widgetContextMenu = nullptr; } return; } else{ EWOL_DEBUG("Menu == > load Sub Menu"); bool findChild = false; for (size_t jjj=0; jjjm_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 ewol::widget::ContextMenu(); if (nullptr == m_widgetContextMenu) { EWOL_ERROR("Allocation Error"); return; } // get the button widget : vec2 newPosition; // TODO : Set it back : /* ewol::object::Shared eventFromWidget = static_cast>(_msg.getCaller()); if (nullptr != 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(ewol::widget::ContextMenu::markTop, newPosition ); ewol::widget::Sizer * mySizer = nullptr; ewol::widget::Button * myButton = nullptr; mySizer = new ewol::widget::Sizer(widget::Sizer::modeVert); if (nullptr != mySizer) { mySizer->lockExpand(vec2(true,true)); // set it in the pop-up-system : m_widgetContextMenu->setSubWidget(mySizer); bool menuHaveImage = false; for (int64_t jjj=m_listElement.size()-1; jjj >= 0; jjj--) { if (m_listElement[iii]!=nullptr) { if (m_listElement[iii]->m_localId == m_listElement[jjj]->m_parentId) { if (m_listElement[jjj]->m_image.size()!=0) { menuHaveImage = true; break; } } } } for (int64_t jjj=m_listElement.size()-1; jjj >= 0; jjj--) { if (m_listElement[iii]!=nullptr) { if (m_listElement[iii]->m_localId == m_listElement[jjj]->m_parentId) { myButton = new ewol::widget::Button(); if (nullptr == myButton) { EWOL_ERROR("Allocation Error"); } else { if (m_listElement[jjj]->m_image.size()!=0) { std::string composeString = "\n"; composeString+= " \n"; if (std::end_with(m_listElement[jjj]->m_image, ".edf") == true) { composeString+=" m_image + "\" size=\"8,8mm\" distance-field='true'/>\n"; } else { composeString+=" m_image + "\" size=\"8,8mm\"/>\n"; } composeString+=" \n"; composeString+=" \n"; composeString+="\n"; myButton->setSubWidget(new ewol::widget::Composer(widget::Composer::String, composeString)); } else { if (true == menuHaveImage) { myButton->setSubWidget( new ewol::widget::Composer(widget::Composer::String, std::string("\n") + " \n" " \n" " \n" " \n" "\n")); } else { ewol::widget::Label* tmpLabel = new widget::Label(std::string("") + m_listElement[jjj]->m_label + "\n"); if (nullptr != tmpLabel) { tmpLabel->setExpand(bvec2(true,false)); tmpLabel->setFill(bvec2(true,true)); myButton->setSubWidget(tmpLabel); } } } // set the image if one is present ... myButton->registerOnEvent(this, ewol::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::object::Shared currentWindows = getWindows(); if (currentWindows == nullptr) { EWOL_ERROR("Can not get the curent Windows..."); m_widgetContextMenu->removeObject(); m_widgetContextMenu = nullptr; } else { currentWindows->popUpWidgetPush(m_widgetContextMenu); } } return; } } } } void ewol::widget::Menu::onObjectRemove(const ewol::object::Shared& _removeObject) { ewol::widget::Sizer::onObjectRemove(_removeObject); if (m_widgetContextMenu == _removeObject) { delete(m_widgetContextMenu); m_widgetContextMenu = nullptr; } for (size_t jjj=0; jjjm_widgetPointer == _removeObject) { m_listElement[jjj]->m_widgetPointer.reset(); } } } }