summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaximilian Lika <maximilian@maxnotebook.localdomain>2021-12-14 08:53:15 +0000
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2021-12-14 08:53:15 +0000
commit7802e9284929471d930f24ae37e74998844873e3 (patch)
treef6fb2b1d432ecd809280a02bb41e72edf58e8a1f
parentf6c99bd806f1a10dd37bad95355e62cebc1a0f2d (diff)
downloadefl-7802e9284929471d930f24ae37e74998844873e3.tar.gz
Make passing data pointer to format_cb possible
Summary: Hello, For my perl binding it is important that one can pass a data pointer to all callbacks, especially to "Format_Cbs" as in elm_slider_units_format_function_set(), elm_slider_indicator_format_function_set() of elm_progressbar_unit_format_function_set(). Another "problematic" function would be elm_calendar_format_function_set(). Enclosed you find a approach to solve this problem. It would be wonderful, if the Efl-libraries could make data pointers also in format cbs possible... Thanks in advance, Max Reviewers: bowonryu, eagleeye, zmike, cedric, raster Reviewed By: raster Subscribers: raster, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12298
-rw-r--r--src/lib/elementary/efl_ui_progressbar.c50
-rw-r--r--src/lib/elementary/elm_progressbar_common.h1
-rw-r--r--src/lib/elementary/elm_progressbar_legacy.h17
-rw-r--r--src/lib/elementary/elm_slider.c71
-rw-r--r--src/lib/elementary/elm_slider_common.h1
-rw-r--r--src/lib/elementary/elm_slider_legacy.h27
6 files changed, 160 insertions, 7 deletions
diff --git a/src/lib/elementary/efl_ui_progressbar.c b/src/lib/elementary/efl_ui_progressbar.c
index bf0f14764a..9fb0bb9114 100644
--- a/src/lib/elementary/efl_ui_progressbar.c
+++ b/src/lib/elementary/efl_ui_progressbar.c
@@ -955,6 +955,56 @@ elm_progressbar_unit_format_function_set(Evas_Object *obj, progressbar_func_type
_format_legacy_to_format_eo_free_cb);
}
+typedef struct
+{
+ progressbar_func_full_type format_cb;
+ progressbar_freefunc_type format_free_cb;
+ void *format_func_data;
+} Pb_Full_Format_Wrapper_Data;
+
+static Eina_Bool
+_format_legacy_to_format_eo_cb_full(void *data, Eina_Strbuf *str, const Eina_Value value)
+{
+ Pb_Full_Format_Wrapper_Data *pfwd = data;
+ char *buf = NULL;
+ double val = 0;
+ const Eina_Value_Type *type = eina_value_type_get(&value);
+
+ if (type == EINA_VALUE_TYPE_DOUBLE)
+ eina_value_get(&value, &val);
+
+ if (pfwd->format_cb)
+ buf = pfwd->format_cb(val,pfwd->format_func_data);
+ if (buf)
+ eina_strbuf_append(str, buf);
+ if (pfwd->format_free_cb) pfwd->format_free_cb(buf);
+
+ return EINA_TRUE;
+}
+
+static void
+_format_legacy_to_format_eo_full_free_cb(void *data)
+{
+ Pb_Full_Format_Wrapper_Data *pfwd = data;
+ free(pfwd);
+}
+
+EAPI void
+elm_progressbar_unit_format_function_set_full(Evas_Object *obj, progressbar_func_full_type func, progressbar_freefunc_type free_func, void* data)
+{
+ EFL_UI_PROGRESSBAR_DATA_GET_OR_RETURN(obj, sd);
+ Pb_Full_Format_Wrapper_Data *pfwd = malloc(sizeof(Pb_Full_Format_Wrapper_Data));
+ if (!pfwd) return;
+
+ pfwd->format_cb = func;
+ pfwd->format_free_cb = free_func;
+ pfwd->format_func_data = data;
+ sd->is_legacy_format_cb = EINA_TRUE;
+
+ efl_ui_format_func_set(obj, pfwd, _format_legacy_to_format_eo_cb_full,
+ _format_legacy_to_format_eo_full_free_cb);
+}
+
EAPI void
elm_progressbar_span_size_set(Evas_Object *obj, Evas_Coord size)
{
diff --git a/src/lib/elementary/elm_progressbar_common.h b/src/lib/elementary/elm_progressbar_common.h
index 76f48a8a85..bc03570665 100644
--- a/src/lib/elementary/elm_progressbar_common.h
+++ b/src/lib/elementary/elm_progressbar_common.h
@@ -5,6 +5,7 @@
*/
typedef char *(*progressbar_func_type)(double);
+typedef char *(*progressbar_func_full_type)(double, void *);
typedef void (*progressbar_freefunc_type)(char *);
/**
diff --git a/src/lib/elementary/elm_progressbar_legacy.h b/src/lib/elementary/elm_progressbar_legacy.h
index a6b67991be..3f630f8745 100644
--- a/src/lib/elementary/elm_progressbar_legacy.h
+++ b/src/lib/elementary/elm_progressbar_legacy.h
@@ -189,6 +189,23 @@ EAPI const char *elm_progressbar_unit_format_get(const Evas_Object *obj);
EAPI void elm_progressbar_unit_format_function_set(Evas_Object *obj, progressbar_func_type func, progressbar_freefunc_type free_func);
/**
+ * @brief Set the format function pointer for the units label
+ *
+ * Set the callback function to format the unit string.
+ *
+ * See: @ref elm_progressbar_unit_format_set for more info on how this works.
+ *
+ * @param[in] func The unit format function
+ * @param[in] free_func The freeing function for the format string.
+ * @param[in] The data pointer to be passed to @p func
+ *
+ * @since 1.7
+ *
+ * @ingroup Elm_Progressbar
+ */
+EAPI void elm_progressbar_unit_format_function_set_full(Evas_Object *obj, progressbar_func_full_type func, progressbar_freefunc_type free_func, void *data);
+
+/**
* @brief Control whether a given progress bar widget is at "pulsing mode" or
* not.
*
diff --git a/src/lib/elementary/elm_slider.c b/src/lib/elementary/elm_slider.c
index e5bd17711b..2627731a66 100644
--- a/src/lib/elementary/elm_slider.c
+++ b/src/lib/elementary/elm_slider.c
@@ -1270,9 +1270,6 @@ _elm_slider_efl_ui_format_format_cb_set(Eo *obj, Elm_Slider_Data *sd, void *func
if (sd->format_cb_data && sd->format_free_cb)
sd->format_free_cb(sd->format_cb_data);
-// sd->format_cb = NULL;
-// sd->format_cb_data = NULL;
-// sd->format_free_cb = NULL;
if (efl_invalidated_get(obj)) return;
@@ -1574,10 +1571,10 @@ _format_legacy_to_format_eo_cb(void *data, Eina_Strbuf *str, const Eina_Value va
const Eina_Value_Type *type = eina_value_type_get(&value);
if (type == EINA_VALUE_TYPE_DOUBLE)
- {
- if (!eina_value_get(&value, &val)) return EINA_FALSE;
- }
-
+ {
+ if (!eina_value_get(&value, &val)) return EINA_FALSE;
+ }
+
if (sfwd->format_cb)
buf = sfwd->format_cb(val);
if (buf)
@@ -1605,6 +1602,52 @@ elm_slider_units_format_function_set(Evas_Object *obj, slider_func_type func, sl
efl_ui_format_func_set(obj, sfwd, _format_legacy_to_format_eo_cb, _format_legacy_to_format_eo_free_cb);
}
+typedef struct
+{
+ slider_func_full_type format_cb;
+ slider_freefunc_type format_free_cb;
+ void *format_func_data;
+} Slider_Full_Format_Wrapper_Data;
+
+static Eina_Bool
+_format_legacy_to_format_eo_cb_full(void *data, Eina_Strbuf *str, const Eina_Value value)
+{
+ Slider_Full_Format_Wrapper_Data *sfwd = data;
+ char *buf = NULL;
+ double val = 0;
+ const Eina_Value_Type *type = eina_value_type_get(&value);
+
+ if (type == EINA_VALUE_TYPE_DOUBLE)
+ eina_value_get(&value, &val);
+
+ if (sfwd->format_cb)
+ buf = sfwd->format_cb(val,sfwd->format_func_data);
+ if (buf)
+ eina_strbuf_append(str, buf);
+ if (sfwd->format_free_cb) sfwd->format_free_cb(buf);
+
+ return EINA_TRUE;
+}
+
+static void
+_format_legacy_to_format_eo_full_free_cb(void *data)
+{
+ Slider_Full_Format_Wrapper_Data *sfwd = data;
+ free(sfwd);
+}
+
+EAPI void
+elm_slider_units_format_function_set_full(Evas_Object *obj, slider_func_full_type func, slider_freefunc_type free_func, void *data)
+{
+ Slider_Full_Format_Wrapper_Data *sfwd = malloc(sizeof(Slider_Full_Format_Wrapper_Data));
+
+ sfwd->format_cb = func;
+ sfwd->format_free_cb = free_func;
+ sfwd->format_func_data = data;
+
+ efl_ui_format_func_set(obj, sfwd, _format_legacy_to_format_eo_cb_full, _format_legacy_to_format_eo_full_free_cb);
+}
+
EAPI void
elm_slider_range_enabled_set(Evas_Object *obj, Eina_Bool enable)
{
@@ -1721,6 +1764,20 @@ elm_slider_indicator_format_function_set(Evas_Object *obj, slider_func_type func
}
EAPI void
+elm_slider_indicator_format_function_set_full(Evas_Object *obj, slider_func_full_type func, slider_freefunc_type free_func, void *data)
+{
+ Slider_Full_Format_Wrapper_Data *sfwd = malloc(sizeof(Slider_Full_Format_Wrapper_Data));
+
+ sfwd->format_cb = func;
+ sfwd->format_free_cb = free_func;
+ sfwd->format_func_data = data;
+
+ efl_ui_format_func_set(efl_part(obj, "indicator"), sfwd,
+ _format_legacy_to_format_eo_cb_full,
+ _format_legacy_to_format_eo_full_free_cb);
+}
+
+EAPI void
elm_slider_indicator_show_on_focus_set(Evas_Object *obj, Eina_Bool flag)
{
elm_slider_part_indicator_visible_mode_set(efl_part(obj, "indicator"),
diff --git a/src/lib/elementary/elm_slider_common.h b/src/lib/elementary/elm_slider_common.h
index dc592202d9..ade333272e 100644
--- a/src/lib/elementary/elm_slider_common.h
+++ b/src/lib/elementary/elm_slider_common.h
@@ -5,6 +5,7 @@
*/
typedef char *(*slider_func_type)(double);
+typedef char *(*slider_func_full_type)(double, void *);
typedef void (*slider_freefunc_type)(char *);
/**
diff --git a/src/lib/elementary/elm_slider_legacy.h b/src/lib/elementary/elm_slider_legacy.h
index 60d29de304..4e1bcf35c1 100644
--- a/src/lib/elementary/elm_slider_legacy.h
+++ b/src/lib/elementary/elm_slider_legacy.h
@@ -162,6 +162,19 @@ EAPI const char *elm_slider_unit_format_get(const Evas_Object *obj);
EAPI void elm_slider_units_format_function_set(Evas_Object *obj, slider_func_type func, slider_freefunc_type free_func);
/**
+ * @brief Set the format function pointer for the units label
+ *
+ * Set the callback function to format the units string.
+ *
+ * @param[in] func The units format function.
+ * @param[in] free_func The freeing function for the format string.
+ * @param[in] The data pointer to be passed to @p func
+ *
+ * @ingroup Elm_Slider
+ */
+EAPI void elm_slider_units_format_function_set_full(Evas_Object *obj, slider_func_full_type func, slider_freefunc_type free_func, void *data);
+
+/**
* @brief Set the minimum and maximum values for the slider.
*
* Define the allowed range of values to be selected by the user.
@@ -286,6 +299,20 @@ EAPI void elm_slider_range_get(const Evas_Object *obj, double *from, double *to)
EAPI void elm_slider_indicator_format_function_set(Evas_Object *obj, slider_func_type func, slider_freefunc_type free_func);
/**
+ * @brief Set the format function pointer for the indicator label
+ *
+ * Set the callback function to format the indicator string.
+ *
+ * @param[in] obj The object.
+ * @param[in] func The indicator format function.
+ * @param[in] free_func The freeing function for the format string.
+ * @param[in] The data pointer to be passed to @p func
+ *
+ * @ingroup Elm_Slider
+ */
+EAPI void elm_slider_indicator_format_function_set_full(Evas_Object *obj, slider_func_full_type func, slider_freefunc_type free_func, void *data);
+
+/**
* @brief Show the indicator of slider on focus.
*
* @param[in] obj The object.