forked from enlightenment/efl
efl: make efl.model use of eina_value and eina_future instead of efl_future.
This commit is contained in:
parent
04c63cb489
commit
8f00bf5681
|
@ -20,15 +20,11 @@ EAPI extern Eina_Error EFL_MODEL_ERROR_INVALID_OBJECT; /**< @since 1.19 */
|
||||||
*/
|
*/
|
||||||
struct _Efl_Model_Children_Event
|
struct _Efl_Model_Children_Event
|
||||||
{
|
{
|
||||||
Eo *child; /**< child, for child_add */
|
|
||||||
/**
|
/**
|
||||||
* index is a hint and is intended
|
* index is a hint and is intended
|
||||||
* to provide a way for applications
|
* to provide a way for applications
|
||||||
* to control/know children relative
|
* to control/know children relative
|
||||||
* positions through listings.
|
* positions through listings.
|
||||||
*
|
|
||||||
* NOTE: If listing is performed asynchronously
|
|
||||||
* exact order may not be guaranteed.
|
|
||||||
*/
|
*/
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
};
|
};
|
||||||
|
@ -42,20 +38,6 @@ typedef struct _Efl_Model_Children_Event Efl_Model_Children_Event;
|
||||||
|
|
||||||
EAPI int efl_model_init(void);
|
EAPI int efl_model_init(void);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Slices a list
|
|
||||||
*
|
|
||||||
* If the @p start and @p count are 0, a new accessor of the entire list is returned
|
|
||||||
*
|
|
||||||
* @param list The list to get the slice
|
|
||||||
* @param start The nth element to start the slice
|
|
||||||
* @param count The number of elements
|
|
||||||
* @return The accessor to the sliced elements or @c NULL if error
|
|
||||||
*
|
|
||||||
* @since 1.17
|
|
||||||
*/
|
|
||||||
EAPI Eina_Accessor *efl_model_list_slice(Eina_List *list, unsigned start, unsigned count) EINA_ARG_NONNULL(1);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Notifies a property changed event with an @c EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
* @brief Notifies a property changed event with an @c EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
||||||
|
@ -65,7 +47,9 @@ EAPI Eina_Accessor *efl_model_list_slice(Eina_List *list, unsigned start, unsign
|
||||||
*
|
*
|
||||||
* @since 1.17
|
* @since 1.17
|
||||||
*/
|
*/
|
||||||
EAPI void efl_model_property_changed_notify(Efl_Model *model, const char *property);
|
EAPI void _efl_model_properties_changed_internal(const Efl_Model *model, ...);
|
||||||
|
|
||||||
|
#define efl_model_properties_changed(Model, ...) _efl_model_properties_changed_internal(Model, ##__VA_ARGS__, NULL)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Notifies a property invalidated event with an @c EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
* @brief Notifies a property invalidated event with an @c EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
||||||
|
@ -107,4 +91,34 @@ EAPI Eina_Value_Struct_Desc *efl_model_value_struct_description_new(unsigned int
|
||||||
*/
|
*/
|
||||||
EAPI void efl_model_value_struct_description_free(Eina_Value_Struct_Desc *desc);
|
EAPI void efl_model_value_struct_description_free(Eina_Value_Struct_Desc *desc);
|
||||||
|
|
||||||
|
|
||||||
|
static inline Eina_Value
|
||||||
|
efl_model_list_value_get(Eina_List *childrens,
|
||||||
|
unsigned int start,
|
||||||
|
unsigned int count)
|
||||||
|
{
|
||||||
|
Eina_Value v = EINA_VALUE_EMPTY;
|
||||||
|
Eina_List *l;
|
||||||
|
Eo *child;
|
||||||
|
|
||||||
|
eina_value_array_setup(&v, EINA_VALUE_TYPE_OBJECT, eina_list_count(childrens));
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(childrens, l, child)
|
||||||
|
{
|
||||||
|
if (start != 0)
|
||||||
|
{
|
||||||
|
start--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (count == 0)
|
||||||
|
continue;
|
||||||
|
count--;
|
||||||
|
|
||||||
|
eina_value_array_append(&v, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,10 +24,11 @@ interface Efl.Model ()
|
||||||
]]
|
]]
|
||||||
}
|
}
|
||||||
values {
|
values {
|
||||||
properties: const(array<string>); [[Array of current properties]]
|
properties: array<string>; [[Array of current properties]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
property_set {
|
@property property {
|
||||||
|
set {
|
||||||
[[Set a property value of a given property name.
|
[[Set a property value of a given property name.
|
||||||
|
|
||||||
The caller must ensure to call at least efl_model_prop_list
|
The caller must ensure to call at least efl_model_prop_list
|
||||||
|
@ -41,17 +42,13 @@ interface Efl.Model ()
|
||||||
possibilities, either raise an error or create the new
|
possibilities, either raise an error or create the new
|
||||||
property in model
|
property in model
|
||||||
|
|
||||||
See @.property_get, \@ref EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
See @.property.get, \@ref EFL_MODEL_EVENT_PROPERTIES_CHANGED
|
||||||
|
|
||||||
@since 1.14
|
@since 1.14
|
||||||
]]
|
]]
|
||||||
params {
|
return: ptr(Eina.Future); [[Return an error in case the property could not be set, the value that was set otherwise.]]
|
||||||
@in property: string; [[Property name]]
|
|
||||||
@in value: const(any_value_ptr); [[New value]]
|
|
||||||
}
|
}
|
||||||
return: future<any_value>; [[Future returning the recorded value or error]]
|
get {
|
||||||
}
|
|
||||||
property_get {
|
|
||||||
[[Retrieve the value of a given property name.
|
[[Retrieve the value of a given property name.
|
||||||
|
|
||||||
At this point the caller is free to get values from properties.
|
At this point the caller is free to get values from properties.
|
||||||
|
@ -62,10 +59,13 @@ interface Efl.Model ()
|
||||||
|
|
||||||
@since 1.14
|
@since 1.14
|
||||||
]]
|
]]
|
||||||
params {
|
|
||||||
@in property: string; [[Property name]]
|
|
||||||
}
|
}
|
||||||
return: future<any_value>; [[Future of the value that was got]]
|
keys {
|
||||||
|
property: string; [[Property name]]
|
||||||
|
}
|
||||||
|
values {
|
||||||
|
value: any_value_ptr; [[Property value]]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
children_slice_get {
|
children_slice_get {
|
||||||
[[Get children slice OR full range.
|
[[Get children slice OR full range.
|
||||||
|
@ -89,7 +89,7 @@ interface Efl.Model ()
|
||||||
Optionally the user can call children_count_get to know the
|
Optionally the user can call children_count_get to know the
|
||||||
number of children so a valid range can be known in advance.
|
number of children so a valid range can be known in advance.
|
||||||
|
|
||||||
See @.children_count_get
|
See @.children_count.get
|
||||||
|
|
||||||
@since 1.14
|
@since 1.14
|
||||||
]]
|
]]
|
||||||
|
@ -98,9 +98,10 @@ interface Efl.Model ()
|
||||||
@in count: uint; [[Range size. If count is 0, start is
|
@in count: uint; [[Range size. If count is 0, start is
|
||||||
ignored.]]
|
ignored.]]
|
||||||
}
|
}
|
||||||
return: future<accessor<Efl.Object> >; [[Future of the children]]
|
return: ptr(Eina.Future); [[Array of childrens]]
|
||||||
}
|
}
|
||||||
children_count_get {
|
@property children_count {
|
||||||
|
get {
|
||||||
[[Get children count.
|
[[Get children count.
|
||||||
|
|
||||||
When efl_model_load is completed efl_model_coildren_count_get
|
When efl_model_load is completed efl_model_coildren_count_get
|
||||||
|
@ -113,7 +114,10 @@ interface Efl.Model ()
|
||||||
|
|
||||||
@since 1.14
|
@since 1.14
|
||||||
]]
|
]]
|
||||||
return: future<uint>; [[Future of the children count]]
|
}
|
||||||
|
values {
|
||||||
|
count: uint; [[Current known children count]]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
child_add {
|
child_add {
|
||||||
[[Add a new child.
|
[[Add a new child.
|
||||||
|
@ -147,8 +151,8 @@ interface Efl.Model ()
|
||||||
properties,changed: Efl.Model_Property_Event; [[Event dispatched when
|
properties,changed: Efl.Model_Property_Event; [[Event dispatched when
|
||||||
properties list is
|
properties list is
|
||||||
available.]]
|
available.]]
|
||||||
child,added: Efl.Object; [[Event dispatched when new child is added.]]
|
child,added; [[Event dispatched when new child is added.]]
|
||||||
child,removed: Efl.Object; [[Event dispatched when child is removed.]]
|
child,removed; [[Event dispatched when child is removed.]]
|
||||||
children,count,changed; [[Event dispatched when children count is finished.]]
|
children,count,changed; [[Event dispatched when children count is finished.]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,56 +54,28 @@ efl_model_init(void)
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Eina_Accessor*
|
|
||||||
efl_model_list_slice(Eina_List *list, unsigned start, unsigned count)
|
|
||||||
{
|
|
||||||
if (!list) return NULL;
|
|
||||||
|
|
||||||
if ((start == 0) && (count == 0)) /* this is full data */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* children_accessor will be set to NULL by
|
|
||||||
* eina_list_accessor_new if the later fails.
|
|
||||||
*/
|
|
||||||
return eina_list_accessor_new(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
Eo *child;
|
|
||||||
Eina_List *l, *ln, *lr = NULL;
|
|
||||||
ln = eina_list_nth_list(list, (start));
|
|
||||||
if (!ln)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EINA_LIST_FOREACH(ln, l, child)
|
|
||||||
{
|
|
||||||
efl_ref(child);
|
|
||||||
lr = eina_list_append(lr, child);
|
|
||||||
if (eina_list_count(lr) == count)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lr) return NULL;
|
|
||||||
|
|
||||||
// This may leak the children Eina_List.
|
|
||||||
return eina_list_accessor_new(lr);
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
efl_model_property_changed_notify(Efl_Model *model, const char *property)
|
_efl_model_properties_changed_internal(const Efl_Model *model, ...)
|
||||||
{
|
{
|
||||||
Eina_Array *changed_properties = eina_array_new(1);
|
Efl_Model_Property_Event ev = { 0 };
|
||||||
EINA_SAFETY_ON_NULL_RETURN(changed_properties);
|
Eina_Array *properties = eina_array_new(1);
|
||||||
|
const char *property;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
Eina_Bool ret = eina_array_push(changed_properties, property);
|
va_start(args, model);
|
||||||
EINA_SAFETY_ON_FALSE_GOTO(ret, on_error);
|
|
||||||
|
|
||||||
Efl_Model_Property_Event evt = {.changed_properties = changed_properties};
|
while ((property = (const char*) va_arg(args, const char*)))
|
||||||
efl_event_callback_call(model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, &evt);
|
{
|
||||||
|
eina_array_push(properties, property);
|
||||||
|
}
|
||||||
|
|
||||||
on_error:
|
va_end(args);
|
||||||
eina_array_free(changed_properties);
|
|
||||||
|
ev.changed_properties = properties;
|
||||||
|
|
||||||
|
efl_event_callback_call((Efl_Model *) model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, &ev);
|
||||||
|
|
||||||
|
eina_array_free(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
Loading…
Reference in New Issue