Table example

In this example, we illustrate how to organize your objects on a table, using the edje_object_part_table functions. To be easier to understand the objects in this example will be four simple rects, when the user click over one item with the left button its is removed from the table, if any other button was used all items are removed. For each action is printed a message with the current number of rows and columns.

We started creating an EDC file with one part of the type TABLE called "table_part", that is the part which we will refer to access the table:

collections {
group {
name: "example_table";
min: 50 50;
parts {
part {
name: "table_part";
type: TABLE;
description {
min: 50 50;
state: "default" 0.0;
rel1.relative: 0.0 0.0;
rel2.relative: 1.0 1.0;
}
}
}
}
}

On the other hand, in the C file we first create the rectangles and added a callback for mouse down, as you can see bellow:

_rects_create(Evas *evas, Evas_Object **rects, Evas_Object *edje_obj)
{
int i;
for (i = 0; i < 4; i++)
{
rects[i] = evas_object_rectangle_add(evas);
evas_object_size_hint_min_set(rects[i], 200, 200);
evas_object_size_hint_weight_set(rects[i], 1.0, 1.0);
evas_object_show(rects[i]);
_on_mouse_down, edje_obj);
}
}

With the objects created we have to pack them into the table, to do this, we just have to use the function edje_object_part_table_pack().

if (!edje_object_part_table_pack(edje_obj, "table_part", rects[0],
0, 0, 1, 2))
fprintf(stderr, "Cannot add the rectangle 1 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[1],
0, 1, 1, 1))
fprintf(stderr, "Cannot add the rectangle 2 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[2],
1, 0, 1, 1))
fprintf(stderr, "Cannot add the rectangle 3 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[3],
1, 1, 1, 1))
fprintf(stderr, "Cannot add the rectangle 4 to table\n");

The other bit of code that is relevant to us now is our event handler for when the user click over the rectangle. Here we use the function edje_object_part_table_unpack() to remove the item from the table or edje_object_part_table_clear() to remove all items, it depends on which mouse button the user uses.

_on_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
{
Evas_Object *edje_obj;
ev = (Evas_Event_Mouse_Down *)event_info;
edje_obj = (Evas_Object *)data;
if (ev->button != 1)
edje_object_part_table_clear(edje_obj, "table_part", EINA_TRUE);
else if (!edje_object_part_table_unpack(edje_obj, "table_part", obj))
fprintf(stderr, "Cannot remove the selected rectangle\n");
_columns_rows_print(edje_obj);
}

Finally, the last important thing in this example is about how to know how many columns and rows are there in the table, It should be noted that this function don't tell you how many items are there in the table, just the number of the columns and rows of the table.

}

The example's window should look like this picture:

The full source code follows:

#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define EINA_UNUSED
#endif
#ifndef PACKAGE_DATA_DIR
#define PACKAGE_DATA_DIR "."
#endif
#include <Ecore.h>
#include <Ecore_Evas.h>
#include <Edje.h>
#define WIDTH (400)
#define HEIGHT (400)
static void
_on_delete(Ecore_Evas *ee EINA_UNUSED)
{
}
/* Try to get the number of columns and rows of the table
* and print them. */
static void
_columns_rows_print(Evas_Object *edje_obj)
{
int cols, rows;
if (edje_object_part_table_col_row_size_get(edje_obj, "table_part", &cols,
&rows))
printf("Number of columns: %d\nNumber of rows: %d\n", cols, rows);
else
fprintf(stderr, "Cannot get the number of columns and rows\n");
}
/* here just to keep our example's window size and table items
* size in synchrony. */
static void
_on_canvas_resize(Ecore_Evas *ee)
{
Evas_Object *edje_obj;
Evas_Object **rects;
int i;
int w;
int h;
bg = ecore_evas_data_get(ee, "background");
edje_obj = ecore_evas_data_get(ee, "edje_obj");
rects = ecore_evas_data_get(ee, "rects");
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
evas_object_resize(bg, w, h);
evas_object_resize(edje_obj, w, h);
for (i = 0; i < 4; i++)
evas_object_size_hint_min_set(rects[i], w/2, h/2);
}
/* Mouse button 1 = remove the clicked item
* any other button = remove all items. */
static void
_on_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
{
Evas_Object *edje_obj;
ev = (Evas_Event_Mouse_Down *)event_info;
edje_obj = (Evas_Object *)data;
if (ev->button != 1)
edje_object_part_table_clear(edje_obj, "table_part", EINA_TRUE);
else if (!edje_object_part_table_unpack(edje_obj, "table_part", obj))
fprintf(stderr, "Cannot remove the selected rectangle\n");
_columns_rows_print(edje_obj);
}
static void
_rects_create(Evas *evas, Evas_Object **rects, Evas_Object *edje_obj)
{
int i;
for (i = 0; i < 4; i++)
{
rects[i] = evas_object_rectangle_add(evas);
evas_object_size_hint_min_set(rects[i], 200, 200);
evas_object_size_hint_weight_set(rects[i], 1.0, 1.0);
evas_object_show(rects[i]);
_on_mouse_down, edje_obj);
}
}
int
main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
{
const char *edje_file = PACKAGE_DATA_DIR"/table.edj";
Ecore_Evas *ee;
Evas *evas;
Evas_Object *edje_obj;
Evas_Object *rects[4];
return EXIT_FAILURE;
if (!edje_init())
goto shutdown_ecore_evas;
/* this will give you a window with an Evas canvas under the first
* engine available */
ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
if (!ee) goto shutdown_edje;
ecore_evas_callback_resize_set(ee, _on_canvas_resize);
ecore_evas_title_set(ee, "Edje Table Example");
evas = ecore_evas_get(ee);
evas_object_color_set(bg, 255, 255, 255, 255); /* white bg */
evas_object_move(bg, 0, 0); /* at canvas' origin */
evas_object_resize(bg, WIDTH, HEIGHT); /* covers full canvas */
ecore_evas_data_set(ee, "background", bg);
edje_obj = edje_object_add(evas);
edje_object_file_set(edje_obj, edje_file, "example_table");
evas_object_move(edje_obj, 0, 0); /* at canvas' origin */
evas_object_resize(edje_obj, WIDTH, HEIGHT);
evas_object_show(edje_obj);
ecore_evas_data_set(ee, "edje_obj", edje_obj);
_rects_create(evas, rects, edje_obj);
ecore_evas_data_set(ee, "rects", rects);
/* Colouring the rectangles */
evas_object_color_set(rects[0], 255, 0, 0, 255);
evas_object_color_set(rects[1], 0, 255, 0, 255);
evas_object_color_set(rects[2], 0, 0, 255, 255);
evas_object_color_set(rects[3], 128, 128, 128, 255);
/* Packing the rectangles into the table */
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[0],
0, 0, 1, 2))
fprintf(stderr, "Cannot add the rectangle 1 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[1],
0, 1, 1, 1))
fprintf(stderr, "Cannot add the rectangle 2 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[2],
1, 0, 1, 1))
fprintf(stderr, "Cannot add the rectangle 3 to table\n");
if (!edje_object_part_table_pack(edje_obj, "table_part", rects[3],
1, 1, 1, 1))
fprintf(stderr, "Cannot add the rectangle 4 to table\n");
_columns_rows_print(edje_obj);
return EXIT_SUCCESS;
shutdown_edje:
shutdown_ecore_evas:
return EXIT_FAILURE;
}

To compile use this command:

* gcc -o edje-table edje-table.c -DPACKAGE_BIN_DIR=\"/Where/enlightenment/is/installed/bin\" -DPACKAGE_LIB_DIR=\"/Where/enlightenment/is/installed/lib\"
* -DPACKAGE_DATA_DIR=\"/Where/enlightenment/is/installed/share\"
* `pkg-config --cflags --libs evas ecore ecore-evas edje`
*
* edje_cc table.edc
* 
edje_init
int edje_init(void)
Initializes the Edje library.
Definition: edje_main.c:35
ecore_evas_new
EAPI Ecore_Evas * ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options)
Creates a new Ecore_Evas based on engine name and common parameters.
Definition: ecore_evas.c:1059
ecore_evas_shutdown
EAPI int ecore_evas_shutdown(void)
Shuts down the Ecore_Evas system.
Definition: ecore_evas.c:668
ecore_evas_geometry_get
EAPI void ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
Gets the geometry of an Ecore_Evas.
Definition: ecore_evas.c:1382
ecore_evas_callback_resize_set
EAPI void ecore_evas_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
Sets a callback for Ecore_Evas resize events.
Definition: ecore_evas.c:1160
ecore_main_loop_quit
void ecore_main_loop_quit(void)
Quits the main loop once all the events currently on the queue have been processed.
Definition: ecore_main.c:1289
EINA_UNUSED
#define EINA_UNUSED
Definition: eina_types.h:321
ecore_evas_free
EAPI void ecore_evas_free(Ecore_Evas *ee)
Frees an Ecore_Evas.
Definition: ecore_evas.c:1103
ecore_evas_title_set
EAPI void ecore_evas_title_set(Ecore_Evas *ee, const char *t)
Sets the title of an Ecore_Evas' window.
Definition: ecore_evas.c:1547
ecore_evas_init
EAPI int ecore_evas_init(void)
Inits the Ecore_Evas system.
Definition: ecore_evas.c:604
Evas_Object
Efl_Canvas_Object Evas_Object
Definition: Evas_Common.h:180
ecore_evas_callback_delete_request_set
EAPI void ecore_evas_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
Sets a callback for Ecore_Evas delete request events.
Definition: ecore_evas.c:1196
Edje.h
Edje Graphical Design Library.
Ecore_Evas.h
Evas wrapper functions.
ecore_evas_get
EAPI Evas * ecore_evas_get(const Ecore_Evas *ee)
Gets an Ecore_Evas's Evas.
Definition: ecore_evas.c:1320
ecore_evas_data_get
EAPI void * ecore_evas_data_get(const Ecore_Evas *ee, const char *key)
Retrieves user data associated with an Ecore_Evas.
Definition: ecore_evas.c:1112
_Evas_Event_Mouse_Down::button
int button
Mouse button number that went down (1 - 32)
Definition: Evas_Legacy.h:161
evas_object_event_callback_add
void evas_object_event_callback_add(Evas_Object *eo_obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
Add (register) a callback function to a given Evas object event.
Definition: evas_callbacks.c:489
ecore_main_loop_begin
void ecore_main_loop_begin(void)
Runs the application main loop.
Definition: ecore_main.c:1279
evas_object_show
void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1853
Evas
Eo Evas
Definition: Evas_Common.h:158
EVAS_CALLBACK_MOUSE_DOWN
Mouse Button Down Event.
Definition: Evas_Common.h:406
EINA_TRUE
#define EINA_TRUE
Definition: eina_types.h:508
evas_object_del
void evas_object_del(Evas_Object *obj)
Marks the given Evas object for deletion (when Evas will free its memory).
Definition: evas_object_main.c:962
evas_object_rectangle_add
Evas_Object * evas_object_rectangle_add(Evas *e)
Adds a rectangle to the given evas.
Definition: evas_object_rectangle.c:78
ecore_evas_data_set
EAPI void ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
Stores user data in an Ecore_Evas structure.
Definition: ecore_evas.c:1123
ecore_evas_show
EAPI void ecore_evas_show(Ecore_Evas *ee)
Shows an Ecore_Evas' window.
Definition: ecore_evas.c:1500
evas_object_color_set
void evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
Sets the general/main color of the given Evas object to the given one.
Definition: evas_object_main.c:2063
edje_shutdown
int edje_shutdown(void)
Shuts down the Edje library.
Definition: edje_main.c:264
_Evas_Event_Mouse_Down
Mouse button press event.
Definition: Evas_Legacy.h:159