[DEV] API change: change gravity methodologie

This commit is contained in:
Edouard DUPIN 2016-02-04 22:55:43 +01:00
parent 77bc863ab9
commit 2e1644be3e
9 changed files with 131 additions and 115 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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;

View File

@ -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();

View File

@ -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
*/

View File

@ -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<ewol::widget::Sizer>(m_composer->getSubObjectNamed("appl-upper-test-widget"));
m_sizerDynamic = std::dynamic_pointer_cast<ewol::widget::Sizer>(m_composer->getSubObjectNamed("appl-dynamic-config"));
m_subWidget = std::dynamic_pointer_cast<ewol::Widget>(m_composer->getSubObjectNamed("[TEST]TO-TEST"));
m_testName = std::dynamic_pointer_cast<ewol::widget::Label>(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<br/>(" + ewol::gravityToString(m_gravity) + ")");
}
void appl::MainWindows::onCallbackWidgetChange(int32_t _increment) {
m_idWidget += _increment;
std::shared_ptr<ewol::Widget> 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();
}

View File

@ -22,7 +22,7 @@ namespace appl {
std::shared_ptr<ewol::widget::Sizer> m_sizerVert;
std::shared_ptr<ewol::widget::Sizer> m_sizerDynamic;
std::shared_ptr<ewol::Widget> m_subWidget;
std::shared_ptr<ewol::widget::Label> 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();

View File

@ -25,6 +25,9 @@
<button name="appl-next-widget">
<label expand="false,false" fill="true,true">Next Widget</label>
</button>
<button name="appl-next-gravity">
<label name="appl-next-gravity-label" expand="false,false" fill="true,true">Next gravity<br/>(Buttom-Left)</label>
</button>
<label name="appl-label-test" expand="true,false" fill="true,true">Test :</label>
<spacer expand="true,true"/>
</sizer>