From bcd78dd3f49c6d6b0754852a42b847a6cbcdcfde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C3=A9nier?= Date: Mon, 29 Jun 2015 15:59:36 +0200 Subject: [PATCH] Wiki pages naviframe_tutorial created: tuto + image + code c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Clément Bénier Signed-off-by: Pierre Le Magourou Signed-off-by: Cedric BAIL --- media/code_c/tutorial/naviframe/naviframe.c | 227 ++++++++++++++++++ media/naviframe.png | Bin 0 -> 61362 bytes pages/docs.txt | 1 + pages/tutorial/naviframe_tutorial.txt | 247 ++++++++++++++++++++ 4 files changed, 475 insertions(+) create mode 100644 media/code_c/tutorial/naviframe/naviframe.c create mode 100644 media/naviframe.png create mode 100644 pages/tutorial/naviframe_tutorial.txt diff --git a/media/code_c/tutorial/naviframe/naviframe.c b/media/code_c/tutorial/naviframe/naviframe.c new file mode 100644 index 000000000..bd643aeab --- /dev/null +++ b/media/code_c/tutorial/naviframe/naviframe.c @@ -0,0 +1,227 @@ +#include + +#define __UNUSED__ __attribute__((__unused__)) + +// NOTE: A zipper is a datastructure for an ordered set of elements and a +// cursor in this set, meaning there are elements before the cursor (which are +// stored inside the naviframe) and after (which are stored in the "popped" +// list. +struct naviframe_zipper +{ + Evas_Object *naviframe; + Eina_List *popped; +}; + +static struct naviframe_zipper * +_naviframe_add(Evas_Object *parent) +{ + struct naviframe_zipper *z = malloc(sizeof(struct naviframe_zipper)); + z->naviframe = elm_naviframe_add(parent); + z->popped = NULL; + + evas_object_size_hint_weight_set(z->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(z->naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(z->naviframe); + // By default, objects are destroyed when they are popped from the naviframe + // To save and re-use them, enable "preserve_on_pop" + elm_naviframe_content_preserve_on_pop_set(z->naviframe, EINA_TRUE); + + return z; +} + +// forward declaration of the _button function since there is a circular +// reference below +static Evas_Object * _button(struct naviframe_zipper *, int direction); + +// Save the element that is popped from the naviframe +// callback of the prev button +static void +_naviframe_prev(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + struct naviframe_zipper *z = data; + //if more than one item push in naviframe + if (elm_naviframe_bottom_item_get(z->naviframe) != elm_naviframe_top_item_get(z->naviframe)) + { + z->popped = eina_list_prepend(z->popped, elm_naviframe_item_pop(z->naviframe)); + } +} + +// Set the first element after the current one available and push it to the +// naviframe +// callback of the next button +static void +_naviframe_next(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + struct naviframe_zipper *z = data; + Evas_Object *label, *prev, *next; + const char *text; + Elm_Object_Item *it; + + label = eina_list_data_get(z->popped); + z->popped = eina_list_remove_list(z->popped, z->popped); + if (label != NULL) + { + // The widget is saved inside the naviframe but nothing more; we need + // to create new buttons and set the title text again (copy the one + // from the label that is saved). + text = elm_object_text_get(label); + // The _button function creates a button which is either "Previous" (-1) or + // "Next" (1) + prev = _button(z, -1); + next = _button(z, 1); + it = elm_naviframe_item_push(z->naviframe, text, prev, next, label, NULL); + } +} + +// Build either a "Previous" or a "Next" button +static Evas_Object * +_button(struct naviframe_zipper *z, int direction) +{ + Evas_Object *button; + Evas_Smart_Cb callback; + const char *text; + if (direction < 0) + { + text = "Previous"; + callback = _naviframe_prev; + } + else + { + text = "Next"; + callback = _naviframe_next; + } + button = elm_button_add(z->naviframe); + elm_object_text_set(button, text); + evas_object_smart_callback_add(button, "clicked", callback, z); + return button; +} + +// Generic naviframe-populate function: +// Its third (and last) parameter is a callback for customization, i.e. pushes +// the new items to a specific position; it returns a "context" value that is +// used between its calls and enables behaviors such as "push after the +// previously-pushed item" +static struct naviframe_zipper* +_naviframe_populate_gen(Evas_Object *parent, const char *id, + void * (*populate_cb) (Evas_Object *nav, const char *title, Evas_Object + *prev, Evas_Object *next, Evas_Object *label, Elm_Object_Item *context) + ) +{ + struct naviframe_zipper *z; + Evas_Object *label,*label2, *prev, *next; + Elm_Object_Item *context = NULL; + char buf[256]; + int i; + + z = _naviframe_add(parent); + + for (i = 0; i < 20; i++) + { + label = elm_label_add(z->naviframe); + label2 = elm_label_add(z->naviframe); + snprintf(buf, sizeof(buf), "%s [%d]", id, i); + elm_object_text_set(label, buf); + evas_object_show(label); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + // The _button function creates a button which is either "Previous" (-1) or + // "Next" (1) + prev = _button(z, -1); + next = _button(z, 1); + // Use the populate_cb callback to provide the customization of the way the + // elements are added inside the naviframe + context = populate_cb(z->naviframe, buf, prev, next, label, context); + } + return z; +} + +// Push items one after the other +static Elm_Object_Item * +_populate_cb__push(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); +} + +// Push items one after the other but use insert_after for it +static Elm_Object_Item * +_populate_cb__push_then_insert_after(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + if (context == NULL) + { + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); + } + else + { + return elm_naviframe_item_insert_after(nav, context, title, prev, next, label, NULL); + } +} + +// Push one item and repeatedly insert new items before the last inserted +// item +static Elm_Object_Item * +_populate_cb__push_then_insert_before(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + if (context == NULL) + { + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); + } + else + { + return elm_naviframe_item_insert_before(nav, context, title, prev, next, label, NULL); + } +} + +static void +_delete_cb(void *data, Evas_Object *obj, void *event_info) +{ + struct naviframe_zipper **z = data; + free(*z); + free(*(z+1)); + free(*(z+2)); + free(z); + evas_object_del(obj); +} + +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + Evas_Object *win; + + win = elm_win_util_standard_add("Naviframe", "Naviframe Tutorial"); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_autodel_set(win, EINA_TRUE); + + Evas_Object *box; + struct naviframe_zipper **z = malloc(3*sizeof(struct naviframe_zipper *)); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_homogeneous_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + elm_win_resize_object_add(win, box); + + z[0] = _naviframe_populate_gen(win, "Before", (void *)_populate_cb__push_then_insert_before); + elm_box_pack_end(box, (*z)->naviframe); + + z[1] = _naviframe_populate_gen(win, "After", (void *)_populate_cb__push_then_insert_after); + elm_box_pack_end(box, (*(z+1))->naviframe); + + z[2] = _naviframe_populate_gen(win, "Push", (void *)_populate_cb__push); + elm_box_pack_end(box, (*(z+2))->naviframe); + + evas_object_smart_callback_add(win, "delete,request", _delete_cb, z); + //win 400x400 px + evas_object_resize(win, 400, 400); + evas_object_show(win); + elm_run(); + return 0; +} +ELM_MAIN() diff --git a/media/naviframe.png b/media/naviframe.png new file mode 100644 index 0000000000000000000000000000000000000000..9aee9f54707d6e1273f83359f83f99c502e97d59 GIT binary patch literal 61362 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 z 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 literal 0 HcmV?d00001 diff --git a/pages/docs.txt b/pages/docs.txt index 5301ff1c0..e630888de 100644 --- a/pages/docs.txt +++ b/pages/docs.txt @@ -41,6 +41,7 @@ Go check the current available version of EFL on each distro/platform: * [[tutorial/genlist_tutorial|Genlist Tutorial]] * [[tutorial/panes_tutorial|Panes Tutorial]] * [[tutorial/form_tutorial|Form Tutorial]] + * [[tutorial/naviframe_tutorial|Naviframe Tutorial]] ---- diff --git a/pages/tutorial/naviframe_tutorial.txt b/pages/tutorial/naviframe_tutorial.txt new file mode 100644 index 000000000..e3cbc68e1 --- /dev/null +++ b/pages/tutorial/naviframe_tutorial.txt @@ -0,0 +1,247 @@ +~~Title: Naviframe Tutorial~~ +==== Naviframe Tutorial ==== + +Naviframes are containers useful for implementing interfaces with several +screens having a previous/next relationship. + +{{ :naviframe.png?direct1100x439 |list}} + +//**__The whole code__ : **//{{/code_c/tutorial/naviframe/naviframe.c}} + +=== Creating Naviframes === + +Naviframes are containers useful for implementing interfaces with several +screens having a previous/next relationship. + +This tutorial shows a UI with three naviframes. Each naviframe is made of 20 +screens, each made up of a label +, a title with the same text, and previous and next buttons, which are +used to navigate between the screens. + +The naviframe is "one-way": elements are added, and when the user clicks on +the "previous" button, they are removed; there is no "next" button by default. +To add it, we define a structure that holds the naviframe object along with a +stack of the elements that the user has popped by using the "previous" button. + +Note that it is possible to create the elements on-the-fly each time the +"next" button is pressed. Both approaches are valid. + + +// NOTE: A zipper is a datastructure for an ordered set of elements and a +// cursor in this set, meaning there are elements before the cursor (which are +// stored inside the naviframe) and after (which are stored in the "popped" +// list. +struct naviframe_zipper +{ + Evas_Object *naviframe; + Eina_List *popped; +}; + + +To add several naviframes, create a function that factors their creation and +initializes the ''naviframe_zipper'' structure defined above. + + +static struct naviframe_zipper * +_naviframe_add(Evas_Object *parent) +{ + struct naviframe_zipper *z = malloc(sizeof(struct naviframe_zipper)); + z->naviframe = elm_naviframe_add(parent); + z->popped = NULL; + + evas_object_size_hint_weight_set(z->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(z->naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(z->naviframe); + // By default, objects are destroyed when they are popped from the naviframe + // To save and re-use them, enable "preserve_on_pop" + elm_naviframe_content_preserve_on_pop_set(z->naviframe, EINA_TRUE); + + return z; +} + + +Create buttons that are at the top of the naviframe and allow the user to go +back and forth between the screens. The naviframe widget builds a button for +"previous" by default, but allows the programmers to provide their own +buttons. It has a specific slot for the "next" button. + + +// Save the element that is popped from the naviframe +// callback of the prev button +static void +_naviframe_prev(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + struct naviframe_zipper *z = data; + //if more than one item push in naviframe + if (elm_naviframe_bottom_item_get(z->naviframe) != elm_naviframe_top_item_get(z->naviframe)) + { + z->popped = eina_list_prepend(z->popped, elm_naviframe_item_pop(z->naviframe)); + } +} + +// Set the first element after the current one available and push it to the +// naviframe +//callback of the next button +static void +_naviframe_next(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + struct naviframe_zipper *z = data; + Evas_Object *label, *prev, *next; + const char *text; + Elm_Object_Item *it; + + label = eina_list_data_get(z->popped); + z->popped = eina_list_remove_list(z->popped, z->popped); + if (label != NULL) + { + // The widget is saved inside the naviframe but nothing more; we need + // to create new buttons and set the title text again (copy the one + // from the label that is saved). + text = elm_object_text_get(label); + // The _button function creates a button which is either "Previous" (-1) or + // "Next" (1) + prev = _button(z, -1); + next = _button(z, 1); + it = elm_naviframe_item_push(z->naviframe, text, prev, next, label, NULL); + } +} + + +When a naviframe and the pages that go inside it are built, populate it. + +Remember that three naviframes are created, each populated in a different way. +The common bits have been factored out as a function and the specific parts +are executed through a callback. The generic function is shown below. + + +// Generic naviframe-populate function: +// Its third (and last) parameter is a callback for customization, i.e. pushes +// the new items to a specific position; it returns a "context" value that is +// used between its calls and enables behaviors such as "push after the +// previously-pushed item" +static struct naviframe_zipper* +_naviframe_populate_gen(Evas_Object *parent, const char *id, + void * (*populate_cb) (Evas_Object *nav, const char *title, Evas_Object + *prev, Evas_Object *next, Evas_Object *label, Elm_Object_Item *context) + ) +{ + struct naviframe_zipper *z; + Evas_Object *label, *prev, *next; + Elm_Object_Item *context = NULL; + char buf[256]; + int i; + + z = _naviframe_add(parent); + + for (i = 0; i < 20; i++) + { + label = elm_label_add(z->naviframe); + snprintf(buf, sizeof(buf), "%s [%d]", id, i); + elm_object_text_set(label, buf); + evas_object_show(label); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + // The _button function creates a button which is either "Previous" (-1) or + // "Next" (1) + prev = _button(z, -1); + next = _button(z, 1); + // Use the populate_cb callback to provide the customization of the way the + // elements are added inside the naviframe + context = populate_cb(z->naviframe, buf, prev, next, label, context); + } + return z; +} + + +The prototype of the callbacks is fairly large, but that is because of the +syntax for callbacks in C. + + +// Push items one after the other +static Elm_Object_Item * +_populate_cb__push(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); +} + +// Push items one after the other but use insert_after for it +static Elm_Object_Item * +_populate_cb__push_then_insert_after(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + if (context == NULL) + { + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); + } + else + { + return elm_naviframe_item_insert_after(nav, context, title, prev, next, label, NULL); + } +} + +// Push one item and repeatedly insert new items before the last inserted +// item +static Elm_Object_Item * +_populate_cb__push_then_insert_before(Evas_Object *nav, const char *title, + Evas_Object *prev, Evas_Object *next, Evas_Object *label, + Elm_Object_Item *context) +{ + if (context == NULL) + { + return elm_naviframe_item_push(nav, title, prev, next, label, NULL); + } + else + { + return elm_naviframe_item_insert_before(nav, context, title, prev, next, label, NULL); + } +} + + +Create a window with a vertical box, which holds the three naviframes from the +''elm_main()''. + + + +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + Evas_Object *win; + + win = elm_win_util_standard_add("Naviframe", "Naviframe Tutorial"); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_autodel_set(win, EINA_TRUE); + + Evas_Object *box; + struct naviframe_zipper **z = malloc(3*sizeof(struct naviframe_zipper *)); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_homogeneous_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + elm_win_resize_object_add(win, box); + + z[0] = _naviframe_populate_gen(win, "Before", (void*)_populate_cb__push_then_insert_before); + elm_box_pack_end(box, (*z)->naviframe); + + z[1] = _naviframe_populate_gen(win, "After", (void*)_populate_cb__push_then_insert_after); + elm_box_pack_end(box, (*(z+1))->naviframe); + + z[2] = _naviframe_populate_gen(win, "Push", (void *)_populate_cb__push); + elm_box_pack_end(box, (*(z+2))->naviframe); + + evas_object_smart_callback_add(win, "delete,request", _delete_cb, z); + //win 400x400 px + evas_object_resize(win, 400, 400); + evas_object_show(win); + elm_run(); + return 0; +} +ELM_MAIN() + +\\ +//**__The whole code__ : **//{{/code_c/tutorial/naviframe/naviframe.c}}