feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
1 changed files with 39 additions and 5 deletions
Showing only changes of commit 2179f149b7 - Show all commits

View File

@ -446,9 +446,10 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
// ForceNoScrollArea禁止 ADS 默认把整块内容(含标题栏/页签栏)包进 QScrollArea。 // ForceNoScrollArea禁止 ADS 默认把整块内容(含标题栏/页签栏)包进 QScrollArea。
// 否则内容最小尺寸超过 dock 时,整个面板(标题+页签+图)一起滚动。改为内容自适应填充; // 否则内容最小尺寸超过 dock 时,整个面板(标题+页签+图)一起滚动。改为内容自适应填充;
// 需要时由内层(图表内容区)自行滚动,标题/页签固定。 // 需要时由内层(图表内容区)自行滚动,标题/页签固定。
detailDock->setWidget(wrapWithHeader( auto* detailHeader = wrapWithHeader(
geopro::app::Glyph::Detail, QStringLiteral("数据详情"), detailPanel), geopro::app::Glyph::Detail, QStringLiteral("数据详情"), detailPanel,
ads::CDockWidget::ForceNoScrollArea); {{geopro::app::Glyph::Fullscreen, QStringLiteral("全屏")}});
detailDock->setWidget(detailHeader, ads::CDockWidget::ForceNoScrollArea);
// 放在中央视图下方。 // 放在中央视图下方。
dockManager->addDockWidget(ads::BottomDockWidgetArea, detailDock, centerDockArea); dockManager->addDockWidget(ads::BottomDockWidgetArea, detailDock, centerDockArea);
@ -722,6 +723,39 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
return nullptr; return nullptr;
}; };
// ── 全屏切换VTK视图 / 数据详情 表头右上角「全屏」按钮 ──────────────────────────
// 点击 → 目标 dock 全屏(隐藏其余所有 dock再点 → 还原(全部显示)。
// 使用 ADS CDockWidget::toggleView(bool) 控制可见性(标准 ADS APIv4+)。
{
const QList<ads::CDockWidget*> allDocks{vtkDock, detailDock, leftDock, datasetDock,
rightDock, propDock};
auto applyFullscreen = [](ads::CDockWidget* target,
const QList<ads::CDockWidget*>& all, bool on) {
for (ads::CDockWidget* d : all) {
if (d == target) continue;
d->toggleView(!on); // on=进入全屏→隐藏其它; off=还原→全部显示
}
};
auto* vtkFsBtn = findHeaderAction(viewHeader, geopro::app::Glyph::Fullscreen);
auto* detailFsBtn = findHeaderAction(detailHeader, geopro::app::Glyph::Fullscreen);
if (vtkFsBtn) {
vtkFsBtn->setCheckable(true);
QObject::connect(vtkFsBtn, &QToolButton::toggled, &window,
[applyFullscreen, vtkDock, allDocks](bool on) {
applyFullscreen(vtkDock, allDocks, on);
});
}
if (detailFsBtn) {
detailFsBtn->setCheckable(true);
QObject::connect(detailFsBtn, &QToolButton::toggled, &window,
[applyFullscreen, detailDock, allDocks](bool on) {
applyFullscreen(detailDock, allDocks, on);
});
}
}
// 对象树右键菜单动作路由。 // 对象树右键菜单动作路由。
QObject::connect( QObject::connect(
objectTree, &geopro::app::ObjectTreePanel::contextActionRequested, &window, objectTree, &geopro::app::ObjectTreePanel::contextActionRequested, &window,
@ -1129,7 +1163,7 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
if (!geo.isEmpty()) window.restoreGeometry(geo); if (!geo.isEmpty()) window.restoreGeometry(geo);
// 注意ADS 按 dock 唯一名作键。改过 dock 名后旧布局会失配 → bump 此键丢弃旧布局, // 注意ADS 按 dock 唯一名作键。改过 dock 名后旧布局会失配 → bump 此键丢弃旧布局,
// 回落到下方 addDockWidget 的默认排布(再改 dock 名时同样要 bump 版本号)。 // 回落到下方 addDockWidget 的默认排布(再改 dock 名时同样要 bump 版本号)。
const QByteArray dockState = settings.value(QStringLiteral("ui/dockState_v2")).toByteArray(); const QByteArray dockState = settings.value(QStringLiteral("ui/dockState_v3")).toByteArray();
if (!dockState.isEmpty()) { if (!dockState.isEmpty()) {
dockManager->restoreState(dockState); dockManager->restoreState(dockState);
// restoreState 重建停靠区会重新显示 ADS 标题栏,再隐藏一次保持“无双标题”。 // restoreState 重建停靠区会重新显示 ADS 标题栏,再隐藏一次保持“无双标题”。
@ -1140,7 +1174,7 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
QObject::connect(qApp, &QCoreApplication::aboutToQuit, dockManager, [dockManager, &window]() { QObject::connect(qApp, &QCoreApplication::aboutToQuit, dockManager, [dockManager, &window]() {
QSettings settings; QSettings settings;
settings.setValue(QStringLiteral("ui/geometry"), window.saveGeometry()); settings.setValue(QStringLiteral("ui/geometry"), window.saveGeometry());
settings.setValue(QStringLiteral("ui/dockState_v2"), dockManager->saveState()); settings.setValue(QStringLiteral("ui/dockState_v3"), dockManager->saveState());
}); });
} }