77
88#include " base/geom/rect.h"
99
10+ #include " sizedependentlayout.h"
1011#include " specmarker.h"
1112
1213namespace Vizzu ::Charts
@@ -16,54 +17,36 @@ class TreeMap
1617{
1718public:
1819 explicit TreeMap (const std::vector<double > &sizes,
19- const Geom::Point &p0 = Geom::Point{0 , 1 },
20- const Geom::Point &p1 = Geom::Point{1 , 0 });
20+ const SpecMarker *parent = nullptr );
2121
22- template <typename Hierarchy>
23- static void setupVector (const Hierarchy &hierarchy);
22+ std::vector<SpecMarker> markers;
2423
2524private:
2625 using It = std::vector<SpecMarker>::iterator;
2726
28- std::vector<SpecMarker> markers;
29-
3027 static void divide (It begin,
3128 It end,
3229 const Geom::Point &p0,
3330 const Geom::Point &p1,
3431 bool horizontal = true );
3532};
3633
37- template <typename Hierarchy>
38- void TreeMap::setupVector (const Hierarchy &hierarchy)
34+ struct TreeMapBuilder : SizeDependentLayout<TreeMap>
3935{
40- if (hierarchy.empty ()) return ;
41-
42- std::vector<double > sizes (hierarchy.size ());
43- for (std::size_t ix{}; const auto &level : hierarchy)
44- for (auto &sum = sizes[ix++]; const auto &item : level)
45- if (auto &&size = item->sizeFactor ;
46- std::isfinite (size) && size > 0 )
47- sum += size;
48-
49- TreeMap chart (sizes);
50-
51- std::vector<double > in_sizes (hierarchy.inner_size ());
52- for (std::size_t cnt{}; const auto &level : hierarchy) {
53- auto &&[pos, size] = chart.markers [cnt++].rect ();
54-
55- for (std::size_t ix{}; const auto &item : level)
56- in_sizes[ix++] = item->sizeFactor ;
57-
58- TreeMap subChart (in_sizes, pos, pos + size);
36+ template <typename Hierarchy>
37+ static void setupVector (const Hierarchy &hierarchy);
38+ };
5939
60- for (size_t subCnt{}; const auto &item : level) {
61- auto &&[spos, ssize] =
62- subChart.markers [subCnt++].rect ().positive ();
63- item->position = spos + ssize;
64- item->size = ssize;
65- }
66- }
40+ template <typename Hierarchy>
41+ void TreeMapBuilder::setupVector (const Hierarchy &hierarchy)
42+ {
43+ SizeDependentLayout::setupVector (hierarchy,
44+ [](auto *item, const SpecMarker &marker)
45+ {
46+ auto &&[spos, ssize] = marker.rect ().positive ();
47+ item->position = spos + ssize;
48+ item->size = ssize;
49+ });
6750}
6851
6952}
0 commit comments