From 46c75ed419874f16f9f3841cd6bfc65ef0413550 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 11 Jun 2026 12:01:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20dd=20=E5=9B=BE=E8=A1=A8=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E6=8E=A5=E5=8F=A3=20+=20=E6=B3=A8=E5=86=8C=E8=A1=A8(?= =?UTF-8?q?=E6=9C=AA=E6=B3=A8=E5=86=8C=E9=99=8D=E7=BA=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../panels/chart/IDatasetChartStrategy.hpp | 29 +++++++++++++++++++ tests/CMakeLists.txt | 3 ++ tests/app/test_chart_strategy_registry.cpp | 14 +++++++++ 3 files changed, 46 insertions(+) create mode 100644 src/app/panels/chart/IDatasetChartStrategy.hpp create mode 100644 tests/app/test_chart_strategy_registry.cpp diff --git a/src/app/panels/chart/IDatasetChartStrategy.hpp b/src/app/panels/chart/IDatasetChartStrategy.hpp new file mode 100644 index 0000000..7fdc240 --- /dev/null +++ b/src/app/panels/chart/IDatasetChartStrategy.hpp @@ -0,0 +1,29 @@ +#pragma once +#include +#include +#include +namespace geopro::app { + +class DatasetDetailPage; // 前置 + +// dd 类型驱动的图表策略:决定某 ddCode 的详情页如何加载/渲染。 +struct IDatasetChartStrategy { + virtual ~IDatasetChartStrategy() = default; + virtual std::string ddCode() const = 0; +}; + +class ChartStrategyRegistry { +public: + void add(std::unique_ptr s) { + const std::string code = s->ddCode(); + map_[code] = std::move(s); + } + IDatasetChartStrategy* find(const std::string& ddCode) const { + auto it = map_.find(ddCode); + return it == map_.end() ? nullptr : it->second.get(); + } + bool supports(const std::string& ddCode) const { return map_.count(ddCode) > 0; } +private: + std::map> map_; +}; +} // namespace geopro::app diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6e60a4e..8db9c60 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -80,4 +80,7 @@ target_sources(geopro_tests PRIVATE render/test_terrain.cpp) target_link_libraries(geopro_tests PRIVATE geopro_render ${VTK_LIBRARIES}) vtk_module_autoinit(TARGETS geopro_tests MODULES ${VTK_LIBRARIES}) +target_include_directories(geopro_tests PRIVATE ${CMAKE_SOURCE_DIR}/src/app) +target_sources(geopro_tests PRIVATE app/test_chart_strategy_registry.cpp) + add_subdirectory(spike) # spike S3: banded contour 渲染验证 diff --git a/tests/app/test_chart_strategy_registry.cpp b/tests/app/test_chart_strategy_registry.cpp new file mode 100644 index 0000000..ad6da01 --- /dev/null +++ b/tests/app/test_chart_strategy_registry.cpp @@ -0,0 +1,14 @@ +#include +#include "panels/chart/IDatasetChartStrategy.hpp" +using namespace geopro::app; +namespace { +struct Fake : IDatasetChartStrategy { std::string ddCode() const override { return "dd_inversion_data"; } }; +} +TEST(ChartStrategyRegistry, FindsRegisteredAndDegradesUnknown) { + ChartStrategyRegistry reg; + reg.add(std::make_unique()); + EXPECT_TRUE(reg.supports("dd_inversion_data")); + EXPECT_NE(reg.find("dd_inversion_data"), nullptr); + EXPECT_FALSE(reg.supports("dd_unknown")); + EXPECT_EQ(reg.find("dd_unknown"), nullptr); +}