From bbbc5238e656e889b13c997566ff6cb833ae195d Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 30 Jan 2025 14:58:03 +0100 Subject: [PATCH 1/5] review_1 --- src/apps/weblib/typeschema-api/config.yaml | 9 +++----- src/chart/options/channels.cpp | 24 +++++++++++----------- src/chart/options/channels.h | 15 +++++++++++--- src/chart/options/options.h | 4 ++-- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/apps/weblib/typeschema-api/config.yaml b/src/apps/weblib/typeschema-api/config.yaml index 03e9ebcc3..6a6753e01 100644 --- a/src/apps/weblib/typeschema-api/config.yaml +++ b/src/apps/weblib/typeschema-api/config.yaml @@ -78,6 +78,7 @@ definitions: - { type: string, enum: [auto] } AxisChannel: + $extends: Channel description: | AxisChannels are special channel settings for the positional channels. type: object @@ -135,18 +136,14 @@ definitions: type: object properties: x: - allOf: - - $ref: Channel - - $ref: AxisChannel + $ref: AxisChannel description: | Parameters for the X-axis, determining the position of the markers on the x-axis - or their angle when using polar coordinates. Note: leaving x and y channels empty will result in a chart "without coordinates" like a Treemap or a Bubble Chart. y: - allOf: - - $ref: Channel - - $ref: AxisChannel + $ref: AxisChannel description: | Parameters for the Y-axis, determining the position of the markers on the y-axis - or their radius when using polar coordinates) . diff --git a/src/chart/options/channels.cpp b/src/chart/options/channels.cpp index 6d039968f..1220ed2b6 100644 --- a/src/chart/options/channels.cpp +++ b/src/chart/options/channels.cpp @@ -17,7 +17,7 @@ bool Channels::anyAxisSet() const bool Channels::isEmpty() const { - return std::ranges::all_of(*this, + return std::ranges::all_of(genProps, [](const auto &channel) { return channel.isEmpty(); @@ -28,7 +28,7 @@ Channels::IndexSet Channels::getDimensions() const { IndexSet dimensions; - for (const auto &channel : *this) + for (const auto &channel : genProps) channel.collectDimensions(dimensions); return dimensions; @@ -38,7 +38,7 @@ Channels::IndexSet Channels::getMeasures() const { IndexSet series; - for (const auto &channel : *this) + for (const auto &channel : genProps) if (auto &&mid = channel.measure()) series.insert(*mid); return series; @@ -57,12 +57,12 @@ Channels::IndexSet Channels::getDimensions( void Channels::removeSeries(const Data::SeriesIndex &index) { - for (auto &channel : *this) channel.removeSeries(index); + for (auto &channel : genProps) channel.removeSeries(index); } bool Channels::isSeriesUsed(const Data::SeriesIndex &index) const { - return std::ranges::any_of(*this, + return std::ranges::any_of(genProps, [&](const auto &channel) { return channel.isSeriesUsed(index); @@ -71,23 +71,23 @@ bool Channels::isSeriesUsed(const Data::SeriesIndex &index) const void Channels::reset() { - for (auto &channel : *this) channel.reset(); + for (auto &channel : genProps) channel.reset(); } Channels Channels::shadow() const { - Channels shadow = *this; + Channels shadow{*this}; - shadow[ChannelId::color].reset(); - shadow[ChannelId::lightness].reset(); - shadow[ChannelId::label].reset(); - shadow[ChannelId::noop].reset(); + shadow.genProps[ChannelId::color].reset(); + shadow.genProps[ChannelId::lightness].reset(); + shadow.genProps[ChannelId::label].reset(); + shadow.genProps[ChannelId::noop].reset(); for (auto &&attr : getDimensions({{ChannelId::color, ChannelId::lightness, ChannelId::label, ChannelId::noop}})) - shadow[ChannelId::noop].addSeries(attr); + shadow.genProps[ChannelId::noop].addSeries(attr); return shadow; } diff --git a/src/chart/options/channels.h b/src/chart/options/channels.h index 4510a0bfe..8bf5a278a 100644 --- a/src/chart/options/channels.h +++ b/src/chart/options/channels.h @@ -12,10 +12,11 @@ namespace Vizzu::Gen { -struct Channels : Refl::EnumArray +struct Channels { using IndexSet = std::set; - EnumArray axisProps; + Refl::EnumArray genProps; + Refl::EnumArray axisProps; [[nodiscard]] bool anyAxisSet() const; [[nodiscard]] bool isEmpty() const; @@ -25,7 +26,15 @@ struct Channels : Refl::EnumArray [[nodiscard]] IndexSet getDimensions( const std::span &channelTypes) const; - using EnumArray::at; + [[nodiscard]] constexpr Channel &at(ChannelId value) + { + return genProps.at(value); + } + + [[nodiscard]] constexpr const Channel &at(ChannelId value) const + { + return genProps.at(value); + } template [[nodiscard]] const Channel &at(const T &id) const diff --git a/src/chart/options/options.h b/src/chart/options/options.h index 921f09c0d..f300f7b9c 100644 --- a/src/chart/options/options.h +++ b/src/chart/options/options.h @@ -185,8 +185,8 @@ class Options : public OptionProperties {{Channel::makeChannel( static_cast(Ix))...}}, {}}; - }(std::make_index_sequence< - std::tuple_size_v>{})}; + }(std::make_index_sequence())>())}; [[nodiscard]] Geom::Orientation getAutoOrientation() const; [[nodiscard]] std::optional getAutoLegend() const; From 510c08c7af21cd6990ca5fe6bf4a18b6b4c0b460 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Thu, 30 Jan 2025 16:27:11 +0100 Subject: [PATCH 2/5] nan on empty string --- CHANGELOG.md | 1 + src/dataframe/impl/dataframe.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8f5f732..4cc6b5a58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Waterfall chart preset not aligned. - Split chart count negative values too. - Split chart handled when same dimension on main and sub axis. +- Add record didn't handle when a measure got an empty string. ### Changed diff --git a/src/dataframe/impl/dataframe.cpp b/src/dataframe/impl/dataframe.cpp index c321a9310..d8392028a 100644 --- a/src/dataframe/impl/dataframe.cpp +++ b/src/dataframe/impl/dataframe.cpp @@ -393,7 +393,8 @@ void dataframe::add_record(std::span values) & auto &s = *unsafe_get(source); s.normalize_sizes(); - std::vector measures(s.measure_names.size()); + std::vector measures(s.measure_names.size(), + std::numeric_limits::quiet_NaN()); std::vector dimensions( s.dimension_names.size()); for (const auto *it = values.data(); const auto &col : *vec) { @@ -407,8 +408,10 @@ void dataframe::add_record(std::span values) & break; case measure: char *eof{}; - measures[&unsafe_get(ser).second - - s.measures.data()] = std::strtod(*it, &eof); + if (**it != '\0') + measures[&unsafe_get(ser).second + - s.measures.data()] = + std::strtod(*it, &eof); if (eof == *it) error(error_type::nan, *it); break; } From a4b532b84ad754d721269169a24d37d10f7ad7b5 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Mon, 3 Feb 2025 12:28:59 +0100 Subject: [PATCH 3/5] Fix fontparent setter bug --- CHANGELOG.md | 1 + src/chart/animator/keyframe.cpp | 2 ++ src/chart/generator/plot.cpp | 4 +++- src/chart/main/chart.cpp | 5 ++++- src/chart/main/style.cpp | 2 +- src/chart/main/style.h | 2 +- src/chart/main/stylesheet.cpp | 2 +- src/chart/main/stylesheet.h | 7 ++++++- 8 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cc6b5a58..6ab82ff5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Split chart count negative values too. - Split chart handled when same dimension on main and sub axis. - Add record didn't handle when a measure got an empty string. +- Fix no fontparent set bug. ### Changed diff --git a/src/chart/animator/keyframe.cpp b/src/chart/animator/keyframe.cpp index 182a52fe6..89c24dca6 100644 --- a/src/chart/animator/keyframe.cpp +++ b/src/chart/animator/keyframe.cpp @@ -71,6 +71,7 @@ void Keyframe::prepareActual() prepareActualMarkersInfo(); actual = std::make_shared(*source); + actual->getStyle().setup(); actual->detachOptions(); } @@ -92,6 +93,7 @@ void Keyframe::copyTarget() if (!targetCopy) { targetCopy = target; target = std::make_shared(*targetCopy); + target->getStyle().setup(); target->detachOptions(); } } diff --git a/src/chart/generator/plot.cpp b/src/chart/generator/plot.cpp index 02e78ec8c..dd9d0b9e1 100644 --- a/src/chart/generator/plot.cpp +++ b/src/chart/generator/plot.cpp @@ -58,7 +58,9 @@ Plot::Plot(PlotOptionsPtr opts, Styles::Chart style) : guides(*opts), options(std::move(opts)), style(std::move(style)) -{} +{ + this->style.setup(); +} void Plot::detachOptions() { diff --git a/src/chart/main/chart.cpp b/src/chart/main/chart.cpp index 054b52294..c0f80a5a4 100644 --- a/src/chart/main/chart.cpp +++ b/src/chart/main/chart.cpp @@ -29,6 +29,7 @@ Chart::Chart() : *events.animation.begin, *events.animation.complete) { + computedStyles.setup(); animator.onDraw.attach( [this](const Gen::PlotPtr &actPlot) { @@ -72,8 +73,9 @@ void Chart::animate(Anim::Animation::OnComplete &&onComplete) } else { *nextOptions = prevOptions; - actStyles = prevStyles; + setStyles(prevStyles); computedStyles = plot->getStyle(); + computedStyles.setup(); } }); @@ -132,6 +134,7 @@ Gen::PlotPtr Chart::plot(const Gen::PlotOptionsPtr &options) Styles::Sheet::setAfterStyles(*res, layout.boundary.size); computedStyles = res->getStyle(); + computedStyles.setup(); return res; } diff --git a/src/chart/main/style.cpp b/src/chart/main/style.cpp index 867a1d59e..1eae86419 100644 --- a/src/chart/main/style.cpp +++ b/src/chart/main/style.cpp @@ -584,7 +584,7 @@ struct FontParentSetter {} }; -void Chart::setup() +void Chart::setup() & { Refl::visit(FontParentSetter{this}, *this); fontParent = &getDefaultFont(); diff --git a/src/chart/main/style.h b/src/chart/main/style.h index 0cee95b4c..6c0a85489 100644 --- a/src/chart/main/style.h +++ b/src/chart/main/style.h @@ -401,7 +401,7 @@ struct Chart : Padding, Box, Font, ChartParams static const Gfx::ColorPalette &getDefaultColorPalette(); static Chart def(); - void setup(); + void setup() &; }; } diff --git a/src/chart/main/stylesheet.cpp b/src/chart/main/stylesheet.cpp index d1d4abf14..7f16932e6 100644 --- a/src/chart/main/stylesheet.cpp +++ b/src/chart/main/stylesheet.cpp @@ -51,6 +51,7 @@ Chart Sheet::getFullParams(const Gen::PlotOptionsPtr &options, void Sheet::calcDefaults(const Geom::Size &size) { defaultParams = Chart::def(); + defaultParams.setup(); defaultParams.fontSize = Gfx::Length{baseFontSize(size, true)}; @@ -219,7 +220,6 @@ void Sheet::setData() void Sheet::setAfterStyles(Gen::Plot &plot, const Geom::Size &size) { auto &style = plot.getStyle(); - style.setup(); if (auto &xLabel = style.plot diff --git a/src/chart/main/stylesheet.h b/src/chart/main/stylesheet.h index cc19cfdae..4b1931ac8 100644 --- a/src/chart/main/stylesheet.h +++ b/src/chart/main/stylesheet.h @@ -27,7 +27,12 @@ class Sheet : public Style::Sheet { public: using Base = Style::Sheet; - using Base::Sheet; + + Sheet(Chart &&defaultParams, Chart &activeParams) : + Base(std::move(defaultParams), activeParams) + { + this->defaultParams.setup(); + } Chart getFullParams(const Gen::PlotOptionsPtr &options, const Geom::Size &size); From bacf9ded898e5ee6367d5f347d1c9ddea5ee1f3b Mon Sep 17 00:00:00 2001 From: David Vegh Date: Mon, 3 Feb 2025 14:54:04 +0100 Subject: [PATCH 4/5] fix docker trigger --- .github/workflows/docker-vizzu-dev-desktop.yml | 2 +- .github/workflows/docker-vizzu-dev-wasm.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-vizzu-dev-desktop.yml b/.github/workflows/docker-vizzu-dev-desktop.yml index f1d764790..39936e6d8 100644 --- a/.github/workflows/docker-vizzu-dev-desktop.yml +++ b/.github/workflows/docker-vizzu-dev-desktop.yml @@ -1,7 +1,7 @@ name: Docker publish vizzu-dev-desktop on: - push: + pull_request: branches-ignore: - main paths: diff --git a/.github/workflows/docker-vizzu-dev-wasm.yml b/.github/workflows/docker-vizzu-dev-wasm.yml index 6ca6b230a..bbd22337a 100644 --- a/.github/workflows/docker-vizzu-dev-wasm.yml +++ b/.github/workflows/docker-vizzu-dev-wasm.yml @@ -1,7 +1,7 @@ name: Docker publish vizzu-dev-wasm on: - push: + pull_request: branches-ignore: - main paths: From 5ff78831324641feb617fcb4c86c7c8242d6d003 Mon Sep 17 00:00:00 2001 From: Bela Schaum Date: Tue, 4 Feb 2025 13:31:05 +0100 Subject: [PATCH 5/5] fix changelog + merge conflict --- CHANGELOG.md | 4 ++-- src/chart/generator/plotbuilder.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7537bee3..50885e7cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,8 @@ ### Added -- Separate Channel properties to AxisChannel properties at config. -- Move split align sort and reverse to AxisChannel +- Separate AxisChannel properties from Channel properties at config. +- Move split align sort and reverse from config to AxisChannel config. - Add new sorting strategy: 'byLabel'. - Enable split and align on mainAxis. diff --git a/src/chart/generator/plotbuilder.cpp b/src/chart/generator/plotbuilder.cpp index 49f737534..5657f4186 100644 --- a/src/chart/generator/plotbuilder.cpp +++ b/src/chart/generator/plotbuilder.cpp @@ -187,7 +187,7 @@ std::vector PlotBuilder::sortedBuckets( break; case Sort::byLabel: std::ranges::stable_sort(sorted, - [](const BucketInfo &lhs, const BucketInfo &rhs) + [](const BucketSortInfo &lhs, const BucketSortInfo &rhs) { if (rhs.label == nullptr || lhs.label == nullptr) return lhs.label != nullptr;