Eobj: Pass the private data to functions automatically.
[profile/ivi/eobj.git] / examples / evas / evas_obj.c
1 #include <Elementary.h>
2
3 #include "Eobj.h"
4 #include "evas_obj.h"
5
6 #include "config.h"
7
8 static Eobj_Class *_my_class = NULL;
9
10 EAPI Eobj_Op EVAS_OBJ_BASE_ID = 0;
11
12 typedef struct
13 {
14    Eina_List *children;
15 } Widget_Data;
16
17 static void
18 _position_set(Eobj *obj, void *class_data __UNUSED__, va_list *list)
19 {
20    Evas_Object *evas_obj = eobj_evas_object_get(obj);
21    Evas_Coord x, y;
22    x = va_arg(*list, Evas_Coord);
23    y = va_arg(*list, Evas_Coord);
24    evas_object_move(evas_obj, x, y);
25 }
26
27 static void
28 _size_set(Eobj *obj, void *class_data __UNUSED__, va_list *list)
29 {
30    Evas_Object *evas_obj = eobj_evas_object_get(obj);
31    Evas_Coord w, h;
32    w = va_arg(*list, Evas_Coord);
33    h = va_arg(*list, Evas_Coord);
34    evas_object_resize(evas_obj, w, h);
35 }
36
37 static void
38 _color_set(Eobj *obj, void *class_data __UNUSED__, va_list *list)
39 {
40    Evas_Object *evas_obj = eobj_evas_object_get(obj);
41    int r, g, b, a;
42    r = va_arg(*list, int);
43    g = va_arg(*list, int);
44    b = va_arg(*list, int);
45    a = va_arg(*list, int);
46    evas_object_color_set(evas_obj, r, g, b, a);
47 }
48
49 static void
50 _color_get(Eobj *obj, void *class_data __UNUSED__, va_list *list)
51 {
52    Evas_Object *evas_obj = eobj_evas_object_get(obj);
53    int *r, *g, *b, *a;
54    r = va_arg(*list, int*);
55    g = va_arg(*list, int*);
56    b = va_arg(*list, int*);
57    a = va_arg(*list, int*);
58    evas_object_color_get(evas_obj, r, g, b, a);
59 }
60
61 static void
62 _visibility_set(Eobj *obj, void *class_data __UNUSED__, va_list *list)
63 {
64    Evas_Object *evas_obj = eobj_evas_object_get(obj);
65    Eina_Bool v;
66    v = va_arg(*list, int);
67    if (v) evas_object_show(evas_obj);
68    else evas_object_hide(evas_obj);
69 }
70
71 static void
72 _child_add(Eobj *obj __UNUSED__, void *class_data, va_list *list)
73 {
74    Widget_Data *wd = class_data;
75    Eobj *child;
76    child = va_arg(*list, Eobj *);
77    wd->children = eina_list_append(wd->children, eobj_ref(child));
78 }
79
80 static void
81 _constructor(Eobj *obj, void *class_data __UNUSED__)
82 {
83    eobj_constructor_super(obj);
84
85    /* Add type check. */
86    Eobj *parent = eobj_parent_get(obj);
87    if (parent)
88       eobj_do(parent, EVAS_OBJ_CHILD_ADD(obj));
89 }
90
91 static void
92 _destructor(Eobj *obj, void *class_data)
93 {
94    eobj_destructor_super(obj);
95
96    Widget_Data *wd = class_data;
97
98    Eobj *child;
99    EINA_LIST_FREE(wd->children, child)
100      {
101         eobj_del(child);
102      }
103 }
104
105 static void
106 _class_constructor(Eobj_Class *klass)
107 {
108    const Eobj_Op_Func_Description func_desc[] = {
109         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_POSITION_SET), _position_set),
110         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_SIZE_SET), _size_set),
111         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_COLOR_SET), _color_set),
112         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_COLOR_GET), _color_get),
113         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_VISIBILITY_SET), _visibility_set),
114         EOBJ_OP_FUNC_DESCRIPTION(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CHILD_ADD), _child_add),
115         EOBJ_OP_FUNC_DESCRIPTION_SENTINEL
116    };
117
118    eobj_class_funcs_set(klass, func_desc);
119 }
120
121 const Eobj_Class *
122 evas_object_class_get(void)
123 {
124    if (_my_class) return _my_class;
125
126    static const Eobj_Op_Description op_desc[] = {
127         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_POSITION_SET, "ii", "Position of an evas object."),
128         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_SIZE_SET, "ii", "Size of an evas object."),
129         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_COLOR_SET, "iiii", "Color of an evas object."),
130         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_COLOR_GET, "iiii", "Color of an evas object."),
131         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_VISIBILITY_SET, "b", "Visibility of an evas object."),
132         EOBJ_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_CHILD_ADD, "o", "Add a child eobj."),
133         EOBJ_OP_DESCRIPTION_SENTINEL
134    };
135
136    static const Eobj_Class_Description class_desc = {
137         "Evas Object",
138         EOBJ_CLASS_TYPE_REGULAR_NO_INSTANT,
139         EOBJ_CLASS_DESCRIPTION_OPS(&EVAS_OBJ_BASE_ID, op_desc, EVAS_OBJ_SUB_ID_LAST),
140         NULL,
141         sizeof(Widget_Data),
142         _constructor,
143         _destructor,
144         _class_constructor,
145         NULL
146    };
147
148    return _my_class = eobj_class_new(&class_desc, EOBJ_CLASS_BASE, NULL);
149 }