1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
#ifndef ELM_WIDGET_GENGRID_H
#define ELM_WIDGET_GENGRID_H
#include "elm_gen_common.h"
#include "Elementary.h"
/**
* @addtogroup Widget
* @{
*
* @section elm-gengrid-class The Elementary Gengrid Class
*
* Elementary, besides having the @ref Gengrid widget, exposes its
* foundation -- the Elementary Gengrid Class -- in order to create
* other widgets which are a gengrid with some more logic on top.
*/
/**
* Base widget smart data extended with gengrid instance data.
*/
typedef struct _Elm_Gengrid_Smart_Data Elm_Gengrid_Smart_Data;
struct _Elm_Gengrid_Smart_Data
{
Eina_Inlist_Sorted_State *state;
Evas_Object *hit_rect;
Evas_Object *pan_obj;
Evas_Object *obj; // the object itself
Evas_Object *stack; // stacking markers in pan for selectraise feature
Eina_List *selected; /* a list of
* selected
* items */
Eina_List *group_items; /* a list of
* groups index
* items */
Eina_Inlist *items; /* an inlist of all items */
Elm_Gen_Item *reorder_it; /* item currently
* being
* repositioned */
Elm_Object_Item *last_selected_item;
Elm_Gen_Item *show_it;
Elm_Gen_Item *bring_in_it;
Elm_Gengrid_Item_Scrollto_Type s_type;
Ecore_Job *calc_job;
int walking;
int item_width, item_height;
int group_item_width, group_item_height;
int minw, minh;
unsigned int item_count;
Evas_Coord pan_x, pan_y;
Elm_Object_Select_Mode select_mode;
Elm_Object_Multi_Select_Mode multi_select_mode; /**< select mode for multiple selection */
Ecore_Cb calc_cb;
Ecore_Cb clear_cb;
/* longpress timeout. this value comes from _elm_config by
* default. this can be changed by
* elm_config_longpress_timeout_set() */
double longpress_timeout;
/* a generation of gengrid. when gengrid is cleared, this value
* will be increased and a new generation will start */
int generation;
Eina_Compare_Cb item_compare_cb;
/* The stuff below directly come from gengrid without any thinking */
unsigned int nmax;
Evas_Coord reorder_item_x, reorder_item_y;
Evas_Coord old_pan_x, old_pan_y;
long items_lost;
double align_x, align_y;
Eina_Bool reorder_item_changed : 1;
Eina_Bool move_effect_enabled : 1;
Eina_Bool old_h_bounce;
Eina_Bool old_v_bounce;
/* a flag for reorder mode enable/disable */
Eina_Bool reorder_mode : 1;
Eina_Bool was_selected : 1;
Eina_Bool longpressed : 1;
Eina_Bool pan_changed : 1;
Eina_Bool horizontal : 1;
/* a flag for items can be highlighted or not. by default this flag
* is true. */
Eina_Bool highlight : 1;
Eina_Bool clear_me : 1; /**< a flag whether
* gengrid is marked
* as to be cleared or
* not. if this flag
* is true, gengrid
* clear was already
* deferred. */
Eina_Bool on_hold : 1;
Eina_Bool filled : 1;
Eina_Bool multi : 1; /* a flag for item
* multi
* selection */
Eina_Bool show_region : 1;
Eina_Bool bring_in : 1;
};
struct Elm_Gen_Item_Type
{
Elm_Gen_Item *it;
Elm_Gengrid_Smart_Data *wsd;
Ecore_Animator *item_reorder_move_animator;
Evas_Coord gx, gy, ox, oy, tx, ty, rx, ry;
unsigned int moving_effect_start_time;
int prev_group;
Eina_Bool group_realized : 1;
Eina_Bool moving : 1;
};
typedef struct _Elm_Gengrid_Pan_Smart_Data Elm_Gengrid_Pan_Smart_Data;
struct _Elm_Gengrid_Pan_Smart_Data
{
Evas_Object *wobj;
Elm_Gengrid_Smart_Data *wsd;
Ecore_Job *resize_job;
};
/**
* @}
*/
#define ELM_GENGRID_DATA_GET(o, sd) \
Elm_Gengrid_Smart_Data * sd = eo_data_scope_get(o, ELM_OBJ_GENGRID_CLASS)
#define ELM_GENGRID_PAN_DATA_GET(o, sd) \
Elm_Gengrid_Pan_Smart_Data * sd = eo_data_scope_get(o, ELM_OBJ_GENGRID_PAN_CLASS)
#define ELM_GENGRID_DATA_GET_OR_RETURN(o, ptr) \
ELM_GENGRID_DATA_GET(o, ptr); \
if (!ptr) \
{ \
CRITICAL("No widget data for object %p (%s)", \
o, evas_object_type_get(o)); \
return; \
}
#define ELM_GENGRID_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
ELM_GENGRID_DATA_GET(o, ptr); \
if (!ptr) \
{ \
CRITICAL("No widget data for object %p (%s)", \
o, evas_object_type_get(o)); \
return val; \
}
#define ELM_GENGRID_CHECK(obj) \
if (!eo_isa((obj), ELM_OBJ_GENGRID_CLASS)) \
return
#define ELM_GENGRID_ITEM_CHECK(it) \
ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, ); \
ELM_GENGRID_CHECK(it->base.widget);
#define ELM_GENGRID_ITEM_CHECK_OR_RETURN(it, ...) \
ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
ELM_GENGRID_CHECK(it->base.widget) __VA_ARGS__;
#define ELM_GENGRID_ITEM_CHECK_OR_GOTO(it, label) \
ELM_WIDGET_ITEM_CHECK_OR_GOTO((Elm_Widget_Item *)it, label); \
if (!it->base.widget || !eo_isa \
((it->base.widget), ELM_OBJ_GENGRID_CLASS)) goto label;
#endif
|