From 189665162e6bda63852c1cc62ba0a5ac2ff7e74d Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 30 Mar 2014 12:37:10 +0200 Subject: [PATCH] [DEV] correction of the scroll widget and add distance field load precompiled basic file --- external/airtaudio | 2 +- external/etk | 2 +- sources/ewol/compositing/Image.cpp | 2 +- sources/ewol/context/Context.cpp | 24 ++++- sources/ewol/context/Context.h | 23 +++- sources/ewol/ewol.cpp | 2 - sources/ewol/resource/DistanceFieldFont.cpp | 86 +++++++++++++++ sources/ewol/resource/DistanceFieldFont.h | 3 + sources/ewol/resource/TexturedFont.cpp | 7 +- sources/ewol/resource/font/GlyphProperty.h | 2 +- sources/ewol/widget/Image.cpp | 1 + sources/ewol/widget/PopUp.h | 2 +- sources/ewol/widget/ProgressBar.cpp | 4 + sources/ewol/widget/Scroll.cpp | 110 +++++++++++--------- sources/ewol/widget/Scroll.h | 7 +- sources/ewol/widget/WidgetScrolled.cpp | 4 +- 16 files changed, 214 insertions(+), 67 deletions(-) diff --git a/external/airtaudio b/external/airtaudio index a1f0b0f8..b30ff780 160000 --- a/external/airtaudio +++ b/external/airtaudio @@ -1 +1 @@ -Subproject commit a1f0b0f81c895b946a6db763d9845acdd2d05525 +Subproject commit b30ff7808fe7205aa166dc4a856566a6ecfd9b85 diff --git a/external/etk b/external/etk index d431e72b..a2e5f4e0 160000 --- a/external/etk +++ b/external/etk @@ -1 +1 @@ -Subproject commit d431e72b0916391c011830a5db9d8f756c510405 +Subproject commit a2e5f4e0cedf31ab2605b0980981bf1721c29a98 diff --git a/sources/ewol/compositing/Image.cpp b/sources/ewol/compositing/Image.cpp index 2e02f11b..7f8f59a0 100644 --- a/sources/ewol/compositing/Image.cpp +++ b/sources/ewol/compositing/Image.cpp @@ -151,7 +151,7 @@ void ewol::compositing::Image::setAngle(float _angle) { } void ewol::compositing::Image::print(const vec2& _size) { - printPart(_size, vec2(0,0), vec2(1,1)); + printPart(_size, vec2(0,0), vec2(1.0,1.0)); } void ewol::compositing::Image::printPart(const vec2& _size, diff --git a/sources/ewol/context/Context.cpp b/sources/ewol/context/Context.cpp index 3a634aba..1dccea9a 100644 --- a/sources/ewol/context/Context.cpp +++ b/sources/ewol/context/Context.cpp @@ -52,6 +52,14 @@ ewol::Context& ewol::getContext(void) { return *l_curentInterface; } + + +void ewol::Context::setInitImage(const std::string& _fileName) { + //m_initDisplayImageName = _fileName; +} + + + /** * @brief set the curent interface. * @note this lock the main mutex @@ -154,7 +162,8 @@ void ewol::Context::processEvents(void) { case eSystemMessage::msgInit: // this is due to the openGL context /*bool returnVal = */ - APP_Init(*this); + APP_Init(*this, m_initStepId, m_initTotalStep); + m_initStepId++; break; case eSystemMessage::msgRecalculateSize: forceRedrawAll(); @@ -288,7 +297,9 @@ ewol::Context::Context(int32_t _argc, const char* _argv[]) : m_FpsSystem( "Draw ", true), m_FpsFlush( "Flush ", false), m_windowsCurrent(NULL), - m_windowsSize(320,480) { + m_windowsSize(320,480), + m_initStepId(0), + m_initTotalStep(1) { m_commandLine.parse(_argc, _argv); EWOL_INFO(" == > Ewol system init (BEGIN)"); // Reset the random system to be sure have real random values... @@ -553,6 +564,15 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) { // set the curent interface : lockContext(); processEvents(); + if (m_initStepId < m_initTotalStep) { + ewol::eSystemMessage *data = new ewol::eSystemMessage(); + if (data == NULL) { + EWOL_ERROR("allocation error of message"); + } else { + data->TypeMessage = eSystemMessage::msgInit; + m_msgSystem.post(data); + } + } // call all the widget that neded to do something periodicly //! ewol::widgetManager::periodicCall(currentTime); m_widgetManager.periodicCall(currentTime); diff --git a/sources/ewol/context/Context.h b/sources/ewol/context/Context.h index f2efa4aa..d9764341 100644 --- a/sources/ewol/context/Context.h +++ b/sources/ewol/context/Context.h @@ -328,6 +328,15 @@ namespace ewol { * @return normal error int for the application error management */ static int main(int _argc, const char *_argv[]); + private: + size_t m_initStepId; + size_t m_initTotalStep; + public: + /** + * @brief Special for init (main) set the start image when loading data + * @param[in] _fileName Name of the image to load + */ + void setInitImage(const std::string& _fileName); }; /** * @brief From everyware in the program, we can get the context inteface. @@ -337,8 +346,18 @@ namespace ewol { }; //!< must be define in CPP by the application ... this are the main init and unInit of the Application -// return false if an error occured -bool APP_Init(ewol::Context& _context); +/** + * @brief main application function initialisation + * @param[in] _context curent context property + * @param[in] _initId current init step + * @param[out] _nbInitStep total number of step + * @return true, all OK + * @return false, an error occured + */ +bool APP_Init(ewol::Context& _context, size_t _initId, size_t& _nbInitStep); +/** + * @brief main application function un-initialisation + */ void APP_UnInit(ewol::Context& _context); diff --git a/sources/ewol/ewol.cpp b/sources/ewol/ewol.cpp index 784dadd3..b63ee1b7 100644 --- a/sources/ewol/ewol.cpp +++ b/sources/ewol/ewol.cpp @@ -47,5 +47,3 @@ std::string ewol::getVersion(void) { return EWOL_VERSION; } - - diff --git a/sources/ewol/resource/DistanceFieldFont.cpp b/sources/ewol/resource/DistanceFieldFont.cpp index 7d99e006..e30c9dc3 100644 --- a/sources/ewol/resource/DistanceFieldFont.cpp +++ b/sources/ewol/resource/DistanceFieldFont.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #undef __class__ #define __class__ "resource::DistanceFieldFont" @@ -97,6 +98,12 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam if (m_font == NULL) { return; } + if (importFromFile() == true) { + EWOL_INFO("GET distance field from previous file"); + flush(); + return; + } + m_sizeRatio = ((float)SIZE_GENERATION) / ((float)m_font->getHeight(SIZE_GENERATION)); // TODO : basic font use 512 is better ... == > maybe estimate it with the dpi ??? setImageSize(ivec2(256,32)); @@ -110,6 +117,7 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam addGlyph(iii); } flush(); + //exportOnFile(); } ewol::resource::DistanceFieldFont::~DistanceFieldFont(void) { @@ -365,3 +373,81 @@ void ewol::resource::DistanceFieldFont::release(ewol::resource::DistanceFieldFon } _object = NULL; } + +void ewol::resource::DistanceFieldFont::exportOnFile(void) { + EWOL_DEBUG("EXPORT: DistanceFieldFont : file : '" << m_fileName << ".json'"); + ejson::Document doc; + ejson::Array* tmpList = new ejson::Array(); + if (tmpList == NULL) { + EWOL_ERROR("NULL pointer"); + return; + } + for (size_t iii=0; iiiaddString("m_UVal", std::to_string(m_listElement[iii].m_UVal)); + tmpObj->addNumber("m_glyphIndex", m_listElement[iii].m_glyphIndex); + tmpObj->addString("m_sizeTexture", (std::string)m_listElement[iii].m_sizeTexture); + tmpObj->addString("m_bearing", (std::string)m_listElement[iii].m_bearing); + tmpObj->addString("m_advance", (std::string)m_listElement[iii].m_advance); + tmpObj->addString("m_texturePosStart", (std::string)m_listElement[iii].m_texturePosStart); + tmpObj->addString("m_texturePosSize", (std::string)m_listElement[iii].m_texturePosSize); + tmpObj->addBoolean("m_exist", m_listElement[iii].m_exist); + tmpList->add(tmpObj); + } + doc.add("m_listElement", tmpList); + doc.addNumber("m_sizeRatio", m_sizeRatio); + doc.addString("m_lastGlyphPos", (std::string)m_lastGlyphPos); + doc.addNumber("m_lastRawHeigh", m_lastRawHeigh); + doc.addNumber("m_borderSize", m_borderSize); + doc.addString("m_textureBorderSize", (std::string)m_textureBorderSize); + doc.store(m_fileName + ".json"); + egami::store(m_data, m_fileName + ".bmp"); + egami::store(m_data, m_fileName + ".png"); +} + +bool ewol::resource::DistanceFieldFont::importFromFile(void) { + EWOL_DEBUG("IMPORT: DistanceFieldFont : file : '" << m_fileName << ".json'"); + // test file existance: + etk::FSNode fileJSON(m_fileName + ".json"); + etk::FSNode fileBMP(m_fileName + ".bmp"); + if ( fileJSON.exist() == false + || fileBMP.exist() == false) { + EWOL_DEBUG("Does not import file for distance field system"); + return false; + } + ejson::Document doc; + doc.load(m_fileName + ".json"); + + m_sizeRatio = doc.getNumberValue("m_sizeRatio", 0); + m_lastGlyphPos = doc.getStringValue("m_lastGlyphPos", "0,0"); + m_lastRawHeigh = doc.getNumberValue("m_lastRawHeigh", 0); + m_borderSize = doc.getNumberValue("m_borderSize", 2); + m_textureBorderSize = doc.addString("m_textureBorderSize", "0,0"); + ejson::Array* tmpList = doc.getArray("m_listElement"); + if (tmpList == NULL) { + EWOL_ERROR("NULL pointer array"); + return false; + } + m_listElement.clear(); + for (size_t iii=0; iiisize(); ++iii) { + ejson::Object* tmpObj = tmpList->getObject(iii); + if (tmpObj == NULL) { + continue; + } + GlyphProperty prop; + prop.m_UVal = std::stoi(tmpObj->getStringValue("m_UVal", "0")); + prop.m_glyphIndex = tmpObj->getNumberValue("m_glyphIndex", 0); + prop.m_sizeTexture = tmpObj->getStringValue("m_sizeTexture", "0,0"); + prop.m_bearing = tmpObj->getStringValue("m_bearing", "0,0"); + prop.m_advance = tmpObj->getStringValue("m_advance", "0,0"); + prop.m_texturePosStart = tmpObj->getStringValue("m_texturePosStart", "0,0"); + prop.m_texturePosSize = tmpObj->getStringValue("m_texturePosSize", "0,0"); + prop.m_exist = tmpObj->getBooleanValue("m_exist", false); + m_listElement.push_back(prop); + } + egami::load(m_data, m_fileName + ".bmp"); + return true; +} diff --git a/sources/ewol/resource/DistanceFieldFont.h b/sources/ewol/resource/DistanceFieldFont.h index 94daf803..0a8c5bb8 100644 --- a/sources/ewol/resource/DistanceFieldFont.h +++ b/sources/ewol/resource/DistanceFieldFont.h @@ -95,6 +95,9 @@ namespace ewol { const vec2& getTextureBorderSize(void) { return m_textureBorderSize; } + public: + void exportOnFile(void); + bool importFromFile(void); }; }; }; diff --git a/sources/ewol/resource/TexturedFont.cpp b/sources/ewol/resource/TexturedFont.cpp index 38ca64b8..a51571c2 100644 --- a/sources/ewol/resource/TexturedFont.cpp +++ b/sources/ewol/resource/TexturedFont.cpp @@ -337,7 +337,7 @@ ewol::GlyphProperty* ewol::resource::TexturedFont::getGlyphPointer(const char32_ } ewol::resource::TexturedFont* ewol::resource::TexturedFont::keep(const std::string& _filename) { - EWOL_VERBOSE("KEEP : TexturedFont : file : '" << _filename << "'"); + EWOL_ERROR("KEEP : TexturedFont : file : '" << _filename << "'"); ewol::resource::TexturedFont* object = NULL; ewol::Resource* object2 = getManager().localKeep(_filename); if (NULL != object2) { @@ -351,7 +351,7 @@ ewol::resource::TexturedFont* ewol::resource::TexturedFont::keep(const std::stri return object; } // need to crate a new one ... - EWOL_DEBUG("CREATE: TexturedFont : file : '" << _filename << "'"); + EWOL_ERROR("CREATE: TexturedFont : file : '" << _filename << "'"); object = new ewol::resource::TexturedFont(_filename); if (NULL == object) { EWOL_ERROR("allocation error of a resource : " << _filename); @@ -365,11 +365,12 @@ void ewol::resource::TexturedFont::release(ewol::resource::TexturedFont*& _objec if (NULL == _object) { return; } + EWOL_ERROR("RELEASE: TexturedFont : file : '" << _object->getName() << "' count=" << _object->getCounter()); std::string name = _object->getName(); int32_t count = _object->getCounter() - 1; ewol::Resource* object2 = static_cast(_object); if (getManager().release(object2) == true) { - EWOL_DEBUG("REMOVE: TexturedFont : file : '" << name << "' count=" << count); + EWOL_ERROR("REMOVE: TexturedFont : file : '" << name << "' count=" << count); //etk::displayBacktrace(false); } _object = NULL; diff --git a/sources/ewol/resource/font/GlyphProperty.h b/sources/ewol/resource/font/GlyphProperty.h index 7ec8051a..46676112 100644 --- a/sources/ewol/resource/font/GlyphProperty.h +++ b/sources/ewol/resource/font/GlyphProperty.h @@ -53,7 +53,7 @@ namespace ewol { class GlyphProperty { public: char32_t m_UVal; //!< Unicode value - private: + public: bool m_exist; public: int32_t m_glyphIndex; //!< Glyph index in the system diff --git a/sources/ewol/widget/Image.cpp b/sources/ewol/widget/Image.cpp index ce416eae..1a27e80b 100644 --- a/sources/ewol/widget/Image.cpp +++ b/sources/ewol/widget/Image.cpp @@ -159,6 +159,7 @@ void ewol::widget::Image::onRegenerateDisplay(void) { m_compositing.setPos(origin); m_compositing.print(imageRealSize); //EWOL_DEBUG("Paint Image at : " << origin << " size=" << imageRealSize << " origin=" << origin); + EWOL_DEBUG("Paint Image :" << m_fileName << " realsize=" << m_compositing.getRealSize() << " size=" << imageRealSize); } } diff --git a/sources/ewol/widget/PopUp.h b/sources/ewol/widget/PopUp.h index f62328f1..fe1eae08 100644 --- a/sources/ewol/widget/PopUp.h +++ b/sources/ewol/widget/PopUp.h @@ -30,7 +30,7 @@ namespace ewol { static const char* const configRemoveOnExternClick; static const char* const configAnimation; static const char* const configLockExpand; - private: + protected: ewol::compositing::Shaper m_shaper; //!< Compositing theme. public: /** diff --git a/sources/ewol/widget/ProgressBar.cpp b/sources/ewol/widget/ProgressBar.cpp index 715208fb..d82b12d1 100644 --- a/sources/ewol/widget/ProgressBar.cpp +++ b/sources/ewol/widget/ProgressBar.cpp @@ -99,18 +99,22 @@ bool ewol::widget::ProgressBar::onSetConfig(const ewol::object::Config& _conf) { } if (_conf.getConfig() == configColorBg) { m_textColorFg = _conf.getData(); + markToRedraw(); return true; } if (_conf.getConfig() == configColorFgOn) { m_textColorBgOn = _conf.getData(); + markToRedraw(); return true; } if (_conf.getConfig() == configColorFgOff) { m_textColorBgOff = _conf.getData(); + markToRedraw(); return true; } if (_conf.getConfig() == configValue) { m_value = stof(_conf.getData()); + markToRedraw(); return true; } return false; diff --git a/sources/ewol/widget/Scroll.cpp b/sources/ewol/widget/Scroll.cpp index 4548ec3c..312adb8d 100644 --- a/sources/ewol/widget/Scroll.cpp +++ b/sources/ewol/widget/Scroll.cpp @@ -24,7 +24,9 @@ void ewol::widget::Scroll::init(ewol::widget::Manager& _widgetManager) { const char* const ewol::widget::Scroll::configLimit = "limit"; -ewol::widget::Scroll::Scroll(void) : +ewol::widget::Scroll::Scroll(const std::string& _shaperName) : + m_shaperH(_shaperName), + m_shaperV(_shaperName), m_limit(0.15,0.5), m_pixelScrolling(20), m_highSpeedStartPos(0,0), @@ -68,54 +70,56 @@ void ewol::widget::Scroll::systemDraw(const ewol::DrawProperty& _displayProp) { } void ewol::widget::Scroll::onDraw(void) { - m_draw.draw(); + m_shaperH.draw(); + m_shaperV.draw(); } void ewol::widget::Scroll::onRegenerateDisplay(void) { // call upper class ewol::widget::Container::onRegenerateDisplay(); - if (true == needRedraw()) { - // clear all previous display - m_draw.clear(); - - m_draw.setColor(0xFF00007F); - - vec2 scrollOffset(0,0); - vec2 scrollSize(0,0); - if (NULL!=m_subWidget) { - scrollOffset = m_subWidget->getOffset(); - scrollSize = m_subWidget->getSize(); - } - m_draw.setThickness(1); - if( m_size.y() < scrollSize.y() - || scrollOffset.y()!=0) { - //EWOL_DEBUG("plop : " << vec2(m_size.x()-(SCROLL_BAR_SPACE/2), 0) << " " << vec2(m_size.x()-(SCROLL_BAR_SPACE/2), m_size.y())); - m_draw.setPos(vec2(m_size.x()-(SCROLL_BAR_SPACE/2), 0) ); - m_draw.lineTo(vec2(m_size.x()-(SCROLL_BAR_SPACE/2), m_size.y()) ); - float lenScrollBar = m_size.y()*m_size.y() / scrollSize.y(); - lenScrollBar = etk_avg(10, lenScrollBar, m_size.y()); - float originScrollBar = scrollOffset.y() / (scrollSize.y()-m_size.y()*m_limit.y()); - originScrollBar = etk_avg(0.0, originScrollBar, 1.0); - originScrollBar *= (m_size.y()-lenScrollBar); - m_draw.setPos(vec2(m_size.x()-SCROLL_BAR_SPACE, m_size.y() - originScrollBar - lenScrollBar) ); - m_draw.rectangleWidth(vec2(SCROLL_BAR_SPACE, lenScrollBar)); - } - if( m_size.x() < scrollSize.x() - || scrollOffset.x()!=0) { - m_draw.setPos(vec2(0, (SCROLL_BAR_SPACE/2)) ); - m_draw.lineTo(vec2(m_size.x()-SCROLL_BAR_SPACE, (SCROLL_BAR_SPACE/2)) ); - float lenScrollBar = m_size.x()*(m_size.x()-SCROLL_BAR_SPACE) / scrollSize.x(); - lenScrollBar = etk_avg(10, lenScrollBar, (m_size.x()-SCROLL_BAR_SPACE)); - float originScrollBar = scrollOffset.x() / (scrollSize.x()-m_size.x()*m_limit.x()); - originScrollBar = etk_avg(0.0, originScrollBar, 1.0); - originScrollBar *= (m_size.x()-SCROLL_BAR_SPACE-lenScrollBar); - m_draw.setPos(vec2(originScrollBar, 0) ); - m_draw.rectangle(vec2(lenScrollBar, SCROLL_BAR_SPACE) ); - } + if (needRedraw() == false) { + return; + } + // clear all previous display + m_shaperH.clear(); + m_shaperV.clear(); + ewol::Padding paddingVert = m_shaperV.getPadding(); + ewol::Padding paddingHori = m_shaperH.getPadding(); + vec2 scrollOffset(0,0); + vec2 scrollSize(0,0); + if (NULL!=m_subWidget) { + scrollOffset = m_subWidget->getOffset(); + scrollSize = m_subWidget->getSize(); + } + if( m_size.y() < scrollSize.y() + || scrollOffset.y()!=0) { + float lenScrollBar = m_size.y()*m_size.y() / scrollSize.y(); + lenScrollBar = etk_avg(10, lenScrollBar, m_size.y()); + float originScrollBar = scrollOffset.y() / (scrollSize.y()-m_size.y()*m_limit.y()); + originScrollBar = etk_avg(0.0, originScrollBar, 1.0); + originScrollBar *= (m_size.y()-lenScrollBar); + m_shaperV.setShape(vec2(m_size.x() - paddingVert.x(), 0), + vec2(paddingVert.x(), m_size.y()), + vec2(m_size.x() - paddingVert.xRight(), m_size.y() - originScrollBar - lenScrollBar), + vec2(0, lenScrollBar)); + } + if( m_size.x() < scrollSize.x() + || scrollOffset.x()!=0) { + float lenScrollBar = (m_size.x()-paddingHori.xLeft())*(m_size.x()-paddingVert.x()) / scrollSize.x(); + lenScrollBar = etk_avg(10, lenScrollBar, (m_size.x()-paddingVert.x())); + float originScrollBar = scrollOffset.x() / (scrollSize.x()-m_size.x()*m_limit.x()); + originScrollBar = etk_avg(0.0, originScrollBar, 1.0); + originScrollBar *= (m_size.x()-paddingHori.xRight()-lenScrollBar); + m_shaperH.setShape(vec2(0, 0), + vec2(m_size.x()-paddingVert.x(), paddingHori.y()), + vec2(originScrollBar, paddingHori.yButtom()), + vec2(lenScrollBar, 0)); } } bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) { + //ewol::event::Input _event = event; + //_event.setType(ewol::key::typeFinger); vec2 relativePos = relativePosition(_event.getPos()); vec2 scrollOffset(0,0); vec2 scrollSize(0,0); @@ -123,6 +127,7 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) { scrollOffset = m_subWidget->getOffset(); scrollSize = m_subWidget->getSize(); } + EWOL_WARNING("Get Event on scroll : " << _event); relativePos.setY(m_size.y() - relativePos.y()); if( _event.getType() == ewol::key::typeMouse && ( ewol::key::typeUnknow == m_highSpeedType @@ -282,12 +287,12 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) { && ( ewol::key::typeUnknow == m_highSpeedType || ewol::key::typeFinger == m_highSpeedType ) ) { if (1 == _event.getId()) { - //EWOL_VERBOSE("event 1 << " << (int32_t)typeEvent << "(" << x << "," << y << ")"); + EWOL_VERBOSE("event: " << _event); if (ewol::key::statusDown == _event.getStatus()) { m_highSpeedMode = speedModeInit; m_highSpeedType = ewol::key::typeFinger; m_highSpeedStartPos.setValue(relativePos.x(), relativePos.y()); - EWOL_VERBOSE("SCROOL == > INIT"); + EWOL_VERBOSE("SCROOL == > INIT pos=" << m_highSpeedStartPos << " && curent scrollOffset=" << scrollOffset); return true; } else if (ewol::key::statusUp == _event.getStatus()) { m_highSpeedMode = speedModeDisable; @@ -310,14 +315,23 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) { } if ( m_highSpeedMode == speedModeEnableFinger && ewol::key::statusMove == _event.getStatus()) { + EWOL_VERBOSE("SCROOL == > INIT scrollOffset=" << scrollOffset.y() << " relativePos=" << relativePos.y() << " m_highSpeedStartPos=" << m_highSpeedStartPos.y()); //scrollOffset.x = (int32_t)(scrollSize.x * x / m_size.x); - scrollOffset.setX(scrollOffset.x() - relativePos.x() - m_highSpeedStartPos.x()); - scrollOffset.setY(scrollOffset.y() - relativePos.y() - m_highSpeedStartPos.y()); - scrollOffset.setX(etk_avg(0, scrollOffset.x(), (scrollSize.x() - m_size.x()*m_limit.x()))); - scrollOffset.setY(etk_avg(0, scrollOffset.y(), (scrollSize.y() - m_size.y()*m_limit.y()))); - m_highSpeedStartPos.setValue(relativePos.x(), relativePos.y()); - EWOL_VERBOSE("SCROOL == > MOVE (" << scrollOffset.x() << "," << scrollOffset.y() << ")"); + if (m_limit.x() != 0.0f) { + scrollOffset.setX(scrollOffset.x() + (relativePos.x() - m_highSpeedStartPos.x())); + scrollOffset.setX(etk_avg(0, scrollOffset.x(), (scrollSize.x() - m_size.x()*m_limit.x()))); + } + if (m_limit.y() != 0.0f) { + scrollOffset.setY(scrollOffset.y() - (relativePos.y() - m_highSpeedStartPos.y())); + scrollOffset.setY(etk_avg(0, scrollOffset.y(), (scrollSize.y() - m_size.y()*m_limit.y()))); + } + // update current position: + m_highSpeedStartPos = relativePos; + EWOL_VERBOSE("SCROOL == > MOVE " << scrollOffset); markToRedraw(); + if (NULL!=m_subWidget) { + m_subWidget->setOffset(scrollOffset); + } return true; } } else if ( m_highSpeedMode != speedModeDisable diff --git a/sources/ewol/widget/Scroll.h b/sources/ewol/widget/Scroll.h index 039b2d5c..364363e3 100644 --- a/sources/ewol/widget/Scroll.h +++ b/sources/ewol/widget/Scroll.h @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include namespace ewol { @@ -37,7 +37,8 @@ namespace ewol { public: static void init(ewol::widget::Manager& _widgetManager); private: - ewol::compositing::Drawing m_draw; // TODO : change in shaper ... == > better for annimation and dynamic display ... + ewol::compositing::Shaper m_shaperH; //!< Compositing theme Horizontal. + ewol::compositing::Shaper m_shaperV; //!< Compositing theme Vertical. protected: vec2 m_limit; private: @@ -47,7 +48,7 @@ namespace ewol { int32_t m_highSpeedButton; enum ewol::key::type m_highSpeedType; public: - Scroll(void); + Scroll(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json"); virtual ~Scroll(void); /** * @brief set the limit of scrolling diff --git a/sources/ewol/widget/WidgetScrolled.cpp b/sources/ewol/widget/WidgetScrolled.cpp index 97cbc7a6..0f5eca94 100644 --- a/sources/ewol/widget/WidgetScrolled.cpp +++ b/sources/ewol/widget/WidgetScrolled.cpp @@ -16,8 +16,8 @@ ewol::widget::WidgetScrolled::WidgetScrolled(const std::string& _shaperName) : - m_shaperH(_shaperName), - m_shaperV(_shaperName) { + m_shaperH(_shaperName), + m_shaperV(_shaperName) { addObjectType("ewol::widget::WidgetScrolled"); m_originScrooled.setValue(0,0); m_pixelScrolling = 20;