diff --git a/jni/widgetDrawer.cpp b/jni/widgetDrawer.cpp index fa8df7f..4d917de 100644 --- a/jni/widgetDrawer.cpp +++ b/jni/widgetDrawer.cpp @@ -26,6 +26,8 @@ #include +#include + #include #include #include @@ -39,10 +41,8 @@ widgetDrawer::widgetDrawer(void) { m_fontNormal = -1; m_fontSize = 15; + m_nearestDot = -1; m_movingPoint = false; - m_lastSelected[0] = -1; - m_lastSelected[1] = -1; - m_lastSelected[2] = -1; m_textColorFg.red = 0.0; m_textColorFg.green = 0.0; m_textColorFg.blue = 0.0; @@ -132,7 +132,7 @@ void widgetDrawer::OnRegenerateDisplay(void) coord2D_ts position; position.x = BORDER_SIZE + m_dotList[iii].x * (drawPosStop.x-drawPosStart.x); position.y = BORDER_SIZE + m_dotList[iii].y * (drawPosStop.y-drawPosStart.y); - if (m_lastSelected[2] == iii) { + if (true == DotIsSelected(iii)) { color_ts tmpColor; tmpColor.red = 1.0; tmpColor.green = 0.0; @@ -141,44 +141,20 @@ void widgetDrawer::OnRegenerateDisplay(void) m_OObjectsColored[m_currentCreateId].SetColor(tmpColor); m_OObjectsColored[m_currentCreateId].Rectangle( position.x-1, position.y-1, 3, 3); m_OObjectsColored[m_currentCreateId].SetColor(bgColor); - } else if (m_lastSelected[1] == iii) { + } else { + m_OObjectsColored[m_currentCreateId].RectangleBorder( position.x-1, position.y-1, 3, 3, 1); + } + if (m_nearestDot == iii) { color_ts tmpColor; - tmpColor.red = 0.0; - tmpColor.green = 1.0; - tmpColor.blue = 0.0; - tmpColor.alpha = 1.0; - m_OObjectsColored[m_currentCreateId].SetColor(tmpColor); - m_OObjectsColored[m_currentCreateId].Rectangle( position.x-1, position.y-1, 3, 3); - m_OObjectsColored[m_currentCreateId].SetColor(bgColor); - } else if (m_lastSelected[0] == iii) { - color_ts tmpColor; - tmpColor.red = 0.0; + tmpColor.red = 1.0; tmpColor.green = 0.0; tmpColor.blue = 1.0; tmpColor.alpha = 1.0; m_OObjectsColored[m_currentCreateId].SetColor(tmpColor); - m_OObjectsColored[m_currentCreateId].Rectangle( position.x-1, position.y-1, 3, 3); + m_OObjectsColored[m_currentCreateId].Circle( position.x, position.y, 6, 1); m_OObjectsColored[m_currentCreateId].SetColor(bgColor); - } else { - m_OObjectsColored[m_currentCreateId].RectangleBorder( position.x-1, position.y-1, 3, 3, 1); } } - - /* - coord2D_ts textPos; - textPos.x = 20; - textPos.y = 20; - color_ts myColor; - myColor.red = 1.0; - myColor.green = 0.0; - myColor.blue = 0.0; - myColor.alpha = 1.0; - m_OObjectTextNormal[m_currentCreateId].SetColor(myColor); - etk::UString tmpDisplay = "test de text"; - m_OObjectTextNormal[m_currentCreateId].Text(textPos, tmpDisplay); - */ - - m_needFlipFlop = true; } } @@ -186,10 +162,39 @@ void widgetDrawer::OnRegenerateDisplay(void) bool widgetDrawer::OnEventKb(ewol::eventKbType_te typeEvent, uniChar_t unicodeData) { - //EDN_DEBUG("KB EVENT : \"" << UTF8_data << "\" size=" << strlen(UTF8_data) << "type=" << (int32_t)typeEvent); - if (typeEvent == ewol::EVENT_KB_TYPE_DOWN) { - - MarkToReedraw(); + //DRAW_DEBUG("KB EVENT : \"" << unicodeData << "\"" << "type=" << (int32_t)typeEvent); + if (typeEvent == ewol::EVENT_KB_TYPE_UP) { + if (unicodeData == 0x7F) { + // Remove all selected points ... + for(int32_t iii=m_dotList.Size()-1 ; iii>=0 ; iii--) { + if (true == DotIsSelected(iii)) { + // Remove all link who have a selected point : + for(int32_t jjj=m_linkList.Size()-1; jjj>=0; jjj--) { + if( m_linkList[jjj].dot[0] == iii + || m_linkList[jjj].dot[1] == iii + || m_linkList[jjj].dot[2] == iii ) { + m_linkList.Erase(jjj); + } + } + m_dotList.Erase(iii); + for(int32_t jjj=m_linkList.Size()-1; jjj>=0; jjj--) { + if(m_linkList[jjj].dot[0] > iii) { + m_linkList[jjj].dot[0]--; + } + if(m_linkList[jjj].dot[1] > iii) { + m_linkList[jjj].dot[1]--; + } + if(m_linkList[jjj].dot[2] > iii) { + m_linkList[jjj].dot[2]--; + } + } + } + } + // rmemove all the selected list + m_selectedList.Clear(); + + MarkToReedraw(); + } } return true; } @@ -226,6 +231,16 @@ int32_t widgetDrawer::GetNearestPoint(coord2D_ts pos) return idNearest; } +bool widgetDrawer::DotIsSelected(int32_t dotId) +{ + for( int32_t iii=0; iii< m_selectedList.Size(); iii++) { + if (m_selectedList[iii] == dotId) { + return true; + } + } + return false; +} + /** * @brief Event on an input 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)) @@ -255,54 +270,61 @@ bool widgetDrawer::OnEventInput(int32_t IdInput, ewol::eventInputType_te typeEve position.x = (relativePos.x - BORDER_SIZE) / (drawPosStop.x-drawPosStart.x); position.y = (relativePos.y - BORDER_SIZE) / (drawPosStop.y-drawPosStart.y); - if (1 == IdInput) { + position.x = etk_avg(0, position.x, 1); + position.y = etk_avg(0, position.y, 1); + //DRAW_DEBUG(" event " << IdInput); + if (0 == IdInput) { + m_nearestDot = GetNearestPoint(position); + MarkToReedraw(); + } else if (1 == IdInput) { + KeepFocus(); if ( ewol::EVENT_INPUT_TYPE_SINGLE == typeEvent) { // try to find the point int select = GetNearestPoint(position); - if (select != m_lastSelected[2]) { - if (select == m_lastSelected[1] ) { - m_lastSelected[1] = m_lastSelected[2]; - m_lastSelected[2] = select; - } else { - m_lastSelected[0] = m_lastSelected[1]; - m_lastSelected[1] = m_lastSelected[2]; - m_lastSelected[2] = select; - } + if (false == ewol::IsSetShift() ) { + m_selectedList.Clear(); + m_selectedList.PushBack(select); MarkToReedraw(); + } else { + if (false == DotIsSelected(select)) { + // add element in the list + m_selectedList.PushBack(select); + MarkToReedraw(); + } else { + // remove it ... + for (int32_t iii=m_selectedList.Size()-1 ; iii>=0 ; iii--) { + if (m_selectedList[iii] == select) { + m_selectedList.Erase(iii); + } + } + } } } if ( ewol::EVENT_INPUT_TYPE_DOWN == typeEvent) { // try to find the point int select = GetNearestPoint(position); - if (select == m_lastSelected[2]) { - MarkToReedraw(); - m_movingPoint = true; + if (m_selectedList.Size() == 1) { + if (select == m_selectedList[0]) { + MarkToReedraw(); + m_movingPoint = true; + } } } else if (ewol::EVENT_INPUT_TYPE_UP == typeEvent) { m_movingPoint = false; MarkToReedraw(); } else if (ewol::EVENT_INPUT_TYPE_MOVE == typeEvent && true == m_movingPoint) { - // check if neede moving ... - if( relativePos.x < drawPosStart.x - || relativePos.y < drawPosStart.y - || relativePos.x > drawPosStop.x - || relativePos.y > drawPosStop.y) { - // No data to add ... + if (m_selectedList.Size() != 1) { + m_movingPoint = false; return false; } - m_dotList[m_lastSelected[2]] = position; + // set it in the drawing area + relativePos.x = etk_avg(drawPosStart.x, relativePos.x, drawPosStop.x); + relativePos.y = etk_avg(drawPosStart.y, relativePos.y, drawPosStop.y); + // instanciate the value ... + m_dotList[m_selectedList[0]] = position; MarkToReedraw(); } } else if (3 == IdInput && ewol::EVENT_INPUT_TYPE_SINGLE == typeEvent) { - // chack if not outside the cadre - if( relativePos.x < drawPosStart.x - || relativePos.y < drawPosStart.y - || relativePos.x > drawPosStop.x - || relativePos.y > drawPosStop.y) { - // No data to add ... - return false; - } - // convert the current position in a float -1 < x?y < 1 - // TODO : Set a min/max .. + m_dotList.PushBack(position); MarkToReedraw(); } @@ -322,16 +344,11 @@ void widgetDrawer::OnReceiveMessage(ewol::EObject * CallerObject, const char * e { DRAW_DEBUG("Extern Event : " << CallerObject << " type : " << eventId << " data=\"" << data << "\""); if (eventId == drawMsgGuiLinkNew) { - if( m_lastSelected[0] != -1 - && m_lastSelected[1] != -1 - && m_lastSelected[2] != -1) { + if (m_selectedList.Size() == 3) { link_ts tmpLink; - tmpLink.dot[0] = m_lastSelected[0]; - tmpLink.dot[1] = m_lastSelected[1]; - tmpLink.dot[2] = m_lastSelected[2]; - m_lastSelected[0] = -1; - m_lastSelected[1] = -1; - m_lastSelected[2] = -1; + tmpLink.dot[0] = m_selectedList[0]; + tmpLink.dot[1] = m_selectedList[1]; + tmpLink.dot[2] = m_selectedList[2]; tmpLink.color[0].red = 0.0; tmpLink.color[0].green = 0.0; tmpLink.color[0].blue = 1.0; diff --git a/jni/widgetDrawer.h b/jni/widgetDrawer.h index 631aeeb..52251d8 100644 --- a/jni/widgetDrawer.h +++ b/jni/widgetDrawer.h @@ -69,6 +69,13 @@ class widgetDrawer :public ewol::Widget * @return false the event is not used */ virtual bool OnEventInput(int32_t IdInput, ewol::eventInputType_te typeEvent, coord2D_ts pos); + /** + * @brief Event on the keybord (if no shortcut has been detected before). + * @param[in] type of the event (ewol::EVENT_KB_TYPE_DOWN or ewol::EVENT_KB_TYPE_UP) + * @param[in] unicodeValue key pressed by the user + * @return true if the event has been used + * @return false if the event has not been used + */ virtual bool OnEventKb(ewol::eventKbType_te typeEvent, uniChar_t unicodeData); virtual bool OnEventKbMove(ewol::eventKbType_te typeEvent, ewol::eventKbMoveType_te moveTypeEvent); private: @@ -81,12 +88,14 @@ class widgetDrawer :public ewol::Widget virtual void OnDraw(void); private: etk::VectorType m_dotList; //!< list of all point in the buffer - etk::VectorType m_linkList; //!< - int32_t m_lastSelected[3]; + etk::VectorType m_linkList; //!< List of all triangle in the mesh + etk::VectorType m_selectedList; //!< current selected points + int32_t m_nearestDot; //!< nearest dot from the current cursor bool m_movingPoint; void removeDotId(int32_t id); int32_t GetNearestPoint(coord2D_ts pos); etkFloat_t QuadDistance(coord2D_ts aaa, coord2D_ts bbb); + bool DotIsSelected(int32_t dotId); }; #endif