elementary: add model connect in efl_ui_image

This commit is contained in:
Larry Jr 2016-07-01 21:13:09 -03:00 committed by Vitor Sousa
parent 132f8f1f37
commit 7cff7432cc
3 changed files with 117 additions and 1 deletions

View File

@ -39,6 +39,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params);
static Eina_Bool _efl_ui_image_smart_internal_file_set(Eo *obj, Efl_Ui_Image_Data *sd, const char *file, const Eina_File *f, const char *key);
static void _efl_ui_image_sizing_eval(Eo *obj);
static void _efl_ui_image_model_properties_changed_cb(void *data, const Eo_Event *event);
static const Elm_Action key_actions[] = {
{"activate", _key_action_activate},
@ -632,6 +633,14 @@ _efl_ui_image_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Image_Data *sd)
sd->async.th = NULL;
}
if (sd->model)
{
eo_event_callback_del(sd->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED,
_efl_ui_image_model_properties_changed_cb, obj);
eo_unref(sd->model);
sd->model = NULL;
}
_async_open_data_free(sd->async.done);
_async_open_data_free(sd->async.todo);
eina_stringshare_del(sd->async.file);
@ -1693,6 +1702,107 @@ _efl_ui_image_icon_get(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd)
return sd->stdicon;
}
static void
_prop_promise_error_cb(void* data EINA_UNUSED, Eina_Error err EINA_UNUSED)
{
}
static void
_prop_promise_then_cb(void* data, void* v)
{
Eo *obj = data;
Eina_Value *value = v;
char *text;
const Eina_Value_Type *vtype = eina_value_type_get(value);
if (vtype == EINA_VALUE_TYPE_STRING || vtype == EINA_VALUE_TYPE_STRINGSHARE)
{
eina_value_get(value, &text);
elm_image_file_set(obj, text, NULL);
}
else
{
text = eina_value_to_string(value);
elm_image_file_set(obj, text, NULL);
free(text);
}
}
static void
_efl_ui_image_model_properties_changed_cb(void *data, const Eo_Event *event)
{
Efl_Model_Property_Event *evt = event->info;
Eina_Array_Iterator it;
const char *prop;
unsigned int i;
EFL_UI_IMAGE_DATA_GET(data, pd);
if (!evt->changed_properties)
return;
if (pd->model && pd->prop_con)
{
EINA_ARRAY_ITER_NEXT(evt->changed_properties, i, prop, it)
{
if (!strcmp(pd->prop_con, prop))
{
Eina_Promise *promise = efl_model_property_get(pd->model, pd->prop_con);
eina_promise_then(promise, &_prop_promise_then_cb, &_prop_promise_error_cb, data);
return;
}
}
}
}
EOLIAN static void
_efl_ui_image_efl_ui_view_model_set(Eo *obj, Efl_Ui_Image_Data *pd, Efl_Model *model)
{
if (pd->model)
{
eo_event_callback_del(pd->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED,
_efl_ui_image_model_properties_changed_cb, obj);
eo_unref(pd->model);
pd->model = NULL;
}
if (model)
{
pd->model = model;
eo_ref(pd->model);
eo_event_callback_add(pd->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED,
_efl_ui_image_model_properties_changed_cb, obj);
}
if (pd->prop_con && pd->model)
{
Eina_Promise *promise = efl_model_property_get(pd->model, pd->prop_con);
eina_promise_then(promise, &_prop_promise_then_cb,
&_prop_promise_error_cb, obj);
}
}
EOLIAN static Efl_Model *
_efl_ui_image_efl_ui_view_model_get(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *pd)
{
return pd->model;
}
EOLIAN static void
_efl_ui_image_efl_ui_model_connect_connect(Eo *obj, Efl_Ui_Image_Data *pd, const char *name EINA_UNUSED, const char *property)
{
eina_stringshare_replace(&pd->prop_con, property);
if (pd->model && pd->prop_con)
{
Eina_Promise *promise = efl_model_property_get(pd->model, pd->prop_con);
eina_promise_then(promise, &_prop_promise_then_cb,
&_prop_promise_error_cb, obj);
}
}
EAPI void
elm_image_smooth_set(Evas_Object *obj, Eina_Bool smooth)
{

View File

@ -45,7 +45,8 @@ struct Efl.Ui.Image.Error
class Efl.Ui.Image (Elm.Widget, Efl.Ui.Clickable, Efl.Ui.Draggable,
Efl.File, Efl.Image, Efl.Image.Load, Efl.Player, Efl.Gfx.View,
Elm.Interface.Atspi_Image, Elm.Interface.Atspi_Widget_Action,
Edje.Object, Efl.Orientation, Efl.Flipable)
Edje.Object, Efl.Orientation, Efl.Flipable,
Efl.Ui.View, Efl.Ui.Model.Connect)
{
event_prefix: efl_ui_image;
methods {
@ -165,6 +166,9 @@ class Efl.Ui.Image (Elm.Widget, Efl.Ui.Clickable, Efl.Ui.Draggable,
Efl.Canvas.Group.group_resize;
Efl.Ui.Draggable.drag_target.set;
Efl.Ui.Draggable.drag_target.get;
Efl.Ui.Model.Connect.connect;
Efl.Ui.View.model.set;
Efl.Ui.View.model.get;
Elm.Widget.theme_apply;
Elm.Widget.event;
Elm.Interface.Atspi_Image.extents.get;

View File

@ -78,6 +78,8 @@ struct _Efl_Ui_Image_Data
const char *stdicon;
Efl_Model *model;
Eina_Stringshare *prop_con;
struct {
int requested_size;