#pragma once #include "IxRedoUndo.h" #include "IxRenderItem.h" #include "ZxTempLayer.h" #include "iPlotBase_global.h" class QUndoStack; class QUndoCommand; class ZxSelection; class IxPtyPano; class ZxRenderItem; class QSignalMapper; class QKeyEvent; /// 图形场景. 具有 图形文档 和 图元树的根节点双重分身 class I_PLOTBASE_EXPORT ZxSceneItem : public ZxRenderItem , virtual public IxRedoUndo { public: Q_OBJECT ZX_DECLARE_DYNAMIC public: explicit ZxSceneItem(QObject* parent = 0); // ZxSceneItem(const ZxSceneItem & c); // ZxSceneItem* clone() const; ~ZxSceneItem(); virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); /// 获取当前选中的图元 ZxSelection& getSelection(); /// 获取撤销/恢复堆栈 virtual QUndoStack * getUndoStack(); /// 类似于QUndoStack::beginMacro()的功能, 但做了一些特殊处理 /// @see QUndoStack::beginMacro() virtual void beginUndoStackMacro(); /// 类似于QUndoStack::endMacro()的功能, 但做了一些特殊处理 /// @see QUndoStack::endMacro() virtual void endUndoStackMacro(); /// 运行一个命令 virtual void pushCommand(QUndoCommand * cmd); /// 清除widget virtual void clearEditingWidget(); /// 刷新 virtual void update(); virtual void update(const QRectF& rect); void paintBack(QPainter* painter, const ZxPaintParam& param); void paintFront(QPainter* painter, const ZxPaintParam& param); /// 设置文档路径 virtual void setFilePath(const QString& filePath); /// 获取文档路径 virtual QString getFilePath() const; /// 文档是否已修改 virtual bool isModified() const; /// 文档修改标识 virtual void setModified(bool bModified); /// 关闭文档 virtual bool close(bool bPromptSave = true); /// 保存文档 virtual bool save(); /// 保存文档 virtual bool save(const QString& filePath); /// 另存文档 virtual bool saveAs(); /// 设置属性窗口 virtual void setPtyPano(IxPtyPano* p); /// 获取属性窗口 virtual IxPtyPano* getPtyPano(bool tryOuter = true) const; /// 获取背景图层 (不建议使用) virtual ZxRenderItem* getBackLayer() const; /// 设置背景图层 (不建议使用) virtual void setBackLayer(ZxRenderItem* pLayer); /// 获取主图层 virtual ZxRenderItem* getMainLayer() const; /// 设置主图层 virtual void setMainLayer(ZxRenderItem* pLayer); /// 获取前景图层 (不建议使用) virtual ZxRenderItem* getFrontLayer() const; /// 设置前景图层 (不建议使用) virtual void setFrontLayer(ZxRenderItem* pLayer); /// 获取临时图层 virtual ZxTempLayer * getTempLayer() const; /// 设置临时图层 (不推荐, 因为改了以后可能和别人的需求冲突) virtual void setTempLayer(ZxTempLayer * pLayer); virtual void invariant() const; /// 获取所有和本场景关联的视图 /// @note 依据的是文档视图管理器里的信息, 即addView()/addDoc()/bindDocView()等函数所建立的关系. QList getGraphViews(); /// 往菜单里添加选择图元的actions virtual void makeSelectItemsMenu(QMenu* pMenu, const QPointF& pt, ZxFilterFun filter = NULL, bool bRecursive = true); /// 获取文档标题 virtual QString getTitle() const; virtual QIcon getIcon() const; /// 是否自动关闭场景. virtual bool isAutoClose() const; /// 设置是否自动关闭场景 virtual void setAutoClose(bool bAutoClose); /// 弹出对话框, 选择保存文件 virtual QString getSaveFileName() const; virtual void updateEditActionStatus(); /// 设置本场景的属性表配置 /// @param sConfigName 配置文件名(不带扩展名). 如果为空则使用所在模块的配置. void setPtyTag(const QString& sConfigName); /// 获取本场景使用的属性表配置 QString getPtyTag() const; /// 把焦点设到Active View上, 只在Active View是关联到本Scene时起作用. void trySyncFocusWithActiveView(); signals: /// 信号: 安装编辑策略, 在收到信号时应为图元安装编辑策略 /// @note 信号的sender是场景, 参数里的图元才是实际需要安装策略的图元. void sigInstallPolicies(ZxRenderItem* pItem); /// 信号: 有图元被移出图件树 void sigItemDetached(ZxRenderItem* pItem); // 对于update函数无法顺利刷新的,触发如下信号在View中直接刷新 void sigUpdate(); void sigUpdateRect(const QRect&); protected: virtual void emitSigInstallPolicies(ZxRenderItem* pItem); void notifyItemDetached(ZxRenderItem* pItem); protected slots: virtual void slotUndoStackIndexChanged(int); virtual void slotSelectItem(QObject* p); virtual void cloneSelection(); virtual void slotEditCopy(); virtual void slotEditPaste(); virtual void slotEditCut(); virtual void slotEditDelete(); virtual void slotEditSelectAll(); protected: /// 选中列表被改变(即时) virtual void onSelectionChanged(); /// 选中列表被改变(非即时) virtual void onSelectionChangedLazy(); virtual void keyPressEvent(QKeyEvent *e); virtual void keyReleaseEvent(QKeyEvent * e); protected: QSignalMapper* m_pSelectMapper; QUndoStack* m_pUndoStack; ZxSelection* m_pSelection; QString m_sSceneFilePath; int m_nUndoStackMacroNest; bool m_bAutoClose; bool m_bModified; QList m_listPendingCommand; ZxRenderView* m_pTheOnlyOwnerView; QAction* actionUndo; QAction* actionRedo; QAction* actionEditCopy; QAction* actionEditPaste; QAction* actionEditCut; QAction* actionEditDelete; QAction* actionEditSelectAll; QString m_sPtyTag; IxPtyPano* m_pPtyPano; friend class ZxRenderItem; friend class ZxRenderView; friend class ZxSelection; friend class ZxSelectionPrivate; };