You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmSubWxs/nmWxPebiResultViewWidget.h

128 lines
5.8 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef NMWXPEBIRESULTVIEWWIDGET_H
#define NMWXPEBIRESULTVIEWWIDGET_H
#include "nmSubWxs_global.h"
#include <QPointer>
#include <QSharedPointer>
#include <QString>
#include <QWidget>
class QAction;
class QLabel;
class QMenu;
class QToolBar;
class nmDataAnalyzeManager;
class nmPebiResultSceneController;
class nmPebiResultSnapshot;
class nmWxPebiResultControlBar;
class nmWxVTKRenderContainerWidget;
/**
* @brief 独立的 PEBI 结果场景组合窗口。
*
* 本控件显式观察 DataManager,只组合通用渲染容器、结果 SceneController、
* 底部控制条和右侧 QAction。Manager 当前状态与 Scene 最后成功显示状态分别
* 缓存,因此新快照绑定失败时可以继续检查旧画面。
*/
class NM_SUB_WXS_EXPORT nmWxPebiResultViewWidget : public QWidget
{
Q_OBJECT
public:
/**
* @param pDataManager 非所有权对象,可为空;销毁后窗口自动进入空状态。
* @note 非空 Manager 必须与本窗口同属 Qt GUI 线程。
*/
explicit nmWxPebiResultViewWidget(
nmDataAnalyzeManager* pDataManager,
QWidget* pParent = nullptr);
/** @brief 按控制条、SceneController、渲染容器的顺序解除窗口资源。 */
virtual ~nmWxPebiResultViewWidget();
/**
* @brief 切换显式 Manager;相同指针只同步,不清空当前相机和场景。
* @note 跨线程 Manager 会被拒绝,避免同步读取快照引用时发生数据竞争。
*/
void setDataManager(nmDataAnalyzeManager* pDataManager);
/** @brief 返回当前观察的 Manager;对象销毁后自动返回空指针。 */
nmDataAnalyzeManager* getDataManager() const;
/** @brief 合并重入请求并读取 Manager 最新结果状态。 */
void synchronizeFromDataManager();
private slots:
/** @brief 响应快照身份、存在性或新鲜度变化,不响应结果井选择。 */
void onPebiResultStateChanged();
/** @brief Manager 析构时不再读取其成员,直接停止播放并清理场景。 */
void onDataManagerDestroyed(QObject* pObject);
/** @brief 将业务显隐 QAction 追加到通用右键菜单。 */
void appendContextMenuActions(QMenu* pMenu);
/** @brief 转发非阻塞操作错误,但不覆盖绑定失败或过期提示。 */
void onControlOperationFailed(const QString& sError);
/** @brief 明确操作成功后清除旧普通错误,不影响绑定失败或过期状态。 */
void onControlOperationSucceeded();
/** @brief 将 QVTK 视口尺寸同步给结果场景,不主动触发额外渲染。 */
void onViewportSizeChanged(int nWidth, int nHeight);
/** @brief 切换色标显隐。 */
void onScalarBarToggled(bool bVisible);
/** @brief 切换比例网格显隐。 */
void onScaleGridToggled(bool bVisible);
/** @brief 切换二维井名显隐。 */
void onWellNamesToggled(bool bVisible);
private:
Q_DISABLE_COPY(nmWxPebiResultViewWidget)
/** @brief 创建唯一渲染容器、SceneController、工具栏、提示栏和控制条。 */
void createUi();
/** @brief 执行一次非重入的 Manager 最新状态读取和事务提交。 */
void synchronizeOnce();
/** @brief 停止播放、清理 Scene,并把所有业务控件同步为空状态。 */
void clearSceneAndControls(const QString& sEmptyMessage);
/** @brief 保存本轮已经观察到的 Manager 快照身份和新鲜度。 */
void rememberObservedState(
const QSharedPointer<const nmPebiResultSnapshot>& pSnapshot,
const QString& sSnapshotId,
bool bCurrent);
/** @brief 从 SceneController 镜像三个业务 QAction 的勾选和可用状态。 */
void synchronizeBusinessActions();
/** @brief 根据“绑定失败、过期、操作错误”的固定优先级刷新提示栏。 */
void refreshStatusBar();
/** @brief 断开当前 Manager 的两个连接,不访问已经析构的对象。 */
void disconnectDataManager();
QPointer<nmDataAnalyzeManager> m_pDataManager; ///< 当前显式注入的 Manager。
nmWxVTKRenderContainerWidget* m_pRenderContainer; ///< 唯一通用 VTK 容器。
nmPebiResultSceneController* m_pSceneController; ///< 唯一结果场景控制器。
nmWxPebiResultControlBar* m_pControlBar; ///< 独占回放控制器和 Timer 的底栏。
QToolBar* m_pToolBar; ///< Qt 父对象拥有的右侧竖向工具栏。
QLabel* m_pStatusLabel; ///< 过期或错误的非阻塞提示栏。
QAction* m_pScalarBarAction; ///< 色标显隐动作。
QAction* m_pScaleGridAction; ///< 比例网格显隐动作。
QAction* m_pWellNamesAction; ///< 二维井名显隐动作。
/** @brief Manager 最近一次通知后观察到的快照强引用。 */
QSharedPointer<const nmPebiResultSnapshot> m_pObservedSnapshot;
/** @brief Manager 最近一次通知后观察到的稳定 Snapshot ID。 */
QString m_sObservedSnapshotId;
/** @brief 最近观察到的快照是否仍与当前输入版本一致。 */
bool m_bObservedSnapshotCurrent;
/** @brief 是否已经建立过一份可用于去重的 Manager 观察状态。 */
bool m_bObservedStateValid;
/** @brief Scene 最后一次成功绑定的快照强引用,与观察状态相互独立。 */
QSharedPointer<const nmPebiResultSnapshot> m_pDisplayedSnapshot;
/** @brief Scene 最后一次成功绑定的稳定 Snapshot ID。 */
QString m_sDisplayedSnapshotId;
QString m_sBindingError; ///< 最新 Manager 快照绑定失败的高优先级错误。
QString m_sOperationError; ///< 当前控制条普通操作错误。
bool m_bSynchronizing; ///< 防止 VTK 提交期间递归进入同步。
bool m_bSyncPending; ///< 重入时记录一次待处理请求,结束后循环读取最新状态。
};
#endif // NMWXPEBIRESULTVIEWWIDGET_H