From 2e1644be3ec42ee47378a83f97cc4d879ce2e038 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 4 Feb 2016 22:55:43 +0100 Subject: [PATCH] [DEV] API change: change gravity methodologie --- ewol/widget/Container.cpp | 17 +----- ewol/widget/Container2.cpp | 17 +----- ewol/widget/Image.cpp | 41 ++----------- ewol/widget/Sizer.cpp | 24 +++++++- ewol/widget/Widget.cpp | 81 +++++++++++++++++--------- ewol/widget/Widget.h | 19 +++--- tools/visual_test/appl/MainWindows.cpp | 41 +++++++++++-- tools/visual_test/appl/MainWindows.h | 3 +- tools/visual_test/data/gui.xml | 3 + 9 files changed, 131 insertions(+), 115 deletions(-) diff --git a/ewol/widget/Container.cpp b/ewol/widget/Container.cpp index 6de99c8a..e558bdbf 100644 --- a/ewol/widget/Container.cpp +++ b/ewol/widget/Container.cpp @@ -112,22 +112,7 @@ void ewol::widget::Container::onChangeSize() { vec2 origin = m_origin+m_offset; vec2 minSize = m_subWidget->getCalculateMinSize(); bvec2 expand = m_subWidget->getExpand(); - if ( expand.x() == false - || minSize.x()>m_size.x()) { - if (m_gravity == ewol::gravityCenter) { - origin -= vec2((minSize.x() - m_size.x())*0.5f, 0.0f); - } else if (((int32_t)m_gravity & (int32_t)ewol::gravityRight) != 0) { - origin -= vec2((minSize.x() - m_size.x()), 0.0f); - } - } - if( expand.y() == false - || minSize.y()>m_size.y()) { - if (m_gravity == ewol::gravityCenter) { - origin -= vec2(0.0f, (minSize.y() - m_size.y())*0.5f); - } else if (((int32_t)m_gravity & (int32_t)ewol::gravityTop) != 0) { - origin -= vec2(0.0f, (minSize.y() - m_size.y())); - } - } + origin += ewol::gravityGenerateDelta(m_gravity, minSize - m_size); m_subWidget->setOrigin(origin); m_subWidget->setSize(m_size); m_subWidget->onChangeSize(); diff --git a/ewol/widget/Container2.cpp b/ewol/widget/Container2.cpp index 91a5d2a5..1d5143fc 100644 --- a/ewol/widget/Container2.cpp +++ b/ewol/widget/Container2.cpp @@ -132,22 +132,7 @@ ewol::Padding ewol::widget::Container2::onChangeSizePadded(const ewol::Padding& vec2 origin2 = origin+m_offset; vec2 minSize = m_subWidget[iii]->getCalculateMinSize(); bvec2 expand = m_subWidget[iii]->getExpand(); - if ( expand.x() == false - || minSize.x() > localAvaillable.x()) { - if (m_gravity == ewol::gravityCenter) { - origin2 -= vec2((minSize.x() - localAvaillable.x())/2.0f, 0); - } else if (((int32_t)m_gravity & (int32_t)ewol::gravityRight) != 0) { - origin2 -= vec2((minSize.x() - localAvaillable.x()), 0); - } - } - if( expand.y() == false - || minSize.y() > localAvaillable.y()) { - if (m_gravity == ewol::gravityCenter) { - origin2 -= vec2(0, (minSize.y() - localAvaillable.y())/2.0f); - } else if (((int32_t)m_gravity & (int32_t)ewol::gravityTop) != 0) { - origin2 -= vec2(0, (minSize.y() - localAvaillable.y())); - } - } + origin2 += ewol::gravityGenerateDelta(m_gravity, minSize - localAvaillable); m_subWidget[iii]->setOrigin(m_origin + origin); m_subWidget[iii]->setSize(subElementSize); m_subWidget[iii]->onChangeSize(); diff --git a/ewol/widget/Image.cpp b/ewol/widget/Image.cpp index ba8d2955..fd8e8934 100644 --- a/ewol/widget/Image.cpp +++ b/ewol/widget/Image.cpp @@ -73,49 +73,16 @@ void ewol::widget::Image::onRegenerateDisplay() { vec2 ratioSizeDisplayRequested = m_posStop.get() - m_posStart.get(); //imageRealSizeMax *= ratioSizeDisplayRequested; + vec2 delta = ewol::gravityGenerateDelta(m_gravity, m_size-m_imageRenderSize); if (m_userFill->x() == true) { imageRealSize.setX(imageRealSizeMax.x()); - } else { - switch(m_gravity) { - case gravityCenter: - case gravityTop: - case gravityButtom: - origin.setX(origin.x() + (m_size.x()-m_imageRenderSize.x())*0.5f); - break; - case gravityTopLeft: - case gravityButtomLeft: - case gravityLeft: - // nothing to do ... - break; - case gravityTopRight: - case gravityRight: - case gravityButtomRight: - origin.setX(origin.x() + (m_size.x()-m_imageRenderSize.x())*0.5f); - break; - } + delta.setX(0.0); } if (m_userFill->y() == true) { imageRealSize.setY(imageRealSizeMax.y()); - } else { - // - switch(m_gravity) { - case gravityCenter: - case gravityRight: - case gravityLeft: - origin.setY(origin.y() + (m_size.y()-m_imageRenderSize.y())*0.5f); - break; - case gravityTopLeft: - case gravityTop: - case gravityTopRight: - origin.setY(origin.y() + (m_size.y()-m_imageRenderSize.y())); - break; - case gravityButtomRight: - case gravityButtom: - case gravityButtomLeft: - // nothing to do ... - break; - } + delta.setY(0.0); } + origin += delta; if (m_keepRatio == true) { vec2 tmpSize = m_compositing.getRealSize(); diff --git a/ewol/widget/Sizer.cpp b/ewol/widget/Sizer.cpp index d28fc398..7386bafc 100644 --- a/ewol/widget/Sizer.cpp +++ b/ewol/widget/Sizer.cpp @@ -167,8 +167,26 @@ void ewol::widget::Sizer::onChangeSize() { } it->setSize(vec2ClipInt32(it->getSize())); } - // -7- Set the origin for every element with the gravity update: - vec2 tmpOrigin = m_origin + tmpBorderSize; + // -7- get under Size + vec2 underSize(0,0); + for (auto &it : m_subWidget) { + if (it == nullptr) { + continue; + } + vec2 size = it->getSize(); + if (m_mode == ewol::widget::Sizer::modeVert) { + underSize += vec2(0.0f, size.y()); + underSize.setX(std::max(underSize.x(), size.x())); + } else { + underSize += vec2(size.x(), 0.0f); + underSize.setY(std::max(underSize.y(), size.y())); + } + } + vec2 deltas = localWidgetSize - underSize; + + // -8- Calculate the local origin, depending of the gravity: + vec2 tmpOrigin = m_origin + tmpBorderSize + ewol::gravityGenerateDelta(m_gravity, deltas); + // -9- Set sub widget origin: for (auto &it : m_subWidget) { if (it == nullptr) { continue; @@ -182,7 +200,7 @@ void ewol::widget::Sizer::onChangeSize() { } // TODO : Set origin with the correct gravity } - // -8- Update all subSize at every element: + // -10- Update all subSize at every element: for (auto &it : m_subWidget) { if (it == nullptr) { continue; diff --git a/ewol/widget/Widget.cpp b/ewol/widget/Widget.cpp index ad295f93..7dcacfab 100644 --- a/ewol/widget/Widget.cpp +++ b/ewol/widget/Widget.cpp @@ -34,23 +34,23 @@ void ewol::DrawProperty::limit(const vec2& _origin, const vec2& _size) { std::string ewol::gravityToString(const enum ewol::gravity _obj) { switch(_obj) { - case ewol::gravityCenter: + case ewol::gravity_center: return "center"; - case ewol::gravityTopLeft: + case ewol::gravity_topLeft: return "top-left"; - case ewol::gravityTop: + case ewol::gravity_top: return "top"; - case ewol::gravityTopRight: + case ewol::gravity_topRight: return "top-right"; - case ewol::gravityRight: + case ewol::gravity_right: return "right"; - case ewol::gravityButtomRight: + case ewol::gravity_buttomRight: return "buttom-right"; - case ewol::gravityButtom: + case ewol::gravity_buttom: return "buttom"; - case ewol::gravityButtomLeft: + case ewol::gravity_buttomLeft: return "buttom-left"; - case ewol::gravityLeft: + case ewol::gravity_left: return "left"; } return "unknow"; @@ -58,25 +58,47 @@ std::string ewol::gravityToString(const enum ewol::gravity _obj) { enum ewol::gravity ewol::stringToGravity(const std::string& _obj) { if (_obj == "center") { - return ewol::gravityCenter; + return ewol::gravity_center; } else if (_obj == "top-left") { - return ewol::gravityTopLeft; + return ewol::gravity_topLeft; } else if (_obj == "top") { - return ewol::gravityTop; + return ewol::gravity_top; } else if (_obj == "top-right") { - return ewol::gravityTopRight; + return ewol::gravity_topRight; } else if (_obj == "right") { - return ewol::gravityRight; + return ewol::gravity_right; } else if (_obj == "buttom-right") { - return ewol::gravityButtomRight; + return ewol::gravity_buttomRight; } else if (_obj == "buttom") { - return ewol::gravityButtom; + return ewol::gravity_buttom; } else if (_obj == "buttom-left") { - return ewol::gravityButtomLeft; + return ewol::gravity_buttomLeft; } else if (_obj == "left") { - return ewol::gravityLeft; + return ewol::gravity_left; } - return ewol::gravityCenter; + return ewol::gravity_center; +} +vec2 ewol::gravityGenerateDelta(const enum ewol::gravity _gravity, const vec2& _deltas) { + vec2 out(0.0f,0.0f); + if (_deltas.x() > 0.0001f) { + if ((uint32_t(_gravity) & uint32_t(ewol::gravity_left)) != 0) { + // nothing to do + } else if ((uint32_t(_gravity) & uint32_t(ewol::gravity_right)) != 0) { + out = vec2(int32_t(_deltas.x()), 0.0f); + } else { + out = vec2(int32_t(_deltas.x()*0.5f), 0.0f); + } + } + if (_deltas.y() > 0.0001f) { + if ((uint32_t(_gravity) & uint32_t(ewol::gravity_buttom)) != 0) { + // nothing to do + } else if ((uint32_t(_gravity) & uint32_t(ewol::gravity_top)) != 0) { + out += vec2(0.0f, int32_t(_deltas.y())); + } else { + out += vec2(0.0f, int32_t(_deltas.y()*0.5f)); + } + } + return out; } std::ostream& ewol::operator <<(std::ostream& _os, const enum ewol::gravity _obj) { @@ -99,7 +121,7 @@ ewol::Widget::Widget() : m_userExpand(*this, "expand", bvec2(false,false), "Request the widget Expand size wile space is available"), m_userFill(*this, "fill", bvec2(true,true), "Fill the widget available size"), m_hide(*this, "hide", false, "The widget start hided"), - m_gravity(*this, "gravity", ewol::gravityButtomLeft, "Gravity orientation"), + m_gravity(*this, "gravity", ewol::gravity_buttomLeft, "Gravity orientation"), m_hasFocus(false), m_canFocus(*this, "focus", false, "enable the widget to have the focus capacity"), // TODO : je pense que c'est une erreur, c'st surement un event to get the cocus ... m_limitMouseEvent(3), @@ -120,15 +142,15 @@ ewol::Widget::Widget() : addObjectType("ewol::Widget"); // TODO : Set a static interface for list ==> this methode create a multiple allocation - m_gravity.add(ewol::gravityCenter, "center"); - m_gravity.add(ewol::gravityTopLeft, "top-left"); - m_gravity.add(ewol::gravityTop, "top"); - m_gravity.add(ewol::gravityTopRight, "top-right"); - m_gravity.add(ewol::gravityRight, "right"); - m_gravity.add(ewol::gravityButtomRight, "buttom-right"); - m_gravity.add(ewol::gravityButtom, "buttom"); - m_gravity.add(ewol::gravityButtomLeft, "buttom-left"); - m_gravity.add(ewol::gravityLeft, "left"); + m_gravity.add(ewol::gravity_center, "center"); + m_gravity.add(ewol::gravity_topLeft, "top-left"); + m_gravity.add(ewol::gravity_top, "top"); + m_gravity.add(ewol::gravity_topRight, "top-right"); + m_gravity.add(ewol::gravity_right, "right"); + m_gravity.add(ewol::gravity_buttomRight, "buttom-right"); + m_gravity.add(ewol::gravity_buttom, "buttom"); + m_gravity.add(ewol::gravity_buttomLeft, "buttom-left"); + m_gravity.add(ewol::gravity_left, "left"); m_annimationTypeStart.add(0, "none"); m_annimationTypeStop.add(0, "none"); } @@ -630,6 +652,7 @@ void ewol::Widget::onParameterChangeValue(const ewol::parameter::Ref& _paramPoin } } else if (_paramPointer == m_gravity) { markToRedraw(); + requestUpdateSize(); } else if (_paramPointer == m_hide) { markToRedraw(); requestUpdateSize(); diff --git a/ewol/widget/Widget.h b/ewol/widget/Widget.h index f3b450f5..a587a87e 100644 --- a/ewol/widget/Widget.h +++ b/ewol/widget/Widget.h @@ -81,19 +81,20 @@ namespace ewol { * @not-in-doc */ enum gravity { - gravityCenter=0x00, //!< gravity is in certer - gravityTopLeft=0x05, - gravityTop=0x01, - gravityTopRight=0x03, - gravityRight=0x02, - gravityButtomRight=0x06, - gravityButtom=0x04, - gravityButtomLeft=0x0C, - gravityLeft=0x08, + gravity_center = 0x00, //!< gravity is in center + gravity_top = 0x01, //!< gravity is in top + gravity_buttom = 0x02, //!< gravity is in buttom + gravity_right = 0x04, //!< gravity is in right + gravity_left = 0x08, //!< gravity is in left + gravity_topRight = gravity_top|gravity_right, //!< gravity is in top-right + gravity_topLeft = gravity_top|gravity_left, //!< gravity is in top-left + gravity_buttomRight = gravity_buttom|gravity_right, //!< gravity is in buttom-right + gravity_buttomLeft = gravity_buttom|gravity_left, //!< gravity is in buttom-left }; std::ostream& operator <<(std::ostream& _os, const enum ewol::gravity _obj); std::string gravityToString(const enum ewol::gravity _obj); enum ewol::gravity stringToGravity(const std::string& _obj); + vec2 gravityGenerateDelta(const enum ewol::gravity _gravity, const vec2& _deltas); /** * @not-in-doc */ diff --git a/tools/visual_test/appl/MainWindows.cpp b/tools/visual_test/appl/MainWindows.cpp index 902242d3..4cbb6c35 100644 --- a/tools/visual_test/appl/MainWindows.cpp +++ b/tools/visual_test/appl/MainWindows.cpp @@ -43,6 +43,7 @@ static const char * l_eventChangeWidgetPrevious = "event-change-widget-test-pre #define __class__ "MainWindows" appl::MainWindows::MainWindows() : + m_gravity(ewol::gravity_buttomLeft), m_idWidget(0) { APPL_DEBUG("CREATE WINDOWS ... "); addObjectType("appl::MainWindows"); @@ -56,11 +57,11 @@ void appl::MainWindows::init() { externSubBind(m_composer, ewol::widget::Button, "appl-theme-toggle", signalValue, shared_from_this(), &appl::MainWindows::onCallbackThemeChange); externSubBind(m_composer, ewol::widget::Button, "appl-previous-widget", signalPressed, shared_from_this(), &appl::MainWindows::onCallbackWidgetChange, -1); externSubBind(m_composer, ewol::widget::Button, "appl-next-widget", signalPressed, shared_from_this(), &appl::MainWindows::onCallbackWidgetChange, 1); + externSubBind(m_composer, ewol::widget::Button, "appl-next-gravity", signalPressed, shared_from_this(), &appl::MainWindows::onCallbackGravityChange); m_sizerVert = std::dynamic_pointer_cast(m_composer->getSubObjectNamed("appl-upper-test-widget")); m_sizerDynamic = std::dynamic_pointer_cast(m_composer->getSubObjectNamed("appl-dynamic-config")); m_subWidget = std::dynamic_pointer_cast(m_composer->getSubObjectNamed("[TEST]TO-TEST")); - m_testName = std::dynamic_pointer_cast(m_composer->getSubObjectNamed("appl-label-test")); } void appl::MainWindows::onCallbackThemeChange(const bool& _value) { @@ -74,6 +75,40 @@ void appl::MainWindows::onCallbackThemeChange(const bool& _value) { ewol::getContext().forceRedrawAll(); } +void appl::MainWindows::onCallbackGravityChange() { + switch(m_gravity) { + case ewol::gravity_center: + m_gravity = ewol::gravity_topLeft; + break; + case ewol::gravity_topLeft: + m_gravity = ewol::gravity_top; + break; + case ewol::gravity_top: + m_gravity = ewol::gravity_topRight; + break; + case ewol::gravity_topRight: + m_gravity = ewol::gravity_right; + break; + case ewol::gravity_right: + m_gravity = ewol::gravity_buttomRight; + break; + case ewol::gravity_buttomRight: + m_gravity = ewol::gravity_buttom; + break; + case ewol::gravity_buttom: + m_gravity = ewol::gravity_buttomLeft; + break; + case ewol::gravity_buttomLeft: + m_gravity = ewol::gravity_left; + break; + case ewol::gravity_left: + m_gravity = ewol::gravity_center; + break; + } + parameterSetOnWidgetNamed("appl-upper-test-widget", "gravity", ewol::gravityToString(m_gravity)); + parameterSetOnWidgetNamed("appl-next-gravity-label", "value", "Next gravity
(" + ewol::gravityToString(m_gravity) + ")"); +} + void appl::MainWindows::onCallbackWidgetChange(int32_t _increment) { m_idWidget += _increment; std::shared_ptr oldWidget = m_subWidget; @@ -124,9 +159,7 @@ void appl::MainWindows::onCallbackWidgetChange(int32_t _increment) { if (m_subWidget != nullptr) { m_sizerVert->subWidgetReplace(oldWidget, m_subWidget); } - if (m_testName!=nullptr) { - m_testName->setLabel("TestButton"); - }; + parameterSetOnWidgetNamed("appl-label-test", "value", tmpDescription); updateProperty(); } diff --git a/tools/visual_test/appl/MainWindows.h b/tools/visual_test/appl/MainWindows.h index 02e00841..3c0970ef 100644 --- a/tools/visual_test/appl/MainWindows.h +++ b/tools/visual_test/appl/MainWindows.h @@ -22,7 +22,7 @@ namespace appl { std::shared_ptr m_sizerVert; std::shared_ptr m_sizerDynamic; std::shared_ptr m_subWidget; - std::shared_ptr m_testName; + ewol::gravity m_gravity; int32_t m_idWidget; public: // Constructeur @@ -32,6 +32,7 @@ namespace appl { DECLARE_FACTORY(MainWindows); ~MainWindows() {}; protected: + void onCallbackGravityChange(); void onCallbackThemeChange(const bool& _value); void onCallbackWidgetChange(int32_t _increment); void updateProperty(); diff --git a/tools/visual_test/data/gui.xml b/tools/visual_test/data/gui.xml index f88eb50e..585b3a72 100644 --- a/tools/visual_test/data/gui.xml +++ b/tools/visual_test/data/gui.xml @@ -25,6 +25,9 @@ +