diff --git a/Sources/libewol/ewol/EObjectManager.cpp b/Sources/libewol/ewol/EObjectManager.cpp index c063ed7c..3ac8e07f 100644 --- a/Sources/libewol/ewol/EObjectManager.cpp +++ b/Sources/libewol/ewol/EObjectManager.cpp @@ -23,6 +23,7 @@ */ #include +#include #undef __class__ #define __class__ "EObjectManager" @@ -108,6 +109,8 @@ void informOneObjectIsRemoved(ewol::EObject* object) m_eObjectList[iii]->OnObjectRemove(object); } } + // call input event manager to remove linked widget ... + ewol::eventInput::OnObjectRemove(object); } diff --git a/Sources/libewol/ewol/Widget.cpp b/Sources/libewol/ewol/Widget.cpp index 3316dbcd..770e4991 100644 --- a/Sources/libewol/ewol/Widget.cpp +++ b/Sources/libewol/ewol/Widget.cpp @@ -122,6 +122,17 @@ bool ewol::Widget::CalculateSize(etkFloat_t availlableX, etkFloat_t availlableY) } +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::Widget::GetWidgetAtPos(coord2D_ts pos) +{ + return this; +} + bool ewol::Widget::GenEventInput(int32_t IdInput, eventInputType_te typeEvent, coord2D_ts pos) { eventPosition_ts eventPos; diff --git a/Sources/libewol/ewol/Widget.h b/Sources/libewol/ewol/Widget.h index 82c5d590..cfad0cee 100644 --- a/Sources/libewol/ewol/Widget.h +++ b/Sources/libewol/ewol/Widget.h @@ -128,6 +128,7 @@ namespace ewol { public: void SetOrigin(etkFloat_t x, etkFloat_t y) { m_origin.x=x; m_origin.y=y;}; coord2D_ts GetOrigin(void) { return m_origin; }; + coord2D_ts RelativePosition(coord2D_ts pos) { pos.x -= m_origin.x; pos.y -= m_origin.y; return pos; }; virtual bool CalculateSize(etkFloat_t availlableX, etkFloat_t availlableY); // this generate the current size ... //update the min Size ... and the expend parameters for the sizer virtual bool CalculateMinSize(void) {m_minSize.x = m_userMinSize.x; m_minSize.y = m_userMinSize.y; MarkToReedraw(); return true; }; @@ -162,10 +163,26 @@ namespace ewol { virtual void OnLostFocus(void) {}; public: + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); // external acces to set an input event on this widget. + // TODO : deprecated ... bool GenEventInput(int32_t IdInput, eventInputType_te typeEvent, coord2D_ts pos); // call when input event arrive and call OnEventInput, if no event detected virtual bool GenEventShortCut(bool shift, bool control, bool alt, bool meta, uint32_t unicodeValue); - protected: + // TODO : Remasterised ... + /** + * @brief Manage input event of this Widget + * @param[in] IdInput Id of the current Input (PC : left=1, right=2, middle=3, none=0 / Tactil : first finger=1 , second=2 (only on this widget, no knowledge at ouside finger)) + * @param[in] typeEvent ewol type of event like EVENT_INPUT_TYPE_DOWN/EVENT_INPUT_TYPE_MOVE/EVENT_INPUT_TYPE_UP/EVENT_INPUT_TYPE_SINGLE/EVENT_INPUT_TYPE_DOUBLE/... + * @param[in] pos Relative and absolute position + * @return true the event is used + * @return false the event is not used + */ virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { return false; }; // ---------------------------------------------------------------------------------------------------------------- // -- Keboard event (when one is present or when a graphical is present diff --git a/Sources/libewol/ewol/Windows.cpp b/Sources/libewol/ewol/Windows.cpp index d84f69af..6eb08ca9 100644 --- a/Sources/libewol/ewol/Windows.cpp +++ b/Sources/libewol/ewol/Windows.cpp @@ -103,9 +103,41 @@ bool ewol::Windows::CalculateSize(etkFloat_t availlableX, etkFloat_t availlableY return true; } +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::Windows::GetWidgetAtPos(coord2D_ts pos) +{ + // calculate relative position + coord2D_ts relativePos = RelativePosition(pos); + + if (NULL != m_keyBoardwidget && false == m_keyBoardwidget->IsHide() ) { + coord2D_ts tmpSize = m_keyBoardwidget->GetMinSize(); + if (relativePos.y > m_size.y - tmpSize.y) { + return m_keyBoardwidget->GetWidgetAtPos(pos); + } + } + // event go directly on the pop-up + if (0 < m_popUpWidgetList[m_currentCreateId].Size()) { + if (NULL == m_popUpWidgetList[m_currentCreateId][m_popUpWidgetList[m_currentCreateId].Size()-1]) { + m_popUpWidgetList[m_currentCreateId].PopBack(); + } else { + return m_popUpWidgetList[m_currentCreateId][m_popUpWidgetList[m_currentCreateId].Size()-1]->GetWidgetAtPos(pos); + } + // otherwise in the normal windows + } else if (NULL != m_subWidget[m_currentCreateId]) { + return m_subWidget[m_currentCreateId]->GetWidgetAtPos(pos); + } + // otherwise the event go to this widget ... + return this; +} bool ewol::Windows::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { +/* if (NULL != m_keyBoardwidget && false == m_keyBoardwidget->IsHide() ) { coord2D_ts tmpSize = m_keyBoardwidget->GetMinSize(); if (pos.local.y > m_size.y - tmpSize.y) { @@ -124,6 +156,7 @@ bool ewol::Windows::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, e } else if (NULL != m_subWidget[m_currentCreateId]) { m_subWidget[m_currentCreateId]->GenEventInput(IdInput, typeEvent, pos.abs); } +*/ return true; } diff --git a/Sources/libewol/ewol/Windows.h b/Sources/libewol/ewol/Windows.h index 81da46e6..ccc7117d 100644 --- a/Sources/libewol/ewol/Windows.h +++ b/Sources/libewol/ewol/Windows.h @@ -52,6 +52,13 @@ namespace ewol { virtual void On(void) { }; public: virtual bool CalculateSize(etkFloat_t availlableX, etkFloat_t availlableY); + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); private: bool m_hasDecoration; diff --git a/Sources/libewol/ewol/base/MainThread.cpp b/Sources/libewol/ewol/base/MainThread.cpp index 5bc66d7e..33882f2e 100644 --- a/Sources/libewol/ewol/base/MainThread.cpp +++ b/Sources/libewol/ewol/base/MainThread.cpp @@ -23,6 +23,7 @@ */ +#include #include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include @@ -77,8 +79,6 @@ typedef struct { float y; } eventInputState_ts; -void EWOL_NativeEventInputMotion(int pointerID, float x, float y ); -void EWOL_NativeEventInputState(int pointerID, bool isUp, float x, float y ); void EWOL_NativeResize(int w, int h ); void EWOL_NativeRegenerateDisplay(void); @@ -107,6 +107,7 @@ static void* BaseAppEntry(void* param) ewol::EObjectManager::Init(); ewol::EObjectMessageMultiCast::Init(); + ewol::eventInput::Init(); ewol::widgetManager::Init(); ewol::texture::Init(); ewol::theme::Init(); @@ -140,14 +141,24 @@ static void* BaseAppEntry(void* param) //EWOL_DEBUG("Receive MSG : THREAD_INPUT_MOTION"); { eventInputMotion_ts * tmpData = (eventInputMotion_ts*)data.data; - EWOL_NativeEventInputMotion(tmpData->pointerID, tmpData->x, tmpData->y); + coord2D_ts pos; + pos.x = tmpData->x; + pos.y = tmpData->y; + ewol::eventInput::Motion(tmpData->pointerID, pos); } break; case THREAD_INPUT_STATE: //EWOL_DEBUG("Receive MSG : THREAD_INPUT_STATE"); { eventInputState_ts * tmpData = (eventInputState_ts*)data.data; - EWOL_NativeEventInputState(tmpData->pointerID, tmpData->state, tmpData->x, tmpData->y); + bool isdown = true; + if (true==tmpData->state) { + isdown = false; + } + coord2D_ts pos; + pos.x = tmpData->x; + pos.y = tmpData->y; + ewol::eventInput::State(tmpData->pointerID, tmpData->state, pos); } break; case THREAD_KEYBORAD_KEY: @@ -202,6 +213,7 @@ static void* BaseAppEntry(void* param) ewol::EObjectMessageMultiCast::UnInit(); ewol::EObjectManager::UnInit(); ewol::theme::UnInit(); + ewol::eventInput::UnInit(); EWOL_DEBUG("==> Un-Init BThread (END)"); pthread_exit(NULL); } diff --git a/Sources/libewol/ewol/base/eventInputManagement.cpp b/Sources/libewol/ewol/base/eventInputManagement.cpp new file mode 100644 index 00000000..60908f19 --- /dev/null +++ b/Sources/libewol/ewol/base/eventInputManagement.cpp @@ -0,0 +1,312 @@ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef struct { + bool isUsed; + int32_t destinationInputId; + int64_t lastTimeEvent; + ewol::Widget* curentWidgetEvent; + coord2D_ts origin; + coord2D_ts size; + coord2D_ts downStart; + coord2D_ts lastEventPos; + bool isDown; + int32_t nbClickEvent; // 0 .. 1 .. 2 .. 3 +} InputPoperty_ts; + + +#define MAX_MANAGE_INPUT (10) +InputPoperty_ts eventInputSaved[MAX_MANAGE_INPUT]; + +/** + * @brief Inform object that an other object is removed ... + * @param[in] removeObject Pointer on the EObject remeved ==> the user must remove all reference on this EObject + * @note : Sub classes must call this class + * @return --- + */ +void ewol::eventInput::OnObjectRemove(ewol::EObject * removeObject) +{ + for(int32_t iii=0; iiiRelativePosition(pos); + return destWidget->OnEventInput(IdInput, typeEvent, tmpEventPosition); + } + return false; +} + + + +// defined by the platform specific file : +extern int32_t separateClickTime; +extern int32_t offsetMoveClicked; +extern int32_t offsetMoveClickedDouble; + +void ewol::eventInput::Motion(int pointerID, coord2D_ts pos) +{ + if( pointerID > MAX_MANAGE_INPUT + || pointerID < 0) { + // not manage input + return; + } + if (true == eventInputSaved[pointerID].isUsed) { + EWOL_DEBUG("GUI : Input ID=" << pointerID << " [MOVE] (" << pos.x << "," << pos.y << ")"); + localEventInput(eventInputSaved[pointerID].curentWidgetEvent, pointerID, ewol::EVENT_INPUT_TYPE_MOVE, pos); + } +} + +void ewol::eventInput::State(int pointerID, bool isDown, coord2D_ts pos) +{ + if( pointerID > MAX_MANAGE_INPUT + || pointerID < 0) { + // not manage input + return; + } + // get the curent time ... + int64_t currentTime = GetCurrentTime(); + + if (true == isDown) { + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [DOWN] x=" << pos.x << " y=" << pos.y); + if(true == eventInputSaved[pointerID].isUsed) { + // bad case ... ??? + } else { + // Mark it used : + eventInputSaved[pointerID].isUsed = true; + // Save current position : + eventInputSaved[pointerID].downStart = pos; + // save start time + eventInputSaved[pointerID].lastTimeEvent = currentTime; + // get destination widget : + if(NULL != gui_uniqueWindows) { + eventInputSaved[pointerID].curentWidgetEvent = gui_uniqueWindows->GetWidgetAtPos(pos); + } else { + eventInputSaved[pointerID].curentWidgetEvent = NULL; + } + // generate DOWN Event + EWOL_DEBUG("GUI : Input ID=" << pointerID << " [DOWN] x=" << pos.x << " y=" << pos.y); + localEventInput(eventInputSaved[pointerID].curentWidgetEvent, pointerID, ewol::EVENT_INPUT_TYPE_DOWN, pos); + } + } else { + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [UP] (" << pos.x << "," << pos.y << ")"); + if(false == eventInputSaved[pointerID].isUsed) { + // bad case ... ??? + EWOL_WARNING("Up event without previous down ... "); + // Mark it un-used : + eventInputSaved[pointerID].isUsed = false; + // revove the widget ... + eventInputSaved[pointerID].curentWidgetEvent = NULL; + } else { + // generate UP Event + EWOL_DEBUG("GUI : Input ID=" << pointerID << " [UP] (" << pos.x << "," << pos.y << ")"); + localEventInput(eventInputSaved[pointerID].curentWidgetEvent, pointerID, ewol::EVENT_INPUT_TYPE_UP, pos); + // generate event (single) + if( abs(eventInputSaved[pointerID].downStart.x - pos.x) < offsetMoveClicked + && abs(eventInputSaved[pointerID].downStart.y - pos.y) < offsetMoveClicked ){ + // Save current position : + eventInputSaved[pointerID].downStart = pos; + // save start time + eventInputSaved[pointerID].lastTimeEvent = currentTime; + // generate event : + EWOL_DEBUG("GUI : Input ID=" << pointerID << " [SINGLE] (" << pos.x << "," << pos.y << ")"); + localEventInput(eventInputSaved[pointerID].curentWidgetEvent, pointerID, ewol::EVENT_INPUT_TYPE_SINGLE, pos); + } + // Mark it un-used : + eventInputSaved[pointerID].isUsed = false; + // revove the widget ... + eventInputSaved[pointerID].curentWidgetEvent = NULL; + } + } +} + + + +/* +void EWOL_NativeEventInputState(int pointerID, bool isDown, float x, float y ) +{ + coord2D_t pos; + pos.x = x; + pos.y = y; + if( pointerID > MAX_MANAGE_INPUT + || pointerID < 0) { + // not manage input + return; + } + //EWOL_INFO("GUI : Input ID=" << pointerID << " [" << isUp << "] x=" << x << " y=" << y); + if (isDown) { + //EWOL_DEBUG("GUI : Input ID=" << pointerID << " [DOWN] x=" << x << " y=" << y); + // Send Down message + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [DOWN] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); + localEventInput(pointerID, ewol::EVENT_INPUT_TYPE_DOWN, pos); + // Check double or triple click event ... + m_previousDown_x = x; + m_previousDown_y = y; + if (m_previousBouttonId != pointerID) { + m_previousBouttonId = pointerID; + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + m_previousDouble = false; + } else { + if( abs(m_previous_x - x) < offsetMoveClicked + && abs(m_previous_y - y) < offsetMoveClicked ) + { + // nothink to do ... wait up ... + } else { + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + m_previousDouble = false; + } + } + } else { + //EWOL_DEBUG("Event : Input ID=" << pointerID << " [UP] x=" << x << " y=" << y); + // Send Down message + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [UP] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); + localEventInput(pointerID, ewol::EVENT_INPUT_TYPE_UP, pos); + if (m_previousBouttonId != pointerID) { + m_previousDown_x = -1; + m_previousDown_y = -1; + m_previousBouttonId = 0; + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + m_previousDouble = false; + } else { + int64_t currentTime = GetCurrentTime(); // return the tic in 1ms + EWOL_VERBOSE("time is : " << (int)currentTime << " "<< (int)(currentTime/1000) <<"s " << (int)((currentTime%100)*10) << "ms delta : " << (currentTime - m_previousTime) << "<" << separateClickTime ); + if (currentTime - m_previousTime >= separateClickTime) { + //check if the same area click : + if( abs(m_previousDown_x - x) < offsetMoveClicked + && abs(m_previousDown_y - y) < offsetMoveClicked ) + { + // might generate an sigle event : + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [SINGLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); + localEventInput(pointerID, ewol::EVENT_INPUT_TYPE_SINGLE, pos); + m_previous_x = m_previousDown_x; + m_previous_y = m_previousDown_y; + m_previousTime = currentTime; + } else { + // reset values ... + m_previousDown_x = -1; + m_previousDown_y = -1; + m_previousBouttonId = 0; + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + } + m_previousDouble = false; + } else { + // TODO : the double ckick does not work, I need to check this later ... if needed + //check if the same area click : + if( abs(m_previous_x - x) < offsetMoveClickedDouble + && abs(m_previous_y - y) < offsetMoveClickedDouble ) + { + // might generate an sigle event : + if (false == m_previousDouble) { + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [DOUBLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); + localEventInput(pointerID, ewol::EVENT_INPUT_TYPE_DOUBLE, pos); + m_previousTime = currentTime; + m_previousDouble = true; + } else { + EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [TRIPLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); + localEventInput(pointerID, ewol::EVENT_INPUT_TYPE_TRIPLE, pos); + // reset values ... + m_previousDown_x = -1; + m_previousDown_y = -1; + m_previousBouttonId = 0; + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + m_previousDouble = false; + } + } else { + // reset values ... + m_previousDown_x = -1; + m_previousDown_y = -1; + m_previousBouttonId = 0; + m_previous_x = -1; + m_previous_y = -1; + m_previousTime = 0; + m_previousDouble = false; + } + } + } + } +} + +*/ + diff --git a/Sources/libewol/ewol/base/eventInputManagement.h b/Sources/libewol/ewol/base/eventInputManagement.h new file mode 100644 index 00000000..91b3e80f --- /dev/null +++ b/Sources/libewol/ewol/base/eventInputManagement.h @@ -0,0 +1,28 @@ + + + + +#ifndef __EWOL_EVENT_INPUT_MANAGEMENT_H__ +#define __EWOL_EVENT_INPUT_MANAGEMENT_H__ + +namespace ewol +{ + namespace eventInput + { + void Init(void); + void UnInit(void); + void Motion(int pointerID, coord2D_ts pos ); + void State(int pointerID, bool isDown, coord2D_ts pos); + + /** + * @brief Inform object that an other object is removed ... + * @param[in] removeObject Pointer on the EObject remeved ==> the user must remove all reference on this EObject + * @note : Sub classes must call this class + * @return --- + */ + void OnObjectRemove(ewol::EObject * removeObject); + } +} +#endif + + diff --git a/Sources/libewol/ewol/base/gui.cpp b/Sources/libewol/ewol/base/gui.cpp index 8c5fc3ac..6864eac1 100644 --- a/Sources/libewol/ewol/base/gui.cpp +++ b/Sources/libewol/ewol/base/gui.cpp @@ -150,167 +150,10 @@ void guiAbstraction::KeyboardHide(void) } -// defined by the platform specific file : -extern int32_t separateClickTime; -extern int32_t offsetMoveClicked; -extern int32_t offsetMoveClickedDouble; -static int32_t m_previousBouttonId = -1; -static int32_t m_previousDown_x = -1; -static int32_t m_previousDown_y = -1; -static int32_t m_previous_x = -1; -static int32_t m_previous_y = -1; -static int64_t m_previousTime = 0; -static bool m_previousDouble = false; -void EWOL_NativeEventInputMotion(int pointerID, float x, float y ) -{ - //EWOL_INFO("Event : Input Motion ID=" << pointerID << " x=" << x << " y=" << y); - if(0<=pointerID && pointerID < NB_MAX_INPUT ) { - if(NULL != gui_uniqueWindows) { - //EWOL_DEBUG("Event: bt=" << pointerID+1 << " ** = \"MotionNotify\" (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_MOVE, tmpCoord); - } - } -} -void EWOL_NativeEventInputState(int pointerID, bool isUp, float x, float y ) -{ - //EWOL_INFO("GUI : Input ID=" << pointerID << " [" << isUp << "] x=" << x << " y=" << y); - if (isUp) { - //EWOL_DEBUG("GUI : Input ID=" << pointerID << " [DOWN] x=" << x << " y=" << y); - if(0<=pointerID && pointerID < NB_MAX_INPUT ) { - // Send Down message - if (NULL != gui_uniqueWindows) { - EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [DOWN] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_DOWN, tmpCoord); - } - // Check double or triple click event ... - m_previousDown_x = x; - m_previousDown_y = y; - if (m_previousBouttonId != pointerID) { - m_previousBouttonId = pointerID; - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - m_previousDouble = false; - } else { - if( abs(m_previous_x - x) < offsetMoveClicked - && abs(m_previous_y - y) < offsetMoveClicked ) - { - // nothink to do ... wait up ... - } else { - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - m_previousDouble = false; - } - } - } - } else { - //EWOL_DEBUG("Event : Input ID=" << pointerID << " [UP] x=" << x << " y=" << y); - if(0<=pointerID && pointerID < NB_MAX_INPUT ) { - // Send Down message - if (NULL != gui_uniqueWindows) { - EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [UP] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_UP, tmpCoord); - } - if (m_previousBouttonId != pointerID) { - m_previousDown_x = -1; - m_previousDown_y = -1; - m_previousBouttonId = 0; - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - m_previousDouble = false; - } else { - int64_t currentTime = GetCurrentTime(); // return the tic in 1ms - EWOL_VERBOSE("time is : " << (int)currentTime << " "<< (int)(currentTime/1000) <<"s " << (int)((currentTime%100)*10) << "ms delta : " << (currentTime - m_previousTime) << "<" << separateClickTime ); - if (currentTime - m_previousTime >= separateClickTime) { - //check if the same area click : - if( abs(m_previousDown_x - x) < offsetMoveClicked - && abs(m_previousDown_y - y) < offsetMoveClicked ) - { - // might generate an sigle event : - EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [SINGLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_SINGLE, tmpCoord); - m_previous_x = m_previousDown_x; - m_previous_y = m_previousDown_y; - m_previousTime = currentTime; - } else { - // reset values ... - m_previousDown_x = -1; - m_previousDown_y = -1; - m_previousBouttonId = 0; - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - } - m_previousDouble = false; - } else { - // TODO : the double ckick does not work, I need to check this later ... if needed - //check if the same area click : - if( abs(m_previous_x - x) < offsetMoveClickedDouble - && abs(m_previous_y - y) < offsetMoveClickedDouble ) - { - // might generate an sigle event : - if (false == m_previousDouble) { - EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [DOUBLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_DOUBLE, tmpCoord); - m_previousTime = currentTime; - m_previousDouble = true; - } else { - EWOL_VERBOSE("GUI : Input ID=" << pointerID << " [TRIPLE] (" << (etkFloat_t)x << "," << (etkFloat_t)y << ")"); - // TODO : Rework this ... - coord2D_ts tmpCoord; - tmpCoord.x = x; - tmpCoord.y = y; - gui_uniqueWindows->GenEventInput(pointerID, ewol::EVENT_INPUT_TYPE_TRIPLE, tmpCoord); - // reset values ... - m_previousDown_x = -1; - m_previousDown_y = -1; - m_previousBouttonId = 0; - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - m_previousDouble = false; - } - } else { - // reset values ... - m_previousDown_x = -1; - m_previousDown_y = -1; - m_previousBouttonId = 0; - m_previous_x = -1; - m_previous_y = -1; - m_previousTime = 0; - m_previousDouble = false; - } - } - } - } - } -} static int64_t startTime = -1; static int64_t nbCallTime = 0; diff --git a/Sources/libewol/ewol/widget/ColorBar.cpp b/Sources/libewol/ewol/widget/ColorBar.cpp index dec3e634..c3997d8e 100644 --- a/Sources/libewol/ewol/widget/ColorBar.cpp +++ b/Sources/libewol/ewol/widget/ColorBar.cpp @@ -215,6 +215,8 @@ bool ewol::ColorBar::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, { //EWOL_DEBUG("Event on BT ..."); if (1 == IdInput) { + pos.local.x = etk_max(etk_min(pos.local.x, m_size.x),0); + pos.local.y = etk_max(etk_min(pos.local.y, m_size.y),0); if( ewol::EVENT_INPUT_TYPE_SINGLE == typeEvent || ewol::EVENT_INPUT_TYPE_DOUBLE == typeEvent || ewol::EVENT_INPUT_TYPE_TRIPLE == typeEvent diff --git a/Sources/libewol/ewol/widget/ContextMenu.cpp b/Sources/libewol/ewol/widget/ContextMenu.cpp index 3ca4dd07..76d21585 100644 --- a/Sources/libewol/ewol/widget/ContextMenu.cpp +++ b/Sources/libewol/ewol/widget/ContextMenu.cpp @@ -258,33 +258,55 @@ void ewol::ContextMenu::OnRegenerateDisplay(void) } -bool ewol::ContextMenu::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::ContextMenu::GetWidgetAtPos(coord2D_ts pos) { + // calculate relative position + coord2D_ts relativePos = RelativePosition(pos); + // Check for sub Element if (NULL != m_subWidget[m_currentCreateId]) { coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetSize(); coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId]->GetOrigin(); - if( (tmpOrigin.x <= pos.local.x && tmpOrigin.x + tmpSize.x >= pos.local.x) - && (tmpOrigin.y <= pos.local.y && tmpOrigin.y + tmpSize.y >= pos.local.y) ) + if( (tmpOrigin.x <= relativePos.x && tmpOrigin.x + tmpSize.x >= relativePos.x) + && (tmpOrigin.y <= relativePos.y && tmpOrigin.y + tmpSize.y >= relativePos.y) ) { - return m_subWidget[m_currentCreateId]->GenEventInput(IdInput, typeEvent, pos.abs); - } else { - //EWOL_INFO("Event ouside the context menu"); - if (IdInput > 0) { - if( typeEvent == ewol::EVENT_INPUT_TYPE_DOWN - || typeEvent == ewol::EVENT_INPUT_TYPE_MOVE - || typeEvent == ewol::EVENT_INPUT_TYPE_SINGLE - || typeEvent == ewol::EVENT_INPUT_TYPE_DOUBLE - || typeEvent == ewol::EVENT_INPUT_TYPE_TRIPLE - || typeEvent == ewol::EVENT_INPUT_TYPE_UP - || typeEvent == ewol::EVENT_INPUT_TYPE_ENTER - || typeEvent == ewol::EVENT_INPUT_TYPE_LEAVE ) { - // Auto-remove ... - MarkToRemove(); - } - } + return m_subWidget[m_currentCreateId]->GetWidgetAtPos(pos); } } - return true; + return this; +} + +/** + * @brief Manage input event of this Widget + * @param[in] IdInput Id of the current Input (PC : left=1, right=2, middle=3, none=0 / Tactil : first finger=1 , second=2 (only on this widget, no knowledge at ouside finger)) + * @param[in] typeEvent ewol type of event like EVENT_INPUT_TYPE_DOWN/EVENT_INPUT_TYPE_MOVE/EVENT_INPUT_TYPE_UP/EVENT_INPUT_TYPE_SINGLE/EVENT_INPUT_TYPE_DOUBLE/... + * @param[in] pos Relative and absolute position + * @return true the event is used + * @return false the event is not used + */ +bool ewol::ContextMenu::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) +{ + //EWOL_INFO("Event ouside the context menu"); + if (IdInput > 0) { + if( typeEvent == ewol::EVENT_INPUT_TYPE_DOWN + || typeEvent == ewol::EVENT_INPUT_TYPE_MOVE + || typeEvent == ewol::EVENT_INPUT_TYPE_SINGLE + || typeEvent == ewol::EVENT_INPUT_TYPE_DOUBLE + || typeEvent == ewol::EVENT_INPUT_TYPE_TRIPLE + || typeEvent == ewol::EVENT_INPUT_TYPE_UP + || typeEvent == ewol::EVENT_INPUT_TYPE_ENTER + || typeEvent == ewol::EVENT_INPUT_TYPE_LEAVE ) { + // Auto-remove ... + MarkToRemove(); + return true; + } + } + return false; } diff --git a/Sources/libewol/ewol/widget/ContextMenu.h b/Sources/libewol/ewol/widget/ContextMenu.h index 9172d890..4b293b62 100644 --- a/Sources/libewol/ewol/widget/ContextMenu.h +++ b/Sources/libewol/ewol/widget/ContextMenu.h @@ -66,6 +66,13 @@ namespace ewol { public: virtual void OnRegenerateDisplay(void); public: + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); virtual void OnFlipFlopEvent(void); }; diff --git a/Sources/libewol/ewol/widget/PopUp.cpp b/Sources/libewol/ewol/widget/PopUp.cpp index 55dce3f2..c94f28da 100644 --- a/Sources/libewol/ewol/widget/PopUp.cpp +++ b/Sources/libewol/ewol/widget/PopUp.cpp @@ -179,8 +179,35 @@ void ewol::PopUp::OnRegenerateDisplay(void) } +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::PopUp::GetWidgetAtPos(coord2D_ts pos) +{ + // calculate relative position + coord2D_ts relativePos = RelativePosition(pos); + // for the element in the pop-up ... + if (NULL != m_subWidget[m_currentCreateId]) { + coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetSize(); + coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId]->GetOrigin(); + if( (tmpOrigin.x <= relativePos.x && tmpOrigin.x + tmpSize.x >= relativePos.x) + && (tmpOrigin.y <= relativePos.y && tmpOrigin.y + tmpSize.y >= relativePos.y) ) + { + return m_subWidget[m_currentCreateId]->GetWidgetAtPos(pos); + } else { + //EWOL_INFO("Event ouside the Pop-up"); + } + } + // otherwise the event go to this widget ... + return this; +} + bool ewol::PopUp::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { +/* if (NULL != m_subWidget[m_currentCreateId]) { coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetSize(); coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId]->GetOrigin(); @@ -192,6 +219,7 @@ bool ewol::PopUp::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eve //EWOL_INFO("Event ouside the Pop-up"); } } +*/ return true; } diff --git a/Sources/libewol/ewol/widget/PopUp.h b/Sources/libewol/ewol/widget/PopUp.h index e7d09065..bfd76c26 100644 --- a/Sources/libewol/ewol/widget/PopUp.h +++ b/Sources/libewol/ewol/widget/PopUp.h @@ -56,6 +56,13 @@ namespace ewol { public: virtual void OnRegenerateDisplay(void); public: + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); virtual void OnFlipFlopEvent(void); /** diff --git a/Sources/libewol/ewol/widget/SizerHori.cpp b/Sources/libewol/ewol/widget/SizerHori.cpp index d678deed..5434e591 100644 --- a/Sources/libewol/ewol/widget/SizerHori.cpp +++ b/Sources/libewol/ewol/widget/SizerHori.cpp @@ -234,8 +234,34 @@ void ewol::SizerHori::OnRegenerateDisplay(void) } +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::SizerHori::GetWidgetAtPos(coord2D_ts pos) +{ + // for all element in the sizer ... + for (int32_t iii=0; iiiGetSize(); + coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId][iii]->GetOrigin(); + if( (tmpOrigin.x <= pos.x && tmpOrigin.x + tmpSize.x >= pos.x) + && (tmpOrigin.y <= pos.y && tmpOrigin.y + tmpSize.y >= pos.y) ) + { + return m_subWidget[m_currentCreateId][iii]->GetWidgetAtPos(pos); + } + } + } + // otherwise the event go to this widget ... + return this; +} + + bool ewol::SizerHori::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { +/* for (int32_t iii=0; iiiGetSize(); @@ -247,6 +273,7 @@ bool ewol::SizerHori::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, } } } +*/ return true; } diff --git a/Sources/libewol/ewol/widget/SizerHori.h b/Sources/libewol/ewol/widget/SizerHori.h index 92022fc7..e14a48ea 100644 --- a/Sources/libewol/ewol/widget/SizerHori.h +++ b/Sources/libewol/ewol/widget/SizerHori.h @@ -56,6 +56,13 @@ namespace ewol { virtual bool OnDraw(void); public: virtual void OnRegenerateDisplay(void); + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); virtual void OnFlipFlopEvent(void); /** diff --git a/Sources/libewol/ewol/widget/SizerVert.cpp b/Sources/libewol/ewol/widget/SizerVert.cpp index c069e100..0357b861 100644 --- a/Sources/libewol/ewol/widget/SizerVert.cpp +++ b/Sources/libewol/ewol/widget/SizerVert.cpp @@ -234,8 +234,33 @@ void ewol::SizerVert::OnRegenerateDisplay(void) } +/** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ +ewol::Widget * ewol::SizerVert::GetWidgetAtPos(coord2D_ts pos) +{ + // for all element in the sizer ... + for (int32_t iii=0; iiiGetSize(); + coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId][iii]->GetOrigin(); + if( (tmpOrigin.x <= pos.x && tmpOrigin.x + tmpSize.x >= pos.x) + && (tmpOrigin.y <= pos.y && tmpOrigin.y + tmpSize.y >= pos.y) ) + { + return m_subWidget[m_currentCreateId][iii]->GetWidgetAtPos(pos); + } + } + } + // otherwise the event go to this widget ... + return this; +} + bool ewol::SizerVert::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { +/* for (int32_t iii=0; iiiGetSize(); @@ -247,6 +272,7 @@ bool ewol::SizerVert::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, } } } +*/ return true; } diff --git a/Sources/libewol/ewol/widget/SizerVert.h b/Sources/libewol/ewol/widget/SizerVert.h index 166ebebb..7496ab51 100644 --- a/Sources/libewol/ewol/widget/SizerVert.h +++ b/Sources/libewol/ewol/widget/SizerVert.h @@ -57,6 +57,14 @@ namespace ewol { public: virtual void OnRegenerateDisplay(void); public: + /** + * @brief Get the widget at the specific windows absolute position + * @param[in] pos gAbsolute position of the requested widget knowledge + * @return NULL No widget found + * @return pointer on the widget found + */ + virtual ewol::Widget * GetWidgetAtPos(coord2D_ts pos); + virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); virtual void OnFlipFlopEvent(void); /** diff --git a/Sources/libewol/ewol/widget/Slider.cpp b/Sources/libewol/ewol/widget/Slider.cpp index 8c6b5ed1..318e00cf 100644 --- a/Sources/libewol/ewol/widget/Slider.cpp +++ b/Sources/libewol/ewol/widget/Slider.cpp @@ -35,6 +35,7 @@ extern const char * const ewolEventSliderChange = "ewol-event-slider-change"; #undef __class__ #define __class__ "Slider" +const int32_t dotRadius = 6; ewol::Slider::Slider(void) { @@ -66,7 +67,7 @@ ewol::Slider::~Slider(void) bool ewol::Slider::CalculateMinSize(void) { m_minSize.x = 40; - m_minSize.y = 15; + m_minSize.y = dotRadius*2; MarkToReedraw(); return true; } @@ -111,9 +112,9 @@ void ewol::Slider::OnRegenerateDisplay(void) tmpOObjects->SetColor(m_textColorFg); // draw a line : - tmpOObjects->Line(4, m_size.y/2, m_size.x-4, m_size.y/2, 1); + tmpOObjects->Line(dotRadius, m_size.y/2, m_size.x-dotRadius, m_size.y/2, 1); - tmpOObjects->Disc(4+((etkFloat_t)(m_value-m_min)/(etkFloat_t)(m_max-m_min))*(etkFloat_t)(m_size.x-8), m_size.y/2, 4); + tmpOObjects->Disc(4+((etkFloat_t)(m_value-m_min)/(etkFloat_t)(m_max-m_min))*(etkFloat_t)(m_size.x-2*dotRadius), m_size.y/2, dotRadius); AddOObject(tmpOObjects); } @@ -130,9 +131,9 @@ bool ewol::Slider::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, ev || ewol::EVENT_INPUT_TYPE_MOVE == typeEvent) { // get the new position : EWOL_DEBUG("Event on Slider (" << pos.local.x << "," << pos.local.y << ")"); - m_value = m_min + (etkFloat_t)(pos.local.x - 4) / (etkFloat_t)(m_size.x-8) * (etkFloat_t)(m_max-m_min); + m_value = m_min + (etkFloat_t)(pos.local.x - dotRadius) / (etkFloat_t)(m_size.x-2*dotRadius) * (etkFloat_t)(m_max-m_min); m_value = etk_max(etk_min(m_value, m_max), m_min); - EWOL_DEBUG(" new value : " << m_value << "¤ [" << m_min << ".." << m_max << "]"); + EWOL_DEBUG(" new value : " << m_value << " in [" << m_min << ".." << m_max << "]"); GenerateEventId(ewolEventSliderChange); MarkToReedraw(); return true; diff --git a/Sources/libewol/ewol/widget/Slider.h b/Sources/libewol/ewol/widget/Slider.h index 23c712a3..c60f4f24 100644 --- a/Sources/libewol/ewol/widget/Slider.h +++ b/Sources/libewol/ewol/widget/Slider.h @@ -42,6 +42,7 @@ namespace ewol { int32_t GetValue(void); void SetMin(int32_t val); void SetMax(int32_t val); + void SetColor(color_ts newColor) { m_textColorFg = newColor; }; private: int32_t m_value; int32_t m_min; diff --git a/Sources/libewol/ewol/widgetMeta/ColorChooser.cpp b/Sources/libewol/ewol/widgetMeta/ColorChooser.cpp index f7045082..9b5a3a86 100644 --- a/Sources/libewol/ewol/widgetMeta/ColorChooser.cpp +++ b/Sources/libewol/ewol/widgetMeta/ColorChooser.cpp @@ -71,18 +71,30 @@ ewol::ColorChooser::ColorChooser(void) */ SubWidgetAdd(m_widgetColorBar); + color_ts sliderColor; + sliderColor.red = 0.0; + sliderColor.green = 0.0; + sliderColor.blue = 0.0; + sliderColor.alpha = 1.0; + m_widgetRed = new ewol::Slider(); m_widgetRed->RegisterOnEvent(this, ewolEventSliderChange, eventColorSpecificHasChange); m_widgetRed->SetExpendX(true); m_widgetRed->SetFillX(true); m_widgetRed->SetMin(0); m_widgetRed->SetMax(255); + sliderColor.red = 1.0; + m_widgetRed->SetColor(sliderColor); + sliderColor.red = 0.0; SubWidgetAdd(m_widgetRed); m_widgetGreen = new ewol::Slider(); m_widgetGreen->RegisterOnEvent(this, ewolEventSliderChange, eventColorSpecificHasChange); m_widgetGreen->SetExpendX(true); m_widgetGreen->SetFillX(true); m_widgetGreen->SetMin(0); + sliderColor.green = 1.0; + m_widgetGreen->SetColor(sliderColor); + sliderColor.green = 0.0; m_widgetGreen->SetMax(255); SubWidgetAdd(m_widgetGreen); m_widgetBlue = new ewol::Slider(); @@ -90,6 +102,9 @@ ewol::ColorChooser::ColorChooser(void) m_widgetBlue->SetExpendX(true); m_widgetBlue->SetFillX(true); m_widgetBlue->SetMin(0); + sliderColor.blue = 1.0; + m_widgetBlue->SetColor(sliderColor); + sliderColor.blue = 0.0; m_widgetBlue->SetMax(255); SubWidgetAdd(m_widgetBlue); m_widgetAlpha = new ewol::Slider(); diff --git a/Sources/libewol/file.mk b/Sources/libewol/file.mk index 3331a7e3..8eb6af5e 100644 --- a/Sources/libewol/file.mk +++ b/Sources/libewol/file.mk @@ -4,6 +4,7 @@ FILE_LIST = ewol/ewol.cpp \ ewol/threadMsg.cpp \ ewol/base/MainThread.cpp \ ewol/base/gui.cpp \ + ewol/base/eventInputManagement.cpp \ ewol/Debug.cpp \ ewol/EObject.cpp \ ewol/EObjectManager.cpp \