#pragma once #include #include #include #include #include "repo/IProjectRepository.hpp" namespace geopro::controller { // 导航状态机:编排 IProjectRepository,持有当前 空间/项目 状态,经信号驱动 UI。不持有 widget。 class WorkbenchNavController : public QObject { Q_OBJECT public: explicit WorkbenchNavController(data::IProjectRepository& repo, QObject* parent = nullptr); void start(); // 启动:拉空间 → 项目 → 结构 QString currentCrsCode() const { return QString::fromStdString(currentCrsCode_); } public slots: void switchWorkspace(const QString& tenantId); void switchProject(const QString& projectId); void selectTm(const QString& tmObjectId); void loadMoreData(); void loadMoreFiles(); signals: void busyChanged(bool busy); void workspacesLoaded(const std::vector& list, const QString& currentId); void projectsLoaded(const std::vector& list, const QString& currentId, int total); void structureLoaded(const QString& projectName, const std::vector& nodes); void datasetsLoaded(const QString& tmObjectId, const std::vector& rows, int total, bool append); void filesLoaded(const QString& tmObjectId, const std::vector& rows, int total, bool append); void loadFailed(const QString& stage, const QString& message); private: void loadProjectsAndStructure(); // start + switchWorkspace 共用 data::IProjectRepository& repo_; bool busy_ = false; std::vector lastProjects_; std::string currentWorkspaceId_, currentProjectId_, currentProjectName_, currentCrsCode_; std::string currentTmId_; int dataPageNo_ = 0; int filePageNo_ = 0; int dataTotal_ = 0; int fileTotal_ = 0; }; } // namespace geopro::controller