efl/src/lib/elementary/efl_ui_layout_factory.c

172 lines
5.0 KiB
C

#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#define EFL_UI_FACTORY_PROTECTED
#include <Elementary.h>
#include "elm_priv.h"
#define MY_CLASS EFL_UI_LAYOUT_FACTORY_CLASS
#define MY_CLASS_NAME "Efl.Ui.Layout_Factory"
typedef struct _Efl_Ui_Layout_Factory_Data
{
struct {
Eina_Hash *properties;
Eina_Hash *factories;
} bind;
Eina_Stringshare *klass;
Eina_Stringshare *group;
Eina_Stringshare *style;
} Efl_Ui_Layout_Factory_Data;
Eina_Bool
_property_bind(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata)
{
Eo *layout = fdata;
Eina_Stringshare *ss_key = key;
Eina_Stringshare *property = data;
efl_ui_property_bind(layout, ss_key, property);
return EINA_TRUE;
}
Eina_Bool
_factory_bind(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata)
{
Eo *layout = fdata;
Eina_Stringshare *ss_key = key;
Efl_Ui_Factory *factory = data;
efl_ui_factory_bind(layout, ss_key, factory);
return EINA_TRUE;
}
EOLIAN static Eo *
_efl_ui_layout_factory_efl_object_constructor(Eo *obj, Efl_Ui_Layout_Factory_Data *pd)
{
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_ui_widget_factory_item_class_set(obj, EFL_UI_LAYOUT_CLASS);
pd->bind.properties = eina_hash_stringshared_new(EINA_FREE_CB(eina_stringshare_del));
pd->bind.factories = eina_hash_stringshared_new(EINA_FREE_CB(efl_unref));
return obj;
}
EOLIAN static void
_efl_ui_layout_factory_efl_object_destructor(Eo *obj, Efl_Ui_Layout_Factory_Data *pd)
{
eina_stringshare_del(pd->klass);
eina_stringshare_del(pd->group);
eina_stringshare_del(pd->style);
eina_hash_free(pd->bind.properties);
eina_hash_free( pd->bind.factories);
efl_destructor(efl_super(obj, MY_CLASS));
}
static Eina_Value
_efl_ui_layout_factory_bind(Eo *obj EINA_UNUSED, void *data, const Eina_Value value)
{
Efl_Ui_Layout_Factory_Data *pd = data;
Efl_Gfx_Entity *layout;
int len, i;
EINA_VALUE_ARRAY_FOREACH(&value, len, i, layout)
{
eina_hash_foreach(pd->bind.properties, _property_bind, layout);
eina_hash_foreach(pd->bind.factories, _factory_bind, layout);
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
}
return value;
}
static void
_efl_ui_layout_factory_efl_ui_factory_building(const Eo *obj, Efl_Ui_Layout_Factory_Data *pd, Efl_Gfx_Entity *ui_view)
{
if (pd->klass || pd->group || pd->style)
efl_ui_layout_theme_set(ui_view, pd->klass, pd->group, pd->style);
efl_ui_factory_building(efl_super(obj, EFL_UI_LAYOUT_FACTORY_CLASS), ui_view);
}
EOLIAN static Eina_Future *
_efl_ui_layout_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Layout_Factory_Data *pd,
Eina_Iterator *models, Efl_Gfx_Entity *parent)
{
Eina_Future *f;
f = efl_ui_factory_create(efl_super(obj, EFL_UI_LAYOUT_FACTORY_CLASS), models, parent);
return efl_future_then(obj, f,
.success_type = EINA_VALUE_TYPE_ARRAY,
.success = _efl_ui_layout_factory_bind,
.data = pd);
}
EOLIAN static void
_efl_ui_layout_factory_efl_ui_factory_bind_factory_bind(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Factory_Data *pd,
const char *key, Efl_Ui_Factory *factory)
{
Eina_Stringshare *ss_key;
Efl_Ui_Factory *f_old;
ss_key = eina_stringshare_add(key);
if (factory == NULL)
{
eina_hash_del(pd->bind.factories, ss_key, NULL);
return;
}
f_old = eina_hash_set(pd->bind.factories, ss_key, efl_ref(factory));
if (f_old)
{
efl_unref(f_old);
eina_stringshare_del(ss_key);
}
}
EOLIAN static Eina_Error
_efl_ui_layout_factory_efl_ui_property_bind_property_bind(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Factory_Data *pd,
const char *key, const char *property)
{
Eina_Stringshare *ss_key, *ss_prop;
Eina_Stringshare *ss_old = NULL;
ss_key = eina_stringshare_add(key);
if (property == NULL)
{
eina_hash_del(pd->bind.properties, ss_key, NULL);
goto end;
}
ss_prop = eina_stringshare_add(property);
ss_old = eina_hash_set(pd->bind.properties, ss_key, ss_prop);
if (ss_old) eina_stringshare_del(ss_old);
end:
efl_event_callback_call(obj, EFL_UI_PROPERTY_BIND_EVENT_PROPERTY_BOUND, (void*) ss_key);
// Only delete our key ref it it was already present in the property hash
if (ss_old) eina_stringshare_del(ss_key);
return 0;
}
EOLIAN static void
_efl_ui_layout_factory_theme_config(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Factory_Data *pd,
const char *klass, const char *group, const char *style)
{
eina_stringshare_replace(&pd->klass, klass);
eina_stringshare_replace(&pd->group, group);
eina_stringshare_replace(&pd->style, style);
}
#include "efl_ui_layout_factory.eo.c"