[DEV] better dynamic position of widget::Label

This commit is contained in:
Edouard DUPIN 2012-12-06 21:46:18 +01:00
parent 9b9b2b9956
commit 160fd67d03
9 changed files with 188 additions and 80 deletions

View File

@ -190,18 +190,17 @@ void widget::Button::OnRegenerateDisplay(void)
ivec2 localSize = m_minSize;
vec3 tmpOrigin((m_size.x - m_minSize.x) / 2.0,
(m_size.y - m_minSize.y) / 2.0,
0.0);
(m_size.y - m_minSize.y) / 2.0,
0);
// no change for the text orogin :
vec3 tmpTextOrigin((m_size.x - m_minSize.x) / 2.0,
(m_size.y - m_minSize.y) / 2.0,
0.0);
(m_size.y - m_minSize.y) / 2.0,
0);
if (true==m_userFill.x) {
localSize.x = m_size.x;
tmpOrigin.x = 0.0;
tmpTextOrigin.x = 0.0;
tmpOrigin.x = 0;
tmpTextOrigin.x = 0;
}
if (true==m_userFill.y) {
localSize.y = m_size.y;
@ -220,10 +219,10 @@ void widget::Button::OnRegenerateDisplay(void)
if( true == m_displayImage.HasSources()
|| true == m_displayImageToggle.HasSources()) {
ivec3 imagePos(tmpOrigin.x-padding.x/4,
tmpOrigin.y-padding.x/4+(m_minSize.y-m_imageDisplaySize-2*padding.y)/2.0,
0);
tmpOrigin.y-padding.x/4+(m_minSize.y-m_imageDisplaySize-2*padding.y)/2.0,
0);
ivec2 imageSize(m_imageDisplaySize,
m_imageDisplaySize);
m_imageDisplaySize);
if( false==m_toggleMode
|| false==m_value) {
m_displayImage.SetPos(imagePos);
@ -239,9 +238,9 @@ void widget::Button::OnRegenerateDisplay(void)
}
vec3 drawClippingPos(padding.x, padding.y, -0.5);
vec3 drawClippingSize((float)(m_size.x - padding.x),
(float)(m_size.y - padding.y),
(float)1.0);
vec3 drawClippingSize((m_size.x - padding.x),
(m_size.y - padding.y),
1);
// clean the element
m_displayText.Reset();

View File

@ -86,18 +86,17 @@ void widget::ButtonColor::OnRegenerateDisplay(void)
ivec2 localSize = m_minSize;
vec3 tmpOrigin((m_size.x - m_minSize.x) / 2.0,
(m_size.y - m_minSize.y) / 2.0,
0.0);
(m_size.y - m_minSize.y) / 2.0,
0);
// no change for the text orogin :
vec3 tmpTextOrigin((m_size.x - m_minSize.x) / 2.0,
(m_size.y - m_minSize.y) / 2.0,
0.0);
(m_size.y - m_minSize.y) / 2.0,
0);
if (true==m_userFill.x) {
localSize.x = m_size.x;
tmpOrigin.x = 0.0;
tmpTextOrigin.x = 0.0;
tmpOrigin.x = 0;
tmpTextOrigin.x = 0;
}
if (true==m_userFill.y) {
localSize.y = m_size.y;

View File

@ -23,15 +23,15 @@ namespace widget {
class ButtonColor : public ewol::Widget
{
private:
ewol::Shaper m_shaper; //!< Compositing theme.
ewol::Text m_text; //!< Compositing Test display.
draw::Color m_textColorFg; //!< Current color.
widget::ContextMenu* m_widgetContextMenu; //!< Specific context menu.
bool m_mouseHover; //!< Flag to know where the mouse is (inside the displayed widget (if not fill)).
bool m_buttonPressed; //!< Flag to know if the button is curently pressed.
ewol::Shaper m_shaper; //!< Compositing theme.
ewol::Text m_text; //!< Compositing Test display.
draw::Color m_textColorFg; //!< Current color.
widget::ContextMenu* m_widgetContextMenu; //!< Specific context menu.
bool m_mouseHover; //!< Flag to know where the mouse is (inside the displayed widget (if not fill)).
bool m_buttonPressed; //!< Flag to know if the button is curently pressed.
// hover area :
vec2 m_selectableAreaPos; //!< Start position of the events
vec2 m_selectableAreaSize; //!< Size of the event positions
vec2 m_selectableAreaPos; //!< Start position of the events
vec2 m_selectableAreaSize; //!< Size of the event positions
public:
/**
* @brief Main constructor.

View File

@ -10,6 +10,7 @@
#include <ewol/compositing/Text.h>
#include <ewol/widget/WidgetManager.h>
#include <ewol/ewol.h>
extern const char * const ewolEventLabelPressed = "ewol Label Pressed";
@ -20,37 +21,34 @@ extern const char * const ewolEventLabelPressed = "ewol Label Pressed";
#define __class__ "Label"
void widget::Label::Init(void)
{
AddEventId(ewolEventLabelPressed);
m_textColorFg = draw::color::black;
SetCanHaveFocus(false);
}
widget::Label::Label(void)
{
m_label = "---";
Init();
}
widget::Label::Label(etk::UString newLabel)
{
m_label = newLabel;
Init();
AddEventId(ewolEventLabelPressed);
SetCanHaveFocus(false);
}
widget::Label::~Label(void)
{
}
bool widget::Label::CalculateMinSize(void)
{
ivec3 minSize = m_oObjectText.CalculateSizeDecorated(m_label);
m_minSize.x = 3 + minSize.x;
m_minSize.y = 3 + minSize.y;
if (m_userMaxSize.x != -1) {
m_text.SetTextAlignement(0, m_userMaxSize.x-4, ewol::Text::alignLeft);
}
ivec3 minSize = m_text.CalculateSizeDecorated(m_label);
if (m_userMaxSize.x!=-1) {
m_minSize.x = etk_min(4 + minSize.x, m_userMaxSize.x);
} else {
m_minSize.x = 4 + minSize.x;
}
if (m_userMaxSize.y!=-1) {
m_minSize.y = etk_min(4 + minSize.y, m_userMaxSize.y);
} else {
m_minSize.y = 4 + minSize.y;
}
return true;
}
@ -59,37 +57,71 @@ void widget::Label::SetLabel(etk::UString newLabel)
{
m_label = newLabel;
MarkToRedraw();
ewol::RequestUpdateSize();
}
etk::UString widget::Label::GetLabel(void)
{
return m_label;
}
void widget::Label::OnDraw(ewol::DrawProperty& displayProp)
{
m_oObjectText.Draw();
m_text.Draw();
}
void widget::Label::OnRegenerateDisplay(void)
{
if (true == NeedRedraw()) {
m_oObjectText.Clear();
int32_t paddingSize = 3;
m_text.Clear();
int32_t paddingSize = 2;
int32_t tmpOriginX = 0;
int32_t tmpOriginY = 0;
// to know the size of one Line :
ivec3 minSize = m_text.CalculateSize('A');
if (m_userMaxSize.x != -1) {
m_text.SetTextAlignement(0, m_userMaxSize.x-2*paddingSize, ewol::Text::alignLeft);
}
ivec3 curentTextSize = m_text.CalculateSizeDecorated(m_label);
ivec2 localSize = m_minSize;
// no change for the text orogin :
vec3 tmpTextOrigin((m_size.x - m_minSize.x) / 2.0,
(m_size.y - m_minSize.y) / 2.0,
0);
if (true==m_userFill.x) {
tmpOriginX = (m_size.x - m_minSize.x) / 2;
localSize.x = m_size.x;
tmpTextOrigin.x = 0;
}
if (true==m_userFill.y) {
tmpOriginY = (m_size.y - m_minSize.y) / 2;
localSize.y = m_size.y;
tmpTextOrigin.y = m_size.y - 2*paddingSize - curentTextSize.y;
}
tmpOriginX += paddingSize;
tmpOriginY += paddingSize;
tmpTextOrigin.x += paddingSize;
tmpTextOrigin.y += paddingSize;
localSize.x -= 2*paddingSize;
localSize.y -= 2*paddingSize;
tmpTextOrigin.y += (m_minSize.y-2*paddingSize) - minSize.y;
vec3 textPos(tmpOriginX, tmpOriginY, 0);
m_oObjectText.SetPos(textPos);
m_oObjectText.PrintDecorated(m_label);
vec2 textPos(tmpTextOrigin.x, tmpTextOrigin.y);
vec3 drawClippingPos(paddingSize, paddingSize, -0.5);
vec3 drawClippingSize((m_size.x - paddingSize),
(m_size.y - paddingSize),
1);
// clean the element
m_text.Reset();
m_text.SetPos(tmpTextOrigin);
m_text.SetTextAlignement(tmpTextOrigin.x, tmpTextOrigin.x+localSize.x, ewol::Text::alignLeft);
m_text.SetClipping(drawClippingPos, drawClippingSize);
m_text.PrintDecorated(m_label);
}
}

View File

@ -19,21 +19,33 @@ extern const char * const ewolEventLabelPressed;
namespace widget {
class Label : public ewol::Widget
{
private:
ewol::Text m_text; //!< Compositing text element.
etk::UString m_label; //!< decorated text to display.
public:
Label(void);
Label(etk::UString newLabel);
/**
* @brief Constructor
* @param[in] newLabel The displayed decorated text.
*/
Label(etk::UString newLabel="---");
/**
* @brief destructor
*/
virtual ~Label(void);
/**
* @brief Change the label displayed
* @param[in] newLabel The displayed decorated text.
*/
void SetLabel(etk::UString newLabel);
/**
* @brief Get the current displayed label
* @return The displayed decorated text.
*/
etk::UString GetLabel(void);
// Derived function
virtual const char * const GetObjectType(void) { return "EwolLabel"; };
void Init(void);
virtual ~Label(void);
// Derived function
virtual bool CalculateMinSize(void);
void SetLabel(etk::UString newLabel);
private:
ewol::Text m_oObjectText;
etk::UString m_label;
draw::Color m_textColorFg; //!< Text color
public:
// Derived function
virtual void OnRegenerateDisplay(void);
// Derived function

View File

@ -16,7 +16,8 @@
#undef __class__
#define __class__ "Widget"
ewol::Widget::Widget(void)
ewol::Widget::Widget(void) :
m_userMaxSize(-1,-1)
{
m_limitMouseEvent = 3;
m_needRegenerateDisplay = true;
@ -237,6 +238,17 @@ vec2 ewol::Widget::GetMinSize(void)
return vec2(0,0);
}
void ewol::Widget::SetMaxSize(vec2 size)
{
m_userMaxSize = size;
ewol::RequestUpdateSize();
}
vec2 ewol::Widget::GetMaxSize(void)
{
return m_userMaxSize;
}
vec2 ewol::Widget::GetSize(void)
{
if (false==IsHide()) {

View File

@ -72,17 +72,18 @@ namespace ewol {
// -- Widget Size:
// ----------------------------------------------------------------------------------------------------------------
private:
bool m_hide; //!< hide a widget on the display
bool m_hide; //!< hide a widget on the display
protected:
// internal element calculated by the system
float m_zoom; //!< generic widget zoom
vec2 m_origin; //!< internal ... I do not really known how i can use it ...
vec2 m_size; //!< internal : current size of the widget
vec2 m_minSize; //!< user define the minimum size of the widget
float m_zoom; //!< generic widget zoom
vec2 m_origin; //!< internal ... I do not really known how i can use it ...
vec2 m_size; //!< internal : current size of the widget
vec2 m_minSize; //!< user define the minimum size of the widget
// user configuaration
vec2 m_userMinSize; //!< user define the minimum size of the widget
bvec2 m_userExpend;
bvec2 m_userFill;
vec2 m_userMinSize; //!< user define the minimum size of the widget
vec2 m_userMaxSize; //!< user define the maximum size of the widget
bvec2 m_userExpend;
bvec2 m_userFill;
public:
/**
* @brief Set the zoom property of the widget
@ -144,9 +145,21 @@ namespace ewol {
/**
* @brief Get the current calculated min size
* @param ---
* @return re size requested
* @return the size requested
*/
vec2 GetMinSize(void);
/**
* @brief User set the maximum size he want to set the display
* @param[in] size The new maximum size requested (vec2(-1,-1) to unset)
* @return ---
*/
virtual void SetMaxSize(vec2 size);
/**
* @brief Get the current maximum size
* @param ---
* @return the size requested
*/
vec2 GetMaxSize(void);
/**
* @brief Get the widget size
* @param ---

View File

@ -30,6 +30,7 @@ static const char * l_eventChangeExpendX = "event-change-expend-X";
static const char * l_eventChangeExpendY = "event-change-expend-Y";
static const char * l_eventChangeFillX = "event-change-fill-X";
static const char * l_eventChangeFillY = "event-change-fill-Y";
static const char * l_eventChangeMaxSize = "event-change-maxSize";
static const char * l_eventChangeLabel = "event-change-label";
#undef __class__
@ -77,6 +78,13 @@ TestLabel::TestLabel(void) :
myButton->RegisterOnEvent(this, ewolEventButtonValue, l_eventChangeFillY);
mySizerHori->SubWidgetAdd(myButton);
}
myButton = new widget::Button("maxSize (-1,-1)");
if (NULL != myButton) {
myButton->SetToggleMode(true);
myButton->SetLabelToggle("maxSize (400,-1)");
myButton->RegisterOnEvent(this, ewolEventButtonValue, l_eventChangeMaxSize);
mySizerHori->SubWidgetAdd(myButton);
}
myButton = new widget::Button("Next Label");
if (NULL != myButton) {
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventChangeLabel);
@ -192,6 +200,14 @@ void TestLabel::OnReceiveMessage(ewol::EObject * CallerObject, const char * even
m_testWidget->SetFillY(false);
}
}
} else if (eventId == l_eventChangeMaxSize) {
if (NULL!=m_testWidget) {
if (data=="1") {
m_testWidget->SetMaxSize(vec2(400,-1));
} else {
m_testWidget->SetMaxSize(vec2(-1,-1));
}
}
} else if (eventId == l_eventChangeLabel) {
if (NULL!=m_testWidget) {
m_labelId++;
@ -205,6 +221,26 @@ void TestLabel::OnReceiveMessage(ewol::EObject * CallerObject, const char * even
case 1:
m_testWidget->SetLabel("Basic <bold>label</bold>");
break;
case 2:
m_testWidget->SetLabel("<center>\n"
" Un jour Cosette se <b>regarda</b> par hasard dans son miroir et se dit: Tiens! <b>Il lui semblait presque <i>qu'elle était jolie.</i></b> Ceci la jeta dans un trouble singulier. <font color=\"#FF0000\">Jusqu'à ce moment elle <b>n'avait</b> point <i>songé</i> à sa figure.</font> Elle se voyait dans son miroir, mais elle ne s'y regardait pas. Et puis, on lui avait souvent dit qu'elle était laide;<br/> Jean Valjean seul disait doucement : <br/> Mais non!<br/> mais non!<br/> Quoi qu'il en fut, Cosette s'était toujours crue laide, et avait grandi dans cette idée avec la résignation facile de l'enfance. Voici que tout d'un coup son miroir lui disait comme Jean Valjean : Mais non! Elle ne dormit pas de la nuit. Si j'étais jolie ? pensait-elle, comme cela serait drole que je fusse jolie! Et elle se rappelait celles de ses compagnes dont la beauté faisait effet dans le couvent, et elle se disait : Comment! je serais comme mademoiselle une telle!\n"
"</center>\n");
break;
case 3:
m_testWidget->SetLabel("<left>\n"
" Un jour Cosette se <b>regarda</b> par hasard dans son miroir et se dit: Tiens! <b>Il lui semblait presque <i>qu'elle était jolie.</i></b> Ceci la jeta dans un trouble singulier. <font color=\"#0F0\">Jusqu'à ce moment elle <b>n'avait</b> point <i>songé</i> à sa figure.</font> Elle se voyait dans son miroir, mais elle ne s'y regardait pas. Et puis, on lui avait souvent dit qu'elle était laide;<br/> Jean Valjean seul disait doucement :<br/> Mais non!<br/> mais non!<br/> Quoi qu'il en fut, Cosette s'était toujours crue laide, et avait grandi dans cette idée avec la résignation facile de l'enfance. Voici que tout d'un coup son miroir lui disait comme Jean Valjean : Mais non! Elle ne dormit pas de la nuit. Si j'étais jolie ? pensait-elle, comme cela serait drole que je fusse jolie! Et elle se rappelait celles de ses compagnes dont la beauté faisait effet dans le couvent, et elle se disait : Comment! je serais comme mademoiselle une telle!\n"
"</left>\n");
break;
case 4:
m_testWidget->SetLabel("<right>\n"
" Un jour Cosette se <b>regarda</b> par hasard dans son miroir et se dit: Tiens! <b>Il lui semblait presque <i>qu'elle était jolie.</i></b> Ceci la jeta dans un trouble singulier. <font color=\"#00F\">Jusqu'à ce moment elle<b> n'avait</b> point <i>songé</i> à sa figure.</font> Elle se voyait dans son miroir, mais elle ne s'y regardait pas. Et puis, on lui avait souvent dit qu'elle était laide;<br/> Jean Valjean seul disait doucement :<br/> Mais non! <br/> mais non!<br/> Quoi qu'il en fut, Cosette s'était toujours crue laide, et avait grandi dans cette idée avec la résignation facile de l'enfance. Voici que tout d'un coup son miroir lui disait comme Jean Valjean : Mais non! Elle ne dormit pas de la nuit. Si j'étais jolie ? pensait-elle, comme cela serait drole que je fusse jolie! Et elle se rappelait celles de ses compagnes dont la beauté faisait effet dans le couvent, et elle se disait : Comment! je serais comme mademoiselle une telle!\n"
"</right>\n");
break;
case 5:
m_testWidget->SetLabel("<justify>\n"
" Un jour Cosette se <b>regarda</b> par hasard dans son miroir et se dit: Tiens! <b>Il lui semblait presque <i>qu'elle était jolie.</i></b> Ceci la jeta dans un trouble singulier. <font color=\"#FF0\">Jusqu'à ce moment elle <b>n'avait</b> point <i>songé</i> à sa figure.</font> Elle se voyait dans son miroir, mais elle ne s'y regardait pas. Et puis, on lui avait souvent dit qu'elle était laide;<br/> Jean Valjean seul disait doucement :<br/> Mais non!<br/> mais non!<br/> Quoi qu'il en fut, Cosette s'était toujours crue laide, et avait grandi dans cette idée avec la résignation facile de l'enfance. Voici que tout d'un coup son miroir lui disait comme Jean Valjean : Mais non! Elle ne dormit pas de la nuit. Si j'étais jolie ? pensait-elle, comme cela serait drole que je fusse jolie! Et elle se rappelait celles de ses compagnes dont la beauté faisait effet dans le couvent, et elle se disait : Comment! je serais comme mademoiselle une telle!\n"
"</justify>\n");
break;
}
}
}

View File

@ -22,8 +22,13 @@ class TestLabel : public widget::SizerVert
widget::Label* m_testWidget;
int32_t m_labelId;
public:
// Constructeur
/**
* @brief Constructeur
*/
TestLabel(void);
/**
* @brief Destructor
*/
virtual ~TestLabel(void);
// Derived function
virtual const char * const GetObjectType(void) { return "TestButton"; };