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/mGui/mSubWnd/iSubWnd.h

367 lines
11 KiB
C

#pragma once
#include "IxSerDes.h"
#include "IxPtyPano.h"
#include "ZxXpf.h"
#include "ZxSerializer.h"
#include "ZxBaseUtil.h"
#include "mModuleDefines.h"
#include "mSubWnd_global.h"
class ZxMainWindow;
class ZxMdiSubWindow;
class ZxTabWidget;
class ZxPtyDock;
class iDockBaseWx;
class ZxDataWell;
class ZxDataGaugeBase;
class ZxPlot;
class iGuiPlot;
class ZxRenderItem;
class ZxRstWnd;
// 各类型窗体MDI类型
// 数据管理
#define s_MdiType_DataManager "DataManager"
// 数据编辑
#define s_MdiType_DataEdit "DataEdit"
// 处理解释分析这是用的最多的一类包括Anal、Fitting、Design、Nm等
#define s_MdiType_DataAnal "DataAnal"
// 井位图,单独一类
#define s_MdiType_DataMap "DataMap"
// IPRIPR准备和IPR分析两类
#define s_MdiType_DataIPR "DataIPR"
// WDT所有与产能相关
#define s_MdiType_DataWDT "DataWDT"
// 小型压裂相关,目前包括四类
#define s_MdiType_DataMiniFr "DataMiniFr"
// Config类
#define s_MdiType_DataConfig "DataConfig"
// 成果对比类
#define s_MdiType_ResCompare "ResCompare"
// 数值类,有待数值类启用
#define s_MdiType_DataNum "DataNum"
// 注入/耦合
#define s_MdiType_DataInject "DataInject"
#define s_MdiType_DataCoupling "DataCoupling"
#define s_MdiType_DataDistrib "DataDistrib"
// 其它
#define s_MdiType_Free "Free"
//#define s_MdiType_DataAnalDn "DataDesign"
//#define s_MdiType_DataFit "DataFit"
// 子窗体基类
class M_SUB_WND_EXPORT iSubWnd : public QMainWindow,
virtual public IxSerDes
{
Q_OBJECT
public:
/// @brief 子窗体基类构造
/// @param parent:父
/// @param sExt指的是辅助信息如操作的表名等等
explicit iSubWnd(QWidget *parent = 0, QString sExt = "");
~iSubWnd();
void setMainWindow(ZxMainWindow* p); //set/get 主窗体
ZxMainWindow* getMainWindow();
virtual void initUI(); //初始化入口
virtual void configWnd(QString sPrevInfo); //配置窗体
virtual void loadData(QString sWell = ""); //加载数据
virtual void runUpdate(); //刷新
virtual void firstLoadAndUpdate(); //窗体初始后允许数据加载及刷新
virtual bool onConfirmClosing(); //窗体关闭之前的确认
virtual void onActivated(); //当前窗体激活时被调用
virtual void finalDeals(); //窗体完成并且在显示之前,允许再做些调整
void setProgressBar(QProgressBar* p); //进度条传递
virtual void setDataWell(ZxDataWell* p); //操作对象井传递
ZxDataWell* getDataWell();
void setWndID(QString sID); //窗体ID
QString getWndID();
// 为了触发消息,新增标题修改函数,触发
void setWndTag(QString s);
// 是否强制创建MDI
bool isForcedMdiWnd();
void setMdiWndType(QString sType); //窗体MdiWndType
QString getMdiWndType();
void setMdiChild(ZxMdiSubWindow *p);
ZxMdiSubWindow* getMdiChild();
ZxTabWidget* getTabWx();
// 临时变量对应的窗体Obj
virtual void setRstWnd(ZxRstWnd* p);
ZxRstWnd* getRstUtilWnd();
// 执行命令通常来自Ribbon
virtual bool runCmdBy(QString sName, QString sID);
/// @brief 命令是否Enabled的状态判断通常来自Ribbon
/// @param b (out)trueEnabled falsedisabled
/// @param sName (in),Cmd Name
/// @param nID (in),Cmd ID
/// @param bLicensed (in),当前是否有授权
/// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令)
virtual bool checkCmdEnable(bool &b, \
QString sName, int nID, \
bool bLicensed);
// 辅助信息
// void setExt(QString s);// 因为构造时传入,而且要进行判断
QString getExt();
// readonly
void setReadonly(bool b);
bool isReadonly();
//是否加载成果模式,临时设置
void setRstLoading(bool b);
bool isRstLoading();
// 对于缓存已经保存的压力流量进行刷新处理
void addTempSavedPFs(QString sCode);
virtual void freshByTempSavedPFs();
// 当井相关的内容更改时进行相关的处理,比如更新一下井位图
virtual void dealwithWellChange(ZxDataWell* pDataWell, TreeNodeCmd o);
public:
void keyPressEvent(QKeyEvent* e);
// 序列化
virtual void onSerialize(ZxSerializer* ser);
virtual void onDeserialize(ZxSerializer* ser);
virtual void onDeserialized();
// 保存加载
virtual bool loadRsts();
virtual bool saveRsts();
virtual bool _runSaveRsts(ZxRstWnd* pRstWnd);
virtual bool _runLoadRsts(ZxRstWnd* pRstWnd);
// 20260518 权宜之计,各个窗体提供,各自前置的需保存的信息
// 比如SubFitting中的 使用 分析 的ID
// 该信息在加载时,非常关键,在创建窗体时,就需要知晓
virtual QString _getPrevInfos4Save();
public:
// 相对通用的函数:某个数据对象(序列化对象)
virtual bool saveSerObjToBa(QByteArray& v, IxSerDes*& pSerObj);
virtual bool loadSerObjFromBa(QByteArray& v, IxSerDes*& pSerObj);
// 相对通用的函数某个Plot
virtual bool saveOnePlotToBa(ZxPlot* p, QByteArray& v);
virtual bool loadOnePlotFromBa(ZxPlot*& p, QByteArray& v);
public:
// 状态
virtual void setModified(bool b);
virtual bool isModified();
// 模型和参数窗口
virtual void showOrHideModels();
virtual void showOrHideParameters();
protected:
// 初始化参数
virtual void initStyleSheets(); //Sheet
// 初始化UI
virtual void initUiMain();
virtual QWidget* initUiMainWx();
virtual void initUiDockPtys();
virtual void initUiDockToolBar();
virtual void initUiDockWxs();
// 绑定属性载体
virtual void bindDockPty(IxPtySource* pPtyObj);
// 绑定图形信号
virtual void bindChartSignals(iGuiPlot* pWxPlot);
// 执行命令:通常来自图形右侧/左侧的工具栏
virtual bool runActionOf(QString sAction);
// 权限验证
bool checkLicensed(bool bPromptLicenseDlg = false);
public:
signals:
// 当通过外界创建了一个PF数据后刷新到TreeCtrl
void sigPfObjFinished(ZxDataGaugeBase* p);
// 窗体的大小附带需要所在的MDI进行变化
// 0: Normal 1 Max 2 Min
void sigMdiChildShow(int);
// m_pRstWnd为空时提醒父窗体进行创建指定
void sigNeedCreateRstWnd(bool& );
// 进度条
void sigShowProgressAbout(bool);
// 触发信号刷新Ribbon按钮状态
// list可以为id也可以为name
// 如果list为空则指的是Ribbon全部否则仅仅刷新指定的Btn
void sigFreshRnStates(QStringList list);
// 触发信息,关闭或者显示左侧工区数据树
void sigLeftTreeDocksVisible(bool);
/// @brief 在SubWnd中创建Dock并且显示至主窗体之中,该Dock由SubWnd进行管理
/// @param pDockWx (in) Dock指针
/// @param areaDefault(in) 默认布局区域
void sigAppendDock2Main(iDockBaseWx* pDockWx, \
Qt::DockWidgetArea areaDefault = Qt::LeftDockWidgetArea);
public slots:
// 进度条
virtual void slotPrsRangeSet(int nMin, int nMax);
virtual void slotPrsValueSet(int nPos);
virtual void slotPrsFormatSet(QString s);
// Toolbar按钮消息响应
virtual void slotBtnTriggered();
virtual void slotGraphItemPoliciesInstalled(ZxRenderItem*);
// 当前窗体所有信息的保存,比如关闭时提问的保存
virtual bool slotSaveAll();
virtual void slotDblClickShowProperty(bool b); //双击弹出
virtual void slotShowProperty();
virtual void updateView();
// 获取当前主窗口有多少Fit窗口即;Anal对应的Fitting窗口也可以扩展为其他同类
virtual void slotGetBrotherFitWnds(QMap<QString, iSubWnd*>& map);
// 属性模板
virtual void slotItemPropertyTempl(IxPtySource* p,
bool bLoad,
bool bSelf);
// 外部传递已修改信号
virtual void slotGuiPlotModified(bool b);
// 从子控件触发Action
virtual void slotChildActioned(QString sAction, bool& b);
// 关闭某个字窗体的Confirm
virtual void slotConfirmCloseSubWxs(bool& bClosable);
// 关闭某个子窗体后触发的响应,刷新布局
virtual void slotSubWxClosed();
// 数据加载信号相应
virtual void slotPfObjSaved(ZxDataGaugeBase* p);
protected:
/// @brief 绑定子窗体信号(通用的信号部分)
/// @param pSubWx 子窗体 说明pSubWx可能为iGuiPlot也可能为ZxMdiSubWindow也可能为其他
/// @param bAttached 该子窗体是否从属于另外的一个窗体比如双对数窗体隶属于ZxMdiSubWindowChild
/// @note bAttached标识主要为了避免多重的Close比如iGuiPlot由destroy信号而ZxMdiSubWindowChild有close信号
virtual void bindSubWxSignals(QWidget* pSubWx, bool bAttached = false);
/// @brief 为了方便,把数据加载对话框,统一整合了一下
/// @param sAction区分是压力还是流量通常为 "LoadP"或"LoadF"
/// @param bFixWellName 井名是否固定,固定的话,就不允许下拉
/// @param pTargetDataWell 保存到哪口井,如果不设置,则保存至当前井
virtual bool promptDataLoader(QString sAction, \
bool bFixWellName = false, \
ZxDataWell* pTargetDataWell = nullptr);
protected:
virtual void paintEvent(QPaintEvent *);
// /// @brief 拖拽支持
// void dragEnterEvent(QDragEnterEvent *event);
// void dropEvent(QDropEvent* event);
protected:
// 主窗体
ZxMainWindow* m_pMainWindow;
// toolbar、属性等成员变量
QToolBar* m_pToolBar;
ZxPtyDock* m_pDockPty;
QList<IxPtySource*> m_listProps;
// 辅助信息,如操作的表名等等
QString m_sExt;
// MdiSubWnd Type
QString m_sMdiWndType;
// 该窗体是否显示ToolBar
bool m_bShowToolbar;
// 与数据库对应的真实数据(外界传入,本类不进行创建释放维护)
ZxDataWell* m_pDataWell;
// ID
QString m_sWndID;
// 从属的Mdi窗口,内含TabWx主窗口传递过来
ZxMdiSubWindow* m_pMdiChild; //
// 按钮类别,如需增加工具栏,只需在构造中对该变量赋值
QString m_sCmdType;
// 临时变量对应的窗体Obj
bool m_bDeserialzing;
ZxRstWnd* m_pRstWnd;
// 临时变量
bool m_bModified;
// 进度条
QProgressBar* m_pProgressBar;
// 进度条刷新间隔
int m_nProgressLoop;
// 临时
bool m_bReadonly;
// 临时,当前涉及到的,可能得已经发生保存的压力/流量code只需要刷新本视窗
QStringList m_listTempSavedPFs;
bool m_bUnableSP; //临时变量不参与序列化
// 是否启用新的样式表ZXF202407,不参与序列化
bool m_bNovelQss;
// 该窗口是否强制创建MDI比如流动段选择+试井设计+IPR+小型压裂准备 需要强制创建Mdi
bool m_bForcedMdiWnd;
bool m_bRstLoading;//是否加载成果模式,不涉及序列,临时变量
};