From 991985635db579119b9537d2d9bd9a8c487c8a13 Mon Sep 17 00:00:00 2001 From: Edouard Dupin Date: Wed, 26 Oct 2011 23:28:38 +0200 Subject: [PATCH] Widget: generate a basic interpretation of event inside an area ==> flags must be interpreted --- Sources/etk/etkTypes.h | 4 ++- Sources/ewolWidget.cpp | 72 +++++++++++++++++++++++++++++++++++++++-- Sources/ewolWidget.h | 27 +++++++++++++--- Sources/ewolWindows.cpp | 21 ++++++++++-- Sources/ewolWindows.h | 1 + 5 files changed, 114 insertions(+), 11 deletions(-) diff --git a/Sources/etk/etkTypes.h b/Sources/etk/etkTypes.h index 8ebb2a29..723dddc3 100644 --- a/Sources/etk/etkTypes.h +++ b/Sources/etk/etkTypes.h @@ -47,7 +47,9 @@ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; - typedef unsigned long long int uint64_t; + #ifndef __uint64_t_defined + typedef unsigned long int uint64_t; + #endif #endif #define etk_min(elemA, elemB) ((elemA)<(elemB)) ? (elemA) : (elemB) diff --git a/Sources/ewolWidget.cpp b/Sources/ewolWidget.cpp index c138d2e5..41b8f1b0 100644 --- a/Sources/ewolWidget.cpp +++ b/Sources/ewolWidget.cpp @@ -52,9 +52,41 @@ bool ewol::Widget::CalculateSize(double availlableX, double availlableY) } -bool ewol::Widget::GenEventInput(int32_t IdInput, eventInputType_te typeEvent, double X, double Y) +bool ewol::Widget::GenEventInput(int32_t IdInput, eventInputType_te typeEvent, double x, double y) { - return true; + bool ended = false; + for(int32_t iii=m_inputEvent.Size()-1; iii>=0; iii--) { + if (EWOL_EVENT_AREA == m_inputEvent[iii].mode) { + if( m_inputEvent[iii].area.origin.x <= x + && m_inputEvent[iii].area.origin.y <= y + && m_inputEvent[iii].area.origin.x + m_inputEvent[iii].area.size.x > x + && m_inputEvent[iii].area.origin.y + m_inputEvent[iii].area.size.y > y ) + { + // TODO : What is the flags for ??? how can we use it... + if( FLAG_EVENT_INPUT_1 && m_inputEvent[iii].area.flags + && 1 == IdInput) + { + ended = OnEventArea(m_inputEvent[iii].generateEventId, x, y); + if (true == ended) { + break; + } + // todo : call other link widget : + if (-1 != m_inputEvent[iii].widgetCall) { + ewol::Widget * tmpWidget = NULL; + //tmpWidget = ewol::GetWidgetWithID(newEvent.widgetCall); + ended = tmpWidget->OnEventAreaExternal(m_uniqueId, m_inputEvent[iii].generateEventId, x, y); + if (true == ended) { + break; + } + } + } + } + } + } + if (false == ended) { + return OnEventInput(IdInput, typeEvent, x, y); + } + return ended; } @@ -64,8 +96,42 @@ bool ewol::Widget::GenEventShortCut(bool shift, bool control, bool alt, bool pom } -bool ewol::Widget::AddEventArea(coord origin, coord size, uint32_t flags, const char * generateEventId) +bool ewol::Widget::AddEventArea(coord origin, coord size, uint64_t flags, const char * generateEventId) { + if( origin.x < 0.0 + || origin.y < 0.0) + { + EWOL_WARNING("origin under 0.0 ... out of range"); + return false; + } + if( size.x < 0.0 + || size.y < 0.0) + { + EWOL_WARNING("size under 0.0 ... out of range"); + return false; + } + if( origin.x > m_size.x + || origin.y > m_size.y) + { + EWOL_WARNING("origin out of range"); + return false; + } + if( origin.x + size.x > m_size.x + || origin.y + size.y > m_size.y) + { + EWOL_WARNING("end area out of size"); + return false; + } + + event_ts newEvent; + newEvent.generateEventId = generateEventId; + newEvent.widgetCall = -1; // by default no widget is called + newEvent.mode = EWOL_EVENT_AREA; + newEvent.area.origin = origin; + newEvent.area.size = size; + newEvent.area.flags = flags; + m_inputEvent.PushBack(newEvent); + EWOL_DEBUG("Add an area event..."); return true; } diff --git a/Sources/ewolWidget.h b/Sources/ewolWidget.h index 86f2e22f..e3c88cb9 100644 --- a/Sources/ewolWidget.h +++ b/Sources/ewolWidget.h @@ -62,8 +62,25 @@ namespace ewol { EVENT_KB_MOVE_TYPE_END, } eventKbMoveType_te; + enum { + FLAG_EVENT_INPUT_1 = 1 << 0, + FLAG_EVENT_INPUT_2 = 1 << 1, + FLAG_EVENT_INPUT_3 = 1 << 2, + FLAG_EVENT_INPUT_4 = 1 << 3, + FLAG_EVENT_INPUT_5 = 1 << 4, + FLAG_EVENT_INPUT_MOTION = 1 << 5, + FLAG_EVENT_ENTER = 1 << 6, + FLAG_EVENT_LEAVE = 1 << 7, + FLAG_EVENT_DOWN = 1 << 8, + FLAG_EVENT_UP = 1 << 9, + FLAG_EVENT_MOVE = 1 << 10, + FLAG_EVENT_CLICKED = 1 << 11, + FLAG_EVENT_CLICKED_DOUBLE = 1 << 12, + FLAG_EVENT_CLICKED_TRIPLE = 1 << 13, + }; + #define UTF8_MAX_SIZE (8) - #define EWOL_EVENT_UNION (0) + #define EWOL_EVENT_AREA (0) #define EWOL_EVENT_SHORTCUT (1) extern "C" { typedef struct { @@ -81,7 +98,7 @@ namespace ewol { struct { coord origin; // widget specific coord size; // widget specific - uint32_t flags; // widget specific + uint64_t flags; // widget specific } area; }; } event_ts; @@ -174,7 +191,7 @@ namespace ewol { bool GenEventInput(int32_t IdInput, eventInputType_te typeEvent, double X, double Y); // call when input event arrive and call OnEventInput, if no event detected bool GenEventShortCut(bool shift, bool control, bool alt, bool pomme, char UTF8_data[UTF8_MAX_SIZE]); protected: - bool AddEventArea(coord origin, coord size, uint32_t flags, const char * generateEventId); + bool AddEventArea(coord origin, coord size, uint64_t flags, const char * generateEventId); bool AddEventShortCut(bool shift, bool control, bool alt, bool pomme, char UTF8_data[UTF8_MAX_SIZE], const char * generateEventId); bool AddEventShortCut(char * descriptiveString, const char * generateEventId); public: @@ -182,9 +199,9 @@ namespace ewol { bool ExternLinkOnEvent(const char * eventName, int32_t widgetId); protected: virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, double X, double Y) { return false; }; - virtual bool OnEventArea(const char * generateEventId) { return false; }; + virtual bool OnEventArea(const char * generateEventId, double x, double y) { return false; }; // when an event arrive from an other widget, it will arrive here: - virtual bool OnEventAreaExternal(int32_t widgetID, const char * generateEventId) { return false; }; + virtual bool OnEventAreaExternal(int32_t widgetID, const char * generateEventId, double x, double y) { return false; }; // ---------------------------------------------------------------------------------------------------------------- // -- Keboard event (when one is present or when a graphical is present diff --git a/Sources/ewolWindows.cpp b/Sources/ewolWindows.cpp index d1317389..ce58e1ed 100644 --- a/Sources/ewolWindows.cpp +++ b/Sources/ewolWindows.cpp @@ -30,6 +30,9 @@ #include +//list of local events : +const char * eventClose = "Close Windows"; + bool ewol::Windows::CalculateSize(double availlableX, double availlableY) { m_size.x = availlableX; @@ -107,14 +110,28 @@ void ewol::Windows::SysDraw(void) ewol::OObject2DColored myOObject; myOObject.Rectangle(20, 30, 100, 50, 1.0, 0.0, 0.0, 1.0); + static bool isinit = false; + if (false == isinit) { + isinit=true; + AddEventArea({20.0,30.0}, {100, 50}, FLAG_EVENT_INPUT_1 | FLAG_EVENT_CLICKED, eventClose); + } myOObject.Rectangle(50, 50, 50, 50, 0.0, 1.0, 0.0, 1.0); myOObject.Rectangle(80, 80, 100, 50, 0.0, 0.0, 1.0, 1.0); myOObject.Rectangle(50, 00, 300, 300, 0.2, 0.2, 0.2, 0.5); - myOObject.Rectangle(-50, -50, 120, 120, 0.0, 1.0, 1.0, 0.5); + //myOObject.Rectangle(-50, -50, 120, 120, 0.0, 1.0, 1.0, 0.5); myOObject.Draw(); -} \ No newline at end of file +} + + +bool ewol::Windows::OnEventArea(const char * generateEventId, double x, double y) +{ + if(eventClose == generateEventId) { + EWOL_DEBUG("Request close of the windows"); + } +} + diff --git a/Sources/ewolWindows.h b/Sources/ewolWindows.h index 697c7ef2..5417cb29 100644 --- a/Sources/ewolWindows.h +++ b/Sources/ewolWindows.h @@ -52,6 +52,7 @@ namespace ewol { virtual void On(void) { }; // from Widget management : virtual bool CalculateSize(double availlableX, double availlableY); + virtual bool OnEventArea(const char * generateEventId, double x, double y); }; };