summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Alzyod <ali198724@gmail.com>2020-01-14 16:29:50 +0000
committerMarcel Hollerbach <mail@marcel-hollerbach.de>2020-01-15 10:49:58 +0100
commit1a1868ce57a3c0e45735bb3afa5aa5243ef78018 (patch)
treecacd40f4ffca99b5f5dfd429af4d2724c7f0ee73
parent76631f502a8234c04ed8124bfdebe62ed5bdf954 (diff)
downloadefl-1a1868ce57a3c0e45735bb3afa5aa5243ef78018.tar.gz
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 <mail@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D11072
-rw-r--r--src/lib/elementary/efl_ui_textbox.c245
1 files 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