Widget: generate a basic interpretation of event inside an area ==> flags must be interpreted

This commit is contained in:
Edouard Dupin 2011-10-26 23:28:38 +02:00
parent 723f1a3c3c
commit 991985635d
5 changed files with 114 additions and 11 deletions

View File

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

View File

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

View File

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

View File

@ -30,6 +30,9 @@
#include <GL/gl.h>
//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();
}
}
bool ewol::Windows::OnEventArea(const char * generateEventId, double x, double y)
{
if(eventClose == generateEventId) {
EWOL_DEBUG("Request close of the windows");
}
}

View File

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