diff --git a/sources/ewol/Dimension.cpp b/sources/ewol/Dimension.cpp index 585ba5b7..e1a90121 100644 --- a/sources/ewol/Dimension.cpp +++ b/sources/ewol/Dimension.cpp @@ -111,11 +111,16 @@ vec2 ewol::Dimension::Get(ewol::Dimension::distance_te type) const void ewol::Dimension::Set(const vec2& _size, ewol::Dimension::distance_te type) { // Set min max on input to limit error : - vec2 size(etk_avg(0,_size.x(),999999999999999.0), - etk_avg(0,_size.y(),999999999999999.0)); + vec2 size(etk_avg(0.0f,_size.x(),9999999.0f), + etk_avg(0.0f,_size.y(),9999999.0f)); switch(type) { case ewol::Dimension::Pourcent: - m_data = vec2(size.x()*0.01f, size.y()*0.01f); + { + vec2 size2(etk_avg(0.0f,_size.x(),100.0f), + etk_avg(0.0f,_size.y(),100.0f)); + m_data = vec2(size2.x()*0.01f, size2.y()*0.01f); + //EWOL_VERBOSE("Set % : " << size2 << " ==> " << m_data); + } break; case ewol::Dimension::Pixel: m_data = size; @@ -148,7 +153,9 @@ vec2 ewol::Dimension::GetPixel(void) const return m_data; } else { vec2 windDim = windowsSize.GetPixel(); - return vec2(windDim.x()*m_data.x(), windDim.y()*m_data.y()); + vec2 res = vec2(windDim.x()*m_data.x(), windDim.y()*m_data.y()); + //EWOL_DEBUG("Get % : " << m_data << " / " << windDim << "==> " << res); + return res; } } diff --git a/sources/ewol/compositing/Drawing.cpp b/sources/ewol/compositing/Drawing.cpp index 228310d6..fc06006f 100644 --- a/sources/ewol/compositing/Drawing.cpp +++ b/sources/ewol/compositing/Drawing.cpp @@ -447,7 +447,7 @@ void ewol::Drawing::LineTo(vec3 dest) { ResetCount(); InternalSetColor(m_color); - EWOL_DEBUG("DrawLine : " << m_position << " to " << dest); + //EWOL_DEBUG("DrawLine : " << m_position << " to " << dest); if (m_position.x() == dest.x() && m_position.y() == dest.y() && m_position.z() == dest.z()) { EWOL_WARNING("Try to draw an line width 0"); return; diff --git a/sources/ewol/eObject/EObject.cpp b/sources/ewol/eObject/EObject.cpp index 019a5276..de89fb28 100644 --- a/sources/ewol/eObject/EObject.cpp +++ b/sources/ewol/eObject/EObject.cpp @@ -146,6 +146,7 @@ void ewol::EObject::AddEventId(const char * generateEventId) void ewol::EObject::GenerateEventId(const char * generateEventId, const etk::UString& data) { + int32_t nbObject = ewol::EObjectManager::GetNumberObject(); // for every element registered ... for (int32_t iii=0; iii ewol::EObjectManager::GetNumberObject()) { + EWOL_CRITICAL("It if really dangerous ro remove (delete) element inside a callback ... use ->RemoveObject() which is asynchronous"); + } } void ewol::EObject::SendMultiCast(const char* const messageId, const etk::UString& data) { + int32_t nbObject = ewol::EObjectManager::GetNumberObject(); MultiCastSend(this, messageId, data); + if (nbObject > ewol::EObjectManager::GetNumberObject()) { + EWOL_CRITICAL("It if really dangerous ro remove (delete) element inside a callback ... use ->RemoveObject() which is asynchronous"); + } } void ewol::EObject::RegisterMultiCast(const char* const messageId) diff --git a/sources/ewol/eObject/EObjectManager.cpp b/sources/ewol/eObject/EObjectManager.cpp index 0a27ece3..f4229a01 100644 --- a/sources/ewol/eObject/EObjectManager.cpp +++ b/sources/ewol/eObject/EObjectManager.cpp @@ -20,6 +20,7 @@ static etk::Vector m_eObjectList; // all widget al static etk::Vector m_eObjectAutoRemoveList; // all widget allocated + void ewol::EObjectManager::Init(void) { EWOL_DEBUG("==> Init EObject-Manager"); @@ -56,6 +57,11 @@ void ewol::EObjectManager::Add(ewol::EObject* object) } } +int32_t ewol::EObjectManager::GetNumberObject(void) +{ + return m_eObjectList.Size() + m_eObjectAutoRemoveList.Size(); +} + void informOneObjectIsRemoved(ewol::EObject* object) { for (int32_t iii=0; iiiSetColor(m_textColorFg); // set it in the pop-up-system : - m_widgetContextMenu->SubWidgetSet(myColorChooser); + m_widgetContextMenu->SetSubWidget(myColorChooser); myColorChooser->RegisterOnEvent(this, ewolEventColorChooserChange, ewolEventColorChooserChange); ewol::WindowsPopUpAdd(m_widgetContextMenu); MarkToRedraw(); diff --git a/sources/ewol/widget/Container.h b/sources/ewol/widget/Container.h index ff9bc61d..20b919d9 100644 --- a/sources/ewol/widget/Container.h +++ b/sources/ewol/widget/Container.h @@ -20,7 +20,7 @@ namespace widget */ class Container : public ewol::Widget { - private: + protected: ewol::Widget* m_subWidget; public: /** diff --git a/sources/ewol/widget/ContainerN.cpp b/sources/ewol/widget/ContainerN.cpp index 69d00547..869c5db0 100644 --- a/sources/ewol/widget/ContainerN.cpp +++ b/sources/ewol/widget/ContainerN.cpp @@ -164,7 +164,7 @@ void widget::ContainerN::OnObjectRemove(ewol::EObject* removeObject) void widget::ContainerN::OnDraw(ewol::DrawProperty& displayProp) { - for (int32_t iii=0; iii=0; iii--) { if (NULL != m_subWidget[iii]) { m_subWidget[iii]->GenDraw(displayProp); } diff --git a/sources/ewol/widget/ContextMenu.cpp b/sources/ewol/widget/ContextMenu.cpp index e60e26e9..9496cb45 100644 --- a/sources/ewol/widget/ContextMenu.cpp +++ b/sources/ewol/widget/ContextMenu.cpp @@ -16,13 +16,13 @@ widget::ContextMenu::ContextMenu(void) { - m_userExpand.setValue(true,true); + m_userExpand.setValue(false,false); m_padding.setValue(4,4); m_offset = 20; - + m_colorBackGroung = draw::color::white; - + m_colorBorder = draw::color::black; m_colorBorder.a = 0x7F; @@ -33,7 +33,7 @@ widget::ContextMenu::ContextMenu(void) widget::ContextMenu::~ContextMenu(void) { - SubWidgetRemove(); + } @@ -107,49 +107,21 @@ void widget::ContextMenu::CalculateSize(const vec2& availlable) void widget::ContextMenu::CalculateMinMaxSize(void) { - EWOL_DEBUG("CalculateMinSize"); + //EWOL_DEBUG("CalculateMinSize"); m_userExpand.setValue(false,false); m_minSize.setValue(50,50); if (NULL != m_subWidget) { m_subWidget->CalculateMinMaxSize(); m_minSize = m_subWidget->GetCalculateMinSize(); } - EWOL_DEBUG("CalculateMinSize=>>" << m_minSize); + //EWOL_DEBUG("CalculateMinSize=>>" << m_minSize); MarkToRedraw(); } -void widget::ContextMenu::SetMinSize(const vec2& size) -{ - EWOL_ERROR("Pop-up can not have a user Minimum size (herited from under elements)"); -} - -void widget::ContextMenu::SetExpand(const bvec2& newExpand) -{ - EWOL_ERROR("Pop-up can not have a user expand settings X (herited from under elements)"); -} - - -void widget::ContextMenu::SubWidgetSet(ewol::Widget* newWidget) -{ - if (NULL == newWidget) { - return; - } - m_subWidget = newWidget; -} - - -void widget::ContextMenu::SubWidgetRemove(void) -{ - if (NULL != m_subWidget) { - delete(m_subWidget); - m_subWidget = NULL; - } -} - void widget::ContextMenu::OnDraw(ewol::DrawProperty& displayProp) { //EWOL_DEBUG("On Draw " << m_currentDrawId); - widget::Drawable::OnDraw(displayProp); + m_compositing.Draw(); if (NULL != m_subWidget) { m_subWidget->GenDraw(displayProp); } @@ -159,91 +131,68 @@ void widget::ContextMenu::OnDraw(ewol::DrawProperty& displayProp) void widget::ContextMenu::OnRegenerateDisplay(void) { if (true == NeedRedraw()) { - } - // generate a white background and take gray on other surfaces - ClearOObjectList(); - ewol::Drawing * BGOObjects = new ewol::Drawing(); - AddOObject(BGOObjects); - - if (NULL != m_subWidget) { - vec2 tmpSize = m_subWidget->GetSize(); - vec2 tmpOrigin = m_subWidget->GetOrigin(); - - // display border ... - BGOObjects->SetColor(m_colorBorder); - switch (m_arrawBorder) - { - case widget::CONTEXT_MENU_MARK_TOP: - BGOObjects->SetPos(vec3(m_arrowPos.x(), m_arrowPos.y(), 0.0f) ); - BGOObjects->AddVertex(); - if (m_arrowPos.x() <= tmpOrigin.x() ) { - float laking = m_offset - m_padding.y(); - BGOObjects->SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()-laking, 0.0f) ); - BGOObjects->AddVertex(); - BGOObjects->SetPos(vec3(m_arrowPos.x(), m_arrowPos.y()-laking, 0.0f) ); - BGOObjects->AddVertex(); - } else { - float laking = m_offset - m_padding.y(); - BGOObjects->SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()-laking, 0.0f) ); - BGOObjects->AddVertex(); - BGOObjects->SetPos(vec3(m_arrowPos.x()-laking, m_arrowPos.y()-laking, 0.0f) ); - BGOObjects->AddVertex(); - } - break; - case widget::CONTEXT_MENU_MARK_BOTTOM: - BGOObjects->SetPos(vec3(m_arrowPos.x(), m_arrowPos.y(), 0) ); - BGOObjects->AddVertex(); - if (m_arrowPos.x() <= tmpOrigin.x() ) { - int32_t laking = m_offset - m_padding.y(); - BGOObjects->SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()+laking, 0.0f) ); - BGOObjects->AddVertex(); - BGOObjects->SetPos(vec3(m_arrowPos.x(), m_arrowPos.y()+laking, 0.0f) ); - BGOObjects->AddVertex(); - } else { - int32_t laking = m_offset - m_padding.y(); - BGOObjects->SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()+laking, 0.0f) ); - BGOObjects->AddVertex(); - BGOObjects->SetPos(vec3(m_arrowPos.x()-laking, m_arrowPos.y()+laking, 0.0f) ); - BGOObjects->AddVertex(); - } - break; - default: - case widget::CONTEXT_MENU_MARK_RIGHT: - case widget::CONTEXT_MENU_MARK_LEFT: - EWOL_TODO("later"); - break; + m_compositing.Clear(); + if (NULL != m_subWidget) { + vec2 tmpSize = m_subWidget->GetSize(); + vec2 tmpOrigin = m_subWidget->GetOrigin(); + + // display border ... + m_compositing.SetColor(m_colorBorder); + switch (m_arrawBorder) + { + case widget::CONTEXT_MENU_MARK_TOP: + m_compositing.SetPos(vec3(m_arrowPos.x(), m_arrowPos.y(), 0.0f) ); + m_compositing.AddVertex(); + if (m_arrowPos.x() <= tmpOrigin.x() ) { + float laking = m_offset - m_padding.y(); + m_compositing.SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()-laking, 0.0f) ); + m_compositing.AddVertex(); + m_compositing.SetPos(vec3(m_arrowPos.x(), m_arrowPos.y()-laking, 0.0f) ); + m_compositing.AddVertex(); + } else { + float laking = m_offset - m_padding.y(); + m_compositing.SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()-laking, 0.0f) ); + m_compositing.AddVertex(); + m_compositing.SetPos(vec3(m_arrowPos.x()-laking, m_arrowPos.y()-laking, 0.0f) ); + m_compositing.AddVertex(); + } + break; + case widget::CONTEXT_MENU_MARK_BOTTOM: + m_compositing.SetPos(vec3(m_arrowPos.x(), m_arrowPos.y(), 0) ); + m_compositing.AddVertex(); + if (m_arrowPos.x() <= tmpOrigin.x() ) { + int32_t laking = m_offset - m_padding.y(); + m_compositing.SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()+laking, 0.0f) ); + m_compositing.AddVertex(); + m_compositing.SetPos(vec3(m_arrowPos.x(), m_arrowPos.y()+laking, 0.0f) ); + m_compositing.AddVertex(); + } else { + int32_t laking = m_offset - m_padding.y(); + m_compositing.SetPos(vec3(m_arrowPos.x()+laking, m_arrowPos.y()+laking, 0.0f) ); + m_compositing.AddVertex(); + m_compositing.SetPos(vec3(m_arrowPos.x()-laking, m_arrowPos.y()+laking, 0.0f) ); + m_compositing.AddVertex(); + } + break; + default: + case widget::CONTEXT_MENU_MARK_RIGHT: + case widget::CONTEXT_MENU_MARK_LEFT: + EWOL_TODO("later"); + break; + } + m_compositing.SetPos(vec3(tmpOrigin.x()-m_padding.x(), tmpOrigin.y() - m_padding.y(), 0.0f) ); + m_compositing.RectangleWidth(vec3(tmpSize.x() + m_padding.x()*2, tmpSize.y() + m_padding.y()*2, 0.0f) ); + // set the area in white ... + m_compositing.SetColor(m_colorBackGroung); + m_compositing.SetPos(vec3(tmpOrigin.x(), tmpOrigin.y(), 0.0f) ); + m_compositing.RectangleWidth(vec3(tmpSize.x(), tmpSize.y(), 0.0f) ); } - BGOObjects->SetPos(vec3(tmpOrigin.x()-m_padding.x(), tmpOrigin.y() - m_padding.y(), 0.0f) ); - BGOObjects->RectangleWidth(vec3(tmpSize.x() + m_padding.x()*2, tmpSize.y() + m_padding.y()*2, 0.0f) ); - // set the area in white ... - BGOObjects->SetColor(m_colorBackGroung); - BGOObjects->SetPos(vec3(tmpOrigin.x(), tmpOrigin.y(), 0.0f) ); - BGOObjects->RectangleWidth(vec3(tmpSize.x(), tmpSize.y(), 0.0f) ); } if (NULL != m_subWidget) { m_subWidget->OnRegenerateDisplay(); } } - -ewol::Widget * widget::ContextMenu::GetWidgetAtPos(const vec2& pos) -{ - // calculate relative position - vec2 relativePos = RelativePosition(pos); - // Check for sub Element - if (NULL != m_subWidget) { - vec2 tmpSize = m_subWidget->GetSize(); - vec2 tmpOrigin = m_subWidget->GetOrigin(); - if( (tmpOrigin.x() <= relativePos.x() && tmpOrigin.x() + tmpSize.x() >= relativePos.x()) - && (tmpOrigin.y() <= relativePos.y() && tmpOrigin.y() + tmpSize.y() >= relativePos.y()) ) - { - return m_subWidget->GetWidgetAtPos(pos); - } - } - return this; -} - - bool widget::ContextMenu::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput, ewol::keyEvent::status_te typeEvent, const vec2& pos) { //EWOL_INFO("Event ouside the context menu"); @@ -271,3 +220,11 @@ void widget::ContextMenu::SetPositionMark(markPosition_te position, vec2 arrowPo MarkToRedraw(); } +ewol::Widget* widget::ContextMenu::GetWidgetAtPos(const vec2& pos) +{ + ewol::Widget* val = widget::Container::GetWidgetAtPos(pos); + if (NULL != val) { + return val; + } + return this; +} diff --git a/sources/ewol/widget/ContextMenu.h b/sources/ewol/widget/ContextMenu.h index d3bca777..3ab85b8d 100644 --- a/sources/ewol/widget/ContextMenu.h +++ b/sources/ewol/widget/ContextMenu.h @@ -12,8 +12,8 @@ #include #include #include -#include -#include +#include +#include namespace widget { typedef enum { @@ -23,38 +23,30 @@ namespace widget { CONTEXT_MENU_MARK_LEFT, CONTEXT_MENU_MARK_NONE }markPosition_te; - class ContextMenu : public widget::Drawable + class ContextMenu : public widget::Container { public: ContextMenu(void); virtual ~ContextMenu(void); - // Derived function - virtual const char * const GetObjectType(void) { return "EwolContextMenu"; }; - public: - virtual void CalculateSize(const vec2& availlable); // this generate the current size ... - virtual void CalculateMinMaxSize(void); //update the min Size ... and the expend parameters for the sizer - virtual void SetMinSize(const vec2& size); - virtual void SetExpand(const bvec2& newExpend); private: + ewol::Drawing m_compositing; draw::Color m_colorBackGroung; draw::Color m_colorBorder; vec2 m_padding; vec2 m_arrowPos; float m_offset; markPosition_te m_arrawBorder; - ewol::Widget* m_subWidget; public: - void SubWidgetSet(ewol::Widget* newWidget); - void SubWidgetRemove(void); - void SetPositionMark(markPosition_te position, vec2 arrowPos); - protected: - // Derived function + void SetPositionMark(markPosition_te position, vec2 arrowPos); + protected: // Derived function virtual void OnDraw(ewol::DrawProperty& displayProp); - public: - // Derived function + public: // Derived function virtual void OnRegenerateDisplay(void); - virtual ewol::Widget* GetWidgetAtPos(const vec2& pos); virtual bool OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput, ewol::keyEvent::status_te typeEvent, const vec2& pos); + virtual void CalculateSize(const vec2& availlable); + virtual void CalculateMinMaxSize(void); + virtual const char * const GetObjectType(void) { return "ewol::ContextMenu"; }; + virtual ewol::Widget* GetWidgetAtPos(const vec2& pos); }; }; diff --git a/sources/ewol/widget/Image.cpp b/sources/ewol/widget/Image.cpp index 665dd546..eee8c385 100644 --- a/sources/ewol/widget/Image.cpp +++ b/sources/ewol/widget/Image.cpp @@ -127,7 +127,7 @@ void widget::Image::OnRegenerateDisplay(void) // set the somposition properties : m_compositing.SetPos(origin); m_compositing.Print(imageRealSize); - EWOL_DEBUG("Paint Image at : " << origin << " size=" << imageRealSize << " origin=" << origin); + //EWOL_DEBUG("Paint Image at : " << origin << " size=" << imageRealSize << " origin=" << origin); } } diff --git a/sources/ewol/widget/Menu.cpp b/sources/ewol/widget/Menu.cpp index 43e84a8e..7346776c 100644 --- a/sources/ewol/widget/Menu.cpp +++ b/sources/ewol/widget/Menu.cpp @@ -134,7 +134,7 @@ void widget::Menu::OnReceiveMessage(ewol::EObject * CallerObject, const char * e SendMultiCast(m_listElement[iii]->m_generateEvent, m_listElement[iii]->m_message); if (NULL != m_widgetContextMenu) { EWOL_DEBUG("Mark the menu to remove ..."); - delete(m_widgetContextMenu); + m_widgetContextMenu->RemoveObject(); m_widgetContextMenu = NULL; } return; @@ -177,7 +177,7 @@ void widget::Menu::OnReceiveMessage(ewol::EObject * CallerObject, const char * e mySizer = new widget::Sizer(widget::Sizer::modeVert); mySizer->LockExpand(vec2(true,true)); // set it in the pop-up-system : - m_widgetContextMenu->SubWidgetSet(mySizer); + m_widgetContextMenu->SetSubWidget(mySizer); for(int32_t jjj=m_listElement.Size()-1; jjj>=0; jjj--) { if (m_listElement[iii]!=NULL) { diff --git a/sources/ewol/widget/PopUp.cpp b/sources/ewol/widget/PopUp.cpp index 29720c07..506779f8 100644 --- a/sources/ewol/widget/PopUp.cpp +++ b/sources/ewol/widget/PopUp.cpp @@ -13,53 +13,45 @@ #undef __class__ #define __class__ "PopUp" -widget::PopUp::PopUp(void) : - m_subWidgetNext(NULL) +widget::PopUp::PopUp(void) { - m_userExpand.setValue(true, true); + m_userExpand.setValue(false, false); + SetMinSize(ewol::Dimension(vec2(80,80),ewol::Dimension::Pourcent)); m_colorBackGroung = draw::color::white; - m_colorEmptyArea = draw::color::black; m_colorEmptyArea.a = 0x7F; - m_colorBorder = draw::color::black; m_colorBorder.a = 0x7F; - - m_subWidget = 0; } widget::PopUp::~PopUp(void) { - SubWidgetRemove(); + } void widget::PopUp::CalculateSize(const vec2& availlable) { - //EWOL_DEBUG("CalculateSize=" << availlable); - // pop-up fill all the display : m_size = availlable; - if (NULL != m_subWidget) { - vec2 subWidgetSize; - vec2 subWidgetOrigin; - subWidgetSize = m_subWidget->GetCalculateMinSize(); + vec2 subElementSize = m_minSize; + vec2 subElementOrigin = m_origin + (m_size-m_minSize)/2.0f; + + vec2 subWidgetSize = m_subWidget->GetCalculateMinSize(); if (true == m_subWidget->CanExpand().x()) { - subWidgetSize.setX(m_size.x()); + subWidgetSize.setX(m_minSize.x()); } if (true == m_subWidget->CanExpand().y()) { - subWidgetSize.setY(m_size.y()); + subWidgetSize.setY(m_minSize.y()); } - if (m_displayRatio>0.1 && m_displayRatio<=1) { - subWidgetSize.setValue(etk_max(m_size.x()*m_displayRatio, subWidgetSize.x()), - etk_max(m_size.y()*m_displayRatio, subWidgetSize.y()) ); - } - // force to be an integer ... - subWidgetSize.setValue((int32_t)subWidgetSize.x(), (int32_t)subWidgetSize.y()); + // limit the size of the element : + subWidgetSize.setMin(m_minSize); + // posiition at a int32_t pos : + subWidgetSize = vec2ClipInt32(subWidgetSize); + // set config to the Sub-widget - subWidgetOrigin.setValue((int32_t)(m_size.x() - m_origin.x() - subWidgetSize.x())/2 + m_origin.x(), - (int32_t)(m_size.y() - m_origin.y() - subWidgetSize.y())/2 + m_origin.y()); + vec2 subWidgetOrigin = m_origin + (m_size-subWidgetSize)/2.0f; m_subWidget->SetOrigin(subWidgetOrigin); m_subWidget->CalculateSize(subWidgetSize); @@ -70,55 +62,28 @@ void widget::PopUp::CalculateSize(const vec2& availlable) void widget::PopUp::CalculateMinMaxSize(void) { - //EWOL_DEBUG("CalculateMinMaxSize"); + // remove expand of sub widget ==> not needed ... m_userExpand.setValue(false,false); - m_minSize.setValue(50, 50); + + if (m_userMinSize.GetType() != ewol::Dimension::Pourcent) { + EWOL_ERROR(" ==> Please set pourcent size of the popo_up view"); + m_minSize.setValue(50, 50); + } else { + m_minSize = m_userMinSize.GetPixel(); + } if (NULL != m_subWidget) { m_subWidget->CalculateMinMaxSize(); vec2 tmpSize = m_subWidget->GetCalculateMinSize(); - m_minSize = tmpSize; + m_minSize.setMax(tmpSize); } - //EWOL_DEBUG("CalculateMinSize(" << m_minSize.x << "," << m_minSize.y << ")"); + EWOL_DEBUG("CalculateMinSize=" << m_minSize); MarkToRedraw(); } -void widget::PopUp::SetMinSize(const vec2& size) -{ - EWOL_ERROR("Pop-up can not have a user Minimum size (herited from under elements)"); -} - -void widget::PopUp::SetExpand(const bvec2& newExpand) -{ - EWOL_ERROR("Pop-up can not have a user expand settings X (herited from under elements)"); -} - -void widget::PopUp::SubWidgetSet(ewol::Widget* newWidget) -{ - if (NULL == newWidget) { - EWOL_ERROR("Try to set a sub wiget with NULL pointer ..."); - return; - } - SubWidgetRemove(); - m_subWidget = newWidget; - //EWOL_DEBUG("SetSubWidget on Pop-Up : " << (int64_t)m_subWidget); - MarkToRedraw(); -} - - -void widget::PopUp::SubWidgetRemove(void) -{ - if (NULL != m_subWidget) { - delete(m_subWidget); - m_subWidget = NULL; - } - MarkToRedraw(); -} - - void widget::PopUp::OnDraw(ewol::DrawProperty& displayProp) { // draw upper classes - widget::Drawable::OnDraw(displayProp); + m_compositing.Draw(); if (NULL != m_subWidget) { m_subWidget->GenDraw(displayProp); } @@ -128,68 +93,33 @@ void widget::PopUp::OnDraw(ewol::DrawProperty& displayProp) void widget::PopUp::OnRegenerateDisplay(void) { if (true == NeedRedraw()) { + m_compositing.Clear(); + m_compositing.SetColor(m_colorEmptyArea); + m_compositing.SetPos(vec3(0,0,0)); + m_compositing.RectangleWidth(vec3(m_size.x(), m_size.y(), 0)); + // set the area in white ... + if (NULL != m_subWidget) { + vec2 tmpSize = m_subWidget->GetSize(); + vec2 tmpOrigin = m_subWidget->GetOrigin(); + m_compositing.SetColor(m_colorBorder); + m_compositing.SetPos(vec3(tmpOrigin.x()-BORDER_SIZE_TMP, tmpOrigin.y()-BORDER_SIZE_TMP,0) ); + m_compositing.RectangleWidth(vec3(tmpSize.x()+2*BORDER_SIZE_TMP, tmpSize.y()+2*BORDER_SIZE_TMP, 0) ); + m_compositing.SetColor(m_colorBackGroung); + m_compositing.SetPos(vec3(tmpOrigin.x(), tmpOrigin.y(),0) ); + m_compositing.RectangleWidth(vec3(tmpSize.x(), tmpSize.y(), 0) ); + } } - // generate a white background and take gray on other surfaces - ClearOObjectList(); - ewol::Drawing * BGOObjects = new ewol::Drawing(); - AddOObject(BGOObjects); - - BGOObjects->SetColor(m_colorEmptyArea); - BGOObjects->SetPos(vec3(0,0,0)); - BGOObjects->RectangleWidth(vec3(m_size.x(), m_size.y(), 0)); - // set the area in white ... - if (NULL != m_subWidget) { - vec2 tmpSize = m_subWidget->GetSize(); - vec2 tmpOrigin = m_subWidget->GetOrigin(); - BGOObjects->SetColor(m_colorBorder); - BGOObjects->SetPos(vec3(tmpOrigin.x()-BORDER_SIZE_TMP, tmpOrigin.y()-BORDER_SIZE_TMP,0) ); - BGOObjects->RectangleWidth(vec3(tmpSize.x()+2*BORDER_SIZE_TMP, tmpSize.y()+2*BORDER_SIZE_TMP, 0) ); - BGOObjects->SetColor(m_colorBackGroung); - BGOObjects->SetPos(vec3(tmpOrigin.x(), tmpOrigin.y(),0) ); - BGOObjects->RectangleWidth(vec3(tmpSize.x(), tmpSize.y(), 0) ); - } + // SUBwIDGET GENERATION ... if (NULL != m_subWidget) { m_subWidget->OnRegenerateDisplay(); } } - -ewol::Widget * widget::PopUp::GetWidgetAtPos(const vec2& pos) +ewol::Widget* widget::PopUp::GetWidgetAtPos(const vec2& pos) { - // calculate relative position - vec2 relativePos = RelativePosition(pos); - // for the element in the pop-up ... - if (NULL != m_subWidget) { - vec2 tmpSize = m_subWidget->GetSize(); - vec2 tmpOrigin = m_subWidget->GetOrigin(); - if( (tmpOrigin.x() <= relativePos.x() && tmpOrigin.x() + tmpSize.x() >= relativePos.x()) - && (tmpOrigin.y() <= relativePos.y() && tmpOrigin.y() + tmpSize.y() >= relativePos.y()) ) - { - return m_subWidget->GetWidgetAtPos(pos); - } else { - //EWOL_INFO("Event ouside the Pop-up"); - } + ewol::Widget* val = widget::Container::GetWidgetAtPos(pos); + if (NULL != val) { + return val; } - // otherwise the event go to this widget ... return this; } - - -void widget::PopUp::SetDisplayRatio(float ratio) -{ - m_displayRatio = ratio; - MarkToRedraw(); -} - - -void widget::PopUp::OnObjectRemove(ewol::EObject * removeObject) -{ - // First step call parrent : - widget::Drawable::OnObjectRemove(removeObject); - // second step find if in all the elements ... - if(m_subWidget == removeObject) { - EWOL_DEBUG("Remove pop-up sub Element ==> destroyed object"); - m_subWidget = NULL; - } -} - diff --git a/sources/ewol/widget/PopUp.h b/sources/ewol/widget/PopUp.h index 3da9cc77..306d52c1 100644 --- a/sources/ewol/widget/PopUp.h +++ b/sources/ewol/widget/PopUp.h @@ -13,43 +13,28 @@ #include #include #include -#include +#include +#include namespace widget { - class PopUp : public widget::Drawable + class PopUp : public widget::Container { public: PopUp(void); virtual ~PopUp(void); - // Derived function - virtual const char * const GetObjectType(void) { return "EwolPopUp"; }; - public: - // Derived function + private: + draw::Color m_colorBackGroung; + draw::Color m_colorBorder; + draw::Color m_colorEmptyArea; + ewol::Drawing m_compositing; + protected: // Derived function + virtual void OnDraw(ewol::DrawProperty& displayProp); + public: // Derived function + virtual void OnRegenerateDisplay(void); virtual void CalculateSize(const vec2& availlable); virtual void CalculateMinMaxSize(void); - virtual void SetMinSize(const vec2& size); - virtual void SetExpand(const bvec2& newExpend); - void SetDisplayRatio(float ratio); - private: - draw::Color m_colorBackGroung; - draw::Color m_colorBorder; - draw::Color m_colorEmptyArea; - ewol::Widget* m_subWidgetNext; - ewol::Widget* m_subWidget; - float m_displayRatio; - public: - void SubWidgetSet(ewol::Widget* newWidget); - void SubWidgetRemove(void); - protected: - // Derived function - virtual void OnDraw(ewol::DrawProperty& displayProp); - public: - // Derived function - virtual void OnRegenerateDisplay(void); - // Derived function - virtual ewol::Widget * GetWidgetAtPos(const vec2& pos); - // Derived function - virtual void OnObjectRemove(ewol::EObject * removeObject); + virtual const char * const GetObjectType(void) { return "ewol::PopUp"; }; + virtual ewol::Widget* GetWidgetAtPos(const vec2& pos); }; }; diff --git a/sources/ewol/widget/Spacer.cpp b/sources/ewol/widget/Spacer.cpp index b10c9d59..02f66095 100644 --- a/sources/ewol/widget/Spacer.cpp +++ b/sources/ewol/widget/Spacer.cpp @@ -33,7 +33,7 @@ void widget::Spacer::UnInit(void) widget::Spacer::Spacer(void) { - m_localSize = 10; + m_userMinSize = vec2(10,10); SetCanHaveFocus(false); m_color = draw::color::black; m_color.a = 0; @@ -44,20 +44,6 @@ widget::Spacer::~Spacer(void) } - -void widget::Spacer::CalculateMinMaxSize(void) -{ - m_minSize.setValue(m_localSize, m_localSize); -} - - -void widget::Spacer::SetSize(float size) -{ - m_localSize = size; - MarkToRedraw(); -} - - void widget::Spacer::OnDraw(ewol::DrawProperty& displayProp) { m_draw.Draw(); diff --git a/sources/ewol/widget/Spacer.h b/sources/ewol/widget/Spacer.h index 44d941aa..5956c49f 100644 --- a/sources/ewol/widget/Spacer.h +++ b/sources/ewol/widget/Spacer.h @@ -23,8 +23,6 @@ namespace widget { static void UnInit(void); private: ewol::Drawing m_draw; //!< Compositing drawing element - float m_localSize; //!< Local request size of the display - draw::Color m_color; //!< Background color public: /** * @brief Main constructer @@ -34,11 +32,9 @@ namespace widget { * @brief Main destructer */ virtual ~Spacer(void); - /** - * @brief Set the minimum size requested - * @param[in] size Requested size of the minimum display (in X and Y) - */ - void SetSize(float size); + protected: + draw::Color m_color; //!< Background color + public: /** * @brief Spziby the background color (basicly transparent) * @param[in] newColor the display background color @@ -46,8 +42,7 @@ namespace widget { void SetColor(draw::Color newColor) { m_color = newColor; MarkToRedraw(); }; public: // Derived function - virtual const char * const GetObjectType(void) { return "Ewol::Spacer"; }; - virtual void CalculateMinMaxSize(void); + virtual const char * const GetObjectType(void) { return "ewol::spacer"; }; virtual ewol::Widget * GetWidgetAtPos(const vec2& pos) { return NULL; }; virtual void OnRegenerateDisplay(void); virtual void OnDraw(ewol::DrawProperty& displayProp); diff --git a/sources/ewol/widget/WidgetManager.cpp b/sources/ewol/widget/WidgetManager.cpp index dab5d570..fe124f88 100644 --- a/sources/ewol/widget/WidgetManager.cpp +++ b/sources/ewol/widget/WidgetManager.cpp @@ -214,7 +214,7 @@ void ewol::widgetManager::PeriodicCallAdd(ewol::Widget * pWidget) void ewol::widgetManager::PeriodicCallRm(ewol::Widget * pWidget) { int32_t nbElement = 0; - for (int32_t iii=0; iii < l_listOfPeriodicWidget.Size(); iii++) { + for (int32_t iii=l_listOfPeriodicWidget.Size()-1; iii>=0 ; iii--) { if (l_listOfPeriodicWidget[iii] == pWidget) { l_listOfPeriodicWidget[iii] = NULL; } else { @@ -228,7 +228,7 @@ void ewol::widgetManager::PeriodicCallRm(ewol::Widget * pWidget) void ewol::widgetManager::PeriodicCall(int64_t localTime) { - for (int32_t iii=0; iii < l_listOfPeriodicWidget.Size(); iii++) { + for (int32_t iii=l_listOfPeriodicWidget.Size()-1; iii>=0 ; iii--) { if (NULL != l_listOfPeriodicWidget[iii]) { l_listOfPeriodicWidget[iii]->PeriodicCall(localTime); } diff --git a/sources/ewol/widget/WidgetManager.h b/sources/ewol/widget/WidgetManager.h index 72fe0a5b..267e2383 100644 --- a/sources/ewol/widget/WidgetManager.h +++ b/sources/ewol/widget/WidgetManager.h @@ -28,8 +28,8 @@ namespace ewol { ewol::Widget* FocusGet(void); void FocusRemoveIfRemove(ewol::Widget * newWidget); - void PeriodicCallAdd(ewol::Widget * pWidget); - void PeriodicCallRm( ewol::Widget * pWidget); + void PeriodicCallAdd(ewol::Widget* pWidget); + void PeriodicCallRm(ewol::Widget* pWidget); void PeriodicCall(int64_t localTime); bool PeriodicCallHave(void); diff --git a/sources/ewol/widget/meta/FileChooser.cpp b/sources/ewol/widget/meta/FileChooser.cpp index 6cd8ba80..fd8964e4 100644 --- a/sources/ewol/widget/meta/FileChooser.cpp +++ b/sources/ewol/widget/meta/FileChooser.cpp @@ -70,11 +70,11 @@ widget::FileChooser::FileChooser(void) widget::Image * myImage = NULL; m_folder = etk::GetUserHomeFolder(); #if defined(__TARGET_OS__Android) - SetDisplayRatio(0.90); + SetMinSize(ewol::Dimension(vec2(90,90),ewol::Dimension::Pourcent));; #elif defined(__TARGET_OS__Windows) - SetDisplayRatio(0.80); + SetMinSize(ewol::Dimension(vec2(80,80),ewol::Dimension::Pourcent));; #else - SetDisplayRatio(0.80); + SetMinSize(ewol::Dimension(vec2(80,80),ewol::Dimension::Pourcent));; #endif m_file = ""; @@ -120,7 +120,7 @@ widget::FileChooser::FileChooser(void) } else { mySizerVert->LockExpand(bvec2(true,true)); // set it in the pop-up-system : - SubWidgetSet(mySizerVert); + SetSubWidget(mySizerVert); mySizerHori = new widget::Sizer(widget::Sizer::modeHori); if (NULL == mySizerHori) { @@ -182,7 +182,7 @@ widget::FileChooser::FileChooser(void) if (NULL == mySpacer) { EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { - mySpacer->SetSize(2); + mySpacer->SetMinSize(vec2(2,2)); mySizerHori->SubWidgetAdd(mySpacer); } m_widgetListFolder = new widget::ListFileSystem(); @@ -201,7 +201,7 @@ widget::FileChooser::FileChooser(void) if (NULL == mySpacer) { EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { - mySpacer->SetSize(2); + mySpacer->SetMinSize(vec2(2,2)); mySizerHori->SubWidgetAdd(mySpacer); } m_widgetListFile = new widget::ListFileSystem(); @@ -221,7 +221,7 @@ widget::FileChooser::FileChooser(void) if (NULL == mySpacer) { EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { - mySpacer->SetSize(2); + mySpacer->SetMinSize(vec2(2,2)); mySizerHori->SubWidgetAdd(mySpacer); } } diff --git a/sources/ewol/widget/meta/Parameter.cpp b/sources/ewol/widget/meta/Parameter.cpp index 70d382f7..41be32ea 100644 --- a/sources/ewol/widget/meta/Parameter.cpp +++ b/sources/ewol/widget/meta/Parameter.cpp @@ -38,9 +38,9 @@ widget::Parameter::Parameter(void) : widget::Sizer * mySizerHori = NULL; widget::Spacer * mySpacer = NULL; #ifdef __TARGET_OS__Android - SetDisplayRatio(0.90); + SetMinSize(ewol::Dimension(vec2(90,90),ewol::Dimension::Pourcent)); #else - SetDisplayRatio(0.80); + SetMinSize(ewol::Dimension(vec2(80,80),ewol::Dimension::Pourcent)); #endif mySizerVert = new widget::Sizer(widget::Sizer::modeVert); @@ -50,7 +50,7 @@ widget::Parameter::Parameter(void) : EWOL_INFO("add widget"); mySizerVert->LockExpand(bvec2(true,true)); // set it in the pop-up-system : - SubWidgetSet(mySizerVert); + SetSubWidget(mySizerVert); mySizerHori = new widget::Sizer(widget::Sizer::modeHori); if (NULL == mySizerHori) { @@ -100,7 +100,7 @@ widget::Parameter::Parameter(void) : EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { mySpacer->SetFill(bvec2(false,true)); - mySpacer->SetSize(5); + mySpacer->SetMinSize(vec2(5,5)); mySpacer->SetColor(0x000000BF); mySizerHori->SubWidgetAdd(mySpacer); } @@ -116,7 +116,7 @@ widget::Parameter::Parameter(void) : EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { mySpacer->SetExpand(bvec2(true,false)); - mySpacer->SetSize(5); + mySpacer->SetMinSize(vec2(5,5)); mySpacer->SetColor(0x000000BF); mySizerVert2->SubWidgetAdd(mySpacer); } @@ -136,7 +136,7 @@ widget::Parameter::Parameter(void) : EWOL_ERROR("Can not allocate widget ==> display might be in error"); } else { mySpacer->SetExpand(bvec2(true,false)); - mySpacer->SetSize(5); + mySpacer->SetMinSize(vec2(5,5)); mySpacer->SetColor(0x000000BF); mySizerVert->SubWidgetAdd(mySpacer); }