diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 0000000..3b12ba3 --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,28 @@ +# 第三方组件与许可证 (Third-Party Notices) + +本项目(geopro / Geopro 3.0 桌面端)使用了以下第三方开源组件。各组件版权归其各自作者所有, +按其各自许可证条款分发。 + +| 组件 | 用途 | 许可证 | 来源 | +|---|---|---|---| +| **Qt 6** (6.11.x) | GUI 框架(Widgets/Gui/Core/Network/Svg/OpenGL 等) | LGPL-3.0(亦提供商业许可) | https://www.qt.io | +| **VTK** (9.x) | 三维/二维可视化渲染 | BSD-3-Clause | https://vtk.org | +| **Qt-Advanced-Docking-System** (4.3.1) | 停靠面板布局 | LGPL-2.1 | https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System | +| **ElaWidgetTools** | Fluent UI 控件(菜单/列表/表单/图标等) | MIT | https://github.com/Liniyous/ElaWidgetTools (Qt6.10+ 支持取自 fork https://github.com/RainbowCandyX/ElaWidgetTools) | +| **QtKeychain** (0.14.0) | 凭证安全存取("记住登录") | BSD-3-Clause | https://github.com/frankosterfeld/qtkeychain | + +## 许可证要点 + +- **Qt 6 / Qt-Advanced-Docking-System(LGPL)**:本项目以动态链接方式使用 Qt 与 ADS,符合 LGPL + 对动态链接的要求;如需替换这些库,最终用户可自行替换对应动态库。若改为静态链接或分发修改版, + 需遵循 LGPL 的相应义务(提供目标代码/重新链接能力)。 +- **ElaWidgetTools(MIT)**:以静态库方式集成;MIT 允许静态链接与闭源分发,需保留版权声明与许可证文本。 +- **VTK / QtKeychain(BSD-3-Clause)**:需在分发物中保留版权声明与许可证文本,不得用作者名背书。 + +> 各组件完整许可证文本随其源码分发(FetchContent 拉取于 build 目录的 `_deps/<组件>-src/`, +> 或随 Qt/VTK 安装目录)。如需在发行包中附带完整 LICENSE 文本,请从对应来源复制。 + +## ElaWidgetTools 版本钉定 + +为保证可复现构建,ElaWidgetTools 钉定到提交 +`b80eadc4a199186e14656dce09959b3216a593be`(见 `CMakeLists.txt` 的 `FetchContent_Declare(elawidgettools ...)`)。 diff --git a/src/app/main.cpp b/src/app/main.cpp index 2705d0e..7bd9163 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1099,49 +1099,35 @@ int main(int argc, char* argv[]) geopro::data::ApiProjectRepository projectRepo(api); geopro::controller::WorkbenchNavController nav(projectRepo); - // ── 外壳选择(P1 迁移,可回退):GEOPRO_UI_SHELL=ela → Fluent ElaWindow 壳; - // 未设/其它 → 经典 QMainWindow 壳。两者都复用同一 buildWorkbench(QMainWindow&)。 - // Ela 壳策略:ElaWindow 用 setCentralCustomWidget 包裹一个承载工作台的内层 QMainWindow - // (buildWorkbench 依赖 QMainWindow 的 setCentralWidget/setMenuWidget/statusBar, - // ElaWindow 自身将其设为私有,故用内层 QMainWindow 承接,零改 buildWorkbench)。 + // ── 外壳:Fluent ElaWindow(唯一路径)。ElaWindow 用 addPageNode 包裹一个承载工作台的内层 + // QMainWindow(buildWorkbench 依赖 QMainWindow 的 setCentralWidget/setMenuWidget/statusBar, + // ElaWindow 自身将其设为私有,故用内层 QMainWindow 承接,零改 buildWorkbench)。 const QString kTitle = QStringLiteral("Geopro 3.0 — 项目分析视图 (M1)"); - QWidget* topLevel = nullptr; - if (qEnvironmentVariable("GEOPRO_UI_SHELL") == QLatin1String("ela")) { - auto* ela = new ElaWindow; - ela->setWindowTitle(kTitle); - ela->resize(1280, 800); - ela->setMinimumSize(1024, 680); - ela->setIsNavigationBarEnable(false); // 纯中心内容,不显示左侧导航栏 - ela->setAppBarHeight(38); // 默认 45 偏大,收紧标题栏更接近原生 - auto* inner = new QMainWindow(ela); // 以 ela 为父,避免无父期调色板/DPI 抖动(review H3) - buildWorkbench(*inner, repo, projectRepo, nav); - // 用 addPageNode 把工作台作为唯一页面放进中心页栈(填满到底边)。 - // 注意:不能用 setCentralCustomWidget——它把控件插到页栈容器“之上”,空页栈仍占底部, - // 导致状态栏不贴底边(见 ElaCentralStackedWidget::setCustomWidget 的 insertWidget(0,...))。 - ela->addPageNode(kTitle, inner); + auto* ela = new ElaWindow; + ela->setWindowTitle(kTitle); + ela->resize(1280, 800); + ela->setMinimumSize(1024, 680); + ela->setIsNavigationBarEnable(false); // 纯中心内容,不显示左侧导航栏 + ela->setAppBarHeight(38); // 默认 45 偏大,收紧标题栏更接近原生 + auto* inner = new QMainWindow(ela); // 以 ela 为父,避免无父期调色板/DPI 抖动 + buildWorkbench(*inner, repo, projectRepo, nav); + // 用 addPageNode 把工作台作为唯一页面放进中心页栈(填满到底边)。 + // 注意:不能用 setCentralCustomWidget——它把控件插到页栈容器“之上”,空页栈仍占底部, + // 导致状态栏不贴底边(见 ElaCentralStackedWidget::setCustomWidget 的 insertWidget(0,...))。 + ela->addPageNode(kTitle, inner); - // ── P2 主题桥:ElaTheme 明/暗切换 → 同步全局 QSS+调色板(覆盖所有标准控件与 ADS)。 - // Ela 自家控件由 ElaTheme 自动换肤;这里补齐非 Ela 面。也确定了主题最终态(解 review C2)。 - QObject::connect(eTheme, &ElaTheme::themeModeChanged, ela, [&app](ElaThemeType::ThemeMode m) { - geopro::app::applyThemeMode(app, m == ElaThemeType::Dark); - }); - geopro::app::applyThemeMode(app, eTheme->getThemeMode() == ElaThemeType::Dark); // 初始对齐 - // 主题切换快捷键 Ctrl+Shift+T(正式切换入口待 P3 TopBar Ela 化后加按钮)。 - auto* themeSc = new QShortcut(QKeySequence(QStringLiteral("Ctrl+Shift+T")), ela); - QObject::connect(themeSc, &QShortcut::activated, ela, [] { - eTheme->setThemeMode(eTheme->getThemeMode() == ElaThemeType::Light ? ElaThemeType::Dark - : ElaThemeType::Light); - }); - topLevel = ela; - } else { - auto* window = new QMainWindow; - window->setWindowTitle(kTitle); - window->resize(1280, 800); - window->setMinimumSize(1024, 680); // 防止停靠面板被压到不可用尺寸 - buildWorkbench(*window, repo, projectRepo, nav); - topLevel = window; - } - topLevel->show(); + // 主题桥:ElaTheme 明/暗切换 → 同步全局 QSS+调色板(覆盖所有标准控件与 ADS)。 + QObject::connect(eTheme, &ElaTheme::themeModeChanged, ela, [&app](ElaThemeType::ThemeMode m) { + geopro::app::applyThemeMode(app, m == ElaThemeType::Dark); + }); + geopro::app::applyThemeMode(app, eTheme->getThemeMode() == ElaThemeType::Dark); // 初始对齐 + // 主题切换快捷键 Ctrl+Shift+T(标题栏亦有 Ela 自带的明暗切换键)。 + auto* themeSc = new QShortcut(QKeySequence(QStringLiteral("Ctrl+Shift+T")), ela); + QObject::connect(themeSc, &QShortcut::activated, ela, [] { + eTheme->setThemeMode(eTheme->getThemeMode() == ElaThemeType::Light ? ElaThemeType::Dark + : ElaThemeType::Light); + }); + ela->show(); nav.start(); // 进入工作台后拉真实 空间/项目/结构