#pragma once #include "Defines.h" #include "ZxDrawHelper.h" #include "ZxSubLegendItems.h" class ZxObjBase; class ZxObjCurveBase; class ZxSubLegendTool; class ZxSimpleTool; class ZxSubAxisX; class ZxSubAxisY; // 图例 class I_PLOTCURVE_T_EXPORT ZxSubLegend : public ZxRenderItem { Q_OBJECT ZX_DECLARE_DYNAMIC public: ZxSubLegend(); ZxSubLegend(const QString& sName, ZxSubAxisX *pAxisX, ZxSubAxisY *pAxisY); ~ZxSubLegend(); // 图例位置 enum LegendPos { LP_LeftTop = 0, //左上 LP_LeftBottom, //左下 LP_RightTop, //右上 LP_RightBottom, //右下 LP_Free, //任意,包括用户拖拽移动 LP_Unknown }; public: virtual void init(const QString& sName, ZxSubAxisX* pAxisX, ZxSubAxisY* pAxisY); virtual void initTools(ZxRenderView* pView); ZxSimpleTool* getTool(); void setAxisX(ZxSubAxisX* pAxis); void setAxisY(ZxSubAxisY* pAxis); public slots: // 子项管理 void slotObjItemAdded(ZxObjBase*); void slotObjItemDeleted(ZxObjBase*); void slotObjItemSelChanged(bool bSelected); void slotItemLeftDoubleClicked(const QPointF& pt); public: // 左键双击 virtual void onLeftDoubleClick(const QPointF& pt); public: ////////////////////////////////// // 子项管理 void appendItem(ZxObjCurveBase* pCurve); void removeItem(ZxObjCurveBase* pCurve); // void removeItem(int nIndex); void removeAllItems(); bool _addOrDel(ZxSubLegendItem* p, bool bAdd); // 在组模式情况下,拆分名称 bool _dealwithGroup(ZxSubLegendItem* p, bool bAdd); // 查找当前组 ZxSubLegendItems* _findOrCreateGroup(QString sNameP, bool bAdd); // 序列化后重新关联,仅仅实现与Group的绑定 void bindItem(ZxSubLegendItem* p); public: ////////////////////////////////// // 布局管理 // 重置位置,rtOuter是Plot的Inner void resetPosBy(const QRectF& rtOuter); // 布局 void onLayout(); // 根据子项字体和文字长度获取最小的长宽(不包括左侧) QSizeF getAllItemWH(); // 如果当前bound小于w*h,则重新调整bound // 注意:内部不能调用 setBounds bool adjustBoundInner(QRectF& bound); // 如果当前bound越界,则重新调整bound // 注意:内部不能调用 setBounds bool adjustBoundOuter(QRectF& bound); // 获取高度间隔,分别:组之间、项之间(Parent, CHild) void getIntersectH(double& fP, double& fC); public: virtual void paintBack(QPainter* painter, const ZxPaintParam& param); virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); virtual void onLoadTempl(ZxSerializer* ser); virtual void onSaveTempl(ZxSerializer* ser); virtual void fillPtyPano(IxPtyPano* sheet); public: // 击中 virtual bool hitTest(const QPointF& pt); // 具体击中实现的函数,单纯击中,不做选项的改变 // nOption用int是因为Rect类的击中选项不一致 // nOption为负值,表示未击中,此时返回false virtual bool _runHitTest(const QPointF& pt, int& nOption, int& nSubIndex); // 击中后,ButtonUp后的处理 // pt1:鼠标Down点,pt2:鼠标Up点 virtual bool runMove(const QPointF& pt1, const QPointF& pt2); public: // 支持的分组 void setGroupNames(QStringList& list); void appendGroupName(QString s); // 位置 int getLegendPos(); void setLegendPos(int n); // 边框 bool isFrameVisible(void) const; void setFrameVisible(bool bIsShow); QPen getFramePen(void); void setFramePen(QPen o); // 分组标题 QColor getGroupBackgrdClr(); void setGroupBackgrdClr(QColor clr); int getGroupBackgrdClrAlpha(); void setGroupBackgrdClrAlpha(int nAlpha); QFont getGroupTextFont(); void setGroupTextFont(QFont ft); QColor getGroupTextClr(); void setGroupTextClr(QColor clr); // 子项背景色,所有子项的通用 QColor getItemBackgrdClr(); void setItemBackgrdClr(QColor clr); int getItemBackgrdClrAlpha(); void setItemBackgrdClrAlpha(int nAlpha); QFont getItemTextFont(); void setItemTextFont(QFont ft); QColor getItemTextClr(); void setItemTextClr(QColor clr); // 边界控制 double getMarginInner(); void setMarginInner(double f); double getMarginOuter(); void setMarginOuter(double f); double getLeftWidth(); double getGroupHeight(); void setAxisObjectNameX(QString s); void setAxisObjectNameY(QString s); QString getAxisObjectNameX(); QString getAxisObjectNameY(); protected: // 本身tool、坐标轴关联,序列化后重新设置 ZxSubLegendTool* m_pTool; ZxSubAxisX* m_pAxisX; ZxSubAxisY* m_pAxisY; // 分组信息 QVector m_vecGroups; //序列化后重新设置 QStringList m_listGrouNames; // 相对于全图Plot的位置 LegendPos m_oLdPos; // 边框 bool m_bFrameVisible; QPen m_oFramePen; // 分组标题 QColor m_oGroupBackgrdClr; //背景色 QFont m_oGroupTextFont; QColor m_oGroupTextClr; // 子项背景色,所有子项的通用 QColor m_oItemBackgrdClr; QColor m_oItemTextClr; QFont m_oItemTextFont; // 边界控制 double m_fMarginInner; //内部Margin double m_fMarginOuter; //外部Margin double m_fLeftWidth; //左侧符号宽度 double m_fGroupHeight; double m_fRatio; //组间距/子项间距=3, 不参与序列化 QSizeF m_szChildText; //不参与序列化,临时 QString m_sAxisObjectNameX; //为了序列化 QString m_sAxisObjectNameY; public: // 选中标示,不需要序列化 RectPos m_oHitPos; int m_nHitIndex; };