[DEV] Better button event

This commit is contained in:
Edouard DUPIN 2012-11-30 08:56:46 +01:00
parent fbcb6148ad
commit 22e5c62c42
5 changed files with 84 additions and 42 deletions

View File

@ -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;

View File

@ -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 :

View File

@ -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.

View File

@ -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,31 +261,35 @@ void widget::Button::OnRegenerateDisplay(void)
bool widget::Button::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput, ewol::keyEvent::status_te typeEvent, etk::Vector2D<float> pos)
{
bool previousHoverState = m_mouseHover;
if(ewol::keyEvent::statusLeave == typeEvent) {
ChangeStatusIn(STATUS_UP);
}
m_mouseHover = false;
m_buttonPressed = false;
} else {
etk::Vector2D<float> 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;
m_mouseHover = false;
m_buttonPressed = false;
} else {
m_mouseHover = true;
}
//EWOL_DEBUG("Event on BT ...");
if(ewol::keyEvent::statusEnter == typeEvent) {
ChangeStatusIn(STATUS_HOVER);
}
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);
ChangeStatusIn(STATUS_PRESSED);
m_buttonPressed = true;
MarkToRedraw();
}
if(ewol::keyEvent::statusUp == typeEvent) {
GenerateEventId(ewolEventButtonUp);
ChangeStatusIn(STATUS_UP);
m_buttonPressed = false;
MarkToRedraw();
}
if(ewol::keyEvent::statusSingle == typeEvent) {
@ -297,10 +303,26 @@ bool widget::Button::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput,
GenerateEventId(ewolEventButtonValue, m_value);
}
MarkToRedraw();
}
}
}
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;
}
}
return false;
}

View File

@ -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<float> m_selectableAreaPos; //!< Start position of the events
etk::Vector2D<float> m_selectableAreaSize; //!< Size of the event positions