[DEV] Change scrool interface of the finger interface (2 finger instead of 1)

This commit is contained in:
Edouard DUPIN 2014-01-04 20:24:07 +01:00
parent b6feeb382f
commit 8fc8738c0f
5 changed files with 68 additions and 8 deletions

View File

@ -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);

View File

@ -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 );

View File

@ -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);

View File

@ -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) {

View File

@ -15,10 +15,12 @@
#include <ewol/widget/Scroll.h>
#include <ewol/compositing/Drawing.h>
#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)