功能比较完善的一版
This commit is contained in:
@@ -15,6 +15,15 @@ std::unique_ptr<Object> build_object(Args&&... args) {
|
||||
return std::move(result).value();
|
||||
}
|
||||
|
||||
template <typename Scene, typename... Renderables>
|
||||
std::unique_ptr<Scene> build_scene(Renderables*... renderables) {
|
||||
typename Scene::Builder builder;
|
||||
(builder.add_renderable(renderables), ...);
|
||||
auto result = builder.build();
|
||||
if (!result) std::terminate();
|
||||
return std::move(result).value();
|
||||
}
|
||||
|
||||
template <typename Axis>
|
||||
void configure_axis(Axis* axis, Axis_Orientation orientation, Point_F position, Axis_Pixel_Length length, Size canvas) {
|
||||
axis->template set<&Abs_Axis::Prop::orientation>(orientation);
|
||||
@@ -33,7 +42,6 @@ TEST(plottable_migration, curve_plots_share_partitioned_rendering) {
|
||||
using Sweep = Impl<Sweep_Spectrum>;
|
||||
initialize_runtime(2);
|
||||
const Size canvas{160, 120};
|
||||
auto scene = build_object<Scene>();
|
||||
auto frequency = build_object<Frequency>();
|
||||
auto power = build_object<Numeric>();
|
||||
auto time = build_object<Time>();
|
||||
@@ -45,8 +53,8 @@ TEST(plottable_migration, curve_plots_share_partitioned_rendering) {
|
||||
frequency->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 100.0});
|
||||
power->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{-100.0, 0.0});
|
||||
value->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 100.0});
|
||||
auto trace = build_object<Trace>(scene.get(), time.get(), value.get());
|
||||
auto sweep = build_object<Sweep>(scene.get(), frequency.get(), power.get());
|
||||
auto trace = build_object<Trace>(time.get(), value.get());
|
||||
auto sweep = build_object<Sweep>(frequency.get(), power.get());
|
||||
trace->set<&Frequency_Trace::Prop::partition_mode>(Plot_Partition_Mode::fixed);
|
||||
trace->set<&Frequency_Trace::Prop::partition_count>(2u);
|
||||
trace->append_sample(0, 10.0);
|
||||
@@ -57,6 +65,7 @@ TEST(plottable_migration, curve_plots_share_partitioned_rendering) {
|
||||
sweep->set<&Sweep_Spectrum::Prop::partition_count>(2u);
|
||||
const std::array<Plot_Value, 4> block{-90.0, -60.0, -30.0, -10.0};
|
||||
sweep->append_block(block);
|
||||
auto scene = build_scene<Scene>(trace.get(), sweep.get());
|
||||
scene->set<&Render_Scene_2D::Prop::viewport>(canvas);
|
||||
scene->activate_view();
|
||||
scene->render();
|
||||
@@ -75,7 +84,6 @@ TEST(plottable_migration, raster_plots_share_partitioned_color_blocks) {
|
||||
using Fall = Impl<Waterfall>;
|
||||
initialize_runtime(2);
|
||||
const Size canvas{160, 120};
|
||||
auto scene = build_object<Scene>();
|
||||
auto frequency = build_object<Frequency>();
|
||||
auto power = build_object<Numeric>();
|
||||
auto time = build_object<Time>();
|
||||
@@ -84,8 +92,8 @@ TEST(plottable_migration, raster_plots_share_partitioned_color_blocks) {
|
||||
configure_axis(time.get(), Axis_Orientation::vertical, {20.0, 100.0}, -80.0, canvas);
|
||||
frequency->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 100.0});
|
||||
power->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{-100.0, 0.0});
|
||||
auto glow = build_object<Glow>(scene.get(), frequency.get(), power.get());
|
||||
auto waterfall = build_object<Fall>(scene.get(), frequency.get(), time.get());
|
||||
auto glow = build_object<Glow>(frequency.get(), power.get());
|
||||
auto waterfall = build_object<Fall>(frequency.get(), time.get());
|
||||
glow->set<&Afterglow::Prop::frequency_range>(Axis_Range{0.0, 100.0});
|
||||
glow->set<&Afterglow::Prop::power_range>(Axis_Range{-100.0, 0.0});
|
||||
glow->set<&Afterglow::Prop::power_point_size>(16u);
|
||||
@@ -95,6 +103,7 @@ TEST(plottable_migration, raster_plots_share_partitioned_color_blocks) {
|
||||
glow->append_spectrum(row);
|
||||
waterfall->append_row(0, row);
|
||||
waterfall->append_row(1, row);
|
||||
auto scene = build_scene<Scene>(glow.get(), waterfall.get());
|
||||
scene->set<&Render_Scene_2D::Prop::viewport>(canvas);
|
||||
scene->activate_view();
|
||||
scene->render();
|
||||
@@ -111,18 +120,18 @@ TEST(plottable_migration, direct_overlay_and_constellation_build_and_render) {
|
||||
using Overlay = Impl<Selection_Rectangle_Overlay>;
|
||||
initialize_runtime(2);
|
||||
const Size canvas{160, 120};
|
||||
auto scene = build_object<Scene>();
|
||||
auto horizontal = build_object<Numeric>();
|
||||
auto vertical = build_object<Numeric>();
|
||||
configure_axis(horizontal.get(), Axis_Orientation::horizontal, {20.0, 100.0}, 120.0, canvas);
|
||||
configure_axis(vertical.get(), Axis_Orientation::vertical, {20.0, 100.0}, -80.0, canvas);
|
||||
horizontal->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{-1.0, 1.0});
|
||||
vertical->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{-1.0, 1.0});
|
||||
auto diagram = build_object<Diagram>(scene.get(), horizontal.get(), vertical.get());
|
||||
auto overlay = build_object<Overlay>(scene.get(), horizontal.get(), vertical.get());
|
||||
auto diagram = build_object<Diagram>(horizontal.get(), vertical.get());
|
||||
auto overlay = build_object<Overlay>(horizontal.get(), vertical.get());
|
||||
diagram->set<&Constellation_Diagram::Prop::i_range>(Axis_Range{-1.0, 1.0});
|
||||
diagram->set<&Constellation_Diagram::Prop::q_range>(Axis_Range{-1.0, 1.0});
|
||||
diagram->append_point({0.25, -0.25});
|
||||
auto scene = build_scene<Scene>(diagram.get(), overlay.get());
|
||||
scene->set<&Render_Scene_2D::Prop::viewport>(canvas);
|
||||
scene->activate_view();
|
||||
scene->render();
|
||||
@@ -130,3 +139,46 @@ TEST(plottable_migration, direct_overlay_and_constellation_build_and_render) {
|
||||
EXPECT_EQ(overlay->read_state<Renderable::Base_Tag>().prepare_task_count, 0u);
|
||||
EXPECT_EQ(overlay->read_state<Renderable::Base_Tag>().paint_task_count, 1u);
|
||||
}
|
||||
|
||||
TEST(selection_overlay, control_extends_selection_and_plain_click_clears_it) {
|
||||
using Scene = Impl<Render_Scene_2D>;
|
||||
using Numeric = Impl<Numeric_Axis>;
|
||||
using Overlay = Impl<Selection_Rectangle_Overlay>;
|
||||
initialize_runtime(2);
|
||||
const Size canvas{160, 120};
|
||||
auto horizontal = build_object<Numeric>();
|
||||
auto vertical = build_object<Numeric>();
|
||||
configure_axis(horizontal.get(), Axis_Orientation::horizontal, {20.0, 100.0}, 120.0, canvas);
|
||||
configure_axis(vertical.get(), Axis_Orientation::vertical, {20.0, 100.0}, -80.0, canvas);
|
||||
horizontal->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 100.0});
|
||||
vertical->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 100.0});
|
||||
auto overlay = build_object<Overlay>(horizontal.get(), vertical.get());
|
||||
auto scene = build_scene<Scene>(overlay.get());
|
||||
scene->set<&Render_Scene_2D::Prop::viewport>(canvas);
|
||||
scene->activate_view();
|
||||
scene->render();
|
||||
|
||||
const auto drag = [&](Point_F first, Point_F second, Keyboard_Modifier modifiers) {
|
||||
Pointer_Event press(Event_Type::pointer_press);
|
||||
press.position = first;
|
||||
press.button = Mouse_Button::left;
|
||||
press.modifiers = modifiers;
|
||||
overlay->dispatch_event(press);
|
||||
Pointer_Event move(Event_Type::pointer_move);
|
||||
move.position = second;
|
||||
move.modifiers = modifiers;
|
||||
overlay->dispatch_event(move);
|
||||
Pointer_Event release(Event_Type::pointer_release);
|
||||
release.position = second;
|
||||
release.button = Mouse_Button::left;
|
||||
release.modifiers = modifiers;
|
||||
overlay->dispatch_event(release);
|
||||
scene->render();
|
||||
};
|
||||
drag({30.0, 90.0}, {60.0, 60.0}, Keyboard_Modifier::none);
|
||||
EXPECT_EQ(overlay->selected_regions().size(), 1u);
|
||||
drag({70.0, 90.0}, {100.0, 60.0}, Keyboard_Modifier::control);
|
||||
EXPECT_EQ(overlay->selected_regions().size(), 2u);
|
||||
drag({120.0, 40.0}, {120.0, 40.0}, Keyboard_Modifier::none);
|
||||
EXPECT_TRUE(overlay->selected_regions().empty());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user