|
|
#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
|