This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository echart.
View the commit online.
commit 4d849726b1edf516d5e97a2f51e97bae9b190404
Author: Vincent Torri <[email protected]>
AuthorDate: Thu May 14 21:31:46 2026 +0200
add vbar
---
src/bin/echart_main.c | 14 ++
src/lib/Echart.h | 1 +
src/lib/echart_line.c | 2 +-
src/lib/echart_vbar.c | 402 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib/echart_vbar.h | 25 ++++
src/lib/meson.build | 4 +-
6 files changed, 446 insertions(+), 2 deletions(-)
diff --git a/src/bin/echart_main.c b/src/bin/echart_main.c
index f42b471..84084c5 100644
--- a/src/bin/echart_main.c
+++ b/src/bin/echart_main.c
@@ -75,6 +75,7 @@ elm_main(int argc, char **argv)
/* echart_title_color_set(o, 255, 0, 0, 255); */
/* evas_object_show(o);*/
+#if 0
/* line */
o = line = echart_line_add(evas_object_evas_get(win));
evas_object_move(o, 0, 0);
@@ -101,6 +102,19 @@ elm_main(int argc, char **argv)
echart_grid_color_set(o, 0, 0, 255, 255);
echart_grid_width_set(o, 3);
evas_object_show(o);
+#else
+ o = echart_vbar_add(evas_object_evas_get(win));
+ evas_object_move(o, 0, 0);
+ evas_object_resize(o, w * elm_config_scale_get(), h * elm_config_scale_get());
+ int nd = 3;
+ double v[3] = { 3, 6, 4 };
+ echart_vbar_data_append(o, v, nd);
+ v[0] = 6;
+ v[1] = 4;
+ v[2] = 3;
+ echart_vbar_data_append(o, v, nd);
+ evas_object_show(o);
+#endif
evas_object_resize(win,
w * elm_config_scale_get(),
diff --git a/src/lib/Echart.h b/src/lib/Echart.h
index f54301b..f0458c3 100644
--- a/src/lib/Echart.h
+++ b/src/lib/Echart.h
@@ -46,6 +46,7 @@
#include "echart_grid.h"
#include "echart_grid_ord.h"
#include "echart_line.h"
+#include "echart_vbar.h"
#include "echart_chart.h"
#endif
diff --git a/src/lib/echart_line.c b/src/lib/echart_line.c
index 4712d5e..ee35b27 100644
--- a/src/lib/echart_line.c
+++ b/src/lib/echart_line.c
@@ -203,7 +203,7 @@ _line_smart_init(void)
evas_object_smart_clipped_smart_set(&_parent_sc);
sc = _parent_sc;
- sc.name = "grid";
+ sc.name = "line";
sc.version = EVAS_SMART_CLASS_VERSION;
sc.add = _line_smart_add;
sc.del = _line_smart_del;
diff --git a/src/lib/echart_vbar.c b/src/lib/echart_vbar.c
new file mode 100644
index 0000000..9cf37a3
--- /dev/null
+++ b/src/lib/echart_vbar.c
@@ -0,0 +1,402 @@
+/*
+ * SPDX-FileCopyrightText: Vincent Torri <[email protected]>
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <config.h>
+
+#include "Echart.h"
+#include "echart_color.h"
+#include "echart_private.h"
+
+/*============================================================================*
+ * Local *
+ *============================================================================*/
+
+#define X_VG(x) (w) * ((x) - xmin) / (xmax - xmin)
+#define Y_VG(y) (h) * (sd->ymax - (y)) / (sd->ymax - sd->ymin)
+
+typedef struct Data Data;
+typedef struct Chart_Vbar Chart_Vbar;
+
+struct Data
+{
+ Evas_Vg_Shape *bars;
+ double *values;
+ unsigned char r, g, b;
+};
+
+struct Chart_Vbar
+{
+ Evas_Object_Smart_Clipped_Data __clipped_data;
+
+ Evas_Object *o_bg;
+ Evas_Object *o_vg;
+
+ /* evas_vg */
+ Evas_Vg_Container *container;
+
+ /* data */
+ Data *data;
+ int nbr_series;
+ int nbr_values;
+ double group_width; /* % between 0 and 100 */
+ double ymin;
+ double ymax;
+};
+
+static Evas_Smart *_vbar_smart = NULL;
+static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL;
+
+/* Evas_Object smart callbacks */
+
+static void
+_vbar_smart_add(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = calloc(1, sizeof(Chart_Vbar));
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ sd->o_bg = evas_object_rectangle_add(evas_object_evas_get(obj));
+ evas_object_move(sd->o_bg, 0, 0);
+ sd->o_vg = evas_object_vg_add(evas_object_evas_get(obj));
+
+ /* evas_vg */
+ sd->container = evas_vg_container_add(sd->o_vg);
+ evas_object_vg_root_node_set(sd->o_vg, sd->container);
+
+ /* data */
+ sd->group_width = 61.8;
+
+ evas_object_smart_data_set(obj, sd);
+
+ _parent_sc.add(obj);
+}
+
+static void
+_vbar_smart_del(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ _parent_sc.del(obj);
+
+ free(sd->data);
+ evas_object_del(sd->o_bg);
+ evas_object_del(sd->o_vg);
+
+ evas_object_smart_data_set(obj, NULL);
+ memset(sd, 0, sizeof(*sd));
+ free(sd);
+}
+
+static void
+_vbar_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+ Chart_Vbar *sd;
+ Evas_Coord ox;
+ Evas_Coord oy;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
+ if ((x == ox) && (y == oy))
+ return;
+
+ evas_object_move(sd->o_bg, x, y);
+ evas_object_move(sd->o_vg, x, y);
+
+ evas_object_smart_changed(obj);
+}
+
+static void
+_vbar_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+ Chart_Vbar *sd;
+ Evas_Coord ow;
+ Evas_Coord oh;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
+ if ((w == ow) && (h == oh))
+ return;
+
+ evas_object_resize(sd->o_bg, w, h);
+ evas_object_resize(sd->o_vg, w, h);
+
+ evas_object_smart_changed(obj);
+}
+
+static void
+_vbar_smart_show(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_show(sd->o_bg);
+ evas_object_show(sd->o_vg);
+}
+
+static void
+_vbar_smart_hide(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ INF(" * %s", __FUNCTION__);
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_hide(sd->o_bg);
+ evas_object_hide(sd->o_vg);
+}
+
+static void
+_vbar_smart_calculate(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+ double gw; /* width of 1 group of vbars */
+ double sw; /* space between 2 group of vbars */
+ double bw; /* width of 1 vbar */
+ int w, h;
+
+ INF(" * %s", __FUNCTION__);
+ /*
+ # #
+ # # # #
+ ### ###
+ ### ###
+ <->
+ sw
+ <->
+ gw
+
+ */
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+ gw = (w * sd->group_width) / (100.0 * sd->nbr_values);
+ sw = (w - sd->nbr_values * gw) / (sd->nbr_values - 1);
+ bw = (gw - sd->nbr_series + 1) / sd->nbr_series; /* vbars separated by 1 px */
+
+ for (int j = 0; j < sd->nbr_series; j++)
+ {
+ double *d;
+ double y = j * (bw + 1);
+
+ d = sd->data[j].values;
+
+ for (int i = 0; i < sd->nbr_values; i++)
+ {
+ double x = i * (gw + sw) + y;
+
+ evas_vg_shape_append_move_to(sd->data[j].bars, (x), Y_VG(0));
+ evas_vg_shape_append_line_to(sd->data[j].bars, (x + bw), Y_VG(0));
+ evas_vg_shape_append_line_to(sd->data[j].bars, (x + bw), Y_VG(d[i]));
+ evas_vg_shape_append_line_to(sd->data[j].bars, (x), Y_VG(d[i]));
+ }
+ evas_vg_node_color_set(sd->data[j].bars, sd->data[j].r, sd->data[j].g, sd->data[j].b, 255);
+ }
+}
+
+static void
+_vbar_smart_init(void)
+{
+ static Evas_Smart_Class sc;
+
+ INF(" * %s", __FUNCTION__);
+
+ evas_object_smart_clipped_smart_set(&_parent_sc);
+ sc = _parent_sc;
+ sc.name = "vbar";
+ sc.version = EVAS_SMART_CLASS_VERSION;
+ sc.add = _vbar_smart_add;
+ sc.del = _vbar_smart_del;
+ sc.move = _vbar_smart_move;
+ sc.resize = _vbar_smart_resize;
+ sc.show = _vbar_smart_show;
+ sc.hide = _vbar_smart_hide;
+ sc.calculate = _vbar_smart_calculate;
+ _vbar_smart = evas_smart_class_new(&sc);
+}
+
+/*============================================================================*
+ * Global *
+ *============================================================================*/
+
+/*============================================================================*
+ * API *
+ *============================================================================*/
+
+ECH_API Evas_Object *
+echart_vbar_add(Evas *evas)
+{
+ Evas_Object *obj;
+
+ INF(" * %s", __FUNCTION__);
+
+ if (!_vbar_smart) _vbar_smart_init();
+ obj = evas_object_smart_add(evas, _vbar_smart);
+
+ return obj;
+}
+
+ECH_API void
+echart_vbar_data_append(Evas_Object *obj, double *values, int nbr_values)
+{
+ Chart_Vbar *sd;
+ double ymin;
+ double ymax;
+ unsigned int c;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ if (!values || (nbr_values <= 0))
+ return;
+
+ if (sd->nbr_series == 0)
+ {
+ sd->nbr_values = nbr_values;
+ }
+ else
+ {
+ if (nbr_values != sd->nbr_values)
+ {
+ ERR("Append a serie with wrong values count.");
+ return;
+ }
+ }
+
+ sd->data = "" sizeof(Data) * (sd->nbr_series + 1));
+ if (!sd->data)
+ {
+ ERR("Can not allocate memory.");
+ return;
+ }
+
+ sd->data[sd->nbr_series].values = malloc(nbr_values * sizeof(double));
+ if (!sd->data[sd->nbr_series].values)
+ {
+ ERR("Can not allocate memory.");
+ return;
+ }
+
+ memcpy(sd->data[sd->nbr_series].values, values, nbr_values * sizeof(double));
+ c = echart_color_get(sd->nbr_series).line;
+ sd->data[sd->nbr_series].r = (unsigned char)((c >> 16) & 0xff);
+ sd->data[sd->nbr_series].g = (unsigned char)((c >> 8) & 0xff);
+ sd->data[sd->nbr_series].b = (unsigned char)((c >> 0) & 0xff);
+
+ sd->data[sd->nbr_series].bars = evas_vg_shape_add(sd->container);
+
+ sd->nbr_series++;
+
+ ymin = values[0];
+ ymax = values[0];
+ for (int i = 1; i < nbr_values; i++)
+ {
+ if (values[i] < ymin) ymin = values[i];
+ if (values[i] > ymax) ymax = values[i];
+ }
+
+ if (sd->nbr_values == 0)
+ {
+ sd->nbr_values = nbr_values;
+ sd->ymin = ymin;
+ sd->ymax = ymax;
+ }
+ else
+ {
+ if (ymin < sd->ymin) sd->ymin = ymin;
+ if (ymax > sd->ymax) sd->ymax = ymax;
+ }
+
+ evas_object_smart_changed(obj);
+}
+
+ECH_API int
+echart_vbar_nbr_series_get(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0);
+
+ return sd->nbr_series;
+}
+
+ECH_API int
+echart_vbar_nbr_values_get(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0);
+
+ return sd->nbr_values;
+}
+
+ECH_API void
+echart_vbar_color_set(Evas_Object *obj, int serie_num, int r, int g, int b, int a)
+{
+ Chart_Vbar *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ sd->data[serie_num].r = r;
+ sd->data[serie_num].g = g;
+ sd->data[serie_num].b = b;
+
+ evas_object_smart_changed(obj);
+}
+
+ECH_API void
+echart_vbar_group_width_set(Evas_Object *obj, double group_width)
+{
+ Chart_Vbar *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN(sd);
+
+ if ((group_width <= 0.0) || (group_width > 100.0))
+ return;
+
+ sd->group_width = group_width;
+
+ evas_object_smart_changed(obj);
+}
+
+ECH_API double
+echart_vbar_group_width_get(Evas_Object *obj)
+{
+ Chart_Vbar *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0.0);
+
+ return sd->group_width;
+}
+
diff --git a/src/lib/echart_vbar.h b/src/lib/echart_vbar.h
new file mode 100644
index 0000000..a5bfd09
--- /dev/null
+++ b/src/lib/echart_vbar.h
@@ -0,0 +1,25 @@
+/*
+ * SPDX-FileCopyrightText: Vincent Torri <[email protected]>
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifndef ECHART_VBAR_H
+#define ECHART_VBAR_H
+
+#include <Evas.h>
+
+ECH_API Evas_Object *echart_vbar_add(Evas *evas);
+
+ECH_API void echart_vbar_data_append(Evas_Object *obj, double *values, int nbr_vamues);
+
+ECH_API int echart_vbar_nbr_series_get(Evas_Object *obj);
+
+ECH_API int echart_vbar_nbr_values_get(Evas_Object *obj);
+
+ECH_API void echart_vbar_color_set(Evas_Object *obj, int serie_num, int r, int g, int b, int a);
+
+ECH_API void echart_vbar_group_width_set(Evas_Object *obj, double group_width);
+
+ECH_API double echart_vbar_group_width_get(Evas_Object *obj);
+
+#endif /* ECHART_VBAR_H */
diff --git a/src/lib/meson.build b/src/lib/meson.build
index f81cf5c..1341cfa 100644
--- a/src/lib/meson.build
+++ b/src/lib/meson.build
@@ -7,8 +7,9 @@ echart_header = files([
'echart_color.h',
'echart_grid.h',
'echart_grid_ord.h',
- 'echart_main.h',
'echart_line.h',
+ 'echart_main.h',
+ 'echart_vbar.h',
])
echart_lib_src = files([
@@ -18,6 +19,7 @@ echart_lib_src = files([
'echart_grid_ord.c',
'echart_line.c',
'echart_main.c',
+ 'echart_vbar.c',
])
config_dir += [ include_directories('.') ]
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.