Lines Matching full:group
28 static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *),
57 lv_group_t * group = lv_ll_ins_head(group_ll_p); in lv_group_create() local
58 LV_ASSERT_MALLOC(group); in lv_group_create()
59 if(group == NULL) return NULL; in lv_group_create()
60 lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); in lv_group_create()
62 group->obj_focus = NULL; in lv_group_create()
63 group->frozen = 0; in lv_group_create()
64 group->focus_cb = NULL; in lv_group_create()
65 group->edge_cb = NULL; in lv_group_create()
66 group->editing = 0; in lv_group_create()
67 group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; in lv_group_create()
68 group->wrap = 1; in lv_group_create()
69 group->user_data = NULL; in lv_group_create()
71 return group; in lv_group_create()
74 void lv_group_delete(lv_group_t * group) in lv_group_delete() argument
77 LV_ASSERT_NULL(group); in lv_group_delete()
78 if(group->obj_focus != NULL) { in lv_group_delete()
79 lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); in lv_group_delete()
80 lv_obj_invalidate(*group->obj_focus); in lv_group_delete()
83 /*Remove the objects from the group*/ in lv_group_delete()
85 LV_LL_READ(&group->obj_ll, obj) { in lv_group_delete()
89 /*Remove the group from any indev devices */ in lv_group_delete()
92 if(lv_indev_get_group(indev) == group) { in lv_group_delete()
98 /*If the group is the default group, set the default group as NULL*/ in lv_group_delete()
99 if(group == lv_group_get_default()) lv_group_set_default(NULL); in lv_group_delete()
101 lv_ll_clear(&(group->obj_ll)); in lv_group_delete()
102 lv_ll_remove(group_ll_p, group); in lv_group_delete()
103 lv_free(group); in lv_group_delete()
106 void lv_group_set_default(lv_group_t * group) in lv_group_set_default() argument
108 default_group = group; in lv_group_set_default()
116 void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) in lv_group_add_obj() argument
118 if(group == NULL) return; in lv_group_add_obj()
122 /*Be sure the object is removed from its current group*/ in lv_group_add_obj()
126 obj->spec_attr->group_p = group; in lv_group_add_obj()
128 lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); in lv_group_add_obj()
135 if(lv_ll_get_head(&group->obj_ll) == next) { in lv_group_add_obj()
136 lv_group_refocus(group); in lv_group_add_obj()
173 /*If this is the only object in the group then focus to nothing.*/ in lv_group_remove_obj()
177 /*If there more objects in the group then focus to the next/prev object*/ in lv_group_remove_obj()
183 /*If the focuses object is still the same then it was the only object in the group but it will in lv_group_remove_obj()
184 *be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with in lv_group_remove_obj()
190 /*Search the object and remove it from its group*/ in lv_group_remove_obj()
203 void lv_group_remove_all_objs(lv_group_t * group) in lv_group_remove_all_objs() argument
205 LV_ASSERT_NULL(group); in lv_group_remove_all_objs()
208 if(group->obj_focus != NULL) { in lv_group_remove_all_objs()
209 lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); in lv_group_remove_all_objs()
210 lv_obj_invalidate(*group->obj_focus); in lv_group_remove_all_objs()
211 group->obj_focus = NULL; in lv_group_remove_all_objs()
214 /*Remove the objects from the group*/ in lv_group_remove_all_objs()
216 LV_LL_READ(&group->obj_ll, obj) { in lv_group_remove_all_objs()
220 lv_ll_clear(&(group->obj_ll)); in lv_group_remove_all_objs()
256 void lv_group_focus_next(lv_group_t * group) in lv_group_focus_next() argument
258 LV_ASSERT_NULL(group); in lv_group_focus_next()
260 bool focus_changed = focus_next_core(group, lv_ll_get_head, lv_ll_get_next); in lv_group_focus_next()
261 if(group->edge_cb) { in lv_group_focus_next()
263 group->edge_cb(group, true); in lv_group_focus_next()
267 void lv_group_focus_prev(lv_group_t * group) in lv_group_focus_prev() argument
269 LV_ASSERT_NULL(group); in lv_group_focus_prev()
271 bool focus_changed = focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); in lv_group_focus_prev()
272 if(group->edge_cb) { in lv_group_focus_prev()
274 group->edge_cb(group, false); in lv_group_focus_prev()
278 void lv_group_focus_freeze(lv_group_t * group, bool en) in lv_group_focus_freeze() argument
280 LV_ASSERT_NULL(group); in lv_group_focus_freeze()
282 if(en == false) group->frozen = 0; in lv_group_focus_freeze()
283 else group->frozen = 1; in lv_group_focus_freeze()
286 lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c) in lv_group_send_data() argument
288 LV_ASSERT_NULL(group); in lv_group_send_data()
290 lv_obj_t * act = lv_group_get_focused(group); in lv_group_send_data()
298 void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) in lv_group_set_focus_cb() argument
300 if(group == NULL) return; in lv_group_set_focus_cb()
302 group->focus_cb = focus_cb; in lv_group_set_focus_cb()
305 void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) in lv_group_set_edge_cb() argument
307 LV_ASSERT_NULL(group); in lv_group_set_edge_cb()
309 group->edge_cb = edge_cb; in lv_group_set_edge_cb()
312 void lv_group_set_editing(lv_group_t * group, bool edit) in lv_group_set_editing() argument
314 LV_ASSERT_NULL(group); in lv_group_set_editing()
317 if(en_val == group->editing) return; /*Do not set the same mode again*/ in lv_group_set_editing()
319 group->editing = en_val; in lv_group_set_editing()
320 lv_obj_t * focused = lv_group_get_focused(group); in lv_group_set_editing()
323 lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); in lv_group_set_editing()
330 void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) in lv_group_set_refocus_policy() argument
332 LV_ASSERT_NULL(group); in lv_group_set_refocus_policy()
333 group->refocus_policy = policy & 0x01; in lv_group_set_refocus_policy()
336 void lv_group_set_wrap(lv_group_t * group, bool en) in lv_group_set_wrap() argument
338 LV_ASSERT_NULL(group); in lv_group_set_wrap()
339 group->wrap = en ? 1 : 0; in lv_group_set_wrap()
342 lv_obj_t * lv_group_get_focused(const lv_group_t * group) in lv_group_get_focused() argument
344 if(!group) return NULL; in lv_group_get_focused()
345 if(group->obj_focus == NULL) return NULL; in lv_group_get_focused()
347 return *group->obj_focus; in lv_group_get_focused()
350 lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) in lv_group_get_focus_cb() argument
352 if(!group) return NULL; in lv_group_get_focus_cb()
353 return group->focus_cb; in lv_group_get_focus_cb()
356 lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group) in lv_group_get_edge_cb() argument
358 if(!group) return NULL; in lv_group_get_edge_cb()
359 return group->edge_cb; in lv_group_get_edge_cb()
362 bool lv_group_get_editing(const lv_group_t * group) in lv_group_get_editing() argument
364 if(!group) return false; in lv_group_get_editing()
365 return group->editing; in lv_group_get_editing()
368 bool lv_group_get_wrap(lv_group_t * group) in lv_group_get_wrap() argument
370 if(!group) return false; in lv_group_get_wrap()
371 return group->wrap; in lv_group_get_wrap()
374 uint32_t lv_group_get_obj_count(lv_group_t * group) in lv_group_get_obj_count() argument
376 LV_ASSERT_NULL(group); in lv_group_get_obj_count()
377 return lv_ll_get_len(&group->obj_ll); in lv_group_get_obj_count()
380 lv_obj_t * lv_group_get_obj_by_index(lv_group_t * group, uint32_t index) in lv_group_get_obj_by_index() argument
385 LV_LL_READ(&group->obj_ll, obj) { in lv_group_get_obj_by_index()
402 lv_group_t * group; in lv_group_by_index() local
404 LV_LL_READ_BACK(group_ll_p, group) { in lv_group_by_index()
406 return group; in lv_group_by_index()
431 static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), in focus_next_core() argument
435 if(group->frozen) return focus_changed; in focus_next_core()
437 lv_obj_t ** obj_next = group->obj_focus; in focus_next_core()
444 if(group->wrap || obj_sentinel == NULL) { in focus_next_core()
446 obj_next = begin(&group->obj_ll); in focus_next_core()
451 /*Currently focused object is the last/first in the group, keep it that way*/ in focus_next_core()
458 if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/ in focus_next_core()
462 obj_next = move(&group->obj_ll, obj_next); in focus_next_core()
487 …if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's … in focus_next_core()
489 if(group->obj_focus) { in focus_next_core()
490 … lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); in focus_next_core()
492 lv_obj_invalidate(*group->obj_focus); in focus_next_core()
495 group->obj_focus = obj_next; in focus_next_core()
497 lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); in focus_next_core()
500 lv_obj_invalidate(*group->obj_focus); in focus_next_core()
502 if(group->focus_cb) group->focus_cb(group); in focus_next_core()
508 …nd an indev preferably with POINTER type (because it's the most generic) that uses the given group.
509 * In other words, find an indev, that is related to the given group.
511 * @param g a group the find in the indevs