diff --git a/data/theme/default/widgetButton.frag b/data/theme/default/widgetButton.frag index 6229499b..a9566e89 100644 --- a/data/theme/default/widgetButton.frag +++ b/data/theme/default/widgetButton.frag @@ -25,7 +25,7 @@ varying vec2 v_position; // interpolated position ... // internal static define vec4 S_colorBg = vec4(0.0); -vec4 S_colorFg[3]; +vec4 S_colorFg[4]; vec4 S_colorBorder = vec4(0.0,0.0,0.0,1.0); float S_sizePadding = 3.0; float S_sizeBorder = 1.0; @@ -34,6 +34,7 @@ void main(void) { S_colorFg[0] = vec4(0.5,0.5,0.5,0.3); S_colorFg[1] = vec4(0.7,0.0,0.0,0.4); S_colorFg[2] = vec4(0.0,0.0,0.7,0.4); + S_colorFg[3] = vec4(0.0,0.7,0.0,0.4); // prevent origin moving ... vec2 position = v_position - EW_widgetProperty.origin; diff --git a/sources/ewol/compositing/Shaper.cpp b/sources/ewol/compositing/Shaper.cpp index f704a1e5..f0bf244a 100644 --- a/sources/ewol/compositing/Shaper.cpp +++ b/sources/ewol/compositing/Shaper.cpp @@ -144,15 +144,22 @@ void ewol::Shaper::Clear(void) // nothing to do ... } - - - bool ewol::Shaper::ChangeStatusIn(int32_t newStatusId) { m_nextStatusRequested = newStatusId; return true; } +int32_t ewol::Shaper::GetCurrentDisplayedStatus(void) +{ + return m_stateNew; +} + +int32_t ewol::Shaper::GetNextDisplayedStatus(void) +{ + return m_nextStatusRequested; +} + bool ewol::Shaper::PeriodicCall(int64_t localTime) { // start : diff --git a/sources/ewol/compositing/Shaper.h b/sources/ewol/compositing/Shaper.h index 514cef8a..9ad1ff5f 100644 --- a/sources/ewol/compositing/Shaper.h +++ b/sources/ewol/compositing/Shaper.h @@ -87,6 +87,16 @@ namespace ewol * @return false No need to request the periodic call. */ bool ChangeStatusIn(int32_t newStatusId); + /** + * @brief Get the current displayed status of the shaper + * @return The Status Id + */ + int32_t GetCurrentDisplayedStatus(void);; + /** + * @brief Get the next displayed status of the shaper + * @return The next status Id (-1 if no status in next) + */ + int32_t GetNextDisplayedStatus(void); /** * @brief Same as the widfget periodic call (this is for change display) * @param[in] localTime The current time of the call. diff --git a/sources/ewol/widget/Button.cpp b/sources/ewol/widget/Button.cpp index 1bdf2775..6f3f4cc5 100644 --- a/sources/ewol/widget/Button.cpp +++ b/sources/ewol/widget/Button.cpp @@ -32,7 +32,9 @@ widget::Button::Button(etk::UString newLabel) : m_shaper("THEME:GUI:widgetButton.conf"), m_label(newLabel), m_toggleMode(false), - m_value(false) + m_value(false), + m_mouseHover(false), + m_buttonPressed(false) { AddEventId(ewolEventButtonPressed); AddEventId(ewolEventButtonDown); @@ -259,48 +261,68 @@ void widget::Button::OnRegenerateDisplay(void) bool widget::Button::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput, ewol::keyEvent::status_te typeEvent, etk::Vector2D pos) { + bool previousHoverState = m_mouseHover; if(ewol::keyEvent::statusLeave == typeEvent) { - ChangeStatusIn(STATUS_UP); - } - - etk::Vector2D relativePos = RelativePosition(pos); - // prevent error from ouside the button - if( relativePos.x < m_selectableAreaPos.x - || relativePos.y < m_selectableAreaPos.y - || relativePos.x > m_selectableAreaPos.x + m_selectableAreaSize.x - || relativePos.y > m_selectableAreaPos.y + m_selectableAreaSize.y ) { - return false; - } - //EWOL_DEBUG("Event on BT ..."); - if(ewol::keyEvent::statusEnter == typeEvent) { - ChangeStatusIn(STATUS_HOVER); - } - if (1 == IdInput) { - if(ewol::keyEvent::statusDown == typeEvent) { - GenerateEventId(ewolEventButtonDown); - ChangeStatusIn(STATUS_PRESSED); - MarkToRedraw(); + m_mouseHover = false; + m_buttonPressed = false; + } else { + etk::Vector2D relativePos = RelativePosition(pos); + // prevent error from ouside the button + if( relativePos.x < m_selectableAreaPos.x + || relativePos.y < m_selectableAreaPos.y + || relativePos.x > m_selectableAreaPos.x + m_selectableAreaSize.x + || relativePos.y > m_selectableAreaPos.y + m_selectableAreaSize.y ) { + m_mouseHover = false; + m_buttonPressed = false; + } else { + m_mouseHover = true; } - if(ewol::keyEvent::statusUp == typeEvent) { - GenerateEventId(ewolEventButtonUp); - ChangeStatusIn(STATUS_UP); - MarkToRedraw(); - } - if(ewol::keyEvent::statusSingle == typeEvent) { - // inverse value : - m_value = (m_value)?false:true; - GenerateEventId(ewolEventButtonPressed); - GenerateEventId(ewolEventButtonValue, m_value); - if( false == m_toggleMode - && true == m_value) { - m_value = false; - GenerateEventId(ewolEventButtonValue, m_value); + } + bool previousPressed = m_buttonPressed; + //EWOL_DEBUG("Event on BT ... mouse position : " << m_mouseHover); + if (true == m_mouseHover) { + if (1 == IdInput) { + if(ewol::keyEvent::statusDown == typeEvent) { + GenerateEventId(ewolEventButtonDown); + m_buttonPressed = true; + MarkToRedraw(); + } + if(ewol::keyEvent::statusUp == typeEvent) { + GenerateEventId(ewolEventButtonUp); + m_buttonPressed = false; + MarkToRedraw(); + } + if(ewol::keyEvent::statusSingle == typeEvent) { + // inverse value : + m_value = (m_value)?false:true; + GenerateEventId(ewolEventButtonPressed); + GenerateEventId(ewolEventButtonValue, m_value); + if( false == m_toggleMode + && true == m_value) { + m_value = false; + GenerateEventId(ewolEventButtonValue, m_value); + } + MarkToRedraw(); } - MarkToRedraw(); - return true; } } - return false; + if( m_mouseHover != previousHoverState + || m_buttonPressed != previousPressed) { + if (true==m_buttonPressed) { + ChangeStatusIn(STATUS_PRESSED); + } else { + if (true==m_mouseHover) { + ChangeStatusIn(STATUS_HOVER); + } else { + if (true == m_value) { + ChangeStatusIn(STATUS_DOWN); + } else { + ChangeStatusIn(STATUS_UP); + } + } + } + } + return true; } diff --git a/sources/ewol/widget/Button.h b/sources/ewol/widget/Button.h index b43ad45c..b7b16a87 100644 --- a/sources/ewol/widget/Button.h +++ b/sources/ewol/widget/Button.h @@ -36,6 +36,8 @@ namespace widget { etk::UString m_labelToggle; //!< Label to display when toggle mode is set ("" whenit is the same). bool m_toggleMode; //!< The button is able to toggle. bool m_value; //!< Current state of the button. + bool m_mouseHover; //!< Flag to know where the mouse is (inside the displayed widget (if not fill) + bool m_buttonPressed; //!< Flag to know if the button is curently pressed // hover area : etk::Vector2D m_selectableAreaPos; //!< Start position of the events etk::Vector2D m_selectableAreaSize; //!< Size of the event positions