feat(ela): C VTK 视口背景随主题 + A 浮层勾选框 Ela 化

- vtkBackground(): 取 ElaTheme 窗口底色; CentralScene/详情渲染器初始用它; 切主题时中央+详情重设+刷新
- 浮层图层勾选(帘面/体素/切片/地形) → ElaCheckBox
- 说明: 自定义 chrome(工作空间/项目切换器/图标按钮/PanelHeader tab/工具条)保留并随主题(强换 Ela 会丢设计); 状态栏由 QSS 随主题
This commit is contained in:
gaozheng 2026-06-10 09:17:45 +08:00
parent 57c452e2d3
commit f5eff9e185
4 changed files with 38 additions and 6 deletions

View File

@ -6,6 +6,7 @@
#include "CameraPreset.hpp" #include "CameraPreset.hpp"
#include "Scene.hpp" #include "Scene.hpp"
#include "Theme.hpp"
#include "actors/CurtainActor.hpp" #include "actors/CurtainActor.hpp"
#include "actors/MapLineActor.hpp" #include "actors/MapLineActor.hpp"
#include "geo/GeoLocalFrame.hpp" #include "geo/GeoLocalFrame.hpp"
@ -18,7 +19,11 @@ void rebuildCentralScene(geopro::render::Scene& scene, vtkRenderer* renderer,
const geopro::core::GeoLocalFrame& frame, double verticalExaggeration) { const geopro::core::GeoLocalFrame& frame, double verticalExaggeration) {
scene.clear(); scene.clear();
const bool is2D = (mode == ViewMode::Map2D); const bool is2D = (mode == ViewMode::Map2D);
renderer->SetBackground(is2D ? 0.96 : 1.0, is2D ? 0.97 : 1.0, is2D ? 0.99 : 1.0); (void)is2D;
// 背景随主题(取 ElaTheme 窗口底色),暗色下不再是刺眼白底。
double bgR, bgG, bgB;
geopro::app::vtkBackground(bgR, bgG, bgB);
renderer->SetBackground(bgR, bgG, bgB);
for (const auto& s : sections) { for (const auto& s : sections) {
if (is2D) { if (is2D) {

View File

@ -467,6 +467,14 @@ bool isDarkTheme()
return eTheme->getThemeMode() == ElaThemeType::Dark; return eTheme->getThemeMode() == ElaThemeType::Dark;
} }
void vtkBackground(double& r, double& g, double& b)
{
const QColor c = roleColor(isDarkTheme(), ElaThemeType::WindowBase);
r = c.redF();
g = c.greenF();
b = c.blueF();
}
void applyThemedStyleSheet(QWidget* w, const QString& designQss) void applyThemedStyleSheet(QWidget* w, const QString& designQss)
{ {
if (!w) return; if (!w) return;

View File

@ -93,6 +93,9 @@ void applyTheme(QApplication& app);
// 当前 ElaTheme 是否暗色(供内联样式判断)。 // 当前 ElaTheme 是否暗色(供内联样式判断)。
bool isDarkTheme(); bool isDarkTheme();
// VTK 渲染器背景色(随当前主题,取 ElaTheme 窗口底色)。写入 r/g/b01
void vtkBackground(double& r, double& g, double& b);
// 把一段「浅色设计稿 QSS」按当前 ElaTheme 配色着色应用到 widget并随明/暗切换自动重着色。 // 把一段「浅色设计稿 QSS」按当前 ElaTheme 配色着色应用到 widget并随明/暗切换自动重着色。
// 用于 TopBar/PanelHeader/浮层 等带内联 setStyleSheet 的自定义 chrome——让它们也跟随主题 // 用于 TopBar/PanelHeader/浮层 等带内联 setStyleSheet 的自定义 chrome——让它们也跟随主题
// (设计稿里用浅色令牌 #1F2A3D/#FFFFFF/#2D6CB5… 书写即可,与全局 QSS 同一套角色映射)。 // (设计稿里用浅色令牌 #1F2A3D/#FFFFFF/#2D6CB5… 书写即可,与全局 QSS 同一套角色映射)。

View File

@ -62,6 +62,7 @@
#include <DockWidget.h> #include <DockWidget.h>
#include <ElaApplication.h> #include <ElaApplication.h>
#include <ElaCheckBox.h>
#include <ElaDef.h> #include <ElaDef.h>
#include <ElaTheme.h> #include <ElaTheme.h>
#include <ElaWindow.h> #include <ElaWindow.h>
@ -348,13 +349,13 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
"padding-bottom:3px;font-size:%2px;") "padding-bottom:3px;font-size:%2px;")
.arg(geopro::app::type::kWeightSemibold) .arg(geopro::app::type::kWeightSemibold)
.arg(geopro::app::type::kTitle)); .arg(geopro::app::type::kTitle));
auto* chkCurtain = new QCheckBox(QStringLiteral("帘面(断面墙)")); auto* chkCurtain = new ElaCheckBox(QStringLiteral("帘面(断面墙)"));
chkCurtain->setChecked(true); chkCurtain->setChecked(true);
auto* chkVoxel = new QCheckBox(QStringLiteral("体素dd_voxel")); auto* chkVoxel = new ElaCheckBox(QStringLiteral("体素dd_voxel"));
chkVoxel->setChecked(false); chkVoxel->setChecked(false);
auto* chkTerrain = new QCheckBox(QStringLiteral("地形DEM+影像)")); auto* chkTerrain = new ElaCheckBox(QStringLiteral("地形DEM+影像)"));
chkTerrain->setChecked(false); chkTerrain->setChecked(false);
auto* chkSlice = new QCheckBox(QStringLiteral("切片dd_slice")); auto* chkSlice = new ElaCheckBox(QStringLiteral("切片dd_slice"));
chkSlice->setChecked(false); chkSlice->setChecked(false);
if (!crs) { // PROJ 不可用 → 体素/切片/地形层(都需配准)禁用并提示 if (!crs) { // PROJ 不可用 → 体素/切片/地形层(都需配准)禁用并提示
const QString tip = QStringLiteral("PROJ 数据(proj.db)缺失,配准不可用"); const QString tip = QStringLiteral("PROJ 数据(proj.db)缺失,配准不可用");
@ -433,12 +434,27 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
auto* detailWidget = new QVTKOpenGLStereoWidget(); auto* detailWidget = new QVTKOpenGLStereoWidget();
vtkNew<vtkGenericOpenGLRenderWindow> detailRenderWindow; vtkNew<vtkGenericOpenGLRenderWindow> detailRenderWindow;
vtkNew<vtkRenderer> detailRenderer; vtkNew<vtkRenderer> detailRenderer;
detailRenderer->SetBackground(1.0, 1.0, 1.0); // 白底 {
double r, g, b;
geopro::app::vtkBackground(r, g, b); // 背景随主题
detailRenderer->SetBackground(r, g, b);
}
detailWidget->setRenderWindow(detailRenderWindow); detailWidget->setRenderWindow(detailRenderWindow);
detailRenderWindow->AddRenderer(detailRenderer); detailRenderWindow->AddRenderer(detailRenderer);
vtkRenderer* detailRendererPtr = detailRenderer.Get(); vtkRenderer* detailRendererPtr = detailRenderer.Get();
vtkGenericOpenGLRenderWindow* detailRenderWindowPtr = detailRenderWindow.Get(); vtkGenericOpenGLRenderWindow* detailRenderWindowPtr = detailRenderWindow.Get();
// VTK 背景随主题切换ElaTheme 明/暗切换时,中央+详情渲染器重设底色并刷新。
QObject::connect(eTheme, &ElaTheme::themeModeChanged, detailWidget,
[rendererPtr, renderWindowPtr, detailRendererPtr, detailRenderWindowPtr]() {
double r, g, b;
geopro::app::vtkBackground(r, g, b);
rendererPtr->SetBackground(r, g, b);
renderWindowPtr->Render();
detailRendererPtr->SetBackground(r, g, b);
detailRenderWindowPtr->Render();
});
// 数据详情容器:顶部「反演剖面/原数据」工具条 + 下方 QVTK 小视图。 // 数据详情容器:顶部「反演剖面/原数据」工具条 + 下方 QVTK 小视图。
auto* detailContainer = new QWidget(); auto* detailContainer = new QWidget();
auto* detailLayout = new QVBoxLayout(detailContainer); auto* detailLayout = new QVBoxLayout(detailContainer);