efl_ui_spotlight: pop() unpacks content although there is one content
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 31 Jul 2019 09:16:51 +0000 (09:16 +0000)
committerWooHyun Jung <wh0705.jung@samsung.com>
Mon, 5 Aug 2019 02:05:24 +0000 (11:05 +0900)
Previously, pop() does not unpack content if there is one content.

Now, pop() unpacks content without transition if there is one content.
Since there is no transition, NULL future is returned.

Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D9450

src/bin/elementary/test_ui_spotlight.c
src/lib/elementary/efl_ui_spotlight_container.c

index 698d231..4b81f8a 100644 (file)
@@ -140,6 +140,57 @@ next_btn_cb(void *data, const Efl_Event *ev EINA_UNUSED)
      efl_ui_spotlight_active_index_set(spotlight, active_index + 1);
 }
 
+static Eina_Value
+future_then_cb(void *data EINA_UNUSED, const Eina_Value value, const Eina_Future *dead_future EINA_UNUSED)
+{
+   /* If efl_ui_spotlight_pop is called with EINA_FALSE, then the content is not
+    * deleted and the value contains the content. */
+   Eo *content = eina_value_object_get(&value);
+   if (content)
+     efl_gfx_entity_visible_set(content, EINA_FALSE);
+
+   return EINA_VALUE_EMPTY;
+}
+
+static void
+pop_btn_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+   Eo *spotlight = data;
+
+   if (efl_content_count(spotlight) == 0) return;
+
+   Eina_Future *future = efl_ui_spotlight_pop(spotlight, EINA_TRUE);
+   eina_future_then(future, future_then_cb, NULL);
+}
+
+static void
+push_btn_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+   Eo *spotlight = data;
+   Eo *view;
+   int count = efl_content_count(spotlight);
+
+   switch (count % 3)
+     {
+        case 0:
+          view = view_add(BUTTON, spotlight);
+          break;
+
+        case 1:
+          view = view_add(LIST, spotlight);
+          break;
+
+        case 2:
+          view = view_add(LAYOUT, spotlight);
+          break;
+
+        default:
+          view = view_add(LAYOUT, spotlight);
+          break;
+     }
+   efl_ui_spotlight_push(spotlight, view);
+}
+
 static void
 back_btn_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 {
@@ -842,15 +893,15 @@ test_ui_spotlight_stack(void *data EINA_UNUSED,
    efl_ui_spotlight_manager_set(spotlight, efl_new(EFL_UI_SPOTLIGHT_MANAGER_STACK_CLASS));
 
    efl_add(EFL_UI_BUTTON_CLASS, layout,
-           efl_text_set(efl_added, "Prev"),
+           efl_text_set(efl_added, "Pop"),
            efl_event_callback_add(efl_added,
-                                  EFL_INPUT_EVENT_CLICKED, prev_btn_cb, spotlight),
+                                  EFL_INPUT_EVENT_CLICKED, pop_btn_cb, spotlight),
            efl_content_set(efl_part(layout, "prev_btn"), efl_added));
 
    efl_add(EFL_UI_BUTTON_CLASS, layout,
-           efl_text_set(efl_added, "Next"),
+           efl_text_set(efl_added, "Push"),
            efl_event_callback_add(efl_added,
-                                  EFL_INPUT_EVENT_CLICKED, next_btn_cb, spotlight),
+                                  EFL_INPUT_EVENT_CLICKED, push_btn_cb, spotlight),
            efl_content_set(efl_part(layout, "next_btn"), efl_added));
 
    params = calloc(1, sizeof(Params));
index 45afd99..10c8125 100644 (file)
@@ -677,16 +677,40 @@ EOLIAN static Eina_Future*
 _efl_ui_spotlight_container_pop(Eo *obj, Efl_Ui_Spotlight_Container_Data *pd, Eina_Bool del)
 {
    Eina_Future *transition_done;
+   Eina_Value v;
    int new_index;
+   int count;
+   Eo *content;
 
-   if (eina_list_count(pd->content_list) < 2)
-     new_index = -1;
+   count = (int)eina_list_count(pd->content_list);
+
+   if (count == 0) return NULL;
+
+   content = efl_pack_content_get(obj, efl_ui_spotlight_active_index_get(obj));
+
+   //pop() unpacks content without transition if there is one content.
+   if (count == 1)
+     {
+        efl_pack_unpack(obj, content);
+        pd->curr.page = -1;
+
+        if (del)
+          {
+             efl_del(content);
+             v = EINA_VALUE_EMPTY;
+          }
+        else
+          {
+             v = eina_value_object_init(content);
+          }
+        return efl_loop_future_resolved(obj, v);
+     }
 
    new_index = efl_ui_spotlight_active_index_get(obj) + 1;
-   if (new_index >= (int)eina_list_count(pd->content_list))
+   if (new_index >= count)
      new_index -= 2;
 
-   pd->transition_done.content = efl_pack_content_get(obj, efl_ui_spotlight_active_index_get(obj));
+   pd->transition_done.content = content;
    pd->transition_done.transition_done = efl_loop_promise_new(obj);
 
    transition_done = eina_future_new(pd->transition_done.transition_done);