forked from enlightenment/efl
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary: Issue 1: If you drop text to elm_entry, text is inserted twice. Reason: Drop callbacks are registered multiple times in elm_entry. Resolve: Register only one drop callback at entry side. Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries). Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode. Resolve: Correct registering and removing drop callbacks in entry. Reviewers: JackDanielZ, raster Reviewed By: raster CC: woohyun Differential Revision: https://phab.enlightenment.org/D565
This commit is contained in:
parent
8a312631e6
commit
771887df2b
|
@ -508,6 +508,39 @@ _elm_entry_theme_group_get(Evas_Object *obj)
|
|||
}
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_drag_drop_cb(void *data EINA_UNUSED,
|
||||
Evas_Object *obj,
|
||||
Elm_Selection_Data *drop)
|
||||
{
|
||||
Eina_Bool rv;
|
||||
|
||||
ELM_ENTRY_DATA_GET(obj, sd);
|
||||
|
||||
edje_object_part_text_cursor_copy
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, /*->*/ EDJE_CURSOR_USER);
|
||||
rv = edje_object_part_text_cursor_coord_set
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, drop->x, drop->y);
|
||||
|
||||
if (!rv) WRN("Warning: Failed to position cursor: paste anyway");
|
||||
|
||||
elm_entry_entry_insert(obj, drop->data);
|
||||
edje_object_part_text_cursor_copy
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER, /*->*/ EDJE_CURSOR_MAIN);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static Elm_Sel_Format
|
||||
_get_drop_format(Evas_Object *obj)
|
||||
{
|
||||
ELM_ENTRY_DATA_GET(obj, sd);
|
||||
|
||||
if ((sd->editable) && (!sd->single_line) && (!sd->password) && (!sd->disabled))
|
||||
return ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
|
||||
return ELM_SEL_FORMAT_MARKUP;
|
||||
}
|
||||
|
||||
/* we can't reuse layout's here, because it's on entry_edje only */
|
||||
static void
|
||||
_elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
|
||||
|
@ -516,6 +549,11 @@ _elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
|
|||
if (ret) *ret = EINA_FALSE;
|
||||
Elm_Entry_Smart_Data *sd = _pd;
|
||||
|
||||
elm_drop_target_del(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
if (elm_object_disabled_get(obj))
|
||||
{
|
||||
edje_object_signal_emit(sd->entry_edje, "elm,state,disabled", "elm");
|
||||
|
@ -535,6 +573,12 @@ _elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
|
|||
eo_do(obj, elm_scrollable_interface_freeze_set(EINA_FALSE));
|
||||
}
|
||||
sd->disabled = EINA_FALSE;
|
||||
sd->drop_format = _get_drop_format(obj);
|
||||
elm_drop_target_add(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
}
|
||||
|
||||
if (ret) *ret = EINA_TRUE;
|
||||
|
@ -2333,29 +2377,6 @@ _event_selection_clear(void *data EINA_UNUSED,
|
|||
}
|
||||
#endif
|
||||
|
||||
static Eina_Bool
|
||||
_drag_drop_cb(void *data EINA_UNUSED,
|
||||
Evas_Object *obj,
|
||||
Elm_Selection_Data *drop)
|
||||
{
|
||||
Eina_Bool rv;
|
||||
|
||||
ELM_ENTRY_DATA_GET(obj, sd);
|
||||
|
||||
edje_object_part_text_cursor_copy
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, /*->*/ EDJE_CURSOR_USER);
|
||||
rv = edje_object_part_text_cursor_coord_set
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, drop->x, drop->y);
|
||||
|
||||
if (!rv) WRN("Warning: Failed to position cursor: paste anyway");
|
||||
|
||||
elm_entry_entry_insert(obj, drop->data);
|
||||
edje_object_part_text_cursor_copy
|
||||
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER, /*->*/ EDJE_CURSOR_MAIN);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static Evas_Object *
|
||||
_item_get(void *data,
|
||||
Evas_Object *edje EINA_UNUSED,
|
||||
|
@ -3185,6 +3206,13 @@ _elm_entry_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
|
|||
priv->auto_save = EINA_TRUE;
|
||||
priv->editable = EINA_TRUE;
|
||||
|
||||
priv->drop_format = ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
|
||||
elm_drop_target_add(obj, priv->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
|
||||
if (!elm_layout_theme_set(obj, "entry", "base", elm_widget_style_get(obj)))
|
||||
CRI("Failed to set layout!");
|
||||
|
||||
|
@ -3309,10 +3337,6 @@ _elm_entry_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
|
|||
}
|
||||
#endif
|
||||
|
||||
elm_drop_target_add
|
||||
(obj, ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, _drag_drop_cb, NULL);
|
||||
|
||||
entries = eina_list_prepend(entries, obj);
|
||||
|
||||
// module - find module for entry
|
||||
|
@ -3629,20 +3653,21 @@ _password_set(Eo *obj, void *_pd, va_list *list)
|
|||
if (sd->password == password) return;
|
||||
sd->password = password;
|
||||
|
||||
elm_drop_target_del(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
if (password)
|
||||
{
|
||||
sd->single_line = EINA_TRUE;
|
||||
sd->line_wrap = ELM_WRAP_NONE;
|
||||
elm_drop_target_del(obj, ELM_SEL_FORMAT_MARKUP,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
_entry_selection_callbacks_unregister(obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP,
|
||||
sd->drop_format = _get_drop_format(obj);
|
||||
elm_drop_target_add(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
|
@ -3935,18 +3960,20 @@ _editable_set(Eo *obj, void *_pd, va_list *list)
|
|||
sd->editable = editable;
|
||||
eo_do(obj, elm_wdg_theme_apply(NULL));
|
||||
|
||||
elm_drop_target_del(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
if (editable)
|
||||
elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
else
|
||||
elm_drop_target_del(obj, ELM_SEL_FORMAT_MARKUP,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
{
|
||||
sd->drop_format = _get_drop_format(obj);
|
||||
elm_drop_target_add(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
EAPI Eina_Bool
|
||||
|
@ -5017,7 +5044,13 @@ _cnp_mode_set(Eo *obj, void *_pd, va_list *list)
|
|||
else if (cnp_mode == ELM_CNP_MODE_MARKUP)
|
||||
format |= ELM_SEL_FORMAT_IMAGE;
|
||||
|
||||
elm_drop_target_add(obj, format,
|
||||
elm_drop_target_del(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
_drag_drop_cb, NULL);
|
||||
sd->drop_format = format;
|
||||
elm_drop_target_add(obj, sd->drop_format,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
|
|
|
@ -72,6 +72,7 @@ struct _Elm_Entry_Smart_Data
|
|||
} anchor_hover;
|
||||
|
||||
Elm_Cnp_Mode cnp_mode;
|
||||
Elm_Sel_Format drop_format;
|
||||
|
||||
Eina_Bool input_panel_return_key_disabled : 1;
|
||||
Eina_Bool drag_selection_asked : 1;
|
||||
|
|
Loading…
Reference in New Issue