From 09103e307311e22049bf44eafce4c0b2949a6158 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 11 Mar 2013 23:29:40 +0100 Subject: [PATCH] [DEV] correct some error in the display of the Button Image --- sources/ewol/compositing/Image.cpp | 6 +- sources/ewol/compositing/Image.h | 3 +- sources/ewol/renderer/ResourceManager.cpp | 2 +- sources/ewol/widget/Button.cpp | 181 +++++++++++++--------- sources/ewol/widget/Button.h | 4 +- sources/ewol/widget/Widget.cpp | 10 ++ sources/ewol/widget/Widget.h | 5 + 7 files changed, 132 insertions(+), 79 deletions(-) diff --git a/sources/ewol/compositing/Image.cpp b/sources/ewol/compositing/Image.cpp index 95008f55..5cacb240 100644 --- a/sources/ewol/compositing/Image.cpp +++ b/sources/ewol/compositing/Image.cpp @@ -235,7 +235,7 @@ void ewol::Image::PrintPart(ivec2 size, } -void ewol::Image::SetSource(etk::UString newFile) +void ewol::Image::SetSource(etk::UString newFile, int32_t size) { Clear(); // remove old one @@ -243,11 +243,11 @@ void ewol::Image::SetSource(etk::UString newFile) ewol::resource::Release(m_resource); m_resource = NULL; } - ivec2 size(32,32); + ivec2 tmpSize(size,size); // note that no image can be loaded... if (newFile != "") { // link to new One - if (false == ewol::resource::Keep(newFile, m_resource, size)) { + if (false == ewol::resource::Keep(newFile, m_resource, tmpSize)) { EWOL_ERROR("Can not get Image resource"); } } diff --git a/sources/ewol/compositing/Image.h b/sources/ewol/compositing/Image.h index 5b60c364..b3737729 100644 --- a/sources/ewol/compositing/Image.h +++ b/sources/ewol/compositing/Image.h @@ -122,8 +122,9 @@ namespace ewol /** * @brief Change the image Source ==> can not be done to display 2 images at the same time ... * @param[in] newFile New file of the Image + * @param[in] size for the image when Verctorial image loading is requested */ - void SetSource(etk::UString newFile); + void SetSource(etk::UString newFile, int32_t size=32); /** * @brief Sometimes the user declare an image but not allocate the ressources all the time, this is to know it .. * @return the validity od the resources. diff --git a/sources/ewol/renderer/ResourceManager.cpp b/sources/ewol/renderer/ResourceManager.cpp index 4a8c1136..31e0c9ec 100644 --- a/sources/ewol/renderer/ResourceManager.cpp +++ b/sources/ewol/renderer/ResourceManager.cpp @@ -298,7 +298,7 @@ static int32_t nextP2(int32_t value) bool ewol::resource::Keep(const etk::UString& filename, ewol::TextureFile*& object, ivec2 size) { - ivec2 size2(nextP2(size.x()), nextP2(size.y())); + ivec2 size2(nextP2(size.x()), nextP2(size.y())); etk::UString TmpFilename = filename; TmpFilename += ":"; TmpFilename += size2.x(); diff --git a/sources/ewol/widget/Button.cpp b/sources/ewol/widget/Button.cpp index 910c2f05..cb2c0896 100644 --- a/sources/ewol/widget/Button.cpp +++ b/sources/ewol/widget/Button.cpp @@ -65,18 +65,20 @@ void widget::Button::SetShaperName(etk::UString shaperName) m_shaper.SetSource(shaperName); } -void widget::Button::SetImage(etk::UString imageName, draw::Color color) +void widget::Button::SetImage(etk::UString imageName, draw::Color color, int32_t size) { m_imageColor = color; - m_displayImage.SetSource(imageName); + m_imageDisplaySize = size; + m_displayImage.SetSource(imageName, size); MarkToRedraw(); ewol::RequestUpdateSize(); } -void widget::Button::SetImageToggle(etk::UString imageName, draw::Color color) +void widget::Button::SetImageToggle(etk::UString imageName, draw::Color color, int32_t size) { m_imageColorToggle = color; - m_displayImageToggle.SetSource(imageName); + m_imageDisplaySize = size; + m_displayImageToggle.SetSource(imageName, size); MarkToRedraw(); ewol::RequestUpdateSize(); } @@ -86,22 +88,36 @@ bool widget::Button::CalculateMinSize(void) { vec2 padding = m_shaper.GetPadding(); m_displayText.Clear(); - vec3 minSize = m_displayText.CalculateSizeDecorated(m_label); - if( true == m_toggleMode - && m_labelToggle.Size()!=0) { - m_displayText.Clear(); - vec3 minSizeToggle = m_displayText.CalculateSizeDecorated(m_labelToggle); - minSize.setValue(etk_max(minSize.x(), minSizeToggle.x()), - etk_max(minSize.y(), minSizeToggle.y()), - etk_max(minSize.z(), minSizeToggle.z())); - } - m_minSize.setX(padding.x()*2 + minSize.x()); - m_minSize.setY(padding.y()*2 + minSize.y()); - // Add the image element ... - if( true == m_displayImage.HasSources() - || true == m_displayImageToggle.HasSources()) { - m_minSize.setX(m_minSize.x()+ padding.x()/2 + m_imageDisplaySize); + if( m_label.Size()==0 + && m_labelToggle.Size()==0 + && ( true == m_displayImage.HasSources() + || true == m_displayImageToggle.HasSources()) ) { + // special case of only one image display ==> certer it ... + m_minSize.setX(padding.x()*2 + m_imageDisplaySize); + m_minSize.setY(padding.y()*2 + m_imageDisplaySize); + } else { + vec3 minSize(0,0,0); + //faster if no text set ... + if (m_label.Size()!=0) { + minSize = m_displayText.CalculateSizeDecorated(m_label); + } + if( true == m_toggleMode + && m_labelToggle.Size()!=0) { + m_displayText.Clear(); + vec3 minSizeToggle = m_displayText.CalculateSizeDecorated(m_labelToggle); + minSize.setValue(etk_max(minSize.x(), minSizeToggle.x()), + etk_max(minSize.y(), minSizeToggle.y()), + etk_max(minSize.z(), minSizeToggle.z())); + } + m_minSize.setX(padding.x()*2 + minSize.x()); + m_minSize.setY(padding.y()*2 + minSize.y()); + // Add the image element ... + if( true == m_displayImage.HasSources() + || true == m_displayImageToggle.HasSources()) { + m_minSize.setX(m_minSize.x()+ padding.x()/2 + m_imageDisplaySize); + } } + CheckMinSize(); MarkToRedraw(); return true; } @@ -171,26 +187,20 @@ void widget::Button::OnDraw(ewol::DrawProperty& displayProp) void widget::Button::OnRegenerateDisplay(void) { if (true == NeedRedraw()) { - - vec2 padding = m_shaper.GetPadding(); - // to know the size of one Line : - vec3 minSize = m_displayText.CalculateSize('A'); - vec3 curentTextSize(0,0,0); - if( false == m_toggleMode - || false == m_value - || m_labelToggle.Size()==0) { - curentTextSize = m_displayText.CalculateSizeDecorated(m_label); - } else { - curentTextSize = m_displayText.CalculateSizeDecorated(m_labelToggle); - } - + // clear the previous display : m_displayImage.Clear(); m_displayImageToggle.Clear(); m_shaper.Clear(); m_displayText.Clear(); + // know the current padding + vec2 padding = m_shaper.GetPadding(); + // to know the size of one Line : + vec3 minSize = m_displayText.CalculateSize('A'); ivec2 localSize = m_minSize; + vec3 sizeText(0,0,0); + vec3 tmpOrigin((m_size.x() - m_minSize.x()) / 2.0, (m_size.y() - m_minSize.y()) / 2.0, 0); @@ -211,12 +221,10 @@ void widget::Button::OnRegenerateDisplay(void) tmpTextOrigin += vec3(padding.x(), padding.y(), 0); localSize -= ivec2(2*padding.x(), 2*padding.y()); - tmpTextOrigin.setY(tmpTextOrigin.y()+ (m_minSize.y()-2*padding.y()) - minSize.y()); - - vec2 textPos(tmpTextOrigin.x(), tmpTextOrigin.y()); - - if( true == m_displayImage.HasSources() - || true == m_displayImageToggle.HasSources()) { + if( m_label.Size()==0 + && m_labelToggle.Size()==0 + && ( true == m_displayImage.HasSources() + || true == m_displayImageToggle.HasSources()) ) { vec3 imagePos(tmpOrigin.x()-padding.x()/4, tmpOrigin.y()-padding.x()/4+(m_minSize.y()-m_imageDisplaySize-2*padding.y())/2.0, 0); @@ -232,49 +240,78 @@ void widget::Button::OnRegenerateDisplay(void) m_displayImageToggle.SetColor(m_imageColorToggle); m_displayImageToggle.Print(imageSize); } - // update the text position ... - tmpTextOrigin.setX(tmpTextOrigin.x() + padding.x()/2 + m_imageDisplaySize); - } - - vec3 drawClippingPos(padding.x(), padding.y(), -0.5); - vec3 drawClippingSize((m_size.x() - padding.x()), - (m_size.y() - padding.y()), - 1); - - // clean the element - m_displayText.Reset(); - m_displayText.SetPos(tmpTextOrigin); - if( true == m_displayImage.HasSources() - || true == m_displayImageToggle.HasSources()) { - m_displayText.SetTextAlignement(tmpTextOrigin.x(), tmpTextOrigin.x()+localSize.x()-m_imageDisplaySize, ewol::Text::alignCenter); } else { - m_displayText.SetTextAlignement(tmpTextOrigin.x(), tmpTextOrigin.x()+localSize.x(), ewol::Text::alignCenter); + vec3 curentTextSize(0,0,0); + if( false == m_toggleMode + || false == m_value + || m_labelToggle.Size()==0) { + curentTextSize = m_displayText.CalculateSizeDecorated(m_label); + } else { + curentTextSize = m_displayText.CalculateSizeDecorated(m_labelToggle); + } + + tmpTextOrigin.setY(tmpTextOrigin.y()+ (m_minSize.y()-2*padding.y()) - minSize.y()); + + vec2 textPos(tmpTextOrigin.x(), tmpTextOrigin.y()); + + if( true == m_displayImage.HasSources() + || true == m_displayImageToggle.HasSources()) { + vec3 imagePos(tmpOrigin.x()-padding.x()/4, + tmpOrigin.y()-padding.x()/4+(m_minSize.y()-m_imageDisplaySize-2*padding.y())/2.0, + 0); + vec2 imageSize(m_imageDisplaySize, + m_imageDisplaySize); + if( false==m_toggleMode + || false==m_value) { + m_displayImage.SetPos(imagePos); + m_displayImage.SetColor(m_imageColor); + m_displayImage.Print(imageSize); + } else { + m_displayImageToggle.SetPos(imagePos); + m_displayImageToggle.SetColor(m_imageColorToggle); + m_displayImageToggle.Print(imageSize); + } + // update the text position ... + tmpTextOrigin.setX(tmpTextOrigin.x() + padding.x()/2 + m_imageDisplaySize); + } + + vec3 drawClippingPos(padding.x(), padding.y(), -0.5); + vec3 drawClippingSize((m_size.x() - padding.x()), + (m_size.y() - padding.y()), + 1); + + // clean the element + m_displayText.Reset(); + m_displayText.SetPos(tmpTextOrigin); + if( true == m_displayImage.HasSources() + || true == m_displayImageToggle.HasSources()) { + m_displayText.SetTextAlignement(tmpTextOrigin.x(), tmpTextOrigin.x()+localSize.x()-m_imageDisplaySize, ewol::Text::alignCenter); + } else { + m_displayText.SetTextAlignement(tmpTextOrigin.x(), tmpTextOrigin.x()+localSize.x(), ewol::Text::alignCenter); + } + m_displayText.SetClipping(drawClippingPos, drawClippingSize); + if( false == m_toggleMode + || false == m_value + || m_labelToggle.Size()==0) { + m_displayText.PrintDecorated(m_label); + } else { + m_displayText.PrintDecorated(m_labelToggle); + } + //m_displayText.Translate(tmpOrigin); + sizeText = m_displayText.CalculateSize(m_label); + + if (true==m_userFill.y()) { + tmpOrigin.setY(padding.y()); + } } - m_displayText.SetClipping(drawClippingPos, drawClippingSize); - if( false == m_toggleMode - || false == m_value - || m_labelToggle.Size()==0) { - m_displayText.PrintDecorated(m_label); - } else { - m_displayText.PrintDecorated(m_labelToggle); - } - //m_displayText.Translate(tmpOrigin); - - - if (true==m_userFill.y()) { - tmpOrigin.setY(padding.y()); - } - // selection area : m_selectableAreaPos = vec2(tmpOrigin.x()-padding.x(), tmpOrigin.y()-padding.y()); m_selectableAreaSize = localSize + vec2(2,2)*padding; m_shaper.SetOrigin(m_selectableAreaPos ); m_shaper.SetSize(m_selectableAreaSize); m_shaper.SetInsidePos(vec2(tmpTextOrigin.x(), tmpTextOrigin.y()) ); - vec3 tmpp = m_displayText.CalculateSize(m_label); - vec2 tmpp2(tmpp.x(), tmpp.y()); + vec2 tmpp2(sizeText.x(), sizeText.y()); m_shaper.SetInsideSize(tmpp2); - } } diff --git a/sources/ewol/widget/Button.h b/sources/ewol/widget/Button.h index e35cee04..eb0157b1 100644 --- a/sources/ewol/widget/Button.h +++ b/sources/ewol/widget/Button.h @@ -84,13 +84,13 @@ namespace widget { * @param[in] imageName Filename of the image. * @param[in] color The required color for the image. */ - void SetImage(etk::UString imageName, draw::Color color=draw::color::white); + void SetImage(etk::UString imageName, draw::Color color=draw::color::white, int32_t size=32); /** * @brief Set the image when button is pressed. * @param[in] imageName Filename of the image. * @param[in] color The required color for the image. */ - void SetImageToggle(etk::UString imageName, draw::Color color=draw::color::white); + void SetImageToggle(etk::UString imageName, draw::Color color=draw::color::white, int32_t size=32); /** * @brief Set the currentValue of the Button (pressed or not) * @note Work only in toggle mode diff --git a/sources/ewol/widget/Widget.cpp b/sources/ewol/widget/Widget.cpp index 4b9925c3..85f76706 100644 --- a/sources/ewol/widget/Widget.cpp +++ b/sources/ewol/widget/Widget.cpp @@ -227,6 +227,16 @@ void ewol::Widget::SetMinSize(float x, float y) m_userMinSize.setValue(x, y); } +void ewol::Widget::CheckMinSize(void) +{ + if (m_userMinSize.x() > 0) { + m_minSize.setX(etk_max(m_minSize.x(), m_userMinSize.x())); + } + if (m_userMinSize.y() > 0) { + m_minSize.setY(etk_max(m_minSize.y(), m_userMinSize.y())); + } +} + vec2 ewol::Widget::GetMinSize(void) { if (false==IsHide()) { diff --git a/sources/ewol/widget/Widget.h b/sources/ewol/widget/Widget.h index 588d7709..6a9ffd2e 100644 --- a/sources/ewol/widget/Widget.h +++ b/sources/ewol/widget/Widget.h @@ -138,6 +138,11 @@ namespace ewol { * @return the size requested */ vec2 GetMinSize(void); + /** + * @brief Check if the current min size is compatible wit hte user minimum size + * If it is not the user minimum size will overWrite the minimum size set. + */ + void CheckMinSize(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)