From 99071182503f30f4e4eade22da9616f5128d2029 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 25 Jul 2024 17:59:55 +0200 Subject: [PATCH 01/20] own string v1 --- src/apps/qutils/canvas.cpp | 8 +- src/apps/qutils/canvas.h | 3 +- src/apps/weblib/cinterface.cpp | 3 +- src/apps/weblib/interface.cpp | 4 +- src/apps/weblib/interface.h | 4 +- src/apps/weblib/jscriptcanvas.cpp | 11 +- src/apps/weblib/jscriptcanvas.h | 3 +- src/apps/weblib/ts-api/events.ts | 2 +- src/base/anim/interpolated.h | 12 +- src/base/gfx/canvas.h | 13 +- src/base/gfx/draw/textbox.cpp | 7 +- src/base/gfx/font.cpp | 5 +- src/base/gfx/font.h | 9 +- src/base/text/immutable_string.h | 280 ++++++++++++++++++ src/base/text/naturalcmp.cpp | 5 +- src/base/text/naturalcmp.h | 3 +- src/base/text/smartstring.cpp | 7 +- src/base/text/smartstring.h | 5 +- src/chart/generator/axis.cpp | 8 +- src/chart/generator/axis.h | 8 +- src/chart/generator/marker.cpp | 6 +- src/chart/generator/marker.h | 1 - src/chart/generator/plot.cpp | 4 +- src/chart/generator/plot.h | 4 +- src/chart/generator/plotbuilder.cpp | 28 +- src/chart/main/events.h | 16 +- src/chart/main/style.cpp | 4 +- src/chart/main/style.h | 2 +- src/chart/main/stylesheet.cpp | 2 +- src/chart/options/channel.cpp | 2 +- src/chart/options/channel.h | 2 +- src/chart/options/options.h | 3 +- src/chart/rendering/drawaxes.cpp | 23 +- src/chart/rendering/drawchart.cpp | 2 +- src/chart/rendering/drawinterlacing.cpp | 2 +- src/chart/rendering/drawlabel.cpp | 2 +- src/chart/rendering/drawlabel.h | 2 +- src/chart/rendering/drawlegend.cpp | 21 +- src/chart/rendering/drawlegend.h | 2 +- src/chart/rendering/drawmarkerinfo.cpp | 6 +- src/chart/rendering/markerrenderer.cpp | 8 +- src/chart/rendering/markerrenderer.h | 4 +- .../rendering/markers/connectingmarker.cpp | 5 +- src/chart/rendering/orientedlabel.cpp | 2 +- src/chart/rendering/orientedlabel.h | 2 +- src/dataframe/impl/aggregators.cpp | 14 +- src/dataframe/impl/data_source.cpp | 48 +-- src/dataframe/impl/data_source.h | 51 ++-- src/dataframe/impl/dataframe.cpp | 64 ++-- src/dataframe/impl/dataframe.h | 28 +- src/dataframe/interface.cpp | 29 +- src/dataframe/interface.h | 42 +-- src/dataframe/old/datatable.cpp | 57 ++-- src/dataframe/old/datatable.h | 16 +- src/dataframe/old/types.h | 15 +- test/qtest/chart.cpp | 27 +- test/unit/dataframe/interface_test.cpp | 13 +- 57 files changed, 657 insertions(+), 302 deletions(-) create mode 100644 src/base/text/immutable_string.h diff --git a/src/apps/qutils/canvas.cpp b/src/apps/qutils/canvas.cpp index 0679e12c1..f80735a64 100644 --- a/src/apps/qutils/canvas.cpp +++ b/src/apps/qutils/canvas.cpp @@ -195,12 +195,12 @@ void BaseCanvas::rectangle(const Geom::Rect &rect) painter.drawRect(toQRect(rect)); } -void BaseCanvas::text(const Geom::Rect &rect, const std::string &text) +void BaseCanvas::text(const Geom::Rect &rect, std::string_view text) { painter.setPen(textPen); painter.drawText(toQRect(rect), Qt::AlignLeft, - QString::fromStdString(text)); + QString::fromStdString(std::string{text})); } void BaseCanvas::setBrushGradient(const Geom::Line &line, @@ -227,13 +227,13 @@ QPen BaseCanvas::brushToPen(const QBrush &brush) } Geom::Size Gfx::ICanvas::textBoundary(const Gfx::Font &font, - const std::string &text) + std::string_view text) { auto res = QFontMetrics{BaseCanvas::fromGfxFont(font)}.boundingRect( QRect(0, 0, 0, 0), Qt::AlignLeft, - QString::fromStdString(text)); + QString::fromStdString(std::string{text})); return {static_cast(res.width()), static_cast(res.height())}; diff --git a/src/apps/qutils/canvas.h b/src/apps/qutils/canvas.h index d801d6302..ff0523c56 100644 --- a/src/apps/qutils/canvas.h +++ b/src/apps/qutils/canvas.h @@ -44,8 +44,7 @@ class BaseCanvas : public Gfx::ICanvas, public Vizzu::Draw::Painter void circle(const Geom::Circle &circle) override; void line(const Geom::Line &line) override; - void text(const Geom::Rect &rect, - const std::string &text) override; + void text(const Geom::Rect &rect, std::string_view text) override; void setBrushGradient(const Geom::Line &line, const Gfx::ColorGradient &gradient) override; diff --git a/src/apps/weblib/cinterface.cpp b/src/apps/weblib/cinterface.cpp index a02cc9e0f..55818e309 100644 --- a/src/apps/weblib/cinterface.cpp +++ b/src/apps/weblib/cinterface.cpp @@ -272,7 +272,8 @@ const Value *record_getValue(const Vizzu::Data::RowWrapper *record, thread_local Value val{{}, {}}; if (auto &&cval = Interface::getRecordValue(*record, column); (val.dimension = cval.index())) { - auto &&dim = *std::get_if(&cval); + auto &&dim = + *std::get_if(&cval); new (&val.dimensionValue) const char *{dim ? dim->c_str() : nullptr}; } diff --git a/src/apps/weblib/interface.cpp b/src/apps/weblib/interface.cpp index a6fae6928..c02a96b43 100644 --- a/src/apps/weblib/interface.cpp +++ b/src/apps/weblib/interface.cpp @@ -192,8 +192,8 @@ void Interface::setChartFilter(ObjectRegistryHandle chart, getChart(chart)->getOptions().dataFilter = {}; } -std::variant Interface::getRecordValue( - const Data::RowWrapper &record, +std::variant +Interface::getRecordValue(const Data::RowWrapper &record, const char *column) { return record.get_value(column); diff --git a/src/apps/weblib/interface.h b/src/apps/weblib/interface.h index 350324baf..ff8c149ea 100644 --- a/src/apps/weblib/interface.h +++ b/src/apps/weblib/interface.h @@ -128,8 +128,8 @@ class Interface const char *path, const char *value); - static std::variant getRecordValue( - const Data::RowWrapper &record, + static std::variant + getRecordValue(const Data::RowWrapper &record, const char *column); private: diff --git a/src/apps/weblib/jscriptcanvas.cpp b/src/apps/weblib/jscriptcanvas.cpp index 4d79f58d0..0c821b964 100644 --- a/src/apps/weblib/jscriptcanvas.cpp +++ b/src/apps/weblib/jscriptcanvas.cpp @@ -157,15 +157,14 @@ void JScriptCanvas::line(const Geom::Line &line) line.end.y); } -void JScriptCanvas::text(const Geom::Rect &rect, - const std::string &text) +void JScriptCanvas::text(const Geom::Rect &rect, const char *text) { ::canvas_text(this, rect.pos.x, rect.pos.y, rect.size.x, rect.size.y, - text.c_str()); + text); } void JScriptCanvas::setBrushGradient(const Geom::Line &line, @@ -236,11 +235,9 @@ void JScriptCanvas::resetStates() } Geom::Size Gfx::ICanvas::textBoundary(const Gfx::Font &font, - const std::string &text) + const char *text) { - thread_local std::string fontCache; - fontCache = font.toCSS(); Geom::Size res; - ::textBoundary(fontCache.c_str(), text.c_str(), &res.x, &res.y); + ::textBoundary(font.toCSS().c_str(), text, &res.x, &res.y); return res; } \ No newline at end of file diff --git a/src/apps/weblib/jscriptcanvas.h b/src/apps/weblib/jscriptcanvas.h index ccbfd8a70..f4fff32c8 100644 --- a/src/apps/weblib/jscriptcanvas.h +++ b/src/apps/weblib/jscriptcanvas.h @@ -42,8 +42,7 @@ class JScriptCanvas : public Gfx::ICanvas, public Draw::Painter void circle(const Geom::Circle &circle) override; void line(const Geom::Line &line) override; - void text(const Geom::Rect &rect, - const std::string &text) override; + void text(const Geom::Rect &rect, const char *text) override; void setBrushGradient(const Geom::Line &line, const Gfx::ColorGradient &gradient) override; diff --git a/src/apps/weblib/ts-api/events.ts b/src/apps/weblib/ts-api/events.ts index edb2b389d..309d03bf4 100644 --- a/src/apps/weblib/ts-api/events.ts +++ b/src/apps/weblib/ts-api/events.ts @@ -141,7 +141,7 @@ export interface Marker extends Element { categories: Data.Record values: Data.Record /** Unique index of the marker. */ - index: number + index: string } /** Label element of a marker element. */ diff --git a/src/base/anim/interpolated.h b/src/base/anim/interpolated.h index 57cbde8d1..8878431b3 100644 --- a/src/base/anim/interpolated.h +++ b/src/base/anim/interpolated.h @@ -11,6 +11,7 @@ #include "base/conv/tostring.h" #include "base/math/floating.h" #include "base/math/interpolation.h" +#include "base/text/immutable_string.h" namespace Anim { @@ -85,6 +86,15 @@ template class Interpolated values[0] = Weighted(Conv::parse(str)); } + template + requires(std::is_constructible_v + && !std::same_as + && !std::same_as) + explicit Interpolated(T &&value) + { + values[0] = Weighted(Type{std::forward(value)}); + } + Interpolated &operator=(Type value) { values[0] = Weighted(std::move(value)); @@ -277,7 +287,7 @@ Interpolated interpolate(const Interpolated &op0, return res; } -using String = Interpolated; +using String = Interpolated; } diff --git a/src/base/gfx/canvas.h b/src/base/gfx/canvas.h index 24efdd5cb..7fdaef66d 100644 --- a/src/base/gfx/canvas.h +++ b/src/base/gfx/canvas.h @@ -1,9 +1,6 @@ #ifndef GFX_CANVAS #define GFX_CANVAS -#include -#include - #include "base/geom/affinetransform.h" #include "base/geom/circle.h" #include "base/geom/line.h" @@ -11,14 +8,10 @@ #include "base/geom/rect.h" #include "base/gfx/color.h" #include "base/gfx/colorgradient.h" -#include "base/gfx/colortransform.h" #include "base/gfx/font.h" namespace Gfx { - -struct ICanvas; - struct ICanvas { virtual ~ICanvas() = default; @@ -53,8 +46,7 @@ struct ICanvas virtual void circle(const Geom::Circle &circle) = 0; virtual void line(const Geom::Line &line) = 0; - virtual void text(const Geom::Rect &rect, - const std::string &text) = 0; + virtual void text(const Geom::Rect &rect, const char *text) = 0; virtual void setBrushGradient(const Geom::Line &line, const ColorGradient &gradient) = 0; @@ -64,8 +56,7 @@ struct ICanvas virtual void *getPainter() = 0; - static Geom::Size textBoundary(const Gfx::Font &, - const std::string &); + static Geom::Size textBoundary(const Gfx::Font &, const char *); }; } diff --git a/src/base/gfx/draw/textbox.cpp b/src/base/gfx/draw/textbox.cpp index d69d38b21..542846c63 100644 --- a/src/base/gfx/draw/textbox.cpp +++ b/src/base/gfx/draw/textbox.cpp @@ -149,7 +149,8 @@ void TextBox::draw(ICanvas &canvas, double opacity) canvas.rectangle( {{xpos, ypos}, {text.width, line.height}}); canvas.setTextColor(foreground); - canvas.text({{xpos, ypos}, {10000, 10000}}, text.content); + canvas.text({{xpos, ypos}, {10000, 10000}}, + text.content.c_str()); xpos += text.width; } ypos += line.height * line.spacing; @@ -168,8 +169,8 @@ Geom::Size TextBox::measure(ICanvas &canvas) line.height = 0; for (auto &text : line.texts) { canvas.setFont(text.font); - auto size = - ICanvas::textBoundary(text.font, text.content); + auto size = ICanvas::textBoundary(text.font, + text.content.c_str()); text.width = size.x; line.width += size.x; if (size.y > line.height) line.height = size.y; diff --git a/src/base/gfx/font.cpp b/src/base/gfx/font.cpp index 22fed7666..aadad5f67 100644 --- a/src/base/gfx/font.cpp +++ b/src/base/gfx/font.cpp @@ -1,5 +1,6 @@ #include "font.h" +#include #include #include "base/conv/parse.h" @@ -44,7 +45,7 @@ bool Font::Weight::operator==(const Font::Weight &other) const Font::Font(double size) : style(Gfx::Font::Style::normal), size(size) {} -Font::Font(std::string family, +Font::Font(Text::immutable_string family, Style style, Weight weight, double size) : @@ -73,7 +74,7 @@ std::string Font::toCSS() const res += static_cast(weight) + " "; res += std::to_string(size) + "px "; - res += family; + res += family.view(); return res; } diff --git a/src/base/gfx/font.h b/src/base/gfx/font.h index aa813dd01..62d14979b 100644 --- a/src/base/gfx/font.h +++ b/src/base/gfx/font.h @@ -3,6 +3,8 @@ #include +#include "base/text/immutable_string.h" + namespace Gfx { @@ -29,13 +31,16 @@ class Font enum class Style { normal, italic, oblique }; - std::string family; + Text::immutable_string family; Style style; Weight weight; double size; explicit Font(double size = 0); - Font(std::string family, Style style, Weight weight, double size); + Font(Text::immutable_string family, + Style style, + Weight weight, + double size); Font(const Font &) = default; Font(Font &&) = default; Font &operator=(const Font &) = default; diff --git a/src/base/text/immutable_string.h b/src/base/text/immutable_string.h new file mode 100644 index 000000000..83d8f09ef --- /dev/null +++ b/src/base/text/immutable_string.h @@ -0,0 +1,280 @@ +#ifndef IMMUTABLE_STRING_H +#define IMMUTABLE_STRING_H + +#include +#include +#include + +namespace Text +{ + +struct immutable_string +{ + struct impl_t + { + std::size_t counter; + const std::size_t size; + }; + + struct deleter_t + { + void operator()(char *buffer) const noexcept + { + ::operator delete[](buffer, + std::align_val_t{alignof(impl_t)}); + } + + void operator()(impl_t *impl) const noexcept + { + auto *buffer = std::launder( + static_cast(static_cast(impl))); + impl->~impl_t(); + ::operator delete(buffer, impl); + (*this)(buffer); + } + }; + + struct allocator_t + { + impl_t *operator()(const char *data, std::size_t length) const + { + std::unique_ptr ptr{ + new (std::align_val_t{alignof( + impl_t)}) char[sizeof(impl_t) + length + 1]}; + auto *buffer = ptr.get(); + std::strncpy(buffer + sizeof(impl_t), + data, + length)[length] = '\0'; + auto res = std::unique_ptr{ + new (buffer) impl_t{1, length}}; + ptr.release(); + return res.release(); + } + }; + + [[nodiscard]] constexpr immutable_string() noexcept : impl{} {} + + [[nodiscard]] explicit constexpr immutable_string( + std::nullptr_t) noexcept : + impl{} + {} + + [[nodiscard]] explicit immutable_string(std::string_view data) : + impl(allocator_t{}(data.data(), data.size())) + {} + + template + [[nodiscard]] immutable_string(const char (&data)[N]) : + immutable_string(std::string_view{data, N - 1}) + {} + + template + [[nodiscard]] immutable_string(const char (&&data)[N]) : + immutable_string(std::string_view{data, N - 1}) + {} + + [[nodiscard]] immutable_string( + const immutable_string &other) noexcept : + impl(other.impl) + { + if (impl) ++impl->counter; + } + + [[nodiscard]] immutable_string(immutable_string &&other) noexcept + : + impl(other.impl) + { + other.impl = nullptr; + } + + immutable_string &operator=( + const immutable_string &other) noexcept + { + if (this == &other) return *this; + decr(); + impl = other.impl; + if (impl) ++impl->counter; + return *this; + } + + immutable_string &operator=(immutable_string &&other) noexcept + { + if (this == &other) return *this; + decr(); + impl = other.impl; + other.impl = nullptr; + return *this; + } + + immutable_string &operator=(const char *data) + { + decr(); + impl = allocator_t{}(data, std::strlen(data)); + return *this; + } + + ~immutable_string() noexcept { decr(); } + + void decr() + { + if (impl && --impl->counter == 0) deleter_t{}(impl); + } + + [[nodiscard]] const char *c_str() const noexcept + { + if (!impl) return ""; + return view().data(); + } + + [[nodiscard]] explicit operator std::string_view() const noexcept + { + if (!impl) return {}; + return {std::launder(static_cast( + static_cast(impl))) + + sizeof(impl_t), + impl->size}; + } + + [[nodiscard]] std::string_view view() const noexcept + { + return static_cast(*this); + } + + [[nodiscard]] bool empty() const noexcept + { + return !impl || impl->size == 0; + } + + [[nodiscard]] bool operator==( + const immutable_string &other) const noexcept + { + return view() == other.view(); + } + + [[nodiscard]] auto operator<=>( + const immutable_string &other) const noexcept + { + return view() <=> other.view(); + } + + [[nodiscard]] friend bool operator==(const immutable_string &lhs, + std::string_view rhs) noexcept + { + return lhs.view() == rhs; + } + + [[nodiscard]] friend bool operator==(std::string_view lhs, + const immutable_string &rhs) noexcept + { + return lhs == rhs.view(); + } + + template + [[nodiscard]] friend bool operator==(const immutable_string &lhs, + const char (&rhs)[N]) noexcept + { + return lhs == std::string_view{rhs, N - 1}; + } + + template + [[nodiscard]] friend bool operator==(const char (&&lhs)[N], + const immutable_string &rhs) noexcept + { + return std::string_view{lhs, N - 1} == rhs; + } + + template + [[nodiscard]] friend bool operator==(const immutable_string &lhs, + const char (&&rhs)[N]) noexcept + { + return lhs == std::string_view{rhs, N - 1}; + } + + template + [[nodiscard]] friend bool operator==(const char (&lhs)[N], + const immutable_string &rhs) noexcept + { + return std::string_view{lhs, N - 1} == rhs; + } + + [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, + std::string_view rhs) noexcept + { + return lhs.view() <=> rhs; + } + + [[nodiscard]] friend auto operator<=>(std::string_view lhs, + const immutable_string &rhs) noexcept + { + return lhs <=> rhs.view(); + } + + template + [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, + const char (&rhs)[N]) noexcept + { + return lhs <=> std::string_view{rhs, N - 1}; + } + + template + [[nodiscard]] friend auto operator<=>(const char (&lhs)[N], + const immutable_string &rhs) noexcept + { + return std::string_view{lhs, N - 1} <=> rhs; + } + + template + [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, + const char (&&rhs)[N]) noexcept + { + return lhs <=> std::string_view{rhs, N - 1}; + } + + template + [[nodiscard]] friend auto operator<=>(const char (&&lhs)[N], + const immutable_string &rhs) noexcept + { + return std::string_view{lhs, N - 1} <=> rhs; + } + + friend std::string operator+(const immutable_string &lhs, + const std::string &rhs) + { + return lhs.toString() + rhs; + } + + friend std::string operator+(const std::string &lhs, + const immutable_string &rhs) + { + return lhs + rhs.toString(); + } + + friend std::string operator+(const immutable_string &lhs, + std::string &&rhs) + { + return lhs.toString() + std::move(rhs); + } + + friend std::string operator+(std::string &&lhs, + const immutable_string &rhs) + { + return std::move(lhs) + rhs.toString(); + } + + [[nodiscard]] std::string toString() const + { + return std::string{view()}; + } + + [[nodiscard]] static immutable_string fromString( + const std::string &data) + { + return immutable_string{data}; + } + + impl_t *impl; +}; + +} + +#endif // IMMUTABLE_STRING_H diff --git a/src/base/text/naturalcmp.cpp b/src/base/text/naturalcmp.cpp index aa748065e..de1326afa 100644 --- a/src/base/text/naturalcmp.cpp +++ b/src/base/text/naturalcmp.cpp @@ -14,10 +14,9 @@ NaturalCmp::NaturalCmp(bool ignoreCase, bool ignoreSpace) : ignoreSpace(ignoreSpace) {} -bool NaturalCmp::operator()(const std::string &op0, - const std::string &op1) const +bool NaturalCmp::operator()(const char *op0, const char *op1) const { - return std::is_lt(cmp(op0.c_str(), op1.c_str())); + return std::is_lt(cmp(op0, op1)); } std::weak_ordering NaturalCmp::cmp(const char *s0, diff --git a/src/base/text/naturalcmp.h b/src/base/text/naturalcmp.h index 336a2afe4..f41c20273 100644 --- a/src/base/text/naturalcmp.h +++ b/src/base/text/naturalcmp.h @@ -11,8 +11,7 @@ class NaturalCmp public: explicit NaturalCmp(bool ignoreCase = true, bool ignoreSpace = true); - [[nodiscard]] bool operator()(const std::string &, - const std::string &) const; + [[nodiscard]] bool operator()(const char *, const char *) const; private: bool ignoreCase; diff --git a/src/base/text/smartstring.cpp b/src/base/text/smartstring.cpp index fb8a48615..86950c015 100644 --- a/src/base/text/smartstring.cpp +++ b/src/base/text/smartstring.cpp @@ -55,7 +55,7 @@ std::string fromPhysicalValue(double value, NumberFormat format, size_t maxFractionDigits, const NumberScale &numberScale, - const std::string &unit) + const immutable_string &unit) { Conv::NumberToString converter{ static_cast(maxFractionDigits)}; @@ -72,7 +72,7 @@ std::string fromPhysicalValue(double value, return converter(num.signedCoef()) + (prefix.empty() && (unit.empty() || unit == "%") - ? unit + ? unit.toString() : " " + prefix + unit); } break; @@ -84,7 +84,8 @@ std::string fromPhysicalValue(double value, default: break; } return converter(value) - + (unit.empty() || unit == "%" ? unit : " " + unit); + + (unit.empty() || unit == "%" ? unit.toString() + : " " + unit); } } diff --git a/src/base/text/smartstring.h b/src/base/text/smartstring.h index 72d6e6240..2142e0055 100644 --- a/src/base/text/smartstring.h +++ b/src/base/text/smartstring.h @@ -8,7 +8,8 @@ #include #include -#include "base/text/numberscale.h" +#include "immutable_string.h" +#include "numberscale.h" namespace Text { @@ -28,7 +29,7 @@ void trim(std::string &string); NumberFormat format, size_t maxFractionDigits, const NumberScale &numberScale, - const std::string &unit); + const immutable_string &unit); } } diff --git a/src/chart/generator/axis.cpp b/src/chart/generator/axis.cpp index 4d43dc693..6e847f452 100644 --- a/src/chart/generator/axis.cpp +++ b/src/chart/generator/axis.cpp @@ -20,13 +20,13 @@ Geom::Point Axises::origo() const } MeasureAxis::MeasureAxis(Math::Range interval, - const std::string_view &unit, - const std::string_view &measName, + const Text::immutable_string &unit, + const Text::immutable_string &measName, std::optional step) : enabled(true), range(interval), - unit(std::string{unit}), - origMeasureName(std::string{measName}), + unit(unit), + origMeasureName(measName), step(step ? *step : Math::Renard::R5().ceil(range.size() / 5.0)) {} diff --git a/src/chart/generator/axis.h b/src/chart/generator/axis.h index 727fd6dcc..e11eddbae 100644 --- a/src/chart/generator/axis.h +++ b/src/chart/generator/axis.h @@ -37,8 +37,8 @@ struct MeasureAxis ::Anim::Interpolated step{1.0}; MeasureAxis() = default; MeasureAxis(Math::Range interval, - const std::string_view &unit, - const std::string_view &measName, + const Text::immutable_string &unit, + const Text::immutable_string &measName, std::optional step); bool operator==(const MeasureAxis &other) const; [[nodiscard]] double origo() const; @@ -65,7 +65,7 @@ struct DimensionAxis double value; ::Anim::Interpolated colorBase; ::Anim::String label; - std::string categoryValue; + Text::immutable_string categoryValue; double weight; Item(Math::Range range, @@ -104,7 +104,7 @@ struct DimensionAxis using Values = std::multimap; bool enabled{false}; - std::string category{}; + Text::immutable_string category{}; std::shared_ptr>> trackedValues; diff --git a/src/chart/generator/marker.cpp b/src/chart/generator/marker.cpp index 28f7486fc..ac2acae38 100644 --- a/src/chart/generator/marker.cpp +++ b/src/chart/generator/marker.cpp @@ -13,7 +13,6 @@ Marker::Marker(const Options &options, const Data::SeriesList &mainAxisList, const Data::SeriesList &subAxisList, const Data::MultiIndex &index, - MarkerPosition pos, bool needMarkerInfo) : enabled(true), cellInfo(enabled || needMarkerInfo @@ -23,10 +22,9 @@ Marker::Marker(const Options &options, .at(ChannelId::size) .dimensionsWithLevel(), index)), - idx(index.oldAggr), - pos(pos) + idx(index.marker_id), + pos{} { - prevMainMarker.values[0].value.idx = ~MarkerIndex{}; const auto &channels = options.getChannels(); auto color = getValueForChannel(channels, ChannelId::color, diff --git a/src/chart/generator/marker.h b/src/chart/generator/marker.h index 7114a1fbd..dc4abd69a 100644 --- a/src/chart/generator/marker.h +++ b/src/chart/generator/marker.h @@ -31,7 +31,6 @@ class Marker const Data::SeriesList &mainAxisList, const Data::SeriesList &subAxisList, const Data::MultiIndex &index, - MarkerPosition pos, bool needMarkerInfo); ::Anim::Interpolated colorBase; diff --git a/src/chart/generator/plot.cpp b/src/chart/generator/plot.cpp index 0c4eeca14..18a1eb983 100644 --- a/src/chart/generator/plot.cpp +++ b/src/chart/generator/plot.cpp @@ -166,7 +166,7 @@ void Plot::mergeMarkersAndCellInfo(Plot &source, Plot &target) auto &smarker = smarkers[ix]; if (auto &[idx, prePos] = smarker.prevMainMarker.values[0].value; - idx != ~Marker::MarkerIndex{}) { + !idx.empty()) { if (prePos < source_reindex.size() && source_reindex[prePos].idx == idx) prePos = source_reindex[prePos].pos; @@ -182,7 +182,7 @@ void Plot::mergeMarkersAndCellInfo(Plot &source, Plot &target) auto &tmarker = tmarkers[ix]; if (auto &[idx, prePos] = tmarker.prevMainMarker.values[0].value; - idx != ~Marker::MarkerIndex{}) { + !idx.empty()) { if (prePos < target_reindex.size() && target_reindex[prePos].idx == idx) prePos = target_reindex[prePos].pos; diff --git a/src/chart/generator/plot.h b/src/chart/generator/plot.h index a634591a6..a0946e089 100644 --- a/src/chart/generator/plot.h +++ b/src/chart/generator/plot.h @@ -40,8 +40,8 @@ class Plot struct MarkerInfoContent { std::optional markerId; - std::shared_ptr< - const std::vector>> + std::shared_ptr>> info; MarkerInfoContent() = default; diff --git a/src/chart/generator/plotbuilder.cpp b/src/chart/generator/plotbuilder.cpp index fb86dff4f..f7aa13cf4 100644 --- a/src/chart/generator/plotbuilder.cpp +++ b/src/chart/generator/plotbuilder.cpp @@ -84,10 +84,10 @@ Buckets PlotBuilder::generateMarkers(std::size_t &mainBucketSize) for (auto &&[ix, mid] : plot->getOptions()->markersInfo) map.emplace(mid, ix); - for (auto first = map.begin(), last = map.end(); - auto &&index : dataCube) { - auto &&markerId = index.oldAggr; - auto needInfo = first != last && first->first == markerId; + for (auto &&index : dataCube) { + auto &&markerId = index.marker_id; + auto &&[first, last] = map.equal_range(markerId); + auto needInfo = first != last; auto &marker = plot->markers.emplace_back(*plot->getOptions(), dataCube, @@ -95,15 +95,18 @@ Buckets PlotBuilder::generateMarkers(std::size_t &mainBucketSize) mainIds, subIds, index, - plot->markers.size(), needInfo); - while (needInfo) { + while (first != last) plot->markersInfo.insert({first++->second, Plot::MarkerInfo{Plot::MarkerInfoContent{marker}}}); - needInfo = first != last && first->first == markerId; - } } + std::ranges::stable_sort(plot->markers, + std::less{}, + std::mem_fn(&Marker::idx)); + for (Marker::MarkerPosition ix{}; auto &marker : plot->markers) + marker.pos = ix++; + Buckets buckets(plot->markers); auto &&hasMarkerConnection = linkMarkers(buckets.sort(&Marker::mainId), true); @@ -368,18 +371,19 @@ void PlotBuilder::calcMeasureAxis(const Data::DataTable &dataTable, plot->axises.at(type).common.title = scale.title.isAuto() ? dataCube.getName(*meas) : scale.title ? *scale.title - : std::string{}; + : Text::immutable_string{}; if (type == plot->getOptions()->subAxisType() && plot->getOptions()->align == Base::Align::Type::stretch) { - axis = {Math::Range::Raw(0, 100), + axis = MeasureAxis{Math::Range::Raw(0, 100), "%", meas->getColIndex(), scale.step.getValue()}; } else { - axis = {range.isReal() ? range + axis = MeasureAxis{range.isReal() + ? range : Math::Range::Raw(0, 0), dataTable.getUnit(meas->getColIndex()), meas->getColIndex(), @@ -443,7 +447,7 @@ void PlotBuilder::calcDimensionAxis(ChannelId type) plot->axises.at(type).common.title = scale.title.isAuto() && !hasLabel ? axis.category : scale.title ? *scale.title - : std::string{}; + : Text::immutable_string{}; } void PlotBuilder::addAlignment(const Buckets &subBuckets) const diff --git a/src/chart/main/events.h b/src/chart/main/events.h index 4417e7b30..aa2f25a25 100644 --- a/src/chart/main/events.h +++ b/src/chart/main/events.h @@ -149,7 +149,7 @@ class Events { std::string tagName; - explicit Element(std::string name) : + explicit Element(std::string &&name) : tagName(std::move(name)) {} @@ -191,12 +191,12 @@ class Events template struct Text : Base { - std::string text; + std::string_view text; template - explicit Text(std::string text, Args &&...args) : + explicit Text(std::string_view text, Args &&...args) : Base(args...), - text(std::move(text)) + text(text) {} void appendToJSON(Conv::JSONObj &&jsonObj) const override @@ -365,7 +365,7 @@ class Events static auto dimLegendLabel( const std::string_view &categoryName, const std::string_view &categoryValue, - const std::string &label, + const std::string_view &label, Gen::ChannelId channel) { return std::make_unique>>( @@ -384,7 +384,7 @@ class Events channel); } - static auto legendTitle(const std::string &title, + static auto legendTitle(std::string_view title, Gen::ChannelId channel) { return std::make_unique>(title, @@ -410,7 +410,7 @@ class Events static auto dimAxisLabel(const std::string_view &categoryName, const std::string_view &categoryValue, - const std::string &label, + const std::string_view &label, bool horizontal) { return std::make_unique>>( @@ -429,7 +429,7 @@ class Events horizontal); } - static auto axisTitle(const std::string &title, + static auto axisTitle(const std::string_view &title, bool horizontal) { return std::make_unique>(title, diff --git a/src/chart/main/style.cpp b/src/chart/main/style.cpp index 4dc94ccd7..ee0cf82bb 100644 --- a/src/chart/main/style.cpp +++ b/src/chart/main/style.cpp @@ -70,7 +70,7 @@ Chart Chart::def() }, Font { - .fontFamily = ::Anim::String("Roboto, sans-serif"), + .fontFamily = getDefaultFont().fontFamily, .fontStyle = Gfx::Font::Style::normal, .fontWeight = Gfx::Font::Weight::Normal(), .fontSize = Gfx::Length::Emphemeral(1) @@ -544,7 +544,7 @@ Chart Chart::def() .dropShadow = 3, .arrowSize = 8, .distance = 2, - .seriesName = ::Anim::String("") + .seriesName = ::Anim::String() } }, .logo = { diff --git a/src/chart/main/style.h b/src/chart/main/style.h index fa7ea40dd..7dbffe2dd 100644 --- a/src/chart/main/style.h +++ b/src/chart/main/style.h @@ -102,7 +102,7 @@ struct Font throw std::logic_error("internal error: no font parent set"); } - [[nodiscard]] std::string calculatedFamily() const + [[nodiscard]] Text::immutable_string calculatedFamily() const { if (fontFamily.has_value()) if (auto &&ff = diff --git a/src/chart/main/stylesheet.cpp b/src/chart/main/stylesheet.cpp index 3a7cd176b..cbf149217 100644 --- a/src/chart/main/stylesheet.cpp +++ b/src/chart/main/stylesheet.cpp @@ -213,7 +213,7 @@ void Sheet::setAfterStyles(Gen::Plot &plot, const Geom::Size &size) if (pair.second.weight == 0) continue; auto textBoundary = Gfx::ICanvas::textBoundary(font, - pair.second.label.get()); + pair.second.label.get().c_str()); auto textXHalfMargin = xLabel.toInvMargin(textBoundary, font.size) .getSpace() diff --git a/src/chart/options/channel.cpp b/src/chart/options/channel.cpp index bddd59345..7e80c14df 100644 --- a/src/chart/options/channel.cpp +++ b/src/chart/options/channel.cpp @@ -56,7 +56,7 @@ void Channel::reset() { measureId = std::nullopt; dimensionIds.clear(); - title = Base::AutoParam{}; + title = Base::AutoParam{}; axisLine = Base::AutoBool(); axisLabels = Base::AutoBool(); ticks = Base::AutoBool(); diff --git a/src/chart/options/channel.h b/src/chart/options/channel.h index c6b6b6f0e..e636f3f45 100644 --- a/src/chart/options/channel.h +++ b/src/chart/options/channel.h @@ -50,7 +50,7 @@ class Channel DimensionIndices dimensionIds{}; ChannelRange range{}; std::size_t labelLevel{}; - Base::AutoParam title{}; + Base::AutoParam title{}; Base::AutoBool axisLine{}; Base::AutoBool axisLabels{}; Base::AutoBool ticks{}; diff --git a/src/chart/options/options.h b/src/chart/options/options.h index 8a4bc42b8..8e2150552 100644 --- a/src/chart/options/options.h +++ b/src/chart/options/options.h @@ -11,6 +11,7 @@ #include "base/geom/rect.h" #include "base/math/fuzzybool.h" #include "base/math/range.h" +#include "base/text/immutable_string.h" #include "dataframe/old/types.h" #include "align.h" @@ -45,7 +46,7 @@ class Options Refl::get_enum(name)); })); - using MarkerIndex = std::size_t; + using MarkerIndex = Text::immutable_string; using MarkerInfoId = std::uint32_t; using Heading = ::Anim::Interpolated>; using LegendType = Base::AutoParam; diff --git a/src/chart/rendering/drawaxes.cpp b/src/chart/rendering/drawaxes.cpp index 89b76f32c..1038cb828 100644 --- a/src/chart/rendering/drawaxes.cpp +++ b/src/chart/rendering/drawaxes.cpp @@ -176,7 +176,7 @@ void DrawAxes::drawTitle(Gen::ChannelId axisIndex) const const Gfx::Font font(titleStyle); canvas.setFont(font); auto size = titleStyle.extendSize( - Gfx::ICanvas::textBoundary(font, title.value), + Gfx::ICanvas::textBoundary(font, title.value.c_str()), font.size); auto relCenter = getTitleBasePos(axisIndex, index); @@ -232,10 +232,10 @@ void DrawAxes::drawTitle(Gen::ChannelId axisIndex) const DrawLabel{{ctx()}}.draw(canvas, Geom::TransformedRect{transform, Geom::Size{size}}, - title.value, + title.value.c_str(), titleStyle, *rootEvents.draw.plot.axis.title, - Events::Targets::axisTitle(title.value, + Events::Targets::axisTitle(title.value.view(), axisIndex == Gen::ChannelId::x), {.alpha = weight, .flip = upsideDown}); @@ -261,7 +261,10 @@ void DrawAxes::drawDimensionLabels(bool horizontal) const canvas.setFont(Gfx::Font{labelStyle}); for (auto it = axis.begin(); it != axis.end(); ++it) { - drawDimensionLabel(horizontal, origo, it, axis.category); + drawDimensionLabel(horizontal, + origo, + it, + axis.category.view()); } } } @@ -329,11 +332,13 @@ void DrawAxes::drawDimensionLabel(bool horizontal, posDir = posDir.extend(sign); - auto draw = [&](const ::Anim::Weighted &str, - double plusWeight = 1.0) + auto draw = + [&](const ::Anim::Weighted + &str, + double plusWeight = 1.0) { drawLabel.draw(canvas, - str.value, + str.value.c_str(), posDir, labelStyle, 0, @@ -341,8 +346,8 @@ void DrawAxes::drawDimensionLabel(bool horizontal, 1.0, *rootEvents.draw.plot.axis.label, Events::Targets::dimAxisLabel(category, - categoryVal, - categoryVal, + categoryVal.view(), + categoryVal.view(), horizontal)); }; diff --git a/src/chart/rendering/drawchart.cpp b/src/chart/rendering/drawchart.cpp index 0147a7b9b..705ba8ed2 100644 --- a/src/chart/rendering/drawchart.cpp +++ b/src/chart/rendering/drawchart.cpp @@ -59,7 +59,7 @@ void DrawChart::drawHeading(Gfx::ICanvas &canvas, if (weighted.value.has_value()) { DrawLabel{{ctx()}}.draw(canvas, Geom::TransformedRect::fromRect(layout), - *weighted.value, + weighted.value->c_str(), style, event, targetGetter(*weighted.value), diff --git a/src/chart/rendering/drawinterlacing.cpp b/src/chart/rendering/drawinterlacing.cpp index b61da9078..734f38534 100644 --- a/src/chart/rendering/drawinterlacing.cpp +++ b/src/chart/rendering/drawinterlacing.cpp @@ -269,7 +269,7 @@ void DrawInterlacing::drawDataLabel( *labelStyle.numberScale, wUnit.value); drawLabel.draw(canvas, - str, + str.c_str(), posDir, labelStyle, 0, diff --git a/src/chart/rendering/drawlabel.cpp b/src/chart/rendering/drawlabel.cpp index 041373fcc..b6253958d 100644 --- a/src/chart/rendering/drawlabel.cpp +++ b/src/chart/rendering/drawlabel.cpp @@ -5,7 +5,7 @@ namespace Vizzu::Draw void DrawLabel::draw(Gfx::ICanvas &canvas, const Geom::TransformedRect &fullRect, - const std::string &text, + const char *text, const Styles::Label &style, Util::EventDispatcher::Event &onDraw, std::unique_ptr eventTarget, diff --git a/src/chart/rendering/drawlabel.h b/src/chart/rendering/drawlabel.h index dff6e0b8b..638ff3112 100644 --- a/src/chart/rendering/drawlabel.h +++ b/src/chart/rendering/drawlabel.h @@ -23,7 +23,7 @@ class DrawLabel : public DrawingContext void draw(Gfx::ICanvas &canvas, const Geom::TransformedRect &fullRect, - const std::string &text, + const char *text, const Styles::Label &style, Util::EventDispatcher::Event &onDraw, std::unique_ptr eventTarget, diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 3ba7c60d1..4b2f66269 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -64,10 +64,11 @@ void DrawLegend::drawTitle(const Info &info) const DrawLabel{{ctx()}}.draw(info.canvas, Geom::TransformedRect::fromRect(rect), - title.value, + title.value.c_str(), style.title, *events.title, - Events::Targets::legendTitle(title.value, info.type), + Events::Targets::legendTitle(title.value.view(), + info.type), {.alpha = title.weight * info.weight * mul}); }); } @@ -90,7 +91,7 @@ void DrawLegend::drawDimension(const Info &info) const && Math::FuzzyBool{info.weight}}; drawMarker(info, - value.second.categoryValue, + value.second.categoryValue.view(), colorBuilder.render(value.second.colorBase) * double{alpha}, getMarkerRect(info, itemRect)); @@ -100,13 +101,13 @@ void DrawLegend::drawDimension(const Info &info) const { label.draw(info.canvas, getLabelRect(info, itemRect), - weighted.value, + weighted.value.c_str(), style.label, *events.label, Events::Targets::dimLegendLabel( - info.dimension.category, - value.second.categoryValue, - value.second.categoryValue, + info.dimension.category.view(), + value.second.categoryValue.view(), + value.second.categoryValue.view(), info.type), {.alpha = double{ alpha && Math::FuzzyBool{weighted.weight}}}); @@ -158,7 +159,7 @@ void DrawLegend::drawMarker(const Info &info, * rect.size.minSize() / 2.0; auto markerElement = - Events::Targets::legendMarker(info.dimension.category, + Events::Targets::legendMarker(info.dimension.category.view(), categoryValue, info.type); @@ -204,7 +205,7 @@ void DrawLegend::drawMeasure(const Info &info) const void DrawLegend::extremaLabel(const Info &info, double value, - const std::string &unit, + const Text::immutable_string &unit, int pos, double plusWeight) const { @@ -216,7 +217,7 @@ void DrawLegend::extremaLabel(const Info &info, DrawLabel{{ctx()}}.draw(info.canvas, getLabelRect(info, getItemRect(info, pos)), - text, + text.c_str(), style.label, *events.label, Events::Targets::measLegendLabel(text, info.type), diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index c77638b3a..b5d2c9fad 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -60,7 +60,7 @@ class DrawLegend : public DrawingContext void extremaLabel(const Info &info, double value, - const std::string &unit, + const Text::immutable_string &unit, int pos, double plusWeight) const; void colorBar(const Info &info, const Geom::Rect &rect) const; diff --git a/src/chart/rendering/drawmarkerinfo.cpp b/src/chart/rendering/drawmarkerinfo.cpp index 695c0efee..9169d11e5 100644 --- a/src/chart/rendering/drawmarkerinfo.cpp +++ b/src/chart/rendering/drawmarkerinfo.cpp @@ -102,7 +102,7 @@ void DrawMarkerInfo::MarkerDC::fillTextBox(Content &cnt) text << static_cast(parent.style) << static_cast( parent.style.fontSize->get() * 1.3) - << TextBox::bold << val; + << TextBox::bold << val.toString(); if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::NewLine(); @@ -121,12 +121,12 @@ void DrawMarkerInfo::MarkerDC::fillTextBox(Content &cnt) if (parent.style.layout == Styles::Tooltip::Layout::singleLine && std::exchange(was_first, true)) text << ", "; - text << cid << ": "; + text << cid.toString() << ": "; if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::Tab(); - text << TextBox::bold << val; + text << TextBox::bold << val.c_str(); if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::NewLine(); diff --git a/src/chart/rendering/markerrenderer.cpp b/src/chart/rendering/markerrenderer.cpp index 8e7b16a10..f423e7e70 100644 --- a/src/chart/rendering/markerrenderer.cpp +++ b/src/chart/rendering/markerrenderer.cpp @@ -157,7 +157,7 @@ void MarkerRenderer::drawMarkers(Gfx::ICanvas &canvas, blended.marker.prevMainMarker.combine( [](const Gen::Marker::MarkerIndexPosition &pos) { - return pos.idx != ~Gen::Marker::MarkerIndex{}; + return !pos.idx.empty(); }); if (containsConnected) { if (containsSingle) { @@ -287,7 +287,7 @@ void MarkerRenderer::draw(Gfx::ICanvas &canvas, void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, const AbstractMarker &abstractMarker, - const std::string &unit, + const Text::immutable_string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const { @@ -319,7 +319,7 @@ void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, Styles::MarkerLabel::Position::center); OrientedLabel{{ctx()}}.draw(canvas, - text, + text.c_str(), labelPos, labelStyle, centered, @@ -331,7 +331,7 @@ void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, std::string MarkerRenderer::getLabelText( const ::Anim::Interpolated &label, - const std::string &unit, + const Text::immutable_string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const { diff --git a/src/chart/rendering/markerrenderer.h b/src/chart/rendering/markerrenderer.h index 99b74244a..9ffd51d80 100644 --- a/src/chart/rendering/markerrenderer.h +++ b/src/chart/rendering/markerrenderer.h @@ -33,7 +33,7 @@ class MarkerRenderer : public DrawingContext bool isLine) const; void drawLabel(Gfx::ICanvas &canvas, const AbstractMarker &abstractMarker, - const std::string &unit, + const Text::immutable_string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const; @@ -41,7 +41,7 @@ class MarkerRenderer : public DrawingContext getSelectedColor(const Gen::Marker &marker, bool label) const; [[nodiscard]] std::string getLabelText( const ::Anim::Interpolated &label, - const std::string &unit, + const Text::immutable_string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const; }; diff --git a/src/chart/rendering/markers/connectingmarker.cpp b/src/chart/rendering/markers/connectingmarker.cpp index a3e4dcfd7..1fa061f50 100644 --- a/src/chart/rendering/markers/connectingmarker.cpp +++ b/src/chart/rendering/markers/connectingmarker.cpp @@ -130,9 +130,8 @@ const Gen::Marker *ConnectingMarker::getPrev( { const auto &prevId = marker.prevMainMarker.get_or_first(lineIndex); - return prevId.value.idx != ~Gen::Marker::MarkerIndex{} - ? &markers[prevId.value.pos] - : nullptr; + return prevId.value.idx.empty() ? nullptr + : &markers[prevId.value.pos]; } } \ No newline at end of file diff --git a/src/chart/rendering/orientedlabel.cpp b/src/chart/rendering/orientedlabel.cpp index 97e3d1dd1..bca8810ec 100644 --- a/src/chart/rendering/orientedlabel.cpp +++ b/src/chart/rendering/orientedlabel.cpp @@ -6,7 +6,7 @@ namespace Vizzu::Draw { void OrientedLabel::draw(Gfx::ICanvas &canvas, - const std::string &text, + const char *text, const Geom::Line &labelPos, const Styles::OrientedLabel &labelStyle, double centered, diff --git a/src/chart/rendering/orientedlabel.h b/src/chart/rendering/orientedlabel.h index 7a511dd7b..bb9892f97 100644 --- a/src/chart/rendering/orientedlabel.h +++ b/src/chart/rendering/orientedlabel.h @@ -14,7 +14,7 @@ namespace Vizzu::Draw struct OrientedLabel : DrawLabel { void draw(Gfx::ICanvas &canvas, - const std::string &text, + const char *text, const Geom::Line &labelPos, const Styles::OrientedLabel &labelStyle, double centered, diff --git a/src/dataframe/impl/aggregators.cpp b/src/dataframe/impl/aggregators.cpp index 7c555c9d2..9d1c05fe5 100644 --- a/src/dataframe/impl/aggregators.cpp +++ b/src/dataframe/impl/aggregators.cpp @@ -12,7 +12,8 @@ inline bool is_valid(cell_reference const &value) { const double *d = std::get_if(&value); return d ? !std::isnan(*d) - : *std::get_if(&value) != nullptr; + : *std::get_if(&value) + != nullptr; } Refl::EnumArray @@ -96,15 +97,16 @@ get_aggregators() noexcept {aggrs[static_cast(aggregator_type::distinct)], []() -> custom_aggregator::id_type { - return std::set{}; + return std::set{}; }, [](custom_aggregator::id_type &id, cell_reference const &cell) -> double { - auto &set = - *std::get_if>(&id); - if (const std::string *v = - *std::get_if(&cell)) + auto &set = *std::get_if< + std::set>(&id); + if (const Text::immutable_string *v = + *std::get_if( + &cell)) set.insert(v); return static_cast(set.size()); }}, diff --git a/src/dataframe/impl/data_source.cpp b/src/dataframe/impl/data_source.cpp index daa43206b..9c599a468 100644 --- a/src/dataframe/impl/data_source.cpp +++ b/src/dataframe/impl/data_source.cpp @@ -83,7 +83,8 @@ constexpr void index_erase_if::operator()( std::size_t data_source::get_record_count() const { - if (!finalized.empty()) return finalized.size(); + if (!finalized.record_ids.empty()) + return finalized.record_ids.size(); std::size_t record_count{}; for (const auto &dim : dimensions) @@ -201,10 +202,11 @@ std::size_t data_source::change_series_identifier_type( } std::size_t data_source::change_record_identifier_type( - const std::string &id) const + const Text::immutable_string &id) const { - auto it = finalized.find(id); - return it != finalized.end() ? it->second : ~std::size_t{}; + auto it = finalized.to_record_ix.find(id); + return it != finalized.to_record_ix.end() ? it->second + : ~std::size_t{}; } cell_reference data_source::get_data(std::size_t record_id, @@ -287,12 +289,13 @@ void data_source::remove_series(std::span dims, } void data_source::finalize() { - if (finalized.empty()) { + if (finalized.to_record_ix.empty()) { normalize_sizes(); const auto records = get_record_count(); for (std::size_t r{}; r < records; ++r) - if (!finalized.try_emplace(get_id(r, dimension_names), r) - .second) + if (auto &id = finalized.record_ids.emplace_back( + get_id(r, dimension_names)); + !finalized.to_record_ix.try_emplace(id, r).second) error(error_type::record, "dup"); } } @@ -316,7 +319,7 @@ data_source::dimension_t &data_source::add_new_dimension( data_source::dimension_t &data_source::add_new_dimension( dimension_t &&dim, - std::string_view name) + const Text::immutable_string &name) { auto it = dimension_names.emplace( std::lower_bound(dimension_names.begin(), @@ -345,7 +348,7 @@ data_source::measure_t &data_source::add_new_measure( } data_source::measure_t &data_source::add_new_measure(measure_t &&mea, - std::string_view name) + const Text::immutable_string &name) { auto it = measure_names.emplace(std::lower_bound(measure_names.begin(), @@ -496,26 +499,26 @@ data_source::data_source( } } -std::string data_source::get_id(std::size_t record, - std::span series) const +Text::immutable_string data_source::get_id(std::size_t record, + std::span series) const { std::string res; for (std::size_t ix{}; const auto &name : series) { while (dimension_names[ix] != name) ++ix; const auto *val = dimensions[ix].get(record); - res += name; + res += name.view(); res += ':'; - res += val == nullptr ? std::string_view{"__null__"} : *val; + res += val ? val->view() : std::string_view{"__null__"}; res += ';'; } - return res; + return Text::immutable_string::fromString(res); } std::vector data_source::dimension_t::get_indices( const dataframe_interface::any_sort_type &sorter) const { thread_local const dataframe_interface::any_sort_type *sorts{}; - thread_local const std::vector *cats{}; + thread_local const std::vector *cats{}; sorts = &sorter; cats = &categories; return data_source::get_sorted_indices(categories.size(), @@ -527,9 +530,9 @@ std::vector data_source::dimension_t::get_indices( case sort_type::less: return (*cats)[a] < (*cats)[b]; case sort_type::greater: return (*cats)[b] < (*cats)[a]; case sort_type::natural_less: - return cmp((*cats)[a], (*cats)[b]); + return cmp((*cats)[a].c_str(), (*cats)[b].c_str()); case sort_type::natural_greater: - return cmp((*cats)[b], (*cats)[a]); + return cmp((*cats)[b].c_str(), (*cats)[a].c_str()); } }); } @@ -600,7 +603,7 @@ void data_source::dimension_t::add_more_data( contains_nav = std::any_of(new_values.begin(), new_values.end(), is_nav); } -const std::string *data_source::dimension_t::get( +const Text::immutable_string *data_source::dimension_t::get( std::size_t index) const { return values[index] == nav @@ -685,12 +688,12 @@ std::pair data_source::measure_t::get_min_max() const return {mini, maxi}; } -std::pair +std::pair data_source::aggregating_type::add_aggregated( const_series_data &&data, const aggregator_type &aggregator) { - std::string name; + Text::immutable_string name; switch (data) { using enum series_type; case dimension: name = unsafe_get(data).first; break; @@ -699,8 +702,9 @@ data_source::aggregating_type::add_aggregated( } if (aggregator != aggregator_type::sum) - name = std::string{Refl::enum_name(aggregator)} + '(' + name - + ')'; + name = Text::immutable_string::fromString( + std::string{Refl::enum_name(aggregator)} + '(' + name + + ')'); auto &&[it, succ] = meas.try_emplace(std::move(name), std::move(data), diff --git a/src/dataframe/impl/data_source.h b/src/dataframe/impl/data_source.h index 364c22217..a883b8425 100644 --- a/src/dataframe/impl/data_source.h +++ b/src/dataframe/impl/data_source.h @@ -55,10 +55,13 @@ class data_source : public std::enable_shared_from_this struct dimension_t { - std::vector categories; + std::vector categories; na_position na_pos{na_position::last}; std::vector values; - std::map info; + std::map> + info; bool contains_nav{}; dimension_t() noexcept = default; @@ -88,7 +91,8 @@ class data_source : public std::enable_shared_from_this void add_element(std::string_view const &cat); - [[nodiscard]] const std::string *get(std::size_t index) const; + [[nodiscard]] const Text::immutable_string *get( + std::size_t index) const; void set(std::size_t index, const std::string_view &value); @@ -102,7 +106,10 @@ class data_source : public std::enable_shared_from_this struct measure_t { std::vector values; - std::map info; + std::map> + info; bool contains_nan{}; measure_t() noexcept = default; @@ -121,26 +128,32 @@ class data_source : public std::enable_shared_from_this [[nodiscard]] std::pair get_min_max() const; }; - using final_info = std::map; + struct final_info + { + std::map to_record_ix; + std::vector record_ids; + }; - std::string get_id(std::size_t record, - std::span series) const; + Text::immutable_string get_id(std::size_t record, + std::span series) const; using series_data = Refl::EnumVariant, - std::pair>; + std::pair, + std::pair>; using const_series_data = Refl::EnumVariant, - std::pair>; + std::pair, + std::pair>; // replace these to std::flat_map - std::vector measure_names; // sorted by name + std::vector + measure_names; // sorted by name std::vector measures; - std::vector dimension_names; // sorted by name + std::vector + dimension_names; // sorted by name std::vector dimensions; final_info finalized; @@ -159,15 +172,15 @@ class data_source : public std::enable_shared_from_this struct aggregating_type { - std::map> dims; - std::map, std::less<>> meas; - std::pair add_aggregated( + std::pair add_aggregated( const_series_data &&data, const aggregator_type &aggregator); }; @@ -193,7 +206,7 @@ class data_source : public std::enable_shared_from_this const std::string_view &name) const; std::size_t change_record_identifier_type( - const std::string &id) const; + const Text::immutable_string &id) const; void normalize_sizes(); @@ -221,14 +234,14 @@ class data_source : public std::enable_shared_from_this std::span> info); dimension_t &add_new_dimension(dimension_t &&dim, - std::string_view name); + const Text::immutable_string &name); measure_t &add_new_measure(std::span measure_values, std::string_view name, std::span> info); measure_t &add_new_measure(measure_t &&measure, - std::string_view name); + const Text::immutable_string &name); static std::vector get_sorted_indices( std::size_t max, diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index 536ff09ab..c7fc1d58e 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -72,7 +72,7 @@ dataframe::dataframe(std::shared_ptr other, auto &cp = unsafe_get(source); if (filtered) cp.pre_remove.emplace(*filtered); if (sorted) cp.sorted_indices.emplace(*sorted); - if (!cp.other->finalized.empty()) + if (!cp.other->finalized.record_ids.empty()) state_data.emplace(); } @@ -105,15 +105,18 @@ void valid_measure_aggregator( error(error_type::aggregator, "measure"); } -std::string dataframe::set_aggregate(const std::string_view &series, +Text::immutable_string dataframe::set_aggregate( + const Text::immutable_string &series, const any_aggregator_type &aggregator) & { change_state_to(state_type::aggregating, state_modification_reason::needs_series_type); - switch (get_data_source().get_series(series)) { + switch (get_data_source().get_series(series.view())) { using enum series_type; - default: valid_unexistent_aggregator(series, aggregator); break; + default: + valid_unexistent_aggregator(series.view(), aggregator); + break; case dimension: valid_dimension_aggregator(aggregator); break; case measure: valid_measure_aggregator(aggregator); break; } @@ -121,7 +124,7 @@ std::string dataframe::set_aggregate(const std::string_view &series, change_state_to(state_type::aggregating, state_modification_reason::needs_own_state); - auto &&ser = get_data_source().get_series(series); + auto &&ser = get_data_source().get_series(series.view()); data_source::aggregating_type &aggs = unsafe_get(state_data); @@ -129,28 +132,28 @@ std::string dataframe::set_aggregate(const std::string_view &series, if (!aggs.dims .emplace(unsafe_get(ser)) .second) - error(error_type::duplicated_series, series); + error(error_type::duplicated_series, series.view()); return {}; } auto &&[name, uniq] = aggs.add_aggregated(std::move(ser), aggregator.value()); - if (!uniq) error(error_type::duplicated_series, series); + if (!uniq) error(error_type::duplicated_series, series.view()); return name; } -void dataframe::set_sort(const std::string_view &series, +void dataframe::set_sort(const Text::immutable_string &series, any_sort_type sort, na_position na_pos) & { change_state_to(state_type::sorting, state_modification_reason::needs_series_type); - auto ser = get_data_source().get_series(series); + auto ser = get_data_source().get_series(series.view()); switch (ser) { using enum series_type; - default: error(error_type::series_not_found, series); + default: error(error_type::series_not_found, series.view()); case dimension: { std::optional> indices; if (const auto &dim = unsafe_get(ser).second; @@ -160,7 +163,7 @@ void dataframe::set_sort(const std::string_view &series, && (na_pos == dim.na_pos || !dim.contains_nav)) break; - error(error_type::sort, series); + error(error_type::sort, series.view()); } case measure: switch (sort) { @@ -170,7 +173,7 @@ void dataframe::set_sort(const std::string_view &series, case sort_type::natural_less: case sort_type::natural_greater: case sort_type::by_categories: - error(error_type::sort, series); + error(error_type::sort, series.view()); } break; } @@ -668,17 +671,19 @@ std::string dataframe::as_string() const & return res; } -std::span dataframe::get_dimensions() const & +std::span +dataframe::get_dimensions() const & { return get_data_source().dimension_names; } -std::span dataframe::get_measures() const & +std::span +dataframe::get_measures() const & { return get_data_source().measure_names; } -std::span dataframe::get_categories( +std::span dataframe::get_categories( const std::string_view &dimension) const & { switch (auto &&ser = get_data_source().get_series(dimension)) { @@ -716,12 +721,25 @@ bool dataframe::is_removed(std::size_t record_id) const & return cp && cp->pre_remove && (*cp->pre_remove)[record_id]; } -std::string dataframe::get_record_id_by_dims(std::size_t my_record, - std::span dimensions) const & +Text::immutable_string dataframe::get_record_id_by_dims( + std::size_t my_record, + std::span dimensions) const & { return get_data_source().get_id(my_record, dimensions); } +Text::immutable_string dataframe::get_record_id( + std::size_t my_record) & +{ + if (state_data != state_type::finalized) + error(error_type::record, "get id before finalized"); + + const auto &ids = get_data_source().finalized.record_ids; + if (my_record >= ids.size()) return {}; + + return ids[my_record]; +} + dataframe::series_meta_t dataframe::get_series_meta( const std::string &id) const { @@ -851,22 +869,24 @@ const data_source &dataframe::get_data_source() const : *unsafe_get(source).other; } -std::string_view dataframe::get_series_info( - const std::string_view &id, +Text::immutable_string dataframe::get_series_info( + const Text::immutable_string &id, const char *key) const & { - switch (auto &&ser = get_data_source().get_series(id)) { + switch (auto &&ser = get_data_source().get_series(id.view())) { using enum series_type; default: return {}; case measure: { const auto &info = unsafe_get(ser).second.info; auto it = info.find(key); - return it == info.end() ? std::string_view{} : it->second; + return it == info.end() ? Text::immutable_string{} + : it->second; } case dimension: { const auto &info = unsafe_get(ser).second.info; auto it = info.find(key); - return it == info.end() ? std::string_view{} : it->second; + return it == info.end() ? Text::immutable_string{} + : it->second; } } } diff --git a/src/dataframe/impl/dataframe.h b/src/dataframe/impl/dataframe.h index 7a859390b..a35548fa0 100644 --- a/src/dataframe/impl/dataframe.h +++ b/src/dataframe/impl/dataframe.h @@ -53,11 +53,11 @@ class dataframe [[nodiscard]] static std::shared_ptr create_new(); - [[nodiscard]] std::string set_aggregate( - const std::string_view &series, + [[nodiscard]] Text::immutable_string set_aggregate( + const Text::immutable_string &series, const any_aggregator_type &aggregator) &; - void set_sort(const std::string_view &series, + void set_sort(const Text::immutable_string &series, any_sort_type sort, na_position na_pos) &; @@ -109,25 +109,26 @@ class dataframe [[nodiscard]] std::string as_string() const &; - [[nodiscard]] std::span + [[nodiscard]] std::span get_dimensions() const &; - [[nodiscard]] std::span get_measures() const &; + [[nodiscard]] std::span + get_measures() const &; - [[nodiscard]] std::span get_categories( - const std::string_view &dimension) const &; + [[nodiscard]] std::span + get_categories(const std::string_view &dimension) const &; struct series_meta_t { - std::string_view name; + Text::immutable_string name; series_type type; }; [[nodiscard]] series_meta_t get_series_meta( const std::string &id) const; - [[nodiscard]] std::string_view get_series_info( - const std::string_view &id, + [[nodiscard]] Text::immutable_string get_series_info( + const Text::immutable_string &id, const char *key) const &; [[nodiscard]] cell_reference get_data( @@ -141,9 +142,12 @@ class dataframe [[nodiscard]] bool is_removed(std::size_t record_id) const &; - [[nodiscard]] std::string get_record_id_by_dims( + [[nodiscard]] Text::immutable_string get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const &; + std::span dimensions) const &; + + [[nodiscard]] Text::immutable_string get_record_id( + std::size_t my_record) &; private: void migrate_data(); diff --git a/src/dataframe/interface.cpp b/src/dataframe/interface.cpp index 1a4066959..4d9ef9032 100644 --- a/src/dataframe/interface.cpp +++ b/src/dataframe/interface.cpp @@ -1,5 +1,6 @@ #include "interface.h" +#include #include #include @@ -29,14 +30,15 @@ std::shared_ptr dataframe_interface::copy( return as_impl(this).copy(inherit_sorting); } -std::string dataframe_interface::set_aggregate( - const std::string_view &series, +Text::immutable_string dataframe_interface::set_aggregate( + const Text::immutable_string &series, const any_aggregator_type &aggregator) & { return as_impl(this).set_aggregate(series, aggregator); } -void dataframe_interface::set_sort(const std::string_view &series, +void dataframe_interface::set_sort( + const Text::immutable_string &series, any_sort_type sort, na_position na_pos) & { @@ -134,19 +136,20 @@ void dataframe_interface::fill_na(std::string_view column, void dataframe_interface::finalize() & { as_impl(this).finalize(); } -std::span +std::span dataframe_interface::get_dimensions() const & { return as_impl(this).get_dimensions(); } -std::span +std::span dataframe_interface::get_measures() const & { return as_impl(this).get_measures(); } -std::span dataframe_interface::get_categories( +std::span +dataframe_interface::get_categories( const std::string_view &dimension) const & { return as_impl(this).get_categories(dimension); @@ -164,8 +167,8 @@ std::size_t dataframe_interface::get_record_count() const & return as_impl(this).get_record_count(); } -std::string_view dataframe_interface::get_series_info( - const std::string_view &id, +Text::immutable_string dataframe_interface::get_series_info( + const Text::immutable_string &id, const char *key) const & { return as_impl(this).get_series_info(id, key); @@ -176,11 +179,17 @@ bool dataframe_interface::is_removed(std::size_t record_id) const & return as_impl(this).is_removed(record_id); } -std::string dataframe_interface::get_record_id_by_dims( +Text::immutable_string dataframe_interface::get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const & + std::span dimensions) const & { return as_impl(this).get_record_id_by_dims(my_record, dimensions); } +Text::immutable_string dataframe_interface::get_record_id( + std::size_t my_record) & +{ + return as_impl(this).get_record_id(my_record); +} + } \ No newline at end of file diff --git a/src/dataframe/interface.h b/src/dataframe/interface.h index 629475447..d6568045d 100644 --- a/src/dataframe/interface.h +++ b/src/dataframe/interface.h @@ -9,6 +9,8 @@ #include #include +#include "base/text/immutable_string.h" + namespace Vizzu::Data { struct RowWrapper; @@ -18,7 +20,8 @@ namespace Vizzu::dataframe { using cell_value = std::variant; -using cell_reference = std::variant; +using cell_reference = + std::variant; enum class aggregator_type { sum, @@ -50,10 +53,10 @@ enum class adding_type { struct custom_aggregator { - std::string_view name; + std::variant name; using id_type = std::variant, - std::set>; + std::set>; id_type (*create)(); double (*add)(id_type &, cell_reference const &); @@ -79,7 +82,8 @@ constexpr std::size_t max_size_impl = 26 * sizeof(std::intptr_t); class alignas(align_impl) dataframe_interface { public: - using record_identifier = std::variant; + using record_identifier = + std::variant; using any_aggregator_type = std::optional; @@ -90,16 +94,16 @@ class alignas(align_impl) dataframe_interface [[nodiscard]] std::shared_ptr copy( bool inherit_sorting) const &; - [[nodiscard]] std::string set_aggregate( - const std::string_view &series, + Text::immutable_string set_aggregate( + const Text::immutable_string &series, const any_aggregator_type &aggregator) &; - void aggregate_by(const std::string_view &series) + void aggregate_by(const Text::immutable_string &series) { - [[maybe_unused]] auto &&_ = set_aggregate(series, {}); + set_aggregate(series, {}); } - void set_sort(const std::string_view &series, + void set_sort(const Text::immutable_string &series, any_sort_type sort, na_position na_pos) &; @@ -147,13 +151,14 @@ class alignas(align_impl) dataframe_interface void finalize() &; - [[nodiscard]] std::span + [[nodiscard]] std::span get_dimensions() const &; - [[nodiscard]] std::span get_measures() const &; + [[nodiscard]] std::span + get_measures() const &; - [[nodiscard]] std::span get_categories( - const std::string_view &dimension) const &; + [[nodiscard]] std::span + get_categories(const std::string_view &dimension) const &; [[nodiscard]] cell_reference get_data( const record_identifier &record_id, @@ -161,15 +166,18 @@ class alignas(align_impl) dataframe_interface [[nodiscard]] std::size_t get_record_count() const &; - [[nodiscard]] std::string_view get_series_info( - const std::string_view &id, + [[nodiscard]] Text::immutable_string get_series_info( + const Text::immutable_string &id, const char *key) const &; [[nodiscard]] bool is_removed(std::size_t record_id) const &; - [[nodiscard]] std::string get_record_id_by_dims( + [[nodiscard]] Text::immutable_string get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const &; + std::span dimensions) const &; + + [[nodiscard]] Text::immutable_string get_record_id( + std::size_t my_record) &; // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) alignas(align_impl) std::byte data[max_size_impl]; diff --git a/src/dataframe/old/datatable.cpp b/src/dataframe/old/datatable.cpp index c414f6cbd..548d235c1 100644 --- a/src/dataframe/old/datatable.cpp +++ b/src/dataframe/old/datatable.cpp @@ -95,15 +95,14 @@ void DataCube::check(iterator_t &it) const return; } - it.index.oldAggr = 0; - for (auto &&[dim, ocats, cats, size, ix] : dim_reindex) { - const auto *str_ptr = std::get( - df->get_data(it.index.rid, dim)); + it.index.marker_id = df->get_record_id(it.index.rid); + for (auto &&[dim, cats, size, ix] : dim_reindex) { + const auto *str_ptr = + std::get( + df->get_data(it.index.rid, dim.view())); it.index.old[ix] = str_ptr == nullptr ? cats.size() : str_ptr - cats.data(); - it.index.oldAggr *= size; - it.index.oldAggr += it.index.old[ix]; } } @@ -153,11 +152,10 @@ DataCube::DataCube(const DataTable &table, df->finalize(); for (std::size_t ix{}; const auto &dim : dimensions) { auto &&dimName = dim.getColIndex(); - auto &&cats = table.getDf().get_categories(dimName); + auto &&cats = df->get_categories(dimName.view()); dim_reindex.push_back(DimensionInfo{dimName, cats, - df->get_categories(dimName), - cats.size() + df->has_na(dimName), + cats.size() + df->has_na(dimName.view()), ix++}); } @@ -222,15 +220,15 @@ bool DataCube::empty() const return df->get_measures().empty() && df->get_dimensions().empty(); } -const std::string &DataCube::getName( +Text::immutable_string DataCube::getName( const SeriesIndex &seriesId) const { return measure_names.at( {seriesId.getColIndex(), seriesId.getAggr()}); } -std::string_view DataTable::getUnit( - std::string_view const &colIx) const +Text::immutable_string DataTable::getUnit( + Text::immutable_string const &colIx) const { return df.get_series_info(colIx, "unit"); } @@ -244,13 +242,13 @@ MarkerId DataCube::getId( std::vector> v(sl.size()); for (auto &&[val, comm] : dim_reindex.iterate_common(sl)) { - auto &&[name, ocats, cats, size, ix] = val; + auto &&[name, cats, size, ix] = val; auto &&oldIx = mi.old[ix]; if (comm) { if (v[*comm] = {oldIx, size}; *comm == ll) res.label.emplace(name, - oldIx < ocats.size() ? ocats[oldIx] - : std::string_view{}); + oldIx < cats.size() ? cats[oldIx] + : Text::immutable_string{}); } else res.seriesId = res.seriesId * size + oldIx; @@ -266,19 +264,19 @@ std::string DataCube::joinDimensionValues(const SeriesList &sl, const MultiIndex &index) const { std::string res; - std::vector resColl(sl.size()); + std::vector resColl(sl.size()); for (auto &&[val, comm] : dim_reindex.iterate_common(sl)) if (comm) { - auto &&[name, ocats, cats, size, ix] = val; + auto &&[name, cats, size, ix] = val; auto &&oldIx = index.old[ix]; - resColl[*comm] = oldIx < ocats.size() - ? ocats[oldIx] - : std::string_view{}; + resColl[*comm] = oldIx < cats.size() + ? cats[oldIx] + : Text::immutable_string{}; } for (auto &&sv : resColl) { if (!res.empty()) res += ", "; - res += sv; + res += sv.view(); } return res; } @@ -292,21 +290,22 @@ DataCube::cellInfo(const MultiIndex &index, bool needMarkerInfo) const dim_reindex.size() + df->get_measures().size()); Conv::JSONObj obj{my_res->json}; - obj("index", index.oldAggr); + obj("index", index.marker_id); for (Conv::JSONObj &&dims{obj.nested("categories")}; - auto &&[name, ocats, cats, size, ix] : dim_reindex) { + auto &&[name, cats, size, ix] : dim_reindex) { auto &&cix = index.old[ix]; auto &&cat = - cix < ocats.size() ? ocats[cix] : std::string_view{}; - dims.key(name).primitive(cat); + cix < cats.size() ? cats[cix] : Text::immutable_string{}; + dims.key(name.view()).primitive(cat); if (needMarkerInfo) my_res->markerInfo.emplace_back(name, cat); } for (Conv::JSONObj &&vals{obj.nested("values")}; auto &&meas : df->get_measures()) { - auto val = std::get(df->get_data(index.rid, meas)); - vals.key(meas).primitive(val); + auto val = + std::get(df->get_data(index.rid, meas.view())); + vals.key(meas.view()).primitive(val); if (needMarkerInfo) { thread_local auto conv = Conv::NumberToString{.fractionDigitCount = 3}; @@ -320,7 +319,7 @@ double DataCube::valueAt(const MultiIndex &multiIndex, const SeriesIndex &seriesId) const { return std::get( - df->get_data(multiIndex.rid, getName(seriesId))); + df->get_data(multiIndex.rid, getName(seriesId).view())); } double DataCube::aggregateAt(const MultiIndex &multiIndex, @@ -335,7 +334,7 @@ double DataCube::aggregateAt(const MultiIndex &multiIndex, return std::get( sub_df.get_data(df->get_record_id_by_dims(multiIndex.rid, sub_df.get_dimensions()), - getName(seriesId))); + getName(seriesId).view())); } } // namespace Vizzu::Data diff --git a/src/dataframe/old/datatable.h b/src/dataframe/old/datatable.h index 5c0aaa24b..1b80b405a 100644 --- a/src/dataframe/old/datatable.h +++ b/src/dataframe/old/datatable.h @@ -35,8 +35,8 @@ class DataTable void pushRow(const std::span &cells); - [[nodiscard]] std::string_view getUnit( - std::string_view const &colIx) const; + [[nodiscard]] Text::immutable_string getUnit( + Text::immutable_string const &colIx) const; [[nodiscard]] std::string getInfos() const; @@ -55,15 +55,15 @@ class DataCube public: std::shared_ptr df; - std::map, - std::string> + std::map< + std::pair, + Text::immutable_string> measure_names; struct DimensionInfo { - std::string_view name; - std::span orig_categories; - std::span categories; + Text::immutable_string name; + std::span categories; std::size_t size{}; std::size_t ix{}; @@ -115,7 +115,7 @@ class DataCube const SeriesList &sl, const MultiIndex &index) const; - [[nodiscard]] const std::string &getName( + [[nodiscard]] Text::immutable_string getName( const SeriesIndex &seriesId) const; [[nodiscard]] iterator_t begin() const; diff --git a/src/dataframe/old/types.h b/src/dataframe/old/types.h index 7a2d616e6..1a0a65469 100644 --- a/src/dataframe/old/types.h +++ b/src/dataframe/old/types.h @@ -2,6 +2,7 @@ #ifndef DATAFRAME_OLD_TYPES_H #define DATAFRAME_OLD_TYPES_H +#include #include #include @@ -28,7 +29,7 @@ struct RowWrapper class SeriesIndex { std::string orig_name; - std::string_view sid; + Text::immutable_string sid; std::optional aggr; public: @@ -39,7 +40,7 @@ class SeriesIndex return *aggr; } - [[nodiscard]] const std::string_view &getColIndex() const + [[nodiscard]] const Text::immutable_string &getColIndex() const { return sid; } @@ -114,8 +115,8 @@ class Filter struct SliceIndex { - std::string_view column; - std::string_view value; + Text::immutable_string column; + Text::immutable_string value; [[nodiscard]] bool operator<(const SliceIndex &rhs) const { @@ -128,7 +129,9 @@ struct SliceIndex struct CellInfo { - std::vector> markerInfo; + std::vector< + std::pair> + markerInfo; std::string json; }; @@ -137,7 +140,7 @@ struct MultiIndex { std::size_t rid; std::vector old; - std::size_t oldAggr; + Text::immutable_string marker_id; }; struct MarkerId diff --git a/test/qtest/chart.cpp b/test/qtest/chart.cpp index 9fcadf5e5..01d2da6a5 100644 --- a/test/qtest/chart.cpp +++ b/test/qtest/chart.cpp @@ -43,7 +43,7 @@ void TestChart::prepareData() void TestChart::operator()(Util::EventDispatcher::Params ¶ms, const std::string &) { - std::optional markerId; + std::optional markerId; using Marker = Vizzu::Events::Targets::Marker; using MarkerChild = Vizzu::Events::Targets::MarkerChild; @@ -146,19 +146,18 @@ void TestChart::run() IO::log() << "step 1b"; auto &options = chart.getChart().getOptions(); auto &styles = chart.getChart().getStyles(); - options.dataFilter = - Vizzu::Data::Filter{std::shared_ptr{ - std::shared_ptr{}, - +[](const Vizzu::Data::RowWrapper *row) -> bool - { - return *std::get( - row->get_value("Cat1")) - == std::string_view{"A"} - || *std::get( - row->get_value("Cat2")) - == std::string_view{"b"}; - }}}; + options.dataFilter = Vizzu::Data::Filter{std::shared_ptr< + bool(const Vizzu::Data::RowWrapper *)>{ + std::shared_ptr{}, + +[](const Vizzu::Data::RowWrapper *row) -> bool + { + return *std::get( + row->get_value("Cat1")) + == std::string_view{"A"} + || *std::get( + row->get_value("Cat2")) + == std::string_view{"b"}; + }}}; options.title = "VIZZU Chart - Phase 1b"; styles.legend.marker.type = Vizzu::Styles::Legend::Marker::Type::circle; diff --git a/test/unit/dataframe/interface_test.cpp b/test/unit/dataframe/interface_test.cpp index f06029028..e38450d22 100644 --- a/test/unit/dataframe/interface_test.cpp +++ b/test/unit/dataframe/interface_test.cpp @@ -13,7 +13,7 @@ using record_type = interface::record_type; bool operator==(const cell_reference &ref, const std::string_view &str) { - return *std::get(ref) == str; + return *std::get(ref) == str; } #include "../util/test.h" @@ -61,8 +61,9 @@ struct if_setup for (auto r = 0u; r < data.size(); ++r) { for (auto d = 0u; d < ds; ++d) { - auto gdata = std::get( - df->get_data(r, dims[d])); + auto gdata = + std::get( + df->get_data(r, dims[d])); const auto *ptr = data[r][d]; if (ptr) { assert->*gdata != nullptr; @@ -208,7 +209,9 @@ const static auto tests = [](cell_reference const &cell, std::string &&prefix) { auto str = prefix + " is a string"; - assert->*std::holds_alternative(cell) + assert + ->*std::holds_alternative< + const Text::immutable_string *>(cell) == bool_msg{str}; str = prefix + " is nav"; check->*(std::get(cell) == nullptr) @@ -236,7 +239,7 @@ const static auto tests = check_nav(df->get_data(std::size_t{3}, "d1"), "table_33"); check - ->*(std::get( + ->*(std::get( df->get_data(std::size_t{0}, "d1")) == df->get_categories("d1").data()) == "Not points to the same memory address"_is_true; From a8d5ce9ec0398d46f40caa628c9323f30156afa7 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Fri, 26 Jul 2024 17:46:18 +0200 Subject: [PATCH 02/20] Fix clang tidy --- src/apps/qutils/canvas.cpp | 11 ++++--- src/apps/qutils/canvas.h | 2 +- src/base/anim/interpolated.h | 9 ------ src/base/text/immutable_string.h | 52 ++++++++++++++++++++------------ src/chart/generator/marker.cpp | 3 +- src/chart/generator/marker.h | 4 +-- src/chart/main/events.h | 3 +- src/chart/main/style.cpp | 3 +- src/chart/options/options.cpp | 2 +- src/chart/options/options.h | 2 +- test/qtest/chart.cpp | 4 +-- 11 files changed, 50 insertions(+), 45 deletions(-) diff --git a/src/apps/qutils/canvas.cpp b/src/apps/qutils/canvas.cpp index f80735a64..29fc86ae6 100644 --- a/src/apps/qutils/canvas.cpp +++ b/src/apps/qutils/canvas.cpp @@ -195,12 +195,12 @@ void BaseCanvas::rectangle(const Geom::Rect &rect) painter.drawRect(toQRect(rect)); } -void BaseCanvas::text(const Geom::Rect &rect, std::string_view text) +void BaseCanvas::text(const Geom::Rect &rect, const char *text) { painter.setPen(textPen); painter.drawText(toQRect(rect), Qt::AlignLeft, - QString::fromStdString(std::string{text})); + QString::fromStdString(text)); } void BaseCanvas::setBrushGradient(const Geom::Line &line, @@ -227,13 +227,13 @@ QPen BaseCanvas::brushToPen(const QBrush &brush) } Geom::Size Gfx::ICanvas::textBoundary(const Gfx::Font &font, - std::string_view text) + const char *text) { auto res = QFontMetrics{BaseCanvas::fromGfxFont(font)}.boundingRect( QRect(0, 0, 0, 0), Qt::AlignLeft, - QString::fromStdString(std::string{text})); + QString::fromStdString(text)); return {static_cast(res.width()), static_cast(res.height())}; @@ -262,7 +262,8 @@ QFont BaseCanvas::fromGfxFont(const Gfx::Font &newFont, QFont font) font.setPixelSize(static_cast(newFont.size)); if (!newFont.family.empty()) - font.setFamily(QString::fromStdString(newFont.family)); + font.setFamily( + QString::fromStdString(newFont.family.toString())); font.setWeight(newFont.weight == Gfx::Font::Weight::Bold() ? QFont::Bold diff --git a/src/apps/qutils/canvas.h b/src/apps/qutils/canvas.h index ff0523c56..f0b0aeb6b 100644 --- a/src/apps/qutils/canvas.h +++ b/src/apps/qutils/canvas.h @@ -44,7 +44,7 @@ class BaseCanvas : public Gfx::ICanvas, public Vizzu::Draw::Painter void circle(const Geom::Circle &circle) override; void line(const Geom::Line &line) override; - void text(const Geom::Rect &rect, std::string_view text) override; + void text(const Geom::Rect &rect, const char *text) override; void setBrushGradient(const Geom::Line &line, const Gfx::ColorGradient &gradient) override; diff --git a/src/base/anim/interpolated.h b/src/base/anim/interpolated.h index 19d8ae812..c3a53ab17 100644 --- a/src/base/anim/interpolated.h +++ b/src/base/anim/interpolated.h @@ -85,15 +85,6 @@ template class Interpolated values[0] = Weighted(Conv::parse(str)); } - template - requires(std::is_constructible_v - && !std::same_as - && !std::same_as) - explicit Interpolated(T &&value) - { - values[0] = Weighted(Type{std::forward(value)}); - } - Interpolated &operator=(Type value) { values[0] = Weighted(std::move(value)); diff --git a/src/base/text/immutable_string.h b/src/base/text/immutable_string.h index 83d8f09ef..a08d68e33 100644 --- a/src/base/text/immutable_string.h +++ b/src/base/text/immutable_string.h @@ -2,8 +2,10 @@ #define IMMUTABLE_STRING_H #include +#include #include #include +#include namespace Text { @@ -41,13 +43,15 @@ struct immutable_string std::unique_ptr ptr{ new (std::align_val_t{alignof( impl_t)}) char[sizeof(impl_t) + length + 1]}; - auto *buffer = ptr.get(); - std::strncpy(buffer + sizeof(impl_t), + std::strncpy(ptr.get() + sizeof(impl_t), data, length)[length] = '\0'; + + static_assert(std::is_nothrow_constructible_v); auto res = std::unique_ptr{ - new (buffer) impl_t{1, length}}; - ptr.release(); + new (ptr.release()) impl_t{1, length}}; return res.release(); } }; @@ -59,17 +63,24 @@ struct immutable_string impl{} {} - [[nodiscard]] explicit immutable_string(std::string_view data) : + [[nodiscard]] explicit immutable_string( + const std::string_view &data) : impl(allocator_t{}(data.data(), data.size())) {} template - [[nodiscard]] immutable_string(const char (&data)[N]) : + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) + using CCharArr = const char[N]; + + template + // NOLINTNEXTLINE(google-explicit-constructor) + [[nodiscard]] immutable_string(CCharArr &data) : immutable_string(std::string_view{data, N - 1}) {} template - [[nodiscard]] immutable_string(const char (&&data)[N]) : + // NOLINTNEXTLINE(google-explicit-constructor) + [[nodiscard]] immutable_string(CCharArr &&data) : immutable_string(std::string_view{data, N - 1}) {} @@ -117,7 +128,8 @@ struct immutable_string void decr() { - if (impl && --impl->counter == 0) deleter_t{}(impl); + if (impl && --impl->counter == 0) + deleter_t{}(std::exchange(impl, nullptr)); } [[nodiscard]] const char *c_str() const noexcept @@ -158,12 +170,12 @@ struct immutable_string } [[nodiscard]] friend bool operator==(const immutable_string &lhs, - std::string_view rhs) noexcept + const std::string_view &rhs) noexcept { return lhs.view() == rhs; } - [[nodiscard]] friend bool operator==(std::string_view lhs, + [[nodiscard]] friend bool operator==(const std::string_view &lhs, const immutable_string &rhs) noexcept { return lhs == rhs.view(); @@ -171,13 +183,13 @@ struct immutable_string template [[nodiscard]] friend bool operator==(const immutable_string &lhs, - const char (&rhs)[N]) noexcept + CCharArr &rhs) noexcept { return lhs == std::string_view{rhs, N - 1}; } template - [[nodiscard]] friend bool operator==(const char (&&lhs)[N], + [[nodiscard]] friend bool operator==(CCharArr &lhs, const immutable_string &rhs) noexcept { return std::string_view{lhs, N - 1} == rhs; @@ -185,25 +197,25 @@ struct immutable_string template [[nodiscard]] friend bool operator==(const immutable_string &lhs, - const char (&&rhs)[N]) noexcept + CCharArr &&rhs) noexcept { return lhs == std::string_view{rhs, N - 1}; } template - [[nodiscard]] friend bool operator==(const char (&lhs)[N], + [[nodiscard]] friend bool operator==(CCharArr &&lhs, const immutable_string &rhs) noexcept { return std::string_view{lhs, N - 1} == rhs; } [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - std::string_view rhs) noexcept + const std::string_view &rhs) noexcept { return lhs.view() <=> rhs; } - [[nodiscard]] friend auto operator<=>(std::string_view lhs, + [[nodiscard]] friend auto operator<=>(const std::string_view &lhs, const immutable_string &rhs) noexcept { return lhs <=> rhs.view(); @@ -211,13 +223,13 @@ struct immutable_string template [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - const char (&rhs)[N]) noexcept + CCharArr &rhs) noexcept { return lhs <=> std::string_view{rhs, N - 1}; } template - [[nodiscard]] friend auto operator<=>(const char (&lhs)[N], + [[nodiscard]] friend auto operator<=>(CCharArr &lhs, const immutable_string &rhs) noexcept { return std::string_view{lhs, N - 1} <=> rhs; @@ -225,13 +237,13 @@ struct immutable_string template [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - const char (&&rhs)[N]) noexcept + CCharArr &&rhs) noexcept { return lhs <=> std::string_view{rhs, N - 1}; } template - [[nodiscard]] friend auto operator<=>(const char (&&lhs)[N], + [[nodiscard]] friend auto operator<=>(CCharArr &&lhs, const immutable_string &rhs) noexcept { return std::string_view{lhs, N - 1} <=> rhs; diff --git a/src/chart/generator/marker.cpp b/src/chart/generator/marker.cpp index ac2acae38..a931371a2 100644 --- a/src/chart/generator/marker.cpp +++ b/src/chart/generator/marker.cpp @@ -22,8 +22,7 @@ Marker::Marker(const Options &options, .at(ChannelId::size) .dimensionsWithLevel(), index)), - idx(index.marker_id), - pos{} + idx(index.marker_id) { const auto &channels = options.getChannels(); auto color = getValueForChannel(channels, diff --git a/src/chart/generator/marker.h b/src/chart/generator/marker.h index dc4abd69a..eaf7ba676 100644 --- a/src/chart/generator/marker.h +++ b/src/chart/generator/marker.h @@ -61,12 +61,12 @@ class Marker Id sizeId; MarkerIndex idx; - MarkerPosition pos; + MarkerPosition pos{}; struct MarkerIndexPosition { MarkerIndex idx; - MarkerPosition pos; + MarkerPosition pos{}; friend bool operator==(const MarkerIndexPosition &lhs, const MarkerIndexPosition &rhs) diff --git a/src/chart/main/events.h b/src/chart/main/events.h index aa2f25a25..a666f71f6 100644 --- a/src/chart/main/events.h +++ b/src/chart/main/events.h @@ -194,7 +194,8 @@ class Events std::string_view text; template - explicit Text(std::string_view text, Args &&...args) : + explicit Text(const std::string_view &text, + Args &&...args) : Base(args...), text(text) {} diff --git a/src/chart/main/style.cpp b/src/chart/main/style.cpp index ee0cf82bb..e839b04b3 100644 --- a/src/chart/main/style.cpp +++ b/src/chart/main/style.cpp @@ -8,7 +8,8 @@ namespace Vizzu::Styles const Font &Chart::getDefaultFont() { static const auto instance = - Font{.fontFamily = ::Anim::String("Roboto, sans-serif"), + Font{.fontFamily = ::Anim::String( + ::Text::immutable_string{"Roboto, sans-serif"}), .fontStyle = Gfx::Font::Style::normal, .fontWeight = Gfx::Font::Weight::Normal(), .fontSize = Gfx::Length{12}}; diff --git a/src/chart/options/options.cpp b/src/chart/options/options.cpp index 402689ec0..c9627431f 100644 --- a/src/chart/options/options.cpp +++ b/src/chart/options/options.cpp @@ -215,7 +215,7 @@ bool Options::isShapeValid(const ShapeType &shapeType) const } std::optional Options::getMarkerInfoId( - MarkerIndex id) const + const MarkerIndex &id) const { for (auto &&[gid, mkid] : markersInfo) if (mkid == id) return gid; diff --git a/src/chart/options/options.h b/src/chart/options/options.h index 8e2150552..ffce2b22c 100644 --- a/src/chart/options/options.h +++ b/src/chart/options/options.h @@ -162,7 +162,7 @@ class Options [[nodiscard]] bool isShapeValid(const ShapeType &) const; [[nodiscard]] std::optional getMarkerInfoId( - MarkerIndex) const; + const MarkerIndex &) const; static MarkerInfoId generateMarkerInfoId(); void setAutoParameters(); diff --git a/test/qtest/chart.cpp b/test/qtest/chart.cpp index 01d2da6a5..bd9e4fb3a 100644 --- a/test/qtest/chart.cpp +++ b/test/qtest/chart.cpp @@ -85,7 +85,7 @@ void TestChart::run() IO::log() << "step 5"; auto &options = chart.getChart().getOptions(); options.title = "VIZZU Chart - Phase 5"; - options.showTooltip(13); + options.showTooltip("Cat1:A;Cat2:bíyx;"); chart.getChart().setKeyframe(); chart.getChart().animate({step6}); }; @@ -95,7 +95,7 @@ void TestChart::run() IO::log() << "step 4"; auto &options = chart.getChart().getOptions(); options.title = "VIZZU Chart - Phase 4"; - options.showTooltip(12); + options.showTooltip("Cat1:A;Cat2:aasd;"); chart.getChart().setKeyframe(); chart.getChart().animate({step5}); }; From 7f913824307d4935071e3727f95f36d39d94b143 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 29 Jul 2024 13:48:59 +0200 Subject: [PATCH 03/20] handler ref_wr, simplify optional typetrait + some review, implicit string_view conversion, fix unittests --- src/base/conv/auto_json.h | 12 ++++- src/base/conv/parse.h | 2 +- src/base/conv/tostring.h | 4 +- src/base/gfx/font.cpp | 2 +- src/base/refl/auto_enum.h | 7 +++ src/base/refl/auto_struct.h | 8 ++- src/base/style/paramregistry.h | 5 +- src/base/text/immutable_string.h | 5 +- src/base/type/traits.h | 25 +++++++--- src/chart/animator/styles.h | 2 +- src/chart/generator/plotbuilder.cpp | 5 +- src/chart/main/events.h | 6 +-- src/chart/rendering/drawaxes.cpp | 11 ++--- src/chart/rendering/drawlegend.cpp | 13 +++-- src/dataframe/impl/data_source.cpp | 63 +++++++++++++----------- src/dataframe/impl/data_source.h | 33 +++++++++---- src/dataframe/impl/dataframe.cpp | 67 +++++++++++++------------- src/dataframe/impl/dataframe.h | 8 +-- src/dataframe/interface.cpp | 14 +++--- src/dataframe/interface.h | 8 +-- src/dataframe/old/datatable.cpp | 9 ++-- test/unit/chart/events.cpp | 6 +-- test/unit/dataframe/interface_test.cpp | 55 +++++++++++---------- 23 files changed, 214 insertions(+), 156 deletions(-) diff --git a/src/base/conv/auto_json.h b/src/base/conv/auto_json.h index 2c5d71b84..a8e7c3825 100644 --- a/src/base/conv/auto_json.h +++ b/src/base/conv/auto_json.h @@ -158,12 +158,22 @@ struct JSON && !std::is_same_v, std::nullptr_t> && !std::is_same_v, std::nullopt_t> && !Optional && !StringConvertable - && !SerializableRange && !Tuple) + && !SerializableRange && !Tuple + && !Type::is_reference_wrapper_v) inline void any(const T &val) const { staticObj(val); } + template + requires(!JSONSerializable && !SerializableRange + && !StringConvertable + && Type::is_reference_wrapper_v) + inline void any(const T &val) const + { + any(val.get()); + } + explicit inline JSON(std::string &json) : json(json) {} std::string &json; diff --git a/src/base/conv/parse.h b/src/base/conv/parse.h index afee57413..304c27919 100644 --- a/src/base/conv/parse.h +++ b/src/base/conv/parse.h @@ -22,7 +22,7 @@ template To parse(const std::string &string) else if constexpr (Parsable) { return To::fromString(string); } - else if constexpr (Type::isoptional::value) { + else if constexpr (Type::is_optional_v) { if (string == "null") return std::nullopt; return parse(string); } diff --git a/src/base/conv/tostring.h b/src/base/conv/tostring.h index 58f4cfd53..428d4ae7d 100644 --- a/src/base/conv/tostring.h +++ b/src/base/conv/tostring.h @@ -19,7 +19,7 @@ concept ToStringMember = template requires(ToStringMember || std::is_enum_v - || Type::isoptional::value + || Type::is_optional_v || std::is_constructible_v || std::is_arithmetic_v) std::string toString(const From &value) @@ -27,7 +27,7 @@ std::string toString(const From &value) if constexpr (std::is_enum_v) { return Refl::enum_name(value); } - else if constexpr (Type::isoptional::value) { + else if constexpr (Type::is_optional_v) { if (!value) return "null"; return toString(*value); } diff --git a/src/base/gfx/font.cpp b/src/base/gfx/font.cpp index aadad5f67..905cc2370 100644 --- a/src/base/gfx/font.cpp +++ b/src/base/gfx/font.cpp @@ -74,7 +74,7 @@ std::string Font::toCSS() const res += static_cast(weight) + " "; res += std::to_string(size) + "px "; - res += family.view(); + res += family; return res; } diff --git a/src/base/refl/auto_enum.h b/src/base/refl/auto_enum.h index 46e4442eb..e8f60ea6c 100644 --- a/src/base/refl/auto_enum.h +++ b/src/base/refl/auto_enum.h @@ -208,6 +208,7 @@ struct EnumVariant : std::variant { using base_variant = std::variant; using base_variant::base_variant; + using enum_type = E; [[nodiscard]] constexpr operator E() const noexcept // NOLINT { @@ -264,6 +265,12 @@ constexpr decltype(auto) get_if(EnumVariant *e) return std::get_if(E)>(e); } +template + requires std::same_as +using variant_alternative_t = + std::variant_alternative_t(E), + typename Variant::base_variant>; + } #endif \ No newline at end of file diff --git a/src/base/refl/auto_struct.h b/src/base/refl/auto_struct.h index a3656447f..d32a17aa7 100644 --- a/src/base/refl/auto_struct.h +++ b/src/base/refl/auto_struct.h @@ -213,6 +213,10 @@ template + requires(requires { + T{loophole_ubiq{}..., + loophole_ubiq{}...}; + }) struct loophole_type_list, std::index_sequence> : @@ -227,8 +231,8 @@ struct loophole_type_list -using aggregate_types_t = typename Loophole::loophole_type_list< - std::remove_cvref_t>::type; +using aggregate_types_t = + typename loophole_type_list>::type; } template diff --git a/src/base/style/paramregistry.h b/src/base/style/paramregistry.h index 74895d314..43049bec5 100644 --- a/src/base/style/paramregistry.h +++ b/src/base/style/paramregistry.h @@ -41,9 +41,8 @@ template class ParamRegistry using FromString = void(Root &, const std::string &); using ToString = std::string(const Root &); template - requires(Type::isoptional< - std::remove_cvref_t>>::value) + requires(Type::is_optional_v>>) constexpr inline __attribute__((always_inline)) explicit Accessor(T &&t) : toString( diff --git a/src/base/text/immutable_string.h b/src/base/text/immutable_string.h index a08d68e33..01924acd7 100644 --- a/src/base/text/immutable_string.h +++ b/src/base/text/immutable_string.h @@ -138,7 +138,8 @@ struct immutable_string return view().data(); } - [[nodiscard]] explicit operator std::string_view() const noexcept + // NOLINTNEXTLINE(google-explicit-constructor) + [[nodiscard]] operator std::string_view() const noexcept { if (!impl) return {}; return {std::launder(static_cast( @@ -149,7 +150,7 @@ struct immutable_string [[nodiscard]] std::string_view view() const noexcept { - return static_cast(*this); + return *this; } [[nodiscard]] bool empty() const noexcept diff --git a/src/base/type/traits.h b/src/base/type/traits.h index d76e7ac9c..68152cb07 100644 --- a/src/base/type/traits.h +++ b/src/base/type/traits.h @@ -1,22 +1,35 @@ #ifndef TYPE_TRAITS #define TYPE_TRAITS -#include +#include #include -#include -#include +#include namespace Type { -template -struct isoptional : std::false_type +template +struct is_optional : std::false_type {}; template -struct isoptional> : std::true_type +struct is_optional> : std::true_type {}; +template concept is_optional_v = is_optional::value; + +template +struct is_reference_wrapper : std::false_type +{}; + +template +struct is_reference_wrapper> : + std::true_type +{}; + +template +concept is_reference_wrapper_v = is_reference_wrapper::value; + } #endif diff --git a/src/chart/animator/styles.h b/src/chart/animator/styles.h index 679278ca5..36b28a731 100644 --- a/src/chart/animator/styles.h +++ b/src/chart/animator/styles.h @@ -18,7 +18,7 @@ template class StyleMorph; template class StyleMorph::value>, + std::void_t>, decltype(interpolate(*std::declval(), *std::declval(), double{}))>> : public ::Anim::IElement diff --git a/src/chart/generator/plotbuilder.cpp b/src/chart/generator/plotbuilder.cpp index f7aa13cf4..f1e31696f 100644 --- a/src/chart/generator/plotbuilder.cpp +++ b/src/chart/generator/plotbuilder.cpp @@ -376,14 +376,13 @@ void PlotBuilder::calcMeasureAxis(const Data::DataTable &dataTable, if (type == plot->getOptions()->subAxisType() && plot->getOptions()->align == Base::Align::Type::stretch) { - axis = MeasureAxis{Math::Range::Raw(0, 100), + axis = {Math::Range::Raw(0, 100), "%", meas->getColIndex(), scale.step.getValue()}; } else { - axis = MeasureAxis{range.isReal() - ? range + axis = {range.isReal() ? range : Math::Range::Raw(0, 0), dataTable.getUnit(meas->getColIndex()), meas->getColIndex(), diff --git a/src/chart/main/events.h b/src/chart/main/events.h index a666f71f6..c757a541b 100644 --- a/src/chart/main/events.h +++ b/src/chart/main/events.h @@ -191,13 +191,13 @@ class Events template struct Text : Base { - std::string_view text; + std::string text; template explicit Text(const std::string_view &text, Args &&...args) : Base(args...), - text(text) + text{text} {} void appendToJSON(Conv::JSONObj &&jsonObj) const override @@ -385,7 +385,7 @@ class Events channel); } - static auto legendTitle(std::string_view title, + static auto legendTitle(const std::string_view &title, Gen::ChannelId channel) { return std::make_unique>(title, diff --git a/src/chart/rendering/drawaxes.cpp b/src/chart/rendering/drawaxes.cpp index 1038cb828..861b74204 100644 --- a/src/chart/rendering/drawaxes.cpp +++ b/src/chart/rendering/drawaxes.cpp @@ -235,7 +235,7 @@ void DrawAxes::drawTitle(Gen::ChannelId axisIndex) const title.value.c_str(), titleStyle, *rootEvents.draw.plot.axis.title, - Events::Targets::axisTitle(title.value.view(), + Events::Targets::axisTitle(title.value, axisIndex == Gen::ChannelId::x), {.alpha = weight, .flip = upsideDown}); @@ -261,10 +261,7 @@ void DrawAxes::drawDimensionLabels(bool horizontal) const canvas.setFont(Gfx::Font{labelStyle}); for (auto it = axis.begin(); it != axis.end(); ++it) { - drawDimensionLabel(horizontal, - origo, - it, - axis.category.view()); + drawDimensionLabel(horizontal, origo, it, axis.category); } } } @@ -346,8 +343,8 @@ void DrawAxes::drawDimensionLabel(bool horizontal, 1.0, *rootEvents.draw.plot.axis.label, Events::Targets::dimAxisLabel(category, - categoryVal.view(), - categoryVal.view(), + categoryVal, + categoryVal, horizontal)); }; diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 4b2f66269..dc3779633 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -67,8 +67,7 @@ void DrawLegend::drawTitle(const Info &info) const title.value.c_str(), style.title, *events.title, - Events::Targets::legendTitle(title.value.view(), - info.type), + Events::Targets::legendTitle(title.value, info.type), {.alpha = title.weight * info.weight * mul}); }); } @@ -91,7 +90,7 @@ void DrawLegend::drawDimension(const Info &info) const && Math::FuzzyBool{info.weight}}; drawMarker(info, - value.second.categoryValue.view(), + value.second.categoryValue, colorBuilder.render(value.second.colorBase) * double{alpha}, getMarkerRect(info, itemRect)); @@ -105,9 +104,9 @@ void DrawLegend::drawDimension(const Info &info) const style.label, *events.label, Events::Targets::dimLegendLabel( - info.dimension.category.view(), - value.second.categoryValue.view(), - value.second.categoryValue.view(), + info.dimension.category, + value.second.categoryValue, + value.second.categoryValue, info.type), {.alpha = double{ alpha && Math::FuzzyBool{weighted.weight}}}); @@ -159,7 +158,7 @@ void DrawLegend::drawMarker(const Info &info, * rect.size.minSize() / 2.0; auto markerElement = - Events::Targets::legendMarker(info.dimension.category.view(), + Events::Targets::legendMarker(info.dimension.category, categoryValue, info.type); diff --git a/src/dataframe/impl/data_source.cpp b/src/dataframe/impl/data_source.cpp index 9c599a468..19de86176 100644 --- a/src/dataframe/impl/data_source.cpp +++ b/src/dataframe/impl/data_source.cpp @@ -293,71 +293,78 @@ void data_source::finalize() normalize_sizes(); const auto records = get_record_count(); for (std::size_t r{}; r < records; ++r) - if (auto &id = finalized.record_ids.emplace_back( - get_id(r, dimension_names)); - !finalized.to_record_ix.try_emplace(id, r).second) + if (auto &&[it, success] = + finalized.to_record_ix.try_emplace( + get_id(r, dimension_names), + r); + success) [[likely]] + finalized.record_ids.emplace_back(it->first); + else error(error_type::record, "dup"); } } -data_source::dimension_t &data_source::add_new_dimension( + +const Text::immutable_string &data_source::add_new_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, std::span> info) { - auto it = dimension_names.emplace( - std::lower_bound(dimension_names.begin(), - dimension_names.end(), - name), + auto &&it = dimension_names.emplace( + std::ranges::lower_bound(dimension_names, name), name); - return *dimensions.emplace(dimensions.begin() - + (it - dimension_names.begin()), + dimensions.emplace(dimensions.begin() + + (it - dimension_names.begin()), dimension_categories, dimension_values, info); + return *it; } -data_source::dimension_t &data_source::add_new_dimension( +const Text::immutable_string &data_source::add_new_dimension( dimension_t &&dim, const Text::immutable_string &name) { - auto it = dimension_names.emplace( - std::lower_bound(dimension_names.begin(), - dimension_names.end(), - name), + auto &&it = dimension_names.emplace( + std::ranges::lower_bound(dimension_names, name), name); - return *dimensions.emplace(dimensions.begin() - + (it - dimension_names.begin()), + dimensions.emplace(dimensions.begin() + + (it - dimension_names.begin()), std::move(dim)); + return *it; } -data_source::measure_t &data_source::add_new_measure( +data_source::measure_with_name_ref data_source::add_new_measure( std::span measure_values, std::string_view name, std::span> info) { - auto it = + auto &&it = measure_names.emplace(std::lower_bound(measure_names.begin(), measure_names.end(), name), name); - return *measures.emplace(measures.begin() - + (it - measure_names.begin()), + auto &ref = *measures.emplace(measures.begin() + + (it - measure_names.begin()), measure_values, info); + return {*it, ref}; } -data_source::measure_t &data_source::add_new_measure(measure_t &&mea, +data_source::measure_with_name_ref data_source::add_new_measure( + measure_t &&mea, const Text::immutable_string &name) { - auto it = + auto &&it = measure_names.emplace(std::lower_bound(measure_names.begin(), measure_names.end(), name), name); - return *measures.emplace(measures.begin() - + (it - measure_names.begin()), + auto &ref = *measures.emplace(measures.begin() + + (it - measure_names.begin()), std::move(mea)); + + return {*it, ref}; } std::vector data_source::get_sorted_indices( @@ -409,7 +416,7 @@ data_source::data_source(aggregating_type &&aggregating, name); for (const auto &[name, mea] : meas) { - measure_t &new_mea = add_new_measure({}, name); + measure_t &new_mea = add_new_measure({}, name).second; switch (const auto &ser = std::get<0>(mea)) { using enum series_type; case dimension: @@ -506,9 +513,9 @@ Text::immutable_string data_source::get_id(std::size_t record, for (std::size_t ix{}; const auto &name : series) { while (dimension_names[ix] != name) ++ix; const auto *val = dimensions[ix].get(record); - res += name.view(); + res += name; res += ':'; - res += val ? val->view() : std::string_view{"__null__"}; + res += val ? *val : std::string_view{"__null__"}; res += ';'; } return Text::immutable_string::fromString(res); diff --git a/src/dataframe/impl/data_source.h b/src/dataframe/impl/data_source.h index a883b8425..a8575c500 100644 --- a/src/dataframe/impl/data_source.h +++ b/src/dataframe/impl/data_source.h @@ -131,7 +131,9 @@ class data_source : public std::enable_shared_from_this struct final_info { std::map to_record_ix; - std::vector record_ids; + std::vector< + std::reference_wrapper> + record_ids; }; Text::immutable_string get_id(std::size_t record, @@ -139,13 +141,25 @@ class data_source : public std::enable_shared_from_this using series_data = Refl::EnumVariant, - std::pair>; + std::pair< + std::reference_wrapper, + dimension_t &>, + std::pair< + std::reference_wrapper, + measure_t &>>; + + using measure_with_name_ref = + Refl::variant_alternative_t; using const_series_data = Refl::EnumVariant, - std::pair>; + std::pair< + std::reference_wrapper, + const dimension_t &>, + std::pair< + std::reference_wrapper, + const measure_t &>>; // replace these to std::flat_map std::vector @@ -227,20 +241,21 @@ class data_source : public std::enable_shared_from_this void finalize(); - dimension_t &add_new_dimension( + const Text::immutable_string &add_new_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, std::span> info); - dimension_t &add_new_dimension(dimension_t &&dim, + const Text::immutable_string &add_new_dimension(dimension_t &&dim, const Text::immutable_string &name); - measure_t &add_new_measure(std::span measure_values, + measure_with_name_ref add_new_measure( + std::span measure_values, std::string_view name, std::span> info); - measure_t &add_new_measure(measure_t &&measure, + measure_with_name_ref add_new_measure(measure_t &&measure, const Text::immutable_string &name); static std::vector get_sorted_indices( diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index c7fc1d58e..c6120a482 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -112,11 +112,9 @@ Text::immutable_string dataframe::set_aggregate( change_state_to(state_type::aggregating, state_modification_reason::needs_series_type); - switch (get_data_source().get_series(series.view())) { + switch (get_data_source().get_series(series)) { using enum series_type; - default: - valid_unexistent_aggregator(series.view(), aggregator); - break; + default: valid_unexistent_aggregator(series, aggregator); break; case dimension: valid_dimension_aggregator(aggregator); break; case measure: valid_measure_aggregator(aggregator); break; } @@ -124,7 +122,7 @@ Text::immutable_string dataframe::set_aggregate( change_state_to(state_type::aggregating, state_modification_reason::needs_own_state); - auto &&ser = get_data_source().get_series(series.view()); + auto &&ser = get_data_source().get_series(series); data_source::aggregating_type &aggs = unsafe_get(state_data); @@ -132,13 +130,13 @@ Text::immutable_string dataframe::set_aggregate( if (!aggs.dims .emplace(unsafe_get(ser)) .second) - error(error_type::duplicated_series, series.view()); + error(error_type::duplicated_series, series); return {}; } auto &&[name, uniq] = aggs.add_aggregated(std::move(ser), aggregator.value()); - if (!uniq) error(error_type::duplicated_series, series.view()); + if (!uniq) error(error_type::duplicated_series, series); return name; } @@ -149,11 +147,11 @@ void dataframe::set_sort(const Text::immutable_string &series, change_state_to(state_type::sorting, state_modification_reason::needs_series_type); - auto ser = get_data_source().get_series(series.view()); + auto ser = get_data_source().get_series(series); switch (ser) { using enum series_type; - default: error(error_type::series_not_found, series.view()); + default: error(error_type::series_not_found, series); case dimension: { std::optional> indices; if (const auto &dim = unsafe_get(ser).second; @@ -163,7 +161,7 @@ void dataframe::set_sort(const Text::immutable_string &series, && (na_pos == dim.na_pos || !dim.contains_nav)) break; - error(error_type::sort, series.view()); + error(error_type::sort, series); } case measure: switch (sort) { @@ -173,7 +171,7 @@ void dataframe::set_sort(const Text::immutable_string &series, case sort_type::natural_less: case sort_type::natural_greater: case sort_type::by_categories: - error(error_type::sort, series.view()); + error(error_type::sort, series); } break; } @@ -197,7 +195,7 @@ void dataframe::set_custom_sort( error(error_type::unimplemented, "cus sort"); } -void dataframe::add_dimension( +const Text::immutable_string &dataframe::add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -220,12 +218,11 @@ void dataframe::add_dimension( unsafe_get(state_data) .emplace_back(name); - unsafe_get(source)->add_new_dimension( - dimension_categories, - dimension_values, - name, - info); - break; + return unsafe_get(source) + ->add_new_dimension(dimension_categories, + dimension_values, + name, + info); } case series_type::dimension: { if (adding_strategy == adding_type::create_or_throw) @@ -234,9 +231,9 @@ void dataframe::add_dimension( change_state_to(state_type::modifying, state_modification_reason::needs_own_state); - auto &dims = unsafe_get( - unsafe_get(source)->get_series(name)) - .second; + auto &&[nref, dims] = unsafe_get( + unsafe_get(source)->get_series( + name)); switch (adding_strategy) { case adding_type::create_or_throw: @@ -264,14 +261,15 @@ void dataframe::add_dimension( break; } } - break; + return nref; } case series_type::measure: error(error_type::duplicated_series, name); } } -void dataframe::add_measure(std::span measure_values, +const Text::immutable_string &dataframe::add_measure( + std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) & @@ -292,11 +290,9 @@ void dataframe::add_measure(std::span measure_values, unsafe_get(state_data) .emplace_back(name); - unsafe_get(source)->add_new_measure( - measure_values, - name, - info); - break; + return unsafe_get(source) + ->add_new_measure(measure_values, name, info) + .first; } case series_type::measure: { if (adding_strategy == adding_type::create_or_throw) @@ -305,9 +301,9 @@ void dataframe::add_measure(std::span measure_values, change_state_to(state_type::modifying, state_modification_reason::needs_own_state); - auto &meas = unsafe_get( - unsafe_get(source)->get_series(name)) - .second; + auto &&[nref, meas] = unsafe_get( + unsafe_get(source)->get_series( + name)); switch (adding_strategy) { case adding_type::create_or_throw: @@ -332,19 +328,22 @@ void dataframe::add_measure(std::span measure_values, break; } } - break; + return nref; } case series_type::dimension: error(error_type::duplicated_series, name); } } -void dataframe::add_series_by_other(std::string_view, +const Text::immutable_string &dataframe::add_series_by_other( + std::string_view, std::string_view, const std::function &, std::span>) & { if (as_if()) error(error_type::unimplemented, "by oth"); + thread_local const Text::immutable_string s{}; + return s; } void dataframe::remove_series( @@ -873,7 +872,7 @@ Text::immutable_string dataframe::get_series_info( const Text::immutable_string &id, const char *key) const & { - switch (auto &&ser = get_data_source().get_series(id.view())) { + switch (auto &&ser = get_data_source().get_series(id)) { using enum series_type; default: return {}; case measure: { diff --git a/src/dataframe/impl/dataframe.h b/src/dataframe/impl/dataframe.h index a35548fa0..c565598d4 100644 --- a/src/dataframe/impl/dataframe.h +++ b/src/dataframe/impl/dataframe.h @@ -65,7 +65,7 @@ class dataframe const std::function &custom_sort) &; - void add_dimension( + const Text::immutable_string &add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -73,13 +73,15 @@ class dataframe std::span> info) &; - void add_measure(std::span measure_values, + const Text::immutable_string &add_measure( + std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) &; - void add_series_by_other(std::string_view curr_series, + const Text::immutable_string &add_series_by_other( + std::string_view curr_series, std::string_view name, const std::function &value_transform, diff --git a/src/dataframe/interface.cpp b/src/dataframe/interface.cpp index 4d9ef9032..5a15d985e 100644 --- a/src/dataframe/interface.cpp +++ b/src/dataframe/interface.cpp @@ -52,40 +52,40 @@ void dataframe_interface::set_custom_sort( as_impl(this).set_custom_sort(custom_sort); } -void dataframe_interface::add_dimension( +const Text::immutable_string &dataframe_interface::add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, adding_type adding_strategy, std::span> info) & { - as_impl(this).add_dimension(dimension_categories, + return as_impl(this).add_dimension(dimension_categories, dimension_values, name, adding_strategy, info); } -void dataframe_interface::add_measure( +const Text::immutable_string &dataframe_interface::add_measure( std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) & { - as_impl(this).add_measure(measure_values, + return as_impl(this).add_measure(measure_values, name, adding_strategy, info); } -void dataframe_interface::add_series_by_other( - std::string_view curr_series, +const Text::immutable_string & +dataframe_interface::add_series_by_other(std::string_view curr_series, std::string_view name, const std::function &value_transform, std::span> info) & { - as_impl(this).add_series_by_other(curr_series, + return as_impl(this).add_series_by_other(curr_series, name, value_transform, info); diff --git a/src/dataframe/interface.h b/src/dataframe/interface.h index d6568045d..bc2579dc2 100644 --- a/src/dataframe/interface.h +++ b/src/dataframe/interface.h @@ -111,7 +111,7 @@ class alignas(align_impl) dataframe_interface const std::function &custom_sort) &; - void add_dimension( + const Text::immutable_string &add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -119,13 +119,15 @@ class alignas(align_impl) dataframe_interface std::span> info) &; - void add_measure(std::span measure_values, + const Text::immutable_string &add_measure( + std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) &; - void add_series_by_other(std::string_view curr_series, + const Text::immutable_string &add_series_by_other( + std::string_view curr_series, std::string_view name, const std::function &value_transform, diff --git a/src/dataframe/old/datatable.cpp b/src/dataframe/old/datatable.cpp index 548d235c1..0a7e7214e 100644 --- a/src/dataframe/old/datatable.cpp +++ b/src/dataframe/old/datatable.cpp @@ -99,7 +99,7 @@ void DataCube::check(iterator_t &it) const for (auto &&[dim, cats, size, ix] : dim_reindex) { const auto *str_ptr = std::get( - df->get_data(it.index.rid, dim.view())); + df->get_data(it.index.rid, dim)); it.index.old[ix] = str_ptr == nullptr ? cats.size() : str_ptr - cats.data(); @@ -303,8 +303,7 @@ DataCube::cellInfo(const MultiIndex &index, bool needMarkerInfo) const for (Conv::JSONObj &&vals{obj.nested("values")}; auto &&meas : df->get_measures()) { - auto val = - std::get(df->get_data(index.rid, meas.view())); + auto val = std::get(df->get_data(index.rid, meas)); vals.key(meas.view()).primitive(val); if (needMarkerInfo) { thread_local auto conv = @@ -319,7 +318,7 @@ double DataCube::valueAt(const MultiIndex &multiIndex, const SeriesIndex &seriesId) const { return std::get( - df->get_data(multiIndex.rid, getName(seriesId).view())); + df->get_data(multiIndex.rid, getName(seriesId))); } double DataCube::aggregateAt(const MultiIndex &multiIndex, @@ -334,7 +333,7 @@ double DataCube::aggregateAt(const MultiIndex &multiIndex, return std::get( sub_df.get_data(df->get_record_id_by_dims(multiIndex.rid, sub_df.get_dimensions()), - getName(seriesId).view())); + getName(seriesId))); } } // namespace Vizzu::Data diff --git a/test/unit/chart/events.cpp b/test/unit/chart/events.cpp index bceea4711..eca6e6d3f 100644 --- a/test/unit/chart/events.cpp +++ b/test/unit/chart/events.cpp @@ -12,9 +12,9 @@ using test::operator""_is_true; using test::operator""_is_false; Geom::Size Gfx::ICanvas::textBoundary(const Font &font, - const std::string &text) + const char *text) { - return {static_cast(text.size()) * font.size / 2.0, + return {static_cast(std::strlen(text)) * font.size / 2.0, font.size}; } @@ -48,7 +48,7 @@ struct MyCanvas final : Gfx::ICanvas, Vizzu::Draw::Painter void rectangle(const Geom::Rect &) final {} void circle(const Geom::Circle &) final {} void line(const Geom::Line &) final {} - void text(const Geom::Rect &, const std::string &) final {} + void text(const Geom::Rect &, const char *) final {} void setBrushGradient(const Geom::Line &, const Gfx::ColorGradient &) final {} diff --git a/test/unit/dataframe/interface_test.cpp b/test/unit/dataframe/interface_test.cpp index e38450d22..77fa68a5e 100644 --- a/test/unit/dataframe/interface_test.cpp +++ b/test/unit/dataframe/interface_test.cpp @@ -30,8 +30,8 @@ using test::operator"" _is_true; struct if_setup { - std::vector dims{}; - std::vector meas{}; + std::vector dims{}; + std::vector meas{}; std::vector> data{}; bool copied{}; std::shared_ptr _df{ @@ -126,6 +126,8 @@ static inline const auto one_one_empty_copied = input{[] }, "one one empty copied"}; +using IL_of_sv = std::initializer_list; + const static auto tests = "DataFrame::interface"_suite @@ -137,7 +139,9 @@ const static auto tests = check->*df->get_measures().size() == std::size_t{}; check->*df->get_record_count() == std::size_t{}; - throw_<&interface::get_data>(df, std::size_t{}, {}); + throw_<&interface::get_data>(df, + std::size_t{}, + std::string_view{}); throw_<&interface::get_categories>(df, {}); // throw_<&interface::get_min_max>(df, {}); throw_<&interface::add_series_by_other>(df, @@ -147,7 +151,7 @@ const static auto tests = { if (c.index() == 0) return std::get<0>(c); auto *str = std::get<1>(c); - return str ? *str : std::string_view{}; + return str ? str->view() : std::string_view{}; }}, {}); throw_<&interface::set_aggregate>(df, {}, {}); @@ -174,18 +178,17 @@ const static auto tests = df->add_measure({{0.0, 22.5, nan, 6.0}}, "m1", {}, {}); df->add_measure({{1.0}}, "m2", {}, {}); - assert->*df->get_dimensions() == std::array{"d0", "d1"}; - assert->*df->get_measures() == std::array{"m1", "m2"}; + assert->*df->get_dimensions() == IL_of_sv{"d0", "d1"}; + assert->*df->get_measures() == IL_of_sv{"m1", "m2"}; check->*df->has_na("d0") == "d0 has nav"_is_true; check->*df->has_na("d1") == "d1 has nav"_is_true; check->*df->has_na("m1") == "m1 has nan"_is_true; check->*df->has_na("m2") == "m2 has nan"_is_true; - check->*df->get_categories("d0") == std::array{"a"}; + check->*df->get_categories("d0") == IL_of_sv{"a"}; - assert->*df->get_categories("d1") - == std::array{"t2", "t1", "tt3"}; + assert->*df->get_categories("d1") == IL_of_sv{"t2", "t1", "tt3"}; // check->*df->get_min_max("m1") == std::pair{0.0, 22.5}; @@ -214,7 +217,9 @@ const static auto tests = const Text::immutable_string *>(cell) == bool_msg{str}; str = prefix + " is nav"; - check->*(std::get(cell) == nullptr) + check + ->*(std::get(cell) + == nullptr) == bool_msg{str}; }; @@ -263,7 +268,7 @@ const static auto tests = assert->*df->get_record_count() == std::size_t{2}; check->*df->get_categories("test_dim") - == std::array{"test_dim_val", "test_dim_val2"}; + == IL_of_sv{"test_dim_val", "test_dim_val2"}; // check->*df->get_min_max("test_meas") == std::pair{-1.0, 2.0}; @@ -295,7 +300,7 @@ const static auto tests = }, {}); - assert->*df->get_measures() == std::array{"m0", "m1"}; + assert->*df->get_measures() == IL_of_sv{"m0", "m1"}; check->*df->get_data(std::size_t{0}, "m0") == 0.0; check->*df->get_data(std::size_t{1}, "m0") == 2.0; @@ -323,7 +328,7 @@ const static auto tests = }, {}); - assert->*df->get_dimensions() == std::array{"d1", "d15", + assert->*df->get_dimensions() == IL_of_sv{"d1", "d15", "d2"}; check->*df->get_data(std::size_t{0}, "d15") == "dm15dm2"; @@ -343,8 +348,8 @@ const static auto tests = { df->remove_series({{"m1", "d2", "m3"}}); - assert->*df->get_measures() == std::array{"m2"}; - assert->*df->get_dimensions() == std::array{"d1", "d3"}; + assert->*df->get_measures() == IL_of_sv{"m2"}; + assert->*df->get_dimensions() == IL_of_sv{"d1", "d3"}; assert->*df->get_record_count() == std::size_t{3}; check->*df->get_data(std::size_t{2}, "m2") == 1.5; @@ -374,8 +379,8 @@ const static auto tests = return !s.contains(r.recordId); }); - assert->*df->get_measures() == std::array{"m1"}; - assert->*df->get_dimensions() == std::array{"d1"}; + assert->*df->get_measures() == IL_of_sv{"m1"}; + assert->*df->get_dimensions() == IL_of_sv{"d1"}; assert->*df->get_record_count() == std::size_t{4}; check @@ -519,10 +524,10 @@ auto &&m1t = df->set_aggregate("m1", df->finalize(); - assert->*df->get_dimensions() == std::array{"d1"}; + assert->*df->get_dimensions() == IL_of_sv{"d1"}; assert->*df->get_measures() - == std::array{ + == IL_of_sv{ pure1c, d1c, m1c, @@ -617,8 +622,8 @@ auto &&m1t = df->set_aggregate("m1", df->finalize(); - assert->*df->get_dimensions() == std::array{"d1", "d2"}; - assert->*df->get_measures() == std::array{d3c, d3d}; + assert->*df->get_dimensions() == IL_of_sv{"d1", "d2"}; + assert->*df->get_measures() == IL_of_sv{d3c, d3d}; assert->*df->get_record_count() == std::size_t{6}; @@ -684,9 +689,9 @@ auto &&m1t = df->set_aggregate("m1", assert->*df->get_record_count() == std::size_t{11}; assert->*df->get_categories("d1") - == std::array{"dx0", "dx1", "dx2"}; + == IL_of_sv{"dx0", "dx1", "dx2"}; check->*df->get_categories("d2") - == std::array{"dm2", "dm0", "dm1"}; + == IL_of_sv{"dm2", "dm0", "dm1"}; check->*df->get_data(std::size_t{0}, "d1") == "dx0"; check->*df->get_data(std::size_t{1}, "d1") == "dx0"; @@ -763,9 +768,9 @@ auto &&m1t = df->set_aggregate("m1", assert->*df->get_record_count() == std::size_t{11}; assert->*df->get_categories("d1") - == std::array{"dx2", "dx1", "dx0"}; + == IL_of_sv{"dx2", "dx1", "dx0"}; check->*df->get_categories("d2") - == std::array{"dm2", "dm0", "dm1", "dm8"}; + == IL_of_sv{"dm2", "dm0", "dm1", "dm8"}; check ->*std::get( From d2718b967c2a3f950dfd0944ec3b1a42cedd5bd9 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 29 Jul 2024 14:14:05 +0200 Subject: [PATCH 04/20] self review --- src/chart/rendering/drawmarkerinfo.cpp | 2 +- src/dataframe/impl/data_source.cpp | 24 ++++++++---------------- src/dataframe/impl/dataframe.cpp | 8 ++------ 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/chart/rendering/drawmarkerinfo.cpp b/src/chart/rendering/drawmarkerinfo.cpp index 9169d11e5..ec16fa11d 100644 --- a/src/chart/rendering/drawmarkerinfo.cpp +++ b/src/chart/rendering/drawmarkerinfo.cpp @@ -126,7 +126,7 @@ void DrawMarkerInfo::MarkerDC::fillTextBox(Content &cnt) if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::Tab(); - text << TextBox::bold << val.c_str(); + text << TextBox::bold << val.toString(); if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::NewLine(); diff --git a/src/dataframe/impl/data_source.cpp b/src/dataframe/impl/data_source.cpp index 19de86176..2eaa6a268 100644 --- a/src/dataframe/impl/data_source.cpp +++ b/src/dataframe/impl/data_source.cpp @@ -186,14 +186,10 @@ void data_source::sort(std::vector &&indices) std::size_t data_source::change_series_identifier_type( const std::string_view &name) const { - if (auto it = std::lower_bound(dimension_names.begin(), - dimension_names.end(), - name); + if (auto it = std::ranges::lower_bound(dimension_names, name); it != dimension_names.end() && *it == name) return static_cast(it - dimension_names.begin()); - if (auto it = std::lower_bound(measure_names.begin(), - measure_names.end(), - name); + if (auto it = std::ranges::lower_bound(measure_names, name); it != measure_names.end() && *it == name) return static_cast( std::distance(measure_names.begin(), it)) @@ -339,11 +335,9 @@ data_source::measure_with_name_ref data_source::add_new_measure( std::string_view name, std::span> info) { - auto &&it = - measure_names.emplace(std::lower_bound(measure_names.begin(), - measure_names.end(), - name), - name); + auto &&it = measure_names.emplace( + std::ranges::lower_bound(measure_names, name), + name); auto &ref = *measures.emplace(measures.begin() + (it - measure_names.begin()), measure_values, @@ -355,11 +349,9 @@ data_source::measure_with_name_ref data_source::add_new_measure( measure_t &&mea, const Text::immutable_string &name) { - auto &&it = - measure_names.emplace(std::lower_bound(measure_names.begin(), - measure_names.end(), - name), - name); + auto &&it = measure_names.emplace( + std::ranges::lower_bound(measure_names, name), + name); auto &ref = *measures.emplace(measures.begin() + (it - measure_names.begin()), std::move(mea)); diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index c6120a482..05bd8da75 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -365,9 +365,7 @@ void dataframe::remove_series( auto ix = &unsafe_get(ser).second - s.dimensions.data(); remove_dimensions.insert( - std::lower_bound(remove_dimensions.begin(), - remove_dimensions.end(), - ix), + std::ranges::lower_bound(remove_dimensions, ix), ix); break; } @@ -375,9 +373,7 @@ void dataframe::remove_series( auto ix = &unsafe_get(ser).second - s.measures.data(); remove_measures.insert( - std::lower_bound(remove_measures.begin(), - remove_measures.end(), - ix), + std::ranges::lower_bound(remove_measures, ix), ix); break; } From 781c271f740cd4359ba9d9298fbf1f0cdaf0c6f9 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 29 Jul 2024 15:24:23 +0200 Subject: [PATCH 05/20] Self review 2 --- src/base/gfx/draw/textbox.cpp | 2 +- src/base/gfx/draw/textbox.h | 2 +- src/base/gfx/font.cpp | 4 ++-- src/base/text/naturalcmp.cpp | 5 +++-- src/base/text/naturalcmp.h | 5 ++++- src/chart/rendering/drawmarkerinfo.cpp | 6 +++--- src/dataframe/impl/data_source.cpp | 4 ++-- src/dataframe/impl/dataframe.cpp | 11 ++++++----- src/dataframe/interface.cpp | 2 +- src/dataframe/old/types.h | 4 ++-- 10 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/base/gfx/draw/textbox.cpp b/src/base/gfx/draw/textbox.cpp index 542846c63..a1164a9c9 100644 --- a/src/base/gfx/draw/textbox.cpp +++ b/src/base/gfx/draw/textbox.cpp @@ -65,7 +65,7 @@ TextBox &TextBox::operator<<(const char *str) return *this; } -TextBox &TextBox::operator<<(const std::string &str) +TextBox &TextBox::operator<<(const Text::immutable_string &str) { size.x = size.y = 0; currentTextRun.content += str; diff --git a/src/base/gfx/draw/textbox.h b/src/base/gfx/draw/textbox.h index 46011b79a..b0414d585 100644 --- a/src/base/gfx/draw/textbox.h +++ b/src/base/gfx/draw/textbox.h @@ -80,7 +80,7 @@ class TextBox TextBox &operator<<(const LineSpacing &); TextBox &operator<<(const char *); - TextBox &operator<<(const std::string &); + TextBox &operator<<(const Text::immutable_string &); TextBox &operator<<(const Tab &); TextBox &operator<<(const NewLine &); TextBox &operator<<(const Font &); diff --git a/src/base/gfx/font.cpp b/src/base/gfx/font.cpp index 905cc2370..ad2b0edde 100644 --- a/src/base/gfx/font.cpp +++ b/src/base/gfx/font.cpp @@ -1,10 +1,10 @@ #include "font.h" -#include -#include +#include #include "base/conv/parse.h" #include "base/conv/tostring.h" +#include "base/text/immutable_string.h" namespace Gfx { diff --git a/src/base/text/naturalcmp.cpp b/src/base/text/naturalcmp.cpp index de1326afa..726548f50 100644 --- a/src/base/text/naturalcmp.cpp +++ b/src/base/text/naturalcmp.cpp @@ -14,9 +14,10 @@ NaturalCmp::NaturalCmp(bool ignoreCase, bool ignoreSpace) : ignoreSpace(ignoreSpace) {} -bool NaturalCmp::operator()(const char *op0, const char *op1) const +bool NaturalCmp::operator()(const immutable_string &op0, + const immutable_string &op1) const { - return std::is_lt(cmp(op0, op1)); + return std::is_lt(cmp(op0.c_str(), op1.c_str())); } std::weak_ordering NaturalCmp::cmp(const char *s0, diff --git a/src/base/text/naturalcmp.h b/src/base/text/naturalcmp.h index f41c20273..72d91461f 100644 --- a/src/base/text/naturalcmp.h +++ b/src/base/text/naturalcmp.h @@ -3,6 +3,8 @@ #include +#include "immutable_string.h" + namespace Text { @@ -11,7 +13,8 @@ class NaturalCmp public: explicit NaturalCmp(bool ignoreCase = true, bool ignoreSpace = true); - [[nodiscard]] bool operator()(const char *, const char *) const; + [[nodiscard]] bool operator()(const immutable_string &, + const immutable_string &) const; private: bool ignoreCase; diff --git a/src/chart/rendering/drawmarkerinfo.cpp b/src/chart/rendering/drawmarkerinfo.cpp index ec16fa11d..695c0efee 100644 --- a/src/chart/rendering/drawmarkerinfo.cpp +++ b/src/chart/rendering/drawmarkerinfo.cpp @@ -102,7 +102,7 @@ void DrawMarkerInfo::MarkerDC::fillTextBox(Content &cnt) text << static_cast(parent.style) << static_cast( parent.style.fontSize->get() * 1.3) - << TextBox::bold << val.toString(); + << TextBox::bold << val; if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::NewLine(); @@ -121,12 +121,12 @@ void DrawMarkerInfo::MarkerDC::fillTextBox(Content &cnt) if (parent.style.layout == Styles::Tooltip::Layout::singleLine && std::exchange(was_first, true)) text << ", "; - text << cid.toString() << ": "; + text << cid << ": "; if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::Tab(); - text << TextBox::bold << val.toString(); + text << TextBox::bold << val; if (parent.style.layout == Styles::Tooltip::Layout::multiLine) text << TextBox::NewLine(); diff --git a/src/dataframe/impl/data_source.cpp b/src/dataframe/impl/data_source.cpp index 2eaa6a268..97ab9f8ea 100644 --- a/src/dataframe/impl/data_source.cpp +++ b/src/dataframe/impl/data_source.cpp @@ -529,9 +529,9 @@ std::vector data_source::dimension_t::get_indices( case sort_type::less: return (*cats)[a] < (*cats)[b]; case sort_type::greater: return (*cats)[b] < (*cats)[a]; case sort_type::natural_less: - return cmp((*cats)[a].c_str(), (*cats)[b].c_str()); + return cmp((*cats)[a], (*cats)[b]); case sort_type::natural_greater: - return cmp((*cats)[b].c_str(), (*cats)[a].c_str()); + return cmp((*cats)[b], (*cats)[a]); } }); } diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index 05bd8da75..5732040db 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -127,11 +127,12 @@ Text::immutable_string dataframe::set_aggregate( unsafe_get(state_data); if (ser == series_type::dimension && !aggregator) { - if (!aggs.dims - .emplace(unsafe_get(ser)) - .second) - error(error_type::duplicated_series, series); - return {}; + if (auto &&[it, success] = aggs.dims.emplace( + unsafe_get(ser)); + success) [[likely]] + return it->first; + + error(error_type::duplicated_series, series); } auto &&[name, uniq] = diff --git a/src/dataframe/interface.cpp b/src/dataframe/interface.cpp index 5a15d985e..0f886b521 100644 --- a/src/dataframe/interface.cpp +++ b/src/dataframe/interface.cpp @@ -1,9 +1,9 @@ #include "interface.h" -#include #include #include +#include "base/text/immutable_string.h" #include "impl/dataframe.h" namespace Vizzu::dataframe diff --git a/src/dataframe/old/types.h b/src/dataframe/old/types.h index 1a0a65469..f42d37b41 100644 --- a/src/dataframe/old/types.h +++ b/src/dataframe/old/types.h @@ -2,11 +2,11 @@ #ifndef DATAFRAME_OLD_TYPES_H #define DATAFRAME_OLD_TYPES_H -#include -#include #include #include "../interface.h" +#include "base/text/immutable_string.h" +#include "base/type/uniquelist.h" namespace Vizzu::Data { From 89a7653d59841015fbca27cd23ba47c7cc2bddef Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 29 Jul 2024 16:13:40 +0200 Subject: [PATCH 06/20] Fix ts build with set markerId to string everywhere --- src/apps/weblib/ts-api/plugins/tooltip.ts | 8 ++++---- src/apps/weblib/typeschema-api/config.yaml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/weblib/ts-api/plugins/tooltip.ts b/src/apps/weblib/ts-api/plugins/tooltip.ts index 93305ed1b..33988eafe 100644 --- a/src/apps/weblib/ts-api/plugins/tooltip.ts +++ b/src/apps/weblib/ts-api/plugins/tooltip.ts @@ -8,8 +8,8 @@ export class Tooltip implements Plugin { private _vizzu?: Vizzu private _id = 0 private _animating = false - private _lastMarkerId: number | null = null - private _overedMarkerId: number | null = null + private _lastMarkerId: string | null = null + private _overedMarkerId: string | null = null private _lastMove = new Date().getTime() get hooks(): PluginHooks { @@ -83,7 +83,7 @@ export class Tooltip implements Plugin { } } - _getMarkerId(target: Element | null): number | null { + _getMarkerId(target: Element | null): string | null { if (target && this._isMarker(target)) { return target.index } else if (target && this._isMarkerLabel(target)) { @@ -101,7 +101,7 @@ export class Tooltip implements Plugin { return target.tagName === 'plot-marker-label' } - _in(id: number, markerId: number): void { + _in(id: number, markerId: string): void { if (this._id === id) { if (!this._animating) { this._lastMarkerId = markerId diff --git a/src/apps/weblib/typeschema-api/config.yaml b/src/apps/weblib/typeschema-api/config.yaml index 20b7089ab..6e6e65022 100644 --- a/src/apps/weblib/typeschema-api/config.yaml +++ b/src/apps/weblib/typeschema-api/config.yaml @@ -233,8 +233,8 @@ definitions: type: boolean tooltip: description: | - Index of the marker, the tooltip should be turned on. This parameter is not needed - to set manually, tooltip will be taken care of autamatically when `tooltip` feature - is enabled. - type: number + Unique identifier of the marker, the tooltip should be turned on. This parameter is + not needed to set manually, tooltip will be taken care of automatically when + `tooltip` feature is enabled. + type: string nullable: true From 2cc01f1b060800f989bf0d7a55031a53a09eae38 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Tue, 30 Jul 2024 15:18:27 +0200 Subject: [PATCH 07/20] Fix clang-format/clang-tidy/tests --- src/base/text/immutable_string.h | 5 +- src/chart/generator/plotbuilder.cpp | 22 +- src/dataframe/impl/dataframe.cpp | 21 +- test/e2e/test_cases/test_cases.json | 1592 +++++++++++++-------------- test/e2e/tests/config_tests.json | 3 + test/e2e/tests/features.json | 4 +- test/e2e/tests/fixes.json | 8 +- test/e2e/tests/style_tests.json | 158 +-- 8 files changed, 906 insertions(+), 907 deletions(-) diff --git a/src/base/text/immutable_string.h b/src/base/text/immutable_string.h index 01924acd7..a9a6050a8 100644 --- a/src/base/text/immutable_string.h +++ b/src/base/text/immutable_string.h @@ -43,9 +43,8 @@ struct immutable_string std::unique_ptr ptr{ new (std::align_val_t{alignof( impl_t)}) char[sizeof(impl_t) + length + 1]}; - std::strncpy(ptr.get() + sizeof(impl_t), - data, - length)[length] = '\0'; + std::memcpy(ptr.get() + sizeof(impl_t), data, length); + ptr.get()[sizeof(impl_t) + length] = '\0'; static_assert(std::is_nothrow_constructible_vgetOptions()->markersInfo) map.emplace(mid, ix); - for (auto &&index : dataCube) { - auto &&markerId = index.marker_id; - auto &&[first, last] = map.equal_range(markerId); - auto needInfo = first != last; - - auto &marker = plot->markers.emplace_back(*plot->getOptions(), + for (auto &&index : dataCube) + plot->markers.emplace_back(*plot->getOptions(), dataCube, plot->axises, mainIds, subIds, index, - needInfo); + map.contains(index.marker_id)); - while (first != last) - plot->markersInfo.insert({first++->second, - Plot::MarkerInfo{Plot::MarkerInfoContent{marker}}}); - } std::ranges::stable_sort(plot->markers, std::less{}, std::mem_fn(&Marker::idx)); - for (Marker::MarkerPosition ix{}; auto &marker : plot->markers) + + auto first = map.begin(); + for (Marker::MarkerPosition ix{}; auto &marker : plot->markers) { marker.pos = ix++; + while (first != map.end() && first->first == marker.idx) + plot->markersInfo.insert({first++->second, + Plot::MarkerInfo{Plot::MarkerInfoContent{marker}}}); + } Buckets buckets(plot->markers); auto &&hasMarkerConnection = diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index 5732040db..29f68a4da 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -232,9 +232,9 @@ const Text::immutable_string &dataframe::add_dimension( change_state_to(state_type::modifying, state_modification_reason::needs_own_state); - auto &&[nref, dims] = unsafe_get( - unsafe_get(source)->get_series( - name)); + auto &&ser = + unsafe_get(source)->get_series(name); + auto &[nref, dims] = unsafe_get(ser); switch (adding_strategy) { case adding_type::create_or_throw: @@ -262,7 +262,7 @@ const Text::immutable_string &dataframe::add_dimension( break; } } - return nref; + return nref.get(); } case series_type::measure: error(error_type::duplicated_series, name); @@ -302,9 +302,9 @@ const Text::immutable_string &dataframe::add_measure( change_state_to(state_type::modifying, state_modification_reason::needs_own_state); - auto &&[nref, meas] = unsafe_get( - unsafe_get(source)->get_series( - name)); + auto &&ser = + unsafe_get(source)->get_series(name); + auto &[nref, meas] = unsafe_get(ser); switch (adding_strategy) { case adding_type::create_or_throw: @@ -329,7 +329,7 @@ const Text::immutable_string &dataframe::add_measure( break; } } - return nref; + return nref.get(); } case series_type::dimension: error(error_type::duplicated_series, name); @@ -731,9 +731,8 @@ Text::immutable_string dataframe::get_record_id( error(error_type::record, "get id before finalized"); const auto &ids = get_data_source().finalized.record_ids; - if (my_record >= ids.size()) return {}; - - return ids[my_record]; + return my_record < ids.size() ? ids[my_record] + : Text::immutable_string{}; } dataframe::series_meta_t dataframe::get_series_meta( diff --git a/test/e2e/test_cases/test_cases.json b/test/e2e/test_cases/test_cases.json index 04e134d54..ee1324ff1 100644 --- a/test/e2e/test_cases/test_cases.json +++ b/test/e2e/test_cases/test_cases.json @@ -2,130 +2,130 @@ "suite": "/test/e2e/test_cases", "test": { "basic_animations/anim_order/circle_without_2_carte_horizontal": { - "refs": ["707b6b4"] + "refs": ["acd0168"] }, "basic_animations/anim_order/circle_without_2_carte_vertical": { - "refs": ["08cd5f2"] + "refs": ["6efdd45"] }, "basic_animations/anim_order/rectangle_without_2_carte_bar": { - "refs": ["5e1ae03"] + "refs": ["80c41bb"] }, "basic_animations/anim_order/rectangle_without_2_carte_column": { - "refs": ["cc246ec"] + "refs": ["0152966"] }, "basic_animations/anim_order/rectangle_without_2_polar_bar": { - "refs": ["eb141ed"] + "refs": ["116635f"] }, "basic_animations/anim_order/rectangle_without_2_polar_column": { - "refs": ["defcb7c"] + "refs": ["7142b9f"] }, "basic_animations/coordsystems/area_carte_2_polar": { "refs": ["7bf8202"] }, "basic_animations/coordsystems/circle_without_2_carte": { - "refs": ["2b6fe96"] + "refs": ["90f56e8"] }, "basic_animations/coordsystems/rectangle_carte_2_polar": { "refs": ["531f346"] }, "basic_animations/coordsystems/rectangle_without_2_carte": { - "refs": ["75adcfd"] + "refs": ["b5e8357"] }, "basic_animations/coordsystems/rectangle_without_2_polar": { - "refs": ["86a172d"] + "refs": ["7d46a8c"] }, "basic_animations/labels/axis/circle_negative_2dis_3con": { "refs": ["6bdaf1f"] }, "basic_animations/labels/marker/area_2dis_3con": { - "refs": ["39d15bb"] + "refs": ["c2811cf"] }, "basic_animations/labels/marker/circle_negative_2dis_3con": { - "refs": ["5e06b46"] + "refs": ["b2de592"] }, "basic_animations/labels/marker/line_2dis_3con": { - "refs": ["5c81d7f"] + "refs": ["4e8efd9"] }, "basic_animations/labels/marker/padding_test_rectangle_negative_2dis_3con": { - "refs": ["c62f472"] + "refs": ["cbc1064"] }, "basic_animations/labels/marker/rectangle_negative_2dis_3con": { - "refs": ["f58ae93"] + "refs": ["a313891"] }, "basic_animations/labels/rectangle_labels_rotated_charts": { - "refs": ["55a6243"] + "refs": ["04be7ba"] }, "basic_animations/legend_transitions/color_2discrete_anim": { - "refs": ["baab9d3"] + "refs": ["bfe32e9"] }, "basic_animations/legend_transitions/color_conti_anim": { - "refs": ["cfb244e"] + "refs": ["0afd6ef"] }, "basic_animations/legend_transitions/color_conti_changes_anim": { - "refs": ["10078ce"] + "refs": ["e55b8a3"] }, "basic_animations/legend_transitions/color_conti_discrete_anim": { - "refs": ["89c4261"] + "refs": ["3be3caa"] }, "basic_animations/legend_transitions/color_discrete_anim": { - "refs": ["cc007b9"] + "refs": ["0ebfa38"] }, "basic_animations/legend_transitions/color_discrete_changes_anim": { - "refs": ["bb910de"] + "refs": ["dd717a1"] }, "basic_animations/legend_transitions/color_off_on_anim": { - "refs": ["5156dd2"] + "refs": ["f151191"] }, "basic_animations/legend_transitions/color_off_on_series_anim": { - "refs": ["2da9f16"] + "refs": ["b44f90c"] }, "basic_animations/legend_transitions/lightness_2discrete_anim": { - "refs": ["15d67a8"] + "refs": ["a87a940"] }, "basic_animations/legend_transitions/lightness_conti_anim": { - "refs": ["7fe1a52"] + "refs": ["cbda7f1"] }, "basic_animations/legend_transitions/lightness_conti_discrete_anim": { - "refs": ["ee57d99"] + "refs": ["44f53e8"] }, "basic_animations/legend_transitions/lightness_discrete_anim": { - "refs": ["fc74654"] + "refs": ["81728b4"] }, "basic_animations/legend_transitions/lightness_on_off_anim": { - "refs": ["11310c5"] + "refs": ["79b9008"] }, "basic_animations/legend_transitions/size_2discrete_anim": { - "refs": ["9949259"] + "refs": ["0f0819f"] }, "basic_animations/legend_transitions/size_conti_anim": { - "refs": ["bfd8d87"] + "refs": ["c65ea22"] }, "basic_animations/legend_transitions/size_conti_discrete_anim": { - "refs": ["c86de3e"] + "refs": ["34e86d6"] }, "basic_animations/legend_transitions/size_discrete_anim": { - "refs": ["eabf0b6"] + "refs": ["3463690"] }, "basic_animations/legend_transitions/size_on_off_anim": { - "refs": ["927adbc"] + "refs": ["da8f5bf"] }, "basic_animations/markers_morph/marker_trans_neg_1dis_1con": { "refs": ["92f463e"] }, "basic_animations/someOtherTests/merge_split_area_stream_2dis_1con": { - "refs": ["8a939ae"] + "refs": ["231b713"] }, "basic_animations/someOtherTests/total_time_area_bar": { "refs": ["4439736"] }, "basic_animations/someOtherTests/total_time_area_column": { - "refs": ["4867151"] + "refs": ["4048289"] }, "basic_animations/someOtherTests/total_time_bar_line": { - "refs": ["d4343a8"] + "refs": ["fe56e92"] }, "basic_animations/someOtherTests/total_time_column_line": { - "refs": ["066a848"] + "refs": ["58018b2"] }, "chart_precision/area_negative_x": { "refs": ["94f31c4"] @@ -182,10 +182,10 @@ "refs": ["54a6bdb"] }, "color_palettes/color_conti_gradient": { - "refs": ["42fb179"] + "refs": ["3889ecc"] }, "data_fault_and_formats/column_rectangle_less_disc": { - "refs": ["b9225f0"] + "refs": ["614e44a"] }, "data_fault_and_formats/column_rectangle_more_conti": { "refs": ["c2c2362"] @@ -194,31 +194,31 @@ "refs": ["1b06866"] }, "data_fault_and_formats/rectangle_data_cube": { - "refs": ["4b66407"] + "refs": ["c42f271"] }, "lay_out/full_coxcomb_rectangle_2dis_1con": { - "refs": ["37a8c3c"] + "refs": ["ce31809"] }, "lay_out/full_line_negative_2dis_1con": { - "refs": ["aa89945"] + "refs": ["25f47c5"] }, "lay_out/legend_plot_coxcomb_rectangle_2dis_1con": { "refs": ["92c0270"] }, "lay_out/legend_plot_line_negative_2dis_1con": { - "refs": ["0a6e2b8"] + "refs": ["7e90fd1"] }, "lay_out/plot_coxcomb_rectangle_2dis_1con": { - "refs": ["5b3c669"] + "refs": ["e87f554"] }, "lay_out/plot_line_negative_2dis_1con": { - "refs": ["24c1094"] + "refs": ["68b43ca"] }, "lay_out/title_plot_coxcomb_rectangle_2dis_1con": { - "refs": ["55f7e9d"] + "refs": ["cfdb432"] }, "lay_out/title_plot_line_negative_2dis_1con": { - "refs": ["984f6a4"] + "refs": ["79624bf"] }, "operations/all_operations": { "refs": ["501ed9f"] @@ -263,7 +263,7 @@ "refs": ["603bce9"] }, "operations/filter_tutorial_data/filter_off_anim": { - "refs": ["c572616"] + "refs": ["91d0863"] }, "operations/filter_tutorial_data/line_filter_x": { "refs": ["3f0a4bc"] @@ -293,7 +293,7 @@ "refs": ["e5bfc8f"] }, "operations/histogram_2_drilldown_negative_1dis_1con": { - "refs": ["5295da8"] + "refs": ["bbbbc58"] }, "operations/orientation_tutorial_data/area_orientation": { "refs": ["4673b40"] @@ -317,7 +317,7 @@ "refs": ["478c5f0"] }, "shorthands/column_shorthands": { - "refs": ["ac604d7"] + "refs": ["0db1d39"] }, "static_chart_types/cartesian_coo_sys/area_1dis_1con": { "refs": ["7134f6d"] @@ -329,19 +329,19 @@ "refs": ["0516adb"] }, "static_chart_types/cartesian_coo_sys/bar_stacked_rectangle_negative_2dis_1con": { - "refs": ["f9746a2"] + "refs": ["29274ee"] }, "static_chart_types/cartesian_coo_sys/column_grouped_rectangle_negative_2dis_1con": { - "refs": ["529d7da"] + "refs": ["f5303d9"] }, "static_chart_types/cartesian_coo_sys/column_stacked_rectangle_1dis_1con": { - "refs": ["795ad09"] + "refs": ["e35305d"] }, "static_chart_types/cartesian_coo_sys/column_stacked_rectangle_negative_2dis_1con": { "refs": ["d2fe887"] }, "static_chart_types/cartesian_coo_sys/column_stacked_rectangle_negative_3dis_1con": { - "refs": ["c71a56a"] + "refs": ["786a351"] }, "static_chart_types/cartesian_coo_sys/dotplot_circle_negative_1dis_1con": { "refs": ["3aa634d"] @@ -350,19 +350,19 @@ "refs": ["3fb1574"] }, "static_chart_types/cartesian_coo_sys/icicle_rectangle_2dis_1con": { - "refs": ["e176366"] + "refs": ["66e718e"] }, "static_chart_types/cartesian_coo_sys/line_negative_1dis_1con": { "refs": ["fd3f5de"] }, "static_chart_types/cartesian_coo_sys/line_negative_2dis_1con": { - "refs": ["bd0d23b"] + "refs": ["2f868f0"] }, "static_chart_types/cartesian_coo_sys/marimekko_rectangle_1dis_2con": { "refs": ["1108d45"] }, "static_chart_types/cartesian_coo_sys/marimekko_rectangle_2dis_2con": { - "refs": ["2b1607f"] + "refs": ["cb02b5a"] }, "static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_1dis_1con": { "refs": ["8bb0676"] @@ -371,40 +371,40 @@ "refs": ["fdfd809"] }, "static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_2dis_3con": { - "refs": ["93b7b2b"] + "refs": ["c2df790"] }, "static_chart_types/cartesian_coo_sys/stacked_area_negative_2dis_1con": { - "refs": ["a88156a"] + "refs": ["284fc49"] }, "static_chart_types/cartesian_coo_sys/waterfall_rectangle_bar_negative_2dis_2con": { - "refs": ["c671aec"] + "refs": ["46314bf"] }, "static_chart_types/cartesian_coo_sys/waterfall_rectangle_negative_2dis_1con": { "refs": ["01da8f6"] }, "static_chart_types/polar_coo_sys/NO_spiderweb_area_2dis_1con": { - "refs": ["f5eb9c2"] + "refs": ["eae72ed"] }, "static_chart_types/polar_coo_sys/NO_spiderweb_line_2dis_1con": { - "refs": ["aac8f16"] + "refs": ["ce659d7"] }, "static_chart_types/polar_coo_sys/coxcomb_rectangle_1dis_1con": { - "refs": ["096f583"] + "refs": ["9d92de1"] }, "static_chart_types/polar_coo_sys/coxcomb_stacked_rectangle_2dis_1con": { - "refs": ["e1c1c4e"] + "refs": ["4bdbc14"] }, "static_chart_types/polar_coo_sys/coxcomb_stacked_rectangle_2dis_2con": { - "refs": ["242adab"] + "refs": ["aa75d86"] }, "static_chart_types/polar_coo_sys/radial_rectangle_1dis_1con": { "refs": ["31a9b6e"] }, "static_chart_types/polar_coo_sys/radial_rectangle_2dis_1con": { - "refs": ["1a3d3a4"] + "refs": ["0f9a4b6"] }, "static_chart_types/polar_coo_sys/radial_stacked_rectangle_2dis_1con": { - "refs": ["99a1029"] + "refs": ["72ab59a"] }, "static_chart_types/polar_coo_sys/spiderweb_area_1dis_1con": { "refs": ["bfa0017"] @@ -413,13 +413,13 @@ "refs": ["da21fac"] }, "static_chart_types/polar_coo_sys/sunburst_rectangle_2dis_1con": { - "refs": ["d69ccc0"] + "refs": ["baf73f1"] }, "static_chart_types/polar_coo_sys/sunburst_rectangle_2dis_2con": { - "refs": ["5d5d1ec"] + "refs": ["b551d18"] }, "static_chart_types/without_coo_sys/bubble_circle_1dis_2con": { - "refs": ["1400dd5"] + "refs": ["881efe2"] }, "static_chart_types/without_coo_sys/bubble_circle_2dis_1con": { "refs": ["2c9a31d"] @@ -434,40 +434,40 @@ "refs": ["2590c4f"] }, "web_content/analytical_operations/change_dimension/area_polar_stacked": { - "refs": ["50d870e"] + "refs": ["3bd1b31"] }, "web_content/analytical_operations/change_dimension/area_stacked": { - "refs": ["b7e9b06"] + "refs": ["f23b1fc"] }, "web_content/analytical_operations/change_dimension/column_stacked": { - "refs": ["f666c2a"] + "refs": ["fecad05"] }, "web_content/analytical_operations/change_dimension/dotplot_1": { - "refs": ["ece5e2c"] + "refs": ["2f9639b"] }, "web_content/analytical_operations/change_dimension/dotplot_2": { - "refs": ["54fde50"] + "refs": ["f4e89e0"] }, "web_content/analytical_operations/change_dimension/dotplot_polar": { - "refs": ["c1f4408"] + "refs": ["23548c4"] }, "web_content/analytical_operations/change_dimension/line": { - "refs": ["23b77f9"] + "refs": ["2e65e7b"] }, "web_content/analytical_operations/change_dimension/line_polar": { - "refs": ["50f79a3"] + "refs": ["c631591"] }, "web_content/analytical_operations/compare/area_100percent_stacked": { "refs": ["ce3c1f7"] }, "web_content/analytical_operations/compare/area_polar_split": { - "refs": ["ac12f02"] + "refs": ["6f7d3fd"] }, "web_content/analytical_operations/compare/area_polar_stacked": { "refs": ["617a376"] }, "web_content/analytical_operations/compare/area_split_stacked": { - "refs": ["46fbf67"] + "refs": ["a2b94e9"] }, "web_content/analytical_operations/compare/area_stacked": { "refs": ["071a87b"] @@ -479,7 +479,7 @@ "refs": ["1a662ea"] }, "web_content/analytical_operations/compare/column_groupped_2": { - "refs": ["3cf87e1"] + "refs": ["b753b57"] }, "web_content/analytical_operations/compare/column_split_stacked_1": { "refs": ["05f036b"] @@ -491,22 +491,22 @@ "refs": ["41b1a4e"] }, "web_content/analytical_operations/compare/column_stacked_2": { - "refs": ["a468731"] + "refs": ["e5d6c13"] }, "web_content/analytical_operations/compare/coxcomb_1": { - "refs": ["d472cb0"] + "refs": ["8a155c7"] }, "web_content/analytical_operations/compare/coxcomb_2": { "refs": ["840ecb8"] }, "web_content/analytical_operations/compare/line": { - "refs": ["fded86c"] + "refs": ["8b39d34"] }, "web_content/analytical_operations/compare/line_polar": { - "refs": ["ce56537"] + "refs": ["a412316"] }, "web_content/analytical_operations/compare/stream_stacked": { - "refs": ["e0966ff"] + "refs": ["39ebf7a"] }, "web_content/analytical_operations/compare/waterfall": { "refs": ["16a3b23"] @@ -515,7 +515,7 @@ "refs": ["d3e65de"] }, "web_content/analytical_operations/distribute/existingmeasure_bubble": { - "refs": ["64a4a75"] + "refs": ["f735764"] }, "web_content/analytical_operations/distribute/existingmeasure_bubble_stacked_1": { "refs": ["95df7d9"] @@ -524,16 +524,16 @@ "refs": ["4e0458b"] }, "web_content/analytical_operations/distribute/existingmeasure_column_stacked": { - "refs": ["3712d8d"] + "refs": ["a7699c4"] }, "web_content/analytical_operations/distribute/existingmeasure_coxcomb": { - "refs": ["49f1fbf"] + "refs": ["0fdaa4f"] }, "web_content/analytical_operations/distribute/existingmeasure_dotplot": { - "refs": ["4f4bc72"] + "refs": ["29a1651"] }, "web_content/analytical_operations/distribute/existingmeasure_scatterplot": { - "refs": ["4d77497"] + "refs": ["7127fa1"] }, "web_content/analytical_operations/distribute/existingmeasure_scatterplot_split": { "refs": ["fc103f0"] @@ -542,7 +542,7 @@ "refs": ["1d75210"] }, "web_content/analytical_operations/distribute/newmeasure_column": { - "refs": ["9b5e949"] + "refs": ["2d27e0b"] }, "web_content/analytical_operations/distribute/newmeasure_column_split_stacked": { "refs": ["b235fe2"] @@ -551,7 +551,7 @@ "refs": ["cd7d13d"] }, "web_content/analytical_operations/distribute/newmeasure_dotplot_1": { - "refs": ["f7f0e10"] + "refs": ["c94e8ab"] }, "web_content/analytical_operations/distribute/newmeasure_dotplot_2": { "refs": ["7d277a4"] @@ -560,7 +560,7 @@ "refs": ["e579936"] }, "web_content/analytical_operations/distribute/newmeasure_dotplot_4": { - "refs": ["6f9a654"] + "refs": ["28d1a03"] }, "web_content/analytical_operations/drilldown/area": { "refs": ["495a9f2"] @@ -569,25 +569,25 @@ "refs": ["91db199"] }, "web_content/analytical_operations/drilldown/bubble_and_distribution": { - "refs": ["17b4851"] + "refs": ["6fe0ce6"] }, "web_content/analytical_operations/drilldown/column_1": { - "refs": ["8b635e9"] + "refs": ["aef4b2d"] }, "web_content/analytical_operations/drilldown/column_2": { - "refs": ["a088dc3"] + "refs": ["70d4528"] }, "web_content/analytical_operations/drilldown/column_3": { - "refs": ["2c51570"] + "refs": ["092de02"] }, "web_content/analytical_operations/drilldown/column_4": { - "refs": ["a7f7b04"] + "refs": ["b26b19c"] }, "web_content/analytical_operations/drilldown/column_stacked": { - "refs": ["dcadb20"] + "refs": ["89065e9"] }, "web_content/analytical_operations/drilldown/donut": { - "refs": ["c9c4c7a"] + "refs": ["58e9bc5"] }, "web_content/analytical_operations/drilldown/line_1": { "refs": ["c1e8bf2"] @@ -602,10 +602,10 @@ "refs": ["a1b33ac"] }, "web_content/analytical_operations/drilldown/radial": { - "refs": ["2b0db91"] + "refs": ["0692db7"] }, "web_content/analytical_operations/drilldown/scatterplot": { - "refs": ["34d1b1c"] + "refs": ["42c9b0d"] }, "web_content/analytical_operations/filter/area_polar_stacked": { "refs": ["2a701de"] @@ -620,31 +620,31 @@ "refs": ["3bc3a48"] }, "web_content/analytical_operations/filter/stream_1": { - "refs": ["b6e5f5c"] + "refs": ["4ada756"] }, "web_content/analytical_operations/filter/stream_2": { - "refs": ["2adfbcf"] + "refs": ["6a47661"] }, "web_content/analytical_operations/misc/donut_to_coxcomb": { "refs": ["20caa7e"] }, "web_content/analytical_operations/misc/orientation_marimekko": { - "refs": ["fc4a0da"] + "refs": ["ab117fc"] }, "web_content/analytical_operations/misc/pie_to_donut": { - "refs": ["33cec36"] + "refs": ["f85f020"] }, "web_content/analytical_operations/misc/make_space_with_polar": { "refs": ["3613f10"] }, "web_content/analytical_operations/split/area_polar_stacked": { - "refs": ["ba6973d"] + "refs": ["54259ec"] }, "web_content/analytical_operations/split/area_stacked": { - "refs": ["727d19d"] + "refs": ["9dc28eb"] }, "web_content/analytical_operations/split/column_100percent_stacked": { - "refs": ["ebf8a85"] + "refs": ["66f3770"] }, "web_content/analytical_operations/split/column_stacked": { "refs": ["a4d4832"] @@ -653,7 +653,7 @@ "refs": ["b6a4648"] }, "web_content/analytical_operations/split/radial_stacked": { - "refs": ["3988f25"] + "refs": ["ace9544"] }, "web_content/analytical_operations/split/scatterplot_1": { "refs": ["e05a92c"] @@ -662,19 +662,19 @@ "refs": ["12bf6f0"] }, "web_content/analytical_operations/stretch_to_proportion/area_stacked": { - "refs": ["5107c80"] + "refs": ["964e17a"] }, "web_content/analytical_operations/stretch_to_proportion/column_groupped": { "refs": ["96b9af3"] }, "web_content/analytical_operations/stretch_to_proportion/column_split_stacked": { - "refs": ["988238f"] + "refs": ["9316372"] }, "web_content/analytical_operations/stretch_to_proportion/column_stacked": { - "refs": ["3079652"] + "refs": ["59219ea"] }, "web_content/analytical_operations/stretch_to_proportion/line": { - "refs": ["41c0a87"] + "refs": ["4b32f2f"] }, "web_content/analytical_operations/sum/area_100percent_stacked": { "refs": ["26ad839"] @@ -692,37 +692,37 @@ "refs": ["7de0252"] }, "web_content/analytical_operations/sum/bubble": { - "refs": ["586f58e"] + "refs": ["83f068a"] }, "web_content/analytical_operations/sum/bubble_to_column": { "refs": ["f413cde"] }, "web_content/analytical_operations/sum/bubble_to_coxcomb": { - "refs": ["379fa94"] + "refs": ["17d7f25"] }, "web_content/analytical_operations/sum/bubble_to_radial": { - "refs": ["ee4583e"] + "refs": ["1ef72c9"] }, "web_content/analytical_operations/sum/bubbleplot_1": { "refs": ["122fa97"] }, "web_content/analytical_operations/sum/bubbleplot_2": { - "refs": ["ee5d099"] + "refs": ["26596bb"] }, "web_content/analytical_operations/sum/bubbleplot_to_radial": { - "refs": ["e914cf9"] + "refs": ["f8a8768"] }, "web_content/analytical_operations/sum/column_100percent_stacked": { - "refs": ["8584e94"] + "refs": ["48ced5b"] }, "web_content/analytical_operations/sum/column_1": { - "refs": ["6108206"] + "refs": ["ccd7cf5"] }, "web_content/analytical_operations/sum/column_2": { - "refs": ["ee6e53a"] + "refs": ["89de4ec"] }, "web_content/analytical_operations/sum/column_to_bar": { - "refs": ["5cdbbca"] + "refs": ["7bd1c47"] }, "web_content/analytical_operations/sum/column_to_waterfall": { "refs": ["14f44ce"] @@ -731,25 +731,25 @@ "refs": ["21e1ef1"] }, "web_content/analytical_operations/sum/column_split_stacked": { - "refs": ["0f3cae4"] + "refs": ["b173376"] }, "web_content/analytical_operations/sum/column_stacked_1": { - "refs": ["453ebe8"] + "refs": ["bed5b44"] }, "web_content/analytical_operations/sum/column_stacked_2": { - "refs": ["561a3ac"] + "refs": ["307c663"] }, "web_content/analytical_operations/sum/coxcomb_1": { - "refs": ["c93d5fc"] + "refs": ["9c86538"] }, "web_content/analytical_operations/sum/coxcomb_2": { - "refs": ["551857c"] + "refs": ["7d4cc1d"] }, "web_content/analytical_operations/sum/coxcomb_split": { - "refs": ["f7deace"] + "refs": ["2c05a2f"] }, "web_content/analytical_operations/sum/dotplot": { - "refs": ["c57f423"] + "refs": ["fb77b93"] }, "web_content/analytical_operations/sum/line_1": { "refs": ["ca7384e"] @@ -764,103 +764,103 @@ "refs": ["6915e5a"] }, "web_content/analytical_operations/sum/scatterplot_polar": { - "refs": ["0619709"] + "refs": ["a9121a0"] }, "web_content/analytical_operations/sum/scatterplot": { "refs": ["b77d3f6"] }, "web_content/analytical_operations/sum/stream_stacked": { - "refs": ["797580d"] + "refs": ["a4ddca9"] }, "web_content/analytical_operations/sum/treemap": { - "refs": ["1cb2f0a"] + "refs": ["55e5547"] }, "web_content_removed/animated/composition_comparison_pie_coxcomb_column_2dis_2con": { - "refs": ["27e02f9"] + "refs": ["9d200c9"] }, "web_content_removed/animated/composition_comparison_waterfall_column_2dis_1con": { "refs": ["3a1a33b"] }, "web_content_removed/animated/composition_percentage_area_stream_3dis_1con": { - "refs": ["d16634a"] + "refs": ["50d84b4"] }, "web_content_removed/animated/composition_percentage_column_3dis_1con": { - "refs": ["4cd1059"] + "refs": ["aa96963"] }, "web_content_removed/animated/composition_percentage_column_stream_3dis_1con": { - "refs": ["1b0fba0"] + "refs": ["c71139d"] }, "web_content_removed/animated/distribution_relationship_dotplot_dotplot": { - "refs": ["9bf8509"] + "refs": ["ec9d891"] }, "web_content_removed/animated/drill_aggreg_improve_line": { "refs": ["73da4e3"] }, "web_content_removed/animated/drilldown_aggregate_line": { - "refs": ["ec17fc7"] + "refs": ["67b4a86"] }, "web_content_removed/animated/merge_split_area_stream_3dis_1con": { - "refs": ["c566c83"] + "refs": ["06536d7"] }, "web_content_removed/animated/merge_split_bar": { - "refs": ["620aae4"] + "refs": ["de67b06"] }, "web_content_removed/animated/merge_split_radial_stacked_rectangle_2dis_1con": { - "refs": ["f1518ae"] + "refs": ["99871c5"] }, "web_content_removed/animated/orientation_circle": { - "refs": ["b4a52ae"] + "refs": ["2876ba0"] }, "web_content_removed/animated/orientation_dot_circle": { - "refs": ["9d7bddd"] + "refs": ["a00179a"] }, "web_content_removed/animated/orientation_marimekko_rectangle_2dis_2con": { - "refs": ["dfa221c"] + "refs": ["91d3e81"] }, "web_content_removed/animated/orientation_rectangle": { "refs": ["ec0a978"] }, "web_content_removed/animated/pie_donut2_rectangle_1dis_1con": { - "refs": ["674044a"] + "refs": ["03a7650"] }, "web_content_removed/animated/relationship_comparison_circle_2_bubble_plot": { - "refs": ["a76fe9c"] + "refs": ["c4786ea"] }, "web_content_removed/animated/relationship_total_bubble_plot_column": { - "refs": ["5bc1ab7"] + "refs": ["3813ce5"] }, "web_content_removed/animated/stack_group_area_line": { "refs": ["b654c80"] }, "web_content_removed/animated/stack_group_circle": { - "refs": ["4696a75"] + "refs": ["c084911"] }, "web_content_removed/animated/stack_group_treemap": { - "refs": ["217893d"] + "refs": ["33a434c"] }, "web_content_removed/animated/total_element_bubble_2_bar": { "refs": ["aae3b78"] }, "web_content_removed/animated/total_element_bubble_column": { - "refs": ["e7edc6b"] + "refs": ["d161242"] }, "web_content_removed/animated/treemap_radial": { - "refs": ["168f8ac"] + "refs": ["87eaaa8"] }, "web_content_removed/animated/zoom_area": { - "refs": ["8ec8a9b"] + "refs": ["2e4c0b7"] }, "web_content_removed/animated/zoom_area_polar": { - "refs": ["0feef86"] + "refs": ["b43de07"] }, "web_content_removed/animated/zoom_line": { - "refs": ["8061939"] + "refs": ["74abd9d"] }, "web_content_removed/animated/zoom_line_polar": { - "refs": ["a0fa91a"] + "refs": ["89984a9"] }, "web_content/infinite": { - "refs": ["132ba92"] + "refs": ["3c146bc"] }, "web_content/presets/chart/column": { "refs": ["6ba52a1"] @@ -869,22 +869,22 @@ "refs": ["8005217"] }, "web_content/presets/chart/column_stacked": { - "refs": ["b60b323"] + "refs": ["f62e297"] }, "web_content/presets/chart/column_splitted": { "refs": ["0698419"] }, "web_content/presets/chart/column_percentage": { - "refs": ["2a4d819"] + "refs": ["5097950"] }, "web_content/presets/chart/waterfall": { "refs": ["143534a"] }, "web_content/presets/chart/mekko_stacked": { - "refs": ["ea834e5"] + "refs": ["b200274"] }, "web_content/presets/chart/marimekko": { - "refs": ["3b849f9"] + "refs": ["57d516f"] }, "web_content/presets/chart/bar": { "refs": ["9259b11"] @@ -893,13 +893,13 @@ "refs": ["75ecafc"] }, "web_content/presets/chart/bar_stacked": { - "refs": ["6b7d439"] + "refs": ["3a74df2"] }, "web_content/presets/chart/bar_splitted": { "refs": ["1fd838e"] }, "web_content/presets/chart/bar_percentage": { - "refs": ["2d8b5a1"] + "refs": ["46f8e70"] }, "web_content/presets/chart/lollipop": { "refs": ["34fb91f"] @@ -908,25 +908,25 @@ "refs": ["da33180"] }, "web_content/presets/plot/bubble": { - "refs": ["bd30c91"] + "refs": ["d0afb1c"] }, "web_content/presets/chart/area": { "refs": ["a84101f"] }, "web_content/presets/chart/area_stacked": { - "refs": ["ec96248"] + "refs": ["062410b"] }, "web_content/presets/chart/area_percentage": { - "refs": ["c60db54"] + "refs": ["3fe00c3"] }, "web_content/presets/chart/area_splitted": { "refs": ["b5996be"] }, "web_content/presets/graph/stream": { - "refs": ["4e887e6"] + "refs": ["f707172"] }, "web_content/presets/graph/stream_vertical": { - "refs": ["7f24b7f"] + "refs": ["0c56a02"] }, "web_content/presets/graph/violin": { "refs": ["139a372"] @@ -941,28 +941,28 @@ "refs": ["f0ebd63"] }, "web_content/presets/chart/pie": { - "refs": ["ed587ae"] + "refs": ["67c0319"] }, "web_content/presets/chart/column_polar": { - "refs": ["abd7844"] + "refs": ["4d85e79"] }, "web_content/presets/chart/column_polar_stacked": { - "refs": ["fe7921d"] + "refs": ["84965b4"] }, "web_content/presets/chart/pie_variable_radius": { - "refs": ["319851e"] + "refs": ["432c2e3"] }, "web_content/presets/chart/bar_radial": { "refs": ["ddf8e3c"] }, "web_content/presets/chart/bar_radial_stacked": { - "refs": ["6c4296c"] + "refs": ["f8318c2"] }, "web_content/presets/chart/donut": { - "refs": ["ff19fc5"] + "refs": ["295ae78"] }, "web_content/presets/chart/donut_nested": { - "refs": ["d1684b0"] + "refs": ["2fb9257"] }, "web_content/presets/plot/scatter_polar": { "refs": ["03ae261"] @@ -998,13 +998,13 @@ "refs": ["6ba52a1"] }, "web_content/static/chart/column_grouped": { - "refs": ["4b5078a"] + "refs": ["e38958a"] }, "web_content/static/chart/column_single_stacked": { - "refs": ["0ddd341"] + "refs": ["2cdfb28"] }, "web_content/static/chart/column_stacked": { - "refs": ["514bf91"] + "refs": ["91e37f9"] }, "web_content/static/plot/dot": { "refs": ["13ff196"] @@ -1016,10 +1016,10 @@ "refs": ["bb5831f"] }, "web_content/static/chart/line": { - "refs": ["45770f2"] + "refs": ["cf51769"] }, "web_content/static/chart/marimekko": { - "refs": ["c4ca935"] + "refs": ["bfebcad"] }, "web_content/static/chart/mekko": { "refs": ["1557736"] @@ -1028,37 +1028,37 @@ "refs": ["e3ffc41"] }, "web_content/static/plot/bubble": { - "refs": ["2b6b83d"] + "refs": ["a6d3017"] }, "web_content/static/chart/area_stacked": { - "refs": ["ec96248"] + "refs": ["062410b"] }, "web_content/static/chart/mekko_stacked": { - "refs": ["67962d3"] + "refs": ["583211d"] }, "web_content/static/graph/stream_stacked": { - "refs": ["a9f63a1"] + "refs": ["8d3fb77"] }, "web_content/static/chart/waterfall": { "refs": ["cbe8a00"] }, "web_content/static/chart/line_polar": { - "refs": ["52ba1ce"] + "refs": ["a686c6b"] }, "web_content/static/chart/coxcomb": { - "refs": ["057e46f"] + "refs": ["5c8372a"] }, "web_content/static/chart/donut": { - "refs": ["e03e030"] + "refs": ["e3f5dd1"] }, "web_content/static/chart/pie": { - "refs": ["ed587ae"] + "refs": ["67c0319"] }, "web_content/static/chart/bar_radial": { "refs": ["9565a62"] }, "web_content/static/chart/bar_stacked_radial": { - "refs": ["da9baca"] + "refs": ["094a48d"] }, "web_content/static/chart/area_polar": { "refs": ["04e2cec"] @@ -1079,694 +1079,694 @@ "refs": ["676031c"] }, "ww_animTiming/descartes-polar/01_d-p_r-r-r": { - "refs": ["8014ab2"] + "refs": ["f3739f2"] }, "ww_animTiming/descartes-polar/02_d-p_c-r-c": { - "refs": ["bdfd39a"] + "refs": ["47002cb"] }, "ww_animTiming/descartes-polar/03_d-p_a-r-a": { - "refs": ["6e5369e"] + "refs": ["3f9d91f"] }, "ww_animTiming/descartes-polar/04_d-p_l-r-l": { - "refs": ["26d28da"] + "refs": ["07b6f3f"] }, "ww_animTiming/descartes-polar/05_d-p_r-c-r": { - "refs": ["a402a2e"] + "refs": ["9636ae0"] }, "ww_animTiming/descartes-polar/06_d-p_c-c-c": { - "refs": ["b4bf449"] + "refs": ["9ad65a3"] }, "ww_animTiming/descartes-polar/07_d-p_a-c-a": { - "refs": ["2f175f9"] + "refs": ["8ed5fc1"] }, "ww_animTiming/descartes-polar/08_d-p_l-c-l": { - "refs": ["eacb6b8"] + "refs": ["dfd7b7f"] }, "ww_animTiming/descartes-polar/09_d-p_r-a-r": { - "refs": ["7b6f13b"] + "refs": ["708fde5"] }, "ww_animTiming/descartes-polar/10_d-p_c-a-c": { - "refs": ["c0967ed"] + "refs": ["bdcfd98"] }, "ww_animTiming/descartes-polar/11_d-p_a-a-a": { - "refs": ["e0f1ab3"] + "refs": ["cd6f440"] }, "ww_animTiming/descartes-polar/12_d-p_l-a-l": { - "refs": ["c36ce7f"] + "refs": ["baee998"] }, "ww_animTiming/descartes-polar/13_d-p_r-l-r": { - "refs": ["8eb67ff"] + "refs": ["4658ef6"] }, "ww_animTiming/descartes-polar/14_d-p_c-l-c": { - "refs": ["87ce365"] + "refs": ["19a6cf0"] }, "ww_animTiming/descartes-polar/15_d-p_a-l-a": { - "refs": ["eaa8d56"] + "refs": ["53fb2a3"] }, "ww_animTiming/descartes-polar/16_d-p_l-l-l": { - "refs": ["8a17c62"] + "refs": ["f88bf69"] }, "ww_animTiming/descartes-polar_orient/01_d-p_o_r-r-r": { - "refs": ["8cd71dc"] + "refs": ["555e7b5"] }, "ww_animTiming/descartes-polar_orient/02_d-p_o_c-r-c": { - "refs": ["29e8415"] + "refs": ["11a9697"] }, "ww_animTiming/descartes-polar_orient/03_d-p_o_a-r-a": { - "refs": ["b48937f"] + "refs": ["9b202ff"] }, "ww_animTiming/descartes-polar_orient/04_d-p_o_l-r-l": { - "refs": ["5aeeb3e"] + "refs": ["141f1da"] }, "ww_animTiming/descartes-polar_orient/05_d-p_o_r-c-r": { - "refs": ["fdc68b0"] + "refs": ["1033674"] }, "ww_animTiming/descartes-polar_orient/06_d-p_o_c-c-c": { - "refs": ["ba05361"] + "refs": ["0a73cdb"] }, "ww_animTiming/descartes-polar_orient/07_d-p_o_a-c-a": { - "refs": ["013dd15"] + "refs": ["632f3cd"] }, "ww_animTiming/descartes-polar_orient/08_d-p_o_l-c-l": { - "refs": ["b435bbb"] + "refs": ["7aeda4a"] }, "ww_animTiming/descartes-polar_orient/09_d-p_o_r-a-r": { - "refs": ["511e34c"] + "refs": ["cf5bea8"] }, "ww_animTiming/descartes-polar_orient/10_d-p_o_c-a-c": { - "refs": ["3746d27"] + "refs": ["a0be57f"] }, "ww_animTiming/descartes-polar_orient/11_d-p_o_a-a-a": { - "refs": ["484bbbf"] + "refs": ["b21b6e1"] }, "ww_animTiming/descartes-polar_orient/12_d-p_o_l-a-l": { - "refs": ["53f8317"] + "refs": ["874c8a8"] }, "ww_animTiming/descartes-polar_orient/13_d-p_o_r-l-r": { - "refs": ["4504a04"] + "refs": ["b0a6eef"] }, "ww_animTiming/descartes-polar_orient/14_d-p_o_c-l-c": { - "refs": ["07c49a8"] + "refs": ["ad76549"] }, "ww_animTiming/descartes-polar_orient/15_d-p_o_a-l-a": { - "refs": ["2f49f78"] + "refs": ["1f7708d"] }, "ww_animTiming/descartes-polar_orient/16_d-p_o_l-l-l": { - "refs": ["2910caa"] + "refs": ["31e0cc5"] }, "ww_animTiming/descartes/02_d-d_c-r-c": { - "refs": ["eb2b9b4"] + "refs": ["b8ccce7"] }, "ww_animTiming/descartes/03_d-d_a-r-a": { - "refs": ["0888810"] + "refs": ["f9cad94"] }, "ww_animTiming/descartes/04_d-d_l-r-l": { - "refs": ["bcc1156"] + "refs": ["6decadb"] }, "ww_animTiming/descartes/07_d-d_a-c-a": { - "refs": ["7c534f4"] + "refs": ["f7e42db"] }, "ww_animTiming/descartes/08_d-d_l-c-l": { - "refs": ["faba930"] + "refs": ["4c60b69"] }, "ww_animTiming/descartes/12_d-d_l-a-l": { - "refs": ["4a93d0f"] + "refs": ["2234442"] }, "ww_animTiming/descartes/easing_test": { - "refs": ["5695b12"] + "refs": ["a918991"] }, "ww_animTiming/descartes_orientation/01_d-d_o_r-r-r": { - "refs": ["a7933b3"] + "refs": ["1fc95a8"] }, "ww_animTiming/descartes_orientation/02_d-d_o_c-r-c": { - "refs": ["9762676"] + "refs": ["385a891"] }, "ww_animTiming/descartes_orientation/03_d-d_o_a-r-a": { - "refs": ["134672d"] + "refs": ["8eac3cd"] }, "ww_animTiming/descartes_orientation/03_d-d_o_a-r-a_split": { - "refs": ["de5f879"] + "refs": ["3ec41ec"] }, "ww_animTiming/descartes_orientation/04_d-d_o_l-r-l": { - "refs": ["6a283a5"] + "refs": ["afce15d"] }, "ww_animTiming/descartes_orientation/04_d-d_o_l-r-l_stacked": { - "refs": ["9518aeb"] + "refs": ["e73cff1"] }, "ww_animTiming/descartes_orientation/05_d-d_o_r-c-r": { - "refs": ["fda378a"] + "refs": ["e588fa0"] }, "ww_animTiming/descartes_orientation/06_d-d_o_c-c-c": { - "refs": ["d999663"] + "refs": ["7352f22"] }, "ww_animTiming/descartes_orientation/07_d-d_o_a-c-a": { - "refs": ["8e34cd8"] + "refs": ["45bc665"] }, "ww_animTiming/descartes_orientation/08_d-d_o_l-c-l": { - "refs": ["c87c3d7"] + "refs": ["5446eeb"] }, "ww_animTiming/descartes_orientation/09_d-d_o_r-a-r": { - "refs": ["68bea36"] + "refs": ["faaeb61"] }, "ww_animTiming/descartes_orientation/10_d-d_o_c-a-c": { - "refs": ["0770dcb"] + "refs": ["1e30cfa"] }, "ww_animTiming/descartes_orientation/11_d-d_o_a-a-a": { - "refs": ["81cc96f"] + "refs": ["2004e2a"] }, "ww_animTiming/descartes_orientation/12_d-d_o_l-a-l": { - "refs": ["1a87120"] + "refs": ["c261cc2"] }, "ww_animTiming/descartes_orientation/13_d-d_o_r-l-r": { - "refs": ["4881eda"] + "refs": ["c184de3"] }, "ww_animTiming/descartes_orientation/14_d-d_o_c-l-c": { - "refs": ["1ccf0e5"] + "refs": ["e1b6b89"] }, "ww_animTiming/descartes_orientation/15_d-d_o_a-l-a": { - "refs": ["ee1eed4"] + "refs": ["26cc3dd"] }, "ww_animTiming/descartes_orientation/16_d-d_o_l-l-l": { - "refs": ["29dec23"] + "refs": ["12251e1"] }, "ww_animTiming/polar/02_p-p_c-r-c": { - "refs": ["2f24ab3"] + "refs": ["c144798"] }, "ww_animTiming/polar/03_p-p_a-r-a": { - "refs": ["4f609b2"] + "refs": ["543df46"] }, "ww_animTiming/polar/04_p-p_l-r-l": { - "refs": ["52284a0"] + "refs": ["ae64e5f"] }, "ww_animTiming/polar/07_p-p_a-c-a": { - "refs": ["a55d972"] + "refs": ["923d61e"] }, "ww_animTiming/polar/08_p-p_l-c-l": { - "refs": ["a86bc30"] + "refs": ["a997aa5"] }, "ww_animTiming/polar/12_p-p_l-a-l": { - "refs": ["3674e9f"] + "refs": ["5d9c33c"] }, "ww_animTiming/polar_orientation/01_p-p_o_r-r-r": { - "refs": ["e876695"] + "refs": ["f9e66de"] }, "ww_animTiming/polar_orientation/02_p-p_o_c-r-c": { - "refs": ["7f961e9"] + "refs": ["1196f4a"] }, "ww_animTiming/polar_orientation/03_p-p_o_a-r-a": { - "refs": ["f7e9cee"] + "refs": ["84cc7f5"] }, "ww_animTiming/polar_orientation/04_p-p_o_l-r-l": { - "refs": ["46dc726"] + "refs": ["604473b"] }, "ww_animTiming/polar_orientation/05_p-p_o_r-c-r": { - "refs": ["5ced7e9"] + "refs": ["a47565a"] }, "ww_animTiming/polar_orientation/06_p-p_o_c-c-c": { - "refs": ["e425352"] + "refs": ["0e63ab5"] }, "ww_animTiming/polar_orientation/07_p-p_o_a-c-a": { - "refs": ["09108c2"] + "refs": ["6e76af0"] }, "ww_animTiming/polar_orientation/08_p-p_o_l-c-l": { - "refs": ["5ec946f"] + "refs": ["8765ac1"] }, "ww_animTiming/polar_orientation/09_p-p_o_r-a-r": { - "refs": ["e2bb134"] + "refs": ["a89ddf7"] }, "ww_animTiming/polar_orientation/10_p-p_o_c-a-c": { - "refs": ["49683ca"] + "refs": ["78923be"] }, "ww_animTiming/polar_orientation/11_p-p_o_a-a-a": { - "refs": ["cd72a62"] + "refs": ["cc2a659"] }, "ww_animTiming/polar_orientation/12_p-p_o_l-a-l": { - "refs": ["df56189"] + "refs": ["44bbd96"] }, "ww_animTiming/polar_orientation/13_p-p_o_r-l-r": { - "refs": ["3fc0938"] + "refs": ["9a372ec"] }, "ww_animTiming/polar_orientation/14_p-p_o_c-l-c": { - "refs": ["0b98327"] + "refs": ["2e7c15a"] }, "ww_animTiming/polar_orientation/15_p-p_o_a-l-a": { - "refs": ["2c01ee8"] + "refs": ["7e9964b"] }, "ww_animTiming/polar_orientation/16_p-p_o_l-l-l": { - "refs": ["f7e010f"] + "refs": ["10d8036"] }, "ww_animTiming/without-descartes/01_w-d_r-r-r": { - "refs": ["4c13f24"] + "refs": ["0d5ae36"] }, "ww_animTiming/without-descartes/02_w-d_c-r-c": { - "refs": ["fbf6525"] + "refs": ["f21fae3"] }, "ww_animTiming/without-descartes/05_w-d_r-c-r": { - "refs": ["bdb2d24"] + "refs": ["ef72dee"] }, "ww_animTiming/without-descartes/06_w-d_c-c-c": { - "refs": ["2b7a38d"] + "refs": ["78e3332"] }, "ww_animTiming/without-descartes/09_w-d_r-a-r": { - "refs": ["4ea3f95"] + "refs": ["c71c319"] }, "ww_animTiming/without-descartes/10_w-d_c-a-c": { - "refs": ["794bfad"] + "refs": ["656f74b"] }, "ww_animTiming/without-descartes/13_w-d_r-l-r": { - "refs": ["27a7a22"] + "refs": ["86e05dc"] }, "ww_animTiming/without-descartes/14_w-d_c-l-c": { - "refs": ["f1f3210"] + "refs": ["e17a4e7"] }, "ww_animTiming/without-descartes_orientation/01_w-d_o_r-r-r": { - "refs": ["893cefb"] + "refs": ["23fe80b"] }, "ww_animTiming/without-descartes_orientation/02_w-d_o_c-r-c": { - "refs": ["e65ff43"] + "refs": ["41e09d9"] }, "ww_animTiming/without-descartes_orientation/05_w-d_o_r-c-r": { - "refs": ["dcf7789"] + "refs": ["d07f3c5"] }, "ww_animTiming/without-descartes_orientation/06_w-d_o_c-c-c": { - "refs": ["d4a5405"] + "refs": ["ef82cf0"] }, "ww_animTiming/without-descartes_orientation/09_w-d_o_r-a-r": { - "refs": ["148dfce"] + "refs": ["3160fee"] }, "ww_animTiming/without-descartes_orientation/10_w-d_o_c-a-c": { - "refs": ["57cc804"] + "refs": ["e89a181"] }, "ww_animTiming/without-descartes_orientation/13_w-d_o_r-l-r": { - "refs": ["dd50588"] + "refs": ["c3ee381"] }, "ww_animTiming/without-descartes_orientation/14_w-d_o_c-l-c": { - "refs": ["2afcf2d"] + "refs": ["6da6ee5"] }, "ww_animTiming/without-polar/01_w-p_r-r-r": { - "refs": ["a1c0dbb"] + "refs": ["00e3824"] }, "ww_animTiming/without-polar/02_w-p_c-r-c": { - "refs": ["b6cce10"] + "refs": ["d49ae69"] }, "ww_animTiming/without-polar/05_w-p_r-c-r": { - "refs": ["a9a4b21"] + "refs": ["eaba585"] }, "ww_animTiming/without-polar/06_w-p_c-c-c": { - "refs": ["cb6a240"] + "refs": ["5e6eed4"] }, "ww_animTiming/without-polar/09_w-p_r-a-r": { - "refs": ["e9898df"] + "refs": ["603c7d5"] }, "ww_animTiming/without-polar/10_w-p_c-a-c": { - "refs": ["7df8ff5"] + "refs": ["329f958"] }, "ww_animTiming/without-polar/13_w-p_r-l-r": { - "refs": ["ea901a4"] + "refs": ["092bd23"] }, "ww_animTiming/without-polar/14_w-p_c-l-c": { - "refs": ["2a62409"] + "refs": ["e9e9474"] }, "ww_animTiming/without-polar_orientation/01_w-p_o_r-r-r": { - "refs": ["67ac2f4"] + "refs": ["2073bde"] }, "ww_animTiming/without-polar_orientation/02_w-p_o_c-r-c": { - "refs": ["15af81c"] + "refs": ["345fc6a"] }, "ww_animTiming/without-polar_orientation/05_w-p_o_r-c-r": { - "refs": ["aae6571"] + "refs": ["c0067d2"] }, "ww_animTiming/without-polar_orientation/06_w-p_o_c-c-c": { - "refs": ["8be0ec3"] + "refs": ["0a5ef8c"] }, "ww_animTiming/without-polar_orientation/09_w-p_o_r-a-r": { - "refs": ["3c12245"] + "refs": ["4fa9fa2"] }, "ww_animTiming/without-polar_orientation/10_w-p_o_c-a-c": { - "refs": ["8d6e3aa"] + "refs": ["b5d7494"] }, "ww_animTiming/without-polar_orientation/13_w-p_o_r-l-r": { - "refs": ["24b263f"] + "refs": ["0706709"] }, "ww_animTiming/without-polar_orientation/14_w-p_o_c-l-c": { - "refs": ["fed258d"] + "refs": ["b9c25d5"] }, "ww_animTiming/without/02_w-w_c-r-c": { - "refs": ["5c53b35"] + "refs": ["8a6ff6f"] }, "ww_animTiming_TESTS/descartes-polar/02_d-p_c-r-c": { - "refs": ["de47f42"] + "refs": ["7d272af"] }, "ww_animTiming_TESTS/descartes-polar/03_d-p_a-r-a": { - "refs": ["bc59a5a"] + "refs": ["0b4863d"] }, "ww_animTiming_TESTS/descartes-polar/04_d-p_l-r-l": { - "refs": ["febc4c2"] + "refs": ["36cbc89"] }, "ww_animTiming_TESTS/descartes-polar/05_d-p_r-c-r": { - "refs": ["e2ffc32"] + "refs": ["fb87980"] }, "ww_animTiming_TESTS/descartes-polar/06_d-p_c-c-c": { - "refs": ["7f51c4d"] + "refs": ["d058730"] }, "ww_animTiming_TESTS/descartes-polar/07_d-p_a-c-a": { - "refs": ["10755a4"] + "refs": ["ddf3dfc"] }, "ww_animTiming_TESTS/descartes-polar/08_d-p_l-c-l": { - "refs": ["edbe01f"] + "refs": ["1a17159"] }, "ww_animTiming_TESTS/descartes-polar/09_d-p_r-a-r": { - "refs": ["20166e1"] + "refs": ["086c6e9"] }, "ww_animTiming_TESTS/descartes-polar/10_d-p_c-a-c": { - "refs": ["93ea3b2"] + "refs": ["7eb8dd1"] }, "ww_animTiming_TESTS/descartes-polar/11_d-p_a-a-a": { - "refs": ["5fab1a3"] + "refs": ["1991efb"] }, "ww_animTiming_TESTS/descartes-polar/12_d-p_l-a-l": { - "refs": ["c86b0ac"] + "refs": ["086bd1e"] }, "ww_animTiming_TESTS/descartes-polar/13_d-p_r-l-r": { - "refs": ["0a4982b"] + "refs": ["144d2a3"] }, "ww_animTiming_TESTS/descartes-polar/14_d-p_c-l-c": { - "refs": ["6bd0923"] + "refs": ["d506f74"] }, "ww_animTiming_TESTS/descartes-polar/15_d-p_a-l-a": { - "refs": ["5d2659a"] + "refs": ["c203319"] }, "ww_animTiming_TESTS/descartes-polar/16_d-p_l-l-l": { - "refs": ["7654727"] + "refs": ["c68d833"] }, "ww_animTiming_TESTS/descartes-polar_orient/01_d-p_o_r-r-r": { - "refs": ["55ee14b"] + "refs": ["fe9d399"] }, "ww_animTiming_TESTS/descartes-polar_orient/02_d-p_o_c-r-c": { - "refs": ["6d746bc"] + "refs": ["3a0ce50"] }, "ww_animTiming_TESTS/descartes-polar_orient/03_d-p_o_a-r-a": { - "refs": ["ad07516"] + "refs": ["381ce1d"] }, "ww_animTiming_TESTS/descartes-polar_orient/04_d-p_o_l-r-l": { - "refs": ["a13dc46"] + "refs": ["4b8b4e7"] }, "ww_animTiming_TESTS/descartes-polar_orient/05_d-p_o_r-c-r": { - "refs": ["e78defd"] + "refs": ["cee8689"] }, "ww_animTiming_TESTS/descartes-polar_orient/06_d-p_o_c-c-c": { - "refs": ["697ae12"] + "refs": ["6864071"] }, "ww_animTiming_TESTS/descartes-polar_orient/07_d-p_o_a-c-a": { - "refs": ["5454df7"] + "refs": ["76e817a"] }, "ww_animTiming_TESTS/descartes-polar_orient/08_d-p_o_l-c-l": { - "refs": ["a0c3c29"] + "refs": ["c8b97e7"] }, "ww_animTiming_TESTS/descartes-polar_orient/09_d-p_o_r-a-r": { - "refs": ["71ae0e8"] + "refs": ["3a19c57"] }, "ww_animTiming_TESTS/descartes-polar_orient/10_d-p_o_c-a-c": { - "refs": ["5668cb0"] + "refs": ["a39f654"] }, "ww_animTiming_TESTS/descartes-polar_orient/11_d-p_o_a-a-a": { - "refs": ["6c12fbe"] + "refs": ["ff8b377"] }, "ww_animTiming_TESTS/descartes-polar_orient/12_d-p_o_l-a-l": { - "refs": ["d13ca1b"] + "refs": ["6d1be27"] }, "ww_animTiming_TESTS/descartes-polar_orient/13_d-p_o_r-l-r": { - "refs": ["26f99d2"] + "refs": ["bb3c4ce"] }, "ww_animTiming_TESTS/descartes-polar_orient/14_d-p_o_c-l-c": { - "refs": ["e522fa2"] + "refs": ["718eb1d"] }, "ww_animTiming_TESTS/descartes-polar_orient/15_d-p_o_a-l-a": { - "refs": ["4c5c30c"] + "refs": ["d6db8a2"] }, "ww_animTiming_TESTS/descartes-polar_orient/16_d-p_o_l-l-l": { - "refs": ["0a0ab90"] + "refs": ["5f3346a"] }, "ww_animTiming_TESTS/descartes/02_d-d_c-r-c": { - "refs": ["7326dbc"] + "refs": ["e19594b"] }, "ww_animTiming_TESTS/descartes/03_d-d_a-r-a": { - "refs": ["0a7bcb0"] + "refs": ["645b4cf"] }, "ww_animTiming_TESTS/descartes/04_d-d_l-r-l": { - "refs": ["ea1f53a"] + "refs": ["36de5ae"] }, "ww_animTiming_TESTS/descartes/07_d-d_a-c-a": { - "refs": ["3fa944f"] + "refs": ["2f4e5c1"] }, "ww_animTiming_TESTS/descartes/08_d-d_l-c-l": { - "refs": ["159b86f"] + "refs": ["94516e9"] }, "ww_animTiming_TESTS/descartes/12_d-d_l-a-l": { - "refs": ["dc55d31"] + "refs": ["cc467a4"] }, "ww_animTiming_TESTS/descartes/easing_test": { - "refs": ["e4aae39"] + "refs": ["2a0405d"] }, "ww_animTiming_TESTS/descartes_orientation/01_d-d_o_r-r-r": { - "refs": ["bbdaea8"] + "refs": ["8d27253"] }, "ww_animTiming_TESTS/descartes_orientation/02_d-d_o_c-r-c": { - "refs": ["14fddb9"] + "refs": ["f3fe427"] }, "ww_animTiming_TESTS/descartes_orientation/03_d-d_o_a-r-a": { - "refs": ["8b114d6"] + "refs": ["3f06d6a"] }, "ww_animTiming_TESTS/descartes_orientation/03_d-d_o_a-r-a_split": { - "refs": ["6e79751"] + "refs": ["f92dd87"] }, "ww_animTiming_TESTS/descartes_orientation/04_d-d_o_l-r-l": { - "refs": ["9043681"] + "refs": ["abe61a3"] }, "ww_animTiming_TESTS/descartes_orientation/04_d-d_o_l-r-l_stacked": { - "refs": ["80f7ac0"] + "refs": ["3ecebe1"] }, "ww_animTiming_TESTS/descartes_orientation/05_d-d_o_r-c-r": { - "refs": ["a1a0923"] + "refs": ["4cb5d52"] }, "ww_animTiming_TESTS/descartes_orientation/06_d-d_o_c-c-c": { - "refs": ["56a9d06"] + "refs": ["115adef"] }, "ww_animTiming_TESTS/descartes_orientation/07_d-d_o_a-c-a": { - "refs": ["bcdef5b"] + "refs": ["37d1252"] }, "ww_animTiming_TESTS/descartes_orientation/08_d-d_o_l-c-l": { - "refs": ["ce1a1e1"] + "refs": ["3ea2c95"] }, "ww_animTiming_TESTS/descartes_orientation/09_d-d_o_r-a-r": { - "refs": ["4cae7cc"] + "refs": ["6fff42a"] }, "ww_animTiming_TESTS/descartes_orientation/10_d-d_o_c-a-c": { - "refs": ["db357b2"] + "refs": ["c633bbd"] }, "ww_animTiming_TESTS/descartes_orientation/11_d-d_o_a-a-a": { - "refs": ["f2d78fa"] + "refs": ["ce644a6"] }, "ww_animTiming_TESTS/descartes_orientation/12_d-d_o_l-a-l": { - "refs": ["74551d1"] + "refs": ["f465e24"] }, "ww_animTiming_TESTS/descartes_orientation/13_d-d_o_r-l-r": { - "refs": ["02efc3b"] + "refs": ["3f23552"] }, "ww_animTiming_TESTS/descartes_orientation/14_d-d_o_c-l-c": { - "refs": ["a43a74b"] + "refs": ["33cf914"] }, "ww_animTiming_TESTS/descartes_orientation/15_d-d_o_a-l-a": { - "refs": ["0a07bdf"] + "refs": ["bb2e6aa"] }, "ww_animTiming_TESTS/descartes_orientation/16_d-d_o_l-l-l": { - "refs": ["9784887"] + "refs": ["cfff41c"] }, "ww_animTiming_TESTS/polar/02_p-p_c-r-c": { - "refs": ["da1ce5a"] + "refs": ["08d2d4c"] }, "ww_animTiming_TESTS/polar/03_p-p_a-r-a": { - "refs": ["7034035"] + "refs": ["08ff02c"] }, "ww_animTiming_TESTS/polar/04_p-p_l-r-l": { - "refs": ["a23b593"] + "refs": ["e767285"] }, "ww_animTiming_TESTS/polar/07_p-p_a-c-a": { - "refs": ["4b021ab"] + "refs": ["8185234"] }, "ww_animTiming_TESTS/polar/08_p-p_l-c-l": { - "refs": ["9069066"] + "refs": ["7de2e37"] }, "ww_animTiming_TESTS/polar/12_p-p_l-a-l": { - "refs": ["117e7f3"] + "refs": ["84f1582"] }, "ww_animTiming_TESTS/polar_orientation/01_p-p_o_r-r-r": { - "refs": ["c2812e2"] + "refs": ["1ed9293"] }, "ww_animTiming_TESTS/polar_orientation/02_p-p_o_c-r-c": { - "refs": ["34ba85e"] + "refs": ["76228e8"] }, "ww_animTiming_TESTS/polar_orientation/03_p-p_o_a-r-a": { - "refs": ["8d5f42d"] + "refs": ["856860c"] }, "ww_animTiming_TESTS/polar_orientation/04_p-p_o_l-r-l": { - "refs": ["7bfa5f1"] + "refs": ["66f7084"] }, "ww_animTiming_TESTS/polar_orientation/05_p-p_o_r-c-r": { - "refs": ["727ba80"] + "refs": ["7d45e2c"] }, "ww_animTiming_TESTS/polar_orientation/06_p-p_o_c-c-c": { - "refs": ["a31de07"] + "refs": ["931eed0"] }, "ww_animTiming_TESTS/polar_orientation/07_p-p_o_a-c-a": { - "refs": ["1f97067"] + "refs": ["71e82ef"] }, "ww_animTiming_TESTS/polar_orientation/08_p-p_o_l-c-l": { - "refs": ["1e2bcb8"] + "refs": ["a686539"] }, "ww_animTiming_TESTS/polar_orientation/09_p-p_o_r-a-r": { - "refs": ["b2c45be"] + "refs": ["2cd3154"] }, "ww_animTiming_TESTS/polar_orientation/10_p-p_o_c-a-c": { - "refs": ["047cb82"] + "refs": ["d4f4338"] }, "ww_animTiming_TESTS/polar_orientation/11_p-p_o_a-a-a": { - "refs": ["3e8df6e"] + "refs": ["bf0617d"] }, "ww_animTiming_TESTS/polar_orientation/12_p-p_o_l-a-l": { - "refs": ["50c6e1f"] + "refs": ["bb8201f"] }, "ww_animTiming_TESTS/polar_orientation/13_p-p_o_r-l-r": { - "refs": ["8e58a89"] + "refs": ["1adfa90"] }, "ww_animTiming_TESTS/polar_orientation/14_p-p_o_c-l-c": { - "refs": ["ffb160c"] + "refs": ["03e99d8"] }, "ww_animTiming_TESTS/polar_orientation/15_p-p_o_a-l-a": { - "refs": ["e01969b"] + "refs": ["8487543"] }, "ww_animTiming_TESTS/polar_orientation/16_p-p_o_l-l-l": { - "refs": ["07a1f01"] + "refs": ["5e47e30"] }, "ww_animTiming_TESTS/without-descartes/01_w-d_r-r-r": { - "refs": ["fe3d177"] + "refs": ["dae0145"] }, "ww_animTiming_TESTS/without-descartes/02_w-d_c-r-c": { - "refs": ["df8810b"] + "refs": ["9cf68ec"] }, "ww_animTiming_TESTS/without-descartes/05_w-d_r-c-r": { - "refs": ["81048aa"] + "refs": ["6529e39"] }, "ww_animTiming_TESTS/without-descartes/06_w-d_c-c-c": { - "refs": ["039ce24"] + "refs": ["57b8c5c"] }, "ww_animTiming_TESTS/without-descartes/09_w-d_r-a-r": { - "refs": ["a24ae0d"] + "refs": ["4e119d1"] }, "ww_animTiming_TESTS/without-descartes/10_w-d_c-a-c": { - "refs": ["09680a3"] + "refs": ["05c26f1"] }, "ww_animTiming_TESTS/without-descartes/13_w-d_r-l-r": { - "refs": ["8fdb834"] + "refs": ["2bf6c24"] }, "ww_animTiming_TESTS/without-descartes/14_w-d_c-l-c": { - "refs": ["0670215"] + "refs": ["774451d"] }, "ww_animTiming_TESTS/without-descartes_orientation/01_w-d_o_r-r-r": { - "refs": ["a452290"] + "refs": ["c7cd462"] }, "ww_animTiming_TESTS/without-descartes_orientation/02_w-d_o_c-r-c": { - "refs": ["61d2c9f"] + "refs": ["66d3b44"] }, "ww_animTiming_TESTS/without-descartes_orientation/05_w-d_o_r-c-r": { - "refs": ["f460e85"] + "refs": ["5deaa43"] }, "ww_animTiming_TESTS/without-descartes_orientation/06_w-d_o_c-c-c": { - "refs": ["243bedb"] + "refs": ["e07dcfa"] }, "ww_animTiming_TESTS/without-descartes_orientation/09_w-d_o_r-a-r": { - "refs": ["fac2e0b"] + "refs": ["3105bd6"] }, "ww_animTiming_TESTS/without-descartes_orientation/10_w-d_o_c-a-c": { - "refs": ["c8c8ae1"] + "refs": ["b90e0e6"] }, "ww_animTiming_TESTS/without-descartes_orientation/13_w-d_o_r-l-r": { - "refs": ["e021402"] + "refs": ["9e980bc"] }, "ww_animTiming_TESTS/without-descartes_orientation/14_w-d_o_c-l-c": { - "refs": ["a10d7de"] + "refs": ["3a90a80"] }, "ww_animTiming_TESTS/without-polar/01_w-p_r-r-r": { - "refs": ["e2fa5fa"] + "refs": ["6410538"] }, "ww_animTiming_TESTS/without-polar/02_w-p_c-r-c": { - "refs": ["c25da4f"] + "refs": ["be47ea6"] }, "ww_animTiming_TESTS/without-polar/05_w-p_r-c-r": { - "refs": ["35e2882"] + "refs": ["58849c0"] }, "ww_animTiming_TESTS/without-polar/06_w-p_c-c-c": { - "refs": ["30b6cf8"] + "refs": ["4cdd1e4"] }, "ww_animTiming_TESTS/without-polar/09_w-p_r-a-r": { - "refs": ["d2f90d9"] + "refs": ["d8726d9"] }, "ww_animTiming_TESTS/without-polar/10_w-p_c-a-c": { - "refs": ["faf7b60"] + "refs": ["7acd7b9"] }, "ww_animTiming_TESTS/without-polar/13_w-p_r-l-r": { - "refs": ["1fdf9b7"] + "refs": ["efa168b"] }, "ww_animTiming_TESTS/without-polar/14_w-p_c-l-c": { - "refs": ["f383ae8"] + "refs": ["a348ad1"] }, "ww_animTiming_TESTS/without-polar_orientation/01_w-p_o_r-r-r": { - "refs": ["53a71fe"] + "refs": ["3273608"] }, "ww_animTiming_TESTS/without-polar_orientation/02_w-p_o_c-r-c": { - "refs": ["1fee4a8"] + "refs": ["31b8d22"] }, "ww_animTiming_TESTS/without-polar_orientation/05_w-p_o_r-c-r": { - "refs": ["71be50b"] + "refs": ["99f4b00"] }, "ww_animTiming_TESTS/without-polar_orientation/06_w-p_o_c-c-c": { - "refs": ["a194412"] + "refs": ["6ee2326"] }, "ww_animTiming_TESTS/without-polar_orientation/09_w-p_o_r-a-r": { - "refs": ["9ecb96b"] + "refs": ["e39335b"] }, "ww_animTiming_TESTS/without-polar_orientation/10_w-p_o_c-a-c": { - "refs": ["822c36e"] + "refs": ["2882c00"] }, "ww_animTiming_TESTS/without-polar_orientation/13_w-p_o_r-l-r": { - "refs": ["73f3608"] + "refs": ["fed1bda"] }, "ww_animTiming_TESTS/without-polar_orientation/14_w-p_o_c-l-c": { - "refs": ["7bdc5fe"] + "refs": ["e30226f"] }, "ww_animTiming_TESTS/without/02_w-w_c-r-c": { - "refs": ["b3c498f"] + "refs": ["0a179a2"] }, "ww_next_steps/next_steps/02_C_R": { - "refs": ["118d8de"] + "refs": ["5959f29"] }, "ww_next_steps/next_steps/02_C_R_water_comparison_sum": { "refs": ["8d0e8af"] }, "ww_next_steps/next_steps/03_C_R": { - "refs": ["8165127"] + "refs": ["8973341"] }, "ww_next_steps/next_steps/04_C_R": { - "refs": ["2fd6179"] + "refs": ["2c92edd"] }, "ww_next_steps/next_steps/05_C_R": { "refs": ["c41c112"] }, "ww_next_steps/next_steps/21_C_C_dotplot": { - "refs": ["92eeaaa"] + "refs": ["9429799"] }, "ww_next_steps/next_steps/22_C_C": { - "refs": ["c9947d0"] + "refs": ["d9a5095"] }, "ww_next_steps/next_steps/28_C_A": { "refs": ["ba7ad4b"] @@ -1778,25 +1778,25 @@ "refs": ["3a9b873"] }, "ww_next_steps/next_steps_Tests/02_C_R": { - "refs": ["677580f"] + "refs": ["5288d0e"] }, "ww_next_steps/next_steps_Tests/02_C_R_water_comparison_sum": { "refs": ["81c6c1e"] }, "ww_next_steps/next_steps_Tests/03_C_R": { - "refs": ["28698a3"] + "refs": ["f069329"] }, "ww_next_steps/next_steps_Tests/04_C_R": { - "refs": ["ee81d57"] + "refs": ["4b5cb11"] }, "ww_next_steps/next_steps_Tests/05_C_R": { "refs": ["9b06520"] }, "ww_next_steps/next_steps_Tests/21_C_C_dotplot": { - "refs": ["483c9ec"] + "refs": ["1707448"] }, "ww_next_steps/next_steps_Tests/22_C_C": { - "refs": ["9a2fcab"] + "refs": ["3191438"] }, "ww_next_steps/next_steps_Tests/28_C_A": { "refs": ["4f46902"] @@ -1814,7 +1814,7 @@ "refs": ["08a0618"] }, "ww_next_steps/next_steps_byOperations/compare/comparison_03": { - "refs": ["5048aef"] + "refs": ["f1b3286"] }, "ww_next_steps/next_steps_byOperations/compare/comparison_04": { "refs": ["ff004d8"] @@ -1826,7 +1826,7 @@ "refs": ["3864ccc"] }, "ww_next_steps/next_steps_byOperations/compare/comparison_09": { - "refs": ["a49aa5e"] + "refs": ["2927dd1"] }, "ww_next_steps/next_steps_byOperations/compare/comparison_10": { "refs": ["c4ba7a6"] @@ -1838,31 +1838,31 @@ "refs": ["342d170"] }, "ww_next_steps/next_steps_byOperations/components/components_02": { - "refs": ["456e857"] + "refs": ["a66d246"] }, "ww_next_steps/next_steps_byOperations/components/components_03": { "refs": ["168c22c"] }, "ww_next_steps/next_steps_byOperations/components/components_04": { - "refs": ["a5878a0"] + "refs": ["5d73aae"] }, "ww_next_steps/next_steps_byOperations/components/components_05": { "refs": ["e2fbaa1"] }, "ww_next_steps/next_steps_byOperations/components/components_06": { - "refs": ["42b11d7"] + "refs": ["3af1314"] }, "ww_next_steps/next_steps_byOperations/components/components_07": { - "refs": ["4d46f8f"] + "refs": ["93b251e"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_01": { - "refs": ["dfa5902"] + "refs": ["4f9f834"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_02": { "refs": ["b9ccf41"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_03": { - "refs": ["2f540e2"] + "refs": ["0850d7e"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_04": { "refs": ["d76d785"] @@ -1871,7 +1871,7 @@ "refs": ["5c8b97b"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_06": { - "refs": ["c38881d"] + "refs": ["fa1ecf5"] }, "ww_next_steps/next_steps_byOperations/distribute/distribution_07": { "refs": ["c69d845"] @@ -1880,19 +1880,19 @@ "refs": ["3452178"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_01": { - "refs": ["1cd042b"] + "refs": ["945807c"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_02": { - "refs": ["07fd87b"] + "refs": ["b1b13b9"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_03": { - "refs": ["351fa89"] + "refs": ["b4a18e7"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_04": { - "refs": ["15bfe7c"] + "refs": ["eaf75bf"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_05": { - "refs": ["967d152"] + "refs": ["2a41e69"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_06": { "refs": ["46b31d2"] @@ -1901,10 +1901,10 @@ "refs": ["13ae968"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_10": { - "refs": ["84661bb"] + "refs": ["a1e35ba"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_11": { - "refs": ["b3ae780"] + "refs": ["b256c25"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_12": { "refs": ["43d226c"] @@ -1913,55 +1913,55 @@ "refs": ["f2918a6"] }, "ww_next_steps/next_steps_byOperations/other/other_add_measure_01": { - "refs": ["483158f"] + "refs": ["a1b6470"] }, "ww_next_steps/next_steps_byOperations/ratio/ratio_01": { - "refs": ["0537644"] + "refs": ["ad31c83"] }, "ww_next_steps/next_steps_byOperations/ratio/ratio_02": { "refs": ["6722052"] }, "ww_next_steps/next_steps_byOperations/ratio/ratio_03": { - "refs": ["304c075"] + "refs": ["78d9545"] }, "ww_next_steps/next_steps_byOperations/ratio/ratio_04": { - "refs": ["9383100"] + "refs": ["7cf94b9"] }, "ww_next_steps/next_steps_byOperations/ratio/ratio_05": { - "refs": ["abee1fa"] + "refs": ["fb18c8a"] }, "ww_next_steps/next_steps_byOperations/remove/remove_01": { - "refs": ["56acfb4"] + "refs": ["bc48fc0"] }, "ww_next_steps/next_steps_byOperations/remove/remove_02": { - "refs": ["bcd46d2"] + "refs": ["f086f64"] }, "ww_next_steps/next_steps_byOperations/remove/remove_03": { - "refs": ["172a99e"] + "refs": ["83ae583"] }, "ww_next_steps/next_steps_byOperations/remove/remove_04": { - "refs": ["738524b"] + "refs": ["39b3d23"] }, "ww_next_steps/next_steps_byOperations/remove/remove_05": { "refs": ["d283ab6"] }, "ww_next_steps/next_steps_byOperations/remove/remove_07": { - "refs": ["1f89123"] + "refs": ["8cce29a"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_01": { - "refs": ["9cceeef"] + "refs": ["a4e6698"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_02": { "refs": ["8133691"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_03": { - "refs": ["a7e2dad"] + "refs": ["dab1b9c"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_04": { - "refs": ["89e5b43"] + "refs": ["fc41331"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_05": { - "refs": ["337da21"] + "refs": ["fe8286d"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_06": { "refs": ["56f11ba"] @@ -1973,16 +1973,16 @@ "refs": ["816f652"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_09": { - "refs": ["dd25757"] + "refs": ["01dc0d8"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_10": { - "refs": ["eae9961"] + "refs": ["459d3b8"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_11": { - "refs": ["5e8ff84"] + "refs": ["bb47619"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_12": { - "refs": ["55236c0"] + "refs": ["c474f46"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_13": { "refs": ["5054074"] @@ -2012,43 +2012,43 @@ "refs": ["5114667"] }, "ww_next_steps/next_steps_byOperations/total/total_01": { - "refs": ["6a0650c"] + "refs": ["ae01b6d"] }, "ww_next_steps/next_steps_byOperations/total/total_02": { - "refs": ["d0e74b5"] + "refs": ["ce43b0a"] }, "ww_next_steps/next_steps_byOperations/total/total_03": { - "refs": ["5180f50"] + "refs": ["bc6491b"] }, "ww_next_steps/next_steps_byOperations/total/total_04": { - "refs": ["73ee64f"] + "refs": ["b35b7a7"] }, "ww_next_steps/next_steps_byOperations/total/total_05": { - "refs": ["0bc214e"] + "refs": ["164e384"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/composition_comparison_pie_coxcomb_column_2dis_2con": { "refs": ["31778d9"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/distribution_relationship_dotplot_dotplot": { - "refs": ["be8f8c9"] + "refs": ["5c09c44"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/drill_aggreg_improve_line": { "refs": ["3b0d039"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/merge_split_radial_stacked_rectangle_2dis_1con": { - "refs": ["56f4b50"] + "refs": ["46c9154"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/orientation_dot_circle": { - "refs": ["7ca8ad8"] + "refs": ["1d93c8f"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/orientation_marimekko_rectangle_2dis_2con": { - "refs": ["aabfc15"] + "refs": ["a5624b1"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/other_cartesian_radial_02": { "refs": ["193ab32"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/treemap_radial": { - "refs": ["233cb8b"] + "refs": ["74029a3"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/zoom_area": { "refs": ["5a2fe2c"] @@ -2069,7 +2069,7 @@ "refs": ["6d2d2aa"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/03_d-w_cir": { - "refs": ["cf554e8"] + "refs": ["b545211"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/03_d-w_lin": { "refs": ["45222ba"] @@ -2078,34 +2078,34 @@ "refs": ["36d132e"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/03a_d-w_are": { - "refs": ["4896b11"] + "refs": ["6080ed5"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/04_cir_2c": { - "refs": ["650e2b1"] + "refs": ["f78744d"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/06_cir_2c": { - "refs": ["fb6acd5"] + "refs": ["39e48bf"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/06b_are": { - "refs": ["a0e06a5"] + "refs": ["be725f1"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/06b_cir_1c": { - "refs": ["23724f3"] + "refs": ["f3630dd"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/2_05b_lin": { - "refs": ["36109c9"] + "refs": ["dc20538"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/4_06b_rec_1c": { - "refs": ["c4d93f3"] + "refs": ["a024d10"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/4a_06b_rec_1c": { - "refs": ["f84aa68"] + "refs": ["4482c80"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/5_04a_rec_1c": { - "refs": ["aec9e33"] + "refs": ["8dff4f9"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/6_04a_cir_1c": { - "refs": ["e9181e0"] + "refs": ["c94d6ac"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/7_05_cir_2c": { "refs": ["8d48a66"] @@ -2120,328 +2120,328 @@ "refs": ["4dde456"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/04a_are": { - "refs": ["64ed57e"] + "refs": ["a66dc83"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/04b_are": { - "refs": ["4b5731c"] + "refs": ["2647d34"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/06a_are": { - "refs": ["9523440"] + "refs": ["8ae35b4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/06b_are": { - "refs": ["e6281df"] + "refs": ["4f8705b"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/02_cir": { - "refs": ["520ffc5"] + "refs": ["d14a758"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/03_cir": { - "refs": ["f9e667e"] + "refs": ["c899262"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/04_cir": { - "refs": ["5cbcf2e"] + "refs": ["ab2df84"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/05_cir": { - "refs": ["f96ea1d"] + "refs": ["eb50a37"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/06_cir_NO": { - "refs": ["6dc581c"] + "refs": ["062fed7"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/07_cir": { - "refs": ["09e0a38"] + "refs": ["ad03df4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/08_cir": { - "refs": ["57f3e18"] + "refs": ["508ba45"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/04_cir_Ve1": { - "refs": ["b223675"] + "refs": ["f73a801"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/04_cir_Ve2": { - "refs": ["fd923b8"] + "refs": ["008089d"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/07_cir_Ve1": { - "refs": ["c5ff497"] + "refs": ["3121d97"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/02_cir": { - "refs": ["6989f33"] + "refs": ["73b9e52"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/03_cir": { - "refs": ["0832cec"] + "refs": ["0942300"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04_cir_2c": { - "refs": ["8199321"] + "refs": ["3ad1c3b"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04a_cir_1c": { - "refs": ["d119b0e"] + "refs": ["0abd2f3"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04b_cir_1c": { - "refs": ["bc86182"] + "refs": ["9923328"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05_cir_2c": { - "refs": ["b29e84f"] + "refs": ["6af8abd"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05a_cir_1c": { - "refs": ["32ec7e9"] + "refs": ["77c9f3b"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05b_cir_1c": { - "refs": ["b5e88b1"] + "refs": ["356b923"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06_cir_2c": { - "refs": ["3f24637"] + "refs": ["de91cc8"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06a_cir_1c": { - "refs": ["1ca42b9"] + "refs": ["b32a549"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06b_cir_1c": { - "refs": ["fc91b40"] + "refs": ["03943f1"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/07_cir_2c": { - "refs": ["a18e9fd"] + "refs": ["e114758"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/08_cir_2c": { - "refs": ["172b697"] + "refs": ["adbe0c4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/02a_lin": { - "refs": ["fe58f5d"] + "refs": ["b6fb637"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/02b_lin": { - "refs": ["ce6f8f9"] + "refs": ["9296cbd"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/03_lin": { - "refs": ["13a2b80"] + "refs": ["1524e58"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/04a_lin": { - "refs": ["4b4daae"] + "refs": ["d8ce571"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/04b_lin": { - "refs": ["c863459"] + "refs": ["6cdcfb9"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/05a_lin": { "refs": ["6b08c8c"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/05b_lin": { - "refs": ["9471491"] + "refs": ["d403af2"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/06a_lin": { - "refs": ["61517a4"] + "refs": ["449e5b8"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/06b_lin": { - "refs": ["a59a462"] + "refs": ["3159318"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/02a_rec": { - "refs": ["fe8f184"] + "refs": ["ddcc974"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/02b_rec": { - "refs": ["973ed37"] + "refs": ["b1222b2"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/03_rec": { - "refs": ["eba06ea"] + "refs": ["7c13486"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04a_rec_1c": { - "refs": ["8653cbc"] + "refs": ["ea4fb14"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04a_rec_2c": { - "refs": ["174b9e0"] + "refs": ["7d240ce"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04b_rec_1c": { - "refs": ["7d2d9ed"] + "refs": ["a14b59b"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04b_rec_2c": { - "refs": ["206f7f9"] + "refs": ["76c7046"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/05a_rec_2c": { - "refs": ["607ac8e"] + "refs": ["5a1f9ab"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/05b_rec_2c": { - "refs": ["a011cdc"] + "refs": ["839545a"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06a_rec_1c": { - "refs": ["818a881"] + "refs": ["39ae8f3"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06a_rec_2c": { - "refs": ["fbfbaa6"] + "refs": ["904903d"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06b_rec_1c": { - "refs": ["632859c"] + "refs": ["39fbb85"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06b_rec_2c": { - "refs": ["f969fb5"] + "refs": ["cf927b5"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/07a_rec_1c": { - "refs": ["7b75634"] + "refs": ["7a70c18"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/07a_rec_2c": { - "refs": ["fdb69c0"] + "refs": ["b153e42"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/08a_rec_2c": { - "refs": ["6b50d05"] + "refs": ["8acb3c3"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/03_d-w_are": { - "refs": ["360ba4c"] + "refs": ["7d199b1"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/04a_d-w_are": { - "refs": ["51fc987"] + "refs": ["2146064"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/04b_d-w_are": { - "refs": ["468e38e"] + "refs": ["f7e94ac"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/06a_d-w_are": { - "refs": ["c426b41"] + "refs": ["1d56931"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/06b_d-w_are": { - "refs": ["9e6641c"] + "refs": ["f5b48e6"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/10_d-w_are_temporal_bubble": { - "refs": ["96c8409"] + "refs": ["b42cd2f"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/03_d-w_are": { - "refs": ["79ac435"] + "refs": ["80930b4"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/04a_d-w_are": { - "refs": ["542b32c"] + "refs": ["9667937"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/04b_d-w_are": { - "refs": ["cdf554f"] + "refs": ["ffb5d17"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06a_d-w_are": { - "refs": ["f7edc04"] + "refs": ["469179e"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06b_d-w_are": { - "refs": ["4c4385c"] + "refs": ["35c50e4"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06b_d-w_are_V1_filter": { - "refs": ["6ce4e28"] + "refs": ["471c934"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle-rectangle/04a_d-w_cir_1c": { - "refs": ["4c0f4cd"] + "refs": ["40975e6"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/03_d-w_cir": { - "refs": ["80e9182"] + "refs": ["8702fe9"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04_d-w_cir_2c": { - "refs": ["ca30cc9"] + "refs": ["fd09976"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04a_d-w_cir_1c": { - "refs": ["afa8cd6"] + "refs": ["f61e08b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04b_d-w_cir_1c": { - "refs": ["6e6fe2f"] + "refs": ["c0aa378"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05_d-w_cir_2c": { - "refs": ["100eb90"] + "refs": ["2bb4b80"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05a_d-w_cir_1c": { - "refs": ["f3e6107"] + "refs": ["1a2d0f7"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05b_d-w_cir_1c": { - "refs": ["09ba342"] + "refs": ["34244ac"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06_d-w_cir_2c": { - "refs": ["200060c"] + "refs": ["bc22f36"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06a_d-w_cir_1c": { - "refs": ["e598bb2"] + "refs": ["4d50fbe"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06b_d-w_cir_1c": { - "refs": ["f422c89"] + "refs": ["f7b0f97"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/07_d-w_cir_2c": { - "refs": ["dbc6c78"] + "refs": ["654de71"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/08_d-w_cir_2c": { - "refs": ["c075929"] + "refs": ["6f4cd8b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/02_d-w_lin": { - "refs": ["0ce9c2d"] + "refs": ["4f1ec86"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/03_d-w_lin": { - "refs": ["56eb804"] + "refs": ["08f3dfa"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/04a_d-w_lin": { - "refs": ["d8fd868"] + "refs": ["ad55da5"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/04b_d-w_lin": { - "refs": ["9f92ae2"] + "refs": ["b2e49cd"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/05a_d-w_lin": { - "refs": ["12a6589"] + "refs": ["fe5d198"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/05b_d-w_lin": { - "refs": ["869f71f"] + "refs": ["a98a7e5"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/06a_d-w_lin": { - "refs": ["8cecf14"] + "refs": ["1905fbc"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/06b_d-w_lin": { - "refs": ["f295811"] + "refs": ["6f3e982"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/02_d-w_lin": { - "refs": ["4958f7f"] + "refs": ["b1cf484"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/03_d-w_lin": { - "refs": ["8ca4630"] + "refs": ["5447b95"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/04a_d-w_lin": { - "refs": ["4b57258"] + "refs": ["ac4f181"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/04b_d-w_lin": { - "refs": ["36d8159"] + "refs": ["e1f4e9a"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/05a_d-w_lin": { - "refs": ["00e114a"] + "refs": ["205e337"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/05b_d-w_lin": { - "refs": ["5cde3e9"] + "refs": ["abbc0c5"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/06a_d-w_lin": { - "refs": ["6f82965"] + "refs": ["2d39e27"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/06b_d-w_lin": { - "refs": ["e121a69"] + "refs": ["412d7c2"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/02_d-w_rec": { - "refs": ["a76f719"] + "refs": ["76ef7e1"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/03_d-w_rec": { - "refs": ["eda9bde"] + "refs": ["b6261e9"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04a_d-w_rec_1c": { - "refs": ["cac2cbc"] + "refs": ["15768ab"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04a_d-w_rec_2c": { - "refs": ["29eb3b1"] + "refs": ["8dab091"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04b_d-w_rec_1c": { - "refs": ["105dac1"] + "refs": ["5f5c1c4"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04b_d-w_rec_2c": { - "refs": ["ebc68cf"] + "refs": ["dce4e64"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/05a_d-w_rec_2c": { - "refs": ["52d8ec5"] + "refs": ["1e1ea2b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/05b_d-w_rec_2c": { - "refs": ["0811899"] + "refs": ["adf4a74"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06a_d-w_rec_1c": { - "refs": ["8eec77d"] + "refs": ["90c83da"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06b_d-w_rec_1c": { - "refs": ["0ee25ed"] + "refs": ["686e5ae"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06b_d-w_rec_2c": { - "refs": ["8b3eafd"] + "refs": ["8816109"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/07a_d-w_rec_1c": { - "refs": ["ddbf98f"] + "refs": ["a2ed600"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/07a_d-w_rec_2c": { - "refs": ["6d078ad"] + "refs": ["c85d079"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/08a_d-w_rec_2c": { - "refs": ["cbe9ee7"] + "refs": ["db453ea"] }, "ww_noFade/wNoFade_Tests/Marker_label_problem/rotated_bar_to_donut": { - "refs": ["98bc3b0"] + "refs": ["31e5697"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/Bubble_Stacked_Bubble_to_Area": { "refs": ["4869b33"] @@ -2450,7 +2450,7 @@ "refs": ["0c0db16"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/Treemap_Stacked_Treemap_to_Area": { - "refs": ["09f2385"] + "refs": ["e70d704"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/area_column_time_sum": { "refs": ["8271891"] @@ -2459,10 +2459,10 @@ "refs": ["940a163"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_bar_time_sum": { - "refs": ["803fea9"] + "refs": ["fa2d934"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_column_time_sum": { - "refs": ["ff38578"] + "refs": ["b4d4d15"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_drilldown_aggregate_x": { "refs": ["cba228a"] @@ -2471,511 +2471,511 @@ "refs": ["9b50630"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_tooltip_test": { - "refs": ["492a014"] + "refs": ["e353e15"] }, "ww_noFade/wNoFade_Tests/noFade_AND_Marker_transition_problem/pie_coxcomb_drilldown": { - "refs": ["55828d4"] + "refs": ["349d090"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/03_are": { - "refs": ["ada9bbd"] + "refs": ["653c42c"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/04a_are": { - "refs": ["1f1aacc"] + "refs": ["06861e7"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/04b_are": { - "refs": ["e5e590f"] + "refs": ["6f44b43"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/06a_are": { - "refs": ["96ca8d3"] + "refs": ["2ab7a3c"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/06b_are": { - "refs": ["7094dc9"] + "refs": ["b5f0237"] }, "ww_noFade/wNoFade_cases/1_des_pol/area_V1/06b_are_V1": { - "refs": ["7675a73"] + "refs": ["41d93b0"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/02_cir": { - "refs": ["64d4ece"] + "refs": ["14e9a52"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/03_cir": { - "refs": ["86d252f"] + "refs": ["f623b34"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/04_cir": { - "refs": ["71ff37d"] + "refs": ["2361512"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/05_cir": { - "refs": ["7fa6957"] + "refs": ["91cd6ec"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/06_cir_NO": { - "refs": ["924ef75"] + "refs": ["ba3df8f"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/07_cir": { - "refs": ["eeca449"] + "refs": ["e75bfc0"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/08_cir": { - "refs": ["cca3689"] + "refs": ["a86c378"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/04_cir_Ve1": { - "refs": ["2af22d8"] + "refs": ["7c33a6e"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/04_cir_Ve2": { - "refs": ["7e9fa70"] + "refs": ["69dad45"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/07_cir_Ve1": { - "refs": ["6417023"] + "refs": ["2359817"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04_cir_2c": { - "refs": ["9b57be3"] + "refs": ["e0ffb99"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04a_cir_1c": { - "refs": ["f477c61"] + "refs": ["4679c25"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04b_cir_1c": { - "refs": ["0810859"] + "refs": ["b835a5e"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05_cir_2c": { - "refs": ["1bfc65a"] + "refs": ["b5b94a8"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05a_cir_1c": { - "refs": ["59b6e4b"] + "refs": ["053344c"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05b_cir_1c": { - "refs": ["7e53bb3"] + "refs": ["63648d5"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06_cir_2c": { - "refs": ["c03351b"] + "refs": ["6c659b6"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06a_cir_1c": { - "refs": ["51f8b26"] + "refs": ["0e4cee8"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06b_cir_1c": { - "refs": ["bffa3e1"] + "refs": ["1d0fd4a"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/07_cir_2c": { - "refs": ["a054598"] + "refs": ["04cbb58"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/08_cir_2c": { - "refs": ["7040bce"] + "refs": ["91e97f0"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/04a_lin": { - "refs": ["68930a6"] + "refs": ["af67996"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/04b_lin": { - "refs": ["55934ac"] + "refs": ["5a0e153"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/05a_lin": { - "refs": ["e1f77c7"] + "refs": ["20236eb"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/05b_lin": { - "refs": ["00de777"] + "refs": ["03f4e3e"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/06a_lin": { - "refs": ["6818a51"] + "refs": ["dcd78c6"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/06b_lin": { - "refs": ["f515159"] + "refs": ["595b5b9"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04a_rec_1c": { - "refs": ["4397bcb"] + "refs": ["84b24fc"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04a_rec_2c": { - "refs": ["1f8a954"] + "refs": ["875b1f3"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04b_rec_1c": { - "refs": ["6b32587"] + "refs": ["fa06e3d"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04b_rec_2c": { - "refs": ["2df9123"] + "refs": ["3f5fcec"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/05a_rec_2c": { - "refs": ["134a2df"] + "refs": ["1e13e96"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/05b_rec_2c": { - "refs": ["bc5e99c"] + "refs": ["afef143"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06a_rec_1c": { - "refs": ["192c0b8"] + "refs": ["a8caa40"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06a_rec_2c": { - "refs": ["69d12d4"] + "refs": ["98707fd"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06b_rec_1c": { - "refs": ["d0011df"] + "refs": ["0ac4818"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06b_rec_2c": { - "refs": ["f6b9619"] + "refs": ["d2bb43e"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/07a_rec_1c": { - "refs": ["2d033fe"] + "refs": ["9cabe6e"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/07a_rec_2c": { - "refs": ["379ecc7"] + "refs": ["388d79d"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/08a_rec_2c": { - "refs": ["6c2e76d"] + "refs": ["a56287e"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/09_rec_TemporalDistribution": { - "refs": ["d2a4c6a"] + "refs": ["bee5cdb"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_V1/05b_rec_2c_V1": { - "refs": ["0809dc1"] + "refs": ["11cf47a"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_V1/06b_rec_1c_V1": { - "refs": ["9f2a6ba"] + "refs": ["d33de3d"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/04a_rec_Ve1_1c": { - "refs": ["0f10543"] + "refs": ["2d1b8b9"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/04a_rec_Ve1_2c": { - "refs": ["40b7f79"] + "refs": ["4b1d460"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/05a_rec_Ve1_2c": { - "refs": ["819fdce"] + "refs": ["fb8765b"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/06a_rec_Ve1_1c": { - "refs": ["a202f52"] + "refs": ["fe50081"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/07a_rec_Ve1_2c": { - "refs": ["0d9d4eb"] + "refs": ["a7a17ab"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/07a_rec_Ve2_2c": { - "refs": ["b19818c"] + "refs": ["2191904"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/08a_rec_Ve1_2c": { - "refs": ["3d2903c"] + "refs": ["65675b6"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/03_d-w_are": { - "refs": ["01bf115"] + "refs": ["d49a591"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/04a_d-w_are": { - "refs": ["e9e1187"] + "refs": ["a16c99e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/04b_d-w_are": { - "refs": ["e5c4c46"] + "refs": ["1530953"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/06a_d-w_are": { - "refs": ["f5ca6c2"] + "refs": ["dd8982f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/06b_d-w_are": { - "refs": ["6123f19"] + "refs": ["1403864"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/10_d-w_are_temporal_bubble": { - "refs": ["1b6a950"] + "refs": ["df108c1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/03_d-w_are": { - "refs": ["4abc784"] + "refs": ["c99bb8c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/04a_d-w_are": { - "refs": ["ee9cb63"] + "refs": ["3349bdc"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/04b_d-w_are": { - "refs": ["befa394"] + "refs": ["cf1f3e7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/06a_d-w_are": { - "refs": ["8824e97"] + "refs": ["ba34219"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/06b_d-w_are": { - "refs": ["a577a6d"] + "refs": ["3403077"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/10_d-w_are_temporal_bubble": { - "refs": ["f201348"] + "refs": ["1b9ae82"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/03_d-w_are_V1": { - "refs": ["0584f6a"] + "refs": ["57b2f0f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/04a_d-w_are_V1": { - "refs": ["80e2213"] + "refs": ["f9c1f1c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/04b_d-w_are_V1": { - "refs": ["36b679b"] + "refs": ["9920c67"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/06b_d-w_are_V1": { - "refs": ["d369a17"] + "refs": ["3d8f255"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/06b_d-w_are_V1_filter": { - "refs": ["69e23ce"] + "refs": ["f55f6cc"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle-rectangle/04a_d-w_cir_1c": { - "refs": ["9da6618"] + "refs": ["9b7ed01"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle-rectangle/04a_d-w_cir_V1_1c": { - "refs": ["ed11181"] + "refs": ["47d987a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/02_d-w_cir": { - "refs": ["3eea2c3"] + "refs": ["3dcf964"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/03_d-w_cir": { - "refs": ["b42c296"] + "refs": ["918cce1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04_d-w_cir_2c": { - "refs": ["cbee327"] + "refs": ["2d259fd"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04a_d-w_cir_1c": { - "refs": ["3df27b2"] + "refs": ["f85a42a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04b_d-w_cir_1c": { - "refs": ["0952c66"] + "refs": ["f7080ca"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05_d-w_cir_2c": { - "refs": ["3835739"] + "refs": ["4d174a7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05a_d-w_cir_1c": { - "refs": ["eedc637"] + "refs": ["185b392"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05b_d-w_cir_1c": { - "refs": ["acab898"] + "refs": ["faa1431"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06_d-w_cir_2c": { - "refs": ["98fc104"] + "refs": ["897af70"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06a_d-w_cir_1c": { - "refs": ["c785ade"] + "refs": ["38615aa"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06b_d-w_cir_1c": { - "refs": ["d82dc5e"] + "refs": ["63b2f8d"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/07_d-w_cir_2c": { - "refs": ["3fa0bb6"] + "refs": ["7f69107"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/08_d-w_cir_2c": { - "refs": ["f58e5e2"] + "refs": ["368727c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/03_d-w_cir_V1": { - "refs": ["0841bd2"] + "refs": ["376cef2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04_d-w_cir_V1_2c": { - "refs": ["39e5bf6"] + "refs": ["ea69ce9"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04a_d-w_cir_V1_1c": { - "refs": ["b012a3b"] + "refs": ["33fd59c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04b_d-w_cir_V1_1c": { - "refs": ["569f45f"] + "refs": ["3f63962"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/05_d-w_cir_V1_2c": { - "refs": ["9f2c6fe"] + "refs": ["fb736fe"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/05b_d-w_cir_V1_1c": { - "refs": ["4d78099"] + "refs": ["5c8fa68"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/06_d-w_cir_V1_2c": { - "refs": ["73928ab"] + "refs": ["d0cb4c7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/07_d-w_cir_V1_2c": { - "refs": ["02275aa"] + "refs": ["ee56a70"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/08_d-w_cir_V1_2c": { - "refs": ["c425c60"] + "refs": ["0211500"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/02_d-d_lin": { - "refs": ["dfcdc9e"] + "refs": ["6853dc8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/02_d-w_lin": { - "refs": ["fb7d371"] + "refs": ["3bfd0e4"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/03_d-w_lin": { - "refs": ["427ce69"] + "refs": ["98b68ae"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/04a_d-w_lin": { - "refs": ["4741bbe"] + "refs": ["447249e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/04b_d-w_lin": { - "refs": ["b25e4a2"] + "refs": ["02b3f4e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/05a_d-w_lin": { - "refs": ["d39b15f"] + "refs": ["15cdad9"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/05b_d-w_lin": { - "refs": ["9d0a678"] + "refs": ["7d1cb12"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/06a_d-w_lin": { - "refs": ["6d06be7"] + "refs": ["c89d1be"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/06b_d-w_lin": { - "refs": ["3190688"] + "refs": ["e753596"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/02_d-w_lin": { - "refs": ["82f4c05"] + "refs": ["afdaba1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/03_d-w_lin": { - "refs": ["938b0d1"] + "refs": ["61b0d16"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/04a_d-w_lin": { - "refs": ["2ad3118"] + "refs": ["9d11f64"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/04b_d-w_lin": { - "refs": ["1ed7086"] + "refs": ["89d5c3a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/05a_d-w_lin": { - "refs": ["16f774d"] + "refs": ["d2ffebc"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/05b_d-w_lin": { - "refs": ["4fe29f0"] + "refs": ["905ec69"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/06a_d-w_lin": { - "refs": ["e775d52"] + "refs": ["b09f88b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/06b_d-w_lin": { - "refs": ["32f2d5f"] + "refs": ["fe16d10"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/02_d-w_lin_V1": { - "refs": ["68c46fb"] + "refs": ["5a95f2f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/03_d-w_lin_V1": { - "refs": ["d12b90f"] + "refs": ["5a885d9"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/04a_d-w_lin_V1": { - "refs": ["a604db0"] + "refs": ["637da16"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/04b_d-w_lin_V1": { - "refs": ["95a37f6"] + "refs": ["8ab360e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/05a_d-w_lin_V1": { - "refs": ["1862d8e"] + "refs": ["56e58db"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/05b_d-w_lin_V1": { - "refs": ["0824eaf"] + "refs": ["1d88aed"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/06a_d-w_lin_V1": { - "refs": ["065a963"] + "refs": ["ef1475f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/06b_d-w_lin_V1": { - "refs": ["79950e8"] + "refs": ["6aa447f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/02_d-w_rec": { - "refs": ["1b9cacc"] + "refs": ["235eb95"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/03_d-w_rec": { - "refs": ["23b1593"] + "refs": ["6d128b0"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04a_d-w_rec_1c": { - "refs": ["c0c76b2"] + "refs": ["0cb5582"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04a_d-w_rec_2c": { - "refs": ["980caf0"] + "refs": ["c65f723"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04b_d-w_rec_1c": { - "refs": ["e4be43e"] + "refs": ["f65f28a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04b_d-w_rec_2c": { - "refs": ["8ff3ca6"] + "refs": ["5275969"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/05a_d-w_rec_2c": { - "refs": ["e087dad"] + "refs": ["1cdbf80"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/05b_d-w_rec_2c": { - "refs": ["cb21d67"] + "refs": ["da6f69f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06a_d-w_rec_1c": { - "refs": ["180c206"] + "refs": ["72607aa"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06b_d-w_rec_1c": { - "refs": ["c27945d"] + "refs": ["00b554e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06b_d-w_rec_2c": { - "refs": ["2c6b1f9"] + "refs": ["aef09bd"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/07a_d-w_rec_1c": { - "refs": ["95bfc96"] + "refs": ["8133538"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/07a_d-w_rec_2c": { - "refs": ["f759d04"] + "refs": ["2c11d99"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/08a_d-w_rec_2c": { - "refs": ["dde329f"] + "refs": ["e0ac53a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/03_d-w_rec_V1": { - "refs": ["0e97ae5"] + "refs": ["43c03f5"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04a_d-w_rec_Ve1_1c_V1": { - "refs": ["3552e53"] + "refs": ["e13910b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04a_d-w_rec_Ve1_2c_V1": { - "refs": ["fe2656a"] + "refs": ["aa03e0e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04b_d-w_rec_1c_V1": { - "refs": ["14b90bb"] + "refs": ["41e6b67"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04b_d-w_rec_2c_V1": { - "refs": ["8d9fc01"] + "refs": ["2a97441"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/05b_d-w_rec_2c_V1": { - "refs": ["e1db59d"] + "refs": ["40b868b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/07a_d-w_rec_Ve1_2c_V1": { - "refs": ["2f54c6d"] + "refs": ["45581f6"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/08a_d-w_rec_Ve1_2c_V1": { - "refs": ["d17cef3"] + "refs": ["3a79f36"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/04a_d-w_rec_Ve1_1c": { - "refs": ["b6119ed"] + "refs": ["8a22761"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/04a_d-w_rec_Ve1_2c": { - "refs": ["57e6726"] + "refs": ["cf8649b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/05a_d-w_rec_Ve1_2c": { - "refs": ["8743cce"] + "refs": ["1393d62"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/06a_d-w_rec_Ve1_1c": { - "refs": ["29d2998"] + "refs": ["515b1ea"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/06a_d-w_rec_Ve1_2c": { - "refs": ["2e6985e"] + "refs": ["3a8313c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve1_2c": { - "refs": ["927b07a"] + "refs": ["b59b433"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve1_2c_filter": { - "refs": ["3943065"] + "refs": ["5de5645"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve2_1c": { - "refs": ["bde1988"] + "refs": ["83cc279"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve2_2c": { - "refs": ["5e79bb9"] + "refs": ["1b71c6a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve3_2c": { - "refs": ["a860ca1"] + "refs": ["9ee5236"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/08a_d-w_rec_Ve1_2c": { - "refs": ["4637395"] + "refs": ["44f3990"] }, "ww_noFade/wNoFade_wPromotion/0_01_reorder": { - "refs": ["d0dcc71"] + "refs": ["8be63a5"] }, "ww_noFade/wNoFade_wPromotion/1_06b_are": { - "refs": ["feea7ea"] + "refs": ["3d56c9f"] }, "ww_noFade/wNoFade_wPromotion/2_05b_lin": { - "refs": ["9caa686"] + "refs": ["a481743"] }, "ww_noFade/wNoFade_wPromotion/3_04_cir": { - "refs": ["b170fd9"] + "refs": ["456c4d0"] }, "ww_noFade/wNoFade_wPromotion/4_06b_rec_1c": { - "refs": ["3170d39"] + "refs": ["c59da37"] }, "ww_noFade/wNoFade_wPromotion/4a_06b_rec_1c": { - "refs": ["c91bfb1"] + "refs": ["195de5d"] }, "ww_noFade/wNoFade_wPromotion/5_04a_rec_1c": { - "refs": ["94c94e8"] + "refs": ["063e2ed"] }, "ww_noFade/wNoFade_wPromotion/6_04a_cir_1c": { - "refs": ["873d0e3"] + "refs": ["9589ec3"] }, "ww_noFade/wNoFade_wPromotion/7_05_cir_2c": { "refs": ["4def5b2"] }, "ww_noFade/wNoFade_wPromotion/8_06b_d-w_cir_1c": { - "refs": ["4cd9302"] + "refs": ["40ef4cb"] }, "ww_noFade/wNoFade_wPromotion/9_06b_d-w_rec_1c": { - "refs": ["f034846"] + "refs": ["f9a26f4"] }, "ww_noFade/wNoFade_wPromotion/9a_06b_d-w_rec_1c": { - "refs": ["718cd2f"] + "refs": ["6b5c1dc"] }, "ww_samples_for_presets/cartesian_coo_sys/01_C_R_histogram": { "refs": ["298f298"] @@ -2984,13 +2984,13 @@ "refs": ["f29bdbd"] }, "web_content/presets_config/chart/column_stacked": { - "refs": ["b60b323"] + "refs": ["f62e297"] }, "ww_samples_for_presets/cartesian_coo_sys/05_C_R_split_column_chart": { "refs": ["cb0a0c9"] }, "ww_samples_for_presets/cartesian_coo_sys/06_C_R_100_stacked_column_chart": { - "refs": ["945db54"] + "refs": ["b69d2fe"] }, "ww_samples_for_presets/cartesian_coo_sys/07_C_R_range_column_chart": { "refs": ["11199c5"] @@ -2999,19 +2999,19 @@ "refs": ["ae2b423"] }, "ww_samples_for_presets/cartesian_coo_sys/09_C_R_stacked_mekko_chart": { - "refs": ["1065865"] + "refs": ["ea7470c"] }, "ww_samples_for_presets/cartesian_coo_sys/10_C_R_marimekko_chart": { - "refs": ["968af93"] + "refs": ["4c948e0"] }, "ww_samples_for_presets/cartesian_coo_sys/112_C_R_icicle_chart": { - "refs": ["14b3b95"] + "refs": ["29cd4b6"] }, "ww_samples_for_presets/cartesian_coo_sys/11_C_R_icicle_chart": { - "refs": ["508383a"] + "refs": ["bcf5f58"] }, "ww_samples_for_presets/cartesian_coo_sys/12_C_R_matrix_chart": { - "refs": ["9c4b9f8"] + "refs": ["df519de"] }, "ww_samples_for_presets/cartesian_coo_sys/13_C_R_bar_chart_negative": { "refs": ["2fd66d1"] @@ -3020,19 +3020,19 @@ "refs": ["d31dccc"] }, "web_content/presets_config/chart/bar_stacked": { - "refs": ["6b7d439"] + "refs": ["3a74df2"] }, "ww_samples_for_presets/cartesian_coo_sys/16_C_R_splitted_bar_chart": { "refs": ["636112d"] }, "ww_samples_for_presets/cartesian_coo_sys/17_C_R_100_stacked_bar_chart": { - "refs": ["2a52ddf"] + "refs": ["101bc98"] }, "ww_samples_for_presets/cartesian_coo_sys/19_C_R_range_bar_chart": { "refs": ["afdeda8"] }, "ww_samples_for_presets/cartesian_coo_sys/201_C_C_devided_lollipop_chart": { - "refs": ["7f382af"] + "refs": ["6aee59e"] }, "ww_samples_for_presets/cartesian_coo_sys/20_C_C_lollipop_chart": { "refs": ["25c68b8"] @@ -3044,7 +3044,7 @@ "refs": ["7a79697"] }, "ww_samples_for_presets/cartesian_coo_sys/24_C_C_bubble_plot": { - "refs": ["9d8d76c"] + "refs": ["f4d00bf"] }, "ww_samples_for_presets/cartesian_coo_sys/25_C_C_correlogram": { "refs": ["24ede3c"] @@ -3056,7 +3056,7 @@ "refs": ["ef2e07b"] }, "ww_samples_for_presets/cartesian_coo_sys/29_C_A_stacked_area_chart_percentage_labels": { - "refs": ["66eb83a"] + "refs": ["82f0cc7"] }, "ww_samples_for_presets/cartesian_coo_sys/30_C_A_overlay_area_chart": { "refs": ["b3363f6"] @@ -3065,10 +3065,10 @@ "refs": ["4635b93"] }, "ww_samples_for_presets/cartesian_coo_sys/32_C_A_stream_graph": { - "refs": ["10b7209"] + "refs": ["a2aa12d"] }, "ww_samples_for_presets/cartesian_coo_sys/33_C_A_stream_graph_vert": { - "refs": ["25227bf"] + "refs": ["0a6090f"] }, "ww_samples_for_presets/cartesian_coo_sys/34_C_A_violin_graph": { "refs": ["87266d3"] @@ -3077,40 +3077,40 @@ "refs": ["07891c6"] }, "ww_samples_for_presets/cartesian_coo_sys/36_C_A_range_area_chart": { - "refs": ["91ba861"] + "refs": ["c143145"] }, "ww_samples_for_presets/cartesian_coo_sys/371_C_L_line_chart_nega": { "refs": ["ebadb12"] }, "ww_samples_for_presets/cartesian_coo_sys/37_C_A_funnel": { - "refs": ["6550b85"] + "refs": ["51a48cd"] }, "ww_samples_for_presets/cartesian_coo_sys/38_C_L_line_chart_nega": { - "refs": ["a731cb5"] + "refs": ["f2cba0d"] }, "ww_samples_for_presets/cartesian_coo_sys/39_C_L_line_chart_vert": { - "refs": ["ddd0340"] + "refs": ["df2b7bd"] }, "ww_samples_for_presets/polar_coo_sys/41_P_R_multi-level_pie_chart": { - "refs": ["afc4bde"] + "refs": ["124a4fc"] }, "web_content/presets_config/chart/column_polar_stacked": { - "refs": ["fe7921d"] + "refs": ["84965b4"] }, "web_content/presets_config/chart/column_polar": { - "refs": ["abd7844"] + "refs": ["4d85e79"] }, "ww_samples_for_presets/polar_coo_sys/43_P_R_polar_column_chart_Yrange": { - "refs": ["67fb5c5"] + "refs": ["0c27d98"] }, "web_content/presets_config/chart/pie_variable_radius": { - "refs": ["319851e"] + "refs": ["432c2e3"] }, "ww_samples_for_presets/polar_coo_sys/46_P_R_coxcomb_nightingale_rose_chart": { - "refs": ["2ca1627"] + "refs": ["9e73f22"] }, "ww_samples_for_presets/polar_coo_sys/47_P_R_polar_area_chart": { - "refs": ["3634602"] + "refs": ["82fc490"] }, "ww_samples_for_presets/polar_coo_sys/48_P_R_polar_range_column_chart": { "refs": ["862b4bf"] @@ -3119,19 +3119,19 @@ "refs": ["ddf8e3c"] }, "web_content/presets_config/chart/bar_radial_stacked": { - "refs": ["6c4296c"] + "refs": ["f8318c2"] }, "ww_samples_for_presets/polar_coo_sys/52_P_R_nested_multi_level_donut_chart": { - "refs": ["7b60d77"] + "refs": ["d32f18a"] }, "ww_samples_for_presets/polar_coo_sys/53_P_C_polar_scatter_plot": { "refs": ["b10fee5"] }, "ww_samples_for_presets/polar_coo_sys/54_P_A_area_trump_chart": { - "refs": ["7054ac4"] + "refs": ["cde0d8c"] }, "ww_samples_for_presets/polar_coo_sys/551_P_A_polar_stream_graph": { - "refs": ["c2df43f"] + "refs": ["c7f4961"] }, "ww_samples_for_presets/polar_coo_sys/55_P_A_polar_overlay_area_chart": { "refs": ["852e4a1"] @@ -3146,7 +3146,7 @@ "refs": ["2a0ba0d"] }, "ww_samples_for_presets/without_coo_sys/602_W_R_heatmap3": { - "refs": ["6db6e71"] + "refs": ["bedf52f"] }, "ww_samples_for_presets/without_coo_sys/60_W_R_heatmap": { "refs": ["972f61d"] @@ -3161,22 +3161,22 @@ "refs": ["04fda2d"] }, "www_new_analytical_operations/operations/02_sum/Bubble_Bubble": { - "refs": ["f76ebc3"] + "refs": ["9725cec"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_1": { "refs": ["9bae423"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_2": { - "refs": ["38a7926"] + "refs": ["3d13362"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_to_Bar": { "refs": ["c9b5412"] }, "www_new_analytical_operations/operations/02_sum/Column_Stacked_Column_1": { - "refs": ["e77a910"] + "refs": ["e681d35"] }, "www_new_analytical_operations/operations/02_sum/Column_Stacked_Column_2": { - "refs": ["60da6f4"] + "refs": ["247213e"] }, "www_new_analytical_operations/operations/02_sum/Coxcomb_Coxcomb_to_Donut": { "refs": ["bdd89d9"] @@ -3191,13 +3191,13 @@ "refs": ["826ac4a"] }, "www_new_analytical_operations/operations/07_distribute/Treemap_Stacked_Treemap_to_Area": { - "refs": ["a5aef93"] + "refs": ["5368d69"] }, "basic_animations/markers_morph/marker_trans_polar": { "refs": ["4f319e0"] }, "web_content/cookbook/chart_types/exploded_pie_chart": { - "refs": ["2c41de2"] + "refs": ["9b4b739"] }, "web_content/cookbook/chart_types/gant_chart": { "refs": ["810d76a"] @@ -3206,7 +3206,7 @@ "refs": ["18079a9"] }, "web_content/cookbook/chart_types/network_graph": { - "refs": ["6b7b6ac"] + "refs": ["d9b58e7"] }, "web_content/cookbook/chart_types/step_line_chart": { "refs": ["73307f1"] @@ -3236,7 +3236,7 @@ "refs": ["bd104b0"] }, "web_content/cookbook/style/dark_theme": { - "refs": ["612926d"] + "refs": ["86827ed"] }, "web_content/cookbook/style/highligh_markers": { "refs": ["48d6207"] @@ -3278,7 +3278,7 @@ "refs": ["da8ec16"] }, "web_content/cookbook/interactive/filter_slider": { - "refs": ["cae7314"] + "refs": ["7eb8962"] }, "web_content/cookbook/interactive/range_slider_zoom": { "refs": ["c8a63f6"] @@ -3290,7 +3290,7 @@ "refs": ["46937a0"] }, "web_content/cookbook/style/colorfilter": { - "refs": ["05406ff"] + "refs": ["1f7dbd8"] } } } diff --git a/test/e2e/tests/config_tests.json b/test/e2e/tests/config_tests.json index ee73e4067..0c3f3bb62 100644 --- a/test/e2e/tests/config_tests.json +++ b/test/e2e/tests/config_tests.json @@ -45,6 +45,9 @@ }, "dimension_axis_density": { "refs": ["9b330fb"] + }, + "geometry/animated_area-circle": { + "refs": ["6f40a47"] } } } diff --git a/test/e2e/tests/features.json b/test/e2e/tests/features.json index eeb765013..c230caec1 100644 --- a/test/e2e/tests/features.json +++ b/test/e2e/tests/features.json @@ -11,7 +11,7 @@ "refs": ["d7c6dee"] }, "data_input/object_records": { - "refs": ["9d5443f"] + "refs": ["3a584a1"] }, "events/drawing_events": { "refs": ["49abe43"] @@ -26,7 +26,7 @@ "refs": ["7b07504"] }, "presets": { - "refs": ["f3dcfc3"] + "refs": ["2d98b7c"] }, "detach": { "refs": ["e3b0c44"] diff --git a/test/e2e/tests/fixes.json b/test/e2e/tests/fixes.json index bb43a0c85..b5f5f851c 100644 --- a/test/e2e/tests/fixes.json +++ b/test/e2e/tests/fixes.json @@ -32,10 +32,10 @@ "refs": ["e03918d"] }, "536": { - "refs": ["40a70bd"] + "refs": ["8d89406"] }, "540": { - "refs": ["bc34559"] + "refs": ["6e7b1ef"] }, "32303048": { "refs": ["b5d95ea"] @@ -44,10 +44,10 @@ "refs": ["2ad1738"] }, "41932946": { - "refs": ["89bd3b7"] + "refs": ["636863b"] }, "42836788": { - "refs": ["9a7a020"] + "refs": ["514c798"] }, "47977099": { "refs": ["5f58727"] diff --git a/test/e2e/tests/style_tests.json b/test/e2e/tests/style_tests.json index 098f6cfdb..79e66fe9e 100644 --- a/test/e2e/tests/style_tests.json +++ b/test/e2e/tests/style_tests.json @@ -755,124 +755,124 @@ "refs": ["4251172"] }, "plot/xAxis/ticks/color/hexa/animated_yellowCustom_0.25-blueCustom_0.75": { - "refs": ["a360f87"] + "refs": ["e57d362"] }, "plot/xAxis/ticks/color/hexa/animated_yellowCustom_0.75-blueCustom_0.25": { - "refs": ["d842ab2"] + "refs": ["527bf49"] }, "plot/xAxis/ticks/color/hexa/static_blueCustom_0.25": { - "refs": ["6cbd421"] + "refs": ["504ddc4"] }, "plot/xAxis/ticks/color/hexa/static_blueCustom_0.75": { - "refs": ["a2ed2d4"] + "refs": ["f87b6dc"] }, "plot/xAxis/ticks/color/hexa/static_yellowCustom_0.25": { - "refs": ["97dbfe4"] + "refs": ["6ac60b3"] }, "plot/xAxis/ticks/color/hexa/static_yellowCustom_0.75": { - "refs": ["6589806"] + "refs": ["81302bf"] }, "plot/xAxis/ticks/length/elementFontPercentage/animated_1-3": { - "refs": ["ee47f09"] + "refs": ["4ee15e5"] }, "plot/xAxis/ticks/length/elementFontPercentage/animated_3-1": { - "refs": ["1f1df3f"] + "refs": ["3c97644"] }, "plot/xAxis/ticks/length/elementFontPercentage/static_1": { - "refs": ["c45d541"] + "refs": ["5489b4d"] }, "plot/xAxis/ticks/length/elementFontPercentage/static_2": { - "refs": ["5a49004"] + "refs": ["eb637dd"] }, "plot/xAxis/ticks/length/elementFontPercentage/static_3": { - "refs": ["bdf6514"] + "refs": ["ae0f87b"] }, "plot/xAxis/ticks/length/elementPercentage/animated_10-20": { - "refs": ["9e803f2"] + "refs": ["3071681"] }, "plot/xAxis/ticks/length/elementPercentage/animated_20-10": { - "refs": ["ceb4f9f"] + "refs": ["c4a4936"] }, "plot/xAxis/ticks/length/elementPercentage/static_10": { - "refs": ["37cee05"] + "refs": ["d372af9"] }, "plot/xAxis/ticks/length/elementPercentage/static_15": { - "refs": ["c3d7997"] + "refs": ["ce6e73b"] }, "plot/xAxis/ticks/length/elementPercentage/static_20": { - "refs": ["c22e9f5"] + "refs": ["6e0b521"] }, "plot/xAxis/ticks/length/number/animated_1-50": { - "refs": ["cdfe7d0"] + "refs": ["287f82f"] }, "plot/xAxis/ticks/length/number/animated_50-1": { - "refs": ["6307e34"] + "refs": ["435e00a"] }, "plot/xAxis/ticks/length/number/static_1": { - "refs": ["0910e0d"] + "refs": ["fff348d"] }, "plot/xAxis/ticks/length/number/static_10": { - "refs": ["7892e9d"] + "refs": ["baf83bc"] }, "plot/xAxis/ticks/length/number/static_50": { - "refs": ["f47bfc1"] + "refs": ["64206de"] }, "plot/xAxis/ticks/length/pixel/animated_1-50": { - "refs": ["cdfe7d0"] + "refs": ["287f82f"] }, "plot/xAxis/ticks/length/pixel/animated_50-1": { - "refs": ["6307e34"] + "refs": ["435e00a"] }, "plot/xAxis/ticks/length/pixel/static_1": { - "refs": ["0910e0d"] + "refs": ["fff348d"] }, "plot/xAxis/ticks/length/pixel/static_10": { - "refs": ["7892e9d"] + "refs": ["baf83bc"] }, "plot/xAxis/ticks/length/pixel/static_50": { - "refs": ["f47bfc1"] + "refs": ["64206de"] }, "plot/xAxis/ticks/lineWidth/animated_1-100": { - "refs": ["827e1c4"] + "refs": ["9741cf4"] }, "plot/xAxis/ticks/lineWidth/animated_100-1": { - "refs": ["262bea0"] + "refs": ["2c3edf5"] }, "plot/xAxis/ticks/lineWidth/static_1": { - "refs": ["567dbdd"] + "refs": ["1a078e4"] }, "plot/xAxis/ticks/lineWidth/static_10": { - "refs": ["9357126"] + "refs": ["fd124c0"] }, "plot/xAxis/ticks/lineWidth/static_100": { - "refs": ["863c0ca"] + "refs": ["3e63c07"] }, "plot/xAxis/ticks/position/animated_center-inside": { - "refs": ["c2a09e6"] + "refs": ["8e424bb"] }, "plot/xAxis/ticks/position/animated_center-outside": { - "refs": ["876e456"] + "refs": ["9f6f51b"] }, "plot/xAxis/ticks/position/animated_inside-center": { - "refs": ["63dee9d"] + "refs": ["cead554"] }, "plot/xAxis/ticks/position/animated_inside-outside": { - "refs": ["4b4f2c9"] + "refs": ["f9df062"] }, "plot/xAxis/ticks/position/animated_outside-center": { - "refs": ["4e7fdb8"] + "refs": ["4a6469a"] }, "plot/xAxis/ticks/position/animated_outside-inside": { - "refs": ["9cd88ee"] + "refs": ["69d1af8"] }, "plot/xAxis/ticks/position/static_center": { - "refs": ["2486ad6"] + "refs": ["453d794"] }, "plot/xAxis/ticks/position/static_inside": { - "refs": ["5ebfff2"] + "refs": ["9467953"] }, "plot/xAxis/ticks/position/static_outside": { - "refs": ["567dbdd"] + "refs": ["1a078e4"] }, "plot/yAxis/color/hexa/animated_yellowCustom_0.25-blueCustom_0.75": { "refs": ["7b02bd5"] @@ -911,121 +911,121 @@ "refs": ["2a96474"] }, "plot/yAxis/ticks/color/hexa/animated_yellowCustom_0.25-blueCustom_0.75": { - "refs": ["5590621"] + "refs": ["97837c2"] }, "plot/yAxis/ticks/color/hexa/animated_yellowCustom_0.75-blueCustom_0.25": { - "refs": ["f1a200b"] + "refs": ["e81b33a"] }, "plot/yAxis/ticks/color/hexa/static_blueCustom_0.25": { - "refs": ["61a1172"] + "refs": ["cf250f4"] }, "plot/yAxis/ticks/color/hexa/static_blueCustom_0.75": { - "refs": ["5de3659"] + "refs": ["9896517"] }, "plot/yAxis/ticks/color/hexa/static_yellowCustom_0.25": { - "refs": ["901cb0c"] + "refs": ["5178067"] }, "plot/yAxis/ticks/color/hexa/static_yellowCustom_0.75": { - "refs": ["0ae00e6"] + "refs": ["4e72505"] }, "plot/yAxis/ticks/length/elementFontPercentage/animated_1-3": { - "refs": ["489228e"] + "refs": ["7c513ea"] }, "plot/yAxis/ticks/length/elementFontPercentage/animated_3-1": { - "refs": ["418c5ea"] + "refs": ["45b296b"] }, "plot/yAxis/ticks/length/elementFontPercentage/static_1": { - "refs": ["ae6d047"] + "refs": ["4529427"] }, "plot/yAxis/ticks/length/elementFontPercentage/static_2": { - "refs": ["c965307"] + "refs": ["319b438"] }, "plot/yAxis/ticks/length/elementFontPercentage/static_3": { - "refs": ["b6b10ba"] + "refs": ["aa1b8ee"] }, "plot/yAxis/ticks/length/elementPercentage/animated_1-6": { - "refs": ["6bb90a8"] + "refs": ["13a6c0b"] }, "plot/yAxis/ticks/length/elementPercentage/animated_6-1": { - "refs": ["d5eeeb3"] + "refs": ["62c7e05"] }, "plot/yAxis/ticks/length/elementPercentage/static_1": { - "refs": ["14f624e"] + "refs": ["201bf94"] }, "plot/yAxis/ticks/length/elementPercentage/static_3": { - "refs": ["0b8e282"] + "refs": ["027c3da"] }, "plot/yAxis/ticks/length/elementPercentage/static_6": { - "refs": ["11f8745"] + "refs": ["8c16a81"] }, "plot/yAxis/ticks/length/number/animated_1-50": { - "refs": ["af42a30"] + "refs": ["9495c73"] }, "plot/yAxis/ticks/length/number/animated_50-1": { - "refs": ["fe683f9"] + "refs": ["f42f46e"] }, "plot/yAxis/ticks/length/number/static_1": { - "refs": ["552338a"] + "refs": ["3fe6e99"] }, "plot/yAxis/ticks/length/number/static_10": { - "refs": ["997ff1a"] + "refs": ["e6728b6"] }, "plot/yAxis/ticks/length/number/static_50": { - "refs": ["67e7057"] + "refs": ["2d5b768"] }, "plot/yAxis/ticks/length/pixel/animated_1-50": { - "refs": ["af42a30"] + "refs": ["9495c73"] }, "plot/yAxis/ticks/length/pixel/animated_50-1": { - "refs": ["fe683f9"] + "refs": ["f42f46e"] }, "plot/yAxis/ticks/length/pixel/static_1": { - "refs": ["552338a"] + "refs": ["3fe6e99"] }, "plot/yAxis/ticks/length/pixel/static_10": { - "refs": ["997ff1a"] + "refs": ["e6728b6"] }, "plot/yAxis/ticks/length/pixel/static_50": { - "refs": ["67e7057"] + "refs": ["2d5b768"] }, "plot/yAxis/ticks/lineWidth/animated_1-10": { - "refs": ["1fcad7e"] + "refs": ["f0689cb"] }, "plot/yAxis/ticks/lineWidth/animated_10-1": { - "refs": ["2124ec9"] + "refs": ["84b4e34"] }, "plot/yAxis/ticks/lineWidth/static_1": { - "refs": ["aabb1c2"] + "refs": ["2ec4be9"] }, "plot/yAxis/ticks/lineWidth/static_10": { - "refs": ["378ad88"] + "refs": ["77b78a6"] }, "plot/yAxis/ticks/position/animated_center-inside": { - "refs": ["7e39728"] + "refs": ["5968a95"] }, "plot/yAxis/ticks/position/animated_center-outside": { - "refs": ["dee79a9"] + "refs": ["6e8c5aa"] }, "plot/yAxis/ticks/position/animated_inside-center": { - "refs": ["35d563c"] + "refs": ["9d55ffd"] }, "plot/yAxis/ticks/position/animated_inside-outside": { - "refs": ["1b5c8e1"] + "refs": ["38d25e0"] }, "plot/yAxis/ticks/position/animated_outside-center": { - "refs": ["dd28705"] + "refs": ["8574742"] }, "plot/yAxis/ticks/position/animated_outside-inside": { - "refs": ["7ff41e9"] + "refs": ["1dc3ca8"] }, "plot/yAxis/ticks/position/static_center": { - "refs": ["2e55f6e"] + "refs": ["426b276"] }, "plot/yAxis/ticks/position/static_inside": { - "refs": ["3f8f4cf"] + "refs": ["f748716"] }, "plot/yAxis/ticks/position/static_outside": { - "refs": ["aabb1c2"] + "refs": ["2ec4be9"] }, "plot/xAxis/label/autorotate": { "refs": ["f179c0b"] From d97718bda3e966424e76a0c1400db7ae5d7d28f3 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Tue, 30 Jul 2024 15:40:34 +0200 Subject: [PATCH 08/20] Self-review + changelog --- CHANGELOG.md | 8 ++++++++ src/dataframe/old/datatable.cpp | 10 +++++----- test/e2e/tests/config_tests.json | 3 --- test/unit/dataframe/interface_test.cpp | 3 +-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 126a9ab40..0b8a46fc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +### Fixed + +- Markers are the same even if new record added. + +### Added + +- Changed MarkerId to be a string instead of a number. + ## [0.12.0] - 2024-07-29 ### Fixed diff --git a/src/dataframe/old/datatable.cpp b/src/dataframe/old/datatable.cpp index 0a7e7214e..37b22ef78 100644 --- a/src/dataframe/old/datatable.cpp +++ b/src/dataframe/old/datatable.cpp @@ -152,10 +152,10 @@ DataCube::DataCube(const DataTable &table, df->finalize(); for (std::size_t ix{}; const auto &dim : dimensions) { auto &&dimName = dim.getColIndex(); - auto &&cats = df->get_categories(dimName.view()); + auto &&cats = df->get_categories(dimName); dim_reindex.push_back(DimensionInfo{dimName, cats, - cats.size() + df->has_na(dimName.view()), + cats.size() + df->has_na(dimName), ix++}); } @@ -276,7 +276,7 @@ std::string DataCube::joinDimensionValues(const SeriesList &sl, for (auto &&sv : resColl) { if (!res.empty()) res += ", "; - res += sv.view(); + res += sv; } return res; } @@ -296,7 +296,7 @@ DataCube::cellInfo(const MultiIndex &index, bool needMarkerInfo) const auto &&cix = index.old[ix]; auto &&cat = cix < cats.size() ? cats[cix] : Text::immutable_string{}; - dims.key(name.view()).primitive(cat); + dims.key(name).primitive(cat); if (needMarkerInfo) my_res->markerInfo.emplace_back(name, cat); } @@ -304,7 +304,7 @@ DataCube::cellInfo(const MultiIndex &index, bool needMarkerInfo) const for (Conv::JSONObj &&vals{obj.nested("values")}; auto &&meas : df->get_measures()) { auto val = std::get(df->get_data(index.rid, meas)); - vals.key(meas.view()).primitive(val); + vals.key(meas).primitive(val); if (needMarkerInfo) { thread_local auto conv = Conv::NumberToString{.fractionDigitCount = 3}; diff --git a/test/e2e/tests/config_tests.json b/test/e2e/tests/config_tests.json index 0c3f3bb62..ee73e4067 100644 --- a/test/e2e/tests/config_tests.json +++ b/test/e2e/tests/config_tests.json @@ -45,9 +45,6 @@ }, "dimension_axis_density": { "refs": ["9b330fb"] - }, - "geometry/animated_area-circle": { - "refs": ["6f40a47"] } } } diff --git a/test/unit/dataframe/interface_test.cpp b/test/unit/dataframe/interface_test.cpp index 77fa68a5e..a65bf12b6 100644 --- a/test/unit/dataframe/interface_test.cpp +++ b/test/unit/dataframe/interface_test.cpp @@ -150,8 +150,7 @@ const static auto tests = {[](Vizzu::Data::RowWrapper, cell_reference c) -> cell_value { if (c.index() == 0) return std::get<0>(c); - auto *str = std::get<1>(c); - return str ? str->view() : std::string_view{}; + return *std::get<1>(c); }}, {}); throw_<&interface::set_aggregate>(df, {}, {}); From 3e762f821c8b06bbb07717a1c351d965d0a25f3a Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 12 Aug 2024 14:45:21 +0200 Subject: [PATCH 09/20] Fix merge --- test/e2e/test_cases/test_cases.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/e2e/test_cases/test_cases.json b/test/e2e/test_cases/test_cases.json index 57ba966ca..d63f44375 100644 --- a/test/e2e/test_cases/test_cases.json +++ b/test/e2e/test_cases/test_cases.json @@ -113,7 +113,7 @@ "refs": ["92f463e"] }, "basic_animations/someOtherTests/merge_split_area_stream_2dis_1con": { - "refs": ["231b713"] + "refs": ["7bb4b07"] }, "basic_animations/someOtherTests/total_time_area_bar": { "refs": ["4439736"] @@ -506,7 +506,7 @@ "refs": ["a412316"] }, "web_content/analytical_operations/compare/stream_stacked": { - "refs": ["39ebf7a"] + "refs": ["2a96eb4"] }, "web_content/analytical_operations/compare/waterfall": { "refs": ["16a3b23"] @@ -620,10 +620,10 @@ "refs": ["3bc3a48"] }, "web_content/analytical_operations/filter/stream_1": { - "refs": ["4ada756"] + "refs": ["5d6cc72"] }, "web_content/analytical_operations/filter/stream_2": { - "refs": ["6a47661"] + "refs": ["f1a6b8f"] }, "web_content/analytical_operations/misc/donut_to_coxcomb": { "refs": ["20caa7e"] @@ -770,7 +770,7 @@ "refs": ["b77d3f6"] }, "web_content/analytical_operations/sum/stream_stacked": { - "refs": ["a4ddca9"] + "refs": ["3868421"] }, "web_content/analytical_operations/sum/treemap": { "refs": ["55e5547"] @@ -923,10 +923,10 @@ "refs": ["b5996be"] }, "web_content/presets/graph/stream": { - "refs": ["f707172"] + "refs": ["81b7630"] }, "web_content/presets/graph/stream_vertical": { - "refs": ["0c56a02"] + "refs": ["0dd5cec"] }, "web_content/presets/graph/violin": { "refs": ["16f0508"] @@ -3065,10 +3065,10 @@ "refs": ["4635b93"] }, "ww_samples_for_presets/cartesian_coo_sys/32_C_A_stream_graph": { - "refs": ["a2aa12d"] + "refs": ["15827dd"] }, "ww_samples_for_presets/cartesian_coo_sys/33_C_A_stream_graph_vert": { - "refs": ["0a6090f"] + "refs": ["1867447"] }, "ww_samples_for_presets/cartesian_coo_sys/34_C_A_violin_graph": { "refs": ["f6a2b5f"] @@ -3077,7 +3077,7 @@ "refs": ["cac7dd7"] }, "ww_samples_for_presets/cartesian_coo_sys/36_C_A_range_area_chart": { - "refs": ["c143145"] + "refs": ["8eb2104"] }, "ww_samples_for_presets/cartesian_coo_sys/371_C_L_line_chart_nega": { "refs": ["ebadb12"] @@ -3131,7 +3131,7 @@ "refs": ["cde0d8c"] }, "ww_samples_for_presets/polar_coo_sys/551_P_A_polar_stream_graph": { - "refs": ["c7f4961"] + "refs": ["45f55a7"] }, "ww_samples_for_presets/polar_coo_sys/55_P_A_polar_overlay_area_chart": { "refs": ["852e4a1"] @@ -3146,7 +3146,7 @@ "refs": ["2a0ba0d"] }, "ww_samples_for_presets/without_coo_sys/602_W_R_heatmap3": { - "refs": ["bedf52f"] + "refs": ["4297230"] }, "ww_samples_for_presets/without_coo_sys/60_W_R_heatmap": { "refs": ["972f61d"] @@ -3278,7 +3278,7 @@ "refs": ["da8ec16"] }, "web_content/cookbook/interactive/filter_slider": { - "refs": ["7eb8962"] + "refs": ["1d14f82"] }, "web_content/cookbook/interactive/range_slider_zoom": { "refs": ["c8a63f6"] From 3d3fc0a53c69be54e1abb0e9dd71e5ea001a209e Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 26 Aug 2024 14:53:47 +0200 Subject: [PATCH 10/20] Add translateY style parameter to legend + test --- src/apps/weblib/typeschema-api/styles.yaml | 17 ++++- src/base/gfx/length.cpp | 25 ++++--- src/chart/main/style.cpp | 3 +- src/chart/main/style.h | 1 + src/chart/rendering/drawlegend.cpp | 45 ++++++++--- src/chart/rendering/drawlegend.h | 8 +- test/e2e/tests/style_tests.json | 3 + test/e2e/tests/style_tests/legend/offsetY.mjs | 74 +++++++++++++++++++ 8 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 test/e2e/tests/style_tests/legend/offsetY.mjs diff --git a/src/apps/weblib/typeschema-api/styles.yaml b/src/apps/weblib/typeschema-api/styles.yaml index 4d8c117a1..465f4f97f 100644 --- a/src/apps/weblib/typeschema-api/styles.yaml +++ b/src/apps/weblib/typeschema-api/styles.yaml @@ -1,14 +1,21 @@ --- definitions: - Length: + LengthUnit: description: | - Length can be set in pixels or in percentage of the element or the element's + LengthUnit can be set in pixels or in percentage of the element or the element's font size. Pixel is the default unit. oneOf: - { type: string, mask: /:number:px/ } - { type: string, mask: /:number:%/ } - { type: string, mask: /:number:em/ } - type: number + Length: + description: | + Length can be LengthUnit or addition of LengthUnits. + oneOf: + - { type: string, mask: /:LengthUnit:/ } + - { type: string, mask: '/:LengthUnit:+:LengthUnit:/' } + - { type: string, mask: '/:LengthUnit:+:LengthUnit:+:LengthUnit:/' } Angle: description: | @@ -32,7 +39,7 @@ definitions: NumberScale: description: | - Number scale for human readable big number formats. + Number scale for human-readable big number formats. There are built in formats: - SI Symbols: k, M, G, ... - Short scale with US abbreviations: K, M, B, T @@ -524,6 +531,10 @@ definitions: marker: $ref: LegendMarker nullable: true + translateY: + description: Vertical translation of the marker list. + $ref: Length + nullable: true ColorStop: description: | diff --git a/src/base/gfx/length.cpp b/src/base/gfx/length.cpp index a9ecfc129..230dbde54 100644 --- a/src/base/gfx/length.cpp +++ b/src/base/gfx/length.cpp @@ -3,6 +3,7 @@ #include #include +#include "base/text/smartstring.h" #include "base/text/valueunit.h" namespace Gfx @@ -11,18 +12,20 @@ namespace Gfx Length Length::fromString(const std::string &s) { Length res{}; - const Text::ValueUnit parser(s); - if (const auto &unit = parser.getUnit(); unit == "%") { - res.relative = parser.getValue() / 100.0; + for (auto &&part : Text::SmartString::split(s, '+', true)) { + const Text::ValueUnit parser(part); + if (const auto &unit = parser.getUnit(); unit == "%") { + res.relative += parser.getValue() / 100.0; + } + else if (unit == "em") { + res.emphemeral += parser.getValue(); + } + else if (unit == "px" || unit.empty()) { + res.absolute += parser.getValue(); + } + else + throw std::logic_error("invalid length unit: " + unit); } - else if (unit == "em") { - res.emphemeral = parser.getValue(); - } - else if (unit == "px" || unit.empty()) { - res.absolute = parser.getValue(); - } - else - throw std::logic_error("invalid length unit: " + unit); return res; } diff --git a/src/chart/main/style.cpp b/src/chart/main/style.cpp index 5ed598e81..23a453359 100644 --- a/src/chart/main/style.cpp +++ b/src/chart/main/style.cpp @@ -453,7 +453,8 @@ Chart Chart::def() .marker = { .type = ::Anim::Interpolated(Legend::Marker::Type::circle), .size = Gfx::Length::Emphemeral(18.0 / 14.0) - } + }, + .translateY = Gfx::Length{} } }, .title = { diff --git a/src/chart/main/style.h b/src/chart/main/style.h index 401891208..23f643d09 100644 --- a/src/chart/main/style.h +++ b/src/chart/main/style.h @@ -339,6 +339,7 @@ struct LegendParams Label title; Label label; Marker marker; + Param translateY; }; struct Legend : Padding, Box, LegendParams diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 40cb13647..625edf968 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -31,19 +31,29 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, auto contentRect = style.contentRect(legendLayout, rootStyle.calculatedSize()); + auto markerWindowRect = contentRect; + auto titleRect = + markerWindowRect.popBottom(style.title.getHeight()); + auto &&info = Info{ .canvas = canvas, - .contentRect = contentRect, + .titleRect = titleRect, + .markerWindowRect = markerWindowRect, + .yOffset = {}, .type = channelType, .weight = weight, .itemHeight = style.label.getHeight(), - .titleHeight = style.title.getHeight(), .markerSize = style.marker.size->get(contentRect.size.y, style.label.calculatedSize()), .measure = plot->axises.at(channelType).measure, .dimension = plot->axises.at(channelType).dimension, }; + auto yOverflow = + markersLegendFullSize(info) - markerWindowRect.height(); + if (std::signbit(yOverflow)) yOverflow = 0.0; + info.yOffset = style.translateY->get(yOverflow, info.itemHeight); + DrawBackground{{ctx()}}.draw(canvas, legendLayout, style, @@ -55,6 +65,8 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, drawTitle(info); + canvas.setClipRect(markerWindowRect); + drawDimension(info); drawMeasure(info); @@ -64,12 +76,10 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, void DrawLegend::drawTitle(const Info &info) const { - auto rect = info.contentRect; - rect.size.y = info.titleHeight; plot->axises.at(info.type).common.title.visit( [this, &info, - &rect, + &rect = info.titleRect, mul = std::max(info.measureEnabled, info.dimensionEnabled)](::Anim::InterpolateIndex, const auto &title) @@ -97,7 +107,9 @@ void DrawLegend::drawDimension(const Info &info) const auto itemRect = getItemRect(info, value.second.range.getMin()); - if (itemRect.y().getMax() >= info.contentRect.y().getMax()) + if (itemRect.y().getMax() > info.markerWindowRect.y().getMax() + || itemRect.y().getMin() + < info.markerWindowRect.y().getMin()) continue; const auto alpha{Math::FuzzyBool{value.second.weight} @@ -130,8 +142,8 @@ void DrawLegend::drawDimension(const Info &info) const Geom::Rect DrawLegend::getItemRect(const Info &info, double index) { - Geom::Rect res = info.contentRect; - res.pos.y += info.titleHeight + index * info.itemHeight; + Geom::Rect res = info.markerWindowRect; + res.pos.y += index * info.itemHeight - info.yOffset; res.size.y = info.itemHeight; if (std::signbit(res.size.x)) res.size.x = 0; return res; @@ -239,13 +251,26 @@ void DrawLegend::extremaLabel(const Info &info, Geom::Rect DrawLegend::getBarRect(const Info &info) { - Geom::Rect res = info.contentRect; - res.pos.y += info.titleHeight + info.itemHeight / 2.0; + Geom::Rect res = info.markerWindowRect; + res.pos.y += info.itemHeight / 2.0; res.size.y = 5 * info.itemHeight; res.size.x = info.markerSize; return res; } +double DrawLegend::markersLegendFullSize(const Info &info) +{ + double itemCount{info.measureEnabled ? 6.0 : 0.0}; + if (info.dimensionEnabled) + for (const auto &value : info.dimension) + if (auto itemPos = value.second.range.getMin() + 1; + value.second.weight > 0 + && Math::Floating::less(itemCount, itemPos)) + itemCount = itemPos; + + return itemCount * info.itemHeight; +} + void DrawLegend::colorBar(const Info &info, const Geom::Rect &rect) const { diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index c77638b3a..a62724152 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -28,11 +28,12 @@ class DrawLegend : public DrawingContext struct Info { Gfx::ICanvas &canvas; - Geom::Rect contentRect; + Geom::Rect titleRect; + Geom::Rect markerWindowRect; + double yOffset{}; Gen::ChannelId type{}; double weight{}; double itemHeight{}; - double titleHeight{}; double markerSize{}; const Gen::MeasureAxis &measure; const Gen::DimensionAxis &dimension; @@ -58,6 +59,9 @@ class DrawLegend : public DrawingContext getLabelRect(const Info &info, const Geom::Rect &itemRect); [[nodiscard]] static Geom::Rect getBarRect(const Info &info); + [[nodiscard]] static double markersLegendFullSize( + const Info &info); + void extremaLabel(const Info &info, double value, const std::string &unit, diff --git a/test/e2e/tests/style_tests.json b/test/e2e/tests/style_tests.json index 098f6cfdb..ac6fe6214 100644 --- a/test/e2e/tests/style_tests.json +++ b/test/e2e/tests/style_tests.json @@ -1029,6 +1029,9 @@ }, "plot/xAxis/label/autorotate": { "refs": ["f179c0b"] + }, + "legend/offsetY": { + "refs": ["09601ef"] } } } diff --git a/test/e2e/tests/style_tests/legend/offsetY.mjs b/test/e2e/tests/style_tests/legend/offsetY.mjs new file mode 100644 index 000000000..ad3822ec3 --- /dev/null +++ b/test/e2e/tests/style_tests/legend/offsetY.mjs @@ -0,0 +1,74 @@ +import { data } from '../../../test_data/chart_types_eu.mjs' + +const testSteps = [ + (chart) => + chart.animate( + { + data, + config: { + x: 'Joy factors', + y: ['Country', 'Value 1 (+)'], + color: 'Country' + } + }, + 0 + ), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '-2em' + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '4em' + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '100%' + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '100%+-2em' + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '1000000' + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: null + } + } + }), + (chart) => + chart.animate({ + style: { + legend: { + translateY: '10px' + } + } + }) +] + +export default testSteps From 6e7f5d4eb36992119910b3c25ea70d23e4bdf5b5 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 26 Aug 2024 15:21:01 +0200 Subject: [PATCH 11/20] Fix clang-tidy --- src/chart/rendering/drawlegend.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 625edf968..eb827388f 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -12,6 +12,7 @@ #include "base/geom/transformedrect.h" #include "base/gfx/canvas.h" #include "base/gfx/draw/roundedrect.h" +#include "base/math/floating.h" #include "base/text/smartstring.h" #include "chart/generator/plot.h" // NOLINT(misc-include-cleaner) #include "chart/main/events.h" @@ -65,8 +66,6 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, drawTitle(info); - canvas.setClipRect(markerWindowRect); - drawDimension(info); drawMeasure(info); @@ -260,7 +259,7 @@ Geom::Rect DrawLegend::getBarRect(const Info &info) double DrawLegend::markersLegendFullSize(const Info &info) { - double itemCount{info.measureEnabled ? 6.0 : 0.0}; + double itemCount{info.measureEnabled <= 0.0 ? 0.0 : 6.0}; if (info.dimensionEnabled) for (const auto &value : info.dimension) if (auto itemPos = value.second.range.getMin() + 1; From 71a03f2a96567422233e5cd65817bc44c8f5c3b3 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 26 Aug 2024 15:51:46 +0200 Subject: [PATCH 12/20] add yOverflow in Legend event --- src/apps/weblib/ts-api/events.ts | 2 ++ src/chart/main/events.h | 46 +++++++++++++++++++----------- src/chart/rendering/drawlegend.cpp | 34 ++++++++++++++-------- src/chart/rendering/drawlegend.h | 1 + 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/apps/weblib/ts-api/events.ts b/src/apps/weblib/ts-api/events.ts index edb2b389d..33a4873c9 100644 --- a/src/apps/weblib/ts-api/events.ts +++ b/src/apps/weblib/ts-api/events.ts @@ -124,6 +124,8 @@ export interface Caption extends TextElement { export interface Legend extends Element { tagName: 'legend' channel: string + /** Marker labels y overflow by pixel */ + yOverflow: number } /** Logo element of the chart. */ diff --git a/src/chart/main/events.h b/src/chart/main/events.h index 09bbde4f0..d1a7e3be7 100644 --- a/src/chart/main/events.h +++ b/src/chart/main/events.h @@ -208,16 +208,19 @@ class Events struct Legend : Element { Gen::ChannelId channel; + double yOverflow; - explicit Legend(Gen::ChannelId channel) : + explicit Legend(Gen::ChannelId channel, + double yOverflow) : Element("legend"), - channel(channel) + channel(channel), + yOverflow(yOverflow) {} void appendToJSON(Conv::JSONObj &&jsonObj) const override { - Element::appendToJSON( - std::move(jsonObj)("channel", channel)); + Element::appendToJSON(std::move(jsonObj)("channel", + channel)("yOverflow", yOverflow)); } }; @@ -301,9 +304,9 @@ class Events return std::make_unique(horizontal); } - static auto legend(Gen::ChannelId channel) + static auto legend(Gen::ChannelId channel, double yOverflow) { - return std::make_unique(channel); + return std::make_unique(channel, yOverflow); } static auto marker(const Gen::Marker &marker) @@ -366,46 +369,57 @@ class Events const std::string_view &categoryName, const std::string_view &categoryValue, const std::string &label, - Gen::ChannelId channel) + Gen::ChannelId channel, + double yOverflow) { return std::make_unique>>( categoryName, categoryValue, label, "label", - channel); + channel, + yOverflow); } static auto measLegendLabel(const std::string &label, - Gen::ChannelId channel) + Gen::ChannelId channel, + double yOverflow) { return std::make_unique>(label, "label", - channel); + channel, + yOverflow); } static auto legendTitle(const std::string &title, - Gen::ChannelId channel) + Gen::ChannelId channel, + double yOverflow) { return std::make_unique>(title, "title", - channel); + channel, + yOverflow); } static auto legendMarker(const std::string_view &categoryName, const std::string_view &categoryValue, - Gen::ChannelId channel) + Gen::ChannelId channel, + double yOverflow) { return std::make_unique>( categoryName, categoryValue, "marker", - channel); + channel, + yOverflow); } - static auto legendBar(Gen::ChannelId channel) + static auto legendBar(Gen::ChannelId channel, + double yOverflow) { - return std::make_unique("bar", channel); + return std::make_unique("bar", + channel, + yOverflow); } static auto dimAxisLabel(const std::string_view &categoryName, diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index eb827388f..248b0b324 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -40,6 +40,7 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, .canvas = canvas, .titleRect = titleRect, .markerWindowRect = markerWindowRect, + .yOverflow = {}, .yOffset = {}, .type = channelType, .weight = weight, @@ -50,16 +51,17 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, .dimension = plot->axises.at(channelType).dimension, }; - auto yOverflow = + info.yOverflow = markersLegendFullSize(info) - markerWindowRect.height(); - if (std::signbit(yOverflow)) yOverflow = 0.0; - info.yOffset = style.translateY->get(yOverflow, info.itemHeight); + if (std::signbit(info.yOverflow)) info.yOverflow = 0.0; + info.yOffset = + style.translateY->get(info.yOverflow, info.itemHeight); DrawBackground{{ctx()}}.draw(canvas, legendLayout, style, *events.background, - Events::Targets::legend(channelType)); + Events::Targets::legend(channelType, info.yOverflow)); canvas.save(); canvas.setClipRect(contentRect); @@ -90,7 +92,9 @@ void DrawLegend::drawTitle(const Info &info) const title.value, style.title, *events.title, - Events::Targets::legendTitle(title.value, info.type), + Events::Targets::legendTitle(title.value, + info.type, + info.yOverflow), {.alpha = title.weight * info.weight * mul}); }); } @@ -132,7 +136,8 @@ void DrawLegend::drawDimension(const Info &info) const info.dimension.category, value.second.categoryValue, value.second.categoryValue, - info.type), + info.type, + info.yOverflow), {.alpha = double{ alpha && Math::FuzzyBool{weighted.weight}}}); }); @@ -185,7 +190,8 @@ void DrawLegend::drawMarker(const Info &info, auto markerElement = Events::Targets::legendMarker(info.dimension.category, categoryValue, - info.type); + info.type, + info.yOverflow); if (events.marker->invoke( Events::OnRectDrawEvent(*markerElement, {rect, false}))) { @@ -244,7 +250,9 @@ void DrawLegend::extremaLabel(const Info &info, text, style.label, *events.label, - Events::Targets::measLegendLabel(text, info.type), + Events::Targets::measLegendLabel(text, + info.type, + info.yOverflow), {.alpha = info.measureWeight * plusWeight}); } @@ -282,7 +290,8 @@ void DrawLegend::colorBar(const Info &info, info.canvas.setLineWidth(0); auto barElement = - Events::Targets::legendBar(Gen::ChannelId::color); + Events::Targets::legendBar(Gen::ChannelId::color, + info.yOverflow); if (events.bar->invoke( Events::OnRectDrawEvent(*barElement, {rect, false}))) { @@ -314,7 +323,8 @@ void DrawLegend::lightnessBar(const Info &info, info.canvas.setLineWidth(0); auto barElement = - Events::Targets::legendBar(Gen::ChannelId::lightness); + Events::Targets::legendBar(Gen::ChannelId::lightness, + info.yOverflow); if (events.bar->invoke( Events::OnRectDrawEvent(*barElement, {rect, false}))) { @@ -335,8 +345,8 @@ void DrawLegend::sizeBar(const Info &info, Gfx::Color::Gray(0.8) * info.measureWeight); info.canvas.setLineWidth(0); - auto barElement = - Events::Targets::legendBar(Gen::ChannelId::size); + auto barElement = Events::Targets::legendBar(Gen::ChannelId::size, + info.yOverflow); if (events.bar->invoke( Events::OnRectDrawEvent(*barElement, {rect, false}))) { diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index a62724152..b14149106 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -30,6 +30,7 @@ class DrawLegend : public DrawingContext Gfx::ICanvas &canvas; Geom::Rect titleRect; Geom::Rect markerWindowRect; + double yOverflow{}; double yOffset{}; Gen::ChannelId type{}; double weight{}; From 0fb5a01bd333a583658bec9d0d37087384ce50c5 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 26 Aug 2024 16:38:19 +0200 Subject: [PATCH 13/20] fix test hash --- test/e2e/tests/style_tests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/tests/style_tests.json b/test/e2e/tests/style_tests.json index ac6fe6214..237218970 100644 --- a/test/e2e/tests/style_tests.json +++ b/test/e2e/tests/style_tests.json @@ -1031,7 +1031,7 @@ "refs": ["f179c0b"] }, "legend/offsetY": { - "refs": ["09601ef"] + "refs": ["2307834"] } } } From 2a432c6458f6d9701227d89e5c5a010c0c7731d0 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Wed, 28 Aug 2024 14:19:15 +0200 Subject: [PATCH 14/20] Revert length yaml definition --- src/apps/weblib/typeschema-api/styles.yaml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/apps/weblib/typeschema-api/styles.yaml b/src/apps/weblib/typeschema-api/styles.yaml index 465f4f97f..d1a5176cc 100644 --- a/src/apps/weblib/typeschema-api/styles.yaml +++ b/src/apps/weblib/typeschema-api/styles.yaml @@ -1,21 +1,14 @@ --- definitions: - LengthUnit: + Length: description: | - LengthUnit can be set in pixels or in percentage of the element or the element's + Length can be set in pixels or in percentage of the element or the element's font size. Pixel is the default unit. oneOf: - { type: string, mask: /:number:px/ } - { type: string, mask: /:number:%/ } - { type: string, mask: /:number:em/ } - type: number - Length: - description: | - Length can be LengthUnit or addition of LengthUnits. - oneOf: - - { type: string, mask: /:LengthUnit:/ } - - { type: string, mask: '/:LengthUnit:+:LengthUnit:/' } - - { type: string, mask: '/:LengthUnit:+:LengthUnit:+:LengthUnit:/' } Angle: description: | From d42fb9e2d24e163bd8a6aecb49712a80ac17a718 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Wed, 28 Aug 2024 18:55:49 +0200 Subject: [PATCH 15/20] Rm textColor, change offsetY testcase, add ColorGradientSetter --- src/apps/qutils/canvas.cpp | 17 ++-- src/apps/qutils/canvas.h | 7 +- src/apps/weblib/jscriptcanvas.cpp | 13 +-- src/apps/weblib/jscriptcanvas.h | 1 - src/base/gfx/canvas.h | 1 - src/base/gfx/draw/textbox.cpp | 2 +- src/chart/rendering/drawlabel.cpp | 28 ++++-- src/chart/rendering/drawlabel.h | 4 + src/chart/rendering/drawlegend.cpp | 87 ++++++++++++++----- src/chart/rendering/drawlegend.h | 13 +++ src/chart/rendering/markerrenderer.cpp | 2 +- test/e2e/tests/style_tests/legend/offsetY.mjs | 40 +++++++-- test/unit/chart/events.cpp | 1 - 13 files changed, 148 insertions(+), 68 deletions(-) diff --git a/src/apps/qutils/canvas.cpp b/src/apps/qutils/canvas.cpp index 8759492ae..cff8cea74 100644 --- a/src/apps/qutils/canvas.cpp +++ b/src/apps/qutils/canvas.cpp @@ -92,8 +92,8 @@ void BaseCanvas::init(QPaintDevice *device) void BaseCanvas::setBrushColor(const Gfx::Color &color) { - brush = QBrush(toQColor(color)); - painter.setBrush(brush); + painter.setBrush(toQColor(color)); + painter.setPen(brushToPen(painter.brush())); } void BaseCanvas::setLineColor(const Gfx::Color &color) @@ -162,12 +162,6 @@ void BaseCanvas::setFont(const Gfx::Font &newFont) painter.setFont(fromGfxFont(newFont, painter.font())); } -void BaseCanvas::setTextColor(const Gfx::Color &color) -{ - textPen = colorToPen(color); - painter.setPen(textPen); -} - void BaseCanvas::beginDropShadow() {} void BaseCanvas::setDropShadowBlur(double) {} @@ -199,7 +193,7 @@ void BaseCanvas::rectangle(const Geom::Rect &rect) void BaseCanvas::text(const Geom::Rect &rect, const std::string &text) { - painter.setPen(textPen); + painter.setPen(brushToPen(painter.brush())); painter.drawText(toQRect(rect), Qt::AlignLeft, QString::fromStdString(text)); @@ -214,14 +208,15 @@ void BaseCanvas::setBrushGradient(const Geom::Line &line, qGradient.setColorAt(stop.pos, toQColor(stop.value)); } painter.setBrush(QBrush(qGradient)); + painter.setPen(brushToPen(painter.brush())); } -QPen BaseCanvas::colorToPen(const Gfx::Color &color) +QPen BaseCanvas::colorToPen(const Gfx::Color &color) const { return brushToPen(QBrush(toQColor(color))); } -QPen BaseCanvas::brushToPen(const QBrush &brush) +QPen BaseCanvas::brushToPen(const QBrush &brush) const { auto pen = painter.pen(); pen.setBrush(brush); diff --git a/src/apps/qutils/canvas.h b/src/apps/qutils/canvas.h index d801d6302..dc91efab4 100644 --- a/src/apps/qutils/canvas.h +++ b/src/apps/qutils/canvas.h @@ -26,7 +26,6 @@ class BaseCanvas : public Gfx::ICanvas, public Vizzu::Draw::Painter void setLineColor(const Gfx::Color &color) override; void setLineWidth(double width) override; void setFont(const Gfx::Font &newFont) override; - void setTextColor(const Gfx::Color &color) override; void beginDropShadow() override; void setDropShadowBlur(double radius) override; @@ -70,11 +69,9 @@ class BaseCanvas : public Gfx::ICanvas, public Vizzu::Draw::Painter QFont font; QPainterPath polygon; QPen linePen; - QPen textPen; - QBrush brush; - QPen colorToPen(const Gfx::Color &color); - QPen brushToPen(const QBrush &brush); + [[nodiscard]] QPen colorToPen(const Gfx::Color &color) const; + [[nodiscard]] QPen brushToPen(const QBrush &brush) const; }; using Canvas = BaseCanvas; diff --git a/src/apps/weblib/jscriptcanvas.cpp b/src/apps/weblib/jscriptcanvas.cpp index 6f6dfde09..70fc5a515 100644 --- a/src/apps/weblib/jscriptcanvas.cpp +++ b/src/apps/weblib/jscriptcanvas.cpp @@ -85,18 +85,6 @@ void JScriptCanvas::setFont(const Gfx::Font &font) } } -void JScriptCanvas::setTextColor(const Gfx::Color &color) -{ - if (color != brushColor) { - brushColor = color; - ::canvas_setBrushColor(this, - color.red, - color.green, - color.blue, - color.alpha); - } -} - void JScriptCanvas::beginDropShadow() { ::canvas_beginDropShadow(this); @@ -186,6 +174,7 @@ void JScriptCanvas::setBrushGradient(const Geom::Line &line, const Gfx::ColorGradient &gradient) { typedef decltype(gradient.stops)::value_type Stop; + static_assert(sizeof(double) == 8); static_assert(sizeof(Stop) == sizeof(double) * 5); static_assert(offsetof(Stop, pos) == 0); diff --git a/src/apps/weblib/jscriptcanvas.h b/src/apps/weblib/jscriptcanvas.h index ccbfd8a70..5c67463d6 100644 --- a/src/apps/weblib/jscriptcanvas.h +++ b/src/apps/weblib/jscriptcanvas.h @@ -23,7 +23,6 @@ class JScriptCanvas : public Gfx::ICanvas, public Draw::Painter void setLineColor(const Gfx::Color &color) override; void setLineWidth(double width) override; void setFont(const Gfx::Font &font) override; - void setTextColor(const Gfx::Color &color) override; void beginDropShadow() override; void setDropShadowBlur(double radius) override; diff --git a/src/base/gfx/canvas.h b/src/base/gfx/canvas.h index 24efdd5cb..6730be838 100644 --- a/src/base/gfx/canvas.h +++ b/src/base/gfx/canvas.h @@ -28,7 +28,6 @@ struct ICanvas virtual void setClipPolygon() = 0; virtual void setBrushColor(const Gfx::Color &color) = 0; virtual void setLineColor(const Gfx::Color &color) = 0; - virtual void setTextColor(const Gfx::Color &color) = 0; virtual void setLineWidth(double width) = 0; virtual void setFont(const Gfx::Font &font) = 0; diff --git a/src/base/gfx/draw/textbox.cpp b/src/base/gfx/draw/textbox.cpp index b4ef4984e..195e8351f 100644 --- a/src/base/gfx/draw/textbox.cpp +++ b/src/base/gfx/draw/textbox.cpp @@ -156,7 +156,7 @@ void TextBox::draw(ICanvas &canvas, double opacity) canvas.setLineColor(background); canvas.rectangle( {{xpos, ypos}, {text.width, line.height}}); - canvas.setTextColor(foreground); + canvas.setBrushColor(foreground); canvas.text({{xpos, ypos}, {10000, 10000}}, text.content); xpos += text.width; } diff --git a/src/chart/rendering/drawlabel.cpp b/src/chart/rendering/drawlabel.cpp index c457cc042..6bf1a146c 100644 --- a/src/chart/rendering/drawlabel.cpp +++ b/src/chart/rendering/drawlabel.cpp @@ -30,8 +30,12 @@ void DrawLabel::draw(Gfx::ICanvas &canvas, if (!style.backgroundColor->isTransparent()) { canvas.save(); auto bgColor = *style.backgroundColor * options.bgAlpha; - canvas.setBrushColor(bgColor); - canvas.setLineColor(bgColor); + if (options.gradient) + options.gradient(canvas, + fullRect.transform.inverse(), + bgColor); + else + canvas.setBrushColor(bgColor); canvas.transform(fullRect.transform); canvas.rectangle(relativeRect); canvas.restore(); @@ -47,8 +51,6 @@ void DrawLabel::draw(Gfx::ICanvas &canvas, canvas.save(); canvas.setFont(font); - if (options.alpha) - canvas.setTextColor(*style.color * *options.alpha); auto copyRect = fullRect; @@ -57,16 +59,26 @@ void DrawLabel::draw(Gfx::ICanvas &canvas, 1.0, -std::numbers::pi); + auto textTransform = + copyRect.transform + * Geom::AffineTransform(alignRect.bottomLeft()); + + if (options.alpha) { + if (auto textColor = *style.color * *options.alpha; + options.gradient) + options.gradient(canvas, + textTransform.inverse(), + textColor); + else + canvas.setBrushColor(textColor); + } + if (onDraw.invoke(Events::OnTextDrawEvent{*eventTarget, copyRect, paddedRect, alignConstant, text})) { - auto textTransform = - copyRect.transform - * Geom::AffineTransform(alignRect.bottomLeft()); - canvas.transform(textTransform); canvas.text({{}, alignRect.size}, text); diff --git a/src/chart/rendering/drawlabel.h b/src/chart/rendering/drawlabel.h index dff6e0b8b..8d7f73b27 100644 --- a/src/chart/rendering/drawlabel.h +++ b/src/chart/rendering/drawlabel.h @@ -19,6 +19,10 @@ class DrawLabel : public DrawingContext std::optional alpha{1.0}; double bgAlpha{1.0}; bool flip{false}; + std::function + gradient{}; }; void draw(Gfx::ICanvas &canvas, diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 248b0b324..524994d3b 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -3,14 +3,17 @@ #include #include #include +#include #include #include #include #include "base/anim/interpolated.h" +#include "base/geom/affinetransform.h" #include "base/geom/rect.h" #include "base/geom/transformedrect.h" #include "base/gfx/canvas.h" +#include "base/gfx/color.h" #include "base/gfx/draw/roundedrect.h" #include "base/math/floating.h" #include "base/text/smartstring.h" @@ -29,30 +32,46 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, Gen::ChannelId channelType, double weight) const { - auto contentRect = + auto markerWindowRect = style.contentRect(legendLayout, rootStyle.calculatedSize()); - auto markerWindowRect = contentRect; auto titleRect = markerWindowRect.popBottom(style.title.getHeight()); + auto markerWindowHeight = markerWindowRect.height(); + auto itemHeight = style.label.getHeight(); + auto markerSize = style.marker.size->get(itemHeight, + style.label.calculatedSize()); - auto &&info = Info{ - .canvas = canvas, + auto fadeHeight = markerSize; + markerWindowRect = + markerWindowRect + + Geom::Rect{{0, -fadeHeight}, {0, 2 * fadeHeight}}; + + auto fadeElementPercent = fadeHeight / markerWindowRect.height(); + + auto &&info = Info{.canvas = canvas, .titleRect = titleRect, .markerWindowRect = markerWindowRect, + .fadeHeight = fadeHeight, .yOverflow = {}, .yOffset = {}, .type = channelType, .weight = weight, - .itemHeight = style.label.getHeight(), - .markerSize = style.marker.size->get(contentRect.size.y, - style.label.calculatedSize()), + .itemHeight = itemHeight, + .markerSize = markerSize, .measure = plot->axises.at(channelType).measure, .dimension = plot->axises.at(channelType).dimension, - }; - - info.yOverflow = - markersLegendFullSize(info) - markerWindowRect.height(); + .colorGradientSetter = {markerWindowRect.leftSide(), + Gfx::ColorGradient{{ + {0.0, {}}, + {fadeElementPercent / 2.0, {}}, + {fadeElementPercent, {}}, + {1.0 - fadeElementPercent, {}}, + {1.0 - fadeElementPercent / 2.0, {}}, + {1.0, {}}, + }}}}; + + info.yOverflow = markersLegendFullSize(info) - markerWindowHeight; if (std::signbit(info.yOverflow)) info.yOverflow = 0.0; info.yOffset = style.translateY->get(info.yOverflow, info.itemHeight); @@ -64,15 +83,38 @@ void DrawLegend::draw(Gfx::ICanvas &canvas, Events::Targets::legend(channelType, info.yOverflow)); canvas.save(); - canvas.setClipRect(contentRect); - drawTitle(info); + canvas.setClipRect(markerWindowRect); drawDimension(info); drawMeasure(info); canvas.restore(); + + canvas.save(); + + canvas.setClipRect(titleRect); + + drawTitle(info); + + canvas.restore(); +} + +void DrawLegend::ColorGradientSetter::operator()(Gfx::ICanvas &canvas, + const Geom::AffineTransform &transform, + const Gfx::Color &color) const +{ + for (auto &stop : modifiableStops) stop.value = color; + + modifiableStops[0].value.alpha = 0.0; + modifiableStops[1].value.alpha *= 0.27; + modifiableStops[4].value.alpha *= 0.27; + modifiableStops[5].value.alpha = 0.0; + + canvas.setBrushGradient( + {transform(line.begin), transform(line.end)}, + gradient); } void DrawLegend::drawTitle(const Info &info) const @@ -110,8 +152,8 @@ void DrawLegend::drawDimension(const Info &info) const auto itemRect = getItemRect(info, value.second.range.getMin()); - if (itemRect.y().getMax() > info.markerWindowRect.y().getMax() - || itemRect.y().getMin() + if (itemRect.y().getMin() > info.markerWindowRect.y().getMax() + || itemRect.y().getMax() < info.markerWindowRect.y().getMin()) continue; @@ -138,8 +180,12 @@ void DrawLegend::drawDimension(const Info &info) const value.second.categoryValue, info.type, info.yOverflow), - {.alpha = double{ - alpha && Math::FuzzyBool{weighted.weight}}}); + {.alpha = + double{ + alpha + && Math::FuzzyBool{weighted.weight}}, + .gradient = + std::ref(info.colorGradientSetter)}); }); } } @@ -147,7 +193,8 @@ void DrawLegend::drawDimension(const Info &info) const Geom::Rect DrawLegend::getItemRect(const Info &info, double index) { Geom::Rect res = info.markerWindowRect; - res.pos.y += index * info.itemHeight - info.yOffset; + res.pos.y += + info.fadeHeight + index * info.itemHeight - info.yOffset; res.size.y = info.itemHeight; if (std::signbit(res.size.x)) res.size.x = 0; return res; @@ -179,7 +226,7 @@ void DrawLegend::drawMarker(const Info &info, { info.canvas.save(); - info.canvas.setBrushColor(color); + info.colorGradientSetter(info.canvas, {}, color); info.canvas.setLineColor(color); info.canvas.setLineWidth(0); @@ -259,7 +306,7 @@ void DrawLegend::extremaLabel(const Info &info, Geom::Rect DrawLegend::getBarRect(const Info &info) { Geom::Rect res = info.markerWindowRect; - res.pos.y += info.itemHeight / 2.0; + res.pos.y += info.fadeHeight + info.itemHeight / 2.0; res.size.y = 5 * info.itemHeight; res.size.x = info.markerSize; return res; diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index b14149106..cbdbfa21d 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -25,11 +25,23 @@ class DrawLegend : public DrawingContext *rootStyle.plot.marker.colorGradient}; private: + struct ColorGradientSetter + { + Geom::Line line; + Gfx::ColorGradient gradient; + std::span modifiableStops = + gradient.stops; + + void operator()(Gfx::ICanvas &, + const Geom::AffineTransform &, + const Gfx::Color &) const; + }; struct Info { Gfx::ICanvas &canvas; Geom::Rect titleRect; Geom::Rect markerWindowRect; + double fadeHeight{}; double yOverflow{}; double yOffset{}; Gen::ChannelId type{}; @@ -41,6 +53,7 @@ class DrawLegend : public DrawingContext double measureEnabled = measure.enabled.calculate(); bool dimensionEnabled = dimension.enabled; double measureWeight = weight * measureEnabled; + ColorGradientSetter colorGradientSetter; }; void drawTitle(const Info &info) const; diff --git a/src/chart/rendering/markerrenderer.cpp b/src/chart/rendering/markerrenderer.cpp index d0eb6db9e..177545cd8 100644 --- a/src/chart/rendering/markerrenderer.cpp +++ b/src/chart/rendering/markerrenderer.cpp @@ -328,7 +328,7 @@ void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, return abstractMarker.getLabelPos(position, coordSys); }); - canvas.setTextColor((*labelStyle.filter)(color)*weight); + canvas.setBrushColor((*labelStyle.filter)(color)*weight); auto centered = labelStyle.position->factor( Styles::MarkerLabel::Position::center); diff --git a/test/e2e/tests/style_tests/legend/offsetY.mjs b/test/e2e/tests/style_tests/legend/offsetY.mjs index ad3822ec3..65eb94238 100644 --- a/test/e2e/tests/style_tests/legend/offsetY.mjs +++ b/test/e2e/tests/style_tests/legend/offsetY.mjs @@ -8,53 +8,76 @@ const testSteps = [ config: { x: 'Joy factors', y: ['Country', 'Value 1 (+)'], - color: 'Country' + color: {set: 'Country', title: 'offset test'} + }, + style: { + plot: { + areaColor: '#FAFAFA' + } } }, 0 ), (chart) => chart.animate({ + config: { + color: {title: '1em'} + }, style: { legend: { - translateY: '-2em' + translateY: '1em' } } }), (chart) => chart.animate({ + config: { + color: {title: '2em'} + }, style: { legend: { - translateY: '4em' + translateY: '2em' } } }), (chart) => chart.animate({ + config: { + color: {title: '-2em'} + }, style: { legend: { - translateY: '100%' + translateY: '-2em' } } }), (chart) => chart.animate({ + config: { + color: {title: '100%'} + }, style: { legend: { - translateY: '100%+-2em' + translateY: '100%' } } }), (chart) => chart.animate({ + config: { + color: {title: '100%-2em'} + }, style: { legend: { - translateY: '1000000' + translateY: '100%+-2em' } } }), (chart) => chart.animate({ + config: { + color: {title: null} + }, style: { legend: { translateY: null @@ -63,9 +86,12 @@ const testSteps = [ }), (chart) => chart.animate({ + config: { + color: {title: '17px'} + }, style: { legend: { - translateY: '10px' + translateY: '17px' } } }) diff --git a/test/unit/chart/events.cpp b/test/unit/chart/events.cpp index 324278955..8081ed118 100644 --- a/test/unit/chart/events.cpp +++ b/test/unit/chart/events.cpp @@ -27,7 +27,6 @@ struct MyCanvas final : Gfx::ICanvas, Vizzu::Draw::Painter void setClipPolygon() final {} void setBrushColor(const Gfx::Color &) final {} void setLineColor(const Gfx::Color &) final {} - void setTextColor(const Gfx::Color &) final {} void setLineWidth(double) final {} void setFont(const Gfx::Font &) final {} void transform(const Geom::AffineTransform &) final {} From f53c8ef32899097a2f8e51c76e6654761e11a4ac Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 29 Aug 2024 11:37:05 +0200 Subject: [PATCH 16/20] gradient only the fade area --- src/chart/rendering/drawlegend.cpp | 24 ++++++++++++++++++++---- src/chart/rendering/drawlegend.h | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index 524994d3b..c22f3971f 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -157,6 +157,13 @@ void DrawLegend::drawDimension(const Info &info) const < info.markerWindowRect.y().getMin()) continue; + const auto needGradient = + itemRect.y().getMax() + > info.markerWindowRect.y().getMax() - info.fadeHeight + || itemRect.y().getMin() + < info.markerWindowRect.y().getMin() + + info.fadeHeight; + const auto alpha{Math::FuzzyBool{value.second.weight} && Math::FuzzyBool{info.weight}}; @@ -164,7 +171,8 @@ void DrawLegend::drawDimension(const Info &info) const value.second.categoryValue, colorBuilder.render(value.second.colorBase) * double{alpha}, - getMarkerRect(info, itemRect)); + getMarkerRect(info, itemRect), + needGradient); value.second.label.visit( [&](::Anim::InterpolateIndex, const auto &weighted) @@ -185,7 +193,10 @@ void DrawLegend::drawDimension(const Info &info) const alpha && Math::FuzzyBool{weighted.weight}}, .gradient = - std::ref(info.colorGradientSetter)}); + needGradient + ? std::ref(info.colorGradientSetter) + : decltype(DrawLabel::Options:: + gradient){}}); }); } } @@ -222,11 +233,16 @@ Geom::TransformedRect DrawLegend::getLabelRect(const Info &info, void DrawLegend::drawMarker(const Info &info, std::string_view categoryValue, const Gfx::Color &color, - const Geom::Rect &rect) const + const Geom::Rect &rect, + bool needGradient) const { info.canvas.save(); - info.colorGradientSetter(info.canvas, {}, color); + if (needGradient) + info.colorGradientSetter(info.canvas, {}, color); + else + info.canvas.setBrushColor(color); + info.canvas.setLineColor(color); info.canvas.setLineWidth(0); diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index cbdbfa21d..7a6859a4a 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -64,7 +64,8 @@ class DrawLegend : public DrawingContext void drawMarker(const Info &info, std::string_view categoryValue, const Gfx::Color &color, - const Geom::Rect &rect) const; + const Geom::Rect &rect, + bool needGradient) const; [[nodiscard]] static Geom::Rect getItemRect(const Info &info, double index); [[nodiscard]] static Geom::Rect getMarkerRect(const Info &info, From 8697892de90db966019788d021ffded55e98453e Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 29 Aug 2024 11:59:40 +0200 Subject: [PATCH 17/20] Fix testcases --- test/e2e/test_cases/test_cases.json | 572 ++++++++++++++-------------- test/e2e/tests/fixes.json | 2 +- test/e2e/tests/style_tests.json | 2 +- 3 files changed, 288 insertions(+), 288 deletions(-) diff --git a/test/e2e/test_cases/test_cases.json b/test/e2e/test_cases/test_cases.json index b04338277..213b61d47 100644 --- a/test/e2e/test_cases/test_cases.json +++ b/test/e2e/test_cases/test_cases.json @@ -20,13 +20,13 @@ "refs": ["defcb7c"] }, "basic_animations/coordsystems/area_carte_2_polar": { - "refs": ["e5dd426"] + "refs": ["adc2dfe"] }, "basic_animations/coordsystems/circle_without_2_carte": { "refs": ["87deef9"] }, "basic_animations/coordsystems/rectangle_carte_2_polar": { - "refs": ["2c4a4f4"] + "refs": ["2cc8916"] }, "basic_animations/coordsystems/rectangle_without_2_carte": { "refs": ["1cb88c2"] @@ -56,7 +56,7 @@ "refs": ["55a6243"] }, "basic_animations/legend_transitions/color_2discrete_anim": { - "refs": ["a00861a"] + "refs": ["97e1f48"] }, "basic_animations/legend_transitions/color_conti_anim": { "refs": ["18d62cd"] @@ -65,31 +65,31 @@ "refs": ["fe2f74d"] }, "basic_animations/legend_transitions/color_conti_discrete_anim": { - "refs": ["044db42"] + "refs": ["a2e28fe"] }, "basic_animations/legend_transitions/color_discrete_anim": { - "refs": ["32344b5"] + "refs": ["76b8983"] }, "basic_animations/legend_transitions/color_discrete_changes_anim": { - "refs": ["ca8aa6b"] + "refs": ["96f4bfe"] }, "basic_animations/legend_transitions/color_off_on_anim": { - "refs": ["1a02da1"] + "refs": ["041cc6e"] }, "basic_animations/legend_transitions/color_off_on_series_anim": { - "refs": ["4a1c9d1"] + "refs": ["ea45913"] }, "basic_animations/legend_transitions/lightness_2discrete_anim": { - "refs": ["089c193"] + "refs": ["219235d"] }, "basic_animations/legend_transitions/lightness_conti_anim": { "refs": ["828148b"] }, "basic_animations/legend_transitions/lightness_conti_discrete_anim": { - "refs": ["859a44a"] + "refs": ["2712ab7"] }, "basic_animations/legend_transitions/lightness_discrete_anim": { - "refs": ["33c3695"] + "refs": ["ca31cc0"] }, "basic_animations/legend_transitions/lightness_on_off_anim": { "refs": ["e410e87"] @@ -104,7 +104,7 @@ "refs": ["3c67701"] }, "basic_animations/legend_transitions/size_discrete_anim": { - "refs": ["015489b"] + "refs": ["d25e599"] }, "basic_animations/legend_transitions/size_on_off_anim": { "refs": ["59aa9fa"] @@ -200,13 +200,13 @@ "refs": ["96be619"] }, "lay_out/full_line_negative_2dis_1con": { - "refs": ["ae89a34"] + "refs": ["3923c2e"] }, "lay_out/legend_plot_coxcomb_rectangle_2dis_1con": { "refs": ["9f01f31"] }, "lay_out/legend_plot_line_negative_2dis_1con": { - "refs": ["fe40fa0"] + "refs": ["bf5f4e1"] }, "lay_out/plot_coxcomb_rectangle_2dis_1con": { "refs": ["5b3c669"] @@ -224,7 +224,7 @@ "refs": ["87763e6"] }, "operations/all_operations_sizeing": { - "refs": ["92c2b8b"] + "refs": ["713b086"] }, "operations/drilldown_aggregate_tutorial_data/area_drilldown_aggregate": { "refs": ["4c515d8"] @@ -341,7 +341,7 @@ "refs": ["609610f"] }, "static_chart_types/cartesian_coo_sys/column_stacked_rectangle_negative_3dis_1con": { - "refs": ["6bfc61b"] + "refs": ["93728c2"] }, "static_chart_types/cartesian_coo_sys/dotplot_circle_negative_1dis_1con": { "refs": ["3aa634d"] @@ -356,7 +356,7 @@ "refs": ["fd3f5de"] }, "static_chart_types/cartesian_coo_sys/line_negative_2dis_1con": { - "refs": ["e9d46f8"] + "refs": ["82c12ce"] }, "static_chart_types/cartesian_coo_sys/marimekko_rectangle_1dis_2con": { "refs": ["1108d45"] @@ -371,10 +371,10 @@ "refs": ["fdfd809"] }, "static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_2dis_3con": { - "refs": ["ac80302"] + "refs": ["1d1faec"] }, "static_chart_types/cartesian_coo_sys/stacked_area_negative_2dis_1con": { - "refs": ["e62e86f"] + "refs": ["41c599f"] }, "static_chart_types/cartesian_coo_sys/waterfall_rectangle_bar_negative_2dis_2con": { "refs": ["c671aec"] @@ -383,10 +383,10 @@ "refs": ["01da8f6"] }, "static_chart_types/polar_coo_sys/NO_spiderweb_area_2dis_1con": { - "refs": ["67ba8ee"] + "refs": ["8bdff2b"] }, "static_chart_types/polar_coo_sys/NO_spiderweb_line_2dis_1con": { - "refs": ["35db4ff"] + "refs": ["3e5cbae"] }, "static_chart_types/polar_coo_sys/coxcomb_rectangle_1dis_1con": { "refs": ["096f583"] @@ -401,10 +401,10 @@ "refs": ["31a9b6e"] }, "static_chart_types/polar_coo_sys/radial_rectangle_2dis_1con": { - "refs": ["a9ad64d"] + "refs": ["fa2468e"] }, "static_chart_types/polar_coo_sys/radial_stacked_rectangle_2dis_1con": { - "refs": ["a57c043"] + "refs": ["def087e"] }, "static_chart_types/polar_coo_sys/spiderweb_area_1dis_1con": { "refs": ["bfa0017"] @@ -419,7 +419,7 @@ "refs": ["31f7cb9"] }, "static_chart_types/without_coo_sys/bubble_circle_1dis_2con": { - "refs": ["679bbed"] + "refs": ["2f556c6"] }, "static_chart_types/without_coo_sys/bubble_circle_2dis_1con": { "refs": ["922637c"] @@ -533,7 +533,7 @@ "refs": ["264d3ed"] }, "web_content/analytical_operations/distribute/existingmeasure_scatterplot": { - "refs": ["f365e57"] + "refs": ["6576187"] }, "web_content/analytical_operations/distribute/existingmeasure_scatterplot_split": { "refs": ["7872c82"] @@ -605,7 +605,7 @@ "refs": ["759243a"] }, "web_content/analytical_operations/drilldown/scatterplot": { - "refs": ["1513b0b"] + "refs": ["959a54e"] }, "web_content/analytical_operations/filter/area_polar_stacked": { "refs": ["e57f021"] @@ -704,7 +704,7 @@ "refs": ["47754fa"] }, "web_content/analytical_operations/sum/bubbleplot_1": { - "refs": ["5d4d364"] + "refs": ["34557ae"] }, "web_content/analytical_operations/sum/bubbleplot_2": { "refs": ["18e6318"] @@ -782,13 +782,13 @@ "refs": ["a1d06b7"] }, "web_content_removed/animated/composition_percentage_area_stream_3dis_1con": { - "refs": ["2fbef45"] + "refs": ["d18431e"] }, "web_content_removed/animated/composition_percentage_column_3dis_1con": { - "refs": ["983e7fa"] + "refs": ["19de8f5"] }, "web_content_removed/animated/composition_percentage_column_stream_3dis_1con": { - "refs": ["d3c0315"] + "refs": ["8a4a5b4"] }, "web_content_removed/animated/distribution_relationship_dotplot_dotplot": { "refs": ["0c57ada"] @@ -797,7 +797,7 @@ "refs": ["eb158e7"] }, "web_content_removed/animated/drilldown_aggregate_line": { - "refs": ["d8193e8"] + "refs": ["869ab31"] }, "web_content_removed/animated/merge_split_area_stream_3dis_1con": { "refs": ["3a6c60a"] @@ -806,13 +806,13 @@ "refs": ["35edc42"] }, "web_content_removed/animated/merge_split_radial_stacked_rectangle_2dis_1con": { - "refs": ["4d0e846"] + "refs": ["6d1771b"] }, "web_content_removed/animated/orientation_circle": { "refs": ["7bf3ac1"] }, "web_content_removed/animated/orientation_dot_circle": { - "refs": ["2a645ce"] + "refs": ["e29fbb1"] }, "web_content_removed/animated/orientation_marimekko_rectangle_2dis_2con": { "refs": ["549404c"] @@ -914,10 +914,10 @@ "refs": ["a84101f"] }, "web_content/presets/chart/area_stacked": { - "refs": ["002979d"] + "refs": ["029763d"] }, "web_content/presets/chart/area_percentage": { - "refs": ["9f81efa"] + "refs": ["dfdf262"] }, "web_content/presets/chart/area_splitted": { "refs": ["902bdcf"] @@ -1016,7 +1016,7 @@ "refs": ["bb5831f"] }, "web_content/static/chart/line": { - "refs": ["f858c0d"] + "refs": ["5dc765a"] }, "web_content/static/chart/marimekko": { "refs": ["d957f5a"] @@ -1028,10 +1028,10 @@ "refs": ["e3ffc41"] }, "web_content/static/plot/bubble": { - "refs": ["aa17834"] + "refs": ["15b559d"] }, "web_content/static/chart/area_stacked": { - "refs": ["002979d"] + "refs": ["029763d"] }, "web_content/static/chart/mekko_stacked": { "refs": ["2b6d600"] @@ -1043,7 +1043,7 @@ "refs": ["cbe8a00"] }, "web_content/static/chart/line_polar": { - "refs": ["3bea6d2"] + "refs": ["3b8993e"] }, "web_content/static/chart/coxcomb": { "refs": ["573cc16"] @@ -1058,7 +1058,7 @@ "refs": ["9565a62"] }, "web_content/static/chart/bar_stacked_radial": { - "refs": ["0a5933d"] + "refs": ["54da20e"] }, "web_content/static/chart/area_polar": { "refs": ["04e2cec"] @@ -1748,16 +1748,16 @@ "refs": ["b3c498f"] }, "ww_next_steps/next_steps/02_C_R": { - "refs": ["3d578bd"] + "refs": ["da55d41"] }, "ww_next_steps/next_steps/02_C_R_water_comparison_sum": { "refs": ["59bab5f"] }, "ww_next_steps/next_steps/03_C_R": { - "refs": ["d018da8"] + "refs": ["98ae02c"] }, "ww_next_steps/next_steps/04_C_R": { - "refs": ["099112f"] + "refs": ["befde1c"] }, "ww_next_steps/next_steps/05_C_R": { "refs": ["d84c70f"] @@ -1766,7 +1766,7 @@ "refs": ["92eeaaa"] }, "ww_next_steps/next_steps/22_C_C": { - "refs": ["53c0886"] + "refs": ["50b88de"] }, "ww_next_steps/next_steps/28_C_A": { "refs": ["5569648"] @@ -1784,10 +1784,10 @@ "refs": ["e4126f6"] }, "ww_next_steps/next_steps_Tests/03_C_R": { - "refs": ["2c49454"] + "refs": ["2f85528"] }, "ww_next_steps/next_steps_Tests/04_C_R": { - "refs": ["ff8c36f"] + "refs": ["87b761e"] }, "ww_next_steps/next_steps_Tests/05_C_R": { "refs": ["533ff4f"] @@ -1796,7 +1796,7 @@ "refs": ["483c9ec"] }, "ww_next_steps/next_steps_Tests/22_C_C": { - "refs": ["1105d62"] + "refs": ["3658d5f"] }, "ww_next_steps/next_steps_Tests/28_C_A": { "refs": ["cd46bff"] @@ -1904,7 +1904,7 @@ "refs": ["b062250"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_11": { - "refs": ["968d2cf"] + "refs": ["8907d25"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_12": { "refs": ["c00afc1"] @@ -1988,7 +1988,7 @@ "refs": ["9c8a8c1"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_14": { - "refs": ["62ccef7"] + "refs": ["d3d3d1d"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_16": { "refs": ["d8a5a32"] @@ -2039,7 +2039,7 @@ "refs": ["cf78080"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/orientation_dot_circle": { - "refs": ["c118647"] + "refs": ["7b749f1"] }, "ww_next_steps/next_steps_byOperations/wOld_animated/orientation_marimekko_rectangle_2dis_2con": { "refs": ["5c1d844"] @@ -2081,7 +2081,7 @@ "refs": ["5bc9ca9"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/04_cir_2c": { - "refs": ["df27c64"] + "refs": ["843e777"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/06_cir_2c": { "refs": ["35cf8e9"] @@ -2123,322 +2123,322 @@ "refs": ["ffa9d99"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/04b_are": { - "refs": ["06acb1c"] + "refs": ["bd1bf87"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/06a_are": { "refs": ["be9bab2"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/06b_are": { - "refs": ["a90eb02"] + "refs": ["ae589c7"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/02_cir": { - "refs": ["f42d66f"] + "refs": ["cc735b8"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/03_cir": { - "refs": ["da657ed"] + "refs": ["831a5f7"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/04_cir": { - "refs": ["8bb09d2"] + "refs": ["375e40c"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/05_cir": { - "refs": ["2ada1ae"] + "refs": ["f88ee4a"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/06_cir_NO": { - "refs": ["e212899"] + "refs": ["2528e88"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/07_cir": { - "refs": ["0198f09"] + "refs": ["e167dbc"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle/08_cir": { - "refs": ["0804503"] + "refs": ["076f53d"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/04_cir_Ve1": { - "refs": ["2677a2f"] + "refs": ["19aca91"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/04_cir_Ve2": { - "refs": ["f312a70"] + "refs": ["6b52c26"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle-rectangle_Ve1/07_cir_Ve1": { - "refs": ["c30e318"] + "refs": ["9dc9619"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/02_cir": { - "refs": ["026108d"] + "refs": ["a5174ac"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/03_cir": { - "refs": ["2a78ce5"] + "refs": ["99304ed"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04_cir_2c": { - "refs": ["a51bd61"] + "refs": ["a3c9ce4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04a_cir_1c": { - "refs": ["a1d1e28"] + "refs": ["6eef1b5"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04b_cir_1c": { - "refs": ["c4e1974"] + "refs": ["8fab0a6"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05_cir_2c": { - "refs": ["64c6311"] + "refs": ["45290ce"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05a_cir_1c": { - "refs": ["ed8859f"] + "refs": ["bc5a1be"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/05b_cir_1c": { - "refs": ["5cf06f8"] + "refs": ["ed00c93"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06_cir_2c": { - "refs": ["5071a47"] + "refs": ["1ed5cd5"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06a_cir_1c": { - "refs": ["2a10af6"] + "refs": ["975a74c"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/06b_cir_1c": { - "refs": ["6455629"] + "refs": ["f4bb882"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/07_cir_2c": { - "refs": ["6f10ddb"] + "refs": ["e95ef75"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/08_cir_2c": { - "refs": ["6d395b5"] + "refs": ["35ec4af"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/02a_lin": { - "refs": ["e431c2b"] + "refs": ["908e679"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/02b_lin": { - "refs": ["1adb245"] + "refs": ["5232ba3"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/03_lin": { - "refs": ["77109dd"] + "refs": ["9c6373c"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/04a_lin": { "refs": ["64b1230"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/04b_lin": { - "refs": ["4dc0519"] + "refs": ["6b79c71"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/05a_lin": { "refs": ["4305eb2"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/05b_lin": { - "refs": ["a0b4951"] + "refs": ["a86d8e1"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/06a_lin": { "refs": ["40eb432"] }, "ww_noFade/wNoFade_Tests/1_des_pol/line/06b_lin": { - "refs": ["137bb9d"] + "refs": ["5944281"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/02a_rec": { - "refs": ["66357db"] + "refs": ["cb5d4fe"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/02b_rec": { - "refs": ["d830313"] + "refs": ["8d50576"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/03_rec": { - "refs": ["feb2ff0"] + "refs": ["f0221e4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04a_rec_1c": { - "refs": ["119b995"] + "refs": ["a55a11e"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04a_rec_2c": { - "refs": ["a7ec20c"] + "refs": ["969a28b"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04b_rec_1c": { - "refs": ["92c089e"] + "refs": ["3650926"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/04b_rec_2c": { - "refs": ["2bb481d"] + "refs": ["6633ce6"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/05a_rec_2c": { - "refs": ["b55be5b"] + "refs": ["17ca418"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/05b_rec_2c": { - "refs": ["4c491eb"] + "refs": ["e5295db"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06a_rec_1c": { - "refs": ["fa69143"] + "refs": ["fae221a"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06a_rec_2c": { - "refs": ["ba8de72"] + "refs": ["0f15638"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06b_rec_1c": { - "refs": ["b060e52"] + "refs": ["ab18755"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/06b_rec_2c": { - "refs": ["582b0f4"] + "refs": ["c7ab6df"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/07a_rec_1c": { - "refs": ["4a60d62"] + "refs": ["ed35c0e"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/07a_rec_2c": { - "refs": ["d39c19e"] + "refs": ["2a3ec55"] }, "ww_noFade/wNoFade_Tests/1_des_pol/rectangle/08a_rec_2c": { - "refs": ["e210c55"] + "refs": ["3aef849"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/03_d-w_are": { - "refs": ["656764f"] + "refs": ["9cedf81"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/04a_d-w_are": { "refs": ["60adf95"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/04b_d-w_are": { - "refs": ["f3f6b71"] + "refs": ["d8fc442"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/06a_d-w_are": { "refs": ["714dd86"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/06b_d-w_are": { - "refs": ["48bf71a"] + "refs": ["cbae8fa"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area-rectangle/10_d-w_are_temporal_bubble": { "refs": ["c8383ce"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/03_d-w_are": { - "refs": ["b86e3fb"] + "refs": ["e70ea8d"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/04a_d-w_are": { "refs": ["8db239b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/04b_d-w_are": { - "refs": ["2571222"] + "refs": ["89c090b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06a_d-w_are": { "refs": ["695dd78"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06b_d-w_are": { - "refs": ["a0b6e8c"] + "refs": ["852ac2c"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/area/06b_d-w_are_V1_filter": { - "refs": ["946c43f"] + "refs": ["f41b684"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle-rectangle/04a_d-w_cir_1c": { - "refs": ["06b3fcc"] + "refs": ["b8d570a"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/03_d-w_cir": { - "refs": ["9b3d948"] + "refs": ["8b1bd22"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04_d-w_cir_2c": { - "refs": ["63d8622"] + "refs": ["c654eff"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04a_d-w_cir_1c": { - "refs": ["4cc46e5"] + "refs": ["2232d7a"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/04b_d-w_cir_1c": { - "refs": ["cfd1412"] + "refs": ["0153966"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05_d-w_cir_2c": { - "refs": ["eaa1e8d"] + "refs": ["327103d"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05a_d-w_cir_1c": { - "refs": ["bdb8ecd"] + "refs": ["2b33b59"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/05b_d-w_cir_1c": { - "refs": ["9879d38"] + "refs": ["cf792aa"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06_d-w_cir_2c": { - "refs": ["190344d"] + "refs": ["72ccb3e"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06a_d-w_cir_1c": { - "refs": ["cbffd93"] + "refs": ["baa2245"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/06b_d-w_cir_1c": { - "refs": ["c97abbc"] + "refs": ["1855282"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/07_d-w_cir_2c": { - "refs": ["879d38d"] + "refs": ["710c33f"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/circle/08_d-w_cir_2c": { - "refs": ["52534cf"] + "refs": ["9da1cee"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/02_d-w_lin": { - "refs": ["27c561e"] + "refs": ["4c45f2d"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/03_d-w_lin": { - "refs": ["9c7741e"] + "refs": ["2ef94b8"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/04a_d-w_lin": { "refs": ["db696a3"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/04b_d-w_lin": { - "refs": ["986c842"] + "refs": ["65a0169"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/05a_d-w_lin": { "refs": ["be6dd99"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/05b_d-w_lin": { - "refs": ["61c15f3"] + "refs": ["7e9b761"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/06a_d-w_lin": { - "refs": ["02ce6e5"] + "refs": ["4076550"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line-rectangle/06b_d-w_lin": { - "refs": ["0acaee6"] + "refs": ["2564947"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/02_d-w_lin": { - "refs": ["cdbc573"] + "refs": ["e51ab28"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/03_d-w_lin": { - "refs": ["4d66c9b"] + "refs": ["9686697"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/04a_d-w_lin": { "refs": ["4251e42"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/04b_d-w_lin": { - "refs": ["78fc33d"] + "refs": ["7d7a32b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/05a_d-w_lin": { "refs": ["ef80cd6"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/05b_d-w_lin": { - "refs": ["c579fe6"] + "refs": ["4e4a265"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/06a_d-w_lin": { - "refs": ["4e43cc8"] + "refs": ["b23724d"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/line/06b_d-w_lin": { - "refs": ["a0bb211"] + "refs": ["fe85c21"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/02_d-w_rec": { - "refs": ["34c80d4"] + "refs": ["9c41a3c"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/03_d-w_rec": { - "refs": ["05d82eb"] + "refs": ["bfa9740"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04a_d-w_rec_1c": { - "refs": ["e8bf057"] + "refs": ["27ec0dd"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04a_d-w_rec_2c": { - "refs": ["e5d9dce"] + "refs": ["524bc6d"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04b_d-w_rec_1c": { - "refs": ["79bac2c"] + "refs": ["8141b71"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/04b_d-w_rec_2c": { - "refs": ["b73b784"] + "refs": ["d743e53"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/05a_d-w_rec_2c": { - "refs": ["de37b75"] + "refs": ["945df3f"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/05b_d-w_rec_2c": { - "refs": ["bf0125f"] + "refs": ["753887b"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06a_d-w_rec_1c": { - "refs": ["3621ec0"] + "refs": ["eda2614"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06b_d-w_rec_1c": { - "refs": ["5782e45"] + "refs": ["55583c6"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/06b_d-w_rec_2c": { - "refs": ["a7cd86f"] + "refs": ["edaff37"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/07a_d-w_rec_1c": { - "refs": ["356c0f7"] + "refs": ["840ab66"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/07a_d-w_rec_2c": { - "refs": ["e646154"] + "refs": ["b6c28c2"] }, "ww_noFade/wNoFade_Tests/2_des_pol-without/rectangle/08a_d-w_rec_2c": { - "refs": ["f185b6f"] + "refs": ["269cd70"] }, "ww_noFade/wNoFade_Tests/Marker_label_problem/rotated_bar_to_donut": { "refs": ["98bc3b0"] @@ -2471,484 +2471,484 @@ "refs": ["626756e"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_tooltip_test": { - "refs": ["b36fd41"] + "refs": ["2f58f5c"] }, "ww_noFade/wNoFade_Tests/noFade_AND_Marker_transition_problem/pie_coxcomb_drilldown": { "refs": ["dc5f6d0"] }, "ww_noFade/wNoFade_Tests/1_des_pol/area/03_are": { - "refs": ["5a0fba5"] + "refs": ["b03b046"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/04a_are": { "refs": ["9a14a1a"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/04b_are": { - "refs": ["106ca14"] + "refs": ["af3e6f2"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/06a_are": { "refs": ["2238ed6"] }, "ww_noFade/wNoFade_cases/1_des_pol/area/06b_are": { - "refs": ["0a9c05d"] + "refs": ["2b21181"] }, "ww_noFade/wNoFade_cases/1_des_pol/area_V1/06b_are_V1": { - "refs": ["81223a0"] + "refs": ["b80f915"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/02_cir": { - "refs": ["9ba8052"] + "refs": ["a35fc6d"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/03_cir": { - "refs": ["654203e"] + "refs": ["92ae62f"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/04_cir": { - "refs": ["f59cf01"] + "refs": ["cf453f0"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/05_cir": { - "refs": ["fa4c503"] + "refs": ["bafb5b8"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/06_cir_NO": { - "refs": ["9490d30"] + "refs": ["48ac48a"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/07_cir": { - "refs": ["be888ba"] + "refs": ["3927a74"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle/08_cir": { - "refs": ["ff84745"] + "refs": ["b266f6d"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/04_cir_Ve1": { - "refs": ["dc59f23"] + "refs": ["a4294c2"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/04_cir_Ve2": { - "refs": ["1caa62c"] + "refs": ["d1fec19"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle-rectangle_Ve1/07_cir_Ve1": { - "refs": ["5f5b912"] + "refs": ["f907a9e"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04_cir_2c": { - "refs": ["7c7612c"] + "refs": ["b36a3c4"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04a_cir_1c": { - "refs": ["449f93f"] + "refs": ["7308dd4"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/04b_cir_1c": { - "refs": ["55f782b"] + "refs": ["a0d2849"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05_cir_2c": { - "refs": ["26f9e4f"] + "refs": ["08c94c2"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05a_cir_1c": { - "refs": ["16d00bd"] + "refs": ["e93cbd0"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/05b_cir_1c": { - "refs": ["fa9fb54"] + "refs": ["393bd9d"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06_cir_2c": { - "refs": ["2e45ea2"] + "refs": ["231f47b"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06a_cir_1c": { - "refs": ["869bbff"] + "refs": ["22a88df"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/06b_cir_1c": { - "refs": ["7f60369"] + "refs": ["dd08652"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/07_cir_2c": { - "refs": ["ca4f816"] + "refs": ["9c6eedc"] }, "ww_noFade/wNoFade_cases/1_des_pol/circle/08_cir_2c": { - "refs": ["5fe36e0"] + "refs": ["f54c0de"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/04a_lin": { "refs": ["924a878"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/04b_lin": { - "refs": ["a6b42af"] + "refs": ["4161e82"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/05a_lin": { "refs": ["1db7de4"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/05b_lin": { - "refs": ["0548dab"] + "refs": ["9744995"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/06a_lin": { "refs": ["7d374fa"] }, "ww_noFade/wNoFade_cases/1_des_pol/line/06b_lin": { - "refs": ["66ce2b2"] + "refs": ["914cb02"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04a_rec_1c": { - "refs": ["38ff7cd"] + "refs": ["681b586"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04a_rec_2c": { - "refs": ["699c6b4"] + "refs": ["b779be9"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04b_rec_1c": { - "refs": ["4edaf98"] + "refs": ["3cd0dd7"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/04b_rec_2c": { - "refs": ["68b9b62"] + "refs": ["979f3fe"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/05a_rec_2c": { - "refs": ["1f4b5f7"] + "refs": ["ce9b4c8"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/05b_rec_2c": { - "refs": ["3bf797a"] + "refs": ["108a093"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06a_rec_1c": { - "refs": ["da76920"] + "refs": ["4aab201"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06a_rec_2c": { - "refs": ["8275e93"] + "refs": ["527196c"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06b_rec_1c": { - "refs": ["89269c7"] + "refs": ["77ef592"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/06b_rec_2c": { - "refs": ["c1a7073"] + "refs": ["e8c8457"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/07a_rec_1c": { - "refs": ["d5d0bbc"] + "refs": ["86cc765"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/07a_rec_2c": { - "refs": ["fef7bd5"] + "refs": ["925f86f"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/08a_rec_2c": { - "refs": ["f47a18e"] + "refs": ["ed76778"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle/09_rec_TemporalDistribution": { "refs": ["d2a4c6a"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_V1/05b_rec_2c_V1": { - "refs": ["ca78a8e"] + "refs": ["1d88dd3"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_V1/06b_rec_1c_V1": { - "refs": ["49925d6"] + "refs": ["3baf285"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/04a_rec_Ve1_1c": { - "refs": ["82faa10"] + "refs": ["cab8905"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/04a_rec_Ve1_2c": { - "refs": ["80fc064"] + "refs": ["adaf56a"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/05a_rec_Ve1_2c": { - "refs": ["4e90d98"] + "refs": ["211fa36"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/06a_rec_Ve1_1c": { - "refs": ["f3e139e"] + "refs": ["1f1be6a"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/07a_rec_Ve1_2c": { - "refs": ["09ff7f2"] + "refs": ["f5dd22f"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/07a_rec_Ve2_2c": { - "refs": ["99c3618"] + "refs": ["54b0f2d"] }, "ww_noFade/wNoFade_cases/1_des_pol/rectangle_Ve1/08a_rec_Ve1_2c": { - "refs": ["4b5af9d"] + "refs": ["0c5514c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/03_d-w_are": { - "refs": ["4afb569"] + "refs": ["6490c8a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/04a_d-w_are": { "refs": ["d8feb5c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/04b_d-w_are": { - "refs": ["63465b1"] + "refs": ["bb73b5a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/06a_d-w_are": { "refs": ["0149d83"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/06b_d-w_are": { - "refs": ["6558a85"] + "refs": ["978ad48"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area-rectangle/10_d-w_are_temporal_bubble": { "refs": ["25c3a6c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/03_d-w_are": { - "refs": ["3859f1b"] + "refs": ["73282be"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/04a_d-w_are": { "refs": ["8f5b1b8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/04b_d-w_are": { - "refs": ["2d7f801"] + "refs": ["7f855ae"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/06a_d-w_are": { "refs": ["13d3ba8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/06b_d-w_are": { - "refs": ["80728ea"] + "refs": ["4f2d256"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area/10_d-w_are_temporal_bubble": { "refs": ["6615943"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/03_d-w_are_V1": { - "refs": ["d3becf7"] + "refs": ["c9bd3b4"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/04a_d-w_are_V1": { "refs": ["60afffe"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/04b_d-w_are_V1": { - "refs": ["d0b5d99"] + "refs": ["a89c809"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/06b_d-w_are_V1": { - "refs": ["53255c1"] + "refs": ["2317c35"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/area_V1/06b_d-w_are_V1_filter": { - "refs": ["e096297"] + "refs": ["7d285a4"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle-rectangle/04a_d-w_cir_1c": { - "refs": ["762d3b4"] + "refs": ["d3a7355"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle-rectangle/04a_d-w_cir_V1_1c": { - "refs": ["19ace24"] + "refs": ["03393c2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/02_d-w_cir": { - "refs": ["366f585"] + "refs": ["c473e46"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/03_d-w_cir": { - "refs": ["429fef7"] + "refs": ["c6fe1b7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04_d-w_cir_2c": { - "refs": ["9e0c715"] + "refs": ["82c2049"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04a_d-w_cir_1c": { - "refs": ["c601139"] + "refs": ["c7ca22d"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/04b_d-w_cir_1c": { - "refs": ["bf00a6f"] + "refs": ["10a8799"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05_d-w_cir_2c": { - "refs": ["f1988f2"] + "refs": ["a53189e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05a_d-w_cir_1c": { - "refs": ["425b1f0"] + "refs": ["a0229b8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/05b_d-w_cir_1c": { - "refs": ["00f351c"] + "refs": ["d11142a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06_d-w_cir_2c": { - "refs": ["e1620e7"] + "refs": ["a87529f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06a_d-w_cir_1c": { - "refs": ["1df183b"] + "refs": ["ff24730"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/06b_d-w_cir_1c": { - "refs": ["99a024b"] + "refs": ["7576ce5"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/07_d-w_cir_2c": { - "refs": ["b7136a3"] + "refs": ["bf69397"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle/08_d-w_cir_2c": { - "refs": ["a37f462"] + "refs": ["9eaac87"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/03_d-w_cir_V1": { - "refs": ["2441750"] + "refs": ["dc9f628"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04_d-w_cir_V1_2c": { - "refs": ["7051e1e"] + "refs": ["b26d39e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04a_d-w_cir_V1_1c": { - "refs": ["ea8b053"] + "refs": ["52db9e5"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/04b_d-w_cir_V1_1c": { - "refs": ["69bd61d"] + "refs": ["9f43936"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/05_d-w_cir_V1_2c": { - "refs": ["c713bc1"] + "refs": ["025186d"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/05b_d-w_cir_V1_1c": { - "refs": ["79d47be"] + "refs": ["9bd590d"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/06_d-w_cir_V1_2c": { - "refs": ["0fa44b8"] + "refs": ["758a35f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/07_d-w_cir_V1_2c": { - "refs": ["e0b1dc6"] + "refs": ["da856d0"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/circle_V1/08_d-w_cir_V1_2c": { - "refs": ["59d5c45"] + "refs": ["966cac1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/02_d-d_lin": { - "refs": ["b051e75"] + "refs": ["3068d3b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/02_d-w_lin": { - "refs": ["00c197f"] + "refs": ["4d80ed4"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/03_d-w_lin": { - "refs": ["a169c26"] + "refs": ["fc73d4e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/04a_d-w_lin": { "refs": ["21e342e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/04b_d-w_lin": { - "refs": ["09c1ab3"] + "refs": ["10eba10"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/05a_d-w_lin": { "refs": ["739d0ab"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/05b_d-w_lin": { - "refs": ["3e81fd7"] + "refs": ["3bf56b9"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/06a_d-w_lin": { - "refs": ["1505c98"] + "refs": ["1f1ed59"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line-rectangle/06b_d-w_lin": { - "refs": ["43156ea"] + "refs": ["a782a2a"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/02_d-w_lin": { - "refs": ["5b168e0"] + "refs": ["4d6e329"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/03_d-w_lin": { - "refs": ["623faa8"] + "refs": ["34c1a90"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/04a_d-w_lin": { "refs": ["a5c3469"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/04b_d-w_lin": { - "refs": ["8b51f3e"] + "refs": ["57b6741"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/05a_d-w_lin": { "refs": ["342bbca"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/05b_d-w_lin": { - "refs": ["36dbd03"] + "refs": ["fcee2fd"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/06a_d-w_lin": { - "refs": ["e00d49f"] + "refs": ["f22f441"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line/06b_d-w_lin": { - "refs": ["8a21011"] + "refs": ["3e4a21c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/02_d-w_lin_V1": { - "refs": ["6823bf9"] + "refs": ["10a0153"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/03_d-w_lin_V1": { - "refs": ["3693a49"] + "refs": ["a2ca973"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/04a_d-w_lin_V1": { "refs": ["94965e8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/04b_d-w_lin_V1": { - "refs": ["b0373b8"] + "refs": ["a7e90ff"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/05a_d-w_lin_V1": { "refs": ["89226d1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/05b_d-w_lin_V1": { - "refs": ["4e0deca"] + "refs": ["522e911"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/06a_d-w_lin_V1": { - "refs": ["0870c35"] + "refs": ["a0cd4a1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/line_V1/06b_d-w_lin_V1": { - "refs": ["6fcca46"] + "refs": ["a9d6cc2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/02_d-w_rec": { - "refs": ["a778b49"] + "refs": ["41bc1b9"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/03_d-w_rec": { - "refs": ["e0610d2"] + "refs": ["2564a6d"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04a_d-w_rec_1c": { - "refs": ["130a234"] + "refs": ["4c0707e"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04a_d-w_rec_2c": { - "refs": ["025195f"] + "refs": ["a8a710b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04b_d-w_rec_1c": { - "refs": ["fc7a2aa"] + "refs": ["b01fb08"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/04b_d-w_rec_2c": { - "refs": ["f53f006"] + "refs": ["a19f34f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/05a_d-w_rec_2c": { - "refs": ["1b7e5df"] + "refs": ["ca8e251"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/05b_d-w_rec_2c": { - "refs": ["0ad2179"] + "refs": ["d9c39aa"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06a_d-w_rec_1c": { - "refs": ["c2f82d5"] + "refs": ["cd8f0f3"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06b_d-w_rec_1c": { - "refs": ["5f2a59a"] + "refs": ["9b738e8"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/06b_d-w_rec_2c": { - "refs": ["d0c81a9"] + "refs": ["32bba66"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/07a_d-w_rec_1c": { - "refs": ["2636f16"] + "refs": ["0e1e3c7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/07a_d-w_rec_2c": { - "refs": ["8f5f44b"] + "refs": ["14a5496"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle/08a_d-w_rec_2c": { - "refs": ["82c00f1"] + "refs": ["c1ac6b6"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/03_d-w_rec_V1": { - "refs": ["571cee2"] + "refs": ["ac0908b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04a_d-w_rec_Ve1_1c_V1": { - "refs": ["b517545"] + "refs": ["1ee2871"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04a_d-w_rec_Ve1_2c_V1": { - "refs": ["4615c43"] + "refs": ["4c65d4c"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04b_d-w_rec_1c_V1": { - "refs": ["f4929b6"] + "refs": ["6f88a2f"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/04b_d-w_rec_2c_V1": { - "refs": ["4e2db0e"] + "refs": ["382aef2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/05b_d-w_rec_2c_V1": { - "refs": ["ace42d3"] + "refs": ["4e0a7a5"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/07a_d-w_rec_Ve1_2c_V1": { - "refs": ["75fb584"] + "refs": ["e299cbe"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_V1/08a_d-w_rec_Ve1_2c_V1": { - "refs": ["578c0e2"] + "refs": ["487d988"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/04a_d-w_rec_Ve1_1c": { - "refs": ["e2b0210"] + "refs": ["1b66af2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/04a_d-w_rec_Ve1_2c": { - "refs": ["57e7699"] + "refs": ["bbf30a2"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/05a_d-w_rec_Ve1_2c": { - "refs": ["317d242"] + "refs": ["5afb7a1"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/06a_d-w_rec_Ve1_1c": { - "refs": ["e579bd6"] + "refs": ["9fe880b"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/06a_d-w_rec_Ve1_2c": { - "refs": ["73fedc7"] + "refs": ["3edfaa0"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve1_2c": { - "refs": ["07e1ebb"] + "refs": ["f4fd216"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve1_2c_filter": { - "refs": ["bf96fb1"] + "refs": ["9384373"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve2_1c": { - "refs": ["7f563d2"] + "refs": ["a346cf7"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve2_2c": { - "refs": ["1a0b35c"] + "refs": ["ea13b92"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/07a_d-w_rec_Ve3_2c": { - "refs": ["c59015d"] + "refs": ["540d0c0"] }, "ww_noFade/wNoFade_cases/2_des_pol-without/rectangle_Ve1/08a_d-w_rec_Ve1_2c": { - "refs": ["d466a6c"] + "refs": ["2468b46"] }, "ww_noFade/wNoFade_wPromotion/0_01_reorder": { "refs": ["757a687"] }, "ww_noFade/wNoFade_wPromotion/1_06b_are": { - "refs": ["d47f3c9"] + "refs": ["920b1fb"] }, "ww_noFade/wNoFade_wPromotion/2_05b_lin": { - "refs": ["9b96f06"] + "refs": ["24b3aab"] }, "ww_noFade/wNoFade_wPromotion/3_04_cir": { "refs": ["5e8fc5f"] @@ -3032,7 +3032,7 @@ "refs": ["afdeda8"] }, "ww_samples_for_presets/cartesian_coo_sys/201_C_C_devided_lollipop_chart": { - "refs": ["ac3b6f1"] + "refs": ["8f40003"] }, "ww_samples_for_presets/cartesian_coo_sys/20_C_C_lollipop_chart": { "refs": ["25c68b8"] @@ -3056,7 +3056,7 @@ "refs": ["ef2e07b"] }, "ww_samples_for_presets/cartesian_coo_sys/29_C_A_stacked_area_chart_percentage_labels": { - "refs": ["84fc78a"] + "refs": ["e44641e"] }, "ww_samples_for_presets/cartesian_coo_sys/30_C_A_overlay_area_chart": { "refs": ["37f9e0a"] @@ -3218,7 +3218,7 @@ "refs": ["d48a74d"] }, "web_content/cookbook/rendering/custom_markers": { - "refs": ["de968d4"] + "refs": ["bc42176"] }, "web_content/cookbook/rendering/dropshadow_on_marker": { "refs": ["86553d8"] diff --git a/test/e2e/tests/fixes.json b/test/e2e/tests/fixes.json index 793370398..3dbf34d0c 100644 --- a/test/e2e/tests/fixes.json +++ b/test/e2e/tests/fixes.json @@ -53,7 +53,7 @@ "refs": ["5f58727"] }, "53913538": { - "refs": ["a59ab4f"] + "refs": ["41a209c"] }, "53978116": { "refs": ["98f95e7"] diff --git a/test/e2e/tests/style_tests.json b/test/e2e/tests/style_tests.json index 237218970..b546dc48c 100644 --- a/test/e2e/tests/style_tests.json +++ b/test/e2e/tests/style_tests.json @@ -1031,7 +1031,7 @@ "refs": ["f179c0b"] }, "legend/offsetY": { - "refs": ["2307834"] + "refs": ["35d9ec1"] } } } From 9a24410a15b4fa74baa4239c5ee21f7a88de7399 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 29 Aug 2024 12:20:56 +0200 Subject: [PATCH 18/20] Add changelog + fix format --- CHANGELOG.md | 8 ++++++++ test/e2e/tests/style_tests/legend/offsetY.mjs | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cca3a865e..a7fa98471 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +### Fixed + +- Legend title bottomPadding extended. + +### Added + +- New style parameter for the legend scrolling. + ## [0.12.1] - 2024-08-22 ### Fixed diff --git a/test/e2e/tests/style_tests/legend/offsetY.mjs b/test/e2e/tests/style_tests/legend/offsetY.mjs index 65eb94238..e2df06359 100644 --- a/test/e2e/tests/style_tests/legend/offsetY.mjs +++ b/test/e2e/tests/style_tests/legend/offsetY.mjs @@ -8,7 +8,7 @@ const testSteps = [ config: { x: 'Joy factors', y: ['Country', 'Value 1 (+)'], - color: {set: 'Country', title: 'offset test'} + color: { set: 'Country', title: 'offset test' } }, style: { plot: { @@ -21,7 +21,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '1em'} + color: { title: '1em' } }, style: { legend: { @@ -32,7 +32,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '2em'} + color: { title: '2em' } }, style: { legend: { @@ -43,7 +43,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '-2em'} + color: { title: '-2em' } }, style: { legend: { @@ -54,7 +54,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '100%'} + color: { title: '100%' } }, style: { legend: { @@ -65,7 +65,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '100%-2em'} + color: { title: '100%-2em' } }, style: { legend: { @@ -76,7 +76,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: null} + color: { title: null } }, style: { legend: { @@ -87,7 +87,7 @@ const testSteps = [ (chart) => chart.animate({ config: { - color: {title: '17px'} + color: { title: '17px' } }, style: { legend: { From 89090ef04ccec739f29e2555d480763e8c9224e1 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 29 Aug 2024 14:46:34 +0200 Subject: [PATCH 19/20] Remove marker labels at intermediate steps --- CHANGELOG.md | 1 + src/chart/animator/animation.cpp | 11 +++++ test/e2e/test_cases/test_cases.json | 72 ++++++++++++++--------------- test/e2e/tests/fixes.json | 2 +- 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7fa98471..e349dc409 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Legend title bottomPadding extended. +- Remove marker labels at intermediate steps. ### Added diff --git a/src/chart/animator/animation.cpp b/src/chart/animator/animation.cpp index 0e9d7a244..9bced5a59 100644 --- a/src/chart/animator/animation.cpp +++ b/src/chart/animator/animation.cpp @@ -194,6 +194,17 @@ Gen::PlotPtr Animation::getIntermediate(const Gen::PlotPtr &base, if (*extOptions != *other->getOptions() && *extOptions != *base->getOptions()) { + + auto &labelChannel = + extOptions->getChannels().at(Gen::ChannelId::label); + + for (const auto &series : labelChannel.dimensions()) + extOptions->getChannels() + .at(Gen::ChannelId::noop) + .dimensionIds.push_back(series); + + labelChannel.reset(); + res = Gen::PlotBuilder{dataTable, extOptions, base->getStyle()} .build(); diff --git a/test/e2e/test_cases/test_cases.json b/test/e2e/test_cases/test_cases.json index 213b61d47..2cd4f3518 100644 --- a/test/e2e/test_cases/test_cases.json +++ b/test/e2e/test_cases/test_cases.json @@ -77,10 +77,10 @@ "refs": ["041cc6e"] }, "basic_animations/legend_transitions/color_off_on_series_anim": { - "refs": ["ea45913"] + "refs": ["801f840"] }, "basic_animations/legend_transitions/lightness_2discrete_anim": { - "refs": ["219235d"] + "refs": ["bd84d4f"] }, "basic_animations/legend_transitions/lightness_conti_anim": { "refs": ["828148b"] @@ -221,7 +221,7 @@ "refs": ["984f6a4"] }, "operations/all_operations": { - "refs": ["87763e6"] + "refs": ["0479b15"] }, "operations/all_operations_sizeing": { "refs": ["713b086"] @@ -578,7 +578,7 @@ "refs": ["fc9d14b"] }, "web_content/analytical_operations/drilldown/column_3": { - "refs": ["2c51570"] + "refs": ["f7917f4"] }, "web_content/analytical_operations/drilldown/column_4": { "refs": ["198e5f2"] @@ -704,7 +704,7 @@ "refs": ["47754fa"] }, "web_content/analytical_operations/sum/bubbleplot_1": { - "refs": ["34557ae"] + "refs": ["f65d95d"] }, "web_content/analytical_operations/sum/bubbleplot_2": { "refs": ["18e6318"] @@ -719,10 +719,10 @@ "refs": ["f981033"] }, "web_content/analytical_operations/sum/column_2": { - "refs": ["ee6e53a"] + "refs": ["f064ea6"] }, "web_content/analytical_operations/sum/column_to_bar": { - "refs": ["5cdbbca"] + "refs": ["b5690e0"] }, "web_content/analytical_operations/sum/column_to_waterfall": { "refs": ["623babf"] @@ -737,13 +737,13 @@ "refs": ["155f675"] }, "web_content/analytical_operations/sum/column_stacked_2": { - "refs": ["60788e5"] + "refs": ["77927ba"] }, "web_content/analytical_operations/sum/coxcomb_1": { "refs": ["0a8ea50"] }, "web_content/analytical_operations/sum/coxcomb_2": { - "refs": ["b17fcd8"] + "refs": ["9ad562c"] }, "web_content/analytical_operations/sum/coxcomb_split": { "refs": ["38c5f24"] @@ -767,7 +767,7 @@ "refs": ["342860d"] }, "web_content/analytical_operations/sum/scatterplot": { - "refs": ["a09c882"] + "refs": ["bbf6383"] }, "web_content/analytical_operations/sum/stream_stacked": { "refs": ["a59f246"] @@ -818,7 +818,7 @@ "refs": ["549404c"] }, "web_content_removed/animated/orientation_rectangle": { - "refs": ["ed644fc"] + "refs": ["388ca5e"] }, "web_content_removed/animated/pie_donut2_rectangle_1dis_1con": { "refs": ["2543753"] @@ -1778,16 +1778,16 @@ "refs": ["26b2686"] }, "ww_next_steps/next_steps_Tests/02_C_R": { - "refs": ["07a3161"] + "refs": ["7fa6b9d"] }, "ww_next_steps/next_steps_Tests/02_C_R_water_comparison_sum": { "refs": ["e4126f6"] }, "ww_next_steps/next_steps_Tests/03_C_R": { - "refs": ["2f85528"] + "refs": ["f3bbd9a"] }, "ww_next_steps/next_steps_Tests/04_C_R": { - "refs": ["87b761e"] + "refs": ["6d92828"] }, "ww_next_steps/next_steps_Tests/05_C_R": { "refs": ["533ff4f"] @@ -1880,7 +1880,7 @@ "refs": ["c159fb6"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_01": { - "refs": ["1cd042b"] + "refs": ["d2ba645"] }, "ww_next_steps/next_steps_byOperations/drilldown/drilldown_02": { "refs": ["3d6557e"] @@ -1955,22 +1955,22 @@ "refs": ["a3fffec"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_03": { - "refs": ["6604dfd"] + "refs": ["b80a546"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_04": { "refs": ["4004cf9"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_05": { - "refs": ["3cb73b6"] + "refs": ["6a30f78"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_06": { "refs": ["2f12434"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_07": { - "refs": ["e3cb0b7"] + "refs": ["94d8521"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_08": { - "refs": ["f9db953"] + "refs": ["d507686"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_09": { "refs": ["e02a016"] @@ -1985,10 +1985,10 @@ "refs": ["ef2f675"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_13": { - "refs": ["9c8a8c1"] + "refs": ["580ad13"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_14": { - "refs": ["d3d3d1d"] + "refs": ["2e729bf"] }, "ww_next_steps/next_steps_byOperations/sum_aggregate/sum_aggregate_16": { "refs": ["d8a5a32"] @@ -2012,16 +2012,16 @@ "refs": ["d200cb1"] }, "ww_next_steps/next_steps_byOperations/total/total_01": { - "refs": ["6a0650c"] + "refs": ["272a929"] }, "ww_next_steps/next_steps_byOperations/total/total_02": { - "refs": ["d0e74b5"] + "refs": ["5f5e11c"] }, "ww_next_steps/next_steps_byOperations/total/total_03": { - "refs": ["bbb180d"] + "refs": ["084e492"] }, "ww_next_steps/next_steps_byOperations/total/total_04": { - "refs": ["13cc929"] + "refs": ["814e87a"] }, "ww_next_steps/next_steps_byOperations/total/total_05": { "refs": ["550ee57"] @@ -2099,13 +2099,13 @@ "refs": ["30fc050"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/4a_06b_rec_1c": { - "refs": ["c6cf6ae"] + "refs": ["f392fdb"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/5_04a_rec_1c": { - "refs": ["453be51"] + "refs": ["14bedf4"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/6_04a_cir_1c": { - "refs": ["e78cbf1"] + "refs": ["c91dfd2"] }, "ww_next_steps/next_steps_byOperations/wREGIEKBOL/NoFade_Promobol/7_05_cir_2c": { "refs": ["9498382"] @@ -2171,7 +2171,7 @@ "refs": ["a3c9ce4"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04a_cir_1c": { - "refs": ["6eef1b5"] + "refs": ["e79abc9"] }, "ww_noFade/wNoFade_Tests/1_des_pol/circle/04b_cir_1c": { "refs": ["8fab0a6"] @@ -2465,7 +2465,7 @@ "refs": ["3961fff"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_drilldown_aggregate_x": { - "refs": ["cba228a"] + "refs": ["eec3413"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/line_orientation": { "refs": ["626756e"] @@ -3164,22 +3164,22 @@ "refs": ["40ed193"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_1": { - "refs": ["d24a0be"] + "refs": ["72b2bbf"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_2": { - "refs": ["f801afa"] + "refs": ["c76ede1"] }, "www_new_analytical_operations/operations/02_sum/Column_Groupped_Column_to_Bar": { - "refs": ["0a93730"] + "refs": ["d65644e"] }, "www_new_analytical_operations/operations/02_sum/Column_Stacked_Column_1": { - "refs": ["a9e28ef"] + "refs": ["76f46b7"] }, "www_new_analytical_operations/operations/02_sum/Column_Stacked_Column_2": { - "refs": ["bb3cea0"] + "refs": ["a306f12"] }, "www_new_analytical_operations/operations/02_sum/Coxcomb_Coxcomb_to_Donut": { - "refs": ["c707f14"] + "refs": ["60d7166"] }, "www_new_analytical_operations/operations/02_sum/Line_Line_3": { "refs": ["ea115f0"] diff --git a/test/e2e/tests/fixes.json b/test/e2e/tests/fixes.json index 3dbf34d0c..bc4cf06da 100644 --- a/test/e2e/tests/fixes.json +++ b/test/e2e/tests/fixes.json @@ -35,7 +35,7 @@ "refs": ["40a70bd"] }, "540": { - "refs": ["bc34559"] + "refs": ["91b45be"] }, "32303048": { "refs": ["b5d95ea"] From baa3936c569e764637da7755fca779e40f513f97 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Fri, 30 Aug 2024 11:39:26 +0200 Subject: [PATCH 20/20] Remove Text::immutable_string --- src/apps/qutils/canvas.cpp | 3 +- src/apps/weblib/cinterface.cpp | 3 +- src/apps/weblib/interface.cpp | 4 +- src/apps/weblib/interface.h | 4 +- src/base/anim/interpolated.h | 3 +- src/base/gfx/draw/textbox.cpp | 2 +- src/base/gfx/draw/textbox.h | 2 +- src/base/gfx/font.cpp | 3 +- src/base/gfx/font.h | 9 +- src/base/text/immutable_string.h | 292 ------------------------- src/base/text/naturalcmp.cpp | 4 +- src/base/text/naturalcmp.h | 6 +- src/base/text/smartstring.cpp | 7 +- src/base/text/smartstring.h | 3 +- src/chart/generator/axis.cpp | 4 +- src/chart/generator/axis.h | 8 +- src/chart/generator/plot.h | 4 +- src/chart/main/style.cpp | 4 +- src/chart/main/style.h | 2 +- src/chart/options/channel.cpp | 2 +- src/chart/options/channel.h | 5 +- src/chart/options/options.h | 3 +- src/chart/rendering/drawaxes.cpp | 6 +- src/chart/rendering/drawlegend.cpp | 2 +- src/chart/rendering/drawlegend.h | 2 +- src/chart/rendering/markerrenderer.cpp | 4 +- src/chart/rendering/markerrenderer.h | 4 +- src/dataframe/impl/aggregators.cpp | 14 +- src/dataframe/impl/data_source.cpp | 33 ++- src/dataframe/impl/data_source.h | 60 ++--- src/dataframe/impl/dataframe.cpp | 42 ++-- src/dataframe/impl/dataframe.h | 30 ++- src/dataframe/interface.cpp | 33 ++- src/dataframe/interface.h | 44 ++-- src/dataframe/old/datatable.cpp | 23 +- src/dataframe/old/datatable.h | 14 +- src/dataframe/old/types.h | 15 +- test/qtest/chart.cpp | 30 +-- test/unit/dataframe/interface_test.cpp | 17 +- 39 files changed, 192 insertions(+), 558 deletions(-) delete mode 100644 src/base/text/immutable_string.h diff --git a/src/apps/qutils/canvas.cpp b/src/apps/qutils/canvas.cpp index d5e56dc15..2a6658486 100644 --- a/src/apps/qutils/canvas.cpp +++ b/src/apps/qutils/canvas.cpp @@ -259,8 +259,7 @@ QFont BaseCanvas::fromGfxFont(const Gfx::Font &newFont, QFont font) font.setPixelSize(static_cast(newFont.size)); if (!newFont.family.empty()) - font.setFamily( - QString::fromStdString(newFont.family.toString())); + font.setFamily(QString::fromStdString(newFont.family)); font.setWeight(newFont.weight == Gfx::Font::Weight::Bold() ? QFont::Bold diff --git a/src/apps/weblib/cinterface.cpp b/src/apps/weblib/cinterface.cpp index 941ff7128..1c88e39e6 100644 --- a/src/apps/weblib/cinterface.cpp +++ b/src/apps/weblib/cinterface.cpp @@ -281,8 +281,7 @@ const Value *record_getValue(const Vizzu::Data::RowWrapper *record, if (auto &&cval = Interface::getRecordValue(*record, column); cval.index()) { val.dimension = true; - auto &&dim = - *std::get_if(&cval); + auto &&dim = *std::get_if(&cval); new ( &val.dimensionValue) // NOLINT(bugprone-multi-level-implicit-pointer-conversion) const char *{dim ? dim->c_str() : nullptr}; diff --git a/src/apps/weblib/interface.cpp b/src/apps/weblib/interface.cpp index 328e62b28..4b1261612 100644 --- a/src/apps/weblib/interface.cpp +++ b/src/apps/weblib/interface.cpp @@ -209,8 +209,8 @@ void Interface::setChartFilter(ObjectRegistryHandle chart, getChart(chart)->getOptions().dataFilter = {}; } -std::variant -Interface::getRecordValue(const Data::RowWrapper &record, +std::variant Interface::getRecordValue( + const Data::RowWrapper &record, const char *column) { return record.get_value(column); diff --git a/src/apps/weblib/interface.h b/src/apps/weblib/interface.h index ffdf180c5..7101ac75f 100644 --- a/src/apps/weblib/interface.h +++ b/src/apps/weblib/interface.h @@ -128,8 +128,8 @@ class Interface const char *path, const char *value); - static std::variant - getRecordValue(const Data::RowWrapper &record, + static std::variant getRecordValue( + const Data::RowWrapper &record, const char *column); private: diff --git a/src/base/anim/interpolated.h b/src/base/anim/interpolated.h index 73ee78d78..1978cf2bf 100644 --- a/src/base/anim/interpolated.h +++ b/src/base/anim/interpolated.h @@ -11,7 +11,6 @@ #include "base/conv/tostring.h" #include "base/math/floating.h" #include "base/math/interpolation.h" -#include "base/text/immutable_string.h" namespace Anim { @@ -277,7 +276,7 @@ Interpolated interpolate(const Interpolated &op0, return res; } -using String = Interpolated; +using String = Interpolated; } diff --git a/src/base/gfx/draw/textbox.cpp b/src/base/gfx/draw/textbox.cpp index cf19d67a1..2cdc973ed 100644 --- a/src/base/gfx/draw/textbox.cpp +++ b/src/base/gfx/draw/textbox.cpp @@ -73,7 +73,7 @@ TextBox &TextBox::operator<<(const char *str) return *this; } -TextBox &TextBox::operator<<(const Text::immutable_string &str) +TextBox &TextBox::operator<<(const std::string &str) { size.x = size.y = 0; currentTextRun.content += str; diff --git a/src/base/gfx/draw/textbox.h b/src/base/gfx/draw/textbox.h index b0414d585..46011b79a 100644 --- a/src/base/gfx/draw/textbox.h +++ b/src/base/gfx/draw/textbox.h @@ -80,7 +80,7 @@ class TextBox TextBox &operator<<(const LineSpacing &); TextBox &operator<<(const char *); - TextBox &operator<<(const Text::immutable_string &); + TextBox &operator<<(const std::string &); TextBox &operator<<(const Tab &); TextBox &operator<<(const NewLine &); TextBox &operator<<(const Font &); diff --git a/src/base/gfx/font.cpp b/src/base/gfx/font.cpp index ad2b0edde..10e1fc5ed 100644 --- a/src/base/gfx/font.cpp +++ b/src/base/gfx/font.cpp @@ -4,7 +4,6 @@ #include "base/conv/parse.h" #include "base/conv/tostring.h" -#include "base/text/immutable_string.h" namespace Gfx { @@ -45,7 +44,7 @@ bool Font::Weight::operator==(const Font::Weight &other) const Font::Font(double size) : style(Gfx::Font::Style::normal), size(size) {} -Font::Font(Text::immutable_string family, +Font::Font(std::string family, Style style, Weight weight, double size) : diff --git a/src/base/gfx/font.h b/src/base/gfx/font.h index 4f107af61..476290bbf 100644 --- a/src/base/gfx/font.h +++ b/src/base/gfx/font.h @@ -4,8 +4,6 @@ #include #include -#include "base/text/immutable_string.h" - namespace Gfx { @@ -32,16 +30,13 @@ class Font enum class Style : std::uint8_t { normal, italic, oblique }; - Text::immutable_string family; + std::string family; Style style; Weight weight; double size; explicit Font(double size = 0); - Font(Text::immutable_string family, - Style style, - Weight weight, - double size); + Font(std::string family, Style style, Weight weight, double size); Font(const Font &) = default; Font(Font &&) = default; Font &operator=(const Font &) = default; diff --git a/src/base/text/immutable_string.h b/src/base/text/immutable_string.h deleted file mode 100644 index a9a6050a8..000000000 --- a/src/base/text/immutable_string.h +++ /dev/null @@ -1,292 +0,0 @@ -#ifndef IMMUTABLE_STRING_H -#define IMMUTABLE_STRING_H - -#include -#include -#include -#include -#include - -namespace Text -{ - -struct immutable_string -{ - struct impl_t - { - std::size_t counter; - const std::size_t size; - }; - - struct deleter_t - { - void operator()(char *buffer) const noexcept - { - ::operator delete[](buffer, - std::align_val_t{alignof(impl_t)}); - } - - void operator()(impl_t *impl) const noexcept - { - auto *buffer = std::launder( - static_cast(static_cast(impl))); - impl->~impl_t(); - ::operator delete(buffer, impl); - (*this)(buffer); - } - }; - - struct allocator_t - { - impl_t *operator()(const char *data, std::size_t length) const - { - std::unique_ptr ptr{ - new (std::align_val_t{alignof( - impl_t)}) char[sizeof(impl_t) + length + 1]}; - std::memcpy(ptr.get() + sizeof(impl_t), data, length); - ptr.get()[sizeof(impl_t) + length] = '\0'; - - static_assert(std::is_nothrow_constructible_v); - auto res = std::unique_ptr{ - new (ptr.release()) impl_t{1, length}}; - return res.release(); - } - }; - - [[nodiscard]] constexpr immutable_string() noexcept : impl{} {} - - [[nodiscard]] explicit constexpr immutable_string( - std::nullptr_t) noexcept : - impl{} - {} - - [[nodiscard]] explicit immutable_string( - const std::string_view &data) : - impl(allocator_t{}(data.data(), data.size())) - {} - - template - // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) - using CCharArr = const char[N]; - - template - // NOLINTNEXTLINE(google-explicit-constructor) - [[nodiscard]] immutable_string(CCharArr &data) : - immutable_string(std::string_view{data, N - 1}) - {} - - template - // NOLINTNEXTLINE(google-explicit-constructor) - [[nodiscard]] immutable_string(CCharArr &&data) : - immutable_string(std::string_view{data, N - 1}) - {} - - [[nodiscard]] immutable_string( - const immutable_string &other) noexcept : - impl(other.impl) - { - if (impl) ++impl->counter; - } - - [[nodiscard]] immutable_string(immutable_string &&other) noexcept - : - impl(other.impl) - { - other.impl = nullptr; - } - - immutable_string &operator=( - const immutable_string &other) noexcept - { - if (this == &other) return *this; - decr(); - impl = other.impl; - if (impl) ++impl->counter; - return *this; - } - - immutable_string &operator=(immutable_string &&other) noexcept - { - if (this == &other) return *this; - decr(); - impl = other.impl; - other.impl = nullptr; - return *this; - } - - immutable_string &operator=(const char *data) - { - decr(); - impl = allocator_t{}(data, std::strlen(data)); - return *this; - } - - ~immutable_string() noexcept { decr(); } - - void decr() - { - if (impl && --impl->counter == 0) - deleter_t{}(std::exchange(impl, nullptr)); - } - - [[nodiscard]] const char *c_str() const noexcept - { - if (!impl) return ""; - return view().data(); - } - - // NOLINTNEXTLINE(google-explicit-constructor) - [[nodiscard]] operator std::string_view() const noexcept - { - if (!impl) return {}; - return {std::launder(static_cast( - static_cast(impl))) - + sizeof(impl_t), - impl->size}; - } - - [[nodiscard]] std::string_view view() const noexcept - { - return *this; - } - - [[nodiscard]] bool empty() const noexcept - { - return !impl || impl->size == 0; - } - - [[nodiscard]] bool operator==( - const immutable_string &other) const noexcept - { - return view() == other.view(); - } - - [[nodiscard]] auto operator<=>( - const immutable_string &other) const noexcept - { - return view() <=> other.view(); - } - - [[nodiscard]] friend bool operator==(const immutable_string &lhs, - const std::string_view &rhs) noexcept - { - return lhs.view() == rhs; - } - - [[nodiscard]] friend bool operator==(const std::string_view &lhs, - const immutable_string &rhs) noexcept - { - return lhs == rhs.view(); - } - - template - [[nodiscard]] friend bool operator==(const immutable_string &lhs, - CCharArr &rhs) noexcept - { - return lhs == std::string_view{rhs, N - 1}; - } - - template - [[nodiscard]] friend bool operator==(CCharArr &lhs, - const immutable_string &rhs) noexcept - { - return std::string_view{lhs, N - 1} == rhs; - } - - template - [[nodiscard]] friend bool operator==(const immutable_string &lhs, - CCharArr &&rhs) noexcept - { - return lhs == std::string_view{rhs, N - 1}; - } - - template - [[nodiscard]] friend bool operator==(CCharArr &&lhs, - const immutable_string &rhs) noexcept - { - return std::string_view{lhs, N - 1} == rhs; - } - - [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - const std::string_view &rhs) noexcept - { - return lhs.view() <=> rhs; - } - - [[nodiscard]] friend auto operator<=>(const std::string_view &lhs, - const immutable_string &rhs) noexcept - { - return lhs <=> rhs.view(); - } - - template - [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - CCharArr &rhs) noexcept - { - return lhs <=> std::string_view{rhs, N - 1}; - } - - template - [[nodiscard]] friend auto operator<=>(CCharArr &lhs, - const immutable_string &rhs) noexcept - { - return std::string_view{lhs, N - 1} <=> rhs; - } - - template - [[nodiscard]] friend auto operator<=>(const immutable_string &lhs, - CCharArr &&rhs) noexcept - { - return lhs <=> std::string_view{rhs, N - 1}; - } - - template - [[nodiscard]] friend auto operator<=>(CCharArr &&lhs, - const immutable_string &rhs) noexcept - { - return std::string_view{lhs, N - 1} <=> rhs; - } - - friend std::string operator+(const immutable_string &lhs, - const std::string &rhs) - { - return lhs.toString() + rhs; - } - - friend std::string operator+(const std::string &lhs, - const immutable_string &rhs) - { - return lhs + rhs.toString(); - } - - friend std::string operator+(const immutable_string &lhs, - std::string &&rhs) - { - return lhs.toString() + std::move(rhs); - } - - friend std::string operator+(std::string &&lhs, - const immutable_string &rhs) - { - return std::move(lhs) + rhs.toString(); - } - - [[nodiscard]] std::string toString() const - { - return std::string{view()}; - } - - [[nodiscard]] static immutable_string fromString( - const std::string &data) - { - return immutable_string{data}; - } - - impl_t *impl; -}; - -} - -#endif // IMMUTABLE_STRING_H diff --git a/src/base/text/naturalcmp.cpp b/src/base/text/naturalcmp.cpp index cf89404d6..be3d15560 100644 --- a/src/base/text/naturalcmp.cpp +++ b/src/base/text/naturalcmp.cpp @@ -15,8 +15,8 @@ NaturalCmp::NaturalCmp(bool ignoreCase, bool ignoreSpace) : ignoreSpace(ignoreSpace) {} -bool NaturalCmp::operator()(const immutable_string &op0, - const immutable_string &op1) const +bool NaturalCmp::operator()(const std::string &op0, + const std::string &op1) const { return std::is_lt(cmp(op0.c_str(), op1.c_str())); } diff --git a/src/base/text/naturalcmp.h b/src/base/text/naturalcmp.h index 72d91461f..336a2afe4 100644 --- a/src/base/text/naturalcmp.h +++ b/src/base/text/naturalcmp.h @@ -3,8 +3,6 @@ #include -#include "immutable_string.h" - namespace Text { @@ -13,8 +11,8 @@ class NaturalCmp public: explicit NaturalCmp(bool ignoreCase = true, bool ignoreSpace = true); - [[nodiscard]] bool operator()(const immutable_string &, - const immutable_string &) const; + [[nodiscard]] bool operator()(const std::string &, + const std::string &) const; private: bool ignoreCase; diff --git a/src/base/text/smartstring.cpp b/src/base/text/smartstring.cpp index 324bec064..1365f6563 100644 --- a/src/base/text/smartstring.cpp +++ b/src/base/text/smartstring.cpp @@ -59,7 +59,7 @@ std::string fromPhysicalValue(double value, NumberFormat format, size_t maxFractionDigits, const NumberScale &numberScale, - const immutable_string &unit) + const std::string &unit) { Conv::NumberToString converter{ static_cast(maxFractionDigits)}; @@ -76,7 +76,7 @@ std::string fromPhysicalValue(double value, return converter(num.signedCoef()) + (prefix.empty() && (unit.empty() || unit == "%") - ? unit.toString() + ? unit : " " + prefix + unit); } break; @@ -88,8 +88,7 @@ std::string fromPhysicalValue(double value, default: break; } return converter(value) - + (unit.empty() || unit == "%" ? unit.toString() - : " " + unit); + + (unit.empty() || unit == "%" ? unit : " " + unit); } } diff --git a/src/base/text/smartstring.h b/src/base/text/smartstring.h index 633731a3e..b00c83c4f 100644 --- a/src/base/text/smartstring.h +++ b/src/base/text/smartstring.h @@ -5,7 +5,6 @@ #include #include -#include "immutable_string.h" #include "numberscale.h" namespace Text @@ -26,7 +25,7 @@ void trim(std::string &string); NumberFormat format, size_t maxFractionDigits, const NumberScale &numberScale, - const immutable_string &unit); + const std::string &unit); } } diff --git a/src/chart/generator/axis.cpp b/src/chart/generator/axis.cpp index 7a01f5227..70622003c 100644 --- a/src/chart/generator/axis.cpp +++ b/src/chart/generator/axis.cpp @@ -34,8 +34,8 @@ Geom::Point Axises::origo() const } MeasureAxis::MeasureAxis(Math::Range interval, - const Text::immutable_string &unit, - const Text::immutable_string &measName, + const std::string &unit, + const std::string &measName, std::optional step) : enabled(true), range(interval), diff --git a/src/chart/generator/axis.h b/src/chart/generator/axis.h index bfd4473e4..2f2b29283 100644 --- a/src/chart/generator/axis.h +++ b/src/chart/generator/axis.h @@ -37,8 +37,8 @@ struct MeasureAxis ::Anim::Interpolated step{1.0}; MeasureAxis() = default; MeasureAxis(Math::Range interval, - const Text::immutable_string &unit, - const Text::immutable_string &measName, + const std::string &unit, + const std::string &measName, std::optional step); bool operator==(const MeasureAxis &other) const; [[nodiscard]] double origo() const; @@ -65,7 +65,7 @@ struct DimensionAxis double value; ::Anim::Interpolated colorBase; ::Anim::String label; - Text::immutable_string categoryValue; + std::string categoryValue; double weight; Item(Math::Range range, @@ -104,7 +104,7 @@ struct DimensionAxis using Values = std::multimap; bool enabled{false}; - Text::immutable_string category{}; + std::string category{}; std::shared_ptr>> trackedValues; diff --git a/src/chart/generator/plot.h b/src/chart/generator/plot.h index a0946e089..a634591a6 100644 --- a/src/chart/generator/plot.h +++ b/src/chart/generator/plot.h @@ -40,8 +40,8 @@ class Plot struct MarkerInfoContent { std::optional markerId; - std::shared_ptr>> + std::shared_ptr< + const std::vector>> info; MarkerInfoContent() = default; diff --git a/src/chart/main/style.cpp b/src/chart/main/style.cpp index 60c171902..cc3c68ca0 100644 --- a/src/chart/main/style.cpp +++ b/src/chart/main/style.cpp @@ -18,8 +18,8 @@ namespace Vizzu::Styles const Font &Chart::getDefaultFont() { static const auto instance = - Font{.fontFamily = ::Anim::String( - ::Text::immutable_string{"Roboto, sans-serif"}), + Font{.fontFamily = + ::Anim::String(::std::string{"Roboto, sans-serif"}), .fontStyle = Gfx::Font::Style::normal, .fontWeight = Gfx::Font::Weight::Normal(), .fontSize = Gfx::Length{12}}; diff --git a/src/chart/main/style.h b/src/chart/main/style.h index d02d070c2..23f643d09 100644 --- a/src/chart/main/style.h +++ b/src/chart/main/style.h @@ -103,7 +103,7 @@ struct Font throw std::logic_error("internal error: no font parent set"); } - [[nodiscard]] Text::immutable_string calculatedFamily() const + [[nodiscard]] std::string calculatedFamily() const { if (fontFamily.has_value()) if (auto &&ff = diff --git a/src/chart/options/channel.cpp b/src/chart/options/channel.cpp index c9cae7cfe..5b839ebec 100644 --- a/src/chart/options/channel.cpp +++ b/src/chart/options/channel.cpp @@ -63,7 +63,7 @@ void Channel::reset() { measureId = std::nullopt; dimensionIds.clear(); - title = Base::AutoParam{}; + title = Base::AutoParam{}; axisLine = Base::AutoBool(); axisLabels = Base::AutoBool(); ticks = Base::AutoBool(); diff --git a/src/chart/options/channel.h b/src/chart/options/channel.h index 0e72dae35..8bcf6b677 100644 --- a/src/chart/options/channel.h +++ b/src/chart/options/channel.h @@ -3,8 +3,9 @@ #include #include -#include +#include +#include "dataframe/old/datatable.h" #include "dataframe/old/types.h" #include "autoparam.h" @@ -58,7 +59,7 @@ class Channel DimensionIndices dimensionIds{}; ChannelRange range{}; std::size_t labelLevel{}; - Base::AutoParam title{}; + Base::AutoParam title{}; Base::AutoBool axisLine{}; Base::AutoBool axisLabels{}; Base::AutoBool ticks{}; diff --git a/src/chart/options/options.h b/src/chart/options/options.h index ffce2b22c..55194bef3 100644 --- a/src/chart/options/options.h +++ b/src/chart/options/options.h @@ -11,7 +11,6 @@ #include "base/geom/rect.h" #include "base/math/fuzzybool.h" #include "base/math/range.h" -#include "base/text/immutable_string.h" #include "dataframe/old/types.h" #include "align.h" @@ -46,7 +45,7 @@ class Options Refl::get_enum(name)); })); - using MarkerIndex = Text::immutable_string; + using MarkerIndex = std::string; using MarkerInfoId = std::uint32_t; using Heading = ::Anim::Interpolated>; using LegendType = Base::AutoParam; diff --git a/src/chart/rendering/drawaxes.cpp b/src/chart/rendering/drawaxes.cpp index ffb05ae27..b5779836b 100644 --- a/src/chart/rendering/drawaxes.cpp +++ b/src/chart/rendering/drawaxes.cpp @@ -344,10 +344,8 @@ void DrawAxes::drawDimensionLabel(bool horizontal, posDir = posDir.extend(sign); - auto draw = - [&](const ::Anim::Weighted - &str, - double plusWeight = 1.0) + auto draw = [&](const ::Anim::Weighted &str, + double plusWeight = 1.0) { drawLabel.draw(canvas, str.value.c_str(), diff --git a/src/chart/rendering/drawlegend.cpp b/src/chart/rendering/drawlegend.cpp index e66b8e29f..14de3c84c 100644 --- a/src/chart/rendering/drawlegend.cpp +++ b/src/chart/rendering/drawlegend.cpp @@ -298,7 +298,7 @@ void DrawLegend::drawMeasure(const Info &info) const void DrawLegend::extremaLabel(const Info &info, double value, - const Text::immutable_string &unit, + const std::string &unit, int pos, double plusWeight) const { diff --git a/src/chart/rendering/drawlegend.h b/src/chart/rendering/drawlegend.h index 504ecac41..7a6859a4a 100644 --- a/src/chart/rendering/drawlegend.h +++ b/src/chart/rendering/drawlegend.h @@ -79,7 +79,7 @@ class DrawLegend : public DrawingContext void extremaLabel(const Info &info, double value, - const Text::immutable_string &unit, + const std::string &unit, int pos, double plusWeight) const; void colorBar(const Info &info, const Geom::Rect &rect) const; diff --git a/src/chart/rendering/markerrenderer.cpp b/src/chart/rendering/markerrenderer.cpp index bab8a8daf..b6a57f4b4 100644 --- a/src/chart/rendering/markerrenderer.cpp +++ b/src/chart/rendering/markerrenderer.cpp @@ -302,7 +302,7 @@ void MarkerRenderer::draw(Gfx::ICanvas &canvas, void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, const AbstractMarker &abstractMarker, - const Text::immutable_string &unit, + const std::string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const { @@ -346,7 +346,7 @@ void MarkerRenderer::drawLabel(Gfx::ICanvas &canvas, std::string MarkerRenderer::getLabelText( const ::Anim::Interpolated &label, - const Text::immutable_string &unit, + const std::string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const { diff --git a/src/chart/rendering/markerrenderer.h b/src/chart/rendering/markerrenderer.h index 9ffd51d80..99b74244a 100644 --- a/src/chart/rendering/markerrenderer.h +++ b/src/chart/rendering/markerrenderer.h @@ -33,7 +33,7 @@ class MarkerRenderer : public DrawingContext bool isLine) const; void drawLabel(Gfx::ICanvas &canvas, const AbstractMarker &abstractMarker, - const Text::immutable_string &unit, + const std::string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const; @@ -41,7 +41,7 @@ class MarkerRenderer : public DrawingContext getSelectedColor(const Gen::Marker &marker, bool label) const; [[nodiscard]] std::string getLabelText( const ::Anim::Interpolated &label, - const Text::immutable_string &unit, + const std::string &unit, bool keepMeasure, ::Anim::InterpolateIndex index) const; }; diff --git a/src/dataframe/impl/aggregators.cpp b/src/dataframe/impl/aggregators.cpp index de04d5639..a455afc50 100644 --- a/src/dataframe/impl/aggregators.cpp +++ b/src/dataframe/impl/aggregators.cpp @@ -19,8 +19,7 @@ inline bool is_valid(cell_reference const &value) { const double *d = std::get_if(&value); return d ? !std::isnan(*d) - : *std::get_if(&value) - != nullptr; + : *std::get_if(&value) != nullptr; } Refl::EnumArray @@ -104,16 +103,15 @@ get_aggregators() noexcept {aggrs[static_cast(aggregator_type::distinct)], []() -> custom_aggregator::id_type { - return std::set{}; + return std::set{}; }, [](custom_aggregator::id_type &id, cell_reference const &cell) -> double { - auto &set = *std::get_if< - std::set>(&id); - if (const Text::immutable_string *v = - *std::get_if( - &cell)) + auto &set = + *std::get_if>(&id); + if (const std::string *v = + *std::get_if(&cell)) set.insert(v); return static_cast(set.size()); }}, diff --git a/src/dataframe/impl/data_source.cpp b/src/dataframe/impl/data_source.cpp index 012ccafbb..13f4fbef4 100644 --- a/src/dataframe/impl/data_source.cpp +++ b/src/dataframe/impl/data_source.cpp @@ -222,7 +222,7 @@ std::size_t data_source::change_series_identifier_type( } std::size_t data_source::change_record_identifier_type( - const Text::immutable_string &id) const + const std::string &id) const { auto it = finalized.to_record_ix.find(id); return it != finalized.to_record_ix.end() ? it->second @@ -321,7 +321,7 @@ void data_source::finalize() } } -const Text::immutable_string &data_source::add_new_dimension( +const std::string &data_source::add_new_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -338,9 +338,8 @@ const Text::immutable_string &data_source::add_new_dimension( return *it; } -const Text::immutable_string &data_source::add_new_dimension( - dimension_t &&dim, - const Text::immutable_string &name) +const std::string &data_source::add_new_dimension(dimension_t &&dim, + const std::string &name) { auto &&it = dimension_names.emplace( std::ranges::lower_bound(dimension_names, name), @@ -366,9 +365,8 @@ data_source::measure_with_name_ref data_source::add_new_measure( return {*it, ref}; } -data_source::measure_with_name_ref data_source::add_new_measure( - measure_t &&mea, - const Text::immutable_string &name) +data_source::measure_with_name_ref +data_source::add_new_measure(measure_t &&mea, const std::string &name) { auto &&it = measure_names.emplace( std::ranges::lower_bound(measure_names, name), @@ -519,8 +517,8 @@ data_source::data_source( } } -Text::immutable_string data_source::get_id(std::size_t record, - std::span series) const +std::string data_source::get_id(std::size_t record, + std::span series) const { std::string res; for (std::size_t ix{}; const auto &name : series) { @@ -531,14 +529,14 @@ Text::immutable_string data_source::get_id(std::size_t record, res += val ? *val : std::string_view{"__null__"}; res += ';'; } - return Text::immutable_string::fromString(res); + return res; } std::vector data_source::dimension_t::get_indices( const dataframe_interface::any_sort_type &sorter) const { thread_local const dataframe_interface::any_sort_type *sorts{}; - thread_local const std::vector *cats{}; + thread_local const std::vector *cats{}; sorts = &sorter; cats = &categories; return data_source::get_sorted_indices(categories.size(), @@ -623,7 +621,7 @@ void data_source::dimension_t::add_more_data( contains_nav = std::any_of(new_values.begin(), new_values.end(), is_nav); } -const Text::immutable_string *data_source::dimension_t::get( +const std::string *data_source::dimension_t::get( std::size_t index) const { return index < values.size() && values[index] != nav @@ -708,12 +706,12 @@ std::pair data_source::measure_t::get_min_max() const return {mini, maxi}; } -std::pair +std::pair data_source::aggregating_type::add_aggregated( const_series_data &&data, const aggregator_type &aggregator) { - Text::immutable_string name; + std::string name; switch (data) { using enum series_type; case dimension: name = unsafe_get(data).first; break; @@ -722,9 +720,8 @@ data_source::aggregating_type::add_aggregated( } if (aggregator != aggregator_type::sum) - name = Text::immutable_string::fromString( - std::string{Refl::enum_name(aggregator)} + '(' + name - + ')'); + name = std::string{Refl::enum_name(aggregator)} + '(' + name + + ')'; auto &&[it, succ] = meas.try_emplace(std::move(name), std::move(data), diff --git a/src/dataframe/impl/data_source.h b/src/dataframe/impl/data_source.h index 8edd7e6d2..185940bbd 100644 --- a/src/dataframe/impl/data_source.h +++ b/src/dataframe/impl/data_source.h @@ -31,7 +31,7 @@ enum class error_type : std::uint8_t { struct series_meta_t { - std::string_view name; + std::string name; series_type type; }; @@ -61,13 +61,10 @@ class data_source : public std::enable_shared_from_this struct dimension_t { - std::vector categories; + std::vector categories; na_position na_pos{na_position::last}; std::vector values; - std::map> - info; + std::map> info; bool contains_nav{}; dimension_t() noexcept = default; @@ -101,8 +98,7 @@ class data_source : public std::enable_shared_from_this void add_element(std::string_view const &cat); - [[nodiscard]] const Text::immutable_string *get( - std::size_t index) const; + [[nodiscard]] const std::string *get(std::size_t index) const; void set(std::size_t index, const std::string_view &value); @@ -116,10 +112,7 @@ class data_source : public std::enable_shared_from_this struct measure_t { std::vector values; - std::map> - info; + std::map> info; bool contains_nan{}; measure_t() noexcept = default; @@ -143,22 +136,19 @@ class data_source : public std::enable_shared_from_this struct final_info { - std::map to_record_ix; - std::vector< - std::reference_wrapper> + std::map to_record_ix; + std::vector> record_ids; }; - Text::immutable_string get_id(std::size_t record, - std::span series) const; + std::string get_id(std::size_t record, + std::span series) const; using series_data = Refl::EnumVariant, + std::pair, dimension_t &>, - std::pair< - std::reference_wrapper, + std::pair, measure_t &>>; using measure_with_name_ref = @@ -167,20 +157,16 @@ class data_source : public std::enable_shared_from_this using const_series_data = Refl::EnumVariant, + std::pair, const dimension_t &>, - std::pair< - std::reference_wrapper, + std::pair, const measure_t &>>; // replace these to std::flat_map - std::vector - measure_names; // sorted by name + std::vector measure_names; // sorted by name std::vector measures; - std::vector - dimension_names; // sorted by name + std::vector dimension_names; // sorted by name std::vector dimensions; final_info finalized; @@ -199,15 +185,15 @@ class data_source : public std::enable_shared_from_this struct aggregating_type { - std::map> dims; - std::map, std::less<>> meas; - std::pair add_aggregated( + std::pair add_aggregated( const_series_data &&data, const aggregator_type &aggregator); }; @@ -233,7 +219,7 @@ class data_source : public std::enable_shared_from_this const std::string_view &name) const; std::size_t change_record_identifier_type( - const Text::immutable_string &id) const; + const std::string &id) const; void normalize_sizes(); @@ -254,14 +240,14 @@ class data_source : public std::enable_shared_from_this void finalize(); - const Text::immutable_string &add_new_dimension( + const std::string &add_new_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, std::span> info); - const Text::immutable_string &add_new_dimension(dimension_t &&dim, - const Text::immutable_string &name); + const std::string &add_new_dimension(dimension_t &&dim, + const std::string &name); measure_with_name_ref add_new_measure( std::span measure_values, @@ -269,7 +255,7 @@ class data_source : public std::enable_shared_from_this std::span> info); measure_with_name_ref add_new_measure(measure_t &&measure, - const Text::immutable_string &name); + const std::string &name); static std::vector get_sorted_indices( std::size_t max, diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index 5be2c6327..b37ce327e 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -120,8 +120,7 @@ void valid_measure_aggregator( error(error_type::aggregator, "measure"); } -Text::immutable_string dataframe::set_aggregate( - const Text::immutable_string &series, +std::string dataframe::set_aggregate(const std::string &series, const any_aggregator_type &aggregator) & { change_state_to(state_type::aggregating, @@ -156,7 +155,7 @@ Text::immutable_string dataframe::set_aggregate( return name; } -void dataframe::set_sort(const Text::immutable_string &series, +void dataframe::set_sort(const std::string &series, any_sort_type sort, na_position na_pos) & { @@ -211,7 +210,7 @@ void dataframe::set_custom_sort( error(error_type::unimplemented, "cus sort"); } -const Text::immutable_string &dataframe::add_dimension( +const std::string &dataframe::add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -284,7 +283,7 @@ const Text::immutable_string &dataframe::add_dimension( } } -const Text::immutable_string &dataframe::add_measure( +const std::string &dataframe::add_measure( std::span measure_values, std::string_view name, adding_type adding_strategy, @@ -351,14 +350,13 @@ const Text::immutable_string &dataframe::add_measure( } } -const Text::immutable_string &dataframe::add_series_by_other( - std::string_view, +const std::string &dataframe::add_series_by_other(std::string_view, std::string_view, const std::function &, std::span>) & { if (as_if()) error(error_type::unimplemented, "by oth"); - thread_local const Text::immutable_string s{}; + thread_local const std::string s{}; return s; } @@ -682,19 +680,17 @@ std::string dataframe::as_string() const & return res; } -std::span -dataframe::get_dimensions() const & +std::span dataframe::get_dimensions() const & { return get_data_source().dimension_names; } -std::span -dataframe::get_measures() const & +std::span dataframe::get_measures() const & { return get_data_source().measure_names; } -std::span dataframe::get_categories( +std::span dataframe::get_categories( const std::string_view &dimension) const & { switch (auto &&ser = get_data_source().get_series(dimension)) { @@ -732,22 +728,19 @@ bool dataframe::is_removed(std::size_t record_id) const & return cp && cp->pre_remove && (*cp->pre_remove)[record_id]; } -Text::immutable_string dataframe::get_record_id_by_dims( - std::size_t my_record, - std::span dimensions) const & +std::string dataframe::get_record_id_by_dims(std::size_t my_record, + std::span dimensions) const & { return get_data_source().get_id(my_record, dimensions); } -Text::immutable_string dataframe::get_record_id( - std::size_t my_record) & +std::string dataframe::get_record_id(std::size_t my_record) & { if (state_data != state_type::finalized) error(error_type::record, "get id before finalized"); const auto &ids = get_data_source().finalized.record_ids; - return my_record < ids.size() ? ids[my_record] - : Text::immutable_string{}; + return my_record < ids.size() ? ids[my_record] : std::string{}; } series_meta_t dataframe::get_series_meta(const std::string &id) const @@ -878,8 +871,7 @@ const data_source &dataframe::get_data_source() const : *unsafe_get(source).other; } -Text::immutable_string dataframe::get_series_info( - const Text::immutable_string &id, +std::string dataframe::get_series_info(const std::string &id, const char *key) const & { switch (auto &&ser = get_data_source().get_series(id)) { @@ -888,14 +880,12 @@ Text::immutable_string dataframe::get_series_info( case measure: { const auto &info = unsafe_get(ser).second.info; auto it = info.find(key); - return it == info.end() ? Text::immutable_string{} - : it->second; + return it == info.end() ? std::string{} : it->second; } case dimension: { const auto &info = unsafe_get(ser).second.info; auto it = info.find(key); - return it == info.end() ? Text::immutable_string{} - : it->second; + return it == info.end() ? std::string{} : it->second; } } } diff --git a/src/dataframe/impl/dataframe.h b/src/dataframe/impl/dataframe.h index 1c7b3edc5..d330c6f2e 100644 --- a/src/dataframe/impl/dataframe.h +++ b/src/dataframe/impl/dataframe.h @@ -53,11 +53,10 @@ class dataframe [[nodiscard]] static std::shared_ptr create_new(); - [[nodiscard]] Text::immutable_string set_aggregate( - const Text::immutable_string &series, + [[nodiscard]] std::string set_aggregate(const std::string &series, const any_aggregator_type &aggregator) &; - void set_sort(const Text::immutable_string &series, + void set_sort(const std::string &series, any_sort_type sort, na_position na_pos) &; @@ -65,7 +64,7 @@ class dataframe const std::function &custom_sort) &; - const Text::immutable_string &add_dimension( + const std::string &add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -73,14 +72,14 @@ class dataframe std::span> info) &; - const Text::immutable_string &add_measure( + const std::string &add_measure( std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) &; - const Text::immutable_string &add_series_by_other( + const std::string &add_series_by_other( std::string_view curr_series, std::string_view name, const std::function @@ -111,20 +110,18 @@ class dataframe [[nodiscard]] std::string as_string() const &; - [[nodiscard]] std::span + [[nodiscard]] std::span get_dimensions() const &; - [[nodiscard]] std::span - get_measures() const &; + [[nodiscard]] std::span get_measures() const &; - [[nodiscard]] std::span - get_categories(const std::string_view &dimension) const &; + [[nodiscard]] std::span get_categories( + const std::string_view &dimension) const &; [[nodiscard]] series_meta_t get_series_meta( const std::string &id) const; - [[nodiscard]] Text::immutable_string get_series_info( - const Text::immutable_string &id, + [[nodiscard]] std::string get_series_info(const std::string &id, const char *key) const &; [[nodiscard]] cell_reference get_data( @@ -138,12 +135,11 @@ class dataframe [[nodiscard]] bool is_removed(std::size_t record_id) const &; - [[nodiscard]] Text::immutable_string get_record_id_by_dims( + [[nodiscard]] std::string get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const &; + std::span dimensions) const &; - [[nodiscard]] Text::immutable_string get_record_id( - std::size_t my_record) &; + [[nodiscard]] std::string get_record_id(std::size_t my_record) &; private: void migrate_data(); diff --git a/src/dataframe/interface.cpp b/src/dataframe/interface.cpp index ef4c13550..2d07426a0 100644 --- a/src/dataframe/interface.cpp +++ b/src/dataframe/interface.cpp @@ -11,7 +11,6 @@ #include #include -#include "base/text/immutable_string.h" #include "impl/dataframe.h" namespace Vizzu::dataframe @@ -42,15 +41,14 @@ std::shared_ptr dataframe_interface::copy( return as_impl(this).copy(inherit_sorting); } -Text::immutable_string dataframe_interface::set_aggregate( - const Text::immutable_string &series, +std::string dataframe_interface::set_aggregate( + const std::string &series, const any_aggregator_type &aggregator) & { return as_impl(this).set_aggregate(series, aggregator); } -void dataframe_interface::set_sort( - const Text::immutable_string &series, +void dataframe_interface::set_sort(const std::string &series, any_sort_type sort, na_position na_pos) & { @@ -64,7 +62,7 @@ void dataframe_interface::set_custom_sort( as_impl(this).set_custom_sort(custom_sort); } -const Text::immutable_string &dataframe_interface::add_dimension( +const std::string &dataframe_interface::add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -78,7 +76,7 @@ const Text::immutable_string &dataframe_interface::add_dimension( info); } -const Text::immutable_string &dataframe_interface::add_measure( +const std::string &dataframe_interface::add_measure( std::span measure_values, std::string_view name, adding_type adding_strategy, @@ -90,8 +88,8 @@ const Text::immutable_string &dataframe_interface::add_measure( info); } -const Text::immutable_string & -dataframe_interface::add_series_by_other(std::string_view curr_series, +const std::string &dataframe_interface::add_series_by_other( + std::string_view curr_series, std::string_view name, const std::function &value_transform, @@ -148,20 +146,19 @@ void dataframe_interface::fill_na(std::string_view column, void dataframe_interface::finalize() & { as_impl(this).finalize(); } -std::span +std::span dataframe_interface::get_dimensions() const & { return as_impl(this).get_dimensions(); } -std::span +std::span dataframe_interface::get_measures() const & { return as_impl(this).get_measures(); } -std::span -dataframe_interface::get_categories( +std::span dataframe_interface::get_categories( const std::string_view &dimension) const & { return as_impl(this).get_categories(dimension); @@ -179,8 +176,8 @@ std::size_t dataframe_interface::get_record_count() const & return as_impl(this).get_record_count(); } -Text::immutable_string dataframe_interface::get_series_info( - const Text::immutable_string &id, +std::string dataframe_interface::get_series_info( + const std::string &id, const char *key) const & { return as_impl(this).get_series_info(id, key); @@ -191,14 +188,14 @@ bool dataframe_interface::is_removed(std::size_t record_id) const & return as_impl(this).is_removed(record_id); } -Text::immutable_string dataframe_interface::get_record_id_by_dims( +std::string dataframe_interface::get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const & + std::span dimensions) const & { return as_impl(this).get_record_id_by_dims(my_record, dimensions); } -Text::immutable_string dataframe_interface::get_record_id( +std::string dataframe_interface::get_record_id( std::size_t my_record) & { return as_impl(this).get_record_id(my_record); diff --git a/src/dataframe/interface.h b/src/dataframe/interface.h index c38923fb3..386a1171e 100644 --- a/src/dataframe/interface.h +++ b/src/dataframe/interface.h @@ -10,8 +10,6 @@ #include #include -#include "base/text/immutable_string.h" - namespace Vizzu::Data { struct RowWrapper; @@ -21,8 +19,7 @@ namespace Vizzu::dataframe { using cell_value = std::variant; -using cell_reference = - std::variant; +using cell_reference = std::variant; enum class aggregator_type : std::uint8_t { sum, @@ -54,10 +51,10 @@ enum class adding_type : std::uint8_t { struct custom_aggregator { - std::variant name; + std::variant name; using id_type = std::variant, - std::set>; + std::set>; id_type (*create)(); double (*add)(id_type &, cell_reference const &); @@ -78,8 +75,7 @@ constexpr std::size_t max_size_impl = 26 * sizeof(std::intptr_t); class alignas(align_impl) dataframe_interface { public: - using record_identifier = - std::variant; + using record_identifier = std::variant; using any_aggregator_type = std::optional; @@ -90,16 +86,15 @@ class alignas(align_impl) dataframe_interface [[nodiscard]] std::shared_ptr copy( bool inherit_sorting) const &; - Text::immutable_string set_aggregate( - const Text::immutable_string &series, + std::string set_aggregate(const std::string &series, const any_aggregator_type &aggregator) &; - void aggregate_by(const Text::immutable_string &series) + void aggregate_by(const std::string &series) { set_aggregate(series, {}); } - void set_sort(const Text::immutable_string &series, + void set_sort(const std::string &series, any_sort_type sort, na_position na_pos) &; @@ -107,7 +102,7 @@ class alignas(align_impl) dataframe_interface const std::function &custom_sort) &; - const Text::immutable_string &add_dimension( + const std::string &add_dimension( std::span dimension_categories, std::span dimension_values, std::string_view name, @@ -115,14 +110,14 @@ class alignas(align_impl) dataframe_interface std::span> info) &; - const Text::immutable_string &add_measure( + const std::string &add_measure( std::span measure_values, std::string_view name, adding_type adding_strategy, std::span> info) &; - const Text::immutable_string &add_series_by_other( + const std::string &add_series_by_other( std::string_view curr_series, std::string_view name, const std::function @@ -149,14 +144,13 @@ class alignas(align_impl) dataframe_interface void finalize() &; - [[nodiscard]] std::span + [[nodiscard]] std::span get_dimensions() const &; - [[nodiscard]] std::span - get_measures() const &; + [[nodiscard]] std::span get_measures() const &; - [[nodiscard]] std::span - get_categories(const std::string_view &dimension) const &; + [[nodiscard]] std::span get_categories( + const std::string_view &dimension) const &; [[nodiscard]] cell_reference get_data( const record_identifier &record_id, @@ -164,18 +158,16 @@ class alignas(align_impl) dataframe_interface [[nodiscard]] std::size_t get_record_count() const &; - [[nodiscard]] Text::immutable_string get_series_info( - const Text::immutable_string &id, + [[nodiscard]] std::string get_series_info(const std::string &id, const char *key) const &; [[nodiscard]] bool is_removed(std::size_t record_id) const &; - [[nodiscard]] Text::immutable_string get_record_id_by_dims( + [[nodiscard]] std::string get_record_id_by_dims( std::size_t my_record, - std::span dimensions) const &; + std::span dimensions) const &; - [[nodiscard]] Text::immutable_string get_record_id( - std::size_t my_record) &; + [[nodiscard]] std::string get_record_id(std::size_t my_record) &; // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) alignas(align_impl) std::byte data[max_size_impl]; diff --git a/src/dataframe/old/datatable.cpp b/src/dataframe/old/datatable.cpp index 1bfff7e7d..2b5f98827 100644 --- a/src/dataframe/old/datatable.cpp +++ b/src/dataframe/old/datatable.cpp @@ -102,9 +102,8 @@ void DataCube::check(iterator_t &it) const it.index.marker_id = df->get_record_id(it.index.rid); for (auto &&[dim, cats, size, ix] : dim_reindex) { - const auto *str_ptr = - std::get( - df->get_data(it.index.rid, dim)); + const auto *str_ptr = std::get( + df->get_data(it.index.rid, dim)); it.index.old[ix] = str_ptr == nullptr ? cats.size() : str_ptr - cats.data(); @@ -224,15 +223,13 @@ bool DataCube::empty() const return df->get_measures().empty() && df->get_dimensions().empty(); } -Text::immutable_string DataCube::getName( - const SeriesIndex &seriesId) const +std::string DataCube::getName(const SeriesIndex &seriesId) const { return measure_names.at( {seriesId.getColIndex(), seriesId.getAggr()}); } -Text::immutable_string DataTable::getUnit( - Text::immutable_string const &colIx) const +std::string DataTable::getUnit(std::string const &colIx) const { return df.get_series_info(colIx, "unit"); } @@ -252,7 +249,7 @@ MarkerId DataCube::getId( if (v[*comm] = {oldIx, size}; *comm == ll) res.label.emplace(name, oldIx < cats.size() ? cats[oldIx] - : Text::immutable_string{}); + : std::string{}); } else res.seriesId = res.seriesId * size + oldIx; @@ -268,14 +265,13 @@ std::string DataCube::joinDimensionValues(const SeriesList &sl, const MultiIndex &index) const { std::string res; - std::vector resColl(sl.size()); + std::vector resColl(sl.size()); for (auto &&[val, comm] : dim_reindex.iterate_common(sl)) if (comm) { auto &&[name, cats, size, ix] = val; auto &&oldIx = index.old[ix]; - resColl[*comm] = oldIx < cats.size() - ? cats[oldIx] - : Text::immutable_string{}; + resColl[*comm] = + oldIx < cats.size() ? cats[oldIx] : std::string{}; } for (auto &&sv : resColl) { @@ -298,8 +294,7 @@ DataCube::cellInfo(const MultiIndex &index, bool needMarkerInfo) const for (Conv::JSONObj &&dims{obj.nested("categories")}; auto &&[name, cats, size, ix] : dim_reindex) { auto &&cix = index.old[ix]; - auto &&cat = - cix < cats.size() ? cats[cix] : Text::immutable_string{}; + auto &&cat = cix < cats.size() ? cats[cix] : std::string{}; dims.key(name).primitive(cat); if (needMarkerInfo) my_res->markerInfo.emplace_back(name, cat); diff --git a/src/dataframe/old/datatable.h b/src/dataframe/old/datatable.h index 1deb208b1..31238fd67 100644 --- a/src/dataframe/old/datatable.h +++ b/src/dataframe/old/datatable.h @@ -35,8 +35,7 @@ class DataTable void pushRow(const std::span &cells); - [[nodiscard]] Text::immutable_string getUnit( - Text::immutable_string const &colIx) const; + [[nodiscard]] std::string getUnit(std::string const &colIx) const; [[nodiscard]] std::string getInfos() const; @@ -55,15 +54,14 @@ class DataCube public: std::shared_ptr df; - std::map< - std::pair, - Text::immutable_string> + std::map, + std::string> measure_names; struct DimensionInfo { - Text::immutable_string name; - std::span categories; + std::string name; + std::span categories; std::size_t size{}; std::size_t ix{}; @@ -115,7 +113,7 @@ class DataCube const SeriesList &sl, const MultiIndex &index) const; - [[nodiscard]] Text::immutable_string getName( + [[nodiscard]] std::string getName( const SeriesIndex &seriesId) const; [[nodiscard]] iterator_t begin() const; diff --git a/src/dataframe/old/types.h b/src/dataframe/old/types.h index f53314e0f..5ee4b19e9 100644 --- a/src/dataframe/old/types.h +++ b/src/dataframe/old/types.h @@ -5,7 +5,6 @@ #include #include "../interface.h" -#include "base/text/immutable_string.h" #include "base/type/uniquelist.h" namespace Vizzu::dataframe @@ -33,7 +32,7 @@ struct RowWrapper class SeriesIndex { - std::string_view name{}; + std::string name{}; std::optional aggregator; explicit SeriesIndex(dataframe::series_meta_t const &meta); @@ -49,7 +48,7 @@ class SeriesIndex return *aggregator; } - [[nodiscard]] const Text::immutable_string &getColIndex() const + [[nodiscard]] const std::string &getColIndex() const { return name; } @@ -120,8 +119,8 @@ class Filter struct SliceIndex { - Text::immutable_string column; - Text::immutable_string value; + std::string column; + std::string value; [[nodiscard]] bool operator<(const SliceIndex &rhs) const { @@ -134,9 +133,7 @@ struct SliceIndex struct CellInfo { - std::vector< - std::pair> - markerInfo; + std::vector> markerInfo; std::string json; }; @@ -145,7 +142,7 @@ struct MultiIndex { std::size_t rid; std::vector old; - Text::immutable_string marker_id; + std::string marker_id; }; struct MarkerId diff --git a/test/qtest/chart.cpp b/test/qtest/chart.cpp index 99691e335..80fcfedb8 100644 --- a/test/qtest/chart.cpp +++ b/test/qtest/chart.cpp @@ -146,21 +146,21 @@ void TestChart::run() IO::log() << "step 1b"; auto &options = chart.getChart().getOptions(); auto &styles = chart.getChart().getStyles(); - options.dataFilter = Vizzu::Data::Filter{std::unique_ptr< - bool(const Vizzu::Data::RowWrapper *), - void (*)(bool(const Vizzu::Data::RowWrapper *))>{ - +[](const Vizzu::Data::RowWrapper *row) -> bool - { - return *std::get( - row->get_value("Cat1")) - == std::string_view{"A"} - || *std::get( - row->get_value("Cat2")) - == std::string_view{"b"}; - }, - +[](bool(const Vizzu::Data::RowWrapper *)) - { - }}}; + options.dataFilter = Vizzu::Data::Filter{ + std::unique_ptr{ + +[](const Vizzu::Data::RowWrapper *row) -> bool + { + return *std::get( + row->get_value("Cat1")) + == std::string_view{"A"} + || *std::get( + row->get_value("Cat2")) + == std::string_view{"b"}; + }, + +[](bool(const Vizzu::Data::RowWrapper *)) + { + }}}; options.title = "VIZZU Chart - Phase 1b"; styles.legend.marker.type = Vizzu::Styles::Legend::Marker::Type::circle; diff --git a/test/unit/dataframe/interface_test.cpp b/test/unit/dataframe/interface_test.cpp index c1db8e7e1..588a4c279 100644 --- a/test/unit/dataframe/interface_test.cpp +++ b/test/unit/dataframe/interface_test.cpp @@ -13,7 +13,7 @@ using record_type = interface::record_type; bool operator==(const cell_reference &ref, const std::string_view &str) { - return *std::get(ref) == str; + return *std::get(ref) == str; } #include "../util/test.h" @@ -62,9 +62,8 @@ struct if_setup for (auto r = 0u; r < data.size(); ++r) { for (auto d = 0u; d < ds; ++d) { - auto gdata = - std::get( - df->get_data(r, dims[d])); + auto gdata = std::get( + df->get_data(r, dims[d])); const auto *ptr = data[r][d]; if (ptr) { assert->*gdata != nullptr; @@ -213,14 +212,10 @@ const static auto tests = [](cell_reference const &cell, std::string &&prefix) { auto str = prefix + " is a string"; - assert - ->*std::holds_alternative< - const Text::immutable_string *>(cell) + assert->*std::holds_alternative(cell) == bool_msg{str}; str = prefix + " is nav"; - check - ->*(std::get(cell) - == nullptr) + check->*(std::get(cell) == nullptr) == bool_msg{str}; }; @@ -245,7 +240,7 @@ const static auto tests = check_nav(df->get_data(std::size_t{3}, "d1"), "table_33"); check - ->*(std::get( + ->*(std::get( df->get_data(std::size_t{0}, "d1")) == df->get_categories("d1").data()) == "Not points to the same memory address"_is_true;