RADLib
RADical C++ application framework
RADSlintPlot.h
Go to the documentation of this file.
1 #ifndef RADSLINTPLOT_H
2 #define RADSLINTPLOT_H
3 
9 #pragma once
10 
11 #include <RADUi/RADPlot.h>
12 #include <RADUi/RADSlintBackend.h>
13 
14 #include <slint.h>
15 
16 #include <algorithm>
17 #include <cstddef>
18 #include <cstdint>
19 #include <memory>
20 #include <utility>
21 
22 namespace RADUi::Slint {
23 
25  inline slint::Image toSlintImage(const RADUi::PlotImage& image) {
26  const uint32_t width = static_cast<uint32_t>(std::max(1, image.width));
27  const uint32_t height = static_cast<uint32_t>(std::max(1, image.height));
28  slint::SharedPixelBuffer<slint::Rgba8Pixel> buffer(width, height);
29 
30  auto* pixels = buffer.begin();
31  const size_t count = static_cast<size_t>(width * height);
32  for (size_t i = 0; i < count; ++i) {
33  const auto source = i < image.pixels.size()
34  ? image.pixels[i]
35  : RADUi::PlotPixel{};
36  pixels[i] = {source.r, source.g, source.b, source.a};
37  }
38 
39  return slint::Image(buffer);
40  }
41 
42  namespace Detail {
44  template<typename Component, typename Setter>
46  public:
49  RADUi::PlotModel& model,
50  const slint::ComponentHandle<Component>& component,
51  Setter setter,
52  RADUi::PlotViewport viewport,
53  double framesPerSecond,
54  RADUi::PlotRenderMode renderMode)
55  : state_(std::make_shared<State>(
56  model,
57  component,
58  setter,
59  viewport,
60  framesPerSecond,
61  renderMode)) {
62  connection_ = model.dataChanged.connect(this, &PlotComponentBridge::handleDataChanged);
64  }
65 
68  auto state = state_;
69  state->scheduler.requestUpdate([state]() mutable {
70  if (auto componentHandle = state->weakComponent.lock()) {
71  const auto snapshot = state->model.snapshot();
72  auto image = state->renderer->render(snapshot, state->viewport);
73  auto& component = **componentHandle;
74  (component.*state->setter)(RADUi::Slint::toSlintImage(image));
75  }
76  });
77  }
78 
79  private:
80  struct State {
81  State(
82  RADUi::PlotModel& modelRef,
83  const slint::ComponentHandle<Component>& component,
84  Setter setterRef,
85  RADUi::PlotViewport viewportRef,
86  double framesPerSecond,
87  RADUi::PlotRenderMode renderMode)
88  : model(modelRef),
89  weakComponent(component),
90  setter(setterRef),
91  viewport(viewportRef),
92  scheduler(framesPerSecond),
93  renderer(RADUi::createPlotRenderer(renderMode)) {}
94 
95  RADUi::PlotModel& model;
96  slint::ComponentWeakHandle<Component> weakComponent;
97  Setter setter;
98  RADUi::PlotViewport viewport;
99  RADUi::FrameScheduler scheduler;
100  std::unique_ptr<RADUi::PlotRenderer> renderer;
101  };
102 
103  std::shared_ptr<State> state_;
104  RADCore::Connection connection_;
105  };
106  } // namespace Detail
107 
109  template<typename Component, typename Setter>
111  RADUi::PlotModel& model,
112  const slint::ComponentHandle<Component>& component,
113  Setter setter,
114  RADUi::PlotViewport viewport,
115  double framesPerSecond = 60.0,
118  return RADUi::Binding(std::make_shared<Bridge>(
119  model, component, setter, viewport, framesPerSecond, renderMode));
120  }
121 
122 } // namespace RADUi::Slint
123 
124 #endif
Explicit event connection handle.
Definition: RADCore.h:903
Base class for event receivers, senders, and thread-affinity aware objects.
Definition: RADCore.h:931
RAII-style binding handle that keeps a bridge object alive until disconnected.
Definition: RADUi.h:28
Coalesces UI updates so expensive redraws occur at a target frame rate.
Definition: RADUi.h:77
Mutable X/Y plot data model that emits dataChanged on edits.
Definition: RADPlot.h:171
RADCore::Event< void() > dataChanged
Raised when series data, ranges, or styles change.
Definition: RADPlot.h:175
Bridge object that renders a PlotModel into a Slint image property.
Definition: RADSlintPlot.h:45
void handleDataChanged()
Schedules a rate-limited render after model data changes.
Definition: RADSlintPlot.h:67
PlotComponentBridge(RADUi::PlotModel &model, const slint::ComponentHandle< Component > &component, Setter setter, RADUi::PlotViewport viewport, double framesPerSecond, RADUi::PlotRenderMode renderMode)
Connects to model changes and configures rendering.
Definition: RADSlintPlot.h:48
Definition: RADSlintBackend.h:20
slint::Image toSlintImage(const RADUi::PlotImage &image)
Converts a RADUi plot image to a Slint image.
Definition: RADSlintPlot.h:25
RADUi::Binding bindPlotToImageProperty(RADUi::PlotModel &model, const slint::ComponentHandle< Component > &component, Setter setter, RADUi::PlotViewport viewport, double framesPerSecond=60.0, RADUi::PlotRenderMode renderMode=RADUi::PlotRenderMode::Software)
Binds model rendering to a generated Slint image property setter.
Definition: RADSlintPlot.h:110
Definition: RADAppKit.h:20
std::unique_ptr< PlotRenderer > createPlotRenderer(PlotRenderMode mode)
Creates a renderer for mode.
PlotRenderMode
Renderer implementation selection.
Definition: RADPlot.h:163
@ Software
CPU software renderer.
RGBA image returned by plot renderers.
Definition: RADPlot.h:153
int width
Image width in pixels.
Definition: RADPlot.h:155
std::vector< PlotPixel > pixels
Pixel buffer in row-major order.
Definition: RADPlot.h:159
int height
Image height in pixels.
Definition: RADPlot.h:157
One output pixel.
Definition: RADPlot.h:141
uint8_t r
Red component.
Definition: RADPlot.h:143
Pixel viewport and axis rendering configuration.
Definition: RADPlot.h:111