bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=1a1868ce57a3c0e45735bb3afa5aa5243ef78018

commit 1a1868ce57a3c0e45735bb3afa5aa5243ef78018
Author: Ali Alzyod <ali198...@gmail.com>
Date:   Tue Jan 14 16:29:50 2020 +0000

    efl.ui.textbox: replace hoversel with popup
    
    efl.ui.textbox: replace hoversel with popup
    **I think this may need some changes, please let me know what you think**
    
    Reviewed-by: Marcel Hollerbach <m...@marcel-hollerbach.de>
    Differential Revision: https://phab.enlightenment.org/D11072
---
 src/lib/elementary/efl_ui_textbox.c | 245 +++++++++++++++---------------------
 1 file changed, 104 insertions(+), 141 deletions(-)

diff --git a/src/lib/elementary/efl_ui_textbox.c 
b/src/lib/elementary/efl_ui_textbox.c
index d88f6a432c..c64c1baf03 100644
--- a/src/lib/elementary/efl_ui_textbox.c
+++ b/src/lib/elementary/efl_ui_textbox.c
@@ -15,7 +15,6 @@
 
 #include "elm_entry_common.h"
 #include "elm_widget_entry.h"
-#include "elm_hoversel_eo.h"
 #include "efl_ui_text_part.eo.h"
 #include "elm_part_helper.h"
 #include "efl_canvas_textblock_internal.h"
@@ -32,7 +31,8 @@ struct _Efl_Ui_Textbox_Data
 {
    Evas_Object                          *hit_rect, *entry_edje;
 
-   Evas_Object                          *hoversel;
+   Eo                                   *popup;
+   Eo                                   *popup_list;
    Eo                                   *text_obj;
    Eo                                   *text_guide_obj;
    Eo                                   *text_table;
@@ -59,7 +59,6 @@ struct _Efl_Ui_Textbox_Data
    Eina_List                            *sel;
    Efl_Canvas_Textblock_Factory              *item_factory;
    Efl_Canvas_Textblock_Factory              *item_fallback_factory;
-   Ecore_Job                            *hov_deljob;
    Mod_Api                              *api; // module api if supplied
    int                                   cursor_pos;
    Elm_Scroller_Policy                   policy_h, policy_v;
@@ -841,7 +840,7 @@ _efl_ui_textbox_efl_ui_focus_object_on_focus_update(Eo 
*obj, Efl_Ui_Textbox_Data
 
         if (_elm_config->selection_clear_enable)
           {
-             if ((efl_text_interactive_have_selection_get(obj)) && 
(!sd->hoversel))
+             if ((efl_text_interactive_have_selection_get(obj)) && 
(!sd->popup))
                {
                   sd->sel_mode = EINA_FALSE;
                   efl_ui_widget_scroll_hold_pop(obj);
@@ -882,7 +881,7 @@ _efl_ui_textbox_efl_ui_widget_interest_region_get(const Eo 
*obj EINA_UNUSED, Efl
 }
 
 static void
-_hoversel_position(Evas_Object *obj)
+_popup_position(Evas_Object *obj)
 {
    Evas_Coord cx, cy, cw, ch, x, y, mw, mh, w, h;
 
@@ -902,74 +901,12 @@ _hoversel_position(Evas_Object *obj)
      edje_object_part_text_cursor_geometry_get
        (sd->entry_edje, "efl.text", &cx, &cy, &cw, &ch);
 
-   evas_object_size_hint_min_get(sd->hoversel, &mw, &mh);
+   evas_object_size_hint_min_get(sd->popup, &mw, &mh);
    if (cx + mw > w)
      cx = w - mw;
    if (cy + mh > h)
      cy = h - mh;
-   evas_object_geometry_set(sd->hoversel, x + cx, y + cy, mw, mh);
-}
-
-static void
-_hover_del_job(void *data)
-{
-   EFL_UI_TEXT_DATA_GET(data, sd);
-
-   ELM_SAFE_FREE(sd->hoversel, evas_object_del);
-   sd->hov_deljob = NULL;
-}
-
-static void
-_hover_dismissed_cb(void *data, const Efl_Event *event EINA_UNUSED)
-{
-   EFL_UI_TEXT_DATA_GET(data, sd);
-
-   sd->use_down = 0;
-   if (sd->hoversel) evas_object_hide(sd->hoversel);
-   if (sd->sel_mode)
-     {
-        if (!_elm_config->desktop_entry)
-          {
-             if (!efl_text_password_get(data))
-               edje_object_part_text_select_allow_set
-                 (sd->entry_edje, "efl.text", EINA_TRUE);
-          }
-     }
-   efl_ui_widget_scroll_freeze_pop(data);
-   ecore_job_del(sd->hov_deljob);
-   sd->hov_deljob = ecore_job_add(_hover_del_job, data);
-}
-
-static void
-_hover_selected_cb(void *data,
-                   Evas_Object *obj EINA_UNUSED,
-                   void *event_info EINA_UNUSED)
-{
-   EFL_UI_TEXT_DATA_GET(data, sd);
-
-   if (!efl_text_interactive_selection_allowed_get(obj)) return;
-
-   sd->sel_mode = EINA_TRUE;
-   edje_object_part_text_select_none(sd->entry_edje, "efl.text");
-
-   if (!_elm_config->desktop_entry)
-     {
-        if (!efl_text_password_get(data))
-          edje_object_part_text_select_allow_set
-            (sd->entry_edje, "efl.text", EINA_TRUE);
-     }
-   efl_layout_signal_emit(sd->entry_edje, "efl,state,select,on", "efl");
-
-   if (!_elm_config->desktop_entry)
-     efl_ui_widget_scroll_hold_push(data);
-}
-
-static void
-_hoversel_item_paste_cb(void *data,
-          Evas_Object *obj EINA_UNUSED,
-          void *event_info EINA_UNUSED)
-{
-   efl_ui_textbox_selection_paste(data);
+   evas_object_geometry_set(sd->popup, x + cx, y + cy, mw, mh);
 }
 
 static Eina_Value
@@ -1053,43 +990,63 @@ end:
 }
 
 static void
-_hoversel_item_cut_cb(void *data,
-        Evas_Object *obj EINA_UNUSED,
-        void *event_info EINA_UNUSED)
+_popup_dismiss( Efl_Ui_Textbox_Data *sd)
 {
+   efl_del(sd->popup_list);
+   efl_del(sd->popup);
+   sd->popup = NULL;
+   sd->popup_list = NULL;
+}
+
+static void
+_backwall_clicked(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+   EFL_UI_TEXT_DATA_GET(data, sd);
+   _popup_dismiss(sd);
+}
+
+static void
+_popup_item_cut_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+   EFL_UI_TEXT_DATA_GET(data, sd);
    efl_ui_textbox_selection_cut(data);
+   _popup_dismiss(sd);
 }
 
 static void
-_hoversel_item_copy_cb(void *data,
-         Evas_Object *obj EINA_UNUSED,
-         void *event_info EINA_UNUSED)
+_popup_item_copy_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 {
+   EFL_UI_TEXT_DATA_GET(data, sd);
    efl_ui_textbox_selection_copy(data);
+   _popup_dismiss(sd);
 }
 
 static void
-_hover_cancel_cb(void *data,
-                 Evas_Object *obj EINA_UNUSED,
-                 void *event_info EINA_UNUSED)
+_popup_item_cancel_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 {
    EFL_UI_TEXT_DATA_GET(data, sd);
 
-   sd->sel_mode = EINA_FALSE;
-   if (!_elm_config->desktop_entry)
-     edje_object_part_text_select_allow_set
-       (sd->entry_edje, "efl.text", EINA_FALSE);
-   efl_layout_signal_emit(sd->entry_edje, "efl,state,select,off", "efl");
+   if (!efl_text_interactive_selection_allowed_get(data)) return;
+
    if (!_elm_config->desktop_entry)
      efl_ui_widget_scroll_hold_pop(data);
-   edje_object_part_text_select_none(sd->entry_edje, "efl.text");
+
+   sd->sel_mode = EINA_FALSE;
+   efl_text_interactive_all_unselect(data);
+   _popup_dismiss(sd);
 }
 
 static void
-_menu_call(Evas_Object *obj)
+_popup_item_paste_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 {
-   Evas_Object *top;
+   EFL_UI_TEXT_DATA_GET(data, sd);
+   efl_ui_textbox_selection_paste(data);
+   _popup_dismiss(sd);
+}
 
+static void
+_menu_call(Evas_Object *obj)
+{
    EFL_UI_TEXT_DATA_GET(obj, sd);
 
    if (sd->anchor_hover.hover) return;
@@ -1102,7 +1059,6 @@ _menu_call(Evas_Object *obj)
      }
    else if (sd->context_menu_enabled)
      {
-        const char *context_menu_orientation;
         Eina_Bool ownersel;
 
         ownersel = elm_selection_selection_has_owner(obj);
@@ -1110,83 +1066,90 @@ _menu_call(Evas_Object *obj)
         if (efl_text_interactive_have_selection_get(obj) && 
efl_text_password_get(obj)) return;
         if (_elm_config->desktop_entry && 
(!efl_text_interactive_have_selection_get(obj)) && 
((!efl_text_interactive_editable_get(obj)) || (!ownersel)))
         return;
-        if (sd->hoversel) evas_object_del(sd->hoversel);
+        if (sd->popup) _popup_dismiss(sd);
         else efl_ui_widget_scroll_freeze_push(obj);
 
-        sd->hoversel = elm_hoversel_add(obj);
-        context_menu_orientation = efl_layout_group_data_get
-            (sd->entry_edje, "context_menu_orientation");
-
-        if ((context_menu_orientation) &&
-            (!strcmp(context_menu_orientation, "horizontal")))
-          elm_hoversel_horizontal_set(sd->hoversel, EINA_TRUE);
+        sd->popup = efl_add(EFL_UI_POPUP_CLASS, obj);
 
-        elm_object_style_set(sd->hoversel, "entry");
-        efl_ui_widget_sub_object_add(obj, sd->hoversel);
-        elm_object_text_set(sd->hoversel, "Text");
-        top = elm_widget_top_get(obj);
+        sd->popup_list = efl_add(EFL_UI_LIST_CLASS, sd->popup);
+        efl_content_set(sd->popup, sd->popup_list);
+        efl_gfx_hint_align_set(sd->popup_list, 1.0, 1.0);
+        efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
 
-        if (top) elm_hoversel_hover_parent_set(sd->hoversel, top);
+        efl_ui_widget_sub_object_add(obj, sd->popup);
+        efl_ui_popup_anchor_set(sd->popup, obj);
+        efl_event_callback_add(sd->popup, EFL_UI_POPUP_EVENT_BACKWALL_CLICKED, 
_backwall_clicked, obj);
 
-        efl_event_callback_add
-          (sd->hoversel, ELM_HOVERSEL_EVENT_DISMISSED, _hover_dismissed_cb, 
obj);
         if (efl_text_interactive_have_selection_get(obj))
           {
              if (!efl_text_password_get(obj))
                {
                   if (efl_text_interactive_editable_get(obj))
-                    elm_hoversel_item_add
-                       (sd->hoversel, E_("Cut"), NULL, ELM_ICON_NONE,
-                        _hoversel_item_cut_cb, obj);
-                  elm_hoversel_item_add
-                     (sd->hoversel, E_("Copy"), NULL, ELM_ICON_NONE,
-                      _hoversel_item_copy_cb, obj);
-                  if (efl_text_interactive_editable_get(obj) && ownersel)
-                    elm_hoversel_item_add
-                       (sd->hoversel, E_("Paste"), NULL, ELM_ICON_NONE,
-                        _hoversel_item_paste_cb, obj);
-                  elm_hoversel_item_add
-                    (sd->hoversel, E_("Cancel"), NULL, ELM_ICON_NONE,
-                    _hover_cancel_cb, obj);
+                    {
+                       Eo *il = NULL;
+                       il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, 
sd->popup_list);
+                       efl_text_set(il, E_("Cut"));
+                       efl_gfx_hint_align_set(il, 1.0, 1.0);
+                       efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                       efl_pack_end(sd->popup_list, il);
+                       efl_event_callback_add(il, 
EFL_UI_EVENT_SELECTED_CHANGED, _popup_item_cut_cb, obj);
+
+                       il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, 
sd->popup_list);
+                       efl_text_set(il, E_("Copy"));
+                       efl_gfx_hint_align_set(il, 1.0, 1.0);
+                       efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                       efl_pack_end(sd->popup_list, il);
+                       efl_event_callback_add(il, 
EFL_UI_EVENT_SELECTED_CHANGED, _popup_item_copy_cb, obj);
+
+                       il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, 
sd->popup_list);
+                       efl_text_set(il, E_("Paste"));
+                       efl_gfx_hint_align_set(il, 1.0, 1.0);
+                       efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                       efl_pack_end(sd->popup_list, il);
+                       efl_event_callback_add(il, 
EFL_UI_EVENT_SELECTED_CHANGED, _popup_item_paste_cb, obj);
+
+                       il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, 
sd->popup_list);
+                       efl_text_set(il, E_("Cancel"));
+                       efl_gfx_hint_align_set(il, 1.0, 1.0);
+                       efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                       efl_pack_end(sd->popup_list, il);
+                       efl_event_callback_add(il, 
EFL_UI_EVENT_SELECTED_CHANGED, _popup_item_cancel_cb, obj);
+                    }
                }
           }
         else
           {
              if (!sd->sel_mode)
                {
-                  if (efl_text_interactive_selection_allowed_get(obj) && 
!_elm_config->desktop_entry)
-                    {
-                       if (!efl_text_password_get(obj))
-                         elm_hoversel_item_add
-                           (sd->hoversel, E_("Select"), NULL, ELM_ICON_NONE,
-                           _hover_selected_cb, obj);
-                    }
                   if (ownersel)
                     {
                        if (efl_text_interactive_editable_get(obj))
-                         elm_hoversel_item_add
-                           (sd->hoversel, E_("Paste"), NULL, ELM_ICON_NONE,
-                           _hoversel_item_paste_cb, obj);
+                         {
+                            Eo *il = NULL;
+                            il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, 
sd->popup_list);
+                            efl_text_set(il, E_("Paste"));
+                            efl_gfx_hint_align_set(il, 1.0, 1.0);
+                            efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                            efl_pack_end(sd->popup_list, il);
+                            efl_event_callback_add(il, 
EFL_UI_EVENT_SELECTED_CHANGED, _popup_item_paste_cb, obj);
+                         }
                     }
                }
              else
-               elm_hoversel_item_add
-                  (sd->hoversel, E_("Cancel"), NULL, ELM_ICON_NONE,
-                   _hover_cancel_cb, obj);
-          }
-
-        if (sd->hoversel)
-          {
-             _hoversel_position(obj);
-             evas_object_show(sd->hoversel);
-             elm_hoversel_hover_begin(sd->hoversel);
+               {
+                  Eo *il = NULL;
+                  il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, sd->popup_list);
+                  efl_text_set(il, E_("Cancel"));
+                  efl_gfx_hint_align_set(il, 1.0, 1.0);
+                  efl_gfx_hint_weight_set(sd->popup_list, 1.0, 1.0);
+                  efl_pack_end(sd->popup_list, il);
+                  efl_event_callback_add(il, EFL_UI_EVENT_SELECTED_CHANGED, 
_popup_item_cancel_cb, obj);
+               }
           }
 
-        if (!_elm_config->desktop_entry)
+        if (sd->popup)
           {
-             edje_object_part_text_select_allow_set
-               (sd->entry_edje, "efl.text", EINA_FALSE);
-             edje_object_part_text_select_abort(sd->entry_edje, "efl.text");
+             _popup_position(obj);
           }
      }
 }
@@ -1672,7 +1635,7 @@ _efl_ui_textbox_efl_gfx_entity_position_set(Eo *obj, 
Efl_Ui_Textbox_Data *sd, Ei
    efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
    efl_gfx_entity_position_set(sd->hit_rect, pos);
 
-   if (sd->hoversel) _hoversel_position(obj);
+   if (sd->popup) _popup_position(obj);
 }
 
 EOLIAN static void
@@ -1973,7 +1936,7 @@ _efl_ui_textbox_efl_object_destructor(Eo *obj, 
Efl_Ui_Textbox_Data *sd)
 
    eina_stringshare_del(sd->file);
 
-   ecore_job_del(sd->hov_deljob);
+   _popup_dismiss(sd);
    if ((sd->api) && (sd->api->obj_unhook))
      sd->api->obj_unhook(obj);  // module - unhook
 

-- 


Reply via email to