[DEBUG/DEV] correct the loading of the composer and add the spacer in menu

This commit is contained in:
Edouard DUPIN 2017-02-21 23:41:52 +01:00
parent 1a930f5886
commit e61234d586
19 changed files with 288 additions and 117 deletions

View File

@ -111,7 +111,7 @@ bool ewol::Object::isTypeCompatible(const std::string& _type) const {
return false; return false;
} }
bool ewol::Object::loadXML(const exml::Element& _node) { bool ewol::Object::loadXMLAttributes(const exml::Element& _node) {
if (_node.exist() == false) { if (_node.exist() == false) {
return false; return false;
} }
@ -129,6 +129,10 @@ bool ewol::Object::loadXML(const exml::Element& _node) {
return errorOccured; return errorOccured;
} }
bool ewol::Object::loadXML(const exml::Element& _node) {
return true; //loadXMLAttributes(_node);
}
bool ewol::Object::storeXML(exml::Element& _node) const { bool ewol::Object::storeXML(exml::Element& _node) const {
if (_node.exist() == false) { if (_node.exist() == false) {
return false; return false;

View File

@ -74,6 +74,19 @@ exit_on_error:
EWOL_CRITICAL("Object Is not correctly init : " << #className ); \ EWOL_CRITICAL("Object Is not correctly init : " << #className ); \
} \ } \
return object; \ return object; \
} \
static ememory::SharedPtr<className> createXml(const exml::Element& _node) { \
ememory::SharedPtr<className> object(new className()); \
if (object == nullptr) { \
EWOL_ERROR("Factory error"); \
return nullptr; \
} \
object->loadXMLAttributes(_node); \
object->init(); \
if (object->objectHasBeenCorectlyInit() == false) { \
EWOL_CRITICAL("Object Is not correctly init : " << #className ); \
} \
return object; \
} }
#define DECLARE_SINGLE_FACTORY(className, uniqueName) \ #define DECLARE_SINGLE_FACTORY(className, uniqueName) \
@ -222,16 +235,23 @@ namespace ewol {
// TODO : Rework the position on this function ... This is a convignent function ... // TODO : Rework the position on this function ... This is a convignent function ...
bool propertySetOnWidgetNamed(const std::string& _objectName, const std::string& _config, const std::string& _value); bool propertySetOnWidgetNamed(const std::string& _objectName, const std::string& _config, const std::string& _value);
public: public:
/**
* @brief load attribute properties with an XML node.
* @param[in] _node Reference on the XML node.
* @return true : All has been done corectly.
* @return false : An error occured.
*/
bool loadXMLAttributes(const exml::Element& _node);
/** /**
* @brief load properties with an XML node. * @brief load properties with an XML node.
* @param[in] _node Pointer on the tinyXML node. * @param[in] _node Reference on the XML node.
* @return true : All has been done corectly. * @return true : All has been done corectly.
* @return false : An error occured. * @return false : An error occured.
*/ */
virtual bool loadXML(const exml::Element& _node); virtual bool loadXML(const exml::Element& _node);
/** /**
* @brief store properties in this XML node. * @brief store properties in this XML node.
* @param[in,out] _node Pointer on the tinyXML node. * @param[in,out] _node Reference on the XML node.
* @return true : All has been done corectly. * @return true : All has been done corectly.
* @return false : An error occured. * @return false : An error occured.
*/ */

View File

@ -12,37 +12,31 @@
#include <ewol/context/Context.hpp> #include <ewol/context/Context.hpp>
ewol::widget::Composer::Composer() : ewol::widget::Composer::Composer() :
propertyRemoveIfUnderRemove(this, "remove-if-under-remove", true, "Demand the remove iof the widget if the subObject demand a remove") { propertyRemoveIfUnderRemove(this, "remove-if-under-remove", true, "Demand the remove iof the widget if the subObject demand a remove"),
propertySubFile(this, "sub-file", "", "compose with a subXML file", &ewol::widget::Composer::onChangePropertySubFile) {
addObjectType("ewol::widget::Composer"); addObjectType("ewol::widget::Composer");
// nothing to do ... // nothing to do ...
} }
static ewol::WidgetShared composerGenerate(bool _modeFile, const std::string& _data, uint64_t _id) { ewol::WidgetShared ewol::widget::composerGenerateFile(const std::string& _fileName, uint64_t _id) {
std::string tmpData = etk::FSNodeReadAllData(_fileName);
return ewol::widget::composerGenerateString(tmpData, _id);
}
ewol::WidgetShared ewol::widget::composerGenerateString(const std::string& _data, uint64_t _id) {
ewol::widget::Manager& widgetManager = ewol::getContext().getWidgetManager(); ewol::widget::Manager& widgetManager = ewol::getContext().getWidgetManager();
if (_data == "") { if (_data == "") {
return nullptr; return nullptr;
} }
exml::Document doc; exml::Document doc;
if (_modeFile == true) { std::string tmpData = _data;
std::string tmpData = etk::FSNodeReadAllData(_data); // replace all elements:
// replace all elements: if (_id != 0) {
if (_id != 0) { tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id)); }
} if (doc.parse(tmpData) == false) {
if (doc.parse(tmpData) == false) { EWOL_ERROR(" can not load file XML string...");
EWOL_ERROR(" can not load file XML : " << _data); return nullptr;
return nullptr;
}
} else {
std::string tmpData = _data;
// replace all elements:
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML string...");
return nullptr;
}
} }
exml::Element root = doc.toElement(); exml::Element root = doc.toElement();
if (root.nodes.size() == 0) { if (root.nodes.size() == 0) {
@ -74,46 +68,13 @@ static ewol::WidgetShared composerGenerate(bool _modeFile, const std::string& _d
return tmpWidget; return tmpWidget;
} }
ewol::WidgetShared ewol::widget::composerGenerateFile(const std::string& _data, uint64_t _id) {
return composerGenerate(true, _data, _id);
}
ewol::WidgetShared ewol::widget::composerGenerateString(const std::string& _data, uint64_t _id) {
return composerGenerate(false, _data, _id);
}
ewol::widget::Composer::~Composer() { ewol::widget::Composer::~Composer() {
} }
bool ewol::widget::Composer::loadFromFile(const std::string& _fileName, uint64_t _id) { bool ewol::widget::Composer::loadFromFile(const std::string& _fileName, uint64_t _id) {
exml::Document doc;
std::string tmpData = etk::FSNodeReadAllData(_fileName); std::string tmpData = etk::FSNodeReadAllData(_fileName);
// replace all elements: return loadFromString(tmpData, _id);
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML : " << _fileName);
return false;
}
exml::Element root = doc.nodes["composer"];
if (root.exist() == false) {
// Maybe a multiple node XML for internal config:
root = doc.toElement();
if (root.exist() == false) {
EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l ?) main node not find: 'composer' ...");
return false;
}
if (root.nodes.size() == 0) {
EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l ?) no node in the Container XML element.");
return false;
}
}
// call upper class to parse his elements ...
ewol::widget::Container::loadXML(root);
return true;
} }
bool ewol::widget::Composer::loadFromString(const std::string& _composerXmlString, uint64_t _id) { bool ewol::widget::Composer::loadFromString(const std::string& _composerXmlString, uint64_t _id) {
@ -142,6 +103,13 @@ bool ewol::widget::Composer::loadFromString(const std::string& _composerXmlStrin
} }
// call upper class to parse his elements ... // call upper class to parse his elements ...
ewol::widget::Container::loadXML(root); ewol::widget::Container::loadXML(root);
if (m_subWidget == nullptr) {
EWOL_WARNING("Load data from composer and have no under Widget after loading");
if (_composerXmlString.size() != 0) {
EWOL_ERROR("Error Loading XML data : " << _composerXmlString);
return false;
}
}
requestUpdateSize(); requestUpdateSize();
return true; return true;
} }
@ -153,3 +121,32 @@ void ewol::widget::Composer::requestDestroyFromChild(const ewol::ObjectShared& _
autoDestroy(); autoDestroy();
} }
} }
void ewol::widget::Composer::onChangePropertySubFile() {
EWOL_INFO("Load compositing form external file : " << propertySubFile);
if (*propertySubFile == "") {
// remove all elements:
subWidgetRemove();
return;
}
if (loadFromFile(*propertySubFile, getId()) == false) {
EWOL_ERROR("Can not load Player GUI from file ... " << propertySubFile);
return;
}
}
bool ewol::widget::Composer::loadXML(const exml::Element& _node) {
//EWOL_VERBOSE("[" << getId() << "] t=" << getObjectType() << " Load XML (start)");
if (_node.exist() == false) {
return false;
}
// parse generic properties:
ewol::Widget::loadXML(_node);
// parse all the elements:
if (_node.nodes.size() != 0) {
EWOL_ERROR("a composer Node Can not have Sub-element in XML ==> must be done in an external file and load it with attribute: 'sub-file'");
}
//drawWidgetTree();
//EWOL_VERBOSE("[" << getId() << "] t=" << getObjectType() << " Load XML (stop)");
return true;
}

View File

@ -21,6 +21,7 @@ namespace ewol {
class Composer : public ewol::widget::Container { class Composer : public ewol::widget::Container {
public: public:
eproperty::Value<bool> propertyRemoveIfUnderRemove; //!< Remove the composer if sub element request a remove eproperty::Value<bool> propertyRemoveIfUnderRemove; //!< Remove the composer if sub element request a remove
eproperty::Value<std::string> propertySubFile; //!< If loading a sub-file, we must do it here ==> permit to con,figure it in the xml and not have wrong display
protected: protected:
/** /**
* @brief Constructor * @brief Constructor
@ -50,6 +51,10 @@ namespace ewol {
bool loadFromString(const std::string& _composerXmlString, uint64_t _id=0); bool loadFromString(const std::string& _composerXmlString, uint64_t _id=0);
private: private:
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
public:
bool loadXML(const exml::Element& _node) override;
protected:
virtual void onChangePropertySubFile();
}; };
ewol::WidgetShared composerGenerateString(const std::string& _data = "", uint64_t _id=0); ewol::WidgetShared composerGenerateString(const std::string& _data = "", uint64_t _id=0);
ewol::WidgetShared composerGenerateFile(const std::string& _data = "", uint64_t _id=0); ewol::WidgetShared composerGenerateFile(const std::string& _data = "", uint64_t _id=0);

View File

@ -87,7 +87,10 @@ void ewol::widget::Container::systemDraw(const ewol::DrawProperty& _displayProp)
if (m_subWidget != nullptr) { if (m_subWidget != nullptr) {
ewol::DrawProperty prop = _displayProp; ewol::DrawProperty prop = _displayProp;
prop.limit(m_origin, m_size); prop.limit(m_origin, m_size);
//EWOL_INFO("Draw : [" << propertyName << "] t=" << getObjectType() << " o=" << m_origin << " s=" << m_size);
m_subWidget->systemDraw(prop); m_subWidget->systemDraw(prop);
} else {
EWOL_INFO("[" << getId() << "] ++++++ : [nullptr]");
} }
} }
@ -151,6 +154,7 @@ bool ewol::widget::Container::loadXML(const exml::Element& _node) {
continue; continue;
} }
std::string widgetName = pNode.getValue(); std::string widgetName = pNode.getValue();
EWOL_VERBOSE("[" << getId() << "] t=" << getObjectType() << " Load node name : '" << widgetName << "'");
if (getWidgetManager().exist(widgetName) == false) { if (getWidgetManager().exist(widgetName) == false) {
EWOL_ERROR("(l " << pNode.getPos() << ") Unknown basic node='" << widgetName << "' not in : [" << getWidgetManager().list() << "]" ); EWOL_ERROR("(l " << pNode.getPos() << ") Unknown basic node='" << widgetName << "' not in : [" << getWidgetManager().list() << "]" );
continue; continue;
@ -160,7 +164,7 @@ bool ewol::widget::Container::loadXML(const exml::Element& _node) {
continue; continue;
} }
EWOL_DEBUG("try to create subwidget : '" << widgetName << "'"); EWOL_DEBUG("try to create subwidget : '" << widgetName << "'");
ewol::WidgetShared tmpWidget = getWidgetManager().create(widgetName); ewol::WidgetShared tmpWidget = getWidgetManager().create(widgetName, pNode);
if (tmpWidget == nullptr) { if (tmpWidget == nullptr) {
EWOL_ERROR ("(l " << pNode.getPos() << ") Can not create the widget : '" << widgetName << "'"); EWOL_ERROR ("(l " << pNode.getPos() << ") Can not create the widget : '" << widgetName << "'");
continue; continue;
@ -172,6 +176,10 @@ bool ewol::widget::Container::loadXML(const exml::Element& _node) {
return false; return false;
} }
} }
if ( _node.nodes.size() != 0
&& m_subWidget == nullptr) {
EWOL_WARNING("Load container with no data inside");
}
return true; return true;
} }
@ -194,3 +202,11 @@ void ewol::widget::Container::requestDestroyFromChild(const ewol::ObjectShared&
m_subWidget.reset(); m_subWidget.reset();
markToRedraw(); markToRedraw();
} }
void ewol::widget::Container::drawWidgetTree(int32_t _level) {
ewol::Widget::drawWidgetTree(_level);
_level++;
if (m_subWidget != nullptr) {
m_subWidget->drawWidgetTree(_level);
}
}

View File

@ -67,6 +67,7 @@ namespace ewol {
bool loadXML(const exml::Element& _node) override; bool loadXML(const exml::Element& _node) override;
void setOffset(const vec2& _newVal) override; void setOffset(const vec2& _newVal) override;
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
void drawWidgetTree(int32_t _level=0) override;
}; };
}; };
}; };

View File

@ -96,6 +96,7 @@ void ewol::widget::Container2::systemDraw(const ewol::DrawProperty& _displayProp
} }
ewol::Widget::systemDraw(_displayProp); ewol::Widget::systemDraw(_displayProp);
if (m_subWidget[m_idWidgetDisplayed] != nullptr) { if (m_subWidget[m_idWidgetDisplayed] != nullptr) {
//EWOL_INFO("Draw : [" << propertyName << "] t=" << getObjectType() << " o=" << m_origin << " s=" << m_size);
m_subWidget[m_idWidgetDisplayed]->systemDraw(_displayProp); m_subWidget[m_idWidgetDisplayed]->systemDraw(_displayProp);
} }
} }
@ -199,7 +200,7 @@ bool ewol::widget::Container2::loadXML(const exml::Element& _node) {
} }
} }
EWOL_DEBUG("try to create subwidget : '" << widgetName << "'"); EWOL_DEBUG("try to create subwidget : '" << widgetName << "'");
ewol::WidgetShared tmpWidget = getWidgetManager().create(widgetName); ewol::WidgetShared tmpWidget = getWidgetManager().create(widgetName, pNode);
if (tmpWidget == nullptr) { if (tmpWidget == nullptr) {
EWOL_ERROR ("(l " << pNode.getPos() << ") Can not create the widget: '" << widgetName << "'"); EWOL_ERROR ("(l " << pNode.getPos() << ") Can not create the widget: '" << widgetName << "'");
continue; continue;
@ -245,4 +246,13 @@ void ewol::widget::Container2::requestDestroyFromChild(const ewol::ObjectShared&
} }
} }
void ewol::widget::Container2::drawWidgetTree(int32_t _level) {
ewol::Widget::drawWidgetTree(_level);
_level++;
if (m_subWidget[0] != nullptr) {
m_subWidget[0]->drawWidgetTree(_level);
}
if (m_subWidget[1] != nullptr) {
m_subWidget[1]->drawWidgetTree(_level);
}
}

View File

@ -168,6 +168,7 @@ namespace ewol {
bool loadXML(const exml::Element& _node) override; bool loadXML(const exml::Element& _node) override;
void setOffset(const vec2& _newVal) override; void setOffset(const vec2& _newVal) override;
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
void drawWidgetTree(int32_t _level=0) override;
}; };
}; };
}; };

View File

@ -176,6 +176,7 @@ void ewol::widget::ContainerN::systemDraw(const ewol::DrawProperty& _displayProp
prop.limit(m_origin, m_size); prop.limit(m_origin, m_size);
for (auto it(m_subWidget.rbegin()); it!=m_subWidget.rend(); ++it) { for (auto it(m_subWidget.rbegin()); it!=m_subWidget.rend(); ++it) {
if (*it != nullptr) { if (*it != nullptr) {
//EWOL_INFO(" ***** : [" << (*it)->propertyName << "] t=" << (*it)->getObjectType() << " o=" << (*it)->m_origin << " s=" << (*it)->m_size);
(*it)->systemDraw(prop); (*it)->systemDraw(prop);
} }
} }
@ -273,12 +274,13 @@ bool ewol::widget::ContainerN::loadXML(const exml::Element& _node) {
continue; continue;
} }
std::string widgetName = pNode.getValue(); std::string widgetName = pNode.getValue();
EWOL_VERBOSE(" t=" << getObjectType() << " Load node name : '" << widgetName << "'");
if (getWidgetManager().exist(widgetName) == false) { if (getWidgetManager().exist(widgetName) == false) {
EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l " << pNode.getPos() << ") Unknown basic node='" << widgetName << "' not in : [" << getWidgetManager().list() << "]" ); EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l " << pNode.getPos() << ") Unknown basic node='" << widgetName << "' not in : [" << getWidgetManager().list() << "]" );
continue; continue;
} }
EWOL_DEBUG("[" << getId() << "] {" << getObjectType() << "} load new element : '" << widgetName << "'"); EWOL_DEBUG("[" << getId() << "] {" << getObjectType() << "} load new element : '" << widgetName << "'");
ewol::WidgetShared subWidget = getWidgetManager().create(widgetName); ewol::WidgetShared subWidget = getWidgetManager().create(widgetName, pNode);
if (subWidget == nullptr) { if (subWidget == nullptr) {
EWOL_ERROR ("[" << getId() << "] {" << getObjectType() << "} (l " << pNode.getPos() << ") Can not create the widget : '" << widgetName << "'"); EWOL_ERROR ("[" << getId() << "] {" << getObjectType() << "} (l " << pNode.getPos() << ") Can not create the widget : '" << widgetName << "'");
continue; continue;
@ -326,3 +328,12 @@ void ewol::widget::ContainerN::requestDestroyFromChild(const ewol::ObjectShared&
} }
} }
void ewol::widget::ContainerN::drawWidgetTree(int32_t _level) {
ewol::Widget::drawWidgetTree(_level);
_level++;
for (auto &it: m_subWidget) {
if (it != nullptr) {
it->drawWidgetTree(_level);
}
}
}

View File

@ -98,6 +98,7 @@ namespace ewol {
bool loadXML(const exml::Element& _node) override; bool loadXML(const exml::Element& _node) override;
void setOffset(const vec2& _newVal) override; void setOffset(const vec2& _newVal) override;
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
void drawWidgetTree(int32_t _level=0) override;
protected: protected:
virtual void onChangePropertyLockExpand(); virtual void onChangePropertyLockExpand();
}; };

View File

@ -165,20 +165,37 @@ bool ewol::widget::Manager::isDrawingNeeded() {
// element that generate the list of elements // element that generate the list of elements
void ewol::widget::Manager::addWidgetCreator(const std::string& _name, void ewol::widget::Manager::addWidgetCreator(const std::string& _name,
ewol::widget::Manager::widgetCreatorFunction _pointer) { ewol::widget::Manager::widgetCreatorFunction _pointer,
if (_pointer == nullptr) { ewol::widget::Manager::widgetCreatorFunctionXml _pointerXml) {
if ( _pointer == nullptr
|| _pointerXml == nullptr) {
return; return;
} }
//Keep name in lower case : //Keep name in lower case :
std::string nameLower = etk::tolower(_name); std::string nameLower = etk::tolower(_name);
auto it = m_creatorList.find(nameLower); bool find = false;
if (it != m_creatorList.end()) { {
EWOL_WARNING("Replace Creator of a specify widget : " << nameLower); auto it = m_creatorList.find(nameLower);
it->second = _pointer; if (it != m_creatorList.end()) {
EWOL_WARNING("Replace Creator of a specify widget : " << nameLower);
it->second = _pointer;
find = true;
}
}
{
auto it = m_creatorListXml.find(nameLower);
if (it != m_creatorListXml.end()) {
EWOL_WARNING("Replace CreatorXml of a specify widget : " << nameLower);
it->second = _pointerXml;
find = true;
}
}
if (find == true) {
return; return;
} }
EWOL_INFO("Add Creator of a specify widget : " << nameLower); EWOL_INFO("Add Creator of a specify widget : " << nameLower);
m_creatorList.insert(make_pair(nameLower, _pointer)); m_creatorList.insert(make_pair(nameLower, _pointer));
m_creatorListXml.insert(make_pair(nameLower, _pointerXml));
} }
ewol::WidgetShared ewol::widget::Manager::create(const std::string& _name) { ewol::WidgetShared ewol::widget::Manager::create(const std::string& _name) {
@ -193,6 +210,18 @@ ewol::WidgetShared ewol::widget::Manager::create(const std::string& _name) {
return nullptr; return nullptr;
} }
ewol::WidgetShared ewol::widget::Manager::create(const std::string& _name, const exml::Element& _node) {
std::string nameLower = etk::tolower(_name);
auto it = m_creatorListXml.find(nameLower);
if (it != m_creatorListXml.end()) {
if (it->second != nullptr) {
return it->second(_node);
}
}
EWOL_WARNING("try to create an UnExistant widget : " << nameLower);
return nullptr;
}
bool ewol::widget::Manager::exist(const std::string& _name) { bool ewol::widget::Manager::exist(const std::string& _name) {
std::string nameLower = etk::tolower(_name); std::string nameLower = etk::tolower(_name);
auto it = m_creatorList.find(nameLower); auto it = m_creatorList.find(nameLower);

View File

@ -48,21 +48,31 @@ namespace ewol {
// --------------------------------------------- // ---------------------------------------------
public: public:
using widgetCreatorFunction = std::function<ewol::WidgetShared()>; //!< funtion factory basic definition using widgetCreatorFunction = std::function<ewol::WidgetShared()>; //!< funtion factory basic definition
using widgetCreatorFunctionXml = std::function<ewol::WidgetShared(const exml::Element& _node)>; //!< funtion factory basic definition
private: private:
std::unordered_map<std::string, widgetCreatorFunction> m_creatorList; //!< List of factory of a widget std::unordered_map<std::string, widgetCreatorFunction> m_creatorList; //!< List of factory of a widget
std::unordered_map<std::string, widgetCreatorFunctionXml> m_creatorListXml; //!< List of factory of a widget
public: public:
/** /**
* @brief add a factory of a specific widget. * @brief add a factory of a specific widget.
* @param[in] _name Name of the widget that is associated of the factory. * @param[in] _name Name of the widget that is associated of the factory.
* @param[in] _factory Function pointer to create the widget * @param[in] _factory Function pointer to create the widget
* @param[in] _factoryXml Function pointer to create the widget with XML node for parsing of XML
*/ */
void addWidgetCreator(const std::string& _name, widgetCreatorFunction _factory); void addWidgetCreator(const std::string& _name, widgetCreatorFunction _factory, widgetCreatorFunctionXml _factoryXml);
/** /**
* @brief Create a widget with his name. * @brief Create a widget with his name.
* @param[in] _name Name of the widget to create. * @param[in] _name Name of the widget to create.
* @return The widget created (nullptr if it does not exist). * @return The widget created (nullptr if it does not exist).
*/ */
ewol::WidgetShared create(const std::string& _name); ewol::WidgetShared create(const std::string& _name);
/**
* @brief Create a widget with his name.
* @param[in] _name Name of the widget to create.
* @param[in] _node Reference on the XML node.
* @return The widget created (nullptr if it does not exist).
*/
ewol::WidgetShared create(const std::string& _name, const exml::Element& _node);
/** /**
* @brief Check if an Widget exist * @brief Check if an Widget exist
* @param[in] _name Name of the widget to check. * @param[in] _name Name of the widget to check.

View File

@ -12,11 +12,13 @@
#include <ewol/widget/Composer.hpp> #include <ewol/widget/Composer.hpp>
#include <ewol/widget/Label.hpp> #include <ewol/widget/Label.hpp>
#include <ewol/widget/Windows.hpp> #include <ewol/widget/Windows.hpp>
#include <ewol/widget/Spacer.hpp>
ewol::widget::Menu::Menu() : ewol::widget::Menu::Menu() :
signalSelect(this, "select", "") { signalSelect(this, "select", "") {
addObjectType("ewol::widget::Menu"); addObjectType("ewol::widget::Menu");
m_staticId = 666; m_staticId = 666;
propertyLockExpand.setDirect(bvec2(true,true));
} }
ewol::widget::Menu::~Menu() { ewol::widget::Menu::~Menu() {
@ -66,7 +68,7 @@ int32_t ewol::widget::Menu::add(int32_t _parent,
const std::string& _label, const std::string& _label,
const std::string& _image, const std::string& _image,
const std::string& _message) { const std::string& _message) {
// try to find one already created : // try to find one already created:
int32_t previous = get(_label); int32_t previous = get(_label);
if (previous != -1) { if (previous != -1) {
return previous; return previous;
@ -77,7 +79,7 @@ int32_t ewol::widget::Menu::add(int32_t _parent,
tmpObject.m_label = _label; tmpObject.m_label = _label;
tmpObject.m_image = _image; tmpObject.m_image = _image;
tmpObject.m_message = _message; tmpObject.m_message = _message;
if (-1 == tmpObject.m_parentId) { if (tmpObject.m_parentId == -1) {
ewol::widget::ButtonShared myButton = ewol::widget::Button::create(); ewol::widget::ButtonShared myButton = ewol::widget::Button::create();
if (myButton == nullptr) { if (myButton == nullptr) {
EWOL_ERROR("Allocation button error"); EWOL_ERROR("Allocation button error");
@ -113,9 +115,29 @@ void ewol::widget::Menu::remove(int32_t _id) {
} }
int32_t ewol::widget::Menu::addSpacer() { int32_t ewol::widget::Menu::addSpacer(int32_t _parent) {
EWOL_TODO("NOT addSpacer..."); ewol::widget::MenuElement tmpObject;
return -1; tmpObject.m_localId = m_staticId++;
tmpObject.m_parentId = _parent;
tmpObject.m_label = "";
tmpObject.m_image = "";
tmpObject.m_message = "";
if (tmpObject.m_parentId == -1) {
ewol::widget::SpacerShared mySpacer = ewol::widget::Spacer::create();
if (mySpacer == nullptr) {
EWOL_ERROR("Allocation spacer error");
return tmpObject.m_localId;
}
mySpacer->propertyExpand.set(bvec2(true,true));
mySpacer->propertyFill.set(bvec2(true,true));
mySpacer->propertyMinSize.set(gale::Dimension(vec2(2,0), gale::distance::pixel));
mySpacer->propertyMaxSize.set(gale::Dimension(vec2(2,10000), gale::distance::pixel));
mySpacer->propertyColor.set(etk::Color<>(0,0,0,0xFF));
// add it in the widget list
ewol::widget::Sizer::subWidgetAdd(mySpacer);
}
m_listElement.push_back(tmpObject);
return tmpObject.m_localId;
} }
void ewol::widget::Menu::onButtonPressed(ewol::widget::ButtonWeak _button) { void ewol::widget::Menu::onButtonPressed(ewol::widget::ButtonWeak _button) {
@ -192,48 +214,63 @@ void ewol::widget::Menu::onButtonPressed(ewol::widget::ButtonWeak _button) {
if (it.m_localId != it2->m_parentId) { if (it.m_localId != it2->m_parentId) {
continue; continue;
} }
myButton = ewol::widget::Button::create(); if (it2->m_message == "" && it2->m_label == "") {
if (myButton == nullptr) { ewol::widget::SpacerShared mySpacer = ewol::widget::Spacer::create();
EWOL_ERROR("Allocation Error"); if (mySpacer == nullptr) {
continue; EWOL_ERROR("Allocation spacer error");
} continue;
myButton->propertyExpand.set(bvec2(true,true));
myButton->propertyFill.set(bvec2(true,true));
// set callback
myButton->signalPressed.connect(sharedFromThis(), &ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
// add it in the widget list
mySizer->subWidgetAdd(myButton);
if (it2->m_image.size() != 0) {
std::string composeString;
composeString+= " <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n";
if (etk::end_with(it2->m_image, ".edf") == true) {
composeString+=" <image src='" + it2->m_image + "' size='8,8mm' distance-field='true'/>\n";
} else {
composeString+=" <image src='" + it2->m_image + "' size='8,8mm'/>\n";
} }
composeString+=" <label exand='true,true' fill='true,true'><left>" + it2->m_label + "</left></label>\n"; mySpacer->propertyExpand.set(bvec2(true,true));
composeString+=" </sizer>\n"; mySpacer->propertyFill.set(bvec2(true,true));
myButton->setSubWidget(ewol::widget::composerGenerateString(composeString)); mySpacer->propertyMinSize.set(gale::Dimension(vec2(0,2), gale::distance::pixel));
mySpacer->propertyMaxSize.set(gale::Dimension(vec2(10000,2), gale::distance::pixel));
mySpacer->propertyColor.set(etk::Color<>(0,0,0,0xFF));
// add it in the widget list
mySizer->subWidgetAdd(mySpacer);
} else { } else {
if (menuHaveImage == true) { myButton = ewol::widget::Button::create();
myButton->setSubWidget(ewol::widget::composerGenerateString( if (myButton == nullptr) {
std::string() + EWOL_ERROR("Allocation Error");
" <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n" continue;
" <spacer min-size='8,0mm'/>\n" }
" <label exand='true,true' fill='true,true'><![CDATA[<left>" + it2->m_label + "</left>]]></label>\n" myButton->propertyExpand.set(bvec2(true,true));
" </sizer>\n") myButton->propertyFill.set(bvec2(true,true));
); // set callback
myButton->signalPressed.connect(sharedFromThis(), &ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
// add it in the widget list
mySizer->subWidgetAdd(myButton);
if (it2->m_image.size() != 0) {
std::string composeString;
composeString+= " <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n";
if (etk::end_with(it2->m_image, ".edf") == true) {
composeString+=" <image src='" + it2->m_image + "' size='8,8mm' distance-field='true'/>\n";
} else {
composeString+=" <image src='" + it2->m_image + "' size='8,8mm'/>\n";
}
composeString+=" <label exand='true,true' fill='true,true'><left>" + it2->m_label + "</left></label>\n";
composeString+=" </sizer>\n";
myButton->setSubWidget(ewol::widget::composerGenerateString(composeString));
} else { } else {
ewol::widget::LabelShared tmpLabel = widget::Label::create(); if (menuHaveImage == true) {
if (tmpLabel != nullptr) { myButton->setSubWidget(ewol::widget::composerGenerateString(
tmpLabel->propertyValue.set(std::string("<left>") + it2->m_label + "</left>\n"); std::string() +
tmpLabel->propertyExpand.set(bvec2(true,false)); " <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n"
tmpLabel->propertyFill.set(bvec2(true,true)); " <spacer min-size='8,0mm'/>\n"
myButton->setSubWidget(tmpLabel); " <label exand='true,true' fill='true,true'><![CDATA[<left>" + it2->m_label + "</left>]]></label>\n"
" </sizer>\n")
);
} else {
ewol::widget::LabelShared tmpLabel = widget::Label::create();
if (tmpLabel != nullptr) {
tmpLabel->propertyValue.set(std::string("<left>") + it2->m_label + "</left>\n");
tmpLabel->propertyExpand.set(bvec2(true,false));
tmpLabel->propertyFill.set(bvec2(true,true));
myButton->setSubWidget(tmpLabel);
}
} }
} }
it2->m_widgetPointer = myButton;
} }
it2->m_widgetPointer = myButton;
} }
} }
ewol::widget::WindowsShared currentWindows = getWindows(); ewol::widget::WindowsShared currentWindows = getWindows();
@ -272,12 +309,11 @@ bool ewol::widget::Menu::loadXML(const exml::Element& _node) {
continue; continue;
} }
std::string widgetName2 = pNode2.getValue(); std::string widgetName2 = pNode2.getValue();
EWOL_INFO("Get node : " << pNode2);
if (widgetName2 == "elem") { if (widgetName2 == "elem") {
// <elem title="_T{Title of the button}" image="DATA:List.svg" event="menu:exit"> // <elem title="_T{Title of the button}" image="DATA:List.svg" event="menu:exit">
add(idMenu, pNode2.attributes["title"], pNode2.attributes["image"], pNode2.attributes["event"]); add(idMenu, pNode2.attributes["title"], pNode2.attributes["image"], pNode2.attributes["event"]);
} else if (widgetName2 == "separator") { } else if (widgetName2 == "separator") {
addSpacer(); addSpacer(idMenu);
} else { } else {
EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l " << pNode2.getPos() << ") Unknown basic node='" << widgetName2 << "' not in : [elem,separator]" ); EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} (l " << pNode2.getPos() << ") Unknown basic node='" << widgetName2 << "' not in : [elem,separator]" );
} }

View File

@ -53,7 +53,7 @@ namespace ewol {
void clear(); void clear();
int32_t addTitle(const std::string& _label, const std::string& _image="", const std::string& _message = ""); int32_t addTitle(const std::string& _label, const std::string& _image="", const std::string& _message = "");
int32_t add(int32_t _parent, const std::string& _label, const std::string& _image="", const std::string& _message = ""); int32_t add(int32_t _parent, const std::string& _label, const std::string& _image="", const std::string& _message = "");
int32_t addSpacer(); int32_t addSpacer(int32_t _parent=-1);
void remove(int32_t _id); void remove(int32_t _id);
private: private:
void onButtonPressed(ewol::widget::ButtonWeak _button); void onButtonPressed(ewol::widget::ButtonWeak _button);

View File

@ -233,6 +233,7 @@ void ewol::widget::WSlider::systemDraw(const ewol::DrawProperty& _displayProp) {
std::advance(it, m_windowsDestination); std::advance(it, m_windowsDestination);
if ( it != m_subWidget.end() if ( it != m_subWidget.end()
&& *it != nullptr) { && *it != nullptr) {
//EWOL_INFO("Draw : [" << propertyName << "] t=" << getObjectType() << "o=" << m_origin << " s=" << m_size);
(*it)->systemDraw(prop); (*it)->systemDraw(prop);
} }
} else { } else {

View File

@ -151,6 +151,7 @@ void ewol::Widget::setOffset(const vec2& _newVal) {
(0,0) (0,0)
*/ */
void ewol::Widget::systemDraw(const ewol::DrawProperty& _displayProp) { void ewol::Widget::systemDraw(const ewol::DrawProperty& _displayProp) {
//EWOL_INFO("[" << getId() << "] Draw : [" << propertyName << "] t=" << getObjectType() << " o=" << m_origin << " s=" << m_size << " hide=" << propertyHide);
if (*propertyHide == true){ if (*propertyHide == true){
// widget is hidden ... // widget is hidden ...
return; return;
@ -658,4 +659,13 @@ bool ewol::Widget::stopAnnimation() {
m_annimationMode = ewol::Widget::annimationModeDisable; m_annimationMode = ewol::Widget::annimationModeDisable;
onStopAnnimation(); onStopAnnimation();
return true; // ??? return true; // ???
}
void ewol::Widget::drawWidgetTree(int32_t _level) {
std::string space;
for (int32_t iii=0; iii<_level; ++iii) {
space += " ";
}
EWOL_PRINT(space << "[" << getId() << "] name='" << propertyName << "' type=" << getObjectType() << " o=" << m_origin << " s=" << m_size << " hide=" << propertyHide);
} }

View File

@ -39,9 +39,13 @@ namespace ewol {
#define DECLARE_WIDGET_FACTORY(className, name) \ #define DECLARE_WIDGET_FACTORY(className, name) \
DECLARE_FACTORY(className); \ DECLARE_FACTORY(className); \
static void createManagerWidget(ewol::widget::Manager& _widgetManager) { \ static void createManagerWidget(ewol::widget::Manager& _widgetManager) { \
_widgetManager.addWidgetCreator(name, []() -> ewol::WidgetShared { \ _widgetManager.addWidgetCreator(name, \
return className::create(); \ []() -> ewol::WidgetShared { \
}); \ return className::create(); \
}, \
[](const exml::Element& _node) -> ewol::WidgetShared { \
return className::createXml(_node); \
}); \
} }
namespace ewol { namespace ewol {
@ -578,6 +582,8 @@ namespace ewol {
virtual void onChangePropertyExpand(); virtual void onChangePropertyExpand();
virtual void onChangePropertyMaxSize(); virtual void onChangePropertyMaxSize();
virtual void onChangePropertyMinSize(); virtual void onChangePropertyMinSize();
public:
virtual void drawWidgetTree(int32_t _level=0);
}; };
}; };

View File

@ -263,4 +263,16 @@ ewol::ObjectShared ewol::widget::Windows::getSubObjectNamed(const std::string& _
return nullptr; return nullptr;
} }
void ewol::widget::Windows::drawWidgetTree(int32_t _level) {
ewol::Widget::drawWidgetTree(_level);
_level++;
if (m_subWidget != nullptr) {
m_subWidget->drawWidgetTree(_level);
}
for (auto &it: m_popUpWidgetList) {
if (it != nullptr) {
it->drawWidgetTree(_level);
}
}
}

View File

@ -70,6 +70,7 @@ namespace ewol {
ewol::WidgetShared getWidgetAtPos(const vec2& _pos) override; ewol::WidgetShared getWidgetAtPos(const vec2& _pos) override;
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
ewol::ObjectShared getSubObjectNamed(const std::string& _objectName) override; ewol::ObjectShared getSubObjectNamed(const std::string& _objectName) override;
void drawWidgetTree(int32_t _level=0) override;
protected: protected:
/** /**
* @brief Called when property change: Title * @brief Called when property change: Title