summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@free.fr>2019-08-07 17:21:24 -0700
committerCedric BAIL <cedric.bail@free.fr>2019-08-12 10:13:33 -0700
commit74aff95fcad93dc41e0ce8464602117856b82efd (patch)
tree256867694fbb61feb8abf15be1b42acaa892415b
parent9952b9bf182d2b27de05b82476649a1ed8c1785d (diff)
downloadefl-74aff95fcad93dc41e0ce8464602117856b82efd.tar.gz
elementary: add support for widget part property bind.
Reviewed-by: Felipe Magno de Almeida <felipe@expertisesolutions.com.br> Differential Revision: https://phab.enlightenment.org/D9527
-rw-r--r--src/lib/elementary/efl_ui_property_bind_part.eo11
-rw-r--r--src/lib/elementary/efl_ui_widget_factory.c112
-rw-r--r--src/lib/elementary/efl_ui_widget_factory.eo3
-rw-r--r--src/lib/elementary/meson.build1
4 files changed, 124 insertions, 3 deletions
diff --git a/src/lib/elementary/efl_ui_property_bind_part.eo b/src/lib/elementary/efl_ui_property_bind_part.eo
new file mode 100644
index 0000000000..c8438d90f9
--- /dev/null
+++ b/src/lib/elementary/efl_ui_property_bind_part.eo
@@ -0,0 +1,11 @@
+class @beta Efl.Ui.Property_Bind_Part extends Efl.Object implements Efl.Ui.Property_Bind
+{
+ [[Every part returned by an @Efl.Ui.Widget_Factory will enable the @Efl.Ui.Factory to
+ remember what part to call @Efl.Ui.Property_Bind.property_bind on when an item is created
+ enabling to propagate binding model property to item object property.
+ ]]
+ implements {
+ Efl.Ui.Property_Bind.property_bind;
+ Efl.Object.destructor;
+ }
+}
diff --git a/src/lib/elementary/efl_ui_widget_factory.c b/src/lib/elementary/efl_ui_widget_factory.c
index a04bdcbb23..da83117007 100644
--- a/src/lib/elementary/efl_ui_widget_factory.c
+++ b/src/lib/elementary/efl_ui_widget_factory.c
@@ -3,17 +3,36 @@
#endif
#define EFL_UI_WIDGET_PROTECTED
+#define EFL_PART_PROTECTED
-#include <Elementary.h>
+#include <Efl_Ui.h>
#include "elm_priv.h"
+#include "efl_ui_property_bind_part.eo.h"
typedef struct _Efl_Ui_Widget_Factory_Data Efl_Ui_Widget_Factory_Data;
typedef struct _Efl_Ui_Widget_Factory_Request Efl_Ui_Widget_Factory_Request;
+typedef struct _Efl_Ui_Bind_Part_Data Efl_Ui_Bind_Part_Data;
+typedef struct _Efl_Ui_Property_Bind_Data Efl_Ui_Property_Bind_Data;
+
+struct _Efl_Ui_Property_Bind_Data
+{
+ Eina_Stringshare *part_property;
+ Eina_Stringshare *model_property;
+};
+
+struct _Efl_Ui_Bind_Part_Data
+{
+ Eina_Stringshare *part;
+
+ Eina_List *properties;
+};
struct _Efl_Ui_Widget_Factory_Data
{
const Efl_Class *klass;
+ Eina_Hash *parts;
+
Eina_Stringshare *style;
};
@@ -62,6 +81,26 @@ _efl_ui_widget_factory_create_then(Eo *obj EINA_UNUSED, void *data, const Eina_V
efl_ui_widget_style_set(efl_added, string),
efl_ui_view_model_set(efl_added, r->model));
+ if (r->pd->parts)
+ {
+ Efl_Ui_Bind_Part_Data *bpd;
+ Eina_Iterator *it;
+
+ it = eina_hash_iterator_data_new(r->pd->parts);
+
+ EINA_ITERATOR_FOREACH(it, bpd)
+ {
+ Efl_Ui_Property_Bind_Data *bppd;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(bpd->properties, l, bppd)
+ efl_ui_property_bind(efl_part(w, bpd->part),
+ bppd->part_property,
+ bppd->model_property);
+ }
+ eina_iterator_free(it);
+ }
+
return eina_value_object_init(w);
}
@@ -128,7 +167,76 @@ _efl_ui_widget_factory_efl_ui_property_bind_property_bind(Eo *obj, Efl_Ui_Widget
return 0;
}
- return efl_ui_property_bind(efl_super(obj, EFL_UI_WIDGET_FACTORY_CLASS), target, property);
+ return EINVAL;
+}
+
+
+typedef struct _Efl_Ui_Property_Bind_Part_Data Efl_Ui_Property_Bind_Part_Data;
+struct _Efl_Ui_Property_Bind_Part_Data
+{
+ Efl_Ui_Widget_Factory_Data *pd;
+ Eina_Stringshare *name;
+};
+
+static Efl_Object *
+_efl_ui_widget_factory_efl_part_part_get(const Eo *obj,
+ Efl_Ui_Widget_Factory_Data *pd,
+ const char *name)
+{
+ Efl_Ui_Property_Bind_Part_Data *ppd;
+ Efl_Object *part;
+
+ part = efl_add(EFL_UI_PROPERTY_BIND_PART_CLASS, (Eo*) obj);
+ if (!part) return NULL;
+
+ ppd = efl_data_scope_get(obj, EFL_UI_PROPERTY_BIND_PART_CLASS);
+ ppd->name = eina_stringshare_add(name);
+ ppd->pd = pd;
+
+ return part;
+}
+
+static void
+_efl_ui_property_bind_part_efl_object_destructor(Eo *obj, Efl_Ui_Property_Bind_Part_Data *pd)
+{
+ eina_stringshare_replace(&pd->name, NULL);
+
+ efl_destructor(efl_super(obj, EFL_UI_PROPERTY_BIND_PART_CLASS));
+}
+
+static Eina_Error
+_efl_ui_property_bind_part_efl_ui_property_bind_property_bind(Eo *obj EINA_UNUSED,
+ Efl_Ui_Property_Bind_Part_Data *pd,
+ const char *key,
+ const char *property)
+{
+ Efl_Ui_Bind_Part_Data *bpd;
+ Efl_Ui_Property_Bind_Data *bppd;
+
+ if (!pd->pd->parts)
+ pd->pd->parts = eina_hash_stringshared_new(NULL);
+
+ bpd = eina_hash_find(pd->pd->parts, pd->name);
+ if (!bpd)
+ {
+ bpd = calloc(1, sizeof (Efl_Ui_Bind_Part_Data));
+ if (!bpd) return ENOMEM;
+
+ bpd->part = eina_stringshare_ref(pd->name);
+
+ eina_hash_direct_add(pd->pd->parts, bpd->part, bpd);
+ }
+
+ bppd = calloc(1, sizeof (Efl_Ui_Property_Bind_Data));
+ if (bppd) return ENOMEM;
+
+ bppd->part_property = eina_stringshare_add(key);
+ bppd->model_property = eina_stringshare_add(property);
+
+ bpd->properties = eina_list_append(bpd->properties, bppd);
+
+ return 0;
}
+#include "efl_ui_property_bind_part.eo.c"
#include "efl_ui_widget_factory.eo.c"
diff --git a/src/lib/elementary/efl_ui_widget_factory.eo b/src/lib/elementary/efl_ui_widget_factory.eo
index fe1db277c4..d439c5bd96 100644
--- a/src/lib/elementary/efl_ui_widget_factory.eo
+++ b/src/lib/elementary/efl_ui_widget_factory.eo
@@ -1,4 +1,4 @@
-class @beta Efl.Ui.Widget_Factory extends Efl.Loop_Consumer implements Efl.Ui.Factory
+class @beta Efl.Ui.Widget_Factory extends Efl.Loop_Consumer implements Efl.Ui.Factory, Efl.Part
{
[[Efl Ui Factory that provides @Efl.Ui.Widget.
@@ -21,6 +21,7 @@ class @beta Efl.Ui.Widget_Factory extends Efl.Loop_Consumer implements Efl.Ui.Fa
Efl.Ui.Factory.create;
Efl.Ui.Factory.release;
Efl.Ui.Property_Bind.property_bind;
+ Efl.Part.part_get;
}
constructors {
.item_class @optional;
diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build
index 06cad2bff3..4ab0c20333 100644
--- a/src/lib/elementary/meson.build
+++ b/src/lib/elementary/meson.build
@@ -175,6 +175,7 @@ pub_eo_files = [
'efl_ui_text_part.eo',
'efl_ui_caching_factory.eo',
'efl_ui_widget_factory.eo',
+ 'efl_ui_property_bind_part.eo',
'efl_ui_relative_layout.eo',
'efl_ui_action_connector.eo',
'efl_ui_format.eo',