diff --git a/sources/ewol/context/InputManager.cpp b/sources/ewol/context/InputManager.cpp index 177cd4bf..40fd1c11 100644 --- a/sources/ewol/context/InputManager.cpp +++ b/sources/ewol/context/InputManager.cpp @@ -440,11 +440,6 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, << " == >" << eventTable[_pointerID].destinationInputId << " [UP] " << _pos); eventTable[_pointerID].posEvent = _pos; - localEventInput(_type, - eventTable[_pointerID].curentWidgetEvent, - _pointerID, - ewol::key::statusUp, - _pos); // generate event (single) if( abs(eventTable[_pointerID].downStart.x() - _pos.x()) < localLimit.DpiOffset && abs(eventTable[_pointerID].downStart.y() - _pos.y()) < localLimit.DpiOffset ){ @@ -481,6 +476,12 @@ void ewol::context::InputManager::state(enum ewol::key::type _type, eventTable[_pointerID].nbClickEvent = 0; } } + // send up event after the single event to prevent multiple widget getting elements + localEventInput(_type, + eventTable[_pointerID].curentWidgetEvent, + _pointerID, + ewol::key::statusUp, + _pos); // specific for tuch event if (_type == ewol::key::typeFinger) { cleanElement(eventTable, _pointerID); diff --git a/sources/ewol/context/InputManager.h b/sources/ewol/context/InputManager.h index 2ff90282..50084c3d 100644 --- a/sources/ewol/context/InputManager.h +++ b/sources/ewol/context/InputManager.h @@ -88,7 +88,7 @@ namespace ewol { public: InputManager(ewol::Context& _context); ~InputManager(void); - void setDpi(int32_t newDPI); + void setDpi(int32_t _newDPI); // note if id<0 == > the it was finger event ... void motion(enum ewol::key::type _type, int _pointerID, vec2 _pos ); diff --git a/sources/ewol/event/Input.h b/sources/ewol/event/Input.h index 80bec095..1fa3b107 100644 --- a/sources/ewol/event/Input.h +++ b/sources/ewol/event/Input.h @@ -54,6 +54,12 @@ namespace ewol { inline const vec2& getPos(void) const { return m_pos; }; + /** + * @brief Reset the input property of the curent event. + */ + void reset(void) const { + // TODO : Call the entry element ant rest it ... + } }; etk::CCout& operator <<(etk::CCout& _os, const ewol::event::Input& _obj); diff --git a/sources/ewol/widget/WidgetScrolled.cpp b/sources/ewol/widget/WidgetScrolled.cpp index 4f569e26..72f371e8 100644 --- a/sources/ewol/widget/WidgetScrolled.cpp +++ b/sources/ewol/widget/WidgetScrolled.cpp @@ -24,6 +24,11 @@ ewol::widget::WidgetScrooled::WidgetScrooled(void) { m_highSpeedType = ewol::key::typeUnknow; m_highSpeedButton = -1; m_limitScrolling = 0.5; + + m_fingerScoolActivated = false; + for (size_t iii = 0; iii < CALCULATE_SIMULTANEOUS_FINGER; ++iii) { + m_fingerPresent[iii] = false; + } } ewol::widget::WidgetScrooled::~WidgetScrooled(void) { @@ -256,6 +261,47 @@ bool ewol::widget::WidgetScrooled::onEventInput(const ewol::event::Input& _event } else if ( _event.getType() == ewol::key::typeFinger && ( m_highSpeedType == ewol::key::typeUnknow || m_highSpeedType == ewol::key::typeFinger) ) { + if (_event.getId() >= 3) { + return false; + } + int32_t idTable = _event.getId()-1; + if (_event.getStatus() == ewol::key::statusDown) { + m_fingerPresent[idTable] = true; + } else if (_event.getStatus() == ewol::key::statusUp) { + m_fingerPresent[idTable] = false; + } + if (m_fingerScoolActivated == false) { + m_fingerMoveStartPos[idTable] = relativePos; + } + if ( m_fingerPresent[0] == true + && m_fingerPresent[1] == true + && m_fingerScoolActivated == false) { + m_fingerScoolActivated = true; + EWOL_DEBUG("SCROOL == > START pos=" << m_fingerMoveStartPos); + } + if (m_fingerScoolActivated == true) { + // 1: scroll... + // 2: remove all unneeded sub event ... ==> maybe a better methode ... + if (_event.getStatus() == ewol::key::statusMove) { + m_originScrooled.setX(m_originScrooled.x() - (relativePos.x() - m_fingerMoveStartPos[idTable].x())*0.5f); + m_originScrooled.setY(m_originScrooled.y() - (relativePos.y() - m_fingerMoveStartPos[idTable].y())*0.5f); + m_originScrooled.setX(etk_avg(0, m_originScrooled.x(), (m_maxSize.x() - m_size.x()*m_limitScrolling))); + m_originScrooled.setY(etk_avg(0, m_originScrooled.y(), (m_maxSize.y() - m_size.y()*m_limitScrolling))); + m_fingerMoveStartPos[idTable] = relativePos; + EWOL_DEBUG("SCROOL == > MOVE m_originScrooled=" << m_originScrooled << " " << relativePos << " " << m_highSpeedStartPos); + markToRedraw(); + } + if ( m_fingerPresent[0] == false + && m_fingerPresent[1] == false) { + if (_event.getStatus() == ewol::key::statusUp) { + // TODO : Reset event ... + m_fingerScoolActivated = false; + _event.reset(); + } + } + return true; + } + #if 0 // old mode of first finger move... if (_event.getId() == 1) { EWOL_VERBOSE("event 1 " << _event); if (_event.getStatus() == ewol::key::statusDown) { @@ -302,6 +348,7 @@ bool ewol::widget::WidgetScrooled::onEventInput(const ewol::event::Input& _event markToRedraw(); return true; } + #endif } } else if (m_scroollingMode == scroolModeCenter) { if (_event.getType() == ewol::key::typeMouse) { diff --git a/sources/ewol/widget/WidgetScrolled.h b/sources/ewol/widget/WidgetScrolled.h index b8785281..4559c265 100644 --- a/sources/ewol/widget/WidgetScrolled.h +++ b/sources/ewol/widget/WidgetScrolled.h @@ -15,10 +15,12 @@ #include #include +#define CALCULATE_SIMULTANEOUS_FINGER (5) + namespace ewol { namespace widget { /** - * @ingroup ewolWidgetGroup + * @brief Widget to integrate a scrool bar in a widget. This is not a stadalone widget. */ class WidgetScrooled : public ewol::Widget { public: @@ -33,13 +35,17 @@ namespace ewol { vec2 m_originScrooled; //!< pixel distance from the origin of the display (Bottum left) vec2 m_maxSize; //!< Maximum size of the Widget ==> to display scrollbar float m_limitScrolling; //!< Mimit scrolling represent the propertion of the minimel scrolling activate (0.2 ==> 20% migt all time be visible) - private: + private: // Mouse section : enum scrollingMode m_scroollingMode; //!< mode of management of the scrooling float m_pixelScrolling; vec2 m_highSpeedStartPos; enum Scroll::highSpeedMode m_highSpeedMode; int32_t m_highSpeedButton; enum ewol::key::type m_highSpeedType; + private: // finger section: + bool m_fingerPresent[CALCULATE_SIMULTANEOUS_FINGER]; + bool m_fingerScoolActivated; + vec2 m_fingerMoveStartPos[CALCULATE_SIMULTANEOUS_FINGER]; public: /** * @brief Scroll Widget main constructor to be herited from an other widget (this is not a stand-alone widget)