From 03972e6d7abba9b3f8cd2f2cb2638b31a54114c9 Mon Sep 17 00:00:00 2001 From: Edouard Dupin Date: Tue, 10 Jul 2012 12:27:57 +0200 Subject: [PATCH] Select file upgraded and entry upgraded --- Sources/libewol/ewol/Widget.cpp | 1 + Sources/libewol/ewol/Widget.h | 23 +++++ .../ewol/base/eventInputManagement.cpp | 12 ++- Sources/libewol/ewol/widget/Entry.cpp | 33 ++++++- .../libewol/ewol/widgetMeta/FileChooser.cpp | 92 +++++++++---------- Sources/libewol/ewol/widgetMeta/FileChooser.h | 1 - 6 files changed, 107 insertions(+), 55 deletions(-) diff --git a/Sources/libewol/ewol/Widget.cpp b/Sources/libewol/ewol/Widget.cpp index 6a07d908..8fb8a95d 100644 --- a/Sources/libewol/ewol/Widget.cpp +++ b/Sources/libewol/ewol/Widget.cpp @@ -82,6 +82,7 @@ char* ewol::GetCharTypeMoveEvent(eventKbMoveType_te type) */ ewol::Widget::Widget(void) { + m_limitMouseEvent = 3; m_needRegenerateDisplay = true; m_currentDrawId = 0; m_currentCreateId = 1; diff --git a/Sources/libewol/ewol/Widget.h b/Sources/libewol/ewol/Widget.h index 4698361e..9cf14dac 100644 --- a/Sources/libewol/ewol/Widget.h +++ b/Sources/libewol/ewol/Widget.h @@ -338,6 +338,29 @@ namespace ewol { * @return --- */ virtual void OnLostFocus(void) {}; + + // ---------------------------------------------------------------------------------------------------------------- + // -- Mouse event properties Area + // ---------------------------------------------------------------------------------------------------------------- + private: + int32_t m_limitMouseEvent; //!< this is to limit the number of mouse event that the widget can supported + public: + /** + * @brief Get the number of mouse event supported + * @param --- + * @return return the number of event that the mouse supported [0..3] + */ + int32_t GetMouseLimit(void) { return m_limitMouseEvent; }; + /** + * @brief Get the number of mouse event supported + * @param[in] numberState The number of event that the mouse supported [0..3] + * @return --- + */ + void SetMouseLimit(int32_t numberState) { m_limitMouseEvent = numberState; }; + + // ---------------------------------------------------------------------------------------------------------------- + // -- Periodic call Area + // ---------------------------------------------------------------------------------------------------------------- protected: /** * @brief Request that the current widegt have a periodic call diff --git a/Sources/libewol/ewol/base/eventInputManagement.cpp b/Sources/libewol/ewol/base/eventInputManagement.cpp index 91e88e59..72381b70 100644 --- a/Sources/libewol/ewol/base/eventInputManagement.cpp +++ b/Sources/libewol/ewol/base/eventInputManagement.cpp @@ -350,17 +350,23 @@ void ewol::eventInput::State(ewol::inputType_te type, int pointerID, bool isDown eventTable[pointerID].downStart = pos; // save start time eventTable[pointerID].lastTimeEvent = currentTime; - if (eventTable[pointerID].nbClickEvent == 0) { + if( eventTable[pointerID].nbClickEvent == 0 + && eventTable[pointerID].curentWidgetEvent != NULL + && eventTable[pointerID].curentWidgetEvent->GetMouseLimit()>0 ) { // generate event SINGLE : eventTable[pointerID].nbClickEvent++; EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [SINGLE] " << pos); localEventInput(type, eventTable[pointerID].curentWidgetEvent, eventTable[pointerID].destinationInputId, ewol::EVENT_INPUT_TYPE_SINGLE, pos); - } else if (eventTable[pointerID].nbClickEvent == 1) { + } else if( eventTable[pointerID].nbClickEvent == 1 + && eventTable[pointerID].curentWidgetEvent != NULL + && eventTable[pointerID].curentWidgetEvent->GetMouseLimit()>1 ) { // generate event DOUBLE : eventTable[pointerID].nbClickEvent++; EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [DOUBLE] " << pos); localEventInput(type, eventTable[pointerID].curentWidgetEvent, eventTable[pointerID].destinationInputId, ewol::EVENT_INPUT_TYPE_DOUBLE, pos); - } else if (eventTable[pointerID].nbClickEvent == 2) { + } else if( eventTable[pointerID].nbClickEvent == 2 + && eventTable[pointerID].curentWidgetEvent != NULL + && eventTable[pointerID].curentWidgetEvent->GetMouseLimit()>2 ) { // generate event TRIPLE : eventTable[pointerID].nbClickEvent++; EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [TRIPLE] " << pos); diff --git a/Sources/libewol/ewol/widget/Entry.cpp b/Sources/libewol/ewol/widget/Entry.cpp index 689d0b91..f3b21747 100644 --- a/Sources/libewol/ewol/widget/Entry.cpp +++ b/Sources/libewol/ewol/widget/Entry.cpp @@ -221,11 +221,34 @@ bool ewol::Entry::OnEventInput(ewol::inputType_te type, int32_t IdInput, eventIn //EWOL_DEBUG("Event on Entry ..."); if (1 == IdInput) { if (ewol::EVENT_INPUT_TYPE_SINGLE == typeEvent) { - // nothing to do ... GenerateEventId(ewolEventEntryClick); - ewol::widgetManager::FocusKeep(this); + KeepFocus(); MarkToReedraw(); + Vector2D relPos = RelativePosition(pos); + // try to find the new cursor position : + int32_t fontId = GetDefaultFontId(); + etk::UString tmpDisplay = m_data.Extract(0, m_displayStartPosition); + int32_t displayHidenSize = ewol::GetWidth(fontId, tmpDisplay); + //EWOL_DEBUG("hidenSize : " << displayHidenSize); + int32_t newCursorPosition = -1; + int32_t tmpTextOriginX = m_borderSize + 2*m_paddingSize; + for (int32_t iii=0; iii=relPos.x-tmpTextOriginX) { + newCursorPosition = iii; + break; + } + } + if (newCursorPosition == -1) { + newCursorPosition = m_data.Size(); + } + m_displayCursorPos = newCursorPosition; return true; + } else if (ewol::EVENT_INPUT_TYPE_DOUBLE == typeEvent) { + // TODO : selected area ... + } else if (ewol::EVENT_INPUT_TYPE_TRIPLE == typeEvent) { + // TODO : select all the line } } return false; @@ -244,7 +267,11 @@ bool ewol::Entry::OnEventKb(eventKbType_te typeEvent, uniChar_t unicodeData) if( typeEvent == ewol::EVENT_KB_TYPE_DOWN) { //EWOL_DEBUG("Entry input data ... : \"" << unicodeData << "\" " ); //return GenEventInputExternal(ewolEventEntryEnter, -1, -1); - if (0x7F == unicodeData) { + if( '\n' == unicodeData + || '\r' == unicodeData) { + GenerateEventId(ewolEventEntryEnter, m_data); + return true; + } else if (0x7F == unicodeData) { // SUPPR : if (m_data.Size() > 0 && m_displayCursorPosRegisterOnEvent(this, ewolEventEntryModify, ewolEventFileChooserEntryFolder); + m_widgetCurrentFolder->RegisterOnEvent(this, ewolEventEntryEnter, ewolEventFileChooserEntryFolderEnter); m_widgetCurrentFolder->SetExpendX(true); m_widgetCurrentFolder->SetFillX(true); m_widgetCurrentFolder->SetWidth(200); @@ -474,6 +469,7 @@ ewol::FileChooser::FileChooser(void) mySizerHori->SubWidgetAdd(myImage); m_widgetCurrentFileName = new ewol::Entry(m_file); m_widgetCurrentFileName->RegisterOnEvent(this, ewolEventEntryModify, ewolEventFileChooserEntryFile); + m_widgetCurrentFileName->RegisterOnEvent(this, ewolEventEntryEnter, ewolEventFileChooserEntryFileEnter); m_widgetCurrentFileName->SetExpendX(true); m_widgetCurrentFileName->SetFillX(true); m_widgetCurrentFileName->SetWidth(200); @@ -629,10 +625,12 @@ void ewol::FileChooser::OnReceiveMessage(ewol::EObject * CallerObject, const cha // TODO : Change the folder, if it exit ... } else if (ewolEventFileChooserEntryFile == eventId) { //==> change the file name - if (NULL != m_widgetCurrentFileName) { - m_file = m_widgetCurrentFileName->GetValue(); + m_file = data; + // Update the selected file in the list : + FileChooserFileList * myListFile = EWOL_CAST_WIDGET_FILE_LIST(m_widgetListFile); + if (myListFile != NULL) { + myListFile->SelectFile(m_file); } - // TODO : Remove file selection } else if (ewolEventFileChooserCancel == eventId) { //==> Auto remove ... GenerateEventId(eventId); @@ -663,15 +661,14 @@ void ewol::FileChooser::OnReceiveMessage(ewol::EObject * CallerObject, const cha } SetFileName(""); UpdateCurrentFolder(); - m_hasSelectedFile = false; } else if (ewolEventFileChooserSelectFile == eventId) { - m_hasSelectedFile = true; FileChooserFileList * myListFile = EWOL_CAST_WIDGET_FILE_LIST(m_widgetListFile); etk::UString file = myListFile->GetSelectedLine(); SetFileName(file); GenerateEventId(eventId); - } else if( ewolEventFileChooserValidateFile == eventId - || (ewolEventFileChooserValidate == eventId && true == m_hasSelectedFile) ) { + } else if( eventId == ewolEventFileChooserValidateFile + || (eventId == ewolEventFileChooserValidate && m_file != "" ) + || (eventId == ewolEventFileChooserEntryFileEnter && m_file != "" ) ) { // select the File ==> generate a validate GenerateEventId(ewolEventFileChooserValidate); MarkToRemove(); @@ -694,7 +691,6 @@ void ewol::FileChooser::OnReceiveMessage(ewol::EObject * CallerObject, const cha } SetFileName(""); UpdateCurrentFolder(); - m_hasSelectedFile = false; } return; }; diff --git a/Sources/libewol/ewol/widgetMeta/FileChooser.h b/Sources/libewol/ewol/widgetMeta/FileChooser.h index 49a80eec..f11e67fe 100644 --- a/Sources/libewol/ewol/widgetMeta/FileChooser.h +++ b/Sources/libewol/ewol/widgetMeta/FileChooser.h @@ -88,7 +88,6 @@ namespace ewol { ewol::Widget* m_widgetListFolder; ewol::Widget* m_widgetListFile; ewol::CheckBox* m_widgetCheckBox; - bool m_hasSelectedFile; etk::UString m_folder; etk::UString m_file; };