[DEV] add capabilities at the WSlider widget'

This commit is contained in:
Edouard DUPIN 2013-05-27 21:12:55 +02:00
parent f39ee975d6
commit 0883358f83
6 changed files with 271 additions and 239 deletions

View File

@ -55,11 +55,11 @@ void widget::ContainerN::LockExpand(const bvec2& _lockExpand)
}
void widget::ContainerN::SubWidgetAdd(ewol::Widget* _newWidget)
int32_t widget::ContainerN::SubWidgetAdd(ewol::Widget* _newWidget)
{
if (NULL == _newWidget) {
EWOL_ERROR("[" << GetId() << "] {" << GetObjectType() << "} Try to add An empty Widget ... ");
return;
return -1;
}
if (_newWidget!=NULL) {
_newWidget->SetUpperWidget(this);
@ -67,6 +67,8 @@ void widget::ContainerN::SubWidgetAdd(ewol::Widget* _newWidget)
m_subWidget.PushBack(_newWidget);
MarkToRedraw();
ewol::RequestUpdateSize();
// added at the last eelement :
return m_subWidget.Size()-1;
}
void widget::ContainerN::SubWidgetAddStart(ewol::Widget* _newWidget)

View File

@ -55,9 +55,9 @@ namespace widget
* @brief Add at end position a Widget (note : This system use an inverted phylisophie (button to top, and left to right)
* @param[in] _newWidget the element pointer
*/
virtual void SubWidgetAdd(ewol::Widget* _newWidget);
inline void SubWidgetAddBack(ewol::Widget* _newWidget) { SubWidgetAdd(_newWidget); };
inline void SubWidgetAddEnd(ewol::Widget* _newWidget) { SubWidgetAdd(_newWidget); };
virtual int32_t SubWidgetAdd(ewol::Widget* _newWidget);
inline int32_t SubWidgetAddBack(ewol::Widget* _newWidget) { return SubWidgetAdd(_newWidget); };
inline int32_t SubWidgetAddEnd(ewol::Widget* _newWidget) { return SubWidgetAdd(_newWidget); };
/**
* @brief Add at start position a Widget (note : This system use an inverted phylisophie (button to top, and left to right)
* @param[in] _newWidget the element pointer

View File

@ -36,17 +36,18 @@ void widget::Menu::SubWidgetRemoveAll(void)
widget::Sizer::SubWidgetRemoveAll();
}
void widget::Menu::SubWidgetAdd(ewol::Widget* newWidget)
int32_t widget::Menu::SubWidgetAdd(ewol::Widget* _newWidget)
{
EWOL_ERROR("Not availlable");
return -1;
}
void widget::Menu::SubWidgetRemove(ewol::Widget* _newWidget)
{
EWOL_ERROR("Not availlable");
}
void widget::Menu::SubWidgetRemove(ewol::Widget* newWidget)
{
EWOL_ERROR("Not availlable");
}
void widget::Menu::SubWidgetUnLink(ewol::Widget* newWidget)
void widget::Menu::SubWidgetUnLink(ewol::Widget* _newWidget)
{
EWOL_ERROR("Not availlable");
}

View File

@ -38,9 +38,9 @@ namespace widget {
virtual const char * const GetObjectType(void) { return "EwolMenu"; };
private:
virtual void SubWidgetRemoveAll(void);
virtual void SubWidgetAdd(ewol::Widget* newWidget);
virtual void SubWidgetRemove(ewol::Widget* newWidget);
virtual void SubWidgetUnLink(ewol::Widget* newWidget);
virtual int32_t SubWidgetAdd(ewol::Widget* _newWidget);
virtual void SubWidgetRemove(ewol::Widget* _newWidget);
virtual void SubWidgetUnLink(ewol::Widget* _newWidget);
private:
etk::Vector<widget::MenuElement*> m_listElement;
int32_t m_staticId; // unique ID for every element of the menu ...

View File

@ -11,51 +11,108 @@
#include <ewol/ewol.h>
static const char* l_listsladingMode[widget::WSlider::sladingTransition_count] = {
"transition vertical",
"transition horisantal"
};
etk::CCout& operator <<(etk::CCout& _os, const widget::WSlider::sladingMode_te _obj)
{
_os << l_listsladingMode[_obj];
return _os;
}
#undef __class__
#define __class__ "WSlider"
widget::WSlider::WSlider(void)
// Event list of properties
const char* const widget::WSlider::eventStartSlide = "ewol-widget-wslider-event-start-slide";
const char* const widget::WSlider::eventStopSlide = "ewol-widget-wslider-event-stop-slide";
// Config list of properties
const char* const widget::WSlider::configMode = "mode";
static ewol::Widget* Create(void)
{
// set contamination enable
LockExpandContamination(bvec2(false,false));
m_windowsDestination = 0;
m_slidingProgress = 0;
m_windowsSources = 0;
m_underExpand.setValue(false,false);
return new widget::WSlider();
}
void widget::WSlider::Init(void)
{
ewol::widgetManager::AddWidgetCreator(__class__,&Create);
}
void widget::WSlider::UnInit(void)
{
ewol::widgetManager::AddWidgetCreator(__class__,NULL);
}
widget::WSlider::WSlider(void) :
m_windowsSources(0),
m_windowsDestination(0),
m_slidingProgress(0.0f),
m_transitionSpeed(1.0f),
m_transitionSlide(sladingTransitionHori)
{
AddEventId(eventStartSlide);
AddEventId(eventStopSlide);
// Add configuration
RegisterConfig(configMode, "list", "vert;hori", "Transition mode of the slider");
}
widget::WSlider::~WSlider(void)
{
SubWidgetRemoveAll();
}
void widget::WSlider::CalculateSize(const vec2& availlable)
void widget::WSlider::CalculateSize(const vec2& _availlable)
{
//EWOL_DEBUG("Update Size");
m_size = availlable;
widget::ContainerN::CalculateSize(_availlable);
if (m_windowsDestination == m_windowsSources) {
int32_t iii = m_windowsDestination;
if (iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SetOrigin(m_origin);
m_subWidget[iii]->SetOrigin(m_origin+m_offset);
m_subWidget[iii]->CalculateSize(m_size);
}
}
} else {
float factor = -1.0f;
if (m_windowsSources < m_windowsDestination) {
factor = 1.0f;
}
int32_t iii = m_windowsSources;
if (iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SetOrigin(vec2(m_origin.x() - (m_size.x()*(float)m_slidingProgress/1000.0), m_origin.y()));
if (m_transitionSlide == sladingTransitionHori) {
m_subWidget[iii]->SetOrigin( vec2(m_origin.x() + factor*(m_size.x()*m_slidingProgress),
m_origin.y())
+ m_offset);
} else {
m_subWidget[iii]->SetOrigin( vec2(m_origin.x(),
m_origin.y() + factor*(m_size.y()*m_slidingProgress))
+ m_offset);
}
m_subWidget[iii]->CalculateSize(m_size);
}
}
iii = m_windowsDestination;
if (iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SetOrigin(vec2(m_origin.x() - (m_size.x()*((float)m_slidingProgress/1000.0) - m_size.x()), m_origin.y()));
if (m_transitionSlide == sladingTransitionHori) {
m_subWidget[iii]->SetOrigin( vec2(m_origin.x() + factor*(m_size.x()*m_slidingProgress - m_size.x()),
m_origin.y())
+ m_offset);
} else {
m_subWidget[iii]->SetOrigin( vec2(m_origin.x(),
m_origin.y() + factor*(m_size.y()*m_slidingProgress - m_size.y()))
+ m_offset);
}
m_subWidget[iii]->CalculateSize(m_size);
}
}
@ -63,134 +120,79 @@ void widget::WSlider::CalculateSize(const vec2& availlable)
MarkToRedraw();
}
void widget::WSlider::CalculateMinMaxSize(void)
void widget::WSlider::SubWidgetSelectSet(int32_t _id)
{
EWOL_DEBUG("Calculate MinSize");
m_underExpand.setValue(false,false);
m_minSize.setValue(0,0);
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->CalculateMinMaxSize();
if (true == m_subWidget[iii]->CanExpand().x()) {
m_underExpand.setX(true);
}
if (true == m_subWidget[iii]->CanExpand().y()) {
m_underExpand.setY(true);
}
vec2 tmpSize = m_subWidget[iii]->GetCalculateMinSize();
m_minSize.setValue(etk_max(tmpSize.x(), m_minSize.x()),
etk_max(tmpSize.y(), m_minSize.y()));
}
}
}
void widget::WSlider::SetMinSize(const vec2& size)
{
EWOL_ERROR("Layer can not have a user Minimum size (herited from under elements)");
}
bvec2 widget::WSlider::CanExpand(void)
{
bvec2 res = m_userExpand;
if (true == m_underExpand.x()) {
res.setX(true);
}
if (true == m_underExpand.y()) {
res.setY(true);
}
if (true == m_lockExpandContamination.x()) {
res.setX(false);
}
if (true == m_lockExpandContamination.y()) {
res.setY(false);
}
return res;
}
void widget::WSlider::LockExpandContamination(const bvec2& lockExpand)
{
m_lockExpandContamination = lockExpand;
}
//etk::Vector<ewol::Widget*> m_SubWidget;
void widget::WSlider::SubWidgetRemoveAll(void)
{
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
delete(m_subWidget[iii]);
m_subWidget[iii] = NULL;
}
m_subWidget.Clear();
}
int32_t widget::WSlider::SubWidgetAdd(ewol::Widget* newWidget)
{
if (NULL == newWidget) {
return -1;
}
m_subWidget.PushBack(newWidget);
MarkToRedraw();
ewol::RequestUpdateSize();
return m_subWidget.Size()-1;
}
void widget::WSlider::SubWidgetRemove(ewol::Widget* newWidget)
{
if (NULL == newWidget) {
return;
}
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
if (newWidget == m_subWidget[iii]) {
delete(m_subWidget[iii]);
m_subWidget[iii] = NULL;
m_subWidget.Erase(iii);
MarkToRedraw();
ewol::RequestUpdateSize();
return;
}
}
}
void widget::WSlider::SubWidgetUnLink(ewol::Widget* newWidget)
{
if (NULL == newWidget) {
return;
}
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
if (newWidget == m_subWidget[iii]) {
m_subWidget[iii] = NULL;
m_subWidget.Erase(iii);
ewol::RequestUpdateSize();
MarkToRedraw();
return;
}
}
}
void widget::WSlider::SubWidgetSelectSet(int32_t id)
{
if (id<0 || id > m_subWidget.Size()) {
if (_id<0 || _id >= m_subWidget.Size()) {
EWOL_ERROR("Can not change to a widget not present");
}
m_windowsDestination = id;
m_windowsDestination = _id;
m_slidingProgress = 0;
GenerateEventId(eventStartSlide);
PeriodicCallSet(true);
MarkToRedraw();
}
void widget::WSlider::PeriodicCall(int64_t localTime)
void widget::WSlider::SubWidgetSelectSet(ewol::Widget* _widgetPointer)
{
if (m_slidingProgress >= 1000) {
if (_widgetPointer == NULL) {
EWOL_ERROR("Can not change to a widget NULL");
return;
}
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
if (m_subWidget[iii] != NULL) {
if (m_subWidget[iii] == _widgetPointer) {
SubWidgetSelectSet(iii);
return;
}
}
}
EWOL_ERROR("Can not change to a widget not present");
}
void widget::WSlider::SubWidgetSelectSet(const etk::UString& _widgetName)
{
if (_widgetName == "") {
EWOL_ERROR("Can not change to a widget with no name (input)");
return;
}
for (int32_t iii=0; iii<m_subWidget.Size(); iii++) {
if (m_subWidget[iii] != NULL) {
if (m_subWidget[iii]->GetName() == _widgetName) {
SubWidgetSelectSet(iii);
return;
}
}
}
EWOL_ERROR("Can not change to a widget not present");
}
void widget::WSlider::SetTransitionMode(widget::WSlider::sladingMode_te _mode)
{
if (m_transitionSlide != _mode) {
m_transitionSlide = _mode;
MarkToRedraw();
}
}
void widget::WSlider::PeriodicCall(int64_t _localTime)
{
if (m_slidingProgress >= 1.0) {
// end of periodic :
PeriodicCallSet(false);
m_windowsSources = m_windowsDestination;
m_lastPeriodicCall = -1;
GenerateEventId(eventStopSlide);
} else {
m_slidingProgress += 30;
m_slidingProgress = etk_avg(0, m_slidingProgress, 1000);
if (m_lastPeriodicCall != -1) {
float delta = (double)(_localTime - m_lastPeriodicCall)/1000000.0;
m_slidingProgress += m_transitionSpeed*delta;
m_slidingProgress = etk_avg(0.0f, m_slidingProgress, 1.0f);
}
m_lastPeriodicCall = _localTime;
}
CalculateSize(m_size);
MarkToRedraw();
@ -199,105 +201,106 @@ void widget::WSlider::PeriodicCall(int64_t localTime)
void widget::WSlider::SystemDraw(const ewol::DrawProperty& _displayProp)
{
if (true==m_hide){
// widget is hidden ...
return;
}
// note : do not call the widget container ==> overload this one ...
ewol::Widget::SystemDraw(_displayProp);
// subwidget draw
ewol::DrawProperty prop = _displayProp;
prop.Limit(m_origin, m_size);
if (m_windowsDestination == m_windowsSources) {
//EWOL_DEBUG("Draw : " << m_windowsDestination);
int32_t iii = m_windowsDestination;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(_displayProp);
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(prop);
}
}
} else {
//EWOL_DEBUG("Draw : " << m_windowsSources << "=>" << m_windowsDestination << "progress=" << ((float)m_slidingProgress/1000.) );
// draw Sources :
int32_t iii = m_windowsSources;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(_displayProp);
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(prop);
}
}
// Draw Destination :
iii = m_windowsDestination;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(_displayProp);
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->SystemDraw(prop);
}
}
}
}
void widget::WSlider::OnRegenerateDisplay(void)
{
if (m_windowsDestination == m_windowsSources) {
int32_t iii = m_windowsDestination;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
}
}
} else {
int32_t iii = m_windowsSources;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
}
}
iii = m_windowsDestination;
if (iii<0 || iii > m_subWidget.Size()) {
return;
}
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
}
}
}
ewol::Widget * widget::WSlider::GetWidgetAtPos(const vec2& pos)
{
// TODO : Review this ...
if (m_windowsDestination<0 || m_windowsDestination > m_subWidget.Size()) {
// error ...
return NULL;
}
int32_t iii = m_windowsDestination;
if (NULL != m_subWidget[iii]) {
vec2 tmpSize = m_subWidget[iii]->GetSize();
vec2 tmpOrigin = m_subWidget[iii]->GetOrigin();
if( (tmpOrigin.x() <= pos.x() && tmpOrigin.x() + tmpSize.x() >= pos.x())
&& (tmpOrigin.y() <= pos.y() && tmpOrigin.y() + tmpSize.y() >= pos.y()) )
{
ewol::Widget * tmpWidget = m_subWidget[iii]->GetWidgetAtPos(pos);
if (NULL != tmpWidget) {
return tmpWidget;
if (iii>=0 || iii < m_subWidget.Size()) {
if (NULL != m_subWidget[iii]) {
m_subWidget[iii]->OnRegenerateDisplay();
}
}
}
// otherwise the event go to this widget ...
return this;
}
void widget::WSlider::OnObjectRemove(ewol::EObject * removeObject)
bool widget::WSlider::OnSetConfig(const ewol::EConfig& _conf)
{
// First step call parrent :
ewol::Widget::OnObjectRemove(removeObject);
// second step find if in all the elements ...
for(int32_t iii=m_subWidget.Size()-1; iii>=0; iii--) {
if(m_subWidget[iii] == removeObject) {
EWOL_DEBUG("Remove sizer sub Element [" << iii << "] ==> destroyed object");
m_subWidget[iii] = NULL;
m_subWidget.Erase(iii);
}
if (true == widget::ContainerN::OnSetConfig(_conf)) {
return true;
}
if (_conf.GetConfig() == configMode) {
sladingMode_te tmpTransition = sladingTransitionHori;
if(true == _conf.GetData().CompareNoCase("vert")) {
tmpTransition = sladingTransitionVert;
} else if(true == _conf.GetData().CompareNoCase("hori")) {
tmpTransition = sladingTransitionHori;
}
SetTransitionMode(tmpTransition);
return true;
}
return false;
}
bool widget::WSlider::OnGetConfig(const char* _config, etk::UString& _result) const
{
if (true == widget::ContainerN::OnGetConfig(_config, _result)) {
return true;
}
if (_config == configMode) {
switch(m_transitionSlide){
default:
case sladingTransitionHori:
_result = "hori";
break;
case sladingTransitionVert:
_result = "vert";
break;
}
return true;
}
return false;
}

View File

@ -11,47 +11,73 @@
#include <etk/types.h>
#include <ewol/debug.h>
#include <ewol/widget/Widget.h>
#include <ewol/widget/ContainerN.h>
namespace widget {
class WSlider :public ewol::Widget
class WSlider :public widget::ContainerN
{
public:
static void Init(void);
static void UnInit(void);
// Event list of properties
static const char* const eventStartSlide;
static const char* const eventStopSlide;
// Config list of properties
static const char* const configMode;
typedef enum {
sladingTransitionVert,
sladingTransitionHori,
sladingTransition_count,
} sladingMode_te;
public:
WSlider(void);
virtual ~WSlider(void);
// Derived function
virtual const char * const GetObjectType(void) { return "EwolWSlider"; };
private:
bvec2 m_underExpand; // expand of the uner elements ...
int32_t m_windowsSources; //!< widget source viewed
int32_t m_windowsDestination; //!< widget destinated viewed
float m_slidingProgress; //!< ratio progression of a sliding
int64_t m_lastPeriodicCall;
float m_transitionSpeed; //!< speed of the transition (default 1 ==> 1s)
sladingMode_te m_transitionSlide; //!< mode to slide the widgets
public:
// Derived function
virtual void CalculateSize(const vec2& availlable);
virtual void CalculateMinMaxSize(void);
virtual void SetMinSize(const vec2& size);
virtual bvec2 CanExpand(void);
void LockExpandContamination(const bvec2& lockExpand);
private:
bvec2 m_lockExpandContamination;
etk::Vector<ewol::Widget*> m_subWidget;
int32_t m_windowsSources; // widget source viewed
int32_t m_windowsDestination; // widget destinated viewed
int32_t m_slidingProgress; // ratio progression of a sliding
public:
virtual void SubWidgetRemoveAll(void);
virtual int32_t SubWidgetAdd(ewol::Widget* newWidget);
virtual void SubWidgetRemove(ewol::Widget* newWidget);
virtual void SubWidgetUnLink(ewol::Widget* newWidget);
void SubWidgetSelectSet(int32_t id);
int32_t SubWidgetSelectGet(void) { return (int32_t)m_slidingProgress; };
int32_t SubWidgetNumber(void) { return m_subWidget.Size(); };
/**
* @brief Select a new subwidget to display
* @param[in] _id Id of the subwidget requested
*/
void SubWidgetSelectSet(int32_t _id);
/**
* @brief Select a new subwidget to display
* @param[in] _widgetPointer Pointer on the widget selected (must be added before)
*/
void SubWidgetSelectSet(ewol::Widget* _widgetPointer);
/**
* @brief Select a new subwidget to display
* @param[in] _widgetName Name of the subwidget name
*/
void SubWidgetSelectSet(const etk::UString& _widgetName);
/**
* @brief Set a new mode of sliding element
* @param[in] _mode new display mode
*/
void SetTransitionMode(sladingMode_te _mode);
/**
* @brief Get a new mode of sliding element
* @return The current sliding mode
*/
sladingMode_te GetTransitionMode(void) { return m_transitionSlide; };
public: // Derived function
virtual void SystemDraw(const ewol::DrawProperty& displayProp);
virtual void OnRegenerateDisplay(void);
virtual ewol::Widget * GetWidgetAtPos(const vec2& pos);
virtual void OnObjectRemove(ewol::EObject * removeObject);
virtual void PeriodicCall(int64_t localTime);
virtual const char * const GetObjectType(void) { return "Ewol::WSlider"; };
virtual void CalculateSize(const vec2& _availlable);
virtual void SystemDraw(const ewol::DrawProperty& _displayProp);
virtual void OnRegenerateDisplay(void);
virtual void PeriodicCall(int64_t _localTime);
virtual bool OnSetConfig(const ewol::EConfig& _conf);
virtual bool OnGetConfig(const char* _config, etk::UString& _result) const;
};
etk::CCout& operator <<(etk::CCout& _os, const widget::WSlider::sladingMode_te _obj);
};
#endif