#pragma once #include #include #include #include #include #include #include #include "ZxDynamic.h" #include "ZxPtyItem.h" #include "iProperty_global.h" class ZxPtyFileManager; class ZxPtyAttributeFile; class ZxXpfNode; class I_PROPERTY_EXPORT ZxPtyPano : public QAbstractScrollArea , virtual public IxPtyPano , virtual public IxDynObj { Q_OBJECT ZX_DECLARE_DYNAMIC public: explicit ZxPtyPano(); ~ZxPtyPano(); virtual void paintEvent(QPaintEvent *); virtual void mousePressEvent(QMouseEvent *); virtual void mouseDoubleClickEvent(QMouseEvent* e); virtual void mouseReleaseEvent(QMouseEvent *); virtual void mouseMoveEvent(QMouseEvent *); virtual void resizeEvent(QResizeEvent *); virtual IxPtyItem* addGroup(const QString& key, bool expand = true, bool visible = true); virtual IxPtyItem* add(ZX_PROPERTY_CHANGED_CALLBACK callback, const QString& key, const QVariant& var, IxPtyItem::ItemType type = IxPtyItem::typeDefault); virtual void beginSession(const QString& configName, IxInterface* pSessionOwner); virtual void endSession(); virtual void beginObject(IxPtySource* p); virtual void endObject(); virtual IxPtyItem* findPropertyItem(const QString& sKey); virtual void clear(IxInterface* pSessionOwner); // 获取当前配置文件. 这个文件是根据上层应用模块设置的配置名来加载的, 每次填表都会更新. ZxPtyAttributeFile* getAttributeFile(); IxPtySource* getCurObject() { return m_pObject; } signals: void helpMessage(const QString& help); protected slots: void onConfigReloaded(); private: void paintGrid(QPainter& painter); void paintHeader(QPainter& painter); void paintGroups(QPainter& painter); void paintItems(QPainter& painter); void onActiveItemChanged(ZxPtyItem* item); enum HitTestPart { htNone, htExpander, htLeftCol, htRightCol, htSplit }; class HitTestResult { public: int row; HitTestPart part; bool isValid() const; int col(); }; private: void updateLayout(); void doLayout(); ZxPtyItem* getOrCreate(const QString& key, const QVariant& initVar, bool* bJustCreated); ZxXpfNode* getItemConfig(const QString& key); // ZxXpfNode* getParentItemConfig(ZxXpfNode* pItemConfig); int indentWidth() const; int getAndIncObjectSn(); QRect getLeftRect(int virtualRow); QRect getRightRect(int virtualRow); HitTestResult hitTest(int x, int y); void expand(ZxPtyItem* p); void collapse(ZxPtyItem* p); void activateItem(ZxPtyItem* p); void clearItems(); int getVerticalScrollPos() const; void scrollContentsBy(int dx, int dy); int right() const; void updateItem(ZxPtyItem* item); // 刷新重绘 void saveXSplit(); void loadXSplit(); void normalizeXSplit(); IxPtyItemEditor* createEditor(const QString& name); void releaseEditor(IxPtyItemEditor* p); private: bool m_bNeedLayout; QVector m_vecRealRows; QVector m_vecVirtualRows; QHash m_map; ZxPtyFileManager* m_pConfigManager; mutable ZxPtyAttributeFile* m_pAttribueFile; mutable QString m_sConfig; int m_nSessionId; IxInterface* m_pSessionOwner; IxPtySource* m_pObject; int m_nObjectCount; IxPtyItem* m_pCurrentItem; QHash m_objectSn; bool m_bInitializingSession; int m_xSplit; QPixmap m_pixExpand; QPixmap m_pixCollapse; friend class ZxPtyItem; QColor m_vecBackColors[3]; QColor m_groupFrontColor[3]; QColor m_frameBackColor; double m_dNextItemOrder; bool m_bClearEntered; // static QSet _setAllPtyPanos; QList itemsToBeDeleted; bool m_bHitSplit; // 控件池, 避免反复创建/删除, 否则Debug版会比较卡 typedef QVector ItemEditorVector; QHash m_editorPool; int m_nROW_HEIGHT; int m_nINDENT_WIDTH; int m_nINDENT_ICON_WIDTH; int m_nINDENT_ICON_MARGIN_H; int m_nINDENT_ICON_MARGIN_V; int m_nLEFT_PADDING; int m_nRIGHT_PADDING; int m_nBOTTOM_PADDING; int m_nCELL_PADDING_V; int m_nCELL_PADDING_H; int m_nCELL_SPACING; friend class ZxPtyFileManager; };