From e3305c37575af13d90f11857f00a2a6b0d664918 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 7 Aug 2014 22:54:13 +0200 Subject: [PATCH] [DEV] start long rework to have a geneic std::shared_ptr instead of internal ewol::object::Shared ==> need to have only factory --- build | 2 +- external/etk | 2 +- sources/ewol/compositing/Area.cpp | 4 +- sources/ewol/compositing/Area.h | 4 +- sources/ewol/compositing/Drawing.cpp | 2 +- sources/ewol/compositing/Drawing.h | 2 +- sources/ewol/compositing/Image.cpp | 12 +- sources/ewol/compositing/Image.h | 6 +- sources/ewol/compositing/Shaper.cpp | 8 +- sources/ewol/compositing/Shaper.h | 8 +- sources/ewol/compositing/Text.cpp | 4 +- sources/ewol/compositing/Text.h | 2 +- sources/ewol/compositing/TextBase.cpp | 6 +- sources/ewol/compositing/TextBase.h | 2 +- sources/ewol/compositing/TextDF.cpp | 4 +- sources/ewol/compositing/TextDF.h | 2 +- sources/ewol/context/Context.cpp | 16 +- sources/ewol/context/Context.h | 12 +- sources/ewol/context/InputManager.cpp | 117 ++++---- sources/ewol/context/InputManager.h | 34 +-- sources/ewol/event/Input.h | 8 +- sources/ewol/object/Manager.cpp | 89 +++--- sources/ewol/object/Manager.h | 18 +- sources/ewol/object/Message.h | 8 +- sources/ewol/object/MultiCast.cpp | 29 +- sources/ewol/object/MultiCast.h | 12 +- sources/ewol/object/Object.cpp | 202 +++++--------- sources/ewol/object/Object.h | 96 +++---- sources/ewol/object/Owner.h | 262 ------------------ sources/ewol/object/RemoveEvent.cpp | 7 +- sources/ewol/object/RemoveEvent.h | 2 +- sources/ewol/object/Shared.h | 190 ------------- sources/ewol/resource/ColorFile.cpp | 36 +-- sources/ewol/resource/ColorFile.h | 12 +- sources/ewol/resource/Colored3DObject.cpp | 14 +- sources/ewol/resource/Colored3DObject.h | 11 +- sources/ewol/resource/ConfigFile.cpp | 35 +-- sources/ewol/resource/ConfigFile.h | 6 +- sources/ewol/resource/DistanceFieldFont.cpp | 36 +-- sources/ewol/resource/DistanceFieldFont.h | 8 +- sources/ewol/resource/FontFreeType.cpp | 32 +-- sources/ewol/resource/FontFreeType.h | 12 +- sources/ewol/resource/Image.cpp | 27 +- sources/ewol/resource/Image.h | 9 +- sources/ewol/resource/ImageDF.cpp | 29 +- sources/ewol/resource/ImageDF.h | 7 +- sources/ewol/resource/Manager.cpp | 65 ++--- sources/ewol/resource/Manager.h | 10 +- sources/ewol/resource/Program.cpp | 41 +-- sources/ewol/resource/Program.h | 16 +- sources/ewol/resource/Resource.cpp | 15 +- sources/ewol/resource/Resource.h | 83 +++++- sources/ewol/resource/Shader.cpp | 31 +-- sources/ewol/resource/Shader.h | 12 +- sources/ewol/resource/Texture.cpp | 25 +- sources/ewol/resource/Texture.h | 11 +- sources/ewol/resource/TexturedFont.cpp | 33 +-- sources/ewol/resource/TexturedFont.h | 14 +- sources/ewol/resource/VirtualBufferObject.cpp | 24 +- sources/ewol/resource/VirtualBufferObject.h | 12 +- sources/ewol/resource/font/FontBase.h | 7 +- sources/ewol/widget/Button.cpp | 17 +- sources/ewol/widget/Button.h | 9 +- sources/ewol/widget/ButtonColor.cpp | 28 +- sources/ewol/widget/ButtonColor.h | 11 +- sources/ewol/widget/CheckBox.cpp | 15 +- sources/ewol/widget/CheckBox.h | 9 +- sources/ewol/widget/ColorBar.cpp | 4 + sources/ewol/widget/ColorBar.h | 5 +- sources/ewol/widget/Composer.cpp | 18 +- sources/ewol/widget/Composer.h | 10 +- sources/ewol/widget/Container.cpp | 50 ++-- sources/ewol/widget/Container.h | 20 +- sources/ewol/widget/Container2.cpp | 49 +++- sources/ewol/widget/Container2.h | 27 +- sources/ewol/widget/ContainerN.cpp | 62 +++-- sources/ewol/widget/ContainerN.h | 27 +- sources/ewol/widget/ContextMenu.cpp | 24 +- sources/ewol/widget/ContextMenu.h | 8 +- sources/ewol/widget/Entry.cpp | 17 +- sources/ewol/widget/Entry.h | 7 +- sources/ewol/widget/Gird.cpp | 30 +- sources/ewol/widget/Gird.h | 23 +- sources/ewol/widget/Image.cpp | 18 +- sources/ewol/widget/Image.h | 14 +- sources/ewol/widget/Joystick.cpp | 4 + sources/ewol/widget/Joystick.h | 5 +- sources/ewol/widget/Label.cpp | 17 +- sources/ewol/widget/Label.h | 13 +- sources/ewol/widget/Layer.cpp | 16 +- sources/ewol/widget/Layer.h | 12 +- sources/ewol/widget/List.cpp | 6 +- sources/ewol/widget/List.h | 4 +- sources/ewol/widget/ListFileSystem.cpp | 15 +- sources/ewol/widget/ListFileSystem.h | 9 +- sources/ewol/widget/Manager.cpp | 54 ++-- sources/ewol/widget/Manager.h | 24 +- sources/ewol/widget/Menu.cpp | 51 ++-- sources/ewol/widget/Menu.h | 17 +- sources/ewol/widget/PopUp.cpp | 21 +- sources/ewol/widget/PopUp.h | 10 +- sources/ewol/widget/ProgressBar.cpp | 12 +- sources/ewol/widget/ProgressBar.h | 5 +- sources/ewol/widget/Scroll.cpp | 25 +- sources/ewol/widget/Scroll.h | 9 +- sources/ewol/widget/Sizer.cpp | 26 +- sources/ewol/widget/Sizer.h | 15 +- sources/ewol/widget/Slider.cpp | 12 +- sources/ewol/widget/Slider.h | 7 +- sources/ewol/widget/Spacer.cpp | 12 +- sources/ewol/widget/Spacer.h | 13 +- sources/ewol/widget/WSlider.cpp | 18 +- sources/ewol/widget/WSlider.h | 12 +- sources/ewol/widget/Widget.cpp | 56 ++-- sources/ewol/widget/Widget.h | 47 ++-- sources/ewol/widget/WidgetScrolled.cpp | 12 +- sources/ewol/widget/WidgetScrolled.h | 7 +- sources/ewol/widget/Windows.cpp | 51 +++- sources/ewol/widget/Windows.h | 21 +- sources/ewol/widget/meta/ColorChooser.cpp | 48 ++-- sources/ewol/widget/meta/ColorChooser.h | 17 +- sources/ewol/widget/meta/FileChooser.cpp | 5 +- sources/ewol/widget/meta/FileChooser.h | 7 +- sources/ewol/widget/meta/Parameter.cpp | 66 ++--- sources/ewol/widget/meta/Parameter.h | 15 +- sources/ewol/widget/meta/ParameterList.cpp | 3 + sources/ewol/widget/meta/ParameterList.h | 5 +- sources/ewol/widget/meta/StdPopUp.cpp | 43 +-- sources/ewol/widget/meta/StdPopUp.h | 15 +- 129 files changed, 1312 insertions(+), 1897 deletions(-) delete mode 100644 sources/ewol/object/Owner.h delete mode 100644 sources/ewol/object/Shared.h diff --git a/build b/build index ec60375c..9d6418ee 160000 --- a/build +++ b/build @@ -1 +1 @@ -Subproject commit ec60375c9fdf6ae46db9ee5574ec8837e531e5fa +Subproject commit 9d6418eed9d24b85823aca4f3393e15a8edeb0cb diff --git a/external/etk b/external/etk index 9c14cc60..4c55bca4 160000 --- a/external/etk +++ b/external/etk @@ -1 +1 @@ -Subproject commit 9c14cc6077de87781f161a6fbb310837c90d91ba +Subproject commit 4c55bca47373281860619295acfdc859ea766bd3 diff --git a/sources/ewol/compositing/Area.cpp b/sources/ewol/compositing/Area.cpp index 6ba0c2ef..80aab863 100644 --- a/sources/ewol/compositing/Area.cpp +++ b/sources/ewol/compositing/Area.cpp @@ -22,7 +22,7 @@ ewol::compositing::Area::Area(const ivec2& _size) : m_GLtexture(-1), m_GLtexID(-1), m_resource(nullptr) { - m_resource = ewol::resource::Texture::keep(); + m_resource = ewol::resource::Texture::create(); m_resource->setImageSize(_size); m_resource->flush(); loadProgram(); @@ -35,7 +35,7 @@ ewol::compositing::Area::~Area() { void ewol::compositing::Area::loadProgram() { // get the shader resource : m_GLPosition = 0; - m_GLprogram = ewol::resource::Program::keep("DATA:textured3D.prog"); + m_GLprogram = ewol::resource::Program::create(std::string("DATA:textured3D.prog")); if (nullptr != m_GLprogram) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); m_GLColor = m_GLprogram->getAttribute("EW_color"); diff --git a/sources/ewol/compositing/Area.h b/sources/ewol/compositing/Area.h index 172126bc..0f713329 100644 --- a/sources/ewol/compositing/Area.h +++ b/sources/ewol/compositing/Area.h @@ -22,14 +22,14 @@ namespace ewol { vec3 m_position; //!< The current position to draw etk::Color<> m_color; //!< The text foreground color private: - ewol::object::Shared m_GLprogram; //!< pointer on the opengl display program + std::shared_ptr m_GLprogram; //!< pointer on the opengl display program int32_t m_GLPosition; //!< openGL id on the element (vertex buffer) int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix) int32_t m_GLColor; //!< openGL id on the element (color buffer) int32_t m_GLtexture; //!< openGL id on the element (Texture position) int32_t m_GLtexID; //!< openGL id on the element (texture ID) private: - ewol::object::Shared m_resource; //!< texture resources + std::shared_ptr m_resource; //!< texture resources std::vector m_coord; //!< internal coord of the object std::vector m_coordTex; //!< internal texture coordinate for every point std::vector > m_coordColor; //!< internal color of the different point diff --git a/sources/ewol/compositing/Drawing.cpp b/sources/ewol/compositing/Drawing.cpp index 7ef8a2f9..bc1aeea7 100644 --- a/sources/ewol/compositing/Drawing.cpp +++ b/sources/ewol/compositing/Drawing.cpp @@ -284,7 +284,7 @@ void ewol::compositing::Drawing::loadProgram() { // remove previous loading ... in case unLoadProgram(); // oad the new ... - m_GLprogram = ewol::resource::Program::keep("DATA:color3.prog"); + m_GLprogram = ewol::resource::Program::create("DATA:color3.prog"); // get the shader resource : if (nullptr != m_GLprogram ) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); diff --git a/sources/ewol/compositing/Drawing.h b/sources/ewol/compositing/Drawing.h index d19109f5..d71f38d7 100644 --- a/sources/ewol/compositing/Drawing.h +++ b/sources/ewol/compositing/Drawing.h @@ -28,7 +28,7 @@ namespace ewol { etk::Color<> m_color; //!< The text foreground color etk::Color<> m_colorBg; //!< The text background color private: - ewol::object::Shared m_GLprogram; //!< pointer on the opengl display program + std::shared_ptr m_GLprogram; //!< pointer on the opengl display program int32_t m_GLPosition; //!< openGL id on the element (vertex buffer) int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix) int32_t m_GLColor; //!< openGL id on the element (color buffer) diff --git a/sources/ewol/compositing/Image.cpp b/sources/ewol/compositing/Image.cpp index e4c5fac5..396e787e 100644 --- a/sources/ewol/compositing/Image.cpp +++ b/sources/ewol/compositing/Image.cpp @@ -43,9 +43,9 @@ void ewol::compositing::Image::loadProgram() { m_GLPosition = 0; m_GLprogram.reset(); if (m_distanceFieldMode == true) { - m_GLprogram = ewol::resource::Program::keep("DATA:texturedDF.prog"); + m_GLprogram = ewol::resource::Program::create("DATA:texturedDF.prog"); } else { - m_GLprogram = ewol::resource::Program::keep("DATA:textured3D.prog"); + m_GLprogram = ewol::resource::Program::create("DATA:textured3D.prog"); } if (m_GLprogram != nullptr) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); @@ -247,8 +247,8 @@ void ewol::compositing::Image::printPart(const vec2& _size, void ewol::compositing::Image::setSource(const std::string& _newFile, const vec2& _size) { clear(); - ewol::object::Shared resource(m_resource); - ewol::object::Shared resourceDF(m_resourceDF); + std::shared_ptr resource(m_resource); + std::shared_ptr resourceDF(m_resourceDF); m_filename = _newFile; m_requestSize = _size; m_resource.reset(); @@ -258,12 +258,12 @@ void ewol::compositing::Image::setSource(const std::string& _newFile, const vec2 if (_newFile != "") { // link to new one if (m_distanceFieldMode == false) { - m_resource = ewol::resource::TextureFile::keep(m_filename, tmpSize); + m_resource = ewol::resource::TextureFile::create(m_filename, tmpSize); if (m_resource == nullptr) { EWOL_ERROR("Can not get Image resource"); } } else { - m_resourceDF = ewol::resource::ImageDF::keep(m_filename, tmpSize); + m_resourceDF = ewol::resource::ImageDF::create(m_filename, tmpSize); if (m_resourceDF == nullptr) { EWOL_ERROR("Can not get Image resource DF"); } diff --git a/sources/ewol/compositing/Image.h b/sources/ewol/compositing/Image.h index a1978859..5702aa80 100644 --- a/sources/ewol/compositing/Image.h +++ b/sources/ewol/compositing/Image.h @@ -29,7 +29,7 @@ namespace ewol { etk::Color<> m_color; //!< The text foreground color float m_angle; //!< Angle to set at the axes private: - ewol::object::Shared m_GLprogram; //!< pointer on the opengl display program + std::shared_ptr m_GLprogram; //!< pointer on the opengl display program int32_t m_GLPosition; //!< openGL id on the element (vertex buffer) int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix) int32_t m_GLColor; //!< openGL id on the element (color buffer) @@ -37,8 +37,8 @@ namespace ewol { int32_t m_GLtexID; //!< openGL id on the element (texture ID) private: bool m_distanceFieldMode; //!< select distance field mode - ewol::object::Shared m_resource; //!< texture resources - ewol::object::Shared m_resourceDF; //!< texture resources + std::shared_ptr m_resource; //!< texture resources + std::shared_ptr m_resourceDF; //!< texture resources std::vector m_coord; //!< internal coord of the object std::vector m_coordTex; //!< internal texture coordinate for every point std::vector > m_coordColor; //!< internal color of the different point diff --git a/sources/ewol/compositing/Shaper.cpp b/sources/ewol/compositing/Shaper.cpp index be4d80f8..b4153664 100644 --- a/sources/ewol/compositing/Shaper.cpp +++ b/sources/ewol/compositing/Shaper.cpp @@ -84,7 +84,7 @@ void ewol::compositing::Shaper::loadProgram() { EWOL_DEBUG("no Shaper set for loading resources ..."); return; } - m_config = ewol::resource::ConfigFile::keep(m_name); + m_config = ewol::resource::ConfigFile::create(m_name); if (nullptr != m_config) { m_confIdMode = m_config->request("mode"); m_confIdDisplayOutside = m_config->request("display-outside"); @@ -118,7 +118,7 @@ void ewol::compositing::Shaper::loadProgram() { } // get the shader resource : m_GLPosition = 0; - m_GLprogram = ewol::resource::Program::keep(tmpFilename); + m_GLprogram = ewol::resource::Program::create(tmpFilename); if (m_GLprogram != nullptr) { m_GLPosition = m_GLprogram->getAttribute("EW_coord2d"); m_GLMatrix = m_GLprogram->getUniform("EW_MatrixTransformation"); @@ -144,7 +144,7 @@ void ewol::compositing::Shaper::loadProgram() { EWOL_DEBUG("Shaper try load shaper image : '" << tmpFilename << "'"); } ivec2 size(64,64); - m_resourceTexture = ewol::resource::TextureFile::keep(tmpFilename, size); + m_resourceTexture = ewol::resource::TextureFile::create(tmpFilename, size); } } std::string basicColorFile = m_config->getString(m_confColorFile); @@ -158,7 +158,7 @@ void ewol::compositing::Shaper::loadProgram() { } else { EWOL_DEBUG("Shaper try load colorFile : '" << tmpFilename << "'"); } - m_colorProperty = ewol::resource::ColorFile::keep(tmpFilename); + m_colorProperty = ewol::resource::ColorFile::create(tmpFilename); if ( m_GLprogram != nullptr && m_colorProperty != nullptr) { std::vector listColor = m_colorProperty->getColors(); diff --git a/sources/ewol/compositing/Shaper.h b/sources/ewol/compositing/Shaper.h index f4940364..7f3fab86 100644 --- a/sources/ewol/compositing/Shaper.h +++ b/sources/ewol/compositing/Shaper.h @@ -44,7 +44,7 @@ namespace ewol { private: std::string m_name; //!< Name of the configuration of the shaper. // External theme config: - ewol::object::Shared m_config; //!< pointer on the config file resources + std::shared_ptr m_config; //!< pointer on the config file resources int32_t m_confIdDisplayExternal; //!< Display external border int32_t m_confIdPaddingOut[shaperPosCount]; //!< Padding out property : X-left X-right Y-top Y-buttom int32_t m_confIdBorder[shaperPosCount]; //!< border property : X-left X-right Y-top Y-buttom @@ -56,7 +56,7 @@ namespace ewol { int32_t m_confColorFile; //!< ConfigFile opengGl color file Name int32_t m_confImageFile; //!< ConfigFile opengGl program Name // openGL shaders programs: - ewol::object::Shared m_GLprogram; //!< pointer on the opengl display program + std::shared_ptr m_GLprogram; //!< pointer on the opengl display program int32_t m_GLPosition; //!< openGL id on the element (vertex buffer) int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix) int32_t m_GLPropertyPos; //!< openGL id on the element (simple ratio position in the widget : ____/-----\_____ on vec2(X,Y)) @@ -66,7 +66,7 @@ namespace ewol { int32_t m_GLStateTransition; //!< openGL id on the element (transition ofset [0.0..1.0] ) int32_t m_GLtexID; //!< openGL id on the element (texture image) // For the Image : - ewol::object::Shared m_resourceTexture; //!< texture resources (for the image) + std::shared_ptr m_resourceTexture; //!< texture resources (for the image) // internal needed data : int32_t m_nextStatusRequested; //!< when status is changing, this represent the next step of it vec2 m_propertyOrigin; //!< widget origin @@ -81,7 +81,7 @@ namespace ewol { vec2 m_pos[SHAPER_NB_MAX_VERTEX]; //!< podition to display property int32_t m_nbVertexToDisplay; // color management theme: - ewol::object::Shared m_colorProperty; //!< input resource for color management + std::shared_ptr m_colorProperty; //!< input resource for color management std::vector m_listAssiciatedId; //!< Corellation ID between ColorProperty (Y) and OpenGL Program (X) private: /** diff --git a/sources/ewol/compositing/Text.cpp b/sources/ewol/compositing/Text.cpp index f9baec7b..b84d3dee 100644 --- a/sources/ewol/compositing/Text.cpp +++ b/sources/ewol/compositing/Text.cpp @@ -152,7 +152,7 @@ void ewol::compositing::Text::setFontName(const std::string& _fontName) { void ewol::compositing::Text::setFont(std::string _fontName, int32_t _fontSize) { clear(); // remove old one - ewol::object::Shared previousFont = m_font; + std::shared_ptr previousFont = m_font; if (_fontSize <= 0) { _fontSize = ewol::getContext().getFontDefault().getSize(); } @@ -163,7 +163,7 @@ void ewol::compositing::Text::setFont(std::string _fontName, int32_t _fontSize) _fontName += std::to_string(_fontSize); EWOL_VERBOSE("plop : " << _fontName << " size=" << _fontSize << " result :" << _fontName); // link to new one - m_font = ewol::resource::TexturedFont::keep(_fontName); + m_font = ewol::resource::TexturedFont::create(_fontName); if (m_font == nullptr) { EWOL_ERROR("Can not get font resource"); m_font = previousFont; diff --git a/sources/ewol/compositing/Text.h b/sources/ewol/compositing/Text.h index 082bfdb8..333e1927 100644 --- a/sources/ewol/compositing/Text.h +++ b/sources/ewol/compositing/Text.h @@ -25,7 +25,7 @@ namespace ewol { namespace compositing { class Text : public ewol::compositing::TextBase { protected: - ewol::object::Shared m_font; //!< Font resources + std::shared_ptr m_font; //!< Font resources public: /** * @brief generic constructor diff --git a/sources/ewol/compositing/TextBase.cpp b/sources/ewol/compositing/TextBase.cpp index ec6cde23..28cee9c0 100644 --- a/sources/ewol/compositing/TextBase.cpp +++ b/sources/ewol/compositing/TextBase.cpp @@ -53,8 +53,8 @@ ewol::compositing::TextBase::~TextBase() { void ewol::compositing::TextBase::loadProgram(const std::string& _shaderName) { // get the shader resource : m_GLPosition = 0; - ewol::object::Shared old = m_GLprogram; - m_GLprogram = ewol::resource::Program::keep(_shaderName); + std::shared_ptr old = m_GLprogram; + m_GLprogram = ewol::resource::Program::create(_shaderName); if (m_GLprogram != nullptr) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); m_GLColor = m_GLprogram->getAttribute("EW_color"); @@ -64,7 +64,7 @@ void ewol::compositing::TextBase::loadProgram(const std::string& _shaderName) { m_GLtextWidth = m_GLprogram->getUniform("EW_texWidth"); m_GLtextHeight = m_GLprogram->getUniform("EW_texHeight"); } else { - EWOL_ERROR("Can not load the program => keep previous one..."); + EWOL_ERROR("Can not load the program => create previous one..."); m_GLprogram = old; old = nullptr; } diff --git a/sources/ewol/compositing/TextBase.h b/sources/ewol/compositing/TextBase.h index a0c6715a..a2b50fb8 100644 --- a/sources/ewol/compositing/TextBase.h +++ b/sources/ewol/compositing/TextBase.h @@ -77,7 +77,7 @@ namespace ewol { float m_stopTextPos; //!< end of the alignement (when a string is too hight it cut at the word previously this virtual line and the center is perform with this one) enum aligneMode m_alignement; //!< Current Alignement mode (justify/left/right ...) protected: - ewol::object::Shared m_GLprogram; //!< pointer on the opengl display program + std::shared_ptr m_GLprogram; //!< pointer on the opengl display program int32_t m_GLPosition; //!< openGL id on the element (vertex buffer) int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix) int32_t m_GLColor; //!< openGL id on the element (color buffer) diff --git a/sources/ewol/compositing/TextDF.cpp b/sources/ewol/compositing/TextDF.cpp index 5337281f..45c80b5c 100644 --- a/sources/ewol/compositing/TextDF.cpp +++ b/sources/ewol/compositing/TextDF.cpp @@ -155,7 +155,7 @@ void ewol::compositing::TextDF::setFontSize(int32_t _fontSize) { void ewol::compositing::TextDF::setFontName(const std::string& _fontName) { clear(); // remove old one - ewol::object::Shared previousFont = m_fontDF; + std::shared_ptr previousFont = m_fontDF; std::string fontName; if (_fontName == "") { fontName = ewol::getContext().getFontDefault().getName(); @@ -164,7 +164,7 @@ void ewol::compositing::TextDF::setFontName(const std::string& _fontName) { } EWOL_VERBOSE("Set font name: '" << fontName << "'"); // link to new one - m_fontDF = ewol::resource::DistanceFieldFont::keep(fontName); + m_fontDF = ewol::resource::DistanceFieldFont::create(fontName); if (m_fontDF == nullptr) { EWOL_ERROR("Can not get find resource"); m_fontDF = previousFont; diff --git a/sources/ewol/compositing/TextDF.h b/sources/ewol/compositing/TextDF.h index b3de8f88..b60a8f45 100644 --- a/sources/ewol/compositing/TextDF.h +++ b/sources/ewol/compositing/TextDF.h @@ -23,7 +23,7 @@ namespace ewol { namespace compositing { class TextDF : public ewol::compositing::TextBase { protected: - ewol::object::Shared m_fontDF; //!< Font resources + std::shared_ptr m_fontDF; //!< Font resources std::vector m_glyphLevel; //!< Level of display of the glyph (notmal : 0.50, bold : 0.40, super bold : 0.30 ...) protected: int32_t m_GLglyphLevel; //!< openGL Id on the glyph level display diff --git a/sources/ewol/context/Context.cpp b/sources/ewol/context/Context.cpp index 73d9fa1b..06dd7e0a 100644 --- a/sources/ewol/context/Context.cpp +++ b/sources/ewol/context/Context.cpp @@ -135,13 +135,13 @@ namespace ewol { }; -void ewol::Context::inputEventTransfertWidget(ewol::object::Shared _source, - ewol::object::Shared _destination) { +void ewol::Context::inputEventTransfertWidget(std::shared_ptr _source, + std::shared_ptr _destination) { m_input.transfertEvent(_source, _destination); } -void ewol::Context::inputEventGrabPointer(ewol::object::Shared _widget) { +void ewol::Context::inputEventGrabPointer(std::shared_ptr _widget) { m_input.grabPointer(_widget); } @@ -196,7 +196,7 @@ void ewol::Context::processEvents() { data->keyboardMove, data->stateIsDown) ) { // get the current focused Widget : - ewol::object::Shared tmpWidget = m_widgetManager.focusGet(); + std::shared_ptr tmpWidget = m_widgetManager.focusGet(); if (nullptr != tmpWidget) { // check if the widget allow repeating key events. //EWOL_DEBUG("repeating test :" << data->repeateKey << " widget=" << tmpWidget->getKeyboardRepeate() << " state=" << data->stateIsDown); @@ -239,7 +239,7 @@ void ewol::Context::processEvents() { break; case eSystemMessage::msgClipboardArrive: { - ewol::object::Shared tmpWidget = m_widgetManager.focusGet(); + std::shared_ptr tmpWidget = m_widgetManager.focusGet(); if (tmpWidget != nullptr) { tmpWidget->onEventClipboard(data->clipboardID); } @@ -676,7 +676,7 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) { return hasDisplayDone; } -void ewol::Context::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::Context::onObjectRemove(const std::shared_ptr& _object) { //EWOL_CRITICAL("element removed"); if (m_windowsCurrent == _object) { m_windowsCurrent.reset(); // This might never arrived, the owner is the current element (expected when the widget auto remove itself) @@ -695,7 +695,7 @@ void ewol::Context::OS_OpenGlContextDestroy() { m_resourceManager.contextHasBeenDestroyed(); } -void ewol::Context::setWindows(const ewol::object::Shared& _windows) { +void ewol::Context::setWindows(const std::shared_ptr& _windows) { // remove current focus : m_widgetManager.focusSetDefault(nullptr); m_widgetManager.focusRelease(); @@ -707,7 +707,7 @@ void ewol::Context::setWindows(const ewol::object::Shared forceRedrawAll(); } -ewol::object::Shared ewol::Context::getWindows() { +std::shared_ptr ewol::Context::getWindows() { return m_windowsCurrent; }; diff --git a/sources/ewol/context/Context.h b/sources/ewol/context/Context.h index 3abd3de1..1344d5d1 100644 --- a/sources/ewol/context/Context.h +++ b/sources/ewol/context/Context.h @@ -145,7 +145,7 @@ namespace ewol { // return true if a flush is needed bool OS_Draw(bool _displayEveryTime); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); public: /** * @brief reset event management for the IO like Input ou Mouse or keyborad @@ -164,18 +164,18 @@ namespace ewol { */ virtual void stop(); private: - ewol::object::Owner m_windowsCurrent; //!< curent displayed windows + std::shared_ptr m_windowsCurrent; //!< curent displayed windows public: /** * @brief set the current windows to display : * @param _windows Windows that might be displayed */ - void setWindows(const ewol::object::Shared& _windows); + void setWindows(const std::shared_ptr& _windows); /** * @brief get the current windows that is displayed * @return the current handle on the windows (can be null) */ - ewol::object::Shared getWindows(); + std::shared_ptr getWindows(); private: vec2 m_windowsSize; //!< current size of the system public: @@ -233,12 +233,12 @@ namespace ewol { * @param source the widget where the event came from * @param destination the widget where the event mitgh be generated now */ - void inputEventTransfertWidget(ewol::object::Shared _source, ewol::object::Shared _destination); + void inputEventTransfertWidget(std::shared_ptr _source, std::shared_ptr _destination); /** * @brief This fonction lock the pointer properties to move in relative instead of absolute * @param[in] widget The widget that lock the pointer events */ - void inputEventGrabPointer(ewol::object::Shared _widget); + void inputEventGrabPointer(std::shared_ptr _widget); /** * @brief This fonction un-lock the pointer properties to move in relative instead of absolute */ diff --git a/sources/ewol/context/InputManager.cpp b/sources/ewol/context/InputManager.cpp index 8ff9a7f5..04195704 100644 --- a/sources/ewol/context/InputManager.cpp +++ b/sources/ewol/context/InputManager.cpp @@ -42,7 +42,7 @@ void ewol::context::InputManager::setDpi(int32_t newDPI) { } bool ewol::context::InputManager::localEventInput(enum ewol::key::type _type, - ewol::object::Shared _destWidget, + std::shared_ptr _destWidget, int32_t _IdInput, enum ewol::key::status _status, vec2 _pos) { @@ -67,7 +67,7 @@ void ewol::context::InputManager::abortElement(InputPoperty *_eventTable, } if (_eventTable[_idInput].isUsed == true) { localEventInput(_type, - _eventTable[_idInput].curentWidgetEvent, + _eventTable[_idInput].curentWidgetEvent.lock(), _eventTable[_idInput].destinationInputId, ewol::key::statusAbort, _eventTable[_idInput].posEvent); @@ -93,38 +93,40 @@ void ewol::context::InputManager::cleanElement(InputPoperty *_eventTable, _eventTable[_idInput].posEvent.setValue(0,0); } -void ewol::context::InputManager::transfertEvent(ewol::object::Shared _source, ewol::object::Shared _destination) { +void ewol::context::InputManager::transfertEvent(std::shared_ptr _source, std::shared_ptr _destination) { if( _source == nullptr || _destination == nullptr) { // prevent errors ... return; } for(int32_t iii=0; iii tmpWidget = m_eventInputSaved[iii].curentWidgetEvent.lock(); + if (tmpWidget == _source) { // inform the widget that it does not receive the event now EVENT_DEBUG("GUI : Input ID=" << iii << " == >" << m_eventInputSaved[iii].destinationInputId << " [EVENT_INPUT_TYPE_ABORT] " << m_eventInputSaved[iii].posEvent); - localEventInput(ewol::key::typeFinger, m_eventInputSaved[iii].curentWidgetEvent, m_eventInputSaved[iii].destinationInputId, ewol::key::statusAbort, m_eventInputSaved[iii].posEvent); + localEventInput(ewol::key::typeFinger, tmpWidget, m_eventInputSaved[iii].destinationInputId, ewol::key::statusAbort, m_eventInputSaved[iii].posEvent); // set the new widget ... m_eventInputSaved[iii].curentWidgetEvent = _destination; // inform the widget that he receive the event property now... EVENT_DEBUG("GUI : Input ID=" << iii << " == >" << m_eventInputSaved[iii].destinationInputId << " [EVENT_INPUT_TYPE_TRANSFERT] " << m_eventInputSaved[iii].posEvent); - localEventInput(ewol::key::typeFinger, m_eventInputSaved[iii].curentWidgetEvent, m_eventInputSaved[iii].destinationInputId, ewol::key::statusTransfert, m_eventInputSaved[iii].posEvent); + localEventInput(ewol::key::typeFinger, _destination, m_eventInputSaved[iii].destinationInputId, ewol::key::statusTransfert, m_eventInputSaved[iii].posEvent); } - if (m_eventMouseSaved[iii].curentWidgetEvent == _source) { + tmpWidget = m_eventMouseSaved[iii].curentWidgetEvent.lock(); + if (tmpWidget == _source) { // inform the widget that it does not receive the event now EVENT_DEBUG("GUI : Input ID=" << iii << " == >" << m_eventMouseSaved[iii].destinationInputId << " [EVENT_INPUT_TYPE_ABORT] " << m_eventMouseSaved[iii].posEvent); - localEventInput(ewol::key::typeMouse, m_eventMouseSaved[iii].curentWidgetEvent, m_eventMouseSaved[iii].destinationInputId, ewol::key::statusAbort, m_eventMouseSaved[iii].posEvent); + localEventInput(ewol::key::typeMouse, tmpWidget, m_eventMouseSaved[iii].destinationInputId, ewol::key::statusAbort, m_eventMouseSaved[iii].posEvent); // set the new widget ... m_eventMouseSaved[iii].curentWidgetEvent = _destination; // inform the widget that he receive the event property now... EVENT_DEBUG("GUI : Input ID=" << iii << " == >" << m_eventMouseSaved[iii].destinationInputId << " [EVENT_INPUT_TYPE_TRANSFERT] " << m_eventMouseSaved[iii].posEvent); - localEventInput(ewol::key::typeMouse, m_eventMouseSaved[iii].curentWidgetEvent, m_eventMouseSaved[iii].destinationInputId, ewol::key::statusTransfert, m_eventMouseSaved[iii].posEvent); + localEventInput(ewol::key::typeMouse, _destination, m_eventMouseSaved[iii].destinationInputId, ewol::key::statusTransfert, m_eventMouseSaved[iii].posEvent); } } } -void ewol::context::InputManager::grabPointer(ewol::object::Shared _widget) { - if(nullptr == _widget) { +void ewol::context::InputManager::grabPointer(std::shared_ptr _widget) { + if(_widget == nullptr) { return; } m_grabWidget = _widget; @@ -134,26 +136,29 @@ void ewol::context::InputManager::grabPointer(ewol::object::Shared } void ewol::context::InputManager::unGrabPointer() { - m_grabWidget = nullptr; + m_grabWidget.reset(); m_context.grabPointerEvents(false, vec2(0,0)); } -void ewol::context::InputManager::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::context::InputManager::onObjectRemove(const std::shared_ptr& _object) { for(int32_t iii=0; iii tmpWidget = m_eventInputSaved[iii].curentWidgetEvent.lock(); + if (tmpWidget == _object) { // remove the property of this input ... EWOL_VERBOSE("Remove object ==> rm Input Event !!!"); cleanElement(m_eventInputSaved, iii); } - if (m_eventMouseSaved[iii].curentWidgetEvent == _object) { + tmpWidget = m_eventMouseSaved[iii].curentWidgetEvent.lock(); + if (tmpWidget == _object) { // remove the property of this input ... EWOL_VERBOSE("Remove object ==> rm Mouse Event !!!"); cleanElement(m_eventMouseSaved, iii); } } - if (m_grabWidget == _object) { + std::shared_ptr tmpWidgetGrab = m_grabWidget.lock(); + if (tmpWidgetGrab == _object) { EWOL_VERBOSE("Remove object ==> rm Grab widget !!!"); - m_grabWidget.reset(); + tmpWidgetGrab.reset(); } } @@ -168,7 +173,7 @@ void ewol::context::InputManager::newLayerSet() { } ewol::context::InputManager::InputManager(ewol::Context& _context) : - m_grabWidget(nullptr), + m_grabWidget(), m_context(_context) { setDpi(200); EWOL_INFO("Init (start)"); @@ -186,13 +191,14 @@ ewol::context::InputManager::~InputManager() { } int32_t ewol::context::InputManager::localGetDestinationId(enum ewol::key::type _type, - ewol::object::Shared _destWidget, + std::shared_ptr _destWidget, int32_t _realInputId) { if (_type == ewol::key::typeFinger) { int32_t lastMinimum = 0; for(int32_t iii=0; iii tmpWidget = m_eventInputSaved[iii].curentWidgetEvent.lock(); + if (tmpWidget == _destWidget) { if (iii != _realInputId) { lastMinimum = std::max(lastMinimum, m_eventInputSaved[iii].destinationInputId); } @@ -227,21 +233,21 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, // not manage input return; } - ewol::object::Shared tmpWindows = m_context.getWindows(); + std::shared_ptr tmpWindows = m_context.getWindows(); // special case for the mouse event 0 that represent the hover event of the system : if (_type == ewol::key::typeMouse && _pointerID == 0) { // this event is all time on the good widget ... and manage the enter and leave ... // NOTE : the "layer widget" force us to get the widget at the specific position all the time : - ewol::object::Shared tmpWidget = nullptr; - if (m_grabWidget != nullptr) { + std::shared_ptr tmpWidget; + if (m_grabWidget.lock() != nullptr) { // grab all events ... - tmpWidget = m_grabWidget; + tmpWidget = m_grabWidget.lock(); } else { if (nullptr != tmpWindows) { tmpWidget = tmpWindows->getWidgetAtPos(_pos); } } - if( tmpWidget != eventTable[_pointerID].curentWidgetEvent + if( tmpWidget != eventTable[_pointerID].curentWidgetEvent.lock() || ( true == eventTable[_pointerID].isInside && ( eventTable[_pointerID].origin.x() > _pos.x() || eventTable[_pointerID].origin.y() > _pos.y() @@ -251,22 +257,21 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [LEAVE] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, ewol::key::statusLeave, _pos); } - if (false == eventTable[_pointerID].isInside) { + if (eventTable[_pointerID].isInside == false) { // set the element inside ... eventTable[_pointerID].isInside = true; // get destination widget : eventTable[_pointerID].curentWidgetEvent = tmpWidget; - if (nullptr == eventTable[_pointerID].curentWidgetEvent) { + if (tmpWidget == nullptr) { eventTable[_pointerID].isInside = false; - } - if (nullptr != eventTable[_pointerID].curentWidgetEvent) { - eventTable[_pointerID].origin = eventTable[_pointerID].curentWidgetEvent->getOrigin(); - eventTable[_pointerID].size = eventTable[_pointerID].curentWidgetEvent->getSize(); + } else { + eventTable[_pointerID].origin = tmpWidget->getOrigin(); + eventTable[_pointerID].size = tmpWidget->getSize(); } eventTable[_pointerID].destinationInputId = 0; EVENT_DEBUG("GUI : Input ID=" << _pointerID @@ -274,7 +279,7 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, << " [ENTER] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, eventTable[_pointerID].destinationInputId, ewol::key::statusEnter, _pos); @@ -284,7 +289,7 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, << " [MOVE] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, eventTable[_pointerID].destinationInputId, ewol::key::statusMove, _pos); @@ -300,7 +305,7 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, << " [LEAVE] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, ewol::key::statusLeave, _pos); @@ -316,7 +321,7 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, << " [ENTER] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, ewol::key::statusEnter, _pos); @@ -327,7 +332,7 @@ void ewol::context::InputManager::motion(enum ewol::key::type _type, << " [MOVE] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, ewol::key::statusMove, _pos); @@ -364,7 +369,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, } // get the curent time ... int64_t currentTime = ewol::getTime(); - ewol::object::Shared tmpWindows = m_context.getWindows(); + std::shared_ptr tmpWindows = m_context.getWindows(); if (true == _isDown) { EVENT_DEBUG("GUI : Input ID=" << _pointerID @@ -388,7 +393,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, ewol::key::statusDown, _pos); @@ -401,20 +406,23 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, eventTable[_pointerID].lastTimeEvent = currentTime; // set the element inside ... eventTable[_pointerID].isInside = true; + std::shared_ptr tmpWidget = m_grabWidget.lock(); // get destination widget : if(nullptr != tmpWindows) { - if (m_grabWidget != nullptr && _type == ewol::key::typeMouse) { - eventTable[_pointerID].curentWidgetEvent = m_grabWidget; + if ( tmpWidget != nullptr + && _type == ewol::key::typeMouse) { + eventTable[_pointerID].curentWidgetEvent = tmpWidget; } else { eventTable[_pointerID].curentWidgetEvent = tmpWindows->getWidgetAtPos(_pos); } } else { - eventTable[_pointerID].curentWidgetEvent = nullptr; + eventTable[_pointerID].curentWidgetEvent.reset(); } - if (nullptr != eventTable[_pointerID].curentWidgetEvent) { - eventTable[_pointerID].origin = eventTable[_pointerID].curentWidgetEvent->getOrigin(); - eventTable[_pointerID].size = eventTable[_pointerID].curentWidgetEvent->getSize(); - eventTable[_pointerID].destinationInputId = localGetDestinationId(_type, eventTable[_pointerID].curentWidgetEvent, _pointerID); + tmpWidget = eventTable[_pointerID].curentWidgetEvent.lock(); + if (tmpWidget != nullptr) { + eventTable[_pointerID].origin = tmpWidget->getOrigin(); + eventTable[_pointerID].size = tmpWidget->getSize(); + eventTable[_pointerID].destinationInputId = localGetDestinationId(_type, tmpWidget, _pointerID); } else { eventTable[_pointerID].destinationInputId = -1; } @@ -424,7 +432,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, eventTable[_pointerID].destinationInputId, ewol::key::statusDown, _pos); @@ -439,8 +447,9 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, // Mark it un-used : eventTable[_pointerID].isUsed = false; // revove the widget ... - eventTable[_pointerID].curentWidgetEvent = nullptr; + eventTable[_pointerID].curentWidgetEvent.reset(); } else { + std::shared_ptr tmpWidget = eventTable[_pointerID].curentWidgetEvent.lock(); // generate UP Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId @@ -448,7 +457,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, eventTable[_pointerID].posEvent = _pos; // send up event after the single event to prevent multiple widget getting elements localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, _pointerID, ewol::key::statusUp, _pos); @@ -460,14 +469,14 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, // save start time eventTable[_pointerID].lastTimeEvent = currentTime; int32_t nbClickMax = 0; - if(eventTable[_pointerID].curentWidgetEvent != nullptr) { - nbClickMax = eventTable[_pointerID].curentWidgetEvent->getMouseLimit(); + if(tmpWidget != nullptr) { + nbClickMax = tmpWidget->getMouseLimit(); if (nbClickMax>5) { nbClickMax = 5; } } // in grab mode the single to quinte event are not generated .... - if( ( m_grabWidget == nullptr + if( ( m_grabWidget.lock() == nullptr || _type != ewol::key::typeMouse ) && eventTable[_pointerID].nbClickEvent < nbClickMax) { // generate event SINGLE : @@ -477,7 +486,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, << " [" << eventTable[_pointerID].nbClickEvent << "] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, eventTable[_pointerID].destinationInputId, (enum ewol::key::status)(ewol::key::statusSingle + eventTable[_pointerID].nbClickEvent-1), _pos); @@ -490,7 +499,7 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, } // send up event after the single event to prevent multiple widget getting elements localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, + tmpWidget, _pointerID, ewol::key::statusUpAfter, _pos); diff --git a/sources/ewol/context/InputManager.h b/sources/ewol/context/InputManager.h index d929fa18..3b035592 100644 --- a/sources/ewol/context/InputManager.h +++ b/sources/ewol/context/InputManager.h @@ -22,17 +22,17 @@ namespace ewol { */ class InputPoperty { public: - bool isUsed; - int32_t destinationInputId; - int64_t lastTimeEvent; - ewol::object::Shared curentWidgetEvent; - vec2 origin; - vec2 size; - vec2 downStart; - vec2 posEvent; - bool isDown; - bool isInside; - int32_t nbClickEvent; // 0 .. 1 .. 2 .. 3 + bool isUsed; + int32_t destinationInputId; + int64_t lastTimeEvent; + std::weak_ptr curentWidgetEvent; + vec2 origin; + vec2 size; + vec2 downStart; + vec2 posEvent; + bool isDown; + bool isInside; + int32_t nbClickEvent; // 0 .. 1 .. 2 .. 3 }; /** @@ -48,7 +48,7 @@ namespace ewol { class InputManager{ // special grab pointer mode : private: - ewol::object::Shared m_grabWidget; //!< widget that grab the curent pointer. + std::weak_ptr m_grabWidget; //!< widget that grab the curent pointer. private: int32_t m_dpi; InputLimit m_eventInputLimit; @@ -68,7 +68,7 @@ namespace ewol { * @return true if event has been greped */ bool localEventInput(enum ewol::key::type _type, - ewol::object::Shared _destWidget, + std::shared_ptr _destWidget, int32_t _IdInput, enum ewol::key::status _typeEvent, vec2 _pos); @@ -82,7 +82,7 @@ namespace ewol { * @return the ewol input id */ int32_t localGetDestinationId(enum ewol::key::type _type, - ewol::object::Shared _destWidget, + std::shared_ptr _destWidget, int32_t _realInputId); private: ewol::Context& m_context; @@ -95,7 +95,7 @@ namespace ewol { void motion(enum ewol::key::type _type, int _pointerID, vec2 _pos ); void state(enum ewol::key::type _type, int _pointerID, bool _isDown, vec2 _pos); - void onObjectRemove(const ewol::object::Shared& _object); + void onObjectRemove(const std::shared_ptr& _object); public: /** * @brief a new layer on the windows is set == > might remove all the property of the current element ... @@ -106,12 +106,12 @@ namespace ewol { * @param _source the widget where the event came from * @param _destination the widget where the event mitgh be generated now */ - void transfertEvent(ewol::object::Shared _source, ewol::object::Shared _destination); + void transfertEvent(std::shared_ptr _source, std::shared_ptr _destination); /** * @brief This fonction lock the pointer properties to move in relative instead of absolute * @param[in] _widget The widget that lock the pointer events */ - void grabPointer(ewol::object::Shared _widget); + void grabPointer(std::shared_ptr _widget); /** * @brief This fonction un-lock the pointer properties to move in relative instead of absolute */ diff --git a/sources/ewol/event/Input.h b/sources/ewol/event/Input.h index 8d57499a..2a024944 100644 --- a/sources/ewol/event/Input.h +++ b/sources/ewol/event/Input.h @@ -78,7 +78,7 @@ namespace ewol { enum ewol::key::status _status, uint8_t _id, const vec2& _pos, - ewol::object::Shared _dest, + std::shared_ptr _dest, int32_t _realIdEvent, ewol::key::Special _specialKey) : m_event(_type, _status, _id, _pos, _specialKey), @@ -86,13 +86,13 @@ namespace ewol { m_realIdEvent(_realIdEvent) { }; ewol::event::Input m_event; private: - ewol::object::Shared m_dest; + std::shared_ptr m_dest; int32_t m_realIdEvent; public: - void setDestWidget(ewol::object::Shared _dest) { + void setDestWidget(std::shared_ptr _dest) { m_dest = _dest; }; - inline ewol::object::Shared getDestWidget() const { + inline std::shared_ptr getDestWidget() const { return m_dest; }; void setRealId(int32_t _realIdEvent) { diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index 5f9e978a..f229eff9 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -22,10 +22,6 @@ ewol::object::Manager::Manager(ewol::Context& _context) : ewol::object::Manager::~Manager() { bool hasError = false; - if (m_eObjectListActive.size()!=0) { - EWOL_ERROR("Must not have anymore eObject to auto-remove !!!"); - hasError = true; - } if (m_eObjectList.size()!=0) { EWOL_ERROR("Must not have anymore eObject !!!"); hasError = true; @@ -39,47 +35,48 @@ ewol::object::Manager::~Manager() { void ewol::object::Manager::displayListObject() { EWOL_INFO("List loaded object : "); for (auto &it : m_eObjectList) { - EWOL_INFO(" Ref=" << it->getRefCount() << " remove=" << it->isDestroyed() << " name='" << it->getName() << "' type=" << it->getObjectType()); + std::shared_ptr element = it.lock(); + if (element != nullptr) { + EWOL_INFO(" name='" << element->getName() << "' type=" << element->getObjectType()); + } } } void ewol::object::Manager::unInit() { EWOL_DEBUG(" == > Un-Init Object-Manager"); for (auto &it : m_eObjectList) { - if (it != nullptr) { + std::shared_ptr element = it.lock(); + if (element != nullptr) { //it->removeObject(); } } - removeAllRemovedObject(); - EWOL_INFO(" remove missing user object"); - if (m_eObjectListActive.size() != 0) { - EWOL_ERROR("Have " << m_eObjectListActive.size() << " active Object"); + if (m_eObjectList.size() != 0) { + EWOL_ERROR("Have " << m_eObjectList.size() << " active Object"); } m_multiCast.clear(); - m_eObjectListActive.clear(); m_eObjectList.clear(); - removeAllRemovedObject(); - } -void ewol::object::Manager::add(const ewol::object::Shared& _object) { +void ewol::object::Manager::add(const std::shared_ptr& _object) { if (_object == nullptr) { EWOL_ERROR("try to add an inexistant Object in manager"); } m_eObjectList.push_back(_object); - m_eObjectListActive.push_back(_object); } int32_t ewol::object::Manager::getNumberObject() { return m_eObjectList.size(); } -void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared& _object) { +void ewol::object::Manager::informOneObjectIsRemoved(const std::shared_ptr& _object) { + EWOL_TODO("ewol::object::Manager::informOneObjectIsRemoved()"); + /* for (auto &it : m_eObjectList) { - if ( it != nullptr - && it != _object) { - EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << it->getId() << " type=" << it->getObjectType() << " name='" << it->getName() << "'"); - it->onObjectRemove(_object); + std::shared_ptr element = it.lock(); + if ( element != nullptr + && element != _object) { + EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << element->getId() << " type=" << element->getObjectType() << " name='" << element->getName() << "'"); + element->onObjectRemove(_object); } } // inform context that n object is removed ... @@ -88,25 +85,17 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared< EWOL_VERBOSE("m_removeEventList.size() = " << m_removeEventList.size()); for (auto &it : m_removeEventList) { EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ..."); - it->onObjectRemove(_object); - } -} - -void ewol::object::Manager::respown(const ewol::object::Shared& _object){ - if (_object == nullptr) { - EWOL_ERROR("Try to respown nullptr Object"); - return; - } - for (auto it : m_eObjectListActive) { - if (it == _object) { - EWOL_ERROR("try to respawn an existing active Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'"); - return; + std::shared_ptr element = it.lock(); + if (element != nullptr) { + element->onObjectRemove(_object); } } - m_eObjectListActive.push_back(_object); + */ } -void ewol::object::Manager::remove(const ewol::object::Shared& _object) { +void ewol::object::Manager::remove(const std::shared_ptr& _object) { + EWOL_TODO("ewol::object::Manager::remove()"); + /* if (_object == nullptr) { EWOL_ERROR("Try to Auto-Remove (nullptr) Object"); return; @@ -133,32 +122,36 @@ void ewol::object::Manager::remove(const ewol::object::Shared& _ob || count<0) { EWOL_ERROR("Remove more than one object in the system list ==> this is a real problem ..."); } + */ } // clean all Object that request an autoRemove ... void ewol::object::Manager::removeAllRemovedObject() { - EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectListActive.size() << "/" << m_eObjectList.size() << " elemeents"); + size_t nbObject = m_eObjectList.size(); + EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectList.size() << " elements"); auto it(m_eObjectList.begin()); while (it != m_eObjectList.end()) { - if ( *it != nullptr - && (*it)->getRefCount() <= 1) { - EWOL_DEBUG("remove definitly : [" << (*it)->getId() << "] type='" << (*it)->getObjectType() << "'"); + if (it->expired() == true) { m_eObjectList.erase(it); it = m_eObjectList.begin(); } else { ++it; } } + if (m_eObjectList.size() != nbObject) { + EWOL_VERBOSE(" remove " << nbObject - m_eObjectList.size() << " deprecated objects"); + } } -ewol::object::Shared ewol::object::Manager::get(const std::string& _name) { +std::shared_ptr ewol::object::Manager::get(const std::string& _name) { if (_name == "") { return nullptr; } for (auto &it : m_eObjectList) { - if ( it != nullptr - && it->getName() == _name) { - return it; + std::shared_ptr element = it.lock(); + if ( element != nullptr + && element->getName() == _name) { + return element; } } return nullptr; @@ -178,13 +171,7 @@ void ewol::object::Manager::rm(ewol::object::RemoveEvent* _class) { } } -ewol::object::Shared ewol::object::Manager::getObjectNamed(const std::string& _name) { - for (auto &it : m_eObjectList) { - if ( it != nullptr - && _name == it->getName()) { - return it; - } - } - return nullptr; +std::shared_ptr ewol::object::Manager::getObjectNamed(const std::string& _name) { + return ewol::object::Manager::get(_name); } diff --git a/sources/ewol/object/Manager.h b/sources/ewol/object/Manager.h index a35095ce..4d8a3d63 100644 --- a/sources/ewol/object/Manager.h +++ b/sources/ewol/object/Manager.h @@ -20,8 +20,7 @@ namespace ewol { class Manager { private: std::vector m_removeEventList; - std::vector> m_eObjectList; // all widget allocated == > all time increment ... never removed ... - std::vector> m_eObjectListActive; // all active widget + std::vector> m_eObjectList; // all widget allocated == > all time increment ... never removed ... Context& m_context; public: Manager(Context& _context); @@ -43,23 +42,18 @@ namespace ewol { * @note The manager remove the object when the refecence Low down 1 (last keeper) * @param[in] _object Reference shared pointer on the object */ - void add(const ewol::object::Shared& _object); + void add(const std::shared_ptr& _object); /** * @brief Called when an object request to be removed * @param[in] _object Reference shared pointer on the object */ - void remove(const ewol::object::Shared& _object); - /** - * @brief Called when a user want to reuse an object that have been removed previously - * @param[in] _object Reference shared pointer on the object - */ - void respown(const ewol::object::Shared& _object); + void remove(const std::shared_ptr& _object); public: void removeAllRemovedObject(); - ewol::object::Shared get(const std::string& _name); + std::shared_ptr get(const std::string& _name); private: - void informOneObjectIsRemoved(const ewol::object::Shared& _object); + void informOneObjectIsRemoved(const std::shared_ptr& _object); private: ewol::object::MultiCast m_multiCast; //!< muticast manager public: @@ -76,7 +70,7 @@ namespace ewol { * @param[in] _name Name of the object * @return the requested object or nullptr */ - ewol::object::Shared getObjectNamed(const std::string& _name); + std::shared_ptr getObjectNamed(const std::string& _name); }; }; }; diff --git a/sources/ewol/object/Message.h b/sources/ewol/object/Message.h index 440cd205..7473a87d 100644 --- a/sources/ewol/object/Message.h +++ b/sources/ewol/object/Message.h @@ -15,11 +15,11 @@ namespace ewol { namespace object { class Message { private: - ewol::object::Shared m_callerObject; //!< Caller class. + std::shared_ptr m_callerObject; //!< Caller class. const char* m_event; //!< Event pointer == > unique Id define by the system ... std::string m_data; //!< compositing additionnal message Value. public: - Message(const ewol::object::Shared& _caller, + Message(const std::shared_ptr& _caller, const char* _message, const std::string& _data) : m_callerObject(_caller), @@ -27,10 +27,10 @@ namespace ewol { m_data(_data) { }; - void setCaller(const ewol::object::Shared& _caller) { + void setCaller(const std::shared_ptr& _caller) { m_callerObject = _caller; }; - inline ewol::object::Shared getCaller() const { + inline std::shared_ptr getCaller() const { return m_callerObject; }; void setMessage(const char* _message) { diff --git a/sources/ewol/object/MultiCast.cpp b/sources/ewol/object/MultiCast.cpp index 3ab2f104..b5e7bbea 100644 --- a/sources/ewol/object/MultiCast.cpp +++ b/sources/ewol/object/MultiCast.cpp @@ -28,10 +28,11 @@ void ewol::object::MultiCast::clear() { m_messageList.clear(); } -void ewol::object::MultiCast::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::object::MultiCast::onObjectRemove(const std::shared_ptr& _object) { auto it(m_messageList.begin()); while (it != m_messageList.end()) { - if (it->m_object == _object) { + std::shared_ptr obj = it->m_object.lock(); + if (obj == _object) { m_messageList.erase(it); it = m_messageList.begin(); } else { @@ -40,12 +41,12 @@ void ewol::object::MultiCast::onObjectRemove(const ewol::object::Shared& _object, const char* const _message) { - if (nullptr == _object) { +void ewol::object::MultiCast::add(const std::shared_ptr& _object, const char* const _message) { + if (_object == nullptr) { EWOL_ERROR("Add with nullptr object"); return; } - if (nullptr == _message) { + if (_message == nullptr) { EWOL_ERROR("Add with nullptr Message"); return; } @@ -54,15 +55,16 @@ void ewol::object::MultiCast::add(const ewol::object::Shared& _obj } -void ewol::object::MultiCast::rm(const ewol::object::Shared& _object) { - if (nullptr == _object) { +void ewol::object::MultiCast::rm(const std::shared_ptr& _object) { + if (_object == nullptr) { EWOL_ERROR("Rm with nullptr object"); return; } // send the message at all registered widget ... auto it(m_messageList.begin()); while (it != m_messageList.end()) { - if(it->m_object == _object) { + std::shared_ptr obj = it->m_object.lock(); + if(obj == _object) { EWOL_DEBUG("SendMulticast RM listener :" << _object->getId()); m_messageList.erase(it); it = m_messageList.begin(); @@ -72,18 +74,19 @@ void ewol::object::MultiCast::rm(const ewol::object::Shared& _obje } } -void ewol::object::MultiCast::send(const ewol::object::Shared& _object, const char* const _message, const std::string& _data) { +void ewol::object::MultiCast::send(const std::shared_ptr& _object, const char* const _message, const std::string& _data) { EWOL_VERBOSE("SendMulticast message \"" << _message << "\" data=\"" << _data << "\" to :"); // send the message at all registered widget ... for (auto &it : m_messageList) { + std::shared_ptr obj = it.m_object.lock(); if( it.m_message == _message - && it.m_object != _object) { - if (it.m_object != nullptr) { - EWOL_VERBOSE(" id = " << it.m_object->getId() << " type=" << it.m_object->getObjectType()); + && obj != _object) { + if (obj != nullptr) { + EWOL_VERBOSE(" id = " << obj->getId() << " type=" << obj->getObjectType()); // generate event ... (create message before ... ewol::object::Message tmpMsg(_object, it.m_message, _data); - it.m_object->onReceiveMessage(tmpMsg); + obj->onReceiveMessage(tmpMsg); } } } diff --git a/sources/ewol/object/MultiCast.h b/sources/ewol/object/MultiCast.h index a5feb1d7..2cfecb31 100644 --- a/sources/ewol/object/MultiCast.h +++ b/sources/ewol/object/MultiCast.h @@ -22,12 +22,12 @@ namespace ewol { private: class MessageList { public: - MessageList(const char* _message=nullptr, ewol::object::Shared _object=nullptr) : + MessageList(const char* _message=nullptr, std::shared_ptr _object=nullptr) : m_message(_message), m_object(_object) { } const char* m_message; - ewol::object::Shared m_object; + std::weak_ptr m_object; }; std::vector m_messageList; //!< List of all message ... public: @@ -37,10 +37,10 @@ namespace ewol { void anonymousSend(const char* const _messageId, const std::string& _data) { send(nullptr, _messageId, _data); }; - void send(const ewol::object::Shared& _object, const char* const _message, const std::string& _data); - void rm(const ewol::object::Shared& _object); - void add(const ewol::object::Shared& _object, const char* const _message); - void onObjectRemove(const ewol::object::Shared& _object); + void send(const std::shared_ptr& _object, const char* const _message, const std::string& _data); + void rm(const std::shared_ptr& _object); + void add(const std::shared_ptr& _object, const char* const _message); + void onObjectRemove(const std::shared_ptr& _object); }; }; }; diff --git a/sources/ewol/object/Object.cpp b/sources/ewol/object/Object.cpp index d3c23b69..838070c6 100644 --- a/sources/ewol/object/Object.cpp +++ b/sources/ewol/object/Object.cpp @@ -19,134 +19,64 @@ const char* const ewol::Object::configName = "name"; size_t ewol::Object::m_valUID = 0; - -void ewol::Object::objRefCountIncrement() { - std::unique_lock lock(m_lockRefCount); - /* - if (std::string("ewol::widget::Windows") == getObjectType()) { - EWOL_ERROR("increment Windows count ++" << m_objRefCount); - //etk::log::displayBacktrace(); - } - */ - m_objRefCount++; -} - -void ewol::Object::objRefCountDecrement() { - std::unique_lock lock(m_lockRefCount); - /* - if (std::string("ewol::widget::Windows") == getObjectType()) { - EWOL_ERROR("Decrement Windows count --" << m_objRefCount); - //etk::log::displayBacktrace(); - } - */ - m_objRefCount--; -} - -void ewol::Object::operator delete(void* _ptr, std::size_t _sz) { - EWOL_VERBOSE("custom delete for size " << _sz); - ewol::Object* obj = (ewol::Object*)_ptr; - obj->objRefCountDecrement(); - if (obj->m_objRefCount <= 0) { - EWOL_VERBOSE(" ==> real remove"); - ::operator delete(_ptr); - } else { - EWOL_ERROR(" ==> Some user is link on it : " << obj->m_objRefCount); - etk::log::displayBacktrace(); - } -} - -void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) { - EWOL_CRITICAL("custom delete for size ==> not implemented ..." << _sz); - ::operator delete(_ptr); -} -#ifdef DEBUG -void ewol::Object::incOwnerCount() { - std::unique_lock lock(m_lockRefCount); - m_ownerCount++; - if (m_ownerCount>1) { - EWOL_CRITICAL("Multiple Owner on one Object ==> very bad ... " << m_ownerCount); - } -} - -void ewol::Object::decOwnerCount() { - std::unique_lock lock(m_lockRefCount); - m_ownerCount--; - if (m_ownerCount<0) { - EWOL_CRITICAL("Owner remove the owner counter under 1 ==> very bad ... " << m_ownerCount); - } -} -#endif - void ewol::Object::autoDestroy() { - EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getObjectType()); - bool needRemove = false; - { - std::unique_lock lock(m_lockRefCount); - if (m_isDestroyed == true) { - EWOL_WARNING("Request remove of a removed object"); - return; - } else { - m_isDestroyed = true; - needRemove = true; - } - } - if (needRemove == true) { - getObjectManager().remove(this); - } -} - -void ewol::Object::removeObject() { - autoDestroy(); -} - -void ewol::Object::respownObject() { - std::unique_lock lock(m_lockRefCount); - if (m_isDestroyed == false) { - EWOL_WARNING("Respawn an alive object"); + if (m_objectHasBeenInit == false) { + EWOL_WARNING("try to auto destroy inside a constructor"); return; } - m_isDestroyed = false; - getObjectManager().respown(this); + EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getObjectType()); + std::shared_ptr parent = m_parent.lock(); + // TODO : set a signal to do this ... + if (parent != nullptr) { + parent->requestDestroyFromChild(shared_from_this()); + } + //if no parent ==> noting to do ... } -ewol::Object::Object() : - m_objRefCount(1), - #ifdef DEBUG - m_ownerCount(0), - #endif - m_isDestroyed(false), - m_static(false), - m_isResource(false) { - // note this is nearly atomic ... (but it is enough) - m_uniqueId = m_valUID++; - EWOL_DEBUG("new Object : [" << m_uniqueId << "]"); - getObjectManager().add(this); - registerConfig(configName, "string", nullptr, "Object name, might be a unique reference in all the program"); +void ewol::Object::requestDestroyFromChild(const std::shared_ptr& _child) { + EWOL_WARNING("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)"); } -ewol::Object::Object(const std::string& _name) : - m_objRefCount(1), - #ifdef DEBUG - m_ownerCount(0), - #endif - m_isDestroyed(false), +void ewol::Object::setParent(const std::shared_ptr& _newParent) { + // TODO : Implement change of parent ... + m_parent = _newParent; +} + +void ewol::Object::removeParent() { + m_parent.reset(); +} + + + +ewol::Object::Object() : + m_objectHasBeenInit(false), m_static(false), - m_name(_name), m_isResource(false) { // note this is nearly atomic ... (but it is enough) m_uniqueId = m_valUID++; EWOL_DEBUG("new Object : [" << m_uniqueId << "]"); - getObjectManager().add(this); registerConfig(configName, "string", nullptr, "Object name, might be a unique reference in all the program"); } ewol::Object::~Object() { - EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription() << " refcount=" << m_objRefCount); - getMultiCast().rm(this); + EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription()); + //getObjectManager().remove(shared_from_this()); + // TODO : getMultiCast().rm(); m_externEvent.clear(); m_availlableEventId.clear(); m_uniqueId = -1; } + +void ewol::Object::init() { + getObjectManager().add(shared_from_this()); + m_objectHasBeenInit = true; +} + +void ewol::Object::init(const std::string& _name) { + init(); + m_name = _name; +} + const char * const ewol::Object::getObjectType() { if (m_listType.size() == 0) { return "ewol::Object"; @@ -195,6 +125,10 @@ void ewol::Object::addEventId(const char * _generateEventId) { } void ewol::Object::generateEventId(const char * _generateEventId, const std::string& _data) { + if (m_objectHasBeenInit == false) { + EWOL_WARNING("try to generate an event inside a constructor"); + return; + } int32_t nbObject = getObjectManager().getNumberObject(); EWOL_VERBOSE("try send message '" << _generateEventId << "'"); // for every element registered ... @@ -204,19 +138,20 @@ void ewol::Object::generateEventId(const char * _generateEventId, const std::str EWOL_VERBOSE(" wrong event '" << it.localEventId << "' != '" << _generateEventId << "'"); continue; } - if (it.destObject == nullptr) { + std::shared_ptr destObject = it.destObject.lock(); + if (destObject == nullptr) { EWOL_VERBOSE(" nullptr dest"); continue; } if (it.overloadData.size() <= 0){ - ewol::object::Message tmpMsg(this, it.destEventId, _data); + ewol::object::Message tmpMsg(shared_from_this(), it.destEventId, _data); EWOL_VERBOSE("send message " << tmpMsg); - it.destObject->onReceiveMessage(tmpMsg); + destObject->onReceiveMessage(tmpMsg); } else { // set the user requested data ... - ewol::object::Message tmpMsg(this, it.destEventId, it.overloadData); + ewol::object::Message tmpMsg(shared_from_this(), it.destEventId, it.overloadData); EWOL_VERBOSE("send message " << tmpMsg); - it.destObject->onReceiveMessage(tmpMsg); + destObject->onReceiveMessage(tmpMsg); } } if (nbObject > getObjectManager().getNumberObject()) { @@ -225,18 +160,26 @@ void ewol::Object::generateEventId(const char * _generateEventId, const std::str } void ewol::Object::sendMultiCast(const char* const _messageId, const std::string& _data) { + if (m_objectHasBeenInit == false) { + EWOL_WARNING("try to generate an multicast event inside a constructor"); + return; + } int32_t nbObject = getObjectManager().getNumberObject(); - getMultiCast().send(this, _messageId, _data); + getMultiCast().send(shared_from_this(), _messageId, _data); if (nbObject > getObjectManager().getNumberObject()) { EWOL_CRITICAL("It if really dangerous ro remove (delete) element inside a callback ... use ->removObject() which is asynchronous"); } } void ewol::Object::registerMultiCast(const char* const _messageId) { - getMultiCast().add(this, _messageId); + if (m_objectHasBeenInit == false) { + EWOL_WARNING("try to generate an event inside a constructor"); + return; + } + getMultiCast().add(shared_from_this(), _messageId); } -void ewol::Object::registerOnEvent(const ewol::object::Shared& _destinationObject, +void ewol::Object::registerOnEvent(const std::shared_ptr& _destinationObject, const char * _eventId, const char * _eventIdgenerated, const std::string& _overloadData) { @@ -300,7 +243,7 @@ void ewol::Object::registerOnEvent(const ewol::object::Shared& _de m_externEvent.push_back(tmpEvent); } -void ewol::Object::unRegisterOnEvent(const ewol::object::Shared& _destinationObject, +void ewol::Object::unRegisterOnEvent(const std::shared_ptr& _destinationObject, const char * _eventId) { if (_destinationObject == nullptr) { EWOL_ERROR("Input ERROR nullptr pointer Object ..."); @@ -309,10 +252,11 @@ void ewol::Object::unRegisterOnEvent(const ewol::object::Shared& _ // check if event existed : auto it(m_externEvent.begin()); while(it != m_externEvent.end()) { - if (it->destObject == nullptr) { + std::shared_ptr obj = it->destObject.lock(); + if (obj == nullptr) { m_externEvent.erase(it); it = m_externEvent.begin(); - } else if ( it->destObject == _destinationObject + } else if ( obj == _destinationObject && it->localEventId == _eventId) { m_externEvent.erase(it); it = m_externEvent.begin(); @@ -323,14 +267,15 @@ void ewol::Object::unRegisterOnEvent(const ewol::object::Shared& _ } } -void ewol::Object::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::Object::onObjectRemove(const std::shared_ptr& _object) { EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")"); auto it(m_externEvent.begin()); while(it != m_externEvent.end()) { - if (it->destObject == nullptr) { + std::shared_ptr obj = it->destObject.lock(); + if (obj == nullptr) { m_externEvent.erase(it); it = m_externEvent.begin(); - } else if (it->destObject == _object) { + } else if (obj == _object) { m_externEvent.erase(it); it = m_externEvent.begin(); EWOL_INFO("[" << getId() << "] Remove extern event : to object id=" << _object->getId()); @@ -457,7 +402,7 @@ std::string ewol::Object::getConfig(const std::string& _config) const { } bool ewol::Object::setConfigNamed(const std::string& _objectName, const ewol::object::Config& _conf) { - ewol::object::Shared object = getObjectManager().get(_objectName); + std::shared_ptr object = getObjectManager().get(_objectName); if (object == nullptr) { return false; } @@ -465,7 +410,7 @@ bool ewol::Object::setConfigNamed(const std::string& _objectName, const ewol::ob } bool ewol::Object::setConfigNamed(const std::string& _objectName, const std::string& _config, const std::string& _value) { - ewol::object::Shared object = getObjectManager().get(_objectName); + std::shared_ptr object = getObjectManager().get(_objectName); if (object == nullptr) { return false; } @@ -473,7 +418,8 @@ bool ewol::Object::setConfigNamed(const std::string& _objectName, const std::str } ewol::object::Manager& ewol::Object::getObjectManager() const { - return ewol::getContext().getEObjectManager(); + ewol::object::Manager& tmp = ewol::getContext().getEObjectManager(); + return tmp; } ewol::object::MultiCast& ewol::Object::getMultiCast() const { @@ -484,12 +430,12 @@ ewol::Context& ewol::Object::getContext() const { return ewol::getContext(); } -void ewol::Object::registerOnObjectEvent(const ewol::object::Shared& _destinationObject, +void ewol::Object::registerOnObjectEvent(const std::shared_ptr& _destinationObject, const std::string& _objectName, const char * _eventId, const char * _eventIdgenerated, const std::string& _overloadData) { - ewol::object::Shared tmpObject = getObjectManager().getObjectNamed(_objectName); + std::shared_ptr tmpObject = getObjectManager().getObjectNamed(_objectName); if (nullptr != tmpObject) { EWOL_DEBUG("Find widget named : '" << _objectName << "' register event='" << _eventId << "'"); tmpObject->registerOnEvent(_destinationObject, _eventId, _eventIdgenerated, _overloadData); @@ -498,6 +444,6 @@ void ewol::Object::registerOnObjectEvent(const ewol::object::Shared ewol::Object::getObjectNamed(const std::string& _objectName) const { +std::shared_ptr ewol::Object::getObjectNamed(const std::string& _objectName) const { return getObjectManager().getObjectNamed(_objectName); } diff --git a/sources/ewol/object/Object.h b/sources/ewol/object/Object.h index 6b485cab..17f89850 100644 --- a/sources/ewol/object/Object.h +++ b/sources/ewol/object/Object.h @@ -14,8 +14,7 @@ #include #include #include -#include -#include +#include namespace ewol { // some class need to define element befor other ... @@ -31,6 +30,20 @@ namespace ewol { #include #include +#define DECLARE_FACTORY(className) \ + template static std::shared_ptr create( T&& ... all ) { \ + std::shared_ptr object(new className()); \ + if (object == nullptr) { \ + EWOL_ERROR("Factory error"); \ + return nullptr; \ + } \ + object->init(std::forward(all)... ); \ + if (object->objectHasBeenCorectlyInit() == false) { \ + EWOL_CRITICAL("Object Is not correctly init : " << #className ); \ + } \ + return object; \ + } + namespace ewol { namespace object { /** @@ -40,7 +53,7 @@ namespace ewol { class EventExtGen { public: const char* localEventId; //!< local event Id generation - ewol::object::Shared destObject; //!< destination widget that might be call + std::weak_ptr destObject; //!< destination widget that might be call const char* destEventId; //!< generated event ID on the distant widget std::string overloadData; //!< sometimes the user prefer to receive some specific data on an event (instead of the one sed by the widget) }; @@ -49,74 +62,48 @@ namespace ewol { * @brief Basic message classes for ewol system * this class mermit at every Object to communicate between them. */ - class Object { - template friend class ewol::object::Shared; - template friend class ewol::object::Owner; - private: - //! @not-in-doc - std::mutex m_lockRefCount; - //! @not-in-doc - int32_t m_objRefCount; - public: - //! @not-in-doc - void objRefCountIncrement(); - //! @not-in-doc - void objRefCountDecrement(); - int32_t getRefCount() { - return m_objRefCount; - } - //! @not-in-doc - static void operator delete(void* _ptr, std::size_t _sz); - //! @not-in-doc - static void operator delete[](void* _ptr, std::size_t _sz); - #ifdef DEBUG - public: - int32_t m_ownerCount; - void incOwnerCount(); - void decOwnerCount(); - #endif + class Object : public std::enable_shared_from_this { private: static size_t m_valUID; //!< stic used for the unique ID definition public: // Config list of properties static const char* const configName; - public: + private: + bool m_objectHasBeenInit; //!< Know if the init function has bben called + protected: /** * @brief Constructor. */ Object(); + void init(); + void init(const std::string& _name); + public: /** - * @brief Constructor. - * @param[in] _name Name of the Object. + * @brief Factory */ - Object(const std::string& _name); + DECLARE_FACTORY(Object); /** * @brief Destructor */ virtual ~Object(); - private: - bool m_isDestroyed; + bool objectHasBeenCorectlyInit() { + return m_objectHasBeenInit; + } + protected: + std::weak_ptr m_parent; protected: /** * @brief Auto-destroy the object */ void autoDestroy(); public: - /** - * @brief Asynchronous removing the object - */ - void removeObject(); - /** - * @brief Respown a removed object - */ - void respownObject(); - /** - * @brief Get if the element is destroyed or not - * @return true The element in destroyed - */ - bool isDestroyed() { - return m_isDestroyed; + void destroy() { + autoDestroy(); } + public: + virtual void requestDestroyFromChild(const std::shared_ptr& _child); + virtual void setParent(const std::shared_ptr& _newParent); + virtual void removeParent(); private: std::vector m_listType; public: @@ -196,7 +183,7 @@ namespace ewol { * @param[in] _eventIdgenerated event generated when call the distant Object.onReceiveMessage(...) * @param[in] _overloadData When the user prever to receive a data specificly for this event ... */ - void registerOnEvent(const ewol::object::Shared& _destinationObject, + void registerOnEvent(const std::shared_ptr& _destinationObject, const char * _eventId, const char * _eventIdgenerated = nullptr, const std::string& _overloadData = ""); @@ -205,13 +192,13 @@ namespace ewol { * @param[in] _destinationObject pointer on the object that might be call when an event is generated * @param[in] _eventId Event generate inside the object (nullptr to remove all event on this object) */ - void unRegisterOnEvent(const ewol::object::Shared& _destinationObject, + void unRegisterOnEvent(const std::shared_ptr& _destinationObject, const char * _eventId = nullptr); /** * @brief Inform object that an other object is removed ... * @note : Sub classes must call this class */ - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object); /** * @brief Receive a message from an other Object with a specific eventId and data * @param[in] _msg Message handle @@ -350,7 +337,7 @@ namespace ewol { * @param[in] _overloadData When the user prever to receive a data specificly for this event ... * @note : To used when NOT herited from this object. */ - void registerOnObjectEvent(const ewol::object::Shared& _destinationObject, + void registerOnObjectEvent(const std::shared_ptr& _destinationObject, const std::string& _objectName, const char * _eventId, const char * _eventIdgenerated = nullptr, @@ -360,8 +347,9 @@ namespace ewol { * @param[in] _name Name of the object * @return the requested object or nullptr */ - ewol::object::Shared getObjectNamed(const std::string& _objectName) const; + std::shared_ptr getObjectNamed(const std::string& _objectName) const; }; + }; #endif diff --git a/sources/ewol/object/Owner.h b/sources/ewol/object/Owner.h deleted file mode 100644 index f9bc5c0f..00000000 --- a/sources/ewol/object/Owner.h +++ /dev/null @@ -1,262 +0,0 @@ -/** - * @author Edouard DUPIN - * - * @copyright 2011, Edouard DUPIN, all right reserved - * - * @license BSD 3 clauses (see license file) - */ - -#ifndef __EWOL_OBJECT_OWNER_H__ -#define __EWOL_OBJECT_OWNER_H__ - -#include - -namespace ewol { - namespace object { - template - class Owner { - private: - T* m_pointer; - public: - Owner() : - m_pointer(nullptr) { - // nothing to do ... - } - Owner(T* _pointer) : - m_pointer(_pointer) { - if (m_pointer == nullptr) { - return; - } - m_pointer->objRefCountIncrement(); - } - ~Owner() { - reset(); - } - // copy constructor - Owner(const Owner& _obj) : - m_pointer(nullptr) { - EWOL_CRITICAL("You can not user copy operator for Owner reference..."); - } - // Move Constructor - Owner(Owner&& _obj) : - m_pointer(nullptr) { - // transfert pointer - m_pointer = _obj.m_pointer; - _obj.m_pointer = nullptr; - } - // shared to private constructor - template::value>::type> - Owner(const Shared& _obj) : - m_pointer(nullptr) { - m_pointer = _obj.get(); - if (m_pointer == nullptr) { - return; - } - m_pointer->objRefCountIncrement(); - #ifdef DEBUG - m_pointer->incOwnerCount(); - #endif - } - template::value>::type> - Owner& operator=(const Owner& _obj) noexcept { - if(this == &_obj) { - return *this; - } - reset(); - m_pointer = _obj.get(); - if (m_pointer != nullptr) { - m_pointer->objRefCountIncrement(); - #ifdef DEBUG - m_pointer->incOwnerCount(); - #endif - } - return *this; - } - template::value>::type> - Owner& operator=(const Shared& _obj) noexcept { - reset(); - m_pointer = _obj.get(); - if (m_pointer != nullptr) { - m_pointer->objRefCountIncrement(); - #ifdef DEBUG - m_pointer->incOwnerCount(); - #endif - } - return *this; - } - - void reset() { - if (m_pointer == nullptr) { - return; - } - //etk::log::displayBacktrace(); - // To prevent cyclisme - T* tmp = m_pointer; - m_pointer = nullptr; - tmp->removeObject(); - if (tmp->m_objRefCount <= 0) { - EWOL_WARNING("Object will be already removed"); - } else if (tmp->m_objRefCount == 1) { - EWOL_VERBOSE("Remove object (in Owner)"); - delete tmp; - } else { - tmp->objRefCountDecrement(); - #ifdef DEBUG - tmp->decOwnerCount(); - #endif - } - } - void resetShared() { - if (m_pointer == nullptr) { - return; - } - // To prevent cyclisme - T* tmp = m_pointer; - m_pointer = nullptr; - if (tmp->m_objRefCount <= 0) { - EWOL_WARNING("Object will be already removed"); - } else if (tmp->m_objRefCount == 1) { - EWOL_VERBOSE("Remove object (in Owner)"); - delete tmp; - } else { - tmp->objRefCountDecrement(); - #ifdef DEBUG - tmp->decOwnerCount(); - #endif - } - } - T* get() noexcept { - return m_pointer; - } - T* get() const noexcept { - return m_pointer; - } - T& operator*() const noexcept { - return *m_pointer; - } - T* operator->() const noexcept { - return m_pointer; - } - operator ewol::object::Shared() const noexcept { - return m_pointer; - } - }; - }; - // section to compare Owner pointer of an object with an other - - //! @not in doc - template - inline bool operator==(const object::Owner& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } - //! @not in doc - template - inline bool operator==(const object::Owner& _obj, std::nullptr_t) noexcept { - return _obj.get() == nullptr; - } - //! @not in doc - template - inline bool operator==(std::nullptr_t, const object::Owner& _obj) noexcept { - return _obj.get() == nullptr; - } - //! @not in doc - template::value>::type> - inline bool operator==(const object::Owner& _obj, const T2* _obj2) noexcept { - return _obj.get() == _obj2; - } - //! @not in doc - template::value>::type> - inline bool operator==(const T* _obj, const object::Owner& _obj2) noexcept { - return _obj == _obj2.get(); - } - //! @not in doc - template - inline bool operator==(const object::Owner& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } - //! @not in doc - template - inline bool operator==(const object::Shared& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } - //! @not in doc - template::value>::type> - inline bool operator!=(const object::Owner& _obj, const T2* _obj2) noexcept { - return _obj.get() != _obj2; - } - //! @not in doc - template::value>::type> - inline bool operator!=(const T* _obj, const object::Owner& _obj2) noexcept { - return _obj != _obj2.get(); - } - - //! @not in doc - template - inline bool operator!=(const object::Owner& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } - //! @not in doc - template - inline bool operator!=(const object::Owner& _obj, std::nullptr_t) noexcept { - return _obj.get() != nullptr; - } - //! @not in doc - template - inline bool operator!=(std::nullptr_t, const object::Owner& _obj) noexcept { - return _obj.get() != nullptr; - } - //! @not in doc - template - inline bool operator!=(const object::Owner& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } - //! @not in doc - template - inline bool operator!=(const object::Shared& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } - /* - template::value>::type> - object::Shared operator=(const object::Owner& _obj) { - return _obj.get(); - } - */ - - - //! @not in doc - template - inline void swap(object::Owner& _obj, object::Owner& _obj2) noexcept { - _obj2.swap(_obj); - } - - //! @not in doc - template - inline object::Owner static_pointer_cast(const object::Owner& _obj) noexcept { - return object::Owner(_obj, static_cast(_obj.get())); - } - - //! @not in doc - template - inline object::Owner const_pointer_cast(const object::Owner& _obj) noexcept { - return object::Owner(_obj, const_cast(_obj.get())); - } - - //! @not in doc - template - inline object::Owner dynamic_pointer_cast(const object::Owner& _obj) noexcept { - if (T2* obj = dynamic_cast(_obj.get())) { - return object::Owner(_obj, obj); - } - return object::Owner(); - } -}; -#endif - diff --git a/sources/ewol/object/RemoveEvent.cpp b/sources/ewol/object/RemoveEvent.cpp index 70e5199a..92d34914 100644 --- a/sources/ewol/object/RemoveEvent.cpp +++ b/sources/ewol/object/RemoveEvent.cpp @@ -10,14 +10,19 @@ #include ewol::object::RemoveEvent::RemoveEvent() { + EWOL_TODO("ewol::object::RemoveEvent::RemoveEvent()"); + /* Context& tmp = ewol::getContext(); ewol::object::Manager& manager = tmp.getEObjectManager(); manager.add(this); - + */ } ewol::object::RemoveEvent::~RemoveEvent() { + EWOL_TODO("ewol::object::RemoveEvent::~RemoveEvent()"); + /* Context& tmp = ewol::getContext(); ewol::object::Manager& manager = tmp.getEObjectManager(); manager.rm(this); + */ } diff --git a/sources/ewol/object/RemoveEvent.h b/sources/ewol/object/RemoveEvent.h index f108ca05..72c672b6 100644 --- a/sources/ewol/object/RemoveEvent.h +++ b/sources/ewol/object/RemoveEvent.h @@ -16,7 +16,7 @@ namespace ewol { namespace object { class RemoveEvent { public: - virtual void onObjectRemove(const ewol::object::Shared& _object) = 0; + virtual void onObjectRemove(const std::shared_ptr& _object) = 0; public: RemoveEvent(); virtual ~RemoveEvent(); diff --git a/sources/ewol/object/Shared.h b/sources/ewol/object/Shared.h deleted file mode 100644 index 1a6b8ce2..00000000 --- a/sources/ewol/object/Shared.h +++ /dev/null @@ -1,190 +0,0 @@ -/** - * @author Edouard DUPIN - * - * @copyright 2011, Edouard DUPIN, all right reserved - * - * @license BSD 3 clauses (see license file) - */ - -#ifndef __EWOL_OBJECT_SHARED_H__ -#define __EWOL_OBJECT_SHARED_H__ - -#include - -namespace ewol { - namespace object { - template - class Shared { - private: - T* m_pointer; - public: - Shared() : - m_pointer(nullptr) { - // nothing to do ... - } - Shared(T* _pointer) : - m_pointer(_pointer) { - if (m_pointer == nullptr) { - return; - } - m_pointer->objRefCountIncrement(); - } - ~Shared() { - reset(); - } - // copy constructor - Shared(const Shared& _obj) : - m_pointer(nullptr) { - m_pointer = _obj.get(); - if (m_pointer == nullptr) { - return; - } - m_pointer->objRefCountIncrement(); - } - // Move Constructor - Shared(Shared&& _obj) : - m_pointer(nullptr) { - // transfert pointer - m_pointer = _obj.m_pointer; - _obj.m_pointer = nullptr; - } - - Shared& operator=(const Shared& _obj) noexcept { - if(this == &_obj) { - return *this; - } - reset(); - m_pointer = _obj.get(); - if (m_pointer != nullptr) { - m_pointer->objRefCountIncrement(); - } - return *this; - } - - void reset() { - if (m_pointer == nullptr) { - return; - } - // To prevent cyclisme - T* tmp = m_pointer; - m_pointer = nullptr; - if (tmp->m_objRefCount <= 0) { - EWOL_WARNING("Object is already removed"); - } else if (tmp->m_objRefCount == 1) { - EWOL_VERBOSE("Remove object (in shared)"); - delete tmp; - } else { - tmp->objRefCountDecrement(); - } - } - T* get() const noexcept { - return m_pointer; - } - T& operator*() const noexcept { - return *m_pointer; - } - T* operator->() const noexcept { - return m_pointer; - } - template operator ewol::object::Shared() const noexcept { - return m_pointer; - } - }; - // after calling this function, you might never call a delete on this pointer. (if you want to be able to use a delete, simply Shared<>(pointer) - template Shared makeShared(T* _pointer) { - if (_pointer == nullptr) { - return Shared(); - } - Shared tmp(_pointer); - // remove one element to permit to remove at the last instance - _pointer->objRefCountDecrement(); - return tmp; - } - }; - // section to compare shared pointer of an object with an other - - //! @not in doc - template - inline bool operator==(const object::Shared& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } - //! @not in doc - template - inline bool operator==(const object::Shared& _obj, std::nullptr_t) noexcept { - return _obj.get() == nullptr; - } - //! @not in doc - template - inline bool operator==(std::nullptr_t, const object::Shared& _obj) noexcept { - return _obj.get() == nullptr; - } - //! @not in doc - template::value>::type> - inline bool operator==(const object::Shared& _obj, const T2* _obj2) noexcept { - return _obj.get() == _obj2; - } - //! @not in doc - template::value>::type> - inline bool operator==(const T* _obj, const object::Shared& _obj2) noexcept { - return _obj == _obj2.get(); - } - - //! @not in doc - template - inline bool operator!=(const object::Shared& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } - //! @not in doc - template - inline bool operator!=(const object::Shared& _obj, std::nullptr_t) noexcept { - return _obj.get() != nullptr; - } - //! @not in doc - template - inline bool operator!=(std::nullptr_t, const object::Shared& _obj) noexcept { - return _obj.get() != nullptr; - } - //! @not in doc - template::value>::type> - inline bool operator!=(const object::Shared& _obj, const T2* _obj2) noexcept { - return _obj.get() != _obj2; - } - //! @not in doc - template::value>::type> - inline bool operator!=(const T* _obj, const object::Shared& _obj2) noexcept { - return _obj != _obj2.get(); - } - - //! @not in doc - template - inline void swap(object::Shared& _obj, object::Shared& _obj2) noexcept { - _obj2.swap(_obj); - } - - //! @not in doc - template - inline object::Shared static_pointer_cast(const object::Shared& _obj) noexcept { - return object::Shared(_obj, static_cast(_obj.get())); - } - - //! @not in doc - template - inline object::Shared const_pointer_cast(const object::Shared& _obj) noexcept { - return object::Shared(_obj, const_cast(_obj.get())); - } - - //! @not in doc - template - inline object::Shared dynamic_pointer_cast(const object::Shared& _obj) noexcept { - if (T2* obj = dynamic_cast(_obj.get())) { - return ewol::object::Shared(obj); - } - return ewol::object::Shared(); - } -}; - -#endif \ No newline at end of file diff --git a/sources/ewol/resource/ColorFile.cpp b/sources/ewol/resource/ColorFile.cpp index 2abf85b5..65fe076d 100644 --- a/sources/ewol/resource/ColorFile.cpp +++ b/sources/ewol/resource/ColorFile.cpp @@ -17,21 +17,25 @@ #define __class__ "resource::ColorFile" -ewol::resource::ColorFile::ColorFile(const std::string& _filename) : - ewol::Resource(_filename), +ewol::resource::ColorFile::ColorFile() : + ewol::Resource(), m_errorColor(etk::color::orange) { addObjectType("ewol::ColorFile"); +} + +void ewol::resource::ColorFile::init(const std::string& _filename) { + ewol::Resource::init(_filename); EWOL_DEBUG("CF : load \"" << _filename << "\""); reload(); EWOL_DEBUG("List of all color : " << m_list.getKeys()); } - ewol::resource::ColorFile::~ColorFile() { // remove all element m_list.clear(); } + void ewol::resource::ColorFile::reload() { // remove all previous set of value : for (int32_t iii = 0; iii < m_list.size() ; ++iii) { @@ -73,29 +77,3 @@ int32_t ewol::resource::ColorFile::request(const std::string& _paramName) { } return m_list.getId(_paramName); } - - -ewol::object::Shared ewol::resource::ColorFile::keep(const std::string& _filename) { - EWOL_INFO("KEEP : ColorFile : file : \"" << _filename << "\""); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // this element create a new one every time .... - object = ewol::object::makeShared(new ewol::resource::ColorFile(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} - diff --git a/sources/ewol/resource/ColorFile.h b/sources/ewol/resource/ColorFile.h index 4d59fe7b..fcbc58b4 100644 --- a/sources/ewol/resource/ColorFile.h +++ b/sources/ewol/resource/ColorFile.h @@ -29,8 +29,10 @@ namespace ewol { * @brief Constructor of the color property file * @param[in] _filename Name of the file needed */ - ColorFile(const std::string& _filename); + ColorFile(); + void init(const std::string& _filename); public: + DECLARE_RESOURCE_NAMED_FACTORY(ColorFile); /** * @brief Simple Destructor of this class (nothing specific ...) */ @@ -69,14 +71,6 @@ namespace ewol { } public: // herited function: void reload(); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _filename Name of the configuration file. - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(const std::string& _filename); }; }; }; diff --git a/sources/ewol/resource/Colored3DObject.cpp b/sources/ewol/resource/Colored3DObject.cpp index d2840e68..2b635016 100644 --- a/sources/ewol/resource/Colored3DObject.cpp +++ b/sources/ewol/resource/Colored3DObject.cpp @@ -19,7 +19,7 @@ ewol::resource::Colored3DObject::Colored3DObject() : addObjectType("ewol::Colored3DObject"); // get the shader resource : m_GLPosition = 0; - m_GLprogram = ewol::resource::Program::keep("DATA:simple3D.prog"); + m_GLprogram = ewol::resource::Program::create("DATA:simple3D.prog"); if (nullptr != m_GLprogram ) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); m_GLColor = m_GLprogram->getUniform("EW_color"); @@ -154,15 +154,3 @@ void ewol::resource::Colored3DObject::drawLine(std::vector& _vertices, } } -ewol::object::Shared ewol::resource::Colored3DObject::keep() { - EWOL_VERBOSE("KEEP : direct Colored3DObject"); - // need to crate a new one ... - ewol::object::Shared object = ewol::object::makeShared(new ewol::resource::Colored3DObject()); - if (object == nullptr) { - EWOL_ERROR("allocation error of a resource : ???Colored3DObject??? "); - return nullptr; - } - getManager().localAdd(object); - return object; -} - diff --git a/sources/ewol/resource/Colored3DObject.h b/sources/ewol/resource/Colored3DObject.h index ea60625a..5ba2a434 100644 --- a/sources/ewol/resource/Colored3DObject.h +++ b/sources/ewol/resource/Colored3DObject.h @@ -19,13 +19,15 @@ namespace ewol { namespace resource { class Colored3DObject : public ewol::Resource { protected: - ewol::object::Shared m_GLprogram; + std::shared_ptr m_GLprogram; int32_t m_GLPosition; int32_t m_GLMatrix; int32_t m_GLColor; protected: Colored3DObject(); + void init(); public: + DECLARE_RESOURCE_FACTORY(Colored3DObject); virtual ~Colored3DObject(); public: virtual void draw(std::vector& _vertices, @@ -42,13 +44,6 @@ namespace ewol { mat4& _transformationMatrix, bool _updateDepthBuffer=true, bool _depthtest=true); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(); }; }; }; diff --git a/sources/ewol/resource/ConfigFile.cpp b/sources/ewol/resource/ConfigFile.cpp index 358a6db6..721fa5c1 100644 --- a/sources/ewol/resource/ConfigFile.cpp +++ b/sources/ewol/resource/ConfigFile.cpp @@ -19,9 +19,13 @@ #define __class__ "resource::ConfigFile" -ewol::resource::ConfigFile::ConfigFile(const std::string& _filename) : - ewol::Resource(_filename) { +ewol::resource::ConfigFile::ConfigFile() : + ewol::Resource() { addObjectType("ewol::ConfigFile"); +} + +void ewol::resource::ConfigFile::init(const std::string& _filename) { + ewol::Resource::init(_filename); EWOL_DEBUG("SFP : load \"" << _filename << "\""); reload(); } @@ -103,30 +107,3 @@ bool ewol::resource::ConfigFile::getBoolean(int32_t _id) { } return tmp->get(); } - -ewol::object::Shared ewol::resource::ConfigFile::keep(const std::string& _filename) { - EWOL_INFO("KEEP : SimpleConfig : file : \"" << _filename << "\""); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // this element create a new one every time .... - object = ewol::object::makeShared(new ewol::resource::ConfigFile(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : '" << _filename << "'"); - return nullptr; - } - getManager().localAdd(object); - return object; -} - - - diff --git a/sources/ewol/resource/ConfigFile.h b/sources/ewol/resource/ConfigFile.h index 9c5d690b..a5440518 100644 --- a/sources/ewol/resource/ConfigFile.h +++ b/sources/ewol/resource/ConfigFile.h @@ -22,9 +22,11 @@ namespace ewol { ejson::Document m_doc; etk::Hash m_list; protected: - ConfigFile(const std::string& _filename); + ConfigFile(); + void init(const std::string& _filename); public: virtual ~ConfigFile(); + DECLARE_RESOURCE_NAMED_FACTORY(ConfigFile); public: void reload(); @@ -40,7 +42,7 @@ namespace ewol { * @param[in] _filename Name of the configuration file. * @return pointer on the resource or nullptr if an error occured. */ - static ewol::object::Shared keep(const std::string& _filename); + static std::shared_ptr keep(const std::string& _filename); }; }; }; diff --git a/sources/ewol/resource/DistanceFieldFont.cpp b/sources/ewol/resource/DistanceFieldFont.cpp index 93e26b50..be2414a1 100644 --- a/sources/ewol/resource/DistanceFieldFont.cpp +++ b/sources/ewol/resource/DistanceFieldFont.cpp @@ -24,8 +24,8 @@ #define __class__ "resource::DistanceFieldFont" #define SIZE_GENERATION (30) -ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontName) : - ewol::resource::Texture(_fontName), +ewol::resource::DistanceFieldFont::DistanceFieldFont() : + ewol::resource::Texture(), m_borderSize(10), m_textureBorderSize(0,0) { addObjectType("ewol::resource::DistanceFieldFont"); @@ -33,6 +33,10 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam m_lastGlyphPos.setValue(1,1); m_lastRawHeigh = 0; m_sizeRatio = 1.0f; +} + +void ewol::resource::DistanceFieldFont::init(const std::string& _fontName) { + ewol::resource::Texture::init(_fontName); std::string localName = _fontName; std::vector folderList; if (true == ewol::getContext().getFontDefault().getUseExternal()) { @@ -88,7 +92,7 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam return; } EWOL_INFO("Load FONT name : '" << m_fileName << "'"); - m_font = ewol::resource::FontFreeType::keep(m_fileName); + m_font = ewol::resource::FontFreeType::create(m_fileName); if (m_font == nullptr) { EWOL_ERROR("Pb Loading FONT name : '" << m_fileName << "'" ); } @@ -335,32 +339,6 @@ ewol::GlyphProperty* ewol::resource::DistanceFieldFont::getGlyphPointer(const ch return &((m_listElement)[index]); } -ewol::object::Shared ewol::resource::DistanceFieldFont::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : DistanceFieldFont : file : '" << _filename << "'"); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // need to crate a new one ... - EWOL_DEBUG("CREATE: DistanceFieldFont : file : '" << _filename << "'"); - object = ewol::object::makeShared(new ewol::resource::DistanceFieldFont(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} - - void ewol::resource::DistanceFieldFont::exportOnFile() { EWOL_DEBUG("EXPORT: DistanceFieldFont : file : '" << m_fileName << ".json'"); ejson::Document doc; diff --git a/sources/ewol/resource/DistanceFieldFont.h b/sources/ewol/resource/DistanceFieldFont.h index ca664e88..d9cb71ae 100644 --- a/sources/ewol/resource/DistanceFieldFont.h +++ b/sources/ewol/resource/DistanceFieldFont.h @@ -23,7 +23,7 @@ namespace ewol { // specific element to have the the know if the specify element is known... // == > otherwise I can just generate italic ... // == > Bold is a little more complicated (maybe with the bordersize) - ewol::object::Shared m_font; + std::shared_ptr m_font; public: std::vector m_listElement; private: @@ -31,8 +31,10 @@ namespace ewol { ivec2 m_lastGlyphPos; int32_t m_lastRawHeigh; protected: - DistanceFieldFont(const std::string& _fontName); + DistanceFieldFont(); + void init(const std::string& _fontName); public: + DECLARE_RESOURCE_NAMED_FACTORY(DistanceFieldFont); virtual ~DistanceFieldFont(); public: float getDisplayRatio(float _size); @@ -71,7 +73,7 @@ namespace ewol { * @param[in] _filename Name of the texture font. * @return pointer on the resource or nullptr if an error occured. */ - static ewol::object::Shared keep(const std::string& _filename); + static std::shared_ptr keep(const std::string& _filename); private: /** * @brief add a glyph in a texture font. diff --git a/sources/ewol/resource/FontFreeType.cpp b/sources/ewol/resource/FontFreeType.cpp index a65cebd4..54709910 100644 --- a/sources/ewol/resource/FontFreeType.cpp +++ b/sources/ewol/resource/FontFreeType.cpp @@ -52,13 +52,15 @@ void ewol::resource::freeTypeUnInit() { } } -ewol::resource::FontFreeType::FontFreeType(const std::string& _fontName) : - FontBase(_fontName) { +ewol::resource::FontFreeType::FontFreeType() { addObjectType("ewol::FontFreeType"); m_init = false; m_FileBuffer = nullptr; m_FileSize = 0; - +} + +void ewol::resource::FontFreeType::init(const std::string& _fontName) { + ewol::resource::FontBase::init(_fontName); etk::FSNode myfile(_fontName); if (false == myfile.exist()) { EWOL_ERROR("File Does not exist : " << myfile); @@ -389,27 +391,3 @@ void ewol::resource::FontFreeType::display() { //EWOL_INFO(" Current size = " << (int)m_fftFace->size); } - -ewol::object::Shared ewol::resource::FontFreeType::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : Font : file : \"" << _filename << "\""); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // need to crate a new one ... - object = ewol::object::makeShared(new ewol::resource::FontFreeType(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} diff --git a/sources/ewol/resource/FontFreeType.h b/sources/ewol/resource/FontFreeType.h index 663d217c..8b413db9 100644 --- a/sources/ewol/resource/FontFreeType.h +++ b/sources/ewol/resource/FontFreeType.h @@ -29,8 +29,10 @@ namespace ewol { bool m_init; void display(); protected: - FontFreeType(const std::string& _fontName); + FontFreeType(); + void init(const std::string& _fontName); public: + DECLARE_RESOURCE_NAMED_FACTORY(FontFreeType); virtual ~FontFreeType(); public: @@ -54,14 +56,6 @@ namespace ewol { float getSizeWithHeight(float _fontHeight); void generateKerning(int32_t _fontSize, std::vector& _listGlyph); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _filename Name of the base font. - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(const std::string& _filename); }; void freeTypeInit(); void freeTypeUnInit(); diff --git a/sources/ewol/resource/Image.cpp b/sources/ewol/resource/Image.cpp index 58679a1c..650a5e89 100644 --- a/sources/ewol/resource/Image.cpp +++ b/sources/ewol/resource/Image.cpp @@ -17,16 +17,17 @@ #undef __class__ #define __class__ "resource::TextureFile" -ewol::resource::TextureFile::TextureFile(const std::string& _genName) : - Texture(_genName) { - EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=--- size=---"); +ewol::resource::TextureFile::TextureFile() { + addObjectType("ewol::resource::Image"); } +void ewol::resource::TextureFile::init() { + ewol::resource::Texture::init(); +} -ewol::resource::TextureFile::TextureFile(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) : - ewol::resource::Texture(_genName) { - addObjectType("ewol::resource::Image"); +void ewol::resource::TextureFile::init(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) { + ewol::resource::Texture::init(_genName); EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=" << _tmpfileName << " size=" << _size); if (false == egami::load(m_data, _tmpfileName, _size)) { EWOL_ERROR("ERROR when loading the image : " << _tmpfileName); @@ -62,14 +63,15 @@ static int32_t nextP2(int32_t _value) { -ewol::object::Shared ewol::resource::TextureFile::keep(const std::string& _filename, ivec2 _size) { +std::shared_ptr ewol::resource::TextureFile::create(const std::string& _filename, ivec2 _size) { EWOL_VERBOSE("KEEP: TextureFile: '" << _filename << "' size=" << _size); if (_filename == "") { - ewol::object::Shared object = ewol::object::makeShared(new ewol::resource::TextureFile("")); + std::shared_ptr object(new ewol::resource::TextureFile()); if (nullptr == object) { EWOL_ERROR("allocation error of a resource : ??TEX??"); return nullptr; } + object->init(); getManager().localAdd(object); return object; } @@ -101,10 +103,10 @@ ewol::object::Shared ewol::resource::TextureFile::k } EWOL_VERBOSE("KEEP: TextureFile: '" << TmpFilename << "' new size=" << _size); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(TmpFilename); + std::shared_ptr object = nullptr; + std::shared_ptr object2 = getManager().localKeep(TmpFilename); if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); + object = std::dynamic_pointer_cast(object2); if (nullptr == object) { EWOL_CRITICAL("Request resource file : '" << TmpFilename << "' With the wrong type (dynamic cast error)"); return nullptr; @@ -115,11 +117,12 @@ ewol::object::Shared ewol::resource::TextureFile::k } EWOL_INFO("CREATE: TextureFile: '" << TmpFilename << "' size=" << _size); // need to crate a new one ... - object = ewol::object::makeShared(new ewol::resource::TextureFile(TmpFilename, _filename, _size)); + object = std::shared_ptr(new ewol::resource::TextureFile()); if (nullptr == object) { EWOL_ERROR("allocation error of a resource : " << _filename); return nullptr; } + object->init(TmpFilename, _filename, _size); getManager().localAdd(object); return object; } diff --git a/sources/ewol/resource/Image.h b/sources/ewol/resource/Image.h index fd295822..859eb66f 100644 --- a/sources/ewol/resource/Image.h +++ b/sources/ewol/resource/Image.h @@ -20,9 +20,10 @@ namespace ewol { class TextureFile : public ewol::resource::Texture { private: vec2 m_realImageSize; - private: - TextureFile(const std::string& _genName); - TextureFile(std::string _genName, const std::string& _fileName, const ivec2& _size); + protected: + TextureFile(); + void init(); + void init(std::string _genName, const std::string& _fileName, const ivec2& _size); public: virtual ~TextureFile() { }; public: @@ -37,7 +38,7 @@ namespace ewol { * @param[in] _requested size of the image (usefull when loading .svg to automatic rescale) * @return pointer on the resource or nullptr if an error occured. */ - static ewol::object::Shared keep(const std::string& _filename, ivec2 _size=ivec2(-1,-1)); + static std::shared_ptr create(const std::string& _filename, ivec2 _size=ivec2(-1,-1)); }; }; }; diff --git a/sources/ewol/resource/ImageDF.cpp b/sources/ewol/resource/ImageDF.cpp index f36e6e4c..7b4e034a 100644 --- a/sources/ewol/resource/ImageDF.cpp +++ b/sources/ewol/resource/ImageDF.cpp @@ -18,16 +18,17 @@ #undef __class__ #define __class__ "resource::TextureFile" -ewol::resource::ImageDF::ImageDF(const std::string& _genName) : - Texture(_genName) { - EWOL_DEBUG("create a new resource::ImageDF : _genName=" << _genName << " _tmpfileName=--- size=---"); - +ewol::resource::ImageDF::ImageDF() { + addObjectType("ewol::resource::ImageDF"); } -ewol::resource::ImageDF::ImageDF(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) : - ewol::resource::Texture(_genName) { - addObjectType("ewol::resource::ImageDF"); +void ewol::resource::ImageDF::init() { + ewol::resource::Texture::init(); +} + +void ewol::resource::ImageDF::init(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) { + ewol::resource::Texture::init(_genName); EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=" << _tmpfileName << " size=" << _size); if (false == egami::load(m_data, _tmpfileName, _size)) { EWOL_ERROR("ERROR when loading the image : " << _tmpfileName); @@ -151,14 +152,15 @@ static int32_t nextP2(int32_t _value) { -ewol::object::Shared ewol::resource::ImageDF::keep(const std::string& _filename, ivec2 _size) { +std::shared_ptr ewol::resource::ImageDF::create(const std::string& _filename, ivec2 _size) { EWOL_VERBOSE("KEEP: TextureFile: '" << _filename << "' size=" << _size); if (_filename == "") { - ewol::object::Shared object = ewol::object::makeShared(new ewol::resource::ImageDF("")); + std::shared_ptr object(new ewol::resource::ImageDF()); if (nullptr == object) { EWOL_ERROR("allocation error of a resource : ??TEX??"); return nullptr; } + object->init(); getManager().localAdd(object); return object; } @@ -190,10 +192,10 @@ ewol::object::Shared ewol::resource::ImageDF::keep(cons } EWOL_VERBOSE("KEEP: TextureFile: '" << TmpFilename << "' new size=" << _size); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep("DF__" + TmpFilename); + std::shared_ptr object = nullptr; + std::shared_ptr object2 = getManager().localKeep("DF__" + TmpFilename); if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); + object = std::dynamic_pointer_cast(object2); if (nullptr == object) { EWOL_CRITICAL("Request resource file : '" << TmpFilename << "' With the wrong type (dynamic cast error)"); return nullptr; @@ -204,11 +206,12 @@ ewol::object::Shared ewol::resource::ImageDF::keep(cons } EWOL_INFO("CREATE: ImageDF: '" << TmpFilename << "' size=" << _size); // need to crate a new one ... - object = ewol::object::makeShared(new ewol::resource::ImageDF("DF__" + TmpFilename, _filename, _size)); + object = std::shared_ptr(new ewol::resource::ImageDF()); if (nullptr == object) { EWOL_ERROR("allocation error of a resource : " << _filename); return nullptr; } + object->init("DF__" + TmpFilename, _filename, _size); getManager().localAdd(object); return object; } diff --git a/sources/ewol/resource/ImageDF.h b/sources/ewol/resource/ImageDF.h index 16b7844c..e9ee5be3 100644 --- a/sources/ewol/resource/ImageDF.h +++ b/sources/ewol/resource/ImageDF.h @@ -22,8 +22,9 @@ namespace ewol { protected: vec2 m_realImageSize; protected: - ImageDF(const std::string& _genName); - ImageDF(std::string _genName, const std::string& _fileName, const ivec2& _size); + ImageDF(); + void init(); + void init(std::string _genName, const std::string& _fileName, const ivec2& _size); public: virtual ~ImageDF() { }; protected: @@ -45,7 +46,7 @@ namespace ewol { * @param[in] _requested size of the image (usefull when loading .svg to automatic rescale) * @return pointer on the resource or nullptr if an error occured. */ - static ewol::object::Shared keep(const std::string& _filename, ivec2 _size=ivec2(-1,-1)); + static std::shared_ptr create(const std::string& _filename, ivec2 _size=ivec2(-1,-1)); }; }; }; diff --git a/sources/ewol/resource/Manager.cpp b/sources/ewol/resource/Manager.cpp index b1bd9b21..73bddde2 100644 --- a/sources/ewol/resource/Manager.cpp +++ b/sources/ewol/resource/Manager.cpp @@ -27,6 +27,7 @@ ewol::resource::Manager::~Manager() { EWOL_ERROR("Must not have anymore resources to update !!!"); hasError = true; } + // TODO : Remove unneeded elements if (m_resourceList.size()!=0) { EWOL_ERROR("Must not have anymore resources !!!"); hasError = true; @@ -42,10 +43,11 @@ void ewol::resource::Manager::unInit() { // remove all resources ... auto it(m_resourceList.begin()); while(it != m_resourceList.end()) { - if ((*it) != nullptr) { - EWOL_WARNING("Find a resource that is not removed : [" << (*it)->getId() << "]" - << "=\"" << (*it)->getName() << "\" " - << (*it)->getRefCount() << " elements"); + std::shared_ptr tmpRessource = (*it).lock(); + if (tmpRessource != nullptr) { + EWOL_WARNING("Find a resource that is not removed : [" << tmpRessource->getId() << "]" + << "=\"" << tmpRessource->getName() << "\" " + << tmpRessource.use_count() << " elements"); } m_resourceList.erase(it); it = m_resourceList.begin(); @@ -57,11 +59,12 @@ void ewol::resource::Manager::display() { EWOL_INFO("Resources loaded : "); // remove all resources ... for (auto &it : m_resourceList) { - if (it != nullptr) { - EWOL_INFO(" [" << it->getId() << "]" - << it->getObjectType() - << "=\"" << it->getName() << "\" " - << it->getRefCount() << " elements"); + std::shared_ptr tmpRessource = it.lock(); + if (tmpRessource != nullptr) { + EWOL_INFO(" [" << tmpRessource->getId() << "]" + << tmpRessource->getObjectType() + << "=\"" << tmpRessource->getName() << "\" " + << tmpRessource.use_count() << " elements"); } } EWOL_INFO("Resources ---"); @@ -74,10 +77,11 @@ void ewol::resource::Manager::reLoadResources() { for (size_t jjj=0; jjjgetResourceLevel()) { - it->reload(); - EWOL_INFO(" [" << it->getId() << "]="<< it->getObjectType()); + std::shared_ptr tmpRessource = it.lock(); + if(tmpRessource != nullptr) { + if (jjj == tmpRessource->getResourceLevel()) { + tmpRessource->reload(); + EWOL_INFO(" [" << tmpRessource->getId() << "]="<< tmpRessource->getObjectType()); } } } @@ -88,7 +92,7 @@ void ewol::resource::Manager::reLoadResources() { EWOL_INFO("------------- Resources -------------"); } -void ewol::resource::Manager::update(const ewol::object::Shared& _object) { +void ewol::resource::Manager::update(const std::shared_ptr& _object) { // chek if not added before for (auto &it : m_resourceListToUpdate) { if ( it != nullptr @@ -110,10 +114,11 @@ void ewol::resource::Manager::updateContext() { for (size_t jjj=0; jjjgetResourceLevel()) { + std::shared_ptr tmpRessource = it.lock(); + if( tmpRessource != nullptr + && jjj == tmpRessource->getResourceLevel()) { //EWOL_DEBUG("Update context named : " << l_resourceList[iii]->getName()); - it->updateContext(); + tmpRessource->updateContext(); } } } @@ -138,8 +143,9 @@ void ewol::resource::Manager::updateContext() { // in this case, it is really too late ... void ewol::resource::Manager::contextHasBeenDestroyed() { for (auto &it : m_resourceList) { - if (it != nullptr) { - it->removeContextToLate(); + std::shared_ptr tmpRessource = it.lock(); + if (tmpRessource != nullptr) { + tmpRessource->removeContextToLate(); } } // no context preent ... @@ -147,12 +153,13 @@ void ewol::resource::Manager::contextHasBeenDestroyed() { } // internal generic keeper ... -ewol::object::Shared ewol::resource::Manager::localKeep(const std::string& _filename) { +std::shared_ptr ewol::resource::Manager::localKeep(const std::string& _filename) { EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\""); for (auto &it : m_resourceList) { - if ( it != nullptr - && it->getName() == _filename) { - return it; + std::shared_ptr tmpRessource = it.lock(); + if ( tmpRessource != nullptr + && tmpRessource->getName() == _filename) { + return tmpRessource; } } // we did not find it ... @@ -160,10 +167,11 @@ ewol::object::Shared ewol::resource::Manager::localKeep(const st } // internal generic keeper ... -void ewol::resource::Manager::localAdd(const ewol::object::Shared& _object) { +void ewol::resource::Manager::localAdd(const std::shared_ptr& _object) { //Add ... find empty slot for (auto &it : m_resourceList) { - if (it == nullptr) { + std::shared_ptr tmpRessource = it.lock(); + if (tmpRessource == nullptr) { it = _object; return; } @@ -177,16 +185,11 @@ bool ewol::resource::Manager::checkResourceToRemove() { //EWOL_INFO("remove object in Manager"); updateContext(); for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) { - if ((*it) == nullptr) { + if ((*it).lock() == nullptr) { m_resourceList.erase(it); it = m_resourceList.begin(); continue; } - // 1 in object list, 1 in reference active list, and one here - if ((*it)->getRefCount() > 3) { - continue; - } - EWOL_DEBUG("Request remove of an resource (refcount in Low : " << (*it)->getRefCount() << ")"); m_resourceList.erase(it); it = m_resourceList.begin(); return true; diff --git a/sources/ewol/resource/Manager.h b/sources/ewol/resource/Manager.h index 3f6c1fe6..d9635042 100644 --- a/sources/ewol/resource/Manager.h +++ b/sources/ewol/resource/Manager.h @@ -20,8 +20,8 @@ namespace ewol { namespace resource { class Manager{ private: - std::list> m_resourceList; - std::vector> m_resourceListToUpdate; + std::list> m_resourceList; + std::vector> m_resourceListToUpdate; bool m_contextHasBeenRemoved; public: /** @@ -50,7 +50,7 @@ namespace ewol { * @brief Call by the system to send all the needed data on the graphic card chen they change ... * @param[in] _object The resources that might be updated */ - void update(const ewol::object::Shared& _object); + void update(const std::shared_ptr& _object); /** * @brief Call by the system chen the openGL Context has been unexpectially removed == > This reload all the texture, VBO and other .... */ @@ -61,8 +61,8 @@ namespace ewol { void contextHasBeenDestroyed(); public: // internal API to extent eResources in extern Soft - ewol::object::Shared localKeep(const std::string& _filename); - void localAdd(const ewol::object::Shared& _object); + std::shared_ptr localKeep(const std::string& _filename); + void localAdd(const std::shared_ptr& _object); virtual bool checkResourceToRemove(); }; }; diff --git a/sources/ewol/resource/Program.cpp b/sources/ewol/resource/Program.cpp index bd5974ff..a5b8aec2 100644 --- a/sources/ewol/resource/Program.cpp +++ b/sources/ewol/resource/Program.cpp @@ -19,14 +19,18 @@ #undef __class__ #define __class__ "resource::Program" -ewol::resource::Program::Program(const std::string& _filename) : - ewol::Resource(_filename), +ewol::resource::Program::Program() : + ewol::Resource(), m_exist(false), m_program(0), m_hasTexture(false), m_hasTexture1(false) { addObjectType("ewol::resource::Program"); m_resourceLevel = 1; +} + +void ewol::resource::Program::init(const std::string& _filename) { + ewol::Resource::init(_filename); EWOL_DEBUG("OGL : load PROGRAM '" << m_name << "'"); // load data from file "all the time ..." @@ -36,7 +40,7 @@ ewol::resource::Program::Program(const std::string& _filename) : std::string tmpFilename = m_name; // remove extention ... tmpFilename.erase(tmpFilename.size()-4, 4); - ewol::object::Shared tmpShader = ewol::resource::Shader::keep(tmpFilename+"vert"); + std::shared_ptr tmpShader = ewol::resource::Shader::create(tmpFilename+"vert"); if (nullptr == tmpShader) { EWOL_CRITICAL("Error while getting a specific shader filename : " << tmpFilename); return; @@ -44,7 +48,7 @@ ewol::resource::Program::Program(const std::string& _filename) : EWOL_DEBUG("Add shader on program : "<< tmpFilename << "vert"); m_shaderList.push_back(tmpShader); } - tmpShader = ewol::resource::Shader::keep(tmpFilename+"frag"); + tmpShader = ewol::resource::Shader::create(tmpFilename+"frag"); if (nullptr == tmpShader) { EWOL_CRITICAL("Error while getting a specific shader filename : " << tmpFilename); return; @@ -80,7 +84,7 @@ ewol::resource::Program::Program(const std::string& _filename) : } // get it with relative position : std::string tmpFilename = file.getRelativeFolder() + tmpData; - ewol::object::Shared tmpShader = ewol::resource::Shader::keep(tmpFilename); + std::shared_ptr tmpShader = ewol::resource::Shader::create(tmpFilename); if (nullptr == tmpShader) { EWOL_CRITICAL("Error while getting a specific shader filename : " << tmpFilename); } else { @@ -327,7 +331,7 @@ void ewol::resource::Program::sendAttribute(int32_t _idElem, void ewol::resource::Program::sendAttributePointer(int32_t _idElem, int32_t _nbElement, - const ewol::object::Shared& _vbo, + const std::shared_ptr& _vbo, int32_t _index, int32_t _jumpBetweenSample, int32_t _offset) { @@ -769,28 +773,3 @@ void ewol::resource::Program::unUse() { //checkGlError("glUseProgram", __LINE__); } - - -ewol::object::Shared ewol::resource::Program::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : Program : file : \"" << _filename << "\""); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // need to crate a new one ... - object = ewol::object::makeShared(new ewol::resource::Program(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} diff --git a/sources/ewol/resource/Program.h b/sources/ewol/resource/Program.h index ca7d0cb2..25380fb0 100644 --- a/sources/ewol/resource/Program.h +++ b/sources/ewol/resource/Program.h @@ -50,7 +50,7 @@ namespace ewol { private : bool m_exist; //!< the file existed GLuint m_program; //!< openGL id of the current program - std::vector> m_shaderList; //!< List of all the shader loaded + std::vector> m_shaderList; //!< List of all the shader loaded std::vector m_elementList; //!< List of all the attribute requested by the user bool m_hasTexture; //!< A texture has been set to the current shader bool m_hasTexture1; //!< A texture has been set to the current shader @@ -59,8 +59,10 @@ namespace ewol { * @brief Contructor of an opengl Program. * @param[in] filename Standard file name format. see @ref etk::FSNode */ - Program(const std::string& filename); + Program(); + void init(const std::string& _filename); public: + DECLARE_RESOURCE_NAMED_FACTORY(Program); /** * @brief Destructor, remove the current Program. */ @@ -86,7 +88,7 @@ namespace ewol { int32_t _jumpBetweenSample=0); void sendAttributePointer(int32_t _idElem, int32_t _nbElement, - const ewol::object::Shared& _vbo, + const std::shared_ptr& _vbo, int32_t _index, int32_t _jumpBetweenSample=0, int32_t _offset=0); @@ -293,14 +295,6 @@ namespace ewol { * @note this is really usefull when we tested the new themes or shader developpements. */ void reload(); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _filename Name of the openGL program. - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(const std::string& _filename); }; }; }; diff --git a/sources/ewol/resource/Resource.cpp b/sources/ewol/resource/Resource.cpp index 9395f398..280b76e8 100644 --- a/sources/ewol/resource/Resource.cpp +++ b/sources/ewol/resource/Resource.cpp @@ -13,21 +13,28 @@ #include #include +void ewol::Resource::init() { + ewol::Object::init(); +} + +void ewol::Resource::init(const std::string& _name) { + ewol::Object::init(_name); +} void ewol::Resource::updateContext() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << shared_from_this().use_count() << " time(s)"); } void ewol::Resource::removeContext() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << shared_from_this().use_count() << " time(s)"); } void ewol::Resource::removeContextToLate() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << shared_from_this().use_count() << " time(s)"); } void ewol::Resource::reload() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << shared_from_this().use_count() << " time(s)"); } ewol::resource::Manager& ewol::Resource::getManager() { diff --git a/sources/ewol/resource/Resource.h b/sources/ewol/resource/Resource.h index 79789cb9..23e9d55f 100644 --- a/sources/ewol/resource/Resource.h +++ b/sources/ewol/resource/Resource.h @@ -17,24 +17,91 @@ #define MAX_RESOURCE_LEVEL (5) +#define DECLARE_RESOURCE_FACTORY(className) \ + template static std::shared_ptr create( T&& ... all ) { \ + std::shared_ptr object(new className()); \ + if (object == nullptr) { \ + EWOL_ERROR("Factory resource error"); \ + return nullptr; \ + } \ + object->init(std::forward(all)... ); \ + if (object->objectHasBeenCorectlyInit() == false) { \ + EWOL_CRITICAL("Object Is not correctly init : " << #className ); \ + } \ + getManager().localAdd(object); \ + return object; \ + } + +#define DECLARE_RESOURCE_NAMED_FACTORY(className) \ + template static std::shared_ptr create(const std::string& _name, T&& ... all ) { \ + std::shared_ptr object; \ + std::shared_ptr object2 = getManager().localKeep(_name); \ + if (object2 != nullptr) { \ + object = std::dynamic_pointer_cast(object2); \ + if (object == nullptr) { \ + EWOL_CRITICAL("Request resource file : '" << _name << "' With the wrong type (dynamic cast error)"); \ + return nullptr; \ + } \ + } \ + if (object != nullptr) { \ + return object; \ + } \ + object = std::shared_ptr(new className()); \ + if (object == nullptr) { \ + EWOL_ERROR("allocation error of a resource : " << _name); \ + return nullptr; \ + } \ + object->init(_name, std::forward(all)... ); \ + if (object->objectHasBeenCorectlyInit() == false) { \ + EWOL_CRITICAL("Object Is not correctly init : " << #className ); \ + } \ + getManager().localAdd(object); \ + return object; \ + } + +#define DECLARE_RESOURCE_SINGLE_FACTORY(className,uniqueName) \ + template static std::shared_ptr create(T&& ... all ) { \ + std::shared_ptr object; \ + std::shared_ptr object2 = getManager().localKeep(uniqueName); \ + if (object2 != nullptr) { \ + object = std::dynamic_pointer_cast(object2); \ + if (object == nullptr) { \ + EWOL_CRITICAL("Request resource file : '" << uniqueName << "' With the wrong type (dynamic cast error)"); \ + return nullptr; \ + } \ + } \ + if (object != nullptr) { \ + return object; \ + } \ + object = std::shared_ptr(new className()); \ + if (object == nullptr) { \ + EWOL_ERROR("allocation error of a resource : " << uniqueName); \ + return nullptr; \ + } \ + object->init(uniqueName, std::forward(all)... ); \ + if (object->objectHasBeenCorectlyInit() == false) { \ + EWOL_CRITICAL("Object Is not correctly init : " << #className ); \ + } \ + getManager().localAdd(object); \ + return object; \ + } + namespace ewol { namespace resource { class Manager; }; // class resources is pure virtual class Resource : public ewol::Object { - public: + protected: Resource() : m_resourceLevel(MAX_RESOURCE_LEVEL-1) { addObjectType("ewol::Resource"); setStatusResource(true); }; - Resource(const std::string& _name) : - ewol::Object(_name), - m_resourceLevel(MAX_RESOURCE_LEVEL-1) { - addObjectType("ewol::Resource"); - setStatusResource(true); - }; + void init(); + void init(const std::string& _name); + public: + virtual ~Resource() { }; @@ -52,7 +119,7 @@ namespace ewol { }; }; - +#include #endif diff --git a/sources/ewol/resource/Shader.cpp b/sources/ewol/resource/Shader.cpp index ea0a5cc0..7548da01 100644 --- a/sources/ewol/resource/Shader.cpp +++ b/sources/ewol/resource/Shader.cpp @@ -15,14 +15,18 @@ #undef __class__ #define __class__ "resource::Shader" -ewol::resource::Shader::Shader(const std::string& _filename) : - ewol::Resource(_filename), +ewol::resource::Shader::Shader() : + ewol::Resource(), m_exist(false), m_fileData(nullptr), m_shader(0), m_type(0) { addObjectType("ewol::Shader"); m_resourceLevel = 0; +} + +void ewol::resource::Shader::init(const std::string& _filename) { + ewol::Resource::init(_filename); EWOL_DEBUG("OGL : load SHADER \"" << _filename << "\""); // load data from file "all the time ..." @@ -149,26 +153,3 @@ void ewol::resource::Shader::reload() { updateContext(); } -ewol::object::Shared ewol::resource::Shader::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : Simpleshader : file : \"" << _filename << "\""); - ewol::object::Shared object = nullptr; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // need to crate a new one ... - object = ewol::object::makeShared(new ewol::resource::Shader(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} diff --git a/sources/ewol/resource/Shader.h b/sources/ewol/resource/Shader.h index d6819ae8..0adaf0c1 100644 --- a/sources/ewol/resource/Shader.h +++ b/sources/ewol/resource/Shader.h @@ -30,8 +30,10 @@ namespace ewol { * @brief Contructor of an opengl Shader * @param[in] filename Standard file name format. see @ref etk::FSNode */ - Shader(const std::string& _filename); + Shader(); public: + void init(const std::string& _filename); + DECLARE_RESOURCE_NAMED_FACTORY(Shader); /** * @brief Destructor, remove the current Shader */ @@ -68,14 +70,6 @@ namespace ewol { * @note this is really usefull when we tested the new themes or shader developpements. */ void reload(); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _filename Name of the openGL Shader. - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(const std::string& _filename); }; }; }; diff --git a/sources/ewol/resource/Texture.cpp b/sources/ewol/resource/Texture.cpp index af68bb56..93346aa7 100644 --- a/sources/ewol/resource/Texture.cpp +++ b/sources/ewol/resource/Texture.cpp @@ -33,12 +33,11 @@ static int32_t nextP2(int32_t _value) { } -ewol::resource::Texture::Texture(const std::string& _filename) : - ewol::Resource(_filename) { - addObjectType("ewol::resource::Texture"); - m_loaded = false; - m_texId = 0; - m_endPointSize.setValue(1.0,1.0); +void ewol::resource::Texture::init(const std::string& _filename) { + ewol::Resource::init(_filename); +} +void ewol::resource::Texture::init() { + ewol::Resource::init(); } ewol::resource::Texture::Texture() { @@ -99,22 +98,10 @@ void ewol::resource::Texture::removeContextToLate() { void ewol::resource::Texture::flush() { // request to the manager to be call at the next update ... - getManager().update(this); + getManager().update(std::dynamic_pointer_cast(shared_from_this())); } void ewol::resource::Texture::setImageSize(ivec2 _newSize) { _newSize.setValue( nextP2(_newSize.x()), nextP2(_newSize.y()) ); m_data.resize(_newSize); } - -ewol::object::Shared ewol::resource::Texture::keep() { - // this element create a new one every time .... - ewol::object::Shared object = ewol::object::makeShared(new ewol::resource::Texture()); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : ??TEX??"); - return nullptr; - } - getManager().localAdd(object); - return object; -} - diff --git a/sources/ewol/resource/Texture.h b/sources/ewol/resource/Texture.h index fea76c6e..dd2e9051 100644 --- a/sources/ewol/resource/Texture.h +++ b/sources/ewol/resource/Texture.h @@ -45,9 +45,11 @@ namespace ewol { }; // Public API: protected: - Texture(const std::string& _filename); + void init(const std::string& _filename); + void init(); Texture(); public: + DECLARE_RESOURCE_FACTORY(Texture); virtual ~Texture(); public: // you must set the size here, because it will be set in multiple of pow(2) @@ -58,13 +60,6 @@ namespace ewol { }; // flush the data to send it at the openGl system void flush(); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(); }; }; }; diff --git a/sources/ewol/resource/TexturedFont.cpp b/sources/ewol/resource/TexturedFont.cpp index a0d807a0..424ef400 100644 --- a/sources/ewol/resource/TexturedFont.cpp +++ b/sources/ewol/resource/TexturedFont.cpp @@ -42,9 +42,12 @@ std::ostream& ewol::operator <<(std::ostream& _os, enum ewol::font::mode _obj) { #undef __class__ #define __class__ "resource::TexturedFont" -ewol::resource::TexturedFont::TexturedFont(const std::string& _fontName) : - ewol::resource::Texture(_fontName) { +ewol::resource::TexturedFont::TexturedFont() { addObjectType("ewol::resource::TexturedFont"); +} + +void ewol::resource::TexturedFont::init(const std::string& _fontName) { + ewol::resource::Texture::init(_fontName); EWOL_DEBUG("Load font : '" << _fontName << "'" ); m_font[0] = nullptr; @@ -192,7 +195,7 @@ ewol::resource::TexturedFont::TexturedFont(const std::string& _fontName) : continue; } EWOL_INFO("Load FONT [" << iiiFontId << "] name : \"" << m_fileName[iiiFontId] << "\" == > size=" << m_size); - m_font[iiiFontId] = ewol::resource::FontFreeType::keep(m_fileName[iiiFontId]); + m_font[iiiFontId] = ewol::resource::FontFreeType::create(m_fileName[iiiFontId]); if (m_font[iiiFontId] == nullptr) { EWOL_DEBUG("error in loading FONT [" << iiiFontId << "] name : \"" << m_fileName[iiiFontId] << "\" == > size=" << m_size ); } @@ -341,27 +344,3 @@ ewol::GlyphProperty* ewol::resource::TexturedFont::getGlyphPointer(const char32_ return &((m_listElement[_displayMode])[index]); } -ewol::object::Shared ewol::resource::TexturedFont::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : TexturedFont : file : '" << _filename << "'"); - ewol::object::Shared object; - ewol::object::Shared object2 = getManager().localKeep(_filename); - if (nullptr != object2) { - object = ewol::dynamic_pointer_cast(object2); - if (nullptr == object) { - EWOL_CRITICAL("Request resource file : '" << _filename << "' With the wrong type (dynamic cast error)"); - return nullptr; - } - } - if (nullptr != object) { - return object; - } - // need to crate a new one ... - EWOL_INFO("CREATE: TexturedFont : file : '" << _filename << "'"); - object = ewol::object::makeShared(new ewol::resource::TexturedFont(_filename)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : " << _filename); - return nullptr; - } - getManager().localAdd(object); - return object; -} diff --git a/sources/ewol/resource/TexturedFont.h b/sources/ewol/resource/TexturedFont.h index 46b07d6e..960609bd 100644 --- a/sources/ewol/resource/TexturedFont.h +++ b/sources/ewol/resource/TexturedFont.h @@ -36,7 +36,7 @@ namespace ewol { // specific element to have the the know if the specify element is known... // == > otherwise I can just generate italic ... // == > Bold is a little more complicated (maybe with the bordersize) - ewol::object::Shared m_font[4]; + std::shared_ptr m_font[4]; enum ewol::font::mode m_modeWraping[4]; //!< This is a wrapping mode to prevent the fact that no font is define for a specific mode public: std::vector m_listElement[4]; @@ -45,8 +45,10 @@ namespace ewol { ivec2 m_lastGlyphPos[4]; int32_t m_lastRawHeigh[4]; protected: - TexturedFont(const std::string& _fontName); + TexturedFont(); + void init(const std::string& _fontName); public: + DECLARE_RESOURCE_NAMED_FACTORY(TexturedFont); virtual ~TexturedFont(); public: /** @@ -87,14 +89,6 @@ namespace ewol { enum ewol::font::mode getWrappingMode(const enum ewol::font::mode _source) { return m_modeWraping[_source]; }; - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _filename Name of the texture font. - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(const std::string& _filename); private: /** * @brief add a glyph in a texture font. diff --git a/sources/ewol/resource/VirtualBufferObject.cpp b/sources/ewol/resource/VirtualBufferObject.cpp index b74c541c..ae144cec 100644 --- a/sources/ewol/resource/VirtualBufferObject.cpp +++ b/sources/ewol/resource/VirtualBufferObject.cpp @@ -14,18 +14,21 @@ #undef __class__ #define __class__ "resource::VirtualBufferObject" -ewol::resource::VirtualBufferObject::VirtualBufferObject(int32_t _number) : - m_exist(false) { - addObjectType("ewol::VirtualBufferObject"); +void ewol::resource::VirtualBufferObject::init(int32_t _number) { + ewol::Resource::init(); m_nbVBO = std::avg(1, _number, NB_VBO_MAX); for (size_t iii=0; iii(shared_from_this())); } void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const vec3& _data) { @@ -122,14 +125,3 @@ vec2 ewol::resource::VirtualBufferObject::getOnBufferVec2(int32_t _id, int32_t _ int32_t ewol::resource::VirtualBufferObject::sizeOnBufferVec2(int32_t _id) { return m_buffer[_id].size()/2; } - -ewol::object::Shared ewol::resource::VirtualBufferObject::keep(int32_t _number) { - // this element create a new one every time .... - ewol::object::Shared object = ewol::object::makeShared(new ewol::resource::VirtualBufferObject(_number)); - if (nullptr == object) { - EWOL_ERROR("allocation error of a resource : ??VBO??"); - return nullptr; - } - getManager().localAdd(object); - return object; -} diff --git a/sources/ewol/resource/VirtualBufferObject.h b/sources/ewol/resource/VirtualBufferObject.h index 69c54d32..49b5f90f 100644 --- a/sources/ewol/resource/VirtualBufferObject.h +++ b/sources/ewol/resource/VirtualBufferObject.h @@ -34,8 +34,10 @@ namespace ewol { * @brief Constructor of this VBO. * @param[in] accesMode Acces mode : ??? */ - VirtualBufferObject(int32_t _number); + VirtualBufferObject(); + void init(int32_t _number); public: + DECLARE_RESOURCE_FACTORY(VirtualBufferObject); /** * @brief Destructor of this VBO. */ @@ -93,14 +95,6 @@ namespace ewol { * @note this is really usefull when we tested the new themes or shader developpements. */ void reload(); - public: - /** - * @brief keep the resource pointer. - * @note Never free this pointer by your own... - * @param[in] _number Number of VBO needed - * @return pointer on the resource or nullptr if an error occured. - */ - static ewol::object::Shared keep(int32_t _number); }; }; }; diff --git a/sources/ewol/resource/font/FontBase.h b/sources/ewol/resource/font/FontBase.h index f30c6187..ffb68cc7 100644 --- a/sources/ewol/resource/font/FontBase.h +++ b/sources/ewol/resource/font/FontBase.h @@ -22,7 +22,12 @@ namespace ewol { namespace resource { class FontBase : public ewol::Resource { public: - FontBase(const std::string& _fontName) : ewol::Resource(_fontName) {}; + FontBase() { + addObjectType("ewol::FontFreeType"); + } + void init(const std::string& _fontName) { + ewol::Resource::init(_fontName); + }; virtual ~FontBase() { }; diff --git a/sources/ewol/widget/Button.cpp b/sources/ewol/widget/Button.cpp index fe23add0..c808405b 100644 --- a/sources/ewol/widget/Button.cpp +++ b/sources/ewol/widget/Button.cpp @@ -34,17 +34,7 @@ const char* const ewol::widget::Button::configShaper = "shaper"; #define STATUS_PRESSED (1) #define STATUS_DOWN (3) - -static ewol::Widget* create() { - return new ewol::widget::Button(); -} - -void ewol::widget::Button::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__, &create); -} - -ewol::widget::Button::Button(const std::string& _shaperName) : - m_shaper(_shaperName), +ewol::widget::Button::Button() : m_value(false), m_lock(ewol::widget::Button::lockNone), m_toggleMode(false), @@ -76,6 +66,11 @@ ewol::widget::Button::Button(const std::string& _shaperName) : setMouseLimit(1); } +void ewol::widget::Button::init(const std::string& _shaperName) { + ewol::widget::Container2::init(); + m_shaper.setSource(_shaperName); +} + ewol::widget::Button::~Button() { diff --git a/sources/ewol/widget/Button.h b/sources/ewol/widget/Button.h index b165c7f0..f5afb86d 100644 --- a/sources/ewol/widget/Button.h +++ b/sources/ewol/widget/Button.h @@ -27,8 +27,6 @@ namespace ewol { */ class Button : public ewol::widget::Container2 { public: - //! @not-in-doc - static void init(ewol::widget::Manager& _widgetManager); // Event list of properties static const char* const eventPressed; static const char* const eventDown; @@ -50,12 +48,15 @@ namespace ewol { }; private: ewol::compositing::Shaper m_shaper; //!< Compositing theme. - public: + protected: /** * @brief Constructor * @param[in] _shaperName Shaper file properties */ - Button(const std::string& _shaperName="THEME:GUI:Button.json"); + Button(); + void init(const std::string& _shaperName="THEME:GUI:Button.json"); + public: + DECLARE_WIDGET_FACTORY(Button, "Button"); /** * @brief Destructor */ diff --git a/sources/ewol/widget/ButtonColor.cpp b/sources/ewol/widget/ButtonColor.cpp index 8570dbf4..7f945211 100644 --- a/sources/ewol/widget/ButtonColor.cpp +++ b/sources/ewol/widget/ButtonColor.cpp @@ -30,17 +30,8 @@ const char * const ewol::widget::ButtonColor::eventChange = "change"; static const char* const eventColorHasChange = "ewol-widget-ButtonColor-colorChange"; -static ewol::Widget* create() { - return new ewol::widget::ButtonColor(); -} - -void ewol::widget::ButtonColor::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__, &create); -} - -ewol::widget::ButtonColor::ButtonColor(etk::Color<> _baseColor, std::string _shaperName) : - m_shaper(_shaperName), - m_textColorFg(_baseColor), +ewol::widget::ButtonColor::ButtonColor() : + m_textColorFg(etk::color::black), m_widgetContextMenu(nullptr) { addObjectType("ewol::widget::ButtonColor"); addEventId(eventChange); @@ -50,6 +41,11 @@ ewol::widget::ButtonColor::ButtonColor(etk::Color<> _baseColor, std::string _sha setMouseLimit(1); } +void ewol::widget::ButtonColor::init(etk::Color<> _baseColor, std::string _shaperName) { + ewol::Widget::init(); + m_shaper.setSource(_shaperName); + m_textColorFg = _baseColor; +} ewol::widget::ButtonColor::~ButtonColor() { @@ -176,7 +172,7 @@ bool ewol::widget::ButtonColor::onEventInput(const ewol::event::Input& _event) { m_buttonPressed = false; m_mouseHover = false; // create a context menu : - m_widgetContextMenu = new ewol::widget::ContextMenu(); + m_widgetContextMenu = std::make_shared(); if (nullptr == m_widgetContextMenu) { EWOL_ERROR("Allocation Error"); return true; @@ -185,17 +181,17 @@ bool ewol::widget::ButtonColor::onEventInput(const ewol::event::Input& _event) { tmpPos.setX( tmpPos.x() - m_minSize.x()/2.0); m_widgetContextMenu->setPositionMark(ewol::widget::ContextMenu::markButtom, tmpPos ); - ewol::widget::ColorChooser * myColorChooser = new widget::ColorChooser(); + std::shared_ptr myColorChooser = widget::ColorChooser::create(); myColorChooser->setColor(m_textColorFg); // set it in the pop-up-system : m_widgetContextMenu->setSubWidget(myColorChooser); - myColorChooser->registerOnEvent(this, "change", eventColorHasChange); - ewol::object::Shared currentWindows = getWindows(); + myColorChooser->registerOnEvent(shared_from_this(), "change", eventColorHasChange); + std::shared_ptr currentWindows = getWindows(); if (currentWindows == nullptr) { EWOL_ERROR("Can not get the curent Windows..."); m_widgetContextMenu.reset(); } else { - currentWindows->popUpWidgetPush(m_widgetContextMenu.get()); + currentWindows->popUpWidgetPush(m_widgetContextMenu); } markToRedraw(); } diff --git a/sources/ewol/widget/ButtonColor.h b/sources/ewol/widget/ButtonColor.h index ae2ab3cf..10df4ed9 100644 --- a/sources/ewol/widget/ButtonColor.h +++ b/sources/ewol/widget/ButtonColor.h @@ -24,25 +24,26 @@ namespace ewol { public: // Event list of properties static const char * const eventChange; - public: - static void init(ewol::widget::Manager& _widgetManager); private: ewol::compositing::Shaper m_shaper; //!< Compositing theme. ewol::compositing::Text m_text; //!< Compositing Test display. etk::Color<> m_textColorFg; //!< Current color. - ewol::object::Shared m_widgetContextMenu; //!< Specific context menu. + std::shared_ptr m_widgetContextMenu; //!< Specific context menu. bool m_mouseHover; //!< Flag to know where the mouse is (inside the displayed widget (if not fill)). bool m_buttonPressed; //!< Flag to know if the button is curently pressed. // hover area : vec2 m_selectableAreaPos; //!< Start position of the events vec2 m_selectableAreaSize; //!< size of the event positions - public: + protected: /** * @brief Main constructor. * @param[in] _baseColor basic displayed color. * @param[in] _shaperName The new shaper filename. */ - ButtonColor(etk::Color<> _baseColor=etk::color::black, std::string _shaperName="THEME:GUI:widgetButton.json"); + ButtonColor(); + void init(etk::Color<> _baseColor=etk::color::black, std::string _shaperName="THEME:GUI:widgetButton.json"); + public: + DECLARE_WIDGET_FACTORY(ButtonColor, "ButtonColor"); /** * @brief Main destructor. */ diff --git a/sources/ewol/widget/CheckBox.cpp b/sources/ewol/widget/CheckBox.cpp index 7ecab819..19273c38 100644 --- a/sources/ewol/widget/CheckBox.cpp +++ b/sources/ewol/widget/CheckBox.cpp @@ -27,16 +27,8 @@ const char* const ewol::widget::CheckBox::configShaper = "shaper"; #undef __class__ #define __class__ "CheckBox" -static ewol::Widget* create() { - return new ewol::widget::CheckBox(); -} -void ewol::widget::CheckBox::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__, &create); -} - -ewol::widget::CheckBox::CheckBox(const std::string& _shaperName) : - m_shaper(_shaperName), +ewol::widget::CheckBox::CheckBox() : m_mouseHover(false), m_buttonPressed(false), m_selectableAreaPos(0,0), @@ -67,6 +59,11 @@ ewol::widget::CheckBox::CheckBox(const std::string& _shaperName) : } +void ewol::widget::CheckBox::init(const std::string& _shaperName) { + ewol::widget::Container2::init(); + m_shaper.setSource(_shaperName); +} + ewol::widget::CheckBox::~CheckBox() { } diff --git a/sources/ewol/widget/CheckBox.h b/sources/ewol/widget/CheckBox.h index 38dd7c0c..48bf912f 100644 --- a/sources/ewol/widget/CheckBox.h +++ b/sources/ewol/widget/CheckBox.h @@ -20,8 +20,6 @@ namespace ewol { namespace widget { class CheckBox : public ewol::widget::Container2 { public: - //! @not-in-doc - static void init(ewol::widget::Manager& _widgetManager); // Event list of properties static const char* const eventPressed; static const char* const eventDown; @@ -41,12 +39,15 @@ namespace ewol { // shaper ids: int32_t m_shaperIdSize; int32_t m_shaperIdSizeInsize; - public: + protected: /** * @brief Main checkbox constructor * @param[in] _shaperName Shaper file properties */ - CheckBox(const std::string& _shaperName="THEME:GUI:CheckBox.json"); + CheckBox(); + void init(const std::string& _shaperName="THEME:GUI:CheckBox.json"); + public: + DECLARE_WIDGET_FACTORY(CheckBox, "CheckBox"); /** * @brief main destructor. */ diff --git a/sources/ewol/widget/ColorBar.cpp b/sources/ewol/widget/ColorBar.cpp index 5610e8a5..673690f9 100644 --- a/sources/ewol/widget/ColorBar.cpp +++ b/sources/ewol/widget/ColorBar.cpp @@ -29,6 +29,10 @@ ewol::widget::ColorBar::ColorBar() { setMouseLimit(1); } +void ewol::widget::ColorBar::init() { + ewol::Widget::init(); +} + ewol::widget::ColorBar::~ColorBar() { } diff --git a/sources/ewol/widget/ColorBar.h b/sources/ewol/widget/ColorBar.h index 0b0da2d2..f557c8bc 100644 --- a/sources/ewol/widget/ColorBar.h +++ b/sources/ewol/widget/ColorBar.h @@ -22,8 +22,11 @@ namespace ewol { public: // Event list of properties static const char * const eventChange; - public: + protected: ColorBar(); + void init(); + public: + DECLARE_WIDGET_FACTORY(ColorBar, "ColorBar"); virtual ~ColorBar(); etk::Color<> getCurrentColor(); void setCurrentColor(etk::Color<> _newOne); diff --git a/sources/ewol/widget/Composer.cpp b/sources/ewol/widget/Composer.cpp index 261c75ce..17bb9589 100644 --- a/sources/ewol/widget/Composer.cpp +++ b/sources/ewol/widget/Composer.cpp @@ -15,17 +15,13 @@ #undef __class__ #define __class__ "ewol::widget::Composer" -#include -void ewol::widget::Composer::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator("Composer",[]() -> ewol::Widget* { return new ewol::widget::Composer(); }); -} - ewol::widget::Composer::Composer() { + addObjectType("ewol::widget::Composer"); // nothing to do ... } -ewol::widget::Composer::Composer(enum composerMode _mode, const std::string& _fileName) { - addObjectType("ewol::widget::Composer"); +void ewol::widget::Composer::init(enum composerMode _mode, const std::string& _fileName) { + ewol::widget::Container::init(); switch(_mode) { case ewol::widget::Composer::None: // nothing to do ... @@ -98,16 +94,16 @@ void ewol::widget::Composer::registerOnEventNameWidget(const std::string& _subWi const char * _eventId, const char * _eventIdgenerated, const std::string& _overloadData) { - registerOnEventNameWidget(this, _subWidgetName, _eventId, _eventIdgenerated, _overloadData); + registerOnEventNameWidget(shared_from_this(), _subWidgetName, _eventId, _eventIdgenerated, _overloadData); } -void ewol::widget::Composer::registerOnEventNameWidget(const ewol::object::Shared& _destinationObject, +void ewol::widget::Composer::registerOnEventNameWidget(const std::shared_ptr& _destinationObject, const std::string& _subWidgetName, const char * _eventId, const char * _eventIdgenerated, const std::string& _overloadData) { - ewol::object::Shared tmpWidget = getWidgetNamed(_subWidgetName); - if (nullptr != tmpWidget) { + std::shared_ptr tmpWidget = getWidgetNamed(_subWidgetName); + if (tmpWidget != nullptr) { EWOL_DEBUG("Find widget named : \"" << _subWidgetName << "\" register event=\"" << _eventId << "\""); tmpWidget->registerOnEvent(_destinationObject, _eventId, _eventIdgenerated, _overloadData); } else { diff --git a/sources/ewol/widget/Composer.h b/sources/ewol/widget/Composer.h index 4cb56a7e..286765a1 100644 --- a/sources/ewol/widget/Composer.h +++ b/sources/ewol/widget/Composer.h @@ -20,15 +20,13 @@ namespace ewol { * @brief the composer widget is a widget that create a link on a string.file to parse the data and generate some widget tree */ class Composer : public ewol::widget::Container { - public: - static void init(ewol::widget::Manager& _widgetManager); public: enum composerMode { None, String, file }; - public: + protected: /** * @brief Constructor */ @@ -38,7 +36,9 @@ namespace ewol { * @param[in] _mode mode of parsing the string * @param[in] _data file/directString data to generate compositing of the widget.. */ - Composer(enum composerMode _mode, const std::string& _data); + void init(enum composerMode _mode = ewol::widget::Composer::None, const std::string& _data = ""); + public: + DECLARE_WIDGET_FACTORY(Composer, "Composer"); /** * @brief Destructor */ @@ -80,7 +80,7 @@ namespace ewol { * @param[in] _overloadData When the user prever to receive a data specificly for this event ... * @note : To used when NOT herited from this object. */ - void registerOnEventNameWidget(const ewol::object::Shared& _destinationObject, + void registerOnEventNameWidget(const std::shared_ptr& _destinationObject, const std::string& _subWidgetName, const char * _eventId, const char * _eventIdgenerated = nullptr, diff --git a/sources/ewol/widget/Container.cpp b/sources/ewol/widget/Container.cpp index 27654711..fb166ab7 100644 --- a/sources/ewol/widget/Container.cpp +++ b/sources/ewol/widget/Container.cpp @@ -16,37 +16,41 @@ #define __class__ "Container" -ewol::widget::Container::Container(ewol::object::Shared _subElement) : - m_subWidget(_subElement) { +ewol::widget::Container::Container() { addObjectType("ewol::widget::Container"); // nothing to do ... } +void ewol::widget::Container::init(std::shared_ptr _subElement) { + ewol::Widget::init(); + m_subWidget = _subElement; +} + + ewol::widget::Container::~Container() { subWidgetRemove(); } -ewol::object::Shared ewol::widget::Container::getSubWidget() { +std::shared_ptr ewol::widget::Container::getSubWidget() { return m_subWidget; } -void ewol::widget::Container::setSubWidget(ewol::object::Shared _newWidget) { - if (nullptr == _newWidget) { +void ewol::widget::Container::setSubWidget(std::shared_ptr _newWidget) { + if (_newWidget == nullptr) { return; } subWidgetRemove(); m_subWidget = _newWidget; - if (m_subWidget!=nullptr) { - m_subWidget->setUpperWidget(this); + if (m_subWidget != nullptr) { + m_subWidget->setParent(shared_from_this()); } markToRedraw(); requestUpdateSize(); } void ewol::widget::Container::subWidgetRemove() { - if (nullptr != m_subWidget) { - m_subWidget->removeUpperWidget(); - m_subWidget->removeObject(); + if (m_subWidget != nullptr) { + m_subWidget->removeParent(); m_subWidget.reset(); markToRedraw(); requestUpdateSize(); @@ -54,14 +58,14 @@ void ewol::widget::Container::subWidgetRemove() { } void ewol::widget::Container::subWidgetUnLink() { - if (nullptr != m_subWidget) { - m_subWidget->removeUpperWidget(); + if (m_subWidget != nullptr) { + m_subWidget->removeParent(); } m_subWidget.reset(); } -ewol::object::Shared ewol::widget::Container::getWidgetNamed(const std::string& _widgetName) { - ewol::object::Shared tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); +std::shared_ptr ewol::widget::Container::getWidgetNamed(const std::string& _widgetName) { + std::shared_ptr tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); if (nullptr!=tmpUpperWidget) { return tmpUpperWidget; } @@ -71,7 +75,7 @@ ewol::object::Shared ewol::widget::Container::getWidgetNamed(const return nullptr; } -void ewol::widget::Container::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::widget::Container::onObjectRemove(const std::shared_ptr& _object) { ewol::Widget::onObjectRemove(_object); if (m_subWidget == _object) { m_subWidget.reset(); @@ -138,7 +142,7 @@ void ewol::widget::Container::onRegenerateDisplay() { } } -ewol::object::Shared ewol::widget::Container::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::Container::getWidgetAtPos(const vec2& _pos) { if (false == isHide()) { if (nullptr!=m_subWidget) { return m_subWidget->getWidgetAtPos(_pos); @@ -174,7 +178,7 @@ bool ewol::widget::Container::loadXML(exml::Element* _node) { continue; } EWOL_DEBUG("try to create subwidget : '" << widgetName << "'"); - ewol::object::Shared tmpWidget = getWidgetManager().create(widgetName); + std::shared_ptr tmpWidget = getWidgetManager().create(widgetName); if (tmpWidget == nullptr) { EWOL_ERROR ("(l "<getPos()<<") Can not create the widget : \"" << widgetName << "\""); continue; @@ -197,4 +201,14 @@ void ewol::widget::Container::setOffset(const vec2& _newVal) { } } - +void ewol::widget::Container::requestDestroyFromChild(const std::shared_ptr& _child) { + if (m_subWidget != _child) { + return; + } + if (m_subWidget == nullptr) { + return; + } + m_subWidget->removeParent(); + m_subWidget.reset(); + markToRedraw(); +} diff --git a/sources/ewol/widget/Container.h b/sources/ewol/widget/Container.h index feb9caf0..8417a8d3 100644 --- a/sources/ewol/widget/Container.h +++ b/sources/ewol/widget/Container.h @@ -21,12 +21,14 @@ namespace ewol { */ class Container : public ewol::Widget { protected: - ewol::object::Owner m_subWidget; - public: + std::shared_ptr m_subWidget; + protected: /** * @brief Constructor */ - Container(ewol::object::Shared _subElement=nullptr); + Container(); + void init(std::shared_ptr _subElement=nullptr); + public: /** * @brief Destructor */ @@ -36,12 +38,12 @@ namespace ewol { * @brief get the main node widget * @return the requested pointer on the node */ - ewol::object::Shared getSubWidget(); + std::shared_ptr getSubWidget(); /** * @brief set the subWidget node widget. * @param[in] _newWidget The widget to add. */ - void setSubWidget(ewol::object::Shared _newWidget); + void setSubWidget(std::shared_ptr _newWidget); /** * @brief remove the subWidget node (async). */ @@ -50,17 +52,17 @@ namespace ewol { * @brief Unlink the subwidget Node. */ void subWidgetUnLink(); - public: // Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); - virtual ewol::object::Shared getWidgetNamed(const std::string& _widgetName); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetNamed(const std::string& _widgetName); virtual bool loadXML(exml::Element* _node); virtual void setOffset(const vec2& _newVal); + virtual void requestDestroyFromChild(const std::shared_ptr& _child); }; }; }; diff --git a/sources/ewol/widget/Container2.cpp b/sources/ewol/widget/Container2.cpp index 28539782..bf8358ae 100644 --- a/sources/ewol/widget/Container2.cpp +++ b/sources/ewol/widget/Container2.cpp @@ -16,25 +16,29 @@ #define __class__ "Container2" -ewol::widget::Container2::Container2(ewol::object::Shared _subElement, ewol::object::Shared _subElementToggle) : +ewol::widget::Container2::Container2() : m_idWidgetDisplayed(0) { - m_subWidget[0] = _subElement; - m_subWidget[1] = _subElementToggle; addObjectType("ewol::widget::Container2"); // nothing to do ... } +void ewol::widget::Container2::init(std::shared_ptr _subElement, std::shared_ptr _subElementToggle) { + ewol::Widget::init(); + m_subWidget[0] = _subElement; + m_subWidget[1] = _subElementToggle; +} + ewol::widget::Container2::~Container2() { subWidgetRemove(); subWidgetRemoveToggle(); } -void ewol::widget::Container2::setSubWidget(ewol::object::Shared _newWidget, int32_t _idWidget) { +void ewol::widget::Container2::setSubWidget(std::shared_ptr _newWidget, int32_t _idWidget) { subWidgetRemove(_idWidget); m_subWidget[_idWidget] = _newWidget; if (m_subWidget[_idWidget] != nullptr) { EWOL_VERBOSE("Add widget : " << _idWidget); - m_subWidget[_idWidget]->setUpperWidget(this); + m_subWidget[_idWidget]->setParent(shared_from_this()); } markToRedraw(); requestUpdateSize(); @@ -44,7 +48,7 @@ void ewol::widget::Container2::setSubWidget(ewol::object::Shared _ void ewol::widget::Container2::subWidgetRemove(int32_t _idWidget) { if (m_subWidget[_idWidget] != nullptr) { EWOL_VERBOSE("Remove widget : " << _idWidget); - m_subWidget[_idWidget]->removeUpperWidget(); + m_subWidget[_idWidget]->removeParent(); m_subWidget[_idWidget].reset(); markToRedraw(); requestUpdateSize(); @@ -53,14 +57,14 @@ void ewol::widget::Container2::subWidgetRemove(int32_t _idWidget) { void ewol::widget::Container2::subWidgetUnLink(int32_t _idWidget) { if (m_subWidget[_idWidget] != nullptr) { - m_subWidget[_idWidget]->removeUpperWidget(); + m_subWidget[_idWidget]->removeParent(); EWOL_VERBOSE("Unlink widget : " << _idWidget); } - m_subWidget[_idWidget].resetShared(); + m_subWidget[_idWidget].reset(); } -ewol::object::Shared ewol::widget::Container2::getWidgetNamed(const std::string& _widgetName) { - ewol::object::Shared tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); +std::shared_ptr ewol::widget::Container2::getWidgetNamed(const std::string& _widgetName) { + std::shared_ptr tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); if (tmpUpperWidget != nullptr) { return tmpUpperWidget; } @@ -73,7 +77,7 @@ ewol::object::Shared ewol::widget::Container2::getWidgetNamed(cons return nullptr; } -void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::widget::Container2::onObjectRemove(const std::shared_ptr& _object) { ewol::Widget::onObjectRemove(_object); if (m_subWidget[0] == _object) { m_subWidget[0].reset(); @@ -173,7 +177,7 @@ void ewol::widget::Container2::onRegenerateDisplay() { } } /* -ewol::object::Shared ewol::widget::Container2::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::Container2::getWidgetAtPos(const vec2& _pos) { if (isHide() == false) { if (m_subWidget[m_idWidgetDisplayed] != nullptr) { return m_subWidget[m_idWidgetDisplayed]->getWidgetAtPos(_pos); @@ -213,7 +217,7 @@ bool ewol::widget::Container2::loadXML(exml::Element* _node) { } } EWOL_DEBUG("try to create subwidget : '" << widgetName << "'"); - ewol::object::Shared tmpWidget = getWidgetManager().create(widgetName); + std::shared_ptr tmpWidget = getWidgetManager().create(widgetName); if (tmpWidget == nullptr) { EWOL_ERROR ("(l "<getPos()<<") Can not create the widget : \"" << widgetName << "\""); continue; @@ -240,4 +244,23 @@ void ewol::widget::Container2::setOffset(const vec2& _newVal) { } } +void ewol::widget::Container2::requestDestroyFromChild(const std::shared_ptr& _child) { + if (m_subWidget[0] == _child) { + if (m_subWidget[0] == nullptr) { + return; + } + m_subWidget[0]->removeParent(); + m_subWidget[0].reset(); + markToRedraw(); + } + if (m_subWidget[1] == _child) { + if (m_subWidget[1] == nullptr) { + return; + } + m_subWidget[1]->removeParent(); + m_subWidget[1].reset(); + markToRedraw(); + } +} + diff --git a/sources/ewol/widget/Container2.h b/sources/ewol/widget/Container2.h index 540cec3a..561495ff 100644 --- a/sources/ewol/widget/Container2.h +++ b/sources/ewol/widget/Container2.h @@ -22,15 +22,17 @@ namespace ewol { */ class Container2 : public ewol::Widget { protected: - ewol::object::Owner m_subWidget[2]; //!< 2 subwidget possible + std::shared_ptr m_subWidget[2]; //!< 2 subwidget possible int32_t m_idWidgetDisplayed; //!< current widget displayed - public: + protected: /** * @brief Constructor * @param[in] _subElement Widget to set on the normal position * @param[in] _subElementToggle Widget to set on the toggle position */ - Container2(ewol::object::Shared _subElement = nullptr, ewol::object::Shared _subElementToggle = nullptr); + Container2(); + void init(std::shared_ptr _subElement = nullptr, std::shared_ptr _subElementToggle = nullptr); + public: /** * @brief Destructor */ @@ -41,20 +43,20 @@ namespace ewol { * @param[in] _subWidget Widget to add normal * @param[in] _idWidget Id of the widget to set */ - void setSubWidget(ewol::object::Shared _subWidget, int32_t _idWidget); + void setSubWidget(std::shared_ptr _subWidget, int32_t _idWidget); public: /** * @brief Specify the current widget * @param[in] _subWidget Widget to add normal */ - void setSubWidget(ewol::object::Shared _subWidget) { + void setSubWidget(std::shared_ptr _subWidget) { setSubWidget(_subWidget, 0); } /** * @brief Specify the current toggle widget * @param[in] _subWidget Widget to add Toggle */ - void setSubWidgetToggle(ewol::object::Shared _subWidget) { + void setSubWidgetToggle(std::shared_ptr _subWidget) { setSubWidget(_subWidget, 1); } private: @@ -63,7 +65,7 @@ namespace ewol { * @param[in] _idWidget Id of the widget to set * @return The base widget */ - ewol::object::Shared getSubWidget(int32_t _idWidget) const { + std::shared_ptr getSubWidget(int32_t _idWidget) const { return m_subWidget[_idWidget]; }; public: @@ -71,14 +73,14 @@ namespace ewol { * @brief get the current displayed composition * @return The base widget */ - ewol::object::Shared getSubWidget() const { + std::shared_ptr getSubWidget() const { return getSubWidget(0); }; /** * @brief get the current displayed composition * @return The toggle widget */ - ewol::object::Shared getSubWidgetToggle() const { + std::shared_ptr getSubWidgetToggle() const { return getSubWidget(1); }; private: @@ -152,17 +154,18 @@ namespace ewol { public: // Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object); virtual void calculateSize(const vec2& _availlable) { calculateSizePadded(_availlable); } virtual void calculateMinMaxSize() { calculateMinMaxSizePadded(); } - //virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); - virtual ewol::object::Shared getWidgetNamed(const std::string& _widgetName); + //virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetNamed(const std::string& _widgetName); virtual bool loadXML(exml::Element* _node); virtual void setOffset(const vec2& _newVal); + virtual void requestDestroyFromChild(const std::shared_ptr& _child); }; }; }; diff --git a/sources/ewol/widget/ContainerN.cpp b/sources/ewol/widget/ContainerN.cpp index 7fa5a7ee..3afbf6e5 100644 --- a/sources/ewol/widget/ContainerN.cpp +++ b/sources/ewol/widget/ContainerN.cpp @@ -22,6 +22,10 @@ ewol::widget::ContainerN::ContainerN() : // nothing to do ... } +void ewol::widget::ContainerN::init() { + ewol::Widget::init(); +} + ewol::widget::ContainerN::~ContainerN() { subWidgetRemoveAll(); } @@ -52,13 +56,13 @@ void ewol::widget::ContainerN::lockExpand(const bvec2& _lockExpand) { } -int32_t ewol::widget::ContainerN::subWidgetAdd(ewol::object::Shared _newWidget) { +int32_t ewol::widget::ContainerN::subWidgetAdd(std::shared_ptr _newWidget) { if (nullptr == _newWidget) { EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} Try to add An empty Widget ... "); return -1; } - if (_newWidget!=nullptr) { - _newWidget->setUpperWidget(this); + if (_newWidget != nullptr) { + _newWidget->setParent(shared_from_this()); } m_subWidget.push_back(_newWidget); markToRedraw(); @@ -67,13 +71,13 @@ int32_t ewol::widget::ContainerN::subWidgetAdd(ewol::object::SharedgetId(); } -int32_t ewol::widget::ContainerN::subWidgetAddStart(ewol::object::Shared _newWidget) { +int32_t ewol::widget::ContainerN::subWidgetAddStart(std::shared_ptr _newWidget) { if (nullptr == _newWidget) { EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} Try to add start An empty Widget ... "); return -1; } - if (_newWidget!=nullptr) { - _newWidget->setUpperWidget(this); + if (_newWidget != nullptr) { + _newWidget->setParent(shared_from_this()); } m_subWidget.insert(m_subWidget.begin(), _newWidget); markToRedraw(); @@ -81,7 +85,7 @@ int32_t ewol::widget::ContainerN::subWidgetAddStart(ewol::object::SharedgetId(); } -void ewol::widget::ContainerN::subWidgetRemove(ewol::object::Shared _newWidget) { +void ewol::widget::ContainerN::subWidgetRemove(std::shared_ptr _newWidget) { if (nullptr == _newWidget) { return; } @@ -90,7 +94,7 @@ void ewol::widget::ContainerN::subWidgetRemove(ewol::object::SharedremoveUpperWidget(); + (*it)->removeParent(); m_subWidget.erase(it); it = m_subWidget.begin(); markToRedraw(); @@ -101,15 +105,15 @@ void ewol::widget::ContainerN::subWidgetRemove(ewol::object::Shared _newWidget) { +void ewol::widget::ContainerN::subWidgetUnLink(std::shared_ptr _newWidget) { if (nullptr == _newWidget) { return; } auto it(m_subWidget.begin()); while (it != m_subWidget.end()) { if (_newWidget == *it) { - (*it)->removeUpperWidget(); - (*it).resetShared(); + (*it)->removeParent(); + (*it).reset(); m_subWidget.erase(it); it = m_subWidget.begin(); markToRedraw(); @@ -123,7 +127,7 @@ void ewol::widget::ContainerN::subWidgetUnLink(ewol::object::SharedremoveUpperWidget(); + it->removeParent(); } it.reset(); } @@ -134,14 +138,14 @@ void ewol::widget::ContainerN::subWidgetRemoveAllDelayed() { subWidgetRemoveAll(); } -ewol::object::Shared ewol::widget::ContainerN::getWidgetNamed(const std::string& _widgetName) { - ewol::object::Shared tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); +std::shared_ptr ewol::widget::ContainerN::getWidgetNamed(const std::string& _widgetName) { + std::shared_ptr tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); if (tmpUpperWidget != nullptr) { return tmpUpperWidget; } for (auto &it : m_subWidget) { if (it != nullptr) { - ewol::object::Shared tmpWidget = it->getWidgetNamed(_widgetName); + std::shared_ptr tmpWidget = it->getWidgetNamed(_widgetName); if (tmpWidget != nullptr) { return tmpWidget; } @@ -150,7 +154,7 @@ ewol::object::Shared ewol::widget::ContainerN::getWidgetNamed(cons return nullptr; } -void ewol::widget::ContainerN::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::widget::ContainerN::onObjectRemove(const std::shared_ptr& _object) { // First step call parrent : ewol::Widget::onObjectRemove(_object); // second step find if in all the elements ... @@ -224,7 +228,7 @@ void ewol::widget::ContainerN::onRegenerateDisplay() { } } -ewol::object::Shared ewol::widget::ContainerN::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::ContainerN::getWidgetAtPos(const vec2& _pos) { if (true == isHide()) { return nullptr; } @@ -236,7 +240,7 @@ ewol::object::Shared ewol::widget::ContainerN::getWidgetAtPos(cons if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = it->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = it->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } @@ -280,7 +284,7 @@ bool ewol::widget::ContainerN::loadXML(exml::Element* _node) { continue; } EWOL_DEBUG("[" << getId() << "] {" << getObjectType() << "} load new element : \"" << widgetName << "\""); - ewol::object::Shared subWidget = getWidgetManager().create(widgetName); + std::shared_ptr subWidget = getWidgetManager().create(widgetName); if (subWidget == nullptr) { EWOL_ERROR ("[" << getId() << "] {" << getObjectType() << "} (l "<getPos()<<") Can not create the widget : \"" << widgetName << "\""); continue; @@ -308,3 +312,23 @@ void ewol::widget::ContainerN::setOffset(const vec2& _newVal) { } } +void ewol::widget::ContainerN::requestDestroyFromChild(const std::shared_ptr& _child) { + auto it = m_subWidget.begin(); + while (it != m_subWidget.end()) { + if (*it == _child) { + if (*it == nullptr) { + m_subWidget.erase(it); + it = m_subWidget.begin(); + continue; + } + (*it)->removeParent(); + (*it).reset(); + m_subWidget.erase(it); + it = m_subWidget.begin(); + markToRedraw(); + continue; + } + ++it; + } +} + diff --git a/sources/ewol/widget/ContainerN.h b/sources/ewol/widget/ContainerN.h index 1ec1be6a..78c58966 100644 --- a/sources/ewol/widget/ContainerN.h +++ b/sources/ewol/widget/ContainerN.h @@ -22,12 +22,14 @@ namespace ewol { */ class ContainerN : public ewol::Widget { protected: - std::list> m_subWidget; - public: + std::list> m_subWidget; + protected: /** * @brief Constructor */ ContainerN(); + void init(); + public: /** * @brief Destructor */ @@ -57,13 +59,13 @@ namespace ewol { * @param[in] _newWidget the element pointer * @return the ID of the set element */ - virtual int32_t subWidgetAdd(ewol::object::Shared _newWidget); + virtual int32_t subWidgetAdd(std::shared_ptr _newWidget); //! @previous - inline int32_t subWidgetAddBack(ewol::object::Shared _newWidget) { + inline int32_t subWidgetAddBack(std::shared_ptr _newWidget) { return subWidgetAdd(_newWidget); }; //! @previous - inline int32_t subWidgetAddEnd(ewol::object::Shared _newWidget) { + inline int32_t subWidgetAddEnd(std::shared_ptr _newWidget) { return subWidgetAdd(_newWidget); }; /** @@ -71,31 +73,32 @@ namespace ewol { * @param[in] _newWidget the element pointer * @return the ID of the set element */ - virtual int32_t subWidgetAddStart(ewol::object::Shared _newWidget); + virtual int32_t subWidgetAddStart(std::shared_ptr _newWidget); //! @previous - inline int32_t subWidgetAddFront(ewol::object::Shared _newWidget) { + inline int32_t subWidgetAddFront(std::shared_ptr _newWidget) { return subWidgetAddStart(_newWidget); }; /** * @brief remove definitly a widget from the system and this layer. * @param[in] _newWidget the element pointer. */ - virtual void subWidgetRemove(ewol::object::Shared _newWidget); + virtual void subWidgetRemove(std::shared_ptr _newWidget); /** * @brief Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...) * @param[in] _newWidget the element pointer. */ - virtual void subWidgetUnLink(ewol::object::Shared _newWidget); + virtual void subWidgetUnLink(std::shared_ptr _newWidget); public:// Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); - virtual ewol::object::Shared getWidgetNamed(const std::string& _widgetName); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetNamed(const std::string& _widgetName); virtual bool loadXML(exml::Element* _node); virtual void setOffset(const vec2& _newVal); + virtual void requestDestroyFromChild(const std::shared_ptr& _child); }; }; }; diff --git a/sources/ewol/widget/ContextMenu.cpp b/sources/ewol/widget/ContextMenu.cpp index 0590f566..68771f58 100644 --- a/sources/ewol/widget/ContextMenu.cpp +++ b/sources/ewol/widget/ContextMenu.cpp @@ -21,18 +21,7 @@ const char* const ewol::widget::ContextMenu::configArrowPosition = "arrow-positi const char* const ewol::widget::ContextMenu::configArrowMode = "arrow-mode"; const char* const ewol::widget::ContextMenu::configShaper = "shaper"; -static ewol::Widget* create() { - return new ewol::widget::ContextMenu(); -} - -void ewol::widget::ContextMenu::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__, &create); -} - - - -ewol::widget::ContextMenu::ContextMenu(const std::string& _shaperName) : - m_shaper(_shaperName) { +ewol::widget::ContextMenu::ContextMenu() { addObjectType("ewol::widget::ContextMenu"); // add basic configurations : registerConfig(configArrowPosition, "vec2", nullptr, "position of the arrow"); @@ -53,6 +42,11 @@ ewol::widget::ContextMenu::ContextMenu(const std::string& _shaperName) : setMouseLimit(1); } +void ewol::widget::ContextMenu::init(const std::string& _shaperName) { + ewol::widget::Container::init(); + m_shaper.setSource(_shaperName); +} + ewol::widget::ContextMenu::~ContextMenu() { } @@ -241,12 +235,12 @@ void ewol::widget::ContextMenu::setPositionMark(enum markPosition _position, vec markToRedraw(); } -ewol::object::Shared ewol::widget::ContextMenu::getWidgetAtPos(const vec2& _pos) { - ewol::object::Shared val = ewol::widget::Container::getWidgetAtPos(_pos); +std::shared_ptr ewol::widget::ContextMenu::getWidgetAtPos(const vec2& _pos) { + std::shared_ptr val = ewol::widget::Container::getWidgetAtPos(_pos); if (nullptr != val) { return val; } - return this; + return std::dynamic_pointer_cast(shared_from_this()); } diff --git a/sources/ewol/widget/ContextMenu.h b/sources/ewol/widget/ContextMenu.h index 9aea8ab0..30b5163b 100644 --- a/sources/ewol/widget/ContextMenu.h +++ b/sources/ewol/widget/ContextMenu.h @@ -32,13 +32,15 @@ namespace ewol { markNone }; public: - static void init(ewol::widget::Manager& _widgetManager); // Config list of properties static const char* const configArrowPosition; static const char* const configArrowMode; static const char* const configShaper; public: - ContextMenu(const std::string& _shaperName="THEME:GUI:ContextMenu.json"); + ContextMenu(); + void init(const std::string& _shaperName="THEME:GUI:ContextMenu.json"); + public: + DECLARE_WIDGET_FACTORY(ContextMenu, "ContextMenu"); virtual ~ContextMenu(); private: ewol::compositing::Shaper m_shaper; //!< Compositing theme. @@ -69,7 +71,7 @@ namespace ewol { virtual bool onEventInput(const ewol::event::Input& _event); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); }; }; }; diff --git a/sources/ewol/widget/Entry.cpp b/sources/ewol/widget/Entry.cpp index bfe03e34..f76aeca5 100644 --- a/sources/ewol/widget/Entry.cpp +++ b/sources/ewol/widget/Entry.cpp @@ -29,14 +29,6 @@ const char * const ewolEventEntrySelect = "ewol-widget-entry-event-internal-sele #define STATUS_HOVER (1) #define STATUS_SELECTED (2) -static ewol::Widget* create() { - return new ewol::widget::Entry(); -} - -void ewol::widget::Entry::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - const char * const ewol::widget::Entry::eventClick = "click"; const char * const ewol::widget::Entry::eventEnter = "enter"; const char * const ewol::widget::Entry::eventModify = "modify"; @@ -46,7 +38,7 @@ const char* const ewol::widget::Entry::configRegExp = "regExp"; const char* const ewol::widget::Entry::configEmptyMessage = "emptytext"; const char* const ewol::widget::Entry::configValue = "value"; -ewol::widget::Entry::Entry(std::string _newData) : +ewol::widget::Entry::Entry() : m_shaper("THEME:GUI:Entry.json"), m_data(""), m_maxCharacter(0x7FFFFFFF), @@ -78,11 +70,16 @@ ewol::widget::Entry::Entry(std::string _newData) : registerConfig(configEmptyMessage, "string", nullptr, "Text that is displayed when the Entry is empty (decorated text)"); registerConfig(configValue, "string", nullptr, "Value display in the entry (decorated text)"); - setValue(_newData); markToRedraw(); } +void ewol::widget::Entry::init(const std::string& _newData) { + ewol::Widget::init(); + setValue(_newData); +} + + ewol::widget::Entry::~Entry() { } diff --git a/sources/ewol/widget/Entry.h b/sources/ewol/widget/Entry.h index a73c2501..d4f90b4b 100644 --- a/sources/ewol/widget/Entry.h +++ b/sources/ewol/widget/Entry.h @@ -42,8 +42,6 @@ namespace ewol { static const char* const configRegExp; static const char* const configEmptyMessage; static const char* const configValue; - public: - static void init(ewol::widget::Manager& _widgetManager); private: ewol::compositing::Shaper m_shaper; int32_t m_colorIdTextFg; //!< color property of the text foreground @@ -56,7 +54,10 @@ namespace ewol { * @brief Contuctor * @param[in] _newData The USting that might be set in the Entry box (no event generation!!) */ - Entry(std::string _newData = ""); + Entry(); + void init(const std::string& _newData = ""); + public: + DECLARE_WIDGET_FACTORY(Entry, "Entry"); /** * @brief Destuctor */ diff --git a/sources/ewol/widget/Gird.cpp b/sources/ewol/widget/Gird.cpp index a1b0c566..dbcc4d58 100644 --- a/sources/ewol/widget/Gird.cpp +++ b/sources/ewol/widget/Gird.cpp @@ -14,25 +14,19 @@ #undef __class__ #define __class__ "Gird" - -static ewol::Widget* create() { - return new ewol::widget::Gird(); -} - -void ewol::widget::Gird::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - - -ewol::widget::Gird::Gird(int32_t _colNumber) : +ewol::widget::Gird::Gird() : m_sizeRow(0), m_tmpWidget(nullptr), m_gavityButtom(true), m_borderSize(0,0) { addObjectType("ewol::widget::Gird"); - setColNumber(_colNumber); requestUpdateSize(); } +void ewol::widget::Gird::init(int32_t _colNumber) { + ewol::Widget::init(); + setColNumber(_colNumber); +} + ewol::widget::Gird::~Gird() { EWOL_DEBUG("[" << getId() << "]={" << getObjectType() << "} Gird : destroy"); @@ -216,7 +210,7 @@ void ewol::widget::Gird::subWidgetRemoveAll() { } -void ewol::widget::Gird::subWidgetAdd(int32_t _colId, int32_t _rowId, ewol::object::Shared _newWidget) { +void ewol::widget::Gird::subWidgetAdd(int32_t _colId, int32_t _rowId, std::shared_ptr _newWidget) { if (nullptr == _newWidget) { return; } @@ -258,7 +252,7 @@ void ewol::widget::Gird::subWidgetAdd(int32_t _colId, int32_t _rowId, ewol::obje m_subWidget.push_back(prop); } -void ewol::widget::Gird::subWidgetRemove(ewol::object::Shared _newWidget) { +void ewol::widget::Gird::subWidgetRemove(std::shared_ptr _newWidget) { for (size_t iii=0; iii _newWidget) { +void ewol::widget::Gird::subWidgetUnLink(std::shared_ptr _newWidget) { if (nullptr == _newWidget) { return; } @@ -330,7 +324,7 @@ void ewol::widget::Gird::onRegenerateDisplay() { } } -ewol::object::Shared ewol::widget::Gird::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::Gird::getWidgetAtPos(const vec2& _pos) { if (true == isHide()) { return nullptr; } @@ -342,7 +336,7 @@ ewol::object::Shared ewol::widget::Gird::getWidgetAtPos(const vec2 if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = m_subWidget[iii].widget->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = m_subWidget[iii].widget->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } @@ -354,7 +348,7 @@ ewol::object::Shared ewol::widget::Gird::getWidgetAtPos(const vec2 return nullptr; } -void ewol::widget::Gird::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::Gird::onObjectRemove(const std::shared_ptr& _removeObject) { // First step call parrent : ewol::Widget::onObjectRemove(_removeObject); // second step find if in all the elements ... diff --git a/sources/ewol/widget/Gird.h b/sources/ewol/widget/Gird.h index 0133b0f4..816eb395 100644 --- a/sources/ewol/widget/Gird.h +++ b/sources/ewol/widget/Gird.h @@ -21,12 +21,10 @@ namespace ewol { * @ingroup ewolWidgetGroup */ class Gird :public ewol::Widget { - public: - static void init(ewol::widget::Manager& _widgetManager); private: class GirdProperties { public: - ewol::object::Shared widget; + std::shared_ptr widget; int32_t row; int32_t col; }; @@ -34,13 +32,16 @@ namespace ewol { int32_t m_uniformSizeRow; std::vector m_sizeCol; //!< size of all colomn (if set (otherwise 0)) std::vector m_subWidget; //!< all sub widget are contained in this element - ewol::object::Shared m_tmpWidget; //!< use when replace a widget ... + std::shared_ptr m_tmpWidget; //!< use when replace a widget ... bool m_gavityButtom; - public: + protected: /** * @brief Constructor */ - Gird(int32_t _colNumber=1); + Gird(); + void init(int32_t _colNumber=1); + public: + DECLARE_WIDGET_FACTORY(Gird, "Gird"); /** * @brief Desstructor */ @@ -97,12 +98,12 @@ namespace ewol { * @param[in] _rowId Id of the row [0..y]. * @param[in] _newWidget the element pointer */ - virtual void subWidgetAdd(int32_t _colId, int32_t _rowId, ewol::object::Shared _newWidget); + virtual void subWidgetAdd(int32_t _colId, int32_t _rowId, std::shared_ptr _newWidget); /** * @brief remove definitly a widget from the system and this Gird. * @param[in] _newWidget the element pointer. */ - virtual void subWidgetRemove(ewol::object::Shared _newWidget); + virtual void subWidgetRemove(std::shared_ptr _newWidget); /** * @brief remove definitly a widget from the system and this Gird. * @param[in] _colId Id of the colomn [0..x]. @@ -113,7 +114,7 @@ namespace ewol { * @brief Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...). * @param[in] _newWidget the element pointer. */ - virtual void subWidgetUnLink(ewol::object::Shared _newWidget); + virtual void subWidgetUnLink(std::shared_ptr _newWidget); /** * @brief Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...). * @param[in] _colId Id of the colomn [0..x]. @@ -138,8 +139,8 @@ namespace ewol { public: // Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual ewol::object::Shared getWidgetAtPos(const vec2& pos); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual std::shared_ptr getWidgetAtPos(const vec2& pos); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); }; diff --git a/sources/ewol/widget/Image.cpp b/sources/ewol/widget/Image.cpp index 20e6422d..c3afc584 100644 --- a/sources/ewol/widget/Image.cpp +++ b/sources/ewol/widget/Image.cpp @@ -16,15 +16,6 @@ #undef __class__ #define __class__ "Image" -static ewol::Widget* create() { - return new ewol::widget::Image(); -} - -void ewol::widget::Image::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - - const char * const ewol::widget::Image::eventPressed = "pressed"; const char * const ewol::widget::Image::configRatio = "ratio"; @@ -35,7 +26,7 @@ const char * const ewol::widget::Image::configDistanceField = "distance-field"; const char * const ewol::widget::Image::configPartStart = "part-start"; const char * const ewol::widget::Image::configPartStop = "part-stop"; -ewol::widget::Image::Image(const std::string& _file, const ewol::Dimension& _border) : +ewol::widget::Image::Image() : m_colorProperty(nullptr), m_colorId(-1), m_imageSize(vec2(0.0f,0.0f)), @@ -51,13 +42,18 @@ ewol::widget::Image::Image(const std::string& _file, const ewol::Dimension& _bor registerConfig(configDistanceField, "bool", "Distance field mode"); registerConfig(configPartStart, "vec2", nullptr, "Start display position in the image [0.0 .. 1.0]"); registerConfig(configPartStop, "vec2", nullptr, "Stop display position in the image [0.0 .. 1.0]"); - m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Image.json"); + m_colorProperty = ewol::resource::ColorFile::create("THEME:COLOR:Image.json"); if (m_colorProperty != nullptr) { m_colorId = m_colorProperty->request("foreground"); } +} + +void ewol::widget::Image::init(const std::string& _file, const ewol::Dimension& _border) { + ewol::Widget::init(); set(_file, _border); } + ewol::widget::Image::~Image() { } diff --git a/sources/ewol/widget/Image.h b/sources/ewol/widget/Image.h index 7e879bb1..b183f771 100644 --- a/sources/ewol/widget/Image.h +++ b/sources/ewol/widget/Image.h @@ -34,21 +34,19 @@ namespace ewol { static const char * const configDistanceField; static const char * const configPartStart; static const char * const configPartStop; - public: - /** - * @brief Main call of recording the widget on the List of "widget named creator" - */ - static void init(ewol::widget::Manager& _widgetManager); protected: ewol::compositing::Image m_compositing; //!< compositing element of the image. - ewol::object::Shared m_colorProperty; //!< theme color property + std::shared_ptr m_colorProperty; //!< theme color property int32_t m_colorId; //!< Color of the image. public: /** * @brief */ - Image(const std::string& _file="", - const ewol::Dimension& _border=ewol::Dimension(vec2(0,0),ewol::Dimension::Millimeter)); + Image(); + void init(const std::string& _file="", + const ewol::Dimension& _border=ewol::Dimension(vec2(0,0),ewol::Dimension::Millimeter)); + public: + DECLARE_WIDGET_FACTORY(Image, "Image"); /** * @brief */ diff --git a/sources/ewol/widget/Joystick.cpp b/sources/ewol/widget/Joystick.cpp index 7b09d363..27a605ca 100644 --- a/sources/ewol/widget/Joystick.cpp +++ b/sources/ewol/widget/Joystick.cpp @@ -50,6 +50,10 @@ ewol::widget::Joystick::Joystick() { setCanHaveFocus(true); } +void ewol::widget::Joystick::init() { + ewol::Widget::init(); +} + ewol::widget::Joystick::~Joystick() { diff --git a/sources/ewol/widget/Joystick.h b/sources/ewol/widget/Joystick.h index 7d983f54..050795cb 100644 --- a/sources/ewol/widget/Joystick.h +++ b/sources/ewol/widget/Joystick.h @@ -45,8 +45,11 @@ namespace ewol { std::string m_background; std::string m_foreground; float m_ratio; - public: + protected: Joystick(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Joystick, "Joystick"); virtual ~Joystick(); public: void setLockMode(bool _lockWhenOut) { diff --git a/sources/ewol/widget/Label.cpp b/sources/ewol/widget/Label.cpp index 57586a1e..ad53a53e 100644 --- a/sources/ewol/widget/Label.cpp +++ b/sources/ewol/widget/Label.cpp @@ -18,31 +18,28 @@ const char * const ewol::widget::Label::eventPressed = "pressed"; const char* const ewol::widget::Label::configValue = "value"; -static ewol::Widget* create() { - return new ewol::widget::Label(); -} - -void ewol::widget::Label::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} // TODO : Remove the label name in the constructor ... -ewol::widget::Label::Label(std::string _newLabel) : +ewol::widget::Label::Label() : m_colorProperty(nullptr), m_colorDefaultFgText(-1), m_colorDefaultBgText(-1){ addObjectType("ewol::widget::Label"); - m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Label.json"); + m_colorProperty = ewol::resource::ColorFile::create("THEME:COLOR:Label.json"); if (m_colorProperty != nullptr) { m_colorDefaultFgText = m_colorProperty->request("foreground"); m_colorDefaultBgText = m_colorProperty->request("background"); } - m_label = std::to_u32string(_newLabel); addEventId(eventPressed); setCanHaveFocus(false); setMouseLimit(1); registerConfig(configValue, "string", nullptr, "displayed value string"); // TODO : do not store in attibute... } +void ewol::widget::Label::init(std::string _newLabel) { + ewol::Widget::init(); + m_label = std::to_u32string(_newLabel); +} + ewol::widget::Label::~Label() { } diff --git a/sources/ewol/widget/Label.h b/sources/ewol/widget/Label.h index e3129170..55b267b4 100644 --- a/sources/ewol/widget/Label.h +++ b/sources/ewol/widget/Label.h @@ -27,22 +27,21 @@ namespace ewol { static const char * const eventPressed; // Config list of properties static const char* const configValue; - /** - * @brief Main call of recording the widget on the List of "widget named creator" - */ - static void init(ewol::widget::Manager& _widgetManager); private: ewol::compositing::Text m_text; //!< Compositing text element. std::u32string m_label; //!< decorated text to display. - ewol::object::Shared m_colorProperty; //!< theme color property + std::shared_ptr m_colorProperty; //!< theme color property int32_t m_colorDefaultFgText; //!< Default color of the text int32_t m_colorDefaultBgText; //!< Default Background color of the text - public: + protected: /** * @brief Constructor * @param[in] _newLabel The displayed decorated text. */ - Label(std::string _newLabel="---"); + Label(); + void init(std::string _newLabel="---"); + public: + DECLARE_WIDGET_FACTORY(Label, "Label"); /** * @brief destructor */ diff --git a/sources/ewol/widget/Layer.cpp b/sources/ewol/widget/Layer.cpp index eaedf31c..c65fc5c0 100644 --- a/sources/ewol/widget/Layer.cpp +++ b/sources/ewol/widget/Layer.cpp @@ -13,23 +13,19 @@ #undef __class__ #define __class__ "Layer" -static ewol::Widget* create() { - return new ewol::widget::Layer(); -} - -void ewol::widget::Layer::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - ewol::widget::Layer::Layer() { addObjectType("ewol::widget::Layer"); } +void ewol::widget::Layer::init() { + ewol::widget::ContainerN::init(); +} + ewol::widget::Layer::~Layer() { EWOL_DEBUG("[" << getId() << "] Layer : destroy"); } -ewol::object::Shared ewol::widget::Layer::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::Layer::getWidgetAtPos(const vec2& _pos) { if (true == isHide()) { return nullptr; } @@ -43,7 +39,7 @@ ewol::object::Shared ewol::widget::Layer::getWidgetAtPos(const vec if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = it->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = it->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } diff --git a/sources/ewol/widget/Layer.h b/sources/ewol/widget/Layer.h index dc3a4cd8..c6c5f997 100644 --- a/sources/ewol/widget/Layer.h +++ b/sources/ewol/widget/Layer.h @@ -20,22 +20,20 @@ namespace ewol { * @ingroup ewolWidgetGroup */ class Layer : public ewol::widget::ContainerN { - public: - /** - * @brief Main call of recording the widget on the List of "widget named creator" - */ - static void init(ewol::widget::Manager& _widgetManager); - public: + protected: /** * @brief Constructor */ Layer(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Layer, "Layer"); /** * @brief Desstructor */ virtual ~Layer(); public: // Derived function - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); }; }; }; diff --git a/sources/ewol/widget/List.cpp b/sources/ewol/widget/List.cpp index d64ba676..48e9a7c7 100644 --- a/sources/ewol/widget/List.cpp +++ b/sources/ewol/widget/List.cpp @@ -28,6 +28,10 @@ ewol::widget::List::List() { setCanHaveFocus(true); } +void ewol::widget::List::init() { + ewol::widget::WidgetScrolled::init(); +} + ewol::widget::List::~List() { //clean all the object for (size_t iii=0; iiiManager::focusKeep(this); + //std::shared_ptrManager::focusKeep(this); } return isUsed; } diff --git a/sources/ewol/widget/List.h b/sources/ewol/widget/List.h index 88543742..865d1fc1 100644 --- a/sources/ewol/widget/List.h +++ b/sources/ewol/widget/List.h @@ -21,8 +21,10 @@ namespace ewol { * @ingroup ewolWidgetGroup */ class List : public ewol::widget::WidgetScrolled { - public: + protected: List(); + void init(); + public: virtual ~List(); virtual void calculateMinMaxSize(); void setLabel(std::string _newLabel); diff --git a/sources/ewol/widget/ListFileSystem.cpp b/sources/ewol/widget/ListFileSystem.cpp index ef4e8196..df51ad61 100644 --- a/sources/ewol/widget/ListFileSystem.cpp +++ b/sources/ewol/widget/ListFileSystem.cpp @@ -15,14 +15,6 @@ #undef __class__ #define __class__ "ListFileSystem" -static ewol::Widget* create() { - return new ewol::widget::ListFileSystem(); -} - -void ewol::widget::ListFileSystem::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__, &create); -} - const char * const ewol::widget::ListFileSystem::eventFileSelect = "file-select"; const char * const ewol::widget::ListFileSystem::eventFileValidate = "file-validate"; const char * const ewol::widget::ListFileSystem::eventFolderSelect = "folder-select"; @@ -46,7 +38,7 @@ ewol::widget::ListFileSystem::ListFileSystem() : #if defined(__TARGET_OS__Windows) m_folder = "c:/"; #endif - m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:ListFileSystem.json"); + m_colorProperty = ewol::resource::ColorFile::create("THEME:COLOR:ListFileSystem.json"); if (m_colorProperty != nullptr) { m_colorIdText = m_colorProperty->request("text"); m_colorIdBackground1 = m_colorProperty->request("background1"); @@ -68,6 +60,11 @@ ewol::widget::ListFileSystem::ListFileSystem() : setMouseLimit(1); }; +void ewol::widget::ListFileSystem::init() { + ewol::widget::List::init(); +}; + + ewol::widget::ListFileSystem::~ListFileSystem() { clearList(); }; diff --git a/sources/ewol/widget/ListFileSystem.h b/sources/ewol/widget/ListFileSystem.h index 109a4170..b0163d7f 100644 --- a/sources/ewol/widget/ListFileSystem.h +++ b/sources/ewol/widget/ListFileSystem.h @@ -20,8 +20,6 @@ namespace ewol { */ class ListFileSystem : public ewol::widget::List { public: - //! @not-in-doc - static void init(ewol::widget::Manager& _widgetManager); // Event list of properties static const char * const eventFileSelect; //!< @event "file-select" Generated when a file is selected. static const char * const eventFileValidate; //!< @event "file-validate" Generate when the user validate (return) or double click on the element @@ -35,11 +33,14 @@ namespace ewol { static const char* const configPath; static const char* const configSelect; // TODO : Add a standalone configuration .. - public: + protected: ListFileSystem(); + void init(); + public: + DECLARE_WIDGET_FACTORY(ListFileSystem, "ListFileSystem"); virtual ~ListFileSystem(); protected: - ewol::object::Shared m_colorProperty; //!< theme color property. + std::shared_ptr m_colorProperty; //!< theme color property. int32_t m_colorIdText; //!< Color of the text. int32_t m_colorIdBackground1; //!< Color of the Background. int32_t m_colorIdBackground2; //!< Color of the Background 2. diff --git a/sources/ewol/widget/Manager.cpp b/sources/ewol/widget/Manager.cpp index dfab31fc..c2a81ccb 100644 --- a/sources/ewol/widget/Manager.cpp +++ b/sources/ewol/widget/Manager.cpp @@ -44,24 +44,24 @@ ewol::widget::Manager::Manager() : m_applWakeUpTime = ewol::getTime(); m_lastPeriodicCallTime = ewol::getTime(); - ewol::widget::Button::init(*this); - ewol::widget::ButtonColor::init(*this); - ewol::widget::Spacer::init(*this); - ewol::widget::Slider::init(*this); - ewol::widget::Sizer::init(*this); - ewol::widget::ProgressBar::init(*this); - ewol::widget::Layer::init(*this); - ewol::widget::Label::init(*this); - ewol::widget::Image::init(*this); - ewol::widget::Gird::init(*this); - ewol::widget::Entry::init(*this); - ewol::widget::CheckBox::init(*this); - ewol::widget::Scroll::init(*this); - ewol::widget::ContextMenu::init(*this); - ewol::widget::PopUp::init(*this); - ewol::widget::WSlider::init(*this); - ewol::widget::ListFileSystem::init(*this); - ewol::widget::Composer::init(*this); + ewol::widget::Button::createManagerWidget(*this); + ewol::widget::ButtonColor::createManagerWidget(*this); + ewol::widget::Spacer::createManagerWidget(*this); + ewol::widget::Slider::createManagerWidget(*this); + ewol::widget::Sizer::createManagerWidget(*this); + ewol::widget::ProgressBar::createManagerWidget(*this); + ewol::widget::Layer::createManagerWidget(*this); + ewol::widget::Label::createManagerWidget(*this); + ewol::widget::Image::createManagerWidget(*this); + ewol::widget::Gird::createManagerWidget(*this); + ewol::widget::Entry::createManagerWidget(*this); + ewol::widget::CheckBox::createManagerWidget(*this); + ewol::widget::Scroll::createManagerWidget(*this); + ewol::widget::ContextMenu::createManagerWidget(*this); + ewol::widget::PopUp::createManagerWidget(*this); + ewol::widget::WSlider::createManagerWidget(*this); + ewol::widget::ListFileSystem::createManagerWidget(*this); + ewol::widget::Composer::createManagerWidget(*this); } ewol::widget::Manager::~Manager() { @@ -78,7 +78,7 @@ ewol::widget::Manager::~Manager() { * focus Area : * *************************************************************************/ -void ewol::widget::Manager::focusKeep(const ewol::object::Shared& _newWidget) { +void ewol::widget::Manager::focusKeep(const std::shared_ptr& _newWidget) { if (_newWidget == nullptr) { // nothing to do ... return; @@ -105,7 +105,7 @@ void ewol::widget::Manager::focusKeep(const ewol::object::Shared& } } -void ewol::widget::Manager::focusSetDefault(const ewol::object::Shared& _newWidget) { +void ewol::widget::Manager::focusSetDefault(const std::shared_ptr& _newWidget) { if( _newWidget != nullptr && _newWidget->canHaveFocus() == false) { EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() ); @@ -142,11 +142,11 @@ void ewol::widget::Manager::focusRelease() { } -const ewol::object::Shared& ewol::widget::Manager::focusGet() { +const std::shared_ptr& ewol::widget::Manager::focusGet() { return m_focusWidgetCurrent; } -void ewol::widget::Manager::focusRemoveIfRemove(const ewol::object::Shared& _newWidget) { +void ewol::widget::Manager::focusRemoveIfRemove(const std::shared_ptr& _newWidget) { if (m_focusWidgetCurrent == _newWidget) { EWOL_WARNING("Release focus when remove widget"); focusRelease(); @@ -157,7 +157,7 @@ void ewol::widget::Manager::focusRemoveIfRemove(const ewol::object::Shared& _pWidget) { +void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr& _pWidget) { if (_pWidget == nullptr) { return; } @@ -177,7 +177,7 @@ void ewol::widget::Manager::periodicCallAdd(const ewol::object::Shared& _pWidget) { +void ewol::widget::Manager::periodicCallRm(const std::shared_ptr& _pWidget) { for (auto &it : m_listOfPeriodicWidget) { if (it == _pWidget) { it.reset(); @@ -271,12 +271,12 @@ void ewol::widget::Manager::addWidgetCreator(const std::string& _name, m_creatorList.add(nameLower, _pointer); } -ewol::object::Shared ewol::widget::Manager::create(const std::string& _name) { +std::shared_ptr ewol::widget::Manager::create(const std::string& _name) { std::string nameLower = std::tolower(_name); if (m_creatorList.exist(nameLower) == true) { ewol::widget::Manager::creator_tf pointerFunction = m_creatorList[nameLower]; if (pointerFunction != nullptr) { - return ewol::object::makeShared(pointerFunction()); + return pointerFunction(); } } EWOL_WARNING("try to create an UnExistant widget : " << nameLower); @@ -297,7 +297,7 @@ std::string ewol::widget::Manager::list() { return tmpVal; } -void ewol::widget::Manager::onObjectRemove(const ewol::object::Shared& _object) { +void ewol::widget::Manager::onObjectRemove(const std::shared_ptr& _object) { if (m_focusWidgetDefault == _object) { EWOL_VERBOSE("Remove object ==> rm default focus !!!"); m_focusWidgetDefault.reset(); diff --git a/sources/ewol/widget/Manager.h b/sources/ewol/widget/Manager.h index 4319cbe0..5cb993af 100644 --- a/sources/ewol/widget/Manager.h +++ b/sources/ewol/widget/Manager.h @@ -20,12 +20,12 @@ namespace ewol { namespace widget { class Manager { public: - typedef ewol::Widget* (*creator_tf)(); + typedef std::shared_ptr (*creator_tf)(); private: // For the focus Management - ewol::object::Shared m_focusWidgetDefault; - ewol::object::Shared m_focusWidgetCurrent; - std::vector> m_listOfPeriodicWidget; + std::shared_ptr m_focusWidgetDefault; + std::shared_ptr m_focusWidgetCurrent; + std::vector> m_listOfPeriodicWidget; bool m_havePeriodic; bool m_haveRedraw; etk::Hash m_creatorList; @@ -35,14 +35,14 @@ namespace ewol { Manager(); virtual ~Manager(); - void focusKeep(const ewol::object::Shared& _newWidget); // set the focus at the specific widget - void focusSetDefault(const ewol::object::Shared& _newWidget); // select the default focus getter + void focusKeep(const std::shared_ptr& _newWidget); // set the focus at the specific widget + void focusSetDefault(const std::shared_ptr& _newWidget); // select the default focus getter void focusRelease(); // release focus from the current widget to the default - const ewol::object::Shared& focusGet(); - void focusRemoveIfRemove(const ewol::object::Shared& _newWidget); + const std::shared_ptr& focusGet(); + void focusRemoveIfRemove(const std::shared_ptr& _newWidget); - void periodicCallAdd(const ewol::object::Shared& _pWidget); - void periodicCallRm(const ewol::object::Shared& _pWidget); + void periodicCallAdd(const std::shared_ptr& _pWidget); + void periodicCallRm(const std::shared_ptr& _pWidget); void periodicCall(int64_t _localTime); void periodicCallResume(int64_t _localTime); bool periodicCallHave(); @@ -52,10 +52,10 @@ namespace ewol { // element that generate the list of elements void addWidgetCreator(const std::string& _name, creator_tf _pointer); - ewol::object::Shared create(const std::string& _name); + std::shared_ptr create(const std::string& _name); bool exist(const std::string& _name); std::string list(); - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object); private: void periodicCallUpdateCount(); }; diff --git a/sources/ewol/widget/Menu.cpp b/sources/ewol/widget/Menu.cpp index 2b1f0c6e..26f70b96 100644 --- a/sources/ewol/widget/Menu.cpp +++ b/sources/ewol/widget/Menu.cpp @@ -23,6 +23,10 @@ ewol::widget::Menu::Menu() { m_staticId = 0; } +void ewol::widget::Menu::init() { + ewol::widget::Sizer::init(); +} + ewol::widget::Menu::~Menu() { clear(); } @@ -32,16 +36,16 @@ void ewol::widget::Menu::subWidgetRemoveAll() { ewol::widget::Sizer::subWidgetRemoveAll(); } -int32_t ewol::widget::Menu::subWidgetAdd(ewol::object::Shared _newWidget) { +int32_t ewol::widget::Menu::subWidgetAdd(std::shared_ptr _newWidget) { EWOL_ERROR("Not availlable"); return -1; } -void ewol::widget::Menu::subWidgetRemove(ewol::object::Shared _newWidget) { +void ewol::widget::Menu::subWidgetRemove(std::shared_ptr _newWidget) { EWOL_ERROR("Not availlable"); } -void ewol::widget::Menu::subWidgetUnLink(ewol::object::Shared _newWidget) { +void ewol::widget::Menu::subWidgetUnLink(std::shared_ptr _newWidget) { EWOL_ERROR("Not availlable"); } @@ -81,7 +85,7 @@ int32_t ewol::widget::Menu::add(int32_t _parent, tmpObject->m_message = _message; m_listElement.push_back(tmpObject); if (-1 == tmpObject->m_parentId) { - ewol::object::Shared myButton = ewol::object::makeShared(new ewol::widget::Button()); + std::shared_ptr myButton = ewol::widget::Button::create(); if (myButton == nullptr) { EWOL_ERROR("Allocation button error"); return tmpObject->m_localId; @@ -95,15 +99,15 @@ int32_t ewol::widget::Menu::add(int32_t _parent, } composeString+=" \n"; composeString+="\n"; - myButton->setSubWidget(ewol::object::makeShared(new ewol::widget::Composer(widget::Composer::String, composeString))); + myButton->setSubWidget(ewol::widget::Composer::create(widget::Composer::String, composeString)); } else { - myButton->setSubWidget(ewol::object::makeShared(new ewol::widget::Label(tmpObject->m_label)) ); + myButton->setSubWidget(ewol::widget::Label::create(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); + myButton->registerOnEvent(shared_from_this(), ewol::widget::Button::eventPressed, widget::Button::eventPressed); tmpObject->m_widgetPointer = myButton; } return tmpObject->m_localId; @@ -131,8 +135,7 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { 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; + m_widgetContextMenu.reset(); } return; } else{ @@ -149,14 +152,14 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { return; } // create a context menu : - m_widgetContextMenu = ewol::object::makeShared(new ewol::widget::ContextMenu()); + m_widgetContextMenu = ewol::widget::ContextMenu::create(); if (nullptr == m_widgetContextMenu) { EWOL_ERROR("Allocation Error"); return; } // get the button widget : vec2 newPosition; - ewol::object::Shared eventFromWidget = dynamic_pointer_cast(_msg.getCaller()); + std::shared_ptr eventFromWidget = std::dynamic_pointer_cast(_msg.getCaller()); if (eventFromWidget != nullptr) { vec2 tmpOri = eventFromWidget->getOrigin(); vec2 tmpSize = eventFromWidget->getSize(); @@ -166,10 +169,10 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { } m_widgetContextMenu->setPositionMark(ewol::widget::ContextMenu::markTop, newPosition ); - ewol::object::Shared mySizer; - ewol::object::Shared myButton; + std::shared_ptr mySizer; + std::shared_ptr myButton; - mySizer = ewol::object::makeShared(new ewol::widget::Sizer(widget::Sizer::modeVert)); + mySizer = ewol::widget::Sizer::create(widget::Sizer::modeVert); if (nullptr != mySizer) { mySizer->lockExpand(vec2(true,true)); // set it in the pop-up-system : @@ -189,7 +192,7 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { 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 = ewol::object::makeShared(new ewol::widget::Button()); + myButton = ewol::widget::Button::create(); if (nullptr == myButton) { EWOL_ERROR("Allocation Error"); } else { @@ -205,19 +208,18 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { composeString+=" \n"; composeString+=" \n"; composeString+="\n"; - myButton->setSubWidget(ewol::object::makeShared(new ewol::widget::Composer(widget::Composer::String, composeString))); + myButton->setSubWidget(ewol::widget::Composer::create(widget::Composer::String, composeString)); } else { if (true == menuHaveImage) { - myButton->setSubWidget(ewol::object::makeShared( - new ewol::widget::Composer(widget::Composer::String, + myButton->setSubWidget(ewol::widget::Composer::create(widget::Composer::String, std::string("\n") + " \n" " \n" " \n" " \n" - "\n"))); + "\n")); } else { - ewol::object::Shared tmpLabel = ewol::object::makeShared(new widget::Label(std::string("") + m_listElement[jjj]->m_label + "\n")); + std::shared_ptr tmpLabel = widget::Label::create(std::string("") + m_listElement[jjj]->m_label + "\n"); if (tmpLabel != nullptr) { tmpLabel->setExpand(bvec2(true,false)); tmpLabel->setFill(bvec2(true,true)); @@ -226,7 +228,7 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { } } // set the image if one is present ... - myButton->registerOnEvent(this, ewol::widget::Button::eventPressed, widget::Button::eventPressed); + myButton->registerOnEvent(shared_from_this(), ewol::widget::Button::eventPressed, widget::Button::eventPressed); myButton->setExpand(bvec2(true,false)); myButton->setFill(bvec2(true,false)); // add it in the widget list @@ -237,11 +239,10 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { } } } - ewol::object::Shared currentWindows = getWindows(); + std::shared_ptr currentWindows = getWindows(); if (currentWindows == nullptr) { EWOL_ERROR("Can not get the curent Windows..."); - m_widgetContextMenu->removeObject(); - m_widgetContextMenu = nullptr; + m_widgetContextMenu.reset(); } else { currentWindows->popUpWidgetPush(m_widgetContextMenu); } @@ -253,7 +254,7 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { } -void ewol::widget::Menu::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::Menu::onObjectRemove(const std::shared_ptr& _removeObject) { ewol::widget::Sizer::onObjectRemove(_removeObject); if (m_widgetContextMenu == _removeObject) { m_widgetContextMenu.reset(); diff --git a/sources/ewol/widget/Menu.h b/sources/ewol/widget/Menu.h index ed799ec9..c7b2f390 100644 --- a/sources/ewol/widget/Menu.h +++ b/sources/ewol/widget/Menu.h @@ -23,7 +23,7 @@ namespace ewol { MenuElement() { }; int32_t m_localId; int32_t m_parentId; - ewol::object::Shared m_widgetPointer; + std::shared_ptr m_widgetPointer; std::string m_label; std::string m_image; const char* m_generateEvent; @@ -33,18 +33,21 @@ namespace ewol { * @ingroup ewolWidgetGroup */ class Menu :public ewol::widget::Sizer { - public: + protected: Menu(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Menu, "Menu"); virtual ~Menu(); private: virtual void subWidgetRemoveAll(); - virtual int32_t subWidgetAdd(ewol::object::Shared _newWidget); - virtual void subWidgetRemove(ewol::object::Shared _newWidget); - virtual void subWidgetUnLink(ewol::object::Shared _newWidget); + virtual int32_t subWidgetAdd(std::shared_ptr _newWidget); + virtual void subWidgetRemove(std::shared_ptr _newWidget); + virtual void subWidgetUnLink(std::shared_ptr _newWidget); private: std::vector m_listElement; int32_t m_staticId; // unique ID for every element of the menu ... - ewol::object::Shared m_widgetContextMenu; + std::shared_ptr m_widgetContextMenu; public: void clear(); int32_t addTitle(std::string _label, std::string _image="", const char * _generateEvent = nullptr, const std::string _message = ""); @@ -52,7 +55,7 @@ namespace ewol { void addSpacer(); // Derived function virtual void onReceiveMessage(const ewol::object::Message& _msg); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); }; }; }; diff --git a/sources/ewol/widget/PopUp.cpp b/sources/ewol/widget/PopUp.cpp index c99e1f88..e5b3b38f 100644 --- a/sources/ewol/widget/PopUp.cpp +++ b/sources/ewol/widget/PopUp.cpp @@ -22,16 +22,7 @@ const char* const ewol::widget::PopUp::configLockExpand="lock"; static const char* annimationIncrease = "increase"; -static ewol::Widget* create() { - return new ewol::widget::PopUp(); -} - -void ewol::widget::PopUp::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - -ewol::widget::PopUp::PopUp(const std::string& _shaperName) : - m_shaper(_shaperName), +ewol::widget::PopUp::PopUp() : m_lockExpand(true,true), m_closeOutEvent(false) { addObjectType("ewol::widget::PopUp"); @@ -46,6 +37,10 @@ ewol::widget::PopUp::PopUp(const std::string& _shaperName) : addAnnimationType(ewol::Widget::annimationModeEnableAdd, annimationIncrease); } +void ewol::widget::PopUp::init(const std::string& _shaperName) { + ewol::widget::Container::init(); + m_shaper.setSource(_shaperName); +} ewol::widget::PopUp::~PopUp() { } @@ -147,12 +142,12 @@ void ewol::widget::PopUp::onRegenerateDisplay() { } } -ewol::object::Shared ewol::widget::PopUp::getWidgetAtPos(const vec2& _pos) { - ewol::object::Shared val = ewol::widget::Container::getWidgetAtPos(_pos); +std::shared_ptr ewol::widget::PopUp::getWidgetAtPos(const vec2& _pos) { + std::shared_ptr val = ewol::widget::Container::getWidgetAtPos(_pos); if (nullptr != val) { return val; } - return this; + return std::dynamic_pointer_cast(shared_from_this()); } bool ewol::widget::PopUp::onSetConfig(const ewol::object::Config& _conf) { diff --git a/sources/ewol/widget/PopUp.h b/sources/ewol/widget/PopUp.h index f104137b..1d304d66 100644 --- a/sources/ewol/widget/PopUp.h +++ b/sources/ewol/widget/PopUp.h @@ -24,7 +24,6 @@ namespace ewol { */ class PopUp : public ewol::widget::Container { public: - static void init(ewol::widget::Manager& _widgetManager); // Config list of properties static const char* const configShaper; static const char* const configRemoveOnExternClick; @@ -32,12 +31,15 @@ namespace ewol { static const char* const configLockExpand; protected: ewol::compositing::Shaper m_shaper; //!< Compositing theme. - public: + protected: /** * @brief Constructor * @param[in] _shaperName Shaper file properties */ - PopUp(const std::string& _shaperName="THEME:GUI:PopUp.json"); + PopUp(); + void init(const std::string& _shaperName="THEME:GUI:PopUp.json"); + public: + DECLARE_WIDGET_FACTORY(PopUp, "PopUp"); /** * @brief Destructor */ @@ -82,7 +84,7 @@ namespace ewol { virtual void onRegenerateDisplay(); virtual void calculateSize(const vec2& _available); virtual bool onEventInput(const ewol::event::Input& _event); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); protected: virtual bool onStartAnnimation(enum ewol::Widget::annimationMode _mode); virtual void onStopAnnimation(); diff --git a/sources/ewol/widget/ProgressBar.cpp b/sources/ewol/widget/ProgressBar.cpp index c835ac02..e3be971e 100644 --- a/sources/ewol/widget/ProgressBar.cpp +++ b/sources/ewol/widget/ProgressBar.cpp @@ -14,14 +14,6 @@ #undef __class__ #define __class__ "ProgressBar" -static ewol::Widget* create() { - return new ewol::widget::ProgressBar(); -} - -void ewol::widget::ProgressBar::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - const char* const ewol::widget::ProgressBar::configColorBg = "color-bg"; const char* const ewol::widget::ProgressBar::configColorFgOn = "color-on"; const char* const ewol::widget::ProgressBar::configColorFgOff = "color-off"; @@ -47,6 +39,10 @@ ewol::widget::ProgressBar::ProgressBar() { } +void ewol::widget::ProgressBar::init() { + ewol::Widget::init(); +} + ewol::widget::ProgressBar::~ProgressBar() { } diff --git a/sources/ewol/widget/ProgressBar.h b/sources/ewol/widget/ProgressBar.h index ef894bde..8432e8ac 100644 --- a/sources/ewol/widget/ProgressBar.h +++ b/sources/ewol/widget/ProgressBar.h @@ -31,8 +31,11 @@ namespace ewol { static const char* const configValue; private: ewol::compositing::Drawing m_draw; // basic drawing element - public: + protected: ProgressBar(); + void init(); + public: + DECLARE_WIDGET_FACTORY(ProgressBar, "ProgressBar"); virtual ~ProgressBar(); void setValue(float _val); float getValue() const { diff --git a/sources/ewol/widget/Scroll.cpp b/sources/ewol/widget/Scroll.cpp index f25a5489..2ec1cd74 100644 --- a/sources/ewol/widget/Scroll.cpp +++ b/sources/ewol/widget/Scroll.cpp @@ -14,19 +14,9 @@ #undef __class__ #define __class__ "Scroll" -static ewol::Widget* create() { - return new ewol::widget::Scroll(); -} - -void ewol::widget::Scroll::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - const char* const ewol::widget::Scroll::configLimit = "limit"; -ewol::widget::Scroll::Scroll(const std::string& _shaperName) : - m_shaperH(_shaperName), - m_shaperV(_shaperName), +ewol::widget::Scroll::Scroll() : m_limit(0.15,0.5), m_pixelScrolling(20), m_highSpeedStartPos(0,0), @@ -37,6 +27,13 @@ ewol::widget::Scroll::Scroll(const std::string& _shaperName) : registerConfig(configLimit, "vec2", nullptr, "Limit the scroll maximum position [0..1]% represent the free space in the scoll when arrive at the end"); } +void ewol::widget::Scroll::init(const std::string& _shaperName) { + ewol::widget::Container::init(); + m_shaperH.setSource(_shaperName); + m_shaperV.setSource(_shaperName); +} + + ewol::widget::Scroll::~Scroll() { } @@ -349,12 +346,12 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) { return false; } -ewol::object::Shared ewol::widget::Scroll::getWidgetAtPos(const vec2& _pos) { - ewol::object::Shared tmpWidget = ewol::widget::Container::getWidgetAtPos(_pos); +std::shared_ptr ewol::widget::Scroll::getWidgetAtPos(const vec2& _pos) { + std::shared_ptr tmpWidget = ewol::widget::Container::getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } - return this; + return std::dynamic_pointer_cast(shared_from_this());; } bool ewol::widget::Scroll::onSetConfig(const ewol::object::Config& _conf) { diff --git a/sources/ewol/widget/Scroll.h b/sources/ewol/widget/Scroll.h index bccd4389..722497f3 100644 --- a/sources/ewol/widget/Scroll.h +++ b/sources/ewol/widget/Scroll.h @@ -34,8 +34,6 @@ namespace ewol { public: // Cinfig parameter list: static const char* const configLimit; - public: - static void init(ewol::widget::Manager& _widgetManager); private: ewol::compositing::Shaper m_shaperH; //!< Compositing theme Horizontal. ewol::compositing::Shaper m_shaperV; //!< Compositing theme Vertical. @@ -47,8 +45,11 @@ namespace ewol { enum highSpeedMode m_highSpeedMode; int32_t m_highSpeedButton; enum ewol::key::type m_highSpeedType; + protected: + Scroll(); + void init(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json"); public: - Scroll(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json"); + DECLARE_WIDGET_FACTORY(Scroll, "Scroll"); virtual ~Scroll(); /** * @brief set the limit of scrolling @@ -67,7 +68,7 @@ namespace ewol { virtual void onRegenerateDisplay(); virtual bool onEventInput(const ewol::event::Input& _event); virtual void systemDraw(const ewol::DrawProperty& _displayProp); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); protected: // Derived function virtual void onDraw(); virtual bool onSetConfig(const ewol::object::Config& _conf); diff --git a/sources/ewol/widget/Sizer.cpp b/sources/ewol/widget/Sizer.cpp index 17f40092..1da0fb16 100644 --- a/sources/ewol/widget/Sizer.cpp +++ b/sources/ewol/widget/Sizer.cpp @@ -16,17 +16,8 @@ const char* const ewol::widget::Sizer::configMode = "mode"; #undef __class__ #define __class__ "Sizer" -static ewol::Widget* create() { - return new ewol::widget::Sizer(); -} - -void ewol::widget::Sizer::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - - -ewol::widget::Sizer::Sizer(enum displayMode _mode): - m_mode(_mode), +ewol::widget::Sizer::Sizer() : + m_mode(ewol::widget::Sizer::modeHori), m_borderSize(), m_animation(animationNone), m_animationTime(0) { @@ -36,6 +27,11 @@ ewol::widget::Sizer::Sizer(enum displayMode _mode): } +void ewol::widget::Sizer::init(enum displayMode _mode) { + ewol::widget::ContainerN::init(); + m_mode = _mode; +} + ewol::widget::Sizer::~Sizer() { // disable annimation to remore "remove" error m_animation = animationNone; @@ -164,7 +160,7 @@ void ewol::widget::Sizer::calculateMinMaxSize() { //EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} Result min size : " << m_minSize); } -int32_t ewol::widget::Sizer::subWidgetAdd(ewol::object::Shared _newWidget) { +int32_t ewol::widget::Sizer::subWidgetAdd(std::shared_ptr _newWidget) { if (m_animation == animationNone) { return ewol::widget::ContainerN::subWidgetAdd(_newWidget); } @@ -172,7 +168,7 @@ int32_t ewol::widget::Sizer::subWidgetAdd(ewol::object::Shared _ne return ewol::widget::ContainerN::subWidgetAdd(_newWidget); } -int32_t ewol::widget::Sizer::subWidgetAddStart(ewol::object::Shared _newWidget) { +int32_t ewol::widget::Sizer::subWidgetAddStart(std::shared_ptr _newWidget) { if (m_animation == animationNone) { return ewol::widget::ContainerN::subWidgetAddStart(_newWidget); } @@ -180,7 +176,7 @@ int32_t ewol::widget::Sizer::subWidgetAddStart(ewol::object::Shared _newWidget) { +void ewol::widget::Sizer::subWidgetRemove(std::shared_ptr _newWidget) { if (m_animation == animationNone) { ewol::widget::ContainerN::subWidgetRemove(_newWidget); return; @@ -189,7 +185,7 @@ void ewol::widget::Sizer::subWidgetRemove(ewol::object::Shared _ne ewol::widget::ContainerN::subWidgetRemove(_newWidget); } -void ewol::widget::Sizer::subWidgetUnLink(ewol::object::Shared _newWidget) { +void ewol::widget::Sizer::subWidgetUnLink(std::shared_ptr _newWidget) { if (m_animation == animationNone) { ewol::widget::ContainerN::subWidgetUnLink(_newWidget); return; diff --git a/sources/ewol/widget/Sizer.h b/sources/ewol/widget/Sizer.h index 567670b2..eaa597dd 100644 --- a/sources/ewol/widget/Sizer.h +++ b/sources/ewol/widget/Sizer.h @@ -35,12 +35,15 @@ namespace ewol { }; private: enum displayMode m_mode; //!< Methode to display the widget list (vert/hory ...) - public: + protected: /** * @brief Constructor * @param[in] _mode The mode to display the elements */ - Sizer(enum displayMode _mode=ewol::widget::Sizer::modeHori); + Sizer(); + void init(enum displayMode _mode=ewol::widget::Sizer::modeHori); + public: + DECLARE_WIDGET_FACTORY(Sizer, "Sizer"); /** * @brief Desstructor */ @@ -119,10 +122,10 @@ namespace ewol { virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); // overwrite the set fuction to start annimations ... - virtual int32_t subWidgetAdd(ewol::object::Shared _newWidget); - virtual int32_t subWidgetAddStart(ewol::object::Shared _newWidget); - virtual void subWidgetRemove(ewol::object::Shared _newWidget); - virtual void subWidgetUnLink(ewol::object::Shared _newWidget); + virtual int32_t subWidgetAdd(std::shared_ptr _newWidget); + virtual int32_t subWidgetAddStart(std::shared_ptr _newWidget); + virtual void subWidgetRemove(std::shared_ptr _newWidget); + virtual void subWidgetUnLink(std::shared_ptr _newWidget); virtual bool onSetConfig(const ewol::object::Config& _conf); virtual bool onGetConfig(const char* _config, std::string& _result) const; }; diff --git a/sources/ewol/widget/Slider.cpp b/sources/ewol/widget/Slider.cpp index 391413b3..f886cb7a 100644 --- a/sources/ewol/widget/Slider.cpp +++ b/sources/ewol/widget/Slider.cpp @@ -15,14 +15,6 @@ const char * const ewol::widget::Slider::eventChange = "change"; #undef __class__ #define __class__ "Slider" -static ewol::Widget* create() { - return new ewol::widget::Slider(); -} - -void ewol::widget::Slider::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - const int32_t dotRadius = 6; ewol::widget::Slider::Slider() { @@ -42,6 +34,10 @@ ewol::widget::Slider::Slider() { setMouseLimit(1); } +void ewol::widget::Slider::init() { + ewol::Widget::init(); +} + ewol::widget::Slider::~Slider() { } diff --git a/sources/ewol/widget/Slider.h b/sources/ewol/widget/Slider.h index efaf4716..5b28df24 100644 --- a/sources/ewol/widget/Slider.h +++ b/sources/ewol/widget/Slider.h @@ -24,10 +24,11 @@ namespace ewol { public: // Event list of properties static const char * const eventChange; - public: - static void init(ewol::widget::Manager& _widgetManager); - public: + protected: Slider(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Slider, "Slider"); virtual ~Slider(); void setValue(int32_t _val); int32_t getValue(); diff --git a/sources/ewol/widget/Spacer.cpp b/sources/ewol/widget/Spacer.cpp index 323f6603..e3e19b3d 100644 --- a/sources/ewol/widget/Spacer.cpp +++ b/sources/ewol/widget/Spacer.cpp @@ -16,14 +16,6 @@ const char* const ewol::widget::Spacer::configColor = "color"; -static ewol::Widget* create() { - return new ewol::widget::Spacer(); -} - -void ewol::widget::Spacer::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - ewol::widget::Spacer::Spacer() { addObjectType("ewol::widget::Spacer"); m_userMinSize = ewol::Dimension(vec2(10,10)); @@ -33,6 +25,10 @@ ewol::widget::Spacer::Spacer() { registerConfig(configColor, "color", nullptr, "background of the spacer"); } +void ewol::widget::Spacer::init() { + ewol::Widget::init(); +} + ewol::widget::Spacer::~Spacer() { } diff --git a/sources/ewol/widget/Spacer.h b/sources/ewol/widget/Spacer.h index 765a8777..ff7206cd 100644 --- a/sources/ewol/widget/Spacer.h +++ b/sources/ewol/widget/Spacer.h @@ -23,16 +23,18 @@ namespace ewol { */ class Spacer : public ewol::Widget { public: - static void init(ewol::widget::Manager& _widgetManager); // Config list of properties static const char* const configColor; private: ewol::compositing::Drawing m_draw; //!< Compositing drawing element - public: + protected: /** * @brief Main constructer */ Spacer(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Spacer, "Spacer"); /** * @brief Main destructer */ @@ -44,9 +46,12 @@ namespace ewol { * @brief Spziby the background color (basicly transparent) * @param[in] newColor the display background color */ - void setColor(etk::Color<> _newColor) { m_color = _newColor; markToRedraw(); }; + void setColor(etk::Color<> _newColor) { + m_color = _newColor; + markToRedraw(); + }; public: // Derived function - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos) { return nullptr; }; + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos) { return nullptr; }; virtual void onRegenerateDisplay(); virtual void onDraw(); virtual bool onSetConfig(const ewol::object::Config& _conf); diff --git a/sources/ewol/widget/WSlider.cpp b/sources/ewol/widget/WSlider.cpp index afbdebd5..8a400f94 100644 --- a/sources/ewol/widget/WSlider.cpp +++ b/sources/ewol/widget/WSlider.cpp @@ -31,14 +31,6 @@ const char* const ewol::widget::WSlider::configMode = "mode"; const char* const ewol::widget::WSlider::configSpeed = "speed"; const char* const ewol::widget::WSlider::configSelect = "select"; -static ewol::Widget* create() { - return new ewol::widget::WSlider(); -} - -void ewol::widget::WSlider::init(ewol::widget::Manager& _widgetManager) { - _widgetManager.addWidgetCreator(__class__,&create); -} - ewol::widget::WSlider::WSlider() : m_windowsSources(0), m_windowsDestination(0), @@ -142,7 +134,7 @@ void ewol::widget::WSlider::subWidgetSelectSet(int32_t _id) { } } -void ewol::widget::WSlider::subWidgetSelectSet(const ewol::object::Shared& _widgetPointer) { +void ewol::widget::WSlider::subWidgetSelectSet(const std::shared_ptr& _widgetPointer) { if (_widgetPointer == nullptr) { EWOL_ERROR("Can not change to a widget nullptr"); return; @@ -336,7 +328,7 @@ bool ewol::widget::WSlider::onGetConfig(const char* _config, std::string& _resul return false; } -ewol::object::Shared ewol::widget::WSlider::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::WSlider::getWidgetAtPos(const vec2& _pos) { if (true == isHide()) { return nullptr; } @@ -350,7 +342,7 @@ ewol::object::Shared ewol::widget::WSlider::getWidgetAtPos(const v if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = (*it)->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = (*it)->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } @@ -367,7 +359,7 @@ ewol::object::Shared ewol::widget::WSlider::getWidgetAtPos(const v if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = (*it)->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = (*it)->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } @@ -383,7 +375,7 @@ ewol::object::Shared ewol::widget::WSlider::getWidgetAtPos(const v if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x()) && (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) { - ewol::object::Shared tmpWidget = (*it)->getWidgetAtPos(_pos); + std::shared_ptr tmpWidget = (*it)->getWidgetAtPos(_pos); if (nullptr != tmpWidget) { return tmpWidget; } diff --git a/sources/ewol/widget/WSlider.h b/sources/ewol/widget/WSlider.h index 8d46f2a5..7ee1ecc0 100644 --- a/sources/ewol/widget/WSlider.h +++ b/sources/ewol/widget/WSlider.h @@ -21,7 +21,6 @@ namespace ewol { */ class WSlider :public ewol::widget::ContainerN { public: - static void init(ewol::widget::Manager& _widgetManager); // Event list of properties static const char* const eventStartSlide; static const char* const eventStopSlide; @@ -35,8 +34,13 @@ namespace ewol { sladingTransitionHori, sladingTransition_count, }; - public: + protected: WSlider(); + void init() { + ewol::widget::ContainerN::init(); + }; + public: + DECLARE_WIDGET_FACTORY(WSlider, "WSlider"); virtual ~WSlider(); private: int32_t m_windowsSources; //!< widget source viewed @@ -59,7 +63,7 @@ namespace ewol { * @brief Select a new subwidget to display * @param[in] _widgetPointer Pointer on the widget selected (must be added before) */ - void subWidgetSelectSet(const ewol::object::Shared& _widgetPointer); + void subWidgetSelectSet(const std::shared_ptr& _widgetPointer); /** * @brief Select a new subwidget to display * @param[in] _widgetName Name of the subwidget name @@ -101,7 +105,7 @@ namespace ewol { virtual void calculateSize(const vec2& _availlable); virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); virtual void periodicCall(const ewol::event::Time& _event); virtual bool onSetConfig(const ewol::object::Config& _conf); virtual bool onGetConfig(const char* _config, std::string& _result) const; diff --git a/sources/ewol/widget/Widget.cpp b/sources/ewol/widget/Widget.cpp index cf635a02..199edd56 100644 --- a/sources/ewol/widget/Widget.cpp +++ b/sources/ewol/widget/Widget.cpp @@ -105,7 +105,6 @@ const char* const ewol::Widget::eventAnnimationRatio = "annimation-ratio"; const char* const ewol::Widget::eventAnnimationStop = "annimation-stop"; ewol::Widget::Widget() : - m_up(nullptr), m_size(10,10), m_minSize(0,0), m_maxSize(vec2(ULTIMATE_MAX_SIZE,ULTIMATE_MAX_SIZE)), @@ -151,34 +150,19 @@ ewol::Widget::Widget() : addEventId(eventAnnimationStop); } +void ewol::Widget::init() { + ewol::Object::init(); +} + +void ewol::Widget::init(const std::string& _name) { + ewol::Object::init(_name); +} ewol::Widget::~Widget() { // clean all the short-cut ... shortCutClean(); } -void ewol::Widget::setUpperWidget(ewol::object::Shared _upper) { - if (_upper == nullptr) { - EWOL_VERBOSE("[" << getId() << "] remove upper widget"); - //just remove father : - m_up.reset(); - return; - } - if (m_up != nullptr) { - EWOL_WARNING("[" << getId() << "] Replace upper widget of this one ..."); - } - m_up = _upper; -} - -void ewol::Widget::onObjectRemove(const ewol::object::Shared& _object) { - EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")"); - ewol::Object::onObjectRemove(_object); - if (_object == m_up) { - EWOL_WARNING("[" << getId() << "] remove upper widget before removing this widget ..."); - m_up = nullptr; - } -} - void ewol::Widget::hide() { if (m_hide == false) { EWOL_WARNING("HIDE widget: '" << getName() << "'"); @@ -235,7 +219,7 @@ void ewol::Widget::setCanHaveFocus(bool _canFocusState) { } void ewol::Widget::keepFocus() { - getWidgetManager().focusKeep(this); + getWidgetManager().focusKeep(std::dynamic_pointer_cast(shared_from_this())); } void ewol::Widget::setOffset(const vec2& _newVal) { @@ -371,14 +355,14 @@ void ewol::Widget::systemDraw(const ewol::DrawProperty& _displayProp) { void ewol::Widget::periodicCallDisable() { m_periodicCallDeltaTime=0; m_periodicCallTime=-1; - getWidgetManager().periodicCallRm(this); + getWidgetManager().periodicCallRm(std::dynamic_pointer_cast(shared_from_this())); } void ewol::Widget::periodicCallEnable(float _callInSecond) { if (_callInSecond < 0) { periodicCallDisable(); } else { - getWidgetManager().periodicCallAdd(this); + getWidgetManager().periodicCallAdd(std::dynamic_pointer_cast(shared_from_this())); m_periodicCallDeltaTime = _callInSecond*1000000.0; m_periodicCallTime = ewol::getTime(); } @@ -672,7 +656,7 @@ bool ewol::Widget::onEventShortCut(ewol::key::Special& _special, sendMultiCast(m_localShortcut[iii]->generateEventId, m_localShortcut[iii]->eventData); } // send message direct to the current widget (in every case, really useful for some generic windows shortcut) - ewol::object::Message tmpMsg(this, m_localShortcut[iii]->generateEventId, m_localShortcut[iii]->eventData); + ewol::object::Message tmpMsg(shared_from_this(), m_localShortcut[iii]->generateEventId, m_localShortcut[iii]->eventData); onReceiveMessage(tmpMsg); } // no else return true; @@ -685,7 +669,7 @@ bool ewol::Widget::onEventShortCut(ewol::key::Special& _special, void ewol::Widget::grabCursor() { if (false == m_grabCursor) { - getContext().inputEventGrabPointer(this); + getContext().inputEventGrabPointer(std::dynamic_pointer_cast(shared_from_this())); m_grabCursor = true; } } @@ -718,17 +702,18 @@ bool ewol::Widget::loadXML(exml::Element* _node) { return true; } -ewol::object::Shared ewol::Widget::getWidgetNamed(const std::string& _widgetName) { +std::shared_ptr ewol::Widget::getWidgetNamed(const std::string& _widgetName) { EWOL_VERBOSE("[" << getId() << "] {" << getObjectType() << "} compare : " << getName() << " == " << _widgetName ); if (getName() == _widgetName) { - return this; + return std::dynamic_pointer_cast(shared_from_this()); } return nullptr; } bool ewol::Widget::systemEventEntry(ewol::event::EntrySystem& _event) { - if (nullptr != m_up) { - if (true == m_up->systemEventEntry(_event)) { + std::shared_ptr up = std::dynamic_pointer_cast(m_parent.lock()); + if (up != nullptr) { + if (up->systemEventEntry(_event) == true) { return true; } } @@ -736,8 +721,9 @@ bool ewol::Widget::systemEventEntry(ewol::event::EntrySystem& _event) { } bool ewol::Widget::systemEventInput(ewol::event::InputSystem& _event) { - if (nullptr != m_up) { - if (true == m_up->systemEventInput(_event)) { + std::shared_ptr up = std::dynamic_pointer_cast(m_parent.lock()); + if (up != nullptr) { + if (up->systemEventInput(_event) == true) { return true; } } @@ -873,7 +859,7 @@ ewol::widget::Manager& ewol::Widget::getWidgetManager() { return getContext().getWidgetManager(); } -ewol::object::Shared ewol::Widget::getWindows() { +std::shared_ptr ewol::Widget::getWindows() { return getContext().getWindows(); } diff --git a/sources/ewol/widget/Widget.h b/sources/ewol/widget/Widget.h index 4b1de028..e68d0801 100644 --- a/sources/ewol/widget/Widget.h +++ b/sources/ewol/widget/Widget.h @@ -34,6 +34,12 @@ namespace ewol { #define ULTIMATE_MAX_SIZE (99999999) +#define DECLARE_WIDGET_FACTORY(className, name) \ + DECLARE_FACTORY(className); \ + static void createManagerWidget(ewol::widget::Manager& _widgetManager) { \ + _widgetManager.addWidgetCreator(name,[]() -> std::shared_ptr { return className::create(); }); \ + } + namespace ewol { /** * @not-in-doc @@ -126,41 +132,21 @@ namespace ewol { static const char* const configMinSize; static const char* const configMaxSize; static const char* const configGravity; - public: + protected: /** * @brief Constructor of the widget classes * @return (no execption generated (not managed in embended platform)) */ Widget(); + + void init(); + void init(const std::string& _name); + public: /** * @brief Destructor of the widget classes */ virtual ~Widget(); // ---------------------------------------------------------------------------------------------------------------- - // -- Hierarchy management: - // ---------------------------------------------------------------------------------------------------------------- - protected: - ewol::object::Shared m_up; //!< uppper widget in the tree of widget - public: - /** - * @brief set the upper widget of this widget. - * @param[in] _upper Father widget (only keep the last and write error if a previous was set) == > disable with nullptr. - */ - void setUpperWidget(ewol::object::Shared _upper); - /** - * @brief remove the upper widget of this widget. - */ - void removeUpperWidget() { - setUpperWidget(nullptr); - }; - /** - * @brief get the upper widget (father). - * @ return the requested widget (if nullptr , 2 case : root widget or error implementation). - */ - ewol::object::Shared getUpperWidget() { - return m_up; - }; - // ---------------------------------------------------------------------------------------------------------------- // -- Widget size: // ---------------------------------------------------------------------------------------------------------------- protected: @@ -532,9 +518,9 @@ namespace ewol { * @return pointer on the widget found * @note : INTERNAL EWOL SYSTEM */ - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos) { + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos) { if (false == isHide()) { - return this; + return std::dynamic_pointer_cast(shared_from_this()); } return nullptr; }; @@ -543,7 +529,7 @@ namespace ewol { * @param[in] _widgetName name of the widget * @return the requested pointer on the node (or nullptr pointer) */ - virtual ewol::object::Shared getWidgetNamed(const std::string& _widgetName); + virtual std::shared_ptr getWidgetNamed(const std::string& _widgetName); // event section: public: @@ -699,7 +685,7 @@ namespace ewol { */ virtual enum ewol::context::cursorDisplay getCursor(); public: // Derived function - virtual void onObjectRemove(const ewol::object::Shared& _object); + virtual void onObjectRemove(const std::shared_ptr& _object) {}; virtual bool loadXML(exml::Element* _node); protected: // Derived function virtual bool onSetConfig(const ewol::object::Config& _conf); @@ -716,7 +702,7 @@ namespace ewol { /** * @brief get the curent Windows */ - ewol::object::Shared getWindows(); + std::shared_ptr getWindows(); /* * Annimation section : */ @@ -791,5 +777,6 @@ namespace ewol { }; }; +#include #endif diff --git a/sources/ewol/widget/WidgetScrolled.cpp b/sources/ewol/widget/WidgetScrolled.cpp index 5bfdb7ae..6813007d 100644 --- a/sources/ewol/widget/WidgetScrolled.cpp +++ b/sources/ewol/widget/WidgetScrolled.cpp @@ -15,9 +15,9 @@ -ewol::widget::WidgetScrolled::WidgetScrolled(const std::string& _shaperName) : - m_shaperH(_shaperName), - m_shaperV(_shaperName), +ewol::widget::WidgetScrolled::WidgetScrolled() : + m_shaperH(), + m_shaperV(), m_singleFingerMode(true) { addObjectType("ewol::widget::WidgetScrolled"); m_originScrooled.setValue(0,0); @@ -34,6 +34,12 @@ ewol::widget::WidgetScrolled::WidgetScrolled(const std::string& _shaperName) : } } +void ewol::widget::WidgetScrolled::init(const std::string& _shaperName) { + ewol::Widget::init(); + m_shaperH.setSource(_shaperName); + m_shaperV.setSource(_shaperName); +} + ewol::widget::WidgetScrolled::~WidgetScrolled() { } diff --git a/sources/ewol/widget/WidgetScrolled.h b/sources/ewol/widget/WidgetScrolled.h index e3cabe3a..19f517e9 100644 --- a/sources/ewol/widget/WidgetScrolled.h +++ b/sources/ewol/widget/WidgetScrolled.h @@ -63,12 +63,15 @@ namespace ewol { bool m_fingerPresent[CALCULATE_SIMULTANEOUS_FINGER]; bool m_fingerScoolActivated; vec2 m_fingerMoveStartPos[CALCULATE_SIMULTANEOUS_FINGER]; - public: + protected: /** * @brief Scroll Widget main constructor to be herited from an other widget (this is not a stand-alone widget) * @param[in] _shaperName Shaper name if the scrolled widget. */ - WidgetScrolled(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json"); + WidgetScrolled(); + void init(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json"); + public: + DECLARE_WIDGET_FACTORY(WidgetScrolled, "WidgetScrolled"); /** * @brief Scroll widget destructor. */ diff --git a/sources/ewol/widget/Windows.cpp b/sources/ewol/widget/Windows.cpp index 41da3b9f..e4339044 100644 --- a/sources/ewol/widget/Windows.cpp +++ b/sources/ewol/widget/Windows.cpp @@ -29,7 +29,7 @@ ewol::widget::Windows::Windows() : addObjectType("ewol::widget::Windows"); setCanHaveFocus(true); setDecorationDisable(); - m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Windows.json"); + m_colorProperty = ewol::resource::ColorFile::create("THEME:COLOR:Windows.json"); if (m_colorProperty != nullptr) { m_colorBg = m_colorProperty->request("background"); } @@ -58,7 +58,7 @@ void ewol::widget::Windows::calculateSize(const vec2& _availlable) { } } -ewol::object::Shared ewol::widget::Windows::getWidgetAtPos(const vec2& _pos) { +std::shared_ptr ewol::widget::Windows::getWidgetAtPos(const vec2& _pos) { // calculate relative position vec2 relativePos = relativePosition(_pos); // event go directly on the pop-up @@ -69,7 +69,7 @@ ewol::object::Shared ewol::widget::Windows::getWidgetAtPos(const v return m_subWidget->getWidgetAtPos(_pos); } // otherwise the event go to this widget ... - return this; + return std::dynamic_pointer_cast(shared_from_this()); } void ewol::widget::Windows::sysDraw() { @@ -161,29 +161,29 @@ void ewol::widget::Windows::systemDraw(const ewol::DrawProperty& _displayProp) { #endif } -void ewol::widget::Windows::setSubWidget(ewol::object::Shared _widget) { +void ewol::widget::Windows::setSubWidget(std::shared_ptr _widget) { if (m_subWidget != nullptr) { EWOL_INFO("Remove current main windows Widget..."); - m_subWidget->removeUpperWidget(); + m_subWidget->removeParent(); m_subWidget.reset(); } if (_widget != nullptr) { m_subWidget = _widget; - m_subWidget->setUpperWidget(this); + m_subWidget->setParent(shared_from_this()); } // Regenerate the size calculation : calculateSize(m_size); } -void ewol::widget::Windows::popUpWidgetPush(ewol::object::Shared _widget) { +void ewol::widget::Windows::popUpWidgetPush(std::shared_ptr _widget) { if (_widget == nullptr) { // nothing to do an error appear : EWOL_ERROR("can not set widget pop-up (null pointer)"); return; } m_popUpWidgetList.push_back(_widget); - _widget->setUpperWidget(this); + _widget->setParent(shared_from_this()); // force the focus on the basic widget ==> this remove many time the virual keyboard area _widget->keepFocus(); // Regenerate the size calculation : @@ -196,11 +196,11 @@ void ewol::widget::Windows::popUpWidgetPop() { if (m_popUpWidgetList.size() == 0) { return; } - m_popUpWidgetList.back()->removeUpperWidget(); + m_popUpWidgetList.back()->removeParent(); m_popUpWidgetList.pop_back(); } -void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::Windows::onObjectRemove(const std::shared_ptr& _removeObject) { // First step call parrent : ewol::Widget::onObjectRemove(_removeObject); // second step find if in all the elements ... @@ -232,9 +232,8 @@ void ewol::widget::Windows::setTitle(const std::string& _title) { } -void ewol::widget::Windows::createPopUpMessage(enum popUpMessageType _type, const std::string& _message) -{ - ewol::object::Shared tmpPopUp = ewol::object::makeShared(new widget::StdPopUp()); +void ewol::widget::Windows::createPopUpMessage(enum popUpMessageType _type, const std::string& _message) { + std::shared_ptr tmpPopUp = widget::StdPopUp::create(); if (tmpPopUp == nullptr) { EWOL_ERROR("Can not create a simple pop-up"); return; @@ -258,3 +257,29 @@ void ewol::widget::Windows::createPopUpMessage(enum popUpMessageType _type, cons tmpPopUp->setRemoveOnExternClick(true); popUpWidgetPush(tmpPopUp); } + +void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptr& _child) { + auto it = m_popUpWidgetList.begin(); + while (it != m_popUpWidgetList.end()) { + if (*it == _child) { + if (*it == nullptr) { + m_popUpWidgetList.erase(it); + it = m_popUpWidgetList.begin(); + continue; + } + (*it)->removeParent(); + (*it).reset(); + m_popUpWidgetList.erase(it); + it = m_popUpWidgetList.begin(); + continue; + } + ++it; + } + if (m_subWidget == _child) { + if (m_subWidget == nullptr) { + return; + } + m_subWidget->removeParent(); + m_subWidget.reset(); + } +} diff --git a/sources/ewol/widget/Windows.h b/sources/ewol/widget/Windows.h index 295f2887..c85dd23c 100644 --- a/sources/ewol/widget/Windows.h +++ b/sources/ewol/widget/Windows.h @@ -23,10 +23,14 @@ namespace ewol { */ class Windows : public ewol::Widget { protected: - ewol::object::Shared m_colorProperty; //!< theme color property + std::shared_ptr m_colorProperty; //!< theme color property int32_t m_colorBg; //!< Default background color of the windows - public: + protected: Windows(); + void init() { + ewol::Widget::init(); + }; + public: virtual ~Windows(); // internal event at ewol system : public: @@ -57,11 +61,11 @@ namespace ewol { m_hasDecoration = true; } private: - ewol::object::Owner m_subWidget; - std::list> m_popUpWidgetList; + std::shared_ptr m_subWidget; + std::list> m_popUpWidgetList; public: - void setSubWidget(ewol::object::Shared _widget); - void popUpWidgetPush(ewol::object::Shared _widget); + void setSubWidget(std::shared_ptr _widget); + void popUpWidgetPush(std::shared_ptr _widget); void popUpWidgetPop(); size_t popUpCount() { return m_popUpWidgetList.size(); @@ -85,9 +89,10 @@ namespace ewol { virtual void systemDraw(const ewol::DrawProperty& _displayProp); public: // Derived function virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); virtual void calculateSize(const vec2& _availlable); - virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); + virtual std::shared_ptr getWidgetAtPos(const vec2& _pos); + virtual void requestDestroyFromChild(const std::shared_ptr& _child); void setTitle(const std::string& _title); public: enum popUpMessageType { diff --git a/sources/ewol/widget/meta/ColorChooser.cpp b/sources/ewol/widget/meta/ColorChooser.cpp index e2b3920a..d27e23b5 100644 --- a/sources/ewol/widget/meta/ColorChooser.cpp +++ b/sources/ewol/widget/meta/ColorChooser.cpp @@ -30,62 +30,56 @@ static const char * const eventColorBarHasChange = "event-color-bar-has static const char * const eventColorSpecificHasChange = "event-color-specific-has-change"; -ewol::widget::ColorChooser::ColorChooser() : - ewol::widget::Sizer(ewol::widget::Sizer::modeVert) { +ewol::widget::ColorChooser::ColorChooser() { addObjectType("ewol::widget::ColorChooser"); addEventId(eventChange); - m_widgetColorBar = nullptr; - m_widgetRed = nullptr; - m_widgetGreen = nullptr; - m_widgetBlue = nullptr; - m_widgetAlpha = nullptr; +} + +void ewol::widget::ColorChooser::init() { + ewol::widget::Sizer::init(ewol::widget::Sizer::modeVert); lockExpand(bvec2(true,true)); - m_widgetColorBar = new ewol::widget::ColorBar(); - m_widgetColorBar->registerOnEvent(this, "change", eventColorBarHasChange); + m_widgetColorBar = ewol::widget::ColorBar::create(); + m_widgetColorBar->registerOnEvent(shared_from_this(), "change", eventColorBarHasChange); m_widgetColorBar->setFill(bvec2(true,true)); - /* - m_widgetColorBar->setWidth(200); - m_widgetColorBar->setHeigh(200); - */ - subWidgetAdd(m_widgetColorBar.get()); + subWidgetAdd(m_widgetColorBar); etk::Color<> sliderColor; sliderColor = etk::color::black; - m_widgetRed = new ewol::widget::Slider(); - m_widgetRed->registerOnEvent(this, "change", eventColorSpecificHasChange); + m_widgetRed = ewol::widget::Slider::create(); + m_widgetRed->registerOnEvent(shared_from_this(), "change", eventColorSpecificHasChange); m_widgetRed->setExpand(bvec2(true,false)); m_widgetRed->setFill(bvec2(true,false)); m_widgetRed->setMin(0); m_widgetRed->setMax(255); sliderColor = etk::Color<>(0xFF, 0x00, 0x00, 0xFF); m_widgetRed->setColor(sliderColor); - subWidgetAdd(m_widgetRed.get()); - m_widgetGreen = new ewol::widget::Slider(); - m_widgetGreen->registerOnEvent(this, "change", eventColorSpecificHasChange); + subWidgetAdd(m_widgetRed); + m_widgetGreen = ewol::widget::Slider::create(); + m_widgetGreen->registerOnEvent(shared_from_this(), "change", eventColorSpecificHasChange); m_widgetGreen->setExpand(bvec2(true,false)); m_widgetGreen->setFill(bvec2(true,false)); m_widgetGreen->setMin(0); sliderColor = etk::Color<>(0x00, 0xFF, 0x00, 0xFF); m_widgetGreen->setColor(sliderColor); m_widgetGreen->setMax(255); - subWidgetAdd(m_widgetGreen.get()); - m_widgetBlue = new ewol::widget::Slider(); - m_widgetBlue->registerOnEvent(this, "change", eventColorSpecificHasChange); + subWidgetAdd(m_widgetGreen); + m_widgetBlue = ewol::widget::Slider::create(); + m_widgetBlue->registerOnEvent(shared_from_this(), "change", eventColorSpecificHasChange); m_widgetBlue->setExpand(bvec2(true,false)); m_widgetBlue->setFill(bvec2(true,false)); m_widgetBlue->setMin(0); sliderColor = etk::Color<>(0x00, 0x00, 0xFF, 0xFF); m_widgetBlue->setColor(sliderColor); m_widgetBlue->setMax(255); - subWidgetAdd(m_widgetBlue.get()); - m_widgetAlpha = new ewol::widget::Slider(); - m_widgetAlpha->registerOnEvent(this, "change", eventColorSpecificHasChange); + subWidgetAdd(m_widgetBlue); + m_widgetAlpha = ewol::widget::Slider::create(); + m_widgetAlpha->registerOnEvent(shared_from_this(), "change", eventColorSpecificHasChange); m_widgetAlpha->setExpand(bvec2(true,false)); m_widgetAlpha->setFill(bvec2(true,false)); m_widgetAlpha->setMin(0); m_widgetAlpha->setMax(255); - subWidgetAdd(m_widgetAlpha.get()); + subWidgetAdd(m_widgetAlpha); m_currentColor = etk::color::white; } @@ -169,7 +163,7 @@ void ewol::widget::ColorChooser::onReceiveMessage(const ewol::object::Message& _ }; -void ewol::widget::ColorChooser::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::ColorChooser::onObjectRemove(const std::shared_ptr& _removeObject) { // First step call parrent : ewol::widget::Sizer::onObjectRemove(_removeObject); // second step find if in all the elements ... diff --git a/sources/ewol/widget/meta/ColorChooser.h b/sources/ewol/widget/meta/ColorChooser.h index 9d5f6359..458147d5 100644 --- a/sources/ewol/widget/meta/ColorChooser.h +++ b/sources/ewol/widget/meta/ColorChooser.h @@ -28,21 +28,24 @@ namespace ewol { public: // Event list of properties static const char * const eventChange; - public: + protected: ColorChooser(); + void init(); + public: + DECLARE_WIDGET_FACTORY(ColorChooser, "ColorChooser"); virtual ~ColorChooser(); public: // Derived function virtual void onReceiveMessage(const ewol::object::Message& _msg); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); public: void setColor(etk::Color<> _newColor); etk::Color<> getColor(); private: - ewol::object::Shared m_widgetColorBar; - ewol::object::Shared m_widgetRed; - ewol::object::Shared m_widgetGreen; - ewol::object::Shared m_widgetBlue; - ewol::object::Shared m_widgetAlpha; + std::shared_ptr m_widgetColorBar; + std::shared_ptr m_widgetRed; + std::shared_ptr m_widgetGreen; + std::shared_ptr m_widgetBlue; + std::shared_ptr m_widgetAlpha; etk::Color<> m_currentColor; }; }; diff --git a/sources/ewol/widget/meta/FileChooser.cpp b/sources/ewol/widget/meta/FileChooser.cpp index d7d689c3..bde6a9cb 100644 --- a/sources/ewol/widget/meta/FileChooser.cpp +++ b/sources/ewol/widget/meta/FileChooser.cpp @@ -48,7 +48,10 @@ ewol::widget::FileChooser::FileChooser() { addObjectType("ewol::widget::FileChooser"); addEventId(eventCancel); addEventId(eventValidate); - +} + +void ewol::widget::FileChooser::init() { + ewol::widget::Composer::init(); m_folder = etk::getUserHomeFolder(); m_file = ""; std::string myDescription = std::string("") diff --git a/sources/ewol/widget/meta/FileChooser.h b/sources/ewol/widget/meta/FileChooser.h index 7907d85d..5b76acad 100644 --- a/sources/ewol/widget/meta/FileChooser.h +++ b/sources/ewol/widget/meta/FileChooser.h @@ -29,7 +29,7 @@ namespace ewol { * * The first step is to create the file chooser pop-up : * [code style=c++] - * ewol::object::Shared tmpWidget = ewol::object::makeShared(new ewol::Widget::FileChooser()); + * std::shared_ptr tmpWidget = ewol::object::makeShared(new ewol::Widget::FileChooser()); * if (tmpWidget == nullptr) { * APPL_ERROR("Can not open File chooser !!! "); * return -1; @@ -77,8 +77,11 @@ namespace ewol { static const char* const eventCancel; static const char* const eventValidate; // Config list of properties - public: + protected: FileChooser(); + void init(); + public: + DECLARE_WIDGET_FACTORY(FileChooser, "FileChooser"); virtual ~FileChooser(); private: std::string m_folder; diff --git a/sources/ewol/widget/meta/Parameter.cpp b/sources/ewol/widget/meta/Parameter.cpp index 315ec77b..0ed30739 100644 --- a/sources/ewol/widget/meta/Parameter.cpp +++ b/sources/ewol/widget/meta/Parameter.cpp @@ -29,21 +29,25 @@ static const char * const l_eventMenuSelected = "local-event-menu-selected"; ewol::widget::Parameter::Parameter() : m_currentIdList(0), - m_widgetTitle(nullptr), - m_paramList(nullptr) { + m_widgetTitle(), + m_paramList() { addObjectType("ewol::widget::Parameter"); addEventId(eventClose); +} + +void ewol::widget::Parameter::init() { + ewol::widget::PopUp::init(); - ewol::widget::Sizer * mySizerVert = nullptr; - ewol::widget::Sizer * mySizerHori = nullptr; - ewol::widget::Spacer * mySpacer = nullptr; + std::shared_ptr mySizerVert = nullptr; + std::shared_ptr mySizerHori = nullptr; + std::shared_ptr mySpacer = nullptr; #ifdef __TARGET_OS__Android setMinSize(ewol::Dimension(vec2(90, 90), ewol::Dimension::Pourcent)); #else setMinSize(ewol::Dimension(vec2(80, 80), ewol::Dimension::Pourcent)); #endif - mySizerVert = new ewol::widget::Sizer(widget::Sizer::modeVert); + mySizerVert = ewol::widget::Sizer::create(widget::Sizer::modeVert); if (nullptr == mySizerVert) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -53,13 +57,13 @@ ewol::widget::Parameter::Parameter() : // set it in the pop-up-system : setSubWidget(mySizerVert); - mySizerHori = new ewol::widget::Sizer(widget::Sizer::modeHori); + mySizerHori = ewol::widget::Sizer::create(widget::Sizer::modeHori); if (nullptr == mySizerHori) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { mySizerVert->subWidgetAdd(mySizerHori); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); if (nullptr == mySpacer) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -67,23 +71,22 @@ ewol::widget::Parameter::Parameter() : mySizerHori->subWidgetAdd(mySpacer); } - ewol::widget::Button* tmpButton = new widget::Button(); + std::shared_ptr tmpButton = widget::Button::create(); if (nullptr == tmpButton) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { - tmpButton->setSubWidget( - new ewol::widget::Composer(widget::Composer::String, + tmpButton->setSubWidget(ewol::widget::Composer::create(widget::Composer::String, "\n" " \n" " \n" " \n" " \n" "\n")); - tmpButton->registerOnEvent(this, "pressed", ewolEventParameterSave); + tmpButton->registerOnEvent(shared_from_this(), "pressed", ewolEventParameterSave); mySizerHori->subWidgetAdd(tmpButton); } - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); if (nullptr == mySpacer) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -92,40 +95,39 @@ ewol::widget::Parameter::Parameter() : mySizerHori->subWidgetAdd(mySpacer); } - tmpButton = new ewol::widget::Button(); + tmpButton = ewol::widget::Button::create(); if (nullptr == tmpButton) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { - tmpButton->setSubWidget( - new ewol::widget::Composer(widget::Composer::String, + tmpButton->setSubWidget(ewol::widget::Composer::create(widget::Composer::String, "\n" " \n" " \n" " \n" " \n" "\n")); - tmpButton->registerOnEvent(this, "pressed", eventClose); + tmpButton->registerOnEvent(shared_from_this(), "pressed", eventClose); mySizerHori->subWidgetAdd(tmpButton); } } - mySizerHori = new ewol::widget::Sizer(widget::Sizer::modeHori); + mySizerHori = ewol::widget::Sizer::create(widget::Sizer::modeHori); if (nullptr == mySizerHori) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { mySizerVert->subWidgetAdd(mySizerHori); - m_paramList = new ewol::widget::ParameterList(); + m_paramList = ewol::widget::ParameterList::create(); if (nullptr == m_paramList) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { - m_paramList->registerOnEvent(this, "select", l_eventMenuSelected); + m_paramList->registerOnEvent(shared_from_this(), "select", l_eventMenuSelected); m_paramList->setFill(bvec2(false,true)); m_paramList->setExpand(bvec2(false,true)); - mySizerHori->subWidgetAdd(m_paramList.get()); + mySizerHori->subWidgetAdd(m_paramList); } - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); if (nullptr == mySpacer) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -135,13 +137,13 @@ ewol::widget::Parameter::Parameter() : mySizerHori->subWidgetAdd(mySpacer); } - ewol::widget::Sizer * mySizerVert2 = new widget::Sizer(widget::Sizer::modeVert); + std::shared_ptr mySizerVert2 = widget::Sizer::create(widget::Sizer::modeVert); if (nullptr == mySizerVert2) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { mySizerHori->subWidgetAdd(mySizerVert2); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); if (nullptr == mySpacer) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -151,19 +153,19 @@ ewol::widget::Parameter::Parameter() : mySizerVert2->subWidgetAdd(mySpacer); } - m_wSlider = new ewol::widget::WSlider(); + m_wSlider = ewol::widget::WSlider::create(); if (nullptr == m_wSlider) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { m_wSlider->setTransitionSpeed(0.5); m_wSlider->setTransitionMode(ewol::widget::WSlider::sladingTransitionVert); m_wSlider->setExpand(bvec2(true,true)); - mySizerVert2->subWidgetAdd(m_wSlider.get()); + mySizerVert2->subWidgetAdd(m_wSlider); } } } - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); if (nullptr == mySpacer) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { @@ -173,12 +175,12 @@ ewol::widget::Parameter::Parameter() : mySizerVert->subWidgetAdd(mySpacer); } - m_widgetTitle = new ewol::widget::Label("File chooser ..."); + m_widgetTitle = ewol::widget::Label::create("File chooser ..."); if (nullptr == m_widgetTitle) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { m_widgetTitle->setExpand(bvec2(true,false)); - mySizerVert->subWidgetAdd(m_widgetTitle.get()); + mySizerVert->subWidgetAdd(m_widgetTitle); } } markToRedraw(); @@ -217,7 +219,7 @@ void ewol::widget::Parameter::onReceiveMessage(const ewol::object::Message& _msg return; } -void ewol::widget::Parameter::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::Parameter::onObjectRemove(const std::shared_ptr& _removeObject) { // First step call parrent : ewol::widget::PopUp::onObjectRemove(_removeObject); // second step find if in all the elements ... @@ -232,7 +234,7 @@ void ewol::widget::Parameter::onObjectRemove(const ewol::object::Shared _associateWidget) { +void ewol::widget::Parameter::menuAdd(std::string _label, std::string _image, std::shared_ptr _associateWidget) { if (nullptr != m_paramList) { m_paramList->menuAdd(_label, m_currentIdList, _image); if (nullptr != m_wSlider) { @@ -240,7 +242,7 @@ void ewol::widget::Parameter::menuAdd(std::string _label, std::string _image, ew m_wSlider->subWidgetAdd(_associateWidget); } else { EWOL_DEBUG("Associate an empty widget on it ..."); - ewol::widget::Label * myLabel = new widget::Label((std::string("No widget for : ") + _label)); + std::shared_ptr myLabel = widget::Label::create(std::string("No widget for : ") + _label); if (nullptr == myLabel) { EWOL_ERROR("Can not allocate widget == > display might be in error"); } else { diff --git a/sources/ewol/widget/meta/Parameter.h b/sources/ewol/widget/meta/Parameter.h index a85bf2c9..5c108346 100644 --- a/sources/ewol/widget/meta/Parameter.h +++ b/sources/ewol/widget/meta/Parameter.h @@ -30,23 +30,26 @@ namespace ewol { public: // Event list of properties static const char * const eventClose; - public: + protected: Parameter(); + void init(); + public: + DECLARE_WIDGET_FACTORY(Parameter, "Parameter"); virtual ~Parameter(); public: // Derived function virtual void onReceiveMessage(const ewol::object::Message& _msg); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); public: void setTitle(std::string _label); - void menuAdd(std::string _label, std::string _image, ewol::object::Shared _associateWidget); + void menuAdd(std::string _label, std::string _image, std::shared_ptr _associateWidget); void menuAddGroup(std::string _label); void menuClear(); void menuSeparator(); private: int32_t m_currentIdList; - ewol::object::Shared m_widgetTitle; - ewol::object::Shared m_paramList; - ewol::object::Shared m_wSlider; + std::shared_ptr m_widgetTitle; + std::shared_ptr m_paramList; + std::shared_ptr m_wSlider; }; }; }; diff --git a/sources/ewol/widget/meta/ParameterList.cpp b/sources/ewol/widget/meta/ParameterList.cpp index d478b816..aa3c26f4 100644 --- a/sources/ewol/widget/meta/ParameterList.cpp +++ b/sources/ewol/widget/meta/ParameterList.cpp @@ -35,6 +35,9 @@ ewol::widget::ParameterList::ParameterList() { setCanHaveFocus(true); } +void ewol::widget::ParameterList::init() { + ewol::widget::WidgetScrolled::init(); +} ewol::widget::ParameterList::~ParameterList() { //clean all the object for (size_t iii=0; iii m_list; - public: + protected: ParameterList(); + void init(); + public: + DECLARE_WIDGET_FACTORY(ParameterList, "ParameterList"); virtual ~ParameterList(); void setLabel(std::string _newLabel); // drawing capabilities .... diff --git a/sources/ewol/widget/meta/StdPopUp.cpp b/sources/ewol/widget/meta/StdPopUp.cpp index 3ee4c0dc..74301f69 100644 --- a/sources/ewol/widget/meta/StdPopUp.cpp +++ b/sources/ewol/widget/meta/StdPopUp.cpp @@ -24,52 +24,55 @@ ewol::widget::StdPopUp::StdPopUp() : m_subBar(nullptr) { addObjectType("ewol::widget::StdPopUp"); setMinSize(ewol::Dimension(vec2(20,10),ewol::Dimension::Pourcent)); +} + +void ewol::widget::StdPopUp::init() { + ewol::widget::PopUp::init(); + std::shared_ptr mySizerVert; + std::shared_ptr mySpacer; - ewol::widget::Sizer* mySizerVert = nullptr; - ewol::widget::Spacer* mySpacer = nullptr; - - mySizerVert = new ewol::widget::Sizer(widget::Sizer::modeVert); + mySizerVert = ewol::widget::Sizer::create(widget::Sizer::modeVert); // set it in the pop-up-system : setSubWidget(mySizerVert); - m_subBar = new ewol::widget::Sizer(widget::Sizer::modeHori); + m_subBar = ewol::widget::Sizer::create(widget::Sizer::modeHori); m_subBar->lockExpand(bvec2(true,true)); m_subBar->setExpand(bvec2(true,false)); - mySizerVert->subWidgetAdd(m_subBar.get()); - mySpacer = new ewol::widget::Spacer(); + mySizerVert->subWidgetAdd(m_subBar); + mySpacer = ewol::widget::Spacer::create(); mySpacer->setExpand(bvec2(true,false)); m_subBar->subWidgetAdd(mySpacer); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); mySpacer->setExpand(bvec2(true,false)); mySpacer->setColor(etk::Color<>(0x88, 0x88, 0x88, 0xFF)); mySpacer->setMinSize(ewol::Dimension(vec2(0,3),ewol::Dimension::Pixel)); mySizerVert->subWidgetAdd(mySpacer); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); mySpacer->setExpand(bvec2(true,false)); mySpacer->setMinSize(ewol::Dimension(vec2(0,5),ewol::Dimension::Pixel)); mySizerVert->subWidgetAdd(mySpacer); - m_comment = new ewol::widget::Label("No Label"); + m_comment = ewol::widget::Label::create("No Label"); m_comment->setExpand(bvec2(true,true)); - mySizerVert->subWidgetAdd(m_comment.get()); + mySizerVert->subWidgetAdd(m_comment); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); mySpacer->setExpand(bvec2(true,false)); mySpacer->setMinSize(ewol::Dimension(vec2(0,5),ewol::Dimension::Pixel)); mySizerVert->subWidgetAdd(mySpacer); - mySpacer = new ewol::widget::Spacer(); + mySpacer = ewol::widget::Spacer::create(); mySpacer->setExpand(bvec2(true,false)); mySpacer->setColor(etk::Color<>(0x88, 0x88, 0x88, 0xFF)); mySpacer->setMinSize(ewol::Dimension(vec2(0,3),ewol::Dimension::Pixel)); mySizerVert->subWidgetAdd(mySpacer); - m_title = new ewol::widget::Label("Message"); + m_title = ewol::widget::Label::create("Message"); m_title->setExpand(bvec2(true,false)); m_title->setFill(bvec2(true,true)); - mySizerVert->subWidgetAdd(m_title.get()); + mySizerVert->subWidgetAdd(m_title); } ewol::widget::StdPopUp::~StdPopUp() { @@ -92,26 +95,26 @@ void ewol::widget::StdPopUp::setComment(const std::string& _text) { markToRedraw(); } -ewol::object::Shared ewol::widget::StdPopUp::addButton(const std::string& _text, bool _autoExit) { +std::shared_ptr ewol::widget::StdPopUp::addButton(const std::string& _text, bool _autoExit) { if (m_subBar == nullptr) { EWOL_ERROR("button-bar does not existed ..."); return nullptr; } - ewol::widget::Button* myButton = new widget::Button(); + std::shared_ptr myButton = widget::Button::create(); if (myButton == nullptr) { EWOL_ERROR("Can not allocate new button ..."); return nullptr; } - myButton->setSubWidget(new ewol::widget::Label(_text)); + myButton->setSubWidget(ewol::widget::Label::create(_text)); if(_autoExit == true) { - myButton->registerOnEvent(this, ewol::widget::Button::eventPressed, eventButtonExit); + myButton->registerOnEvent(shared_from_this(), ewol::widget::Button::eventPressed, eventButtonExit); } m_subBar->subWidgetAdd(myButton); markToRedraw(); return myButton; } -void ewol::widget::StdPopUp::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::StdPopUp::onObjectRemove(const std::shared_ptr& _removeObject) { // call parent: ewol::widget::PopUp::onObjectRemove(_removeObject); if (_removeObject == m_subBar) { diff --git a/sources/ewol/widget/meta/StdPopUp.h b/sources/ewol/widget/meta/StdPopUp.h index 384881fd..2afde8ea 100644 --- a/sources/ewol/widget/meta/StdPopUp.h +++ b/sources/ewol/widget/meta/StdPopUp.h @@ -40,17 +40,20 @@ namespace ewol { * [/pre] */ class StdPopUp : public ewol::widget::PopUp { - public: + protected: /** * @brief std-pop-up constructor. */ StdPopUp(); + void init(); + public: + DECLARE_WIDGET_FACTORY(StdPopUp, "StdPopUp"); /** * @brief std-pop-up destructor. */ virtual ~StdPopUp(); protected: - ewol::object::Shared m_title; //!< Title Label widget + std::shared_ptr m_title; //!< Title Label widget public: /** * @brief Set the title string. @@ -58,7 +61,7 @@ namespace ewol { */ void setTitle(const std::string& _text); protected: - ewol::object::Shared m_comment; //!< Comment label widget + std::shared_ptr m_comment; //!< Comment label widget public: /** * @brief Set the commentary string. @@ -66,15 +69,15 @@ namespace ewol { */ void setComment(const std::string& _text); protected: - ewol::object::Shared m_subBar; //!< subwidget bar containing all the button. + std::shared_ptr m_subBar; //!< subwidget bar containing all the button. public: /** * @brief Add a buttom button. * @param[in] _text Decorated text to diplay in button. */ - ewol::object::Shared addButton(const std::string& _text, bool _autoExit=false); + std::shared_ptr addButton(const std::string& _text, bool _autoExit=false); public: // Derived function - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const std::shared_ptr& _removeObject); virtual void onReceiveMessage(const ewol::object::Message& _msg); }; };