改结构

This commit is contained in:
2026-08-21 14:38:18 +08:00
parent 8d5407ea90
commit d2fa9b4ee0
20 changed files with 186 additions and 161 deletions
+63 -70
View File
@@ -179,20 +179,19 @@ void resize_axes(Size viewport, Axes*... axes) {
std::shared_ptr<Plot> make_spectrum_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto frequency = *frequency_axis_builder(canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {-110.0, 0.0}, canvas).build();
auto spectrum = *Impl<Spectrum>::Builder(scene.get(), frequency.get(), vertical.get())
.set(&Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set(&Spectrum::Prop::max_hold_visible, true)
.build();
spectrum->mark_dirty<Prepare_Data_Tag>();
spectrum->mark_dirty<Paint_Tag>();
Impl<Spectrum>::Builder spectrum_builder(frequency.get(), vertical.get());
spectrum_builder.set(&Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set(&Spectrum::Prop::max_hold_visible, true);
auto spectrum = *spectrum_builder.build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(spectrum.get());
auto scene = *scene_builder.build();
auto update = [raw = spectrum.get(), frequency = frequency.get(), vertical = vertical.get()](const Plot_Event& event) {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, frequency, vertical);
std::array<double, 256> samples{};
@@ -238,18 +237,17 @@ std::shared_ptr<Plot> make_spectrum_plot(asio::any_io_executor executor) {
std::shared_ptr<Plot> make_frequency_trace_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto time = *time_axis_builder(
Axis_Orientation::horizontal, {64.0, 370.0}, 620.0, canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {-1.2, 1.2}, canvas).build();
auto trace = *Impl<Frequency_Trace>::Builder(scene.get(), time.get(), vertical.get()).build();
trace->mark_dirty<Prepare_Data_Tag>();
trace->mark_dirty<Paint_Tag>();
auto trace = *Impl<Frequency_Trace>::Builder(time.get(), vertical.get()).build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(trace.get());
auto scene = *scene_builder.build();
auto update = [raw = trace.get(), time = time.get(), vertical = vertical.get(), tick = std::uint64_t{}](const Plot_Event& event) mutable {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, time, vertical);
raw->append_sample(tick++, std::sin(event.time_milliseconds * 0.0025) * 0.8
@@ -268,19 +266,18 @@ std::shared_ptr<Plot> make_frequency_trace_plot(asio::any_io_executor executor)
std::shared_ptr<Plot> make_sweep_spectrum_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto frequency = *frequency_axis_builder(canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {-110.0, 0.0}, canvas).build();
auto sweep = *Impl<Sweep_Spectrum>::Builder(scene.get(), frequency.get(), vertical.get())
.set(&Sweep_Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0})
.build();
sweep->mark_dirty<Prepare_Data_Tag>();
sweep->mark_dirty<Paint_Tag>();
Impl<Sweep_Spectrum>::Builder sweep_builder(frequency.get(), vertical.get());
sweep_builder.set(&Sweep_Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0});
auto sweep = *sweep_builder.build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(sweep.get());
auto scene = *scene_builder.build();
auto update = [raw = sweep.get(), frequency = frequency.get(), vertical = vertical.get()](const Plot_Event& event) {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, frequency, vertical);
std::array<double, 64> values{};
@@ -308,21 +305,20 @@ std::shared_ptr<Plot> make_sweep_spectrum_plot(asio::any_io_executor executor) {
std::shared_ptr<Plot> make_afterglow_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto frequency = *frequency_axis_builder(canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {-110.0, 0.0}, canvas).build();
auto afterglow = *Impl<Afterglow>::Builder(scene.get(), frequency.get(), vertical.get())
.set(&Afterglow::Prop::frequency_range, Axis_Range{0.0, 100.0})
Impl<Afterglow>::Builder afterglow_builder(frequency.get(), vertical.get());
afterglow_builder.set(&Afterglow::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set(&Afterglow::Prop::power_range, Axis_Range{-110.0, 0.0})
.set(&Afterglow::Prop::power_point_size, 96)
.build();
afterglow->mark_dirty<Prepare_Data_Tag>();
afterglow->mark_dirty<Paint_Tag>();
.set(&Afterglow::Prop::power_point_size, 96);
auto afterglow = *afterglow_builder.build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(afterglow.get());
auto scene = *scene_builder.build();
auto update = [raw = afterglow.get(), frequency = frequency.get(), vertical = vertical.get()](const Plot_Event& event) {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, frequency, vertical);
std::array<double, 192> values{};
@@ -352,20 +348,19 @@ std::shared_ptr<Plot> make_afterglow_plot(asio::any_io_executor executor) {
std::shared_ptr<Plot> make_waterfall_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto frequency = *frequency_axis_builder(canvas).build();
auto time = *time_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, canvas).build();
auto waterfall = *Impl<Waterfall>::Builder(scene.get(), frequency.get(), time.get())
.set(&Waterfall::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set(&Waterfall::Prop::power_range, Axis_Range{-110.0, 0.0})
.build();
waterfall->mark_dirty<Prepare_Data_Tag>();
waterfall->mark_dirty<Paint_Tag>();
Impl<Waterfall>::Builder waterfall_builder(frequency.get(), time.get());
waterfall_builder.set(&Waterfall::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set(&Waterfall::Prop::power_range, Axis_Range{-110.0, 0.0});
auto waterfall = *waterfall_builder.build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(waterfall.get());
auto scene = *scene_builder.build();
auto update = [raw = waterfall.get(), frequency = frequency.get(), time = time.get(), tick = std::uint64_t{}](const Plot_Event& event) mutable {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, frequency, time);
std::array<double, 192> values{};
@@ -398,21 +393,20 @@ std::shared_ptr<Plot> make_waterfall_plot(asio::any_io_executor executor) {
std::shared_ptr<Plot> make_constellation_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto horizontal = *numeric_axis_builder(
Axis_Orientation::horizontal, {64.0, 370.0}, 620.0, {-1.2, 1.2}, canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {-1.2, 1.2}, canvas).build();
auto constellation = *Impl<Constellation_Diagram>::Builder(scene.get(), horizontal.get(), vertical.get())
.set(&Constellation_Diagram::Prop::i_range, Axis_Range{-1.2, 1.2})
.set(&Constellation_Diagram::Prop::q_range, Axis_Range{-1.2, 1.2})
.build();
constellation->mark_dirty<Prepare_Data_Tag>();
constellation->mark_dirty<Paint_Tag>();
Impl<Constellation_Diagram>::Builder constellation_builder(horizontal.get(), vertical.get());
constellation_builder.set(&Constellation_Diagram::Prop::i_range, Axis_Range{-1.2, 1.2})
.set(&Constellation_Diagram::Prop::q_range, Axis_Range{-1.2, 1.2});
auto constellation = *constellation_builder.build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(constellation.get());
auto scene = *scene_builder.build();
auto update = [raw = constellation.get(), horizontal = horizontal.get(), vertical = vertical.get()](const Plot_Event& event) {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, horizontal, vertical);
const double phase = event.time_milliseconds * 0.003;
@@ -435,18 +429,17 @@ std::shared_ptr<Plot> make_constellation_plot(asio::any_io_executor executor) {
std::shared_ptr<Plot> make_selection_overlay_plot(asio::any_io_executor executor) {
constexpr Size canvas{720, 420};
auto scene = *Scene_2D::Builder{}
.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true)
.build();
auto horizontal = *numeric_axis_builder(
Axis_Orientation::horizontal, {64.0, 370.0}, 620.0, {0.0, 100.0}, canvas).build();
auto vertical = *numeric_axis_builder(
Axis_Orientation::vertical, {64.0, 370.0}, -320.0, {0.0, 100.0}, canvas).build();
auto selection = *Impl<Selection_Rectangle_Overlay>::Builder(scene.get(), horizontal.get(), vertical.get()).build();
selection->mark_dirty<Prepare_Data_Tag>();
selection->mark_dirty<Paint_Tag>();
auto selection = *Impl<Selection_Rectangle_Overlay>::Builder(horizontal.get(), vertical.get()).build();
Scene_2D::Builder scene_builder;
scene_builder.set(&Render_Scene_2D::Prop::viewport, canvas)
.set(&Render_Scene_2D::Prop::background, Color{7, 13, 24, 255})
.set(&Render_Scene_2D::Prop::view_active, true);
scene_builder.add_renderable(selection.get());
auto scene = *scene_builder.build();
auto update = [horizontal = horizontal.get(), vertical = vertical.get()](const Plot_Event& event) {
resize_axes({static_cast<int>(event.width), static_cast<int>(event.height)}, horizontal, vertical);
};