@@ -123,36 +123,70 @@ std::multimap<std::string, event_as, std::less<>> get_events(
123123
124124 std::multimap<std::string, event_as, std::less<>> events;
125125
126+ static std::vector<std::string> eventNames = []
127+ {
128+ std::vector<std::string> names;
129+ Refl::visit<Vizzu::Events::DrawEvents>(
130+ [&names]<class T >(
131+ Util::EventDispatcher::event_ptr &(*)(const T &),
132+ const std::initializer_list<std::string_view> &sv =
133+ {})
134+ {
135+ std::span s{sv};
136+ if (s.back () == " begin" || s.back () == " complete" ) {
137+ return names.emplace_back (
138+ " draw-" + std::string{s.back ()});
139+ }
140+
141+ if (s.back () == " base" ) s = {s.begin (), s.end () - 1 };
142+
143+ std::string name;
144+ for (auto name_part : s) {
145+ name += name_part;
146+ name += ' -' ;
147+ }
148+ name += " draw" ;
149+ return names.emplace_back (name);
150+ });
151+ return names;
152+ }();
153+
126154 auto line =
127155 chart.getOptions ().geometry == Vizzu::Gen::ShapeType::line;
128- chart.getEventDispatcher ().registerOnEachEvent (0 ,
129- [&events, &line](Util::EventDispatcher::Params ¶ms)
130- {
131- auto marker = params.eventName == " plot-marker-draw" ;
132- if ((marker && line)
133- || params.eventName == " plot-axis-draw" ) {
134- events.emplace (std::piecewise_construct,
135- std::tuple{params.eventName },
136- std::tuple{params.toJSON (),
137- params.target ,
138- static_cast <Vizzu::Events::OnLineDrawEvent &>(
139- params)
140- .line });
141- }
142- else if (marker) {
143- events.emplace (std::piecewise_construct,
144- std::tuple{params.eventName },
145- std::tuple{params.toJSON (),
146- params.target ,
147- static_cast <Vizzu::Events::OnRectDrawEvent &>(
148- params)
149- .rect });
150- }
151- else
152- events.emplace (std::piecewise_construct,
153- std::tuple{params.eventName },
154- std::tuple{params.toJSON (), params.target });
155- });
156+ auto event_handler = [&events, &line](
157+ Util::EventDispatcher::Params ¶ms)
158+ {
159+ auto marker = params.eventName == " plot-marker-draw" ;
160+ if ((marker && line)
161+ || params.eventName == " plot-axis-draw" ) {
162+ events.emplace (std::piecewise_construct,
163+ std::tuple{params.eventName },
164+ std::tuple{params.toJSON (),
165+ params.target ,
166+ static_cast <Vizzu::Events::OnLineDrawEvent &>(
167+ params)
168+ .line });
169+ }
170+ else if (marker) {
171+ events.emplace (std::piecewise_construct,
172+ std::tuple{params.eventName },
173+ std::tuple{params.toJSON (),
174+ params.target ,
175+ static_cast <Vizzu::Events::OnRectDrawEvent &>(
176+ params)
177+ .rect });
178+ }
179+ else
180+ events.emplace (std::piecewise_construct,
181+ std::tuple{params.eventName },
182+ std::tuple{params.toJSON (), params.target });
183+ };
184+
185+ for (const auto &name : eventNames) {
186+ auto n = chart.getEventDispatcher ().getEvent (name);
187+ skip->*n != nullptr ;
188+ n->attach (0 , event_handler);
189+ }
156190
157191 using clock_t = std::chrono::steady_clock;
158192 chart.getAnimControl ().update (clock_t::now ());
0 commit comments