#pragma once #include #include #include #include #include "ZxPaintParam.h" #include "ZxRenderAlign.h" #include "iPlotBase_global.h" class ZxRenderItem; class ZxSceneItem; class QTimer; class QTime; class ZxSelectionPrivate; class ZxSelectionNode; /// 当前选择的图件列表. /// 已经为大数据量及频繁选择做了优化. /// @note 此类的行为类似Qt的shared类. class I_PLOTBASE_EXPORT ZxSelection { public: public: ZxSelection(); ZxSelection(const ZxSelection& c); ~ZxSelection(); const ZxSelection& operator=(const ZxSelection& c); // // 获取实际对象, 以挂接信号 // QObject & operator*(); // // 获取实际对象, 以挂接信号 // const QObject & operator*() const; /// 获取实际对象, 以挂接信号 QObject* qobject() const; /// 获取所属的场景 ZxSceneItem* getScene() const; /// 选择 void add(ZxRenderItem* p, bool force = false); /// 选择 void add(const QList & items, bool force = false); /// 取消选择 void remove(ZxRenderItem* p); /// 取消选择 void remove(const QList & items); /// 反选 void invert(ZxRenderItem* p, bool force = false); /// 反选 void invert(const QList & items, bool force = false); /// 清除选择 void clear(); /// 获取第一个图元 /// @return 列表不为空时返回第一个图元, 列表为空时返回NULL /// @see begin() end() last() ZxRenderItem* first() const; /// 获取最后一个图元 /// @return 列表不为空时最后一个图元, 列表为空时返回NULL /// @see begin() end() first() ZxRenderItem* last() const; /// 转换成list QList toList() const; class I_PLOTBASE_EXPORT const_iterator { ZxSelectionPrivate * imp; ZxSelectionNode* p; const_iterator(ZxSelectionPrivate * imp, ZxSelectionNode* p); public: const_iterator(); ZxRenderItem* operator*(); bool operator!=( const const_iterator& ) const; bool operator==( const const_iterator& ) const; const_iterator& operator++(); friend class ZxSelection; }; /// Returns an STL-style iterator pointing to the first item in the list. /// @see first() last() end() /// @code /// for(auto it = selection.begin(); it != selection.end(); ++it) /// { /// ZxRenderItem* p = *it; /// // do something /// } /// @endcode const_iterator begin() const; /// Returns an STL-style iterator pointing to the imaginary item after the last item in the list. /// @see last() last() begin() /// @code /// for(auto it = selection.begin(); it != selection.end(); ++it) /// { /// ZxRenderItem* p = *it; /// // do something /// } /// @endcode const_iterator end() const; /// 列表是否为空 bool empty() const; /// 列表是否为空 bool isEmpty() const; /// 是否单选 bool isSingle() const; /// 选中的图元数量 int count() const; // 选中的图元是否相同类型. // @return 类型相同或列表为空时返回true, 否则返回false. // @note 根据 item->getClassName() 来判断 //bool isSameType() const; /// 选中的图元的边框的并集 QRectF getBounds(ZxFilterFun filter = 0); /// 选中的图元是否有相同父节点 bool hasSameParent() const; /// 移动选中的图元 void move(float dx, float dy); /// 查找选中图元的最近公共祖先节点 ZxRenderItem* findCommonAncestor() const; /// 对齐算法 static QList calcAlign(const QList & rects, const QRectF& box, Zx::ChartObjAlign type); /// 对齐 void align(Zx::ChartObjAlign mode); /// 目前选中的对象是否支持指定对齐方式 bool canAlign(Zx::ChartObjAlign mode) const; /// 复制到剪贴板 bool copy() const; /// 从剪贴板粘贴 bool paste(); /// 模拟重新选择, 可用来实现刷新属性表等功能 void emulateReSelect(); /// 判断是否含有指定图元. bool contains(ZxRenderItem* p) const; private: ZxSelection(ZxSceneItem* pScene); ZxSelectionPrivate* imp; friend class ZxSceneItem; friend class ZxSelectionPrivate; };