[DEV] extract the coloring of the sizer widget

This commit is contained in:
Edouard DUPIN 2016-02-06 00:44:43 +01:00
parent 19989a475a
commit 6e2fdccb98
7 changed files with 226 additions and 152 deletions

View File

@ -16,7 +16,6 @@
ewol::widget::Sizer::Sizer() :
m_mode(*this, "mode", modeHori, "The display mode"),
m_borderSize(*this, "border", vec2(0,0), "The sizer border size"),
m_borderColor(*this, "border-color", etk::color::none, "Color of the border"),
m_animation(animationNone),
m_animationTime(0) {
addObjectType("ewol::widget::Sizer");
@ -251,125 +250,6 @@ void ewol::widget::Sizer::calculateMinMaxSize() {
//EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} Result min size : " << m_minSize);
}
void ewol::widget::Sizer::onRegenerateDisplay() {
ewol::widget::ContainerN::onRegenerateDisplay();
m_draw.clear();
vec2 tmpBorderSize = m_borderSize->getPixel();
if (tmpBorderSize == vec2(0.0f, 0.0f)) {
return;
}
if (m_borderColor->a() == 0) {
return;
}
m_draw.setColor(m_borderColor);
m_draw.setPos(vec3(0, 0, 0) );
m_draw.rectangleWidth(vec3(tmpBorderSize.x(), m_size.y(),0) );
m_draw.setPos(vec3(m_size.x() - tmpBorderSize.x(), 0, 0) );
m_draw.rectangleWidth(vec3(tmpBorderSize.x(), m_size.y(),0) );
m_draw.setPos(vec3(tmpBorderSize.x(), 0, 0) );
m_draw.rectangleWidth(vec3(m_size.x()-tmpBorderSize.x()*2.0f, tmpBorderSize.y(),0) );
m_draw.setPos(vec3(tmpBorderSize.x(), m_size.y()-tmpBorderSize.y(), 0) );
m_draw.rectangleWidth(vec3(m_size.x()-tmpBorderSize.x()*2.0f, tmpBorderSize.y(),0) );
vec2 underSize(0,0);
vec2 underOrigin(999999999999.0,999999999999.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()));
}
underOrigin.setX(std::min(it->getOrigin().x(), underOrigin.x()));
underOrigin.setY(std::min(it->getOrigin().y(), underOrigin.y()));
}
vec2 localWidgetSize = m_size - tmpBorderSize*2.0f;
vec2 localWidgetOrigin = m_origin + tmpBorderSize;
for (auto &it : m_subWidget) {
if (it == nullptr) {
continue;
}
vec2 origin = it->getOrigin();
vec2 size = it->getSize();
// now we display around the widget every element needed
if (m_mode == ewol::widget::Sizer::modeHori) {
if (size.y() < localWidgetSize.y()) {
// under
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_buttom)) == 0) {
m_draw.setColor(etk::Color<>(0xFF, 0xFF, 0x00, 0xA0));
m_draw.setPos(vec2(origin.x(), localWidgetOrigin.y()) - m_origin);
m_draw.rectangleWidth(vec2(it->getSize().x(), origin.y()-localWidgetOrigin.y()) );
}
// upper
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_top)) == 0) {
m_draw.setColor(etk::color::orange);
float startDraw = origin.y()+it->getSize().y() - m_origin.y();
m_draw.setPos(vec2(origin.x()-m_origin.x(), startDraw));
m_draw.rectangleWidth(vec2(it->getSize().x(), localWidgetSize.y()-startDraw+tmpBorderSize.y()) );
}
}
} else {
if (size.x() < localWidgetSize.x()) {
// left
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_left)) == 0) {
m_draw.setColor(etk::Color<>(0xFF, 0xFF, 0x00, 0xA0));
m_draw.setPos(vec2(localWidgetOrigin.x(), origin.y()) - m_origin);
m_draw.rectangleWidth(vec2(origin.x()-localWidgetOrigin.x(), it->getSize().y()) );
}
// right
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_right)) == 0) {
m_draw.setColor(etk::color::orange);
float startDraw = origin.x()+it->getSize().x() - m_origin.x();
m_draw.setPos(vec2(startDraw, origin.y()-m_origin.y()));
m_draw.rectangleWidth(vec2(localWidgetSize.x()-startDraw+tmpBorderSize.x(), it->getSize().y()) );
}
}
}
}
// now we do the rest of the sizer:
if (m_mode == ewol::widget::Sizer::modeHori) {
if (underSize.x() < localWidgetSize.x()) {
// left
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_left)) == 0) {
m_draw.setColor(etk::color::purple);
m_draw.setPos(localWidgetOrigin - m_origin);
m_draw.rectangleWidth(vec2(underOrigin.x()-localWidgetOrigin.x(), localWidgetSize.y()) );
}
// right
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_right)) == 0) {
m_draw.setColor(etk::color::cyan);
float startDraw = underOrigin.x() + underSize.x() - m_origin.x();
m_draw.setPos(vec2(startDraw, localWidgetOrigin.y()-m_origin.y()));
m_draw.rectangleWidth(vec2(localWidgetSize.x()-startDraw+tmpBorderSize.x(), localWidgetSize.y()) );
}
}
} else {
if (underSize.y() < localWidgetSize.y()) {
// under
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_buttom)) == 0) {
m_draw.setColor(etk::color::purple);
m_draw.setPos(localWidgetOrigin - m_origin);
m_draw.rectangleWidth(vec2(localWidgetSize.x(), underOrigin.y()-localWidgetOrigin.y()) );
}
// upper
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_top)) == 0) {
m_draw.setColor(etk::color::cyan);
float startDraw = underOrigin.y() + underSize.y() - m_origin.y();
m_draw.setPos(vec2(localWidgetOrigin.x()-m_origin.x(), startDraw));
m_draw.rectangleWidth(vec2(localWidgetSize.x(), localWidgetSize.y()-startDraw+tmpBorderSize.y()) );
}
}
}
}
void ewol::widget::Sizer::onDraw() {
m_draw.draw();
ewol::widget::ContainerN::onDraw();
}
int32_t ewol::widget::Sizer::subWidgetAdd(std::shared_ptr<ewol::Widget> _newWidget) {
if (m_animation == animationNone) {
return ewol::widget::ContainerN::subWidgetAdd(_newWidget);

View File

@ -30,7 +30,7 @@ namespace ewol {
modeVert, //!< Vertical mode
modeHori, //!< Horizontal mode
};
private:
protected:
ewol::parameter::List<enum displayMode> m_mode; //!< Methode to display the widget list (vert/hory ...)
protected:
/**
@ -59,7 +59,7 @@ namespace ewol {
enum displayMode getMode() const {
return m_mode;
}
private:
protected:
ewol::parameter::Value<gale::Dimension> m_borderSize; //!< Border size needed for all the display
public:
/**
@ -76,23 +76,6 @@ namespace ewol {
const gale::Dimension& getBorderSize() const {
return m_borderSize;
};
private:
ewol::parameter::Value<etk::Color<>> m_borderColor; //!< Border color.
public:
/**
* @brief Set the current border color:
* @param[in] _value The border color to set @ref etk::color::none : no color
*/
void setBorderColor(const etk::Color<>& _value) {
m_borderColor.set(_value);
}
/**
* @brief get the current border size of the current element:
* @return the border size (0 if not used)
*/
const etk::Color<>& getBorderColor() const {
return m_borderColor;
};
public:
enum animation {
animationNone, //!< No annimation
@ -102,7 +85,7 @@ namespace ewol {
animationRight //!< element came from the right
//animationZoom //!< element came from zooming
};
private:
protected:
enum animation m_animation; //!< Methode add and remove element (animation)
public:
/**
@ -119,7 +102,7 @@ namespace ewol {
enum animation getAnimationMode() {
return m_animation;
};
private:
protected:
float m_animationTime; //!< Time in second to generate animation
public:
/**
@ -136,8 +119,6 @@ namespace ewol {
float getAnimationTime() {
return m_animationTime;
};
private:
ewol::compositing::Drawing m_draw; //!< Compositing drawing element for display the border.
public: // Derived function
virtual void onChangeSize();
virtual void calculateMinMaxSize();
@ -147,8 +128,6 @@ namespace ewol {
virtual void subWidgetRemove(std::shared_ptr<ewol::Widget> _newWidget);
virtual void subWidgetUnLink(std::shared_ptr<ewol::Widget> _newWidget);
virtual void onParameterChangeValue(const ewol::parameter::Ref& _paramPointer);
virtual void onRegenerateDisplay();
virtual void onDraw();
};
}
}

View File

@ -31,6 +31,7 @@ def create(target, module_name):
'tools/visual_test/appl/debug.cpp',
'tools/visual_test/appl/init.cpp',
'tools/visual_test/appl/MainWindows.cpp',
'tools/visual_test/appl/widget/SizerColor.cpp',
'tools/visual_test/appl/TestButton.cpp',
'tools/visual_test/appl/TestCheckBox.cpp',
'tools/visual_test/appl/TestImage.cpp',

View File

@ -13,6 +13,7 @@
#include <ewol/object/Object.h>
#include <ewol/context/Context.h>
#include <ewol/widget/Manager.h>
#include <appl/widget/SizerColor.h>
#include <appl/debug.h>
#include <appl/MainWindows.h>
@ -47,6 +48,9 @@ class MainApplication : public ewol::context::Application {
// set the application icon ...
_context.setIcon("DATA:icon.png");
appl::widget::SizerColor::createManagerWidget(_context.getWidgetManager());
APPL_INFO("==> CREATE ... (END)");
}

View File

@ -0,0 +1,145 @@
/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license APACHE v2.0 (see license file)
*/
#include <appl/debug.h>
#include <appl/widget/SizerColor.h>
#undef __class__
#define __class__ "SizerColor"
appl::widget::SizerColor::SizerColor() :
m_borderColor(*this, "border-color", etk::color::none, "Color of the border") {
addObjectType("appl::widget::SizerColor");
}
void appl::widget::SizerColor::init(enum displayMode _mode) {
ewol::widget::Sizer::init();
}
appl::widget::SizerColor::~SizerColor() {
}
void appl::widget::SizerColor::onRegenerateDisplay() {
ewol::widget::Sizer::onRegenerateDisplay();
m_draw.clear();
vec2 tmpBorderSize = m_borderSize->getPixel();
if (tmpBorderSize == vec2(0.0f, 0.0f)) {
return;
}
if (m_borderColor->a() == 0) {
return;
}
m_draw.setColor(m_borderColor);
m_draw.setPos(vec3(0, 0, 0) );
m_draw.rectangleWidth(vec3(tmpBorderSize.x(), m_size.y(),0) );
m_draw.setPos(vec3(m_size.x() - tmpBorderSize.x(), 0, 0) );
m_draw.rectangleWidth(vec3(tmpBorderSize.x(), m_size.y(),0) );
m_draw.setPos(vec3(tmpBorderSize.x(), 0, 0) );
m_draw.rectangleWidth(vec3(m_size.x()-tmpBorderSize.x()*2.0f, tmpBorderSize.y(),0) );
m_draw.setPos(vec3(tmpBorderSize.x(), m_size.y()-tmpBorderSize.y(), 0) );
m_draw.rectangleWidth(vec3(m_size.x()-tmpBorderSize.x()*2.0f, tmpBorderSize.y(),0) );
vec2 underSize(0,0);
vec2 underOrigin(999999999999.0,999999999999.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()));
}
underOrigin.setX(std::min(it->getOrigin().x(), underOrigin.x()));
underOrigin.setY(std::min(it->getOrigin().y(), underOrigin.y()));
}
vec2 localWidgetSize = m_size - tmpBorderSize*2.0f;
vec2 localWidgetOrigin = m_origin + tmpBorderSize;
for (auto &it : m_subWidget) {
if (it == nullptr) {
continue;
}
vec2 origin = it->getOrigin();
vec2 size = it->getSize();
// now we display around the widget every element needed
if (m_mode == ewol::widget::Sizer::modeHori) {
if (size.y() < localWidgetSize.y()) {
// under
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_buttom)) == 0) {
m_draw.setColor(etk::Color<>(0xFF, 0xFF, 0x00, 0xA0));
m_draw.setPos(vec2(origin.x(), localWidgetOrigin.y()) - m_origin);
m_draw.rectangleWidth(vec2(it->getSize().x(), origin.y()-localWidgetOrigin.y()) );
}
// upper
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_top)) == 0) {
m_draw.setColor(etk::color::orange);
float startDraw = origin.y()+it->getSize().y() - m_origin.y();
m_draw.setPos(vec2(origin.x()-m_origin.x(), startDraw));
m_draw.rectangleWidth(vec2(it->getSize().x(), localWidgetSize.y()-startDraw+tmpBorderSize.y()) );
}
}
} else {
if (size.x() < localWidgetSize.x()) {
// left
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_left)) == 0) {
m_draw.setColor(etk::Color<>(0xFF, 0xFF, 0x00, 0xA0));
m_draw.setPos(vec2(localWidgetOrigin.x(), origin.y()) - m_origin);
m_draw.rectangleWidth(vec2(origin.x()-localWidgetOrigin.x(), it->getSize().y()) );
}
// right
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_right)) == 0) {
m_draw.setColor(etk::color::orange);
float startDraw = origin.x()+it->getSize().x() - m_origin.x();
m_draw.setPos(vec2(startDraw, origin.y()-m_origin.y()));
m_draw.rectangleWidth(vec2(localWidgetSize.x()-startDraw+tmpBorderSize.x(), it->getSize().y()) );
}
}
}
}
// now we do the rest of the sizer:
if (m_mode == ewol::widget::Sizer::modeHori) {
if (underSize.x() < localWidgetSize.x()) {
// left
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_left)) == 0) {
m_draw.setColor(etk::color::purple);
m_draw.setPos(localWidgetOrigin - m_origin);
m_draw.rectangleWidth(vec2(underOrigin.x()-localWidgetOrigin.x(), localWidgetSize.y()) );
}
// right
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_right)) == 0) {
m_draw.setColor(etk::color::cyan);
float startDraw = underOrigin.x() + underSize.x() - m_origin.x();
m_draw.setPos(vec2(startDraw, localWidgetOrigin.y()-m_origin.y()));
m_draw.rectangleWidth(vec2(localWidgetSize.x()-startDraw+tmpBorderSize.x(), localWidgetSize.y()) );
}
}
} else {
if (underSize.y() < localWidgetSize.y()) {
// under
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_buttom)) == 0) {
m_draw.setColor(etk::color::purple);
m_draw.setPos(localWidgetOrigin - m_origin);
m_draw.rectangleWidth(vec2(localWidgetSize.x(), underOrigin.y()-localWidgetOrigin.y()) );
}
// upper
if ((uint32_t(m_gravity) & uint32_t(ewol::gravity_top)) == 0) {
m_draw.setColor(etk::color::cyan);
float startDraw = underOrigin.y() + underSize.y() - m_origin.y();
m_draw.setPos(vec2(localWidgetOrigin.x()-m_origin.x(), startDraw));
m_draw.rectangleWidth(vec2(localWidgetSize.x(), localWidgetSize.y()-startDraw+tmpBorderSize.y()) );
}
}
}
}
void appl::widget::SizerColor::onDraw() {
m_draw.draw();
ewol::widget::Sizer::onDraw();
}

View File

@ -0,0 +1,61 @@
/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license APACHE v2.0 (see license file)
*/
#pragma once
#include <etk/types.h>
#include <ewol/widget/Sizer.h>
#include <etk/Color.h>
#include <ewol/compositing/Drawing.h>
namespace appl {
namespace widget {
class SizerColor : public ewol::widget::Sizer {
public:
/**
* @brief Main call of recording the widget on the List of "widget named creator"
*/
static void init(ewol::widget::Manager& _widgetManager);
protected:
/**
* @brief Constructor
* @param[in] _mode The mode to display the elements
*/
SizerColor();
void init(enum displayMode _mode=ewol::widget::Sizer::modeHori);
public:
DECLARE_WIDGET_FACTORY(SizerColor, "SizerColor");
/**
* @brief Desstructor
*/
virtual ~SizerColor();
private:
ewol::parameter::Value<etk::Color<>> m_borderColor; //!< Border color.
public:
/**
* @brief Set the current border color:
* @param[in] _value The border color to set @ref etk::color::none : no color
*/
void setBorderColor(const etk::Color<>& _value) {
m_borderColor.set(_value);
}
/**
* @brief get the current border size of the current element:
* @return the border size (0 if not used)
*/
const etk::Color<>& getBorderColor() const {
return m_borderColor;
};
private:
ewol::compositing::Drawing m_draw; //!< Compositing drawing element for display the border.
public:
virtual void onRegenerateDisplay();
virtual void onDraw();
};
}
}

View File

@ -44,12 +44,16 @@
<label expand="true" fill="true">No config</label>
</sizer>
</scroll>
<sizer mode="hori"
expand="true,true"
fill="true,true"
border="10px"
border-color="#F008"
name="appl-upper-test-widget">
<sizerColor mode="hori"
expand="true,true"
fill="true,true"
border="10px"
border-color="#F008"
back-color-right="light-green"
back-color-left="magenta"
back-color-buttom="purple"
back-color-top="cyan"
name="appl-upper-test-widget">
<spacer expand="false,true" fill="true,true" min-size="12%" color="red"/>
<spacer expand="false,false" fill="true,true" min-size="12%" color="green"/>
@ -57,7 +61,7 @@
<!-->
<label name="[TEST]TO-TEST" expand="true" fill="true">No widget</label>
-->
</sizer>
</sizerColor>
</sizer>
</sizer>
</composer>