diff options
author | Jaeun Choi <jaeun12.choi@samsung.com> | 2017-12-15 15:53:50 +0900 |
---|---|---|
committer | Jaeun Choi <jaeun12.choi@samsung.com> | 2018-04-23 16:28:41 +0900 |
commit | a18e25540142aafbc27da09282e736881af33850 (patch) | |
tree | 24ba25d069baecf1d834af2b5ddff02119cb70ab | |
parent | 7150e849ff964dffcebd233e33b1f2e527dedf4d (diff) | |
download | efl-a18e25540142aafbc27da09282e736881af33850.tar.gz |
efl_ui_pager: add efl_page_indicator
add more test case
-rw-r--r-- | data/elementary/themes/Makefile.am | 1 | ||||
-rw-r--r-- | data/elementary/themes/default.edc | 1 | ||||
-rw-r--r-- | data/elementary/themes/edc/elm/pager.edc | 31 | ||||
-rw-r--r-- | data/elementary/themes/img/circle.svg | 7 | ||||
-rw-r--r-- | src/Makefile_Elementary.am | 8 | ||||
-rw-r--r-- | src/bin/elementary/test_efl_ui_pager.c | 116 | ||||
-rw-r--r-- | src/lib/elementary/Elementary.h | 2 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator.c | 91 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator.eo | 7 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator.h | 22 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator_icon.c | 196 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator_icon.eo | 8 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_indicator_icon.h | 17 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_pager.c | 77 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_pager.eo | 12 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_widget_pager.h | 4 | ||||
-rw-r--r-- | src/lib/elementary/elm_priv.h | 8 |
17 files changed, 592 insertions, 16 deletions
diff --git a/data/elementary/themes/Makefile.am b/data/elementary/themes/Makefile.am index fc285c696c..e53c1cfe4c 100644 --- a/data/elementary/themes/Makefile.am +++ b/data/elementary/themes/Makefile.am @@ -152,6 +152,7 @@ elementary/themes/edc/elm/tooltip.edc \ elementary/themes/edc/elm/uiclock.edc \ elementary/themes/edc/elm/video.edc \ elementary/themes/edc/elm/win.edc \ +elementary/themes/edc/elm/pager.edc \ \ elementary/themes/edc/O/efm_icons.edc \ elementary/themes/edc/O/icons.edc \ diff --git a/data/elementary/themes/default.edc b/data/elementary/themes/default.edc index d7c823e36d..e7a15fd56f 100644 --- a/data/elementary/themes/default.edc +++ b/data/elementary/themes/default.edc @@ -75,6 +75,7 @@ collections { #include "edc/elm/code.edc" #include "edc/elm/ews.edc" #include "edc/elm/textpath.edc" +#include "edc/elm/pager.edc" // desktop in general diff --git a/data/elementary/themes/edc/elm/pager.edc b/data/elementary/themes/edc/elm/pager.edc new file mode 100644 index 0000000000..10827c7a48 --- /dev/null +++ b/data/elementary/themes/edc/elm/pager.edc @@ -0,0 +1,31 @@ + group { name: "efl/pager/indicator"; + images { + image: "circle.svg" COMP; + } + parts { + rect { "base"; + scale; + desc { "default"; + color: 0 0 0 0; + } + } + image { "icon"; + scale; + desc { "default"; + image.normal: "circle.svg"; + color: 0 0 0 255; + min: 6 6; + } + desc { "selected"; + inherit: "default"; + color: 255 0 0 255; + } + } + } + script { + public message(Msg_Type:type, id, ...) { + set_tween_state(PART:"icon", getfarg(2), + "default", 0.0, "selected", 0.0); + } + } + } diff --git a/data/elementary/themes/img/circle.svg b/data/elementary/themes/img/circle.svg new file mode 100644 index 0000000000..d57ee3a5df --- /dev/null +++ b/data/elementary/themes/img/circle.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="6px" height="6px" viewBox="0 0 6 6" enable-background="new 0 0 6 6" xml:space="preserve">
+<circle fill="#FFFFFF" cx="3" cy="3" r="3"/>
+</svg>
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index a84adcf558..28c17b483c 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -108,6 +108,8 @@ elm_public_eolian_files = \ lib/elementary/efl_ui_pager.eo \ lib/elementary/efl_page_transition.eo \ lib/elementary/efl_page_transition_scroll.eo \ + lib/elementary/efl_page_indicator.eo \ + lib/elementary/efl_page_indicator_icon.eo \ $(NULL) # More public files -- FIXME @@ -406,7 +408,9 @@ includesunstable_HEADERS = \ lib/elementary/Efl_Ui.h \ lib/elementary/efl_ui_widget_pager.h \ lib/elementary/efl_page_transition.h \ - lib/elementary/efl_page_transition_scroll.h + lib/elementary/efl_page_transition_scroll.h \ + lib/elementary/efl_page_indicator.h \ + lib/elementary/efl_page_indicator_icon.h includesunstabledir = $(includedir)/elementary-@VMAJ@ nodist_includesunstable_HEADERS = \ @@ -814,6 +818,8 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/efl_ui_pager.c \ lib/elementary/efl_page_transition.c \ lib/elementary/efl_page_transition_scroll.c \ + lib/elementary/efl_page_indicator.c \ + lib/elementary/efl_page_indicator_icon.c \ $(NULL) diff --git a/src/bin/elementary/test_efl_ui_pager.c b/src/bin/elementary/test_efl_ui_pager.c index c4a7867aac..e360c34ea4 100644 --- a/src/bin/elementary/test_efl_ui_pager.c +++ b/src/bin/elementary/test_efl_ui_pager.c @@ -41,6 +41,11 @@ typedef struct _Page_Set_Params { Evas_Object *spinner; } Page_Set_Params; +typedef struct _Pack_At_Params { + Evas_Object *pager; + Evas_Object *spinner; +} Pack_At_Params; + static void page_size_cb(void *data, Evas_Object *obj, void *event_info); static void padding_cb(void *data, Evas_Object *obj, void *event_info); static void side_page_num_cb(void *data, Evas_Object *obj, void *event_info); @@ -48,6 +53,7 @@ static void pack_cb(void *data, Evas_Object *obj, void *event_info); static void loop_cb(void *data, Evas_Object *obj, void *event_info); static void current_page_cb(void *data, Evas_Object *obj, void *event_info); static void scroll_block_cb(void *data, Evas_Object *obj, void *event_info); +static void indicator_cb(void *data, Evas_Object *obj, void *event_info); //static void transition_cb(void *data, Evas_Object *obj, void *event_info); //TODO static void win_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -169,6 +175,7 @@ test_efl_ui_pager(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev elm_list_item_append(list, "Loop", NULL, NULL, loop_cb, params); elm_list_item_append(list, "Current Page", NULL, NULL, current_page_cb, params); elm_list_item_append(list, "Scroll Block", NULL, NULL, scroll_block_cb, params); + elm_list_item_append(list, "Indicator", NULL, NULL, indicator_cb, params); //elm_list_item_append(list, "Transition", NULL, NULL, transition_cb, params); //TODO elm_list_go(list); @@ -325,6 +332,27 @@ static void pack_after_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ev efl_pack_after(pager, page, curr_page); } +static void pack_at_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Pack_At_Params *pap = data; + Evas_Object *page; + int index = elm_spinner_value_get(pap->spinner); + + switch (index % 3) { + case 0: + page = page_add(LAYOUT, pap->pager, index); + break; + case 1: + page = page_add(GENLIST, pap->pager, index); + break; + case 2: + page = page_add(BUTTON, pap->pager, index); + break; + } + + efl_pack_at(pap->pager, page, index); +} + static void page_set_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Page_Set_Params *psp = data; @@ -349,6 +377,14 @@ static void page_set_btn_del_cb(void *data, free(data); } +static void pack_at_btn_del_cb(void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + free(data); +} + static void prev_block_check_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Evas_Object *pager = data; @@ -371,6 +407,18 @@ static void next_block_check_cb(void *data, Evas_Object *obj, void *event_info E efl_ui_pager_scroll_block_set(pager, prev, next); } +static void indicator_icon_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *pager = data; + efl_ui_pager_indicator_set(pager, EFL_PAGE_INDICATOR_ICON_CLASS); +} + +static void indicator_none_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *pager = data; + efl_ui_pager_indicator_set(pager, NULL); +} + static void page_size_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Params *params = (Params *)data; @@ -473,7 +521,9 @@ static void pack_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void * Params *params = (Params *)data; Evas_Object *navi = params->navi; Evas_Object *pager = params->pager; - Evas_Object *btn, *box, *pack_btn; + Evas_Object *btn, *box, *in_box, *pack_btn, *sp; + Page_Set_Params *pap = calloc(1, sizeof(Pack_At_Params)); + int max_page; btn = elm_button_add(navi); elm_object_text_set(btn, "Back"); @@ -484,29 +534,55 @@ static void pack_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void * evas_object_show(box); elm_naviframe_item_push(navi, "Pack End", btn, NULL, box, NULL); - pack_btn = elm_button_add(navi); + pack_btn = elm_button_add(box); elm_object_text_set(pack_btn, "Pack Begin"); evas_object_smart_callback_add(pack_btn, "clicked", pack_begin_btn_cb, pager); evas_object_show(pack_btn); elm_box_pack_end(box, pack_btn); - pack_btn = elm_button_add(navi); + pack_btn = elm_button_add(box); elm_object_text_set(pack_btn, "Pack End"); evas_object_smart_callback_add(pack_btn, "clicked", pack_end_btn_cb, pager); evas_object_show(pack_btn); elm_box_pack_end(box, pack_btn); - pack_btn = elm_button_add(navi); + pack_btn = elm_button_add(box); elm_object_text_set(pack_btn, "Pack Before Current Page"); evas_object_smart_callback_add(pack_btn, "clicked", pack_before_btn_cb, pager); evas_object_show(pack_btn); elm_box_pack_end(box, pack_btn); - pack_btn = elm_button_add(navi); + pack_btn = elm_button_add(box); elm_object_text_set(pack_btn, "Pack After Current Page"); evas_object_smart_callback_add(pack_btn, "clicked", pack_after_btn_cb, pager); evas_object_show(pack_btn); elm_box_pack_end(box, pack_btn); + + in_box = elm_box_add(box); + elm_box_padding_set(in_box, 10, 10); + elm_box_horizontal_set(in_box, EINA_TRUE); + evas_object_show(in_box); + elm_box_pack_end(box, in_box); + + pack_btn = elm_button_add(in_box); + elm_object_text_set(pack_btn, "Pack At"); + evas_object_show(pack_btn); + elm_box_pack_end(in_box, pack_btn); + + sp = elm_spinner_add(in_box); + elm_spinner_wrap_set(sp, EINA_TRUE); + max_page = efl_content_count(pager) - 1; + elm_spinner_min_max_set(sp, 0, max_page); + elm_spinner_value_set(sp, efl_ui_pager_current_page_get(pager)); + elm_spinner_label_format_set(sp, "%d"); + evas_object_show(sp); + elm_box_pack_end(in_box, sp); + + pap->pager = pager; + pap->spinner = sp; + + evas_object_smart_callback_add(pack_btn, "clicked", pack_at_btn_cb, pap); + evas_object_event_callback_add(pack_btn, EVAS_CALLBACK_DEL, pack_at_btn_del_cb, pap); } static void loop_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -606,6 +682,36 @@ static void scroll_block_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even elm_box_pack_end(box, check); } +static void indicator_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Params *params = (Params *)data; + Evas_Object *navi = params->navi; + Evas_Object *pager = params->pager; + Evas_Object *btn, *box, *id_btn; + + btn = elm_button_add(navi); + elm_object_text_set(btn, "Back"); + evas_object_smart_callback_add(btn, "clicked", btn_cb, navi); + + box = elm_box_add(navi); + elm_box_padding_set(box, 10, 10); + evas_object_show(box); + elm_naviframe_item_push(navi, "Pack End", btn, NULL, box, NULL); + + id_btn = elm_button_add(box); + elm_object_text_set(id_btn, "Icon Type"); + evas_object_smart_callback_add(id_btn, "clicked", indicator_icon_btn_cb, pager); + evas_object_show(id_btn); + elm_box_pack_end(box, id_btn); + + id_btn = elm_button_add(box); + elm_object_text_set(id_btn, "None"); + evas_object_smart_callback_add(id_btn, "clicked", indicator_none_btn_cb, pager); + evas_object_show(id_btn); + elm_box_pack_end(box, id_btn); +} + + /** TODO * static void transition_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h index 8ae7480c66..8fe0230849 100644 --- a/src/lib/elementary/Elementary.h +++ b/src/lib/elementary/Elementary.h @@ -349,6 +349,8 @@ typedef Eo Efl_Ui_Pager; # include <efl_page_transition.eo.h> # include <efl_page_transition_scroll.eo.h> +# include <efl_page_indicator.eo.h> +# include <efl_page_indicator_icon.eo.h> # include <efl_ui_pager.eo.h> #endif diff --git a/src/lib/elementary/efl_page_indicator.c b/src/lib/elementary/efl_page_indicator.c new file mode 100644 index 0000000000..0262027784 --- /dev/null +++ b/src/lib/elementary/efl_page_indicator.c @@ -0,0 +1,91 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Elementary.h> +#include "elm_priv.h" + +#include "efl_page_indicator.h" +#include "efl_ui_widget_pager.h" + +#define MY_CLASS EFL_PAGE_INDICATOR_CLASS + + + +EOLIAN static void +_efl_page_indicator_update(Eo *obj EINA_UNUSED, + Efl_Page_Indicator_Data *pd EINA_UNUSED, + double pos EINA_UNUSED) +{ + +} + +EOLIAN static void +_efl_page_indicator_pack_begin(Eo *obj EINA_UNUSED, + Efl_Page_Indicator_Data *pd) +{ + pd->cnt++; +} + +EOLIAN static void +_efl_page_indicator_pack_end(Eo *obj EINA_UNUSED, + Efl_Page_Indicator_Data *pd) +{ + pd->cnt++; +} + +EOLIAN static void +_efl_page_indicator_pack_before(Eo *obj EINA_UNUSED, + Efl_Page_Indicator_Data *pd, + int index EINA_UNUSED) +{ + pd->cnt++; +} + +EOLIAN static void +_efl_page_indicator_pack_after(Eo *obj EINA_UNUSED, + Efl_Page_Indicator_Data *pd, + int index EINA_UNUSED) +{ + pd->cnt++; +} + +EOLIAN static Eo * +_efl_page_indicator_efl_object_constructor(Eo *obj, + Efl_Page_Indicator_Data *pd) +{ + obj = efl_constructor(efl_super(obj, MY_CLASS)); + + pd->idbox = efl_parent_get(obj); + pd->pager.obj = efl_parent_get(pd->idbox); + + pd->cnt = efl_content_count(pd->pager.obj); + + return obj; +} + + + +EOAPI EFL_VOID_FUNC_BODYV(efl_page_indicator_update, + EFL_FUNC_CALL(pos), double pos) +EOAPI EFL_VOID_FUNC_BODY(efl_page_indicator_pack_begin) +EOAPI EFL_VOID_FUNC_BODY(efl_page_indicator_pack_end) +EOAPI EFL_VOID_FUNC_BODYV(efl_page_indicator_pack_before, + EFL_FUNC_CALL(index), int index) +EOAPI EFL_VOID_FUNC_BODYV(efl_page_indicator_pack_after, + EFL_FUNC_CALL(index), int index) + + +#define EFL_PAGE_INDICATOR_EXTRA_OPS \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_update, \ + _efl_page_indicator_update), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_begin, \ + _efl_page_indicator_pack_begin), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_end, \ + _efl_page_indicator_pack_end), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_before, \ + _efl_page_indicator_pack_before), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_after, \ + _efl_page_indicator_pack_after) + +#include "efl_page_indicator.eo.c" diff --git a/src/lib/elementary/efl_page_indicator.eo b/src/lib/elementary/efl_page_indicator.eo new file mode 100644 index 0000000000..ae3774f5d5 --- /dev/null +++ b/src/lib/elementary/efl_page_indicator.eo @@ -0,0 +1,7 @@ +class Efl.Page.Indicator (Efl.Object) +{ + [[Efl ui pager indicator class]] + implements { + Efl.Object.constructor; + } +} diff --git a/src/lib/elementary/efl_page_indicator.h b/src/lib/elementary/efl_page_indicator.h new file mode 100644 index 0000000000..430dc47cfd --- /dev/null +++ b/src/lib/elementary/efl_page_indicator.h @@ -0,0 +1,22 @@ +#ifndef EFL_PAGE_INDICATOR_H +#define EFL_PAGE_INDICATOR_H + +typedef struct _Efl_Page_Indicator_Data Efl_Page_Indicator_Data; + +struct _Efl_Page_Indicator_Data +{ + struct { + Efl_Object *obj; + Evas_Coord x, y, w, h; + } pager; + + Efl_Ui_Box *idbox; + + int cnt; +}; + +#define EFL_PAGE_INDICATOR_DATA_GET(o, pd) \ + Efl_Page_Indicator_Data *pd = \ + efl_data_scope_get(o, EFL_PAGE_INDICATOR_CLASS) + +#endif diff --git a/src/lib/elementary/efl_page_indicator_icon.c b/src/lib/elementary/efl_page_indicator_icon.c new file mode 100644 index 0000000000..14dda4211e --- /dev/null +++ b/src/lib/elementary/efl_page_indicator_icon.c @@ -0,0 +1,196 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Elementary.h> +#include "elm_priv.h" + +#include "efl_page_indicator_icon.h" +#include "efl_page_indicator.h" +#include "efl_ui_widget_pager.h" + +#define MY_CLASS EFL_PAGE_INDICATOR_ICON_CLASS + + + +EOLIAN static void +_efl_page_indicator_icon_update(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd, + double pos) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item; + int page = efl_ui_pager_current_page_get(spd->pager.obj); + + if (pos < 0) + { + item = eina_list_nth(pd->items, page); + eina_value_set(pd->v, (1.0 + pos)); + efl_layout_signal_message_send(item, 1, *(pd->v)); + + item = eina_list_nth(pd->items, + (page - 1 + spd->cnt) % spd->cnt); + eina_value_set(pd->v, (pos * -1.0)); + efl_layout_signal_message_send(item, 1, *(pd->v)); + } + else + { + item = eina_list_nth(pd->items, page); + eina_value_set(pd->v, (1.0 - pos)); + efl_layout_signal_message_send(item, 1, *(pd->v)); + + item = eina_list_nth(pd->items, + (page + 1 + spd->cnt) % spd->cnt); + eina_value_set(pd->v, pos); + efl_layout_signal_message_send(item, 1, *(pd->v)); + } +} + +EOLIAN static void +_efl_page_indicator_icon_pack_begin(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item; + + efl_page_indicator_pack_begin(efl_super(obj, MY_CLASS)); + + item = efl_add(EFL_CANVAS_LAYOUT_CLASS, spd->idbox); + pd->items = eina_list_prepend(pd->items, item); + + elm_widget_theme_object_set(spd->idbox, item, + "pager", "indicator", "default"); + efl_gfx_size_hint_align_set(item, 0.5, 0.5); + efl_gfx_size_hint_weight_set(item, 0, 0); + efl_pack_begin(spd->idbox, item); +} + +EOLIAN static void +_efl_page_indicator_icon_pack_end(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item; + + efl_page_indicator_pack_end(efl_super(obj, MY_CLASS)); + + item = efl_add(EFL_CANVAS_LAYOUT_CLASS, spd->idbox); + pd->items = eina_list_append(pd->items, item); + + elm_widget_theme_object_set(spd->idbox, item, + "pager", "indicator", "default"); + efl_gfx_size_hint_align_set(item, 0.5, 0.5); + efl_gfx_size_hint_weight_set(item, 0, 0); + efl_pack_end(spd->idbox, item); +} + +EOLIAN static void +_efl_page_indicator_icon_pack_before(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd, + int index) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item, *existing; + + efl_page_indicator_pack_before(efl_super(obj, MY_CLASS), index); + + existing = eina_list_nth(pd->items, index); + + item = efl_add(EFL_CANVAS_LAYOUT_CLASS, spd->idbox); + pd->items = eina_list_prepend_relative(pd->items, item, existing); + + elm_widget_theme_object_set(spd->idbox, item, + "pager", "indicator", "default"); + efl_gfx_size_hint_align_set(item, 0.5, 0.5); + efl_gfx_size_hint_weight_set(item, 0, 0); + + efl_pack_before(spd->idbox, item, existing); +} + +EOLIAN static void +_efl_page_indicator_icon_pack_after(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd, + int index) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item, *existing; + + efl_page_indicator_pack_after(efl_super(obj, MY_CLASS), index); + + existing = eina_list_nth(pd->items, index); + + item = efl_add(EFL_CANVAS_LAYOUT_CLASS, spd->idbox); + pd->items = eina_list_append_relative(pd->items, item, existing); + + elm_widget_theme_object_set(spd->idbox, item, + "pager", "indicator", "default"); + efl_gfx_size_hint_align_set(item, 0.5, 0.5); + efl_gfx_size_hint_weight_set(item, 0, 0); + + efl_pack_after(spd->idbox, item, existing); +} + +EOLIAN static Eo * +_efl_page_indicator_icon_efl_object_constructor(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd) +{ + EFL_PAGE_INDICATOR_DATA_GET(obj, spd); + Eo *item; + int i, page; + + obj = efl_constructor(efl_super(obj, MY_CLASS)); + + efl_ui_direction_set(spd->idbox, EFL_UI_DIR_HORIZONTAL); + efl_pack_padding_set(spd->idbox, 15, 15, EINA_TRUE); + + pd->v = eina_value_float_new(0.0); + + if (spd->cnt != 0) + { + for (i = 0; i < spd->cnt; i++) + { + item = efl_add(EFL_CANVAS_LAYOUT_CLASS, spd->idbox); + pd->items = eina_list_append(pd->items, item); + + elm_widget_theme_object_set(spd->idbox, item, + "pager", "indicator", "default"); + efl_gfx_size_hint_align_set(item, 0.5, 0.5); + efl_gfx_size_hint_weight_set(item, 0, 0); + efl_pack_end(spd->idbox, item); + } + + page = efl_ui_pager_current_page_get(spd->pager.obj); + item = eina_list_nth(pd->items, page); + eina_value_set(pd->v, 1.0); + efl_layout_signal_message_send(item, 1, *(pd->v)); + } + + return obj; +} + +EOLIAN static void +_efl_page_indicator_icon_efl_object_destructor(Eo *obj, + Efl_Page_Indicator_Icon_Data *pd) +{ + Eo *item; + + efl_destructor(efl_super(obj, MY_CLASS)); + + EINA_LIST_FREE(pd->items, item) + efl_del(item); +} + + +#define EFL_PAGE_INDICATOR_ICON_EXTRA_OPS \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_update, \ + _efl_page_indicator_icon_update), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_begin, \ + _efl_page_indicator_icon_pack_begin), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_end, \ + _efl_page_indicator_icon_pack_end), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_before, \ + _efl_page_indicator_icon_pack_before), \ + EFL_OBJECT_OP_FUNC(efl_page_indicator_pack_after, \ + _efl_page_indicator_icon_pack_after) + +#include "efl_page_indicator_icon.eo.c" diff --git a/src/lib/elementary/efl_page_indicator_icon.eo b/src/lib/elementary/efl_page_indicator_icon.eo new file mode 100644 index 0000000000..4b74d2832f --- /dev/null +++ b/src/lib/elementary/efl_page_indicator_icon.eo @@ -0,0 +1,8 @@ +class Efl.Page.Indicator.Icon (Efl.Page.Indicator) +{ + [[Efl ui pager indicator icon class]] + implements { + Efl.Object.constructor; + Efl.Object.destructor; + } +} diff --git a/src/lib/elementary/efl_page_indicator_icon.h b/src/lib/elementary/efl_page_indicator_icon.h new file mode 100644 index 0000000000..ed509f06aa --- /dev/null +++ b/src/lib/elementary/efl_page_indicator_icon.h @@ -0,0 +1,17 @@ +#ifndef EFL_PAGE_INDICATOR_ICON_H +#define EFL_PAGE_INDICATOR_ICON_H + +typedef struct _Efl_Page_Indicator_Icon_Data Efl_Page_Indicator_Icon_Data; + +struct _Efl_Page_Indicator_Icon_Data +{ + Eina_List *items; + Eina_Value *v; +}; + + +#define EFL_PAGE_INDICATOR_ICON_DATA_GET(o, pd) \ + Efl_Page_Indicator_Icon_Data *pd = \ + efl_data_scope_get(o, EFL_PAGE_INDICATOR_ICON_CLASS) + +#endif diff --git a/src/lib/elementary/efl_ui_pager.c b/src/lib/elementary/efl_ui_pager.c index 862820846a..3165e33877 100644 --- a/src/lib/elementary/efl_ui_pager.c +++ b/src/lib/elementary/efl_ui_pager.c @@ -19,6 +19,8 @@ _efl_ui_pager_update(Efl_Ui_Pager_Data *pd) if (pd->cnt == 0) return; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + efl_page_indicator_update(pd->indicator, pd->curr.pos); } static void @@ -281,6 +283,7 @@ _efl_ui_pager_efl_gfx_size_set(Eo *obj, pd->h = sz.h; efl_gfx_size_set(pd->event, sz); + efl_gfx_size_set(pd->idbox, EINA_SIZE2D(sz.w, 50)); } EOLIAN static void @@ -299,6 +302,7 @@ _efl_ui_pager_efl_gfx_position_set(Eo *obj, pd->y = pos.y; efl_gfx_position_set(pd->event, pos); + efl_gfx_position_set(pd->idbox, pos); } EOLIAN static int @@ -318,12 +322,19 @@ _efl_ui_pager_efl_pack_linear_pack_begin(Eo *obj, pd->content_list = eina_list_prepend(pd->content_list, subobj); efl_gfx_stack_above(pd->event, subobj); + efl_gfx_stack_above(pd->idbox, subobj); pd->cnt += 1; pd->curr.page += 1; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + { + efl_page_indicator_pack_begin(pd->indicator); + efl_page_indicator_update(pd->indicator, pd->curr.pos); + } + return EINA_TRUE; } @@ -337,11 +348,18 @@ _efl_ui_pager_efl_pack_linear_pack_end(Eo *obj, pd->content_list = eina_list_append(pd->content_list, subobj); efl_gfx_stack_above(pd->event, subobj); + efl_gfx_stack_above(pd->idbox, subobj); pd->cnt += 1; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + { + efl_page_indicator_pack_end(pd->indicator); + efl_page_indicator_update(pd->indicator, pd->curr.pos); + } + return EINA_TRUE; } @@ -352,18 +370,26 @@ _efl_ui_pager_efl_pack_linear_pack_before(Eo *obj, const Efl_Gfx *existing) { int index; + efl_parent_set(subobj, obj); elm_widget_sub_object_add(obj, subobj); index = eina_list_data_idx(pd->content_list, (void *)existing); pd->content_list = eina_list_prepend_relative(pd->content_list, subobj, existing); efl_gfx_stack_above(pd->event, subobj); + efl_gfx_stack_above(pd->idbox, subobj); pd->cnt += 1; if (pd->curr.page >= index) pd->curr.page += 1; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + { + efl_page_indicator_pack_before(pd->indicator, index); + efl_page_indicator_update(pd->indicator, pd->curr.pos); + } + return EINA_TRUE; } @@ -374,18 +400,26 @@ _efl_ui_pager_efl_pack_linear_pack_after(Eo *obj, const Efl_Gfx *existing) { int index; + efl_parent_set(subobj, obj); elm_widget_sub_object_add(obj, subobj); index = eina_list_data_idx(pd->content_list, (void *)existing); pd->content_list = eina_list_append_relative(pd->content_list, subobj, existing); efl_gfx_stack_above(pd->event, subobj); + efl_gfx_stack_above(pd->idbox, subobj); pd->cnt += 1; if (pd->curr.page > index) pd->curr.page += 1; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + { + efl_page_indicator_pack_after(pd->indicator, index); + efl_page_indicator_update(pd->indicator, pd->curr.pos); + } + return EINA_TRUE; } @@ -396,18 +430,26 @@ _efl_ui_pager_efl_pack_linear_pack_at(Eo *obj, int index) { Efl_Gfx *existing = NULL; + efl_parent_set(subobj, obj); elm_widget_sub_object_add(obj, subobj); existing = eina_list_nth(pd->content_list, index); pd->content_list = eina_list_prepend_relative(pd->content_list, subobj, existing); efl_gfx_stack_above(pd->event, subobj); + efl_gfx_stack_above(pd->idbox, subobj); pd->cnt += 1; if (pd->curr.page >= index) pd->curr.page += 1; efl_page_transition_update(pd->transition, pd->curr.pos); + if (pd->indicator) + { + efl_page_indicator_pack_before(pd->indicator, index); + efl_page_indicator_update(pd->indicator, pd->curr.pos); + } + return EINA_TRUE; } @@ -511,13 +553,6 @@ _efl_ui_pager_current_page_get(Eo *obj EINA_UNUSED, return pd->curr.page; } -EOLIAN static Efl_Page_Transition * -_efl_ui_pager_transition_get(Eo *obj EINA_UNUSED, - Efl_Ui_Pager_Data *pd) -{ - return pd->transition; -} - EOLIAN static void _efl_ui_pager_transition_set(Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd, @@ -527,6 +562,34 @@ _efl_ui_pager_transition_set(Eo *obj EINA_UNUSED, pd->transition = transition; } +EOLIAN static void +_efl_ui_pager_indicator_set(Eo *obj EINA_UNUSED, + Efl_Ui_Pager_Data *pd, + const Efl_Class *klass) +{ + if (pd->indicator) + { + efl_del(pd->indicator); + pd->indicator = NULL; + } + + if (!klass) + { + efl_del(pd->idbox); + pd->idbox = NULL; + return; + } + + if (!pd->idbox) + { + pd->idbox = efl_add(EFL_UI_BOX_CLASS, obj); + efl_gfx_size_set(pd->idbox, EINA_SIZE2D(pd->w, 50)); + efl_gfx_position_set(pd->idbox, EINA_POSITION2D(pd->x, pd->y)); + } + + pd->indicator = efl_add(klass, pd->idbox); +} + EOLIAN Eina_Size2D _efl_ui_pager_page_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd) diff --git a/src/lib/elementary/efl_ui_pager.eo b/src/lib/elementary/efl_ui_pager.eo index 34c1f4715a..9c6dea66be 100644 --- a/src/lib/elementary/efl_ui_pager.eo +++ b/src/lib/elementary/efl_ui_pager.eo @@ -12,11 +12,21 @@ class Efl.Ui.Pager (Elm.Widget, Efl.Pack.Linear) eo_prefix: efl_ui_pager; methods { @property transition { - [[Page transition effect]] + set { + [[Page transition effect]] + } values { transition: Efl.Page.Transition @nonull; [[transition effect]] } } + @property indicator { + set { + [[Page indicator]] + } + values { + klass: const(Efl.Class) @nullable; [[indicator class]] + } + } @property current_page { [[Set the currently selected page]] values { diff --git a/src/lib/elementary/efl_ui_widget_pager.h b/src/lib/elementary/efl_ui_widget_pager.h index 05bae3b376..5f42133ce8 100644 --- a/src/lib/elementary/efl_ui_widget_pager.h +++ b/src/lib/elementary/efl_ui_widget_pager.h @@ -11,7 +11,8 @@ typedef struct _Efl_Ui_Pager_Data Eina_List *page_infos; Eina_List *content_list; - Evas_Object *event; + Eo *event; + Efl_Ui_Box *idbox; Ecore_Animator *animator; Ecore_Job *job; Ecore_Job *page_info_job; @@ -48,6 +49,7 @@ typedef struct _Efl_Ui_Pager_Data Efl_Ui_Pager_Loop loop; Efl_Page_Transition *transition; + Efl_Page_Indicator *indicator; Eina_Bool move_started : 1; Eina_Bool prev_block : 1; diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index aefe6021d7..d07b433334 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -733,11 +733,17 @@ void _elm_widget_full_eval(Eo *obj); EOAPI void efl_page_transition_page_size_set(Eo *obj, Eina_Size2D sz); EOAPI void efl_page_transition_padding_size_set(Eo *obj, int padding); -EOAPI void efl_page_transition_update(Eo *obj, double move); +EOAPI void efl_page_transition_update(Eo *obj, double pos); EOAPI void efl_page_transition_curr_page_change(Eo *obj, double move); EOAPI void efl_page_transition_pack_end(Eo *obj, Efl_Gfx *subobj); EOAPI void efl_page_transition_loop_set(Eo *obj, Efl_Ui_Pager_Loop loop); +EOAPI void efl_page_indicator_update(Eo *obj, double pos); +EOAPI void efl_page_indicator_pack_begin(Eo *obj); +EOAPI void efl_page_indicator_pack_end(Eo *obj); +EOAPI void efl_page_indicator_pack_before(Eo *obj, int index); +EOAPI void efl_page_indicator_pack_after(Eo *obj, int index); + Eina_Bool _elm_config_accel_preference_parse(const char *pref, Eina_Stringshare **accel, int *gl_depth, int *gl_stencil, int *gl_msaa); extern char *_elm_appname; |