public:
void setTapHandler(TapHandler handler);
void setDoubleTapHandler(TapHandler handler);
+ void setTapAndHoldHandler(TapHandler handler);
private:
void onMouseDown(ucl::Widget &widget, void *eventInfo);
bool isFastTap(ucl::UInt curTime, int curX, int curY) const;
double calcDownDistance(int curX, int curY) const;
+ void restartHoldTimer();
+ void stopHoldTimer();
+ Eina_Bool onHoldTimer();
+
private:
TapHandler m_tapHandler;
TapHandler m_doubleTapHandler;
+ TapHandler m_tapAndHoldHandler;
+ Ecore_Timer *m_holdTimer;
ucl::UInt m_downTime;
int m_downX;
int m_downY;
m_touchParser = makeShared<TouchParser>(m_btn);
m_touchParser->setDoubleTapHandler(
DELEGATE(Item::onDoubleTap, this));
+ m_touchParser->setTapAndHoldHandler(
+ DELEGATE(Item::onTapAndHold, this));
}
Widget &getWidget()
}
}
+ void onTapAndHold(const int x, const int y)
+ {
+ if (isRealized()) {
+ m_imageGrid.handleItemEvent(m_realizeIndex,
+ ITEM_EVENT_TAP_AND_HOLD, x, y);
+ }
+ }
+
private:
const ImageGrid &m_imageGrid;
StyledWidget m_btn;
constexpr auto TAP_MOVE_THRESHOLD = 30;
constexpr auto FAST_TAP_DISTANCE = 60;
constexpr auto FAST_TAP_DELAY_MS = 300;
+ constexpr auto TAP_AND_HOLD_DELAY_SEC = (500.0 / 1000.0);
}}}
namespace gallery {
TouchParser::TouchParser(RefCountObjBase &rc, Widget &eventSource) :
RefCountAware(&rc),
+ m_holdTimer(nullptr),
m_downTime(0),
m_downX(0),
m_downY(0),
TouchParser::~TouchParser()
{
+ stopHoldTimer();
}
void TouchParser::setTapHandler(TapHandler handler)
m_doubleTapHandler = handler;
}
+ void TouchParser::setTapAndHoldHandler(TapHandler handler)
+ {
+ m_tapAndHoldHandler = handler;
+ }
+
void TouchParser::onMouseDown(Widget &widget, void *eventInfo)
{
if (m_isMouseDown) {
if (!isFastTap(e->timestamp, e->canvas.x, e->canvas.y)) {
m_tapCounter = 0;
+ restartHoldTimer();
} else if (m_doubleTapHandler && (m_tapCounter == 1)) {
m_doubleTapHandler(m_downX, m_downY);
}
const auto e = static_cast<Evas_Event_Mouse_Up *>(eventInfo);
+ stopHoldTimer();
updateIsTapPossible(e->event_flags, e->canvas.x, e->canvas.y);
if (!m_isTapPossible) {
const auto e = static_cast<Evas_Event_Mouse_Move *>(eventInfo);
updateIsTapPossible(e->event_flags, e->cur.canvas.x, e->cur.canvas.y);
+
+ if (!m_isTapPossible) {
+ stopHoldTimer();
+ }
}
void TouchParser::updateIsTapPossible(const int flags,
return sqrt(1.0 * dx * dx + 1.0 * dy * dy);
}
+
+ void TouchParser::restartHoldTimer()
+ {
+ stopHoldTimer();
+ m_holdTimer = ecore_timer_add(impl::TAP_AND_HOLD_DELAY_SEC,
+ CALLBACK_A(TouchParser::onHoldTimer), this);
+ }
+
+ void TouchParser::stopHoldTimer()
+ {
+ if (m_holdTimer) {
+ ecore_timer_del(m_holdTimer);
+ m_holdTimer = nullptr;
+ }
+ }
+
+ Eina_Bool TouchParser::onHoldTimer()
+ {
+ m_holdTimer = nullptr;
+ if (m_tapAndHoldHandler) {
+ m_tapAndHoldHandler(m_downX, m_downY);
+ }
+ return ECORE_CALLBACK_CANCEL;
+ }
}