qitemselectionmodel.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:8k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtGui module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QITEMSELECTIONMODEL_H
  38. #define QITEMSELECTIONMODEL_H
  39. #include <QtCore/qset.h>
  40. #include <QtCore/qvector.h>
  41. #include <QtCore/qlist.h>
  42. #include <QtCore/qabstractitemmodel.h>
  43. QT_BEGIN_HEADER
  44. QT_BEGIN_NAMESPACE
  45. QT_MODULE(Gui)
  46. #ifndef QT_NO_ITEMVIEWS
  47. class Q_GUI_EXPORT QItemSelectionRange
  48. {
  49. public:
  50.     inline QItemSelectionRange() {}
  51.     inline QItemSelectionRange(const QItemSelectionRange &other)
  52.         : tl(other.tl), br(other.br) {}
  53.     inline QItemSelectionRange(const QModelIndex &topLeft, const QModelIndex &bottomRight);
  54.     explicit inline QItemSelectionRange(const QModelIndex &index)
  55.         { tl = index; br = tl; }
  56.     inline int top() const { return tl.row(); }
  57.     inline int left() const { return tl.column(); }
  58.     inline int bottom() const { return br.row(); }
  59.     inline int right() const { return br.column(); }
  60.     inline int width() const { return br.column() - tl.column() + 1; }
  61.     inline int height() const { return br.row() - tl.row() + 1; }
  62.     inline QModelIndex topLeft() const { return QModelIndex(tl); }
  63.     inline QModelIndex bottomRight() const { return QModelIndex(br); }
  64.     inline QModelIndex parent() const { return tl.parent(); }
  65.     inline const QAbstractItemModel *model() const { return tl.model(); }
  66.     inline bool contains(const QModelIndex &index) const
  67.     {
  68.         return (parent() == index.parent()
  69.                 && tl.row() <= index.row() && tl.column() <= index.column()
  70.                 && br.row() >= index.row() && br.column() >= index.column());
  71.     }
  72.     inline bool contains(int row, int column, const QModelIndex &parentIndex) const
  73.     {
  74.         return (parent() == parentIndex
  75.                 && tl.row() <= row && tl.column() <= column
  76.                 && br.row() >= row && br.column() >= column);
  77.     }
  78.     bool intersects(const QItemSelectionRange &other) const;
  79.     QItemSelectionRange intersect(const QItemSelectionRange &other) const; // ### Qt 5: make QT4_SUPPORT
  80.     inline QItemSelectionRange intersected(const QItemSelectionRange &other) const
  81.         { return intersect(other); }
  82.     inline bool operator==(const QItemSelectionRange &other) const
  83.         { return (tl == other.tl && br == other.br); }
  84.     inline bool operator!=(const QItemSelectionRange &other) const
  85.         { return !operator==(other); }
  86.     inline bool isValid() const
  87.     {
  88.         return (tl.isValid() && br.isValid() && tl.parent() == br.parent()
  89.                 && top() <= bottom() && left() <= right());
  90.     }
  91.     QModelIndexList indexes() const;
  92. private:
  93.     QPersistentModelIndex tl, br;
  94. };
  95. Q_DECLARE_TYPEINFO(QItemSelectionRange, Q_MOVABLE_TYPE);
  96. inline QItemSelectionRange::QItemSelectionRange(const QModelIndex &atopLeft,
  97.                                                 const QModelIndex &abottomRight)
  98. { tl = atopLeft; br = abottomRight; }
  99. class QItemSelection;
  100. class QItemSelectionModelPrivate;
  101. class Q_GUI_EXPORT QItemSelectionModel : public QObject
  102. {
  103.     Q_OBJECT
  104.     Q_DECLARE_PRIVATE(QItemSelectionModel)
  105.     Q_FLAGS(SelectionFlags)
  106. public:
  107.     enum SelectionFlag {
  108.         NoUpdate       = 0x0000,
  109.         Clear          = 0x0001,
  110.         Select         = 0x0002,
  111.         Deselect       = 0x0004,
  112.         Toggle         = 0x0008,
  113.         Current        = 0x0010,
  114.         Rows           = 0x0020,
  115.         Columns        = 0x0040,
  116.         SelectCurrent  = Select | Current,
  117.         ToggleCurrent  = Toggle | Current,
  118.         ClearAndSelect = Clear | Select
  119.     };
  120.     Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
  121.     explicit QItemSelectionModel(QAbstractItemModel *model);
  122.     explicit QItemSelectionModel(QAbstractItemModel *model, QObject *parent);
  123.     virtual ~QItemSelectionModel();
  124.     QModelIndex currentIndex() const;
  125.     bool isSelected(const QModelIndex &index) const;
  126.     bool isRowSelected(int row, const QModelIndex &parent) const;
  127.     bool isColumnSelected(int column, const QModelIndex &parent) const;
  128.     bool rowIntersectsSelection(int row, const QModelIndex &parent) const;
  129.     bool columnIntersectsSelection(int column, const QModelIndex &parent) const;
  130.     bool hasSelection() const;
  131.     QModelIndexList selectedIndexes() const;
  132.     QModelIndexList selectedRows(int column = 0) const;
  133.     QModelIndexList selectedColumns(int row = 0) const;
  134.     const QItemSelection selection() const;
  135.     const QAbstractItemModel *model() const;
  136. public Q_SLOTS:
  137.     void setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command);
  138.     virtual void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command);
  139.     virtual void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command);
  140.     virtual void clear();
  141.     virtual void reset();
  142.     void clearSelection();
  143. Q_SIGNALS:
  144.     void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
  145.     void currentChanged(const QModelIndex &current, const QModelIndex &previous);
  146.     void currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
  147.     void currentColumnChanged(const QModelIndex &current, const QModelIndex &previous);
  148. protected:
  149.     QItemSelectionModel(QItemSelectionModelPrivate &dd, QAbstractItemModel *model);
  150.     void emitSelectionChanged(const QItemSelection &newSelection, const QItemSelection &oldSelection);
  151. private:
  152.     Q_DISABLE_COPY(QItemSelectionModel)
  153.     Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeRemoved(const QModelIndex&, int, int))
  154.     Q_PRIVATE_SLOT(d_func(), void _q_rowsAboutToBeRemoved(const QModelIndex&, int, int))
  155.     Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeInserted(const QModelIndex&, int, int))
  156.     Q_PRIVATE_SLOT(d_func(), void _q_rowsAboutToBeInserted(const QModelIndex&, int, int))
  157.     Q_PRIVATE_SLOT(d_func(), void _q_layoutAboutToBeChanged())
  158.     Q_PRIVATE_SLOT(d_func(), void _q_layoutChanged())
  159. };
  160. Q_DECLARE_OPERATORS_FOR_FLAGS(QItemSelectionModel::SelectionFlags)
  161. // dummy implentation of qHash() necessary for instantiating QList<QItemSelectionRange>::toSet() with MSVC
  162. inline uint qHash(const QItemSelectionRange &) { return 0; }
  163. class Q_GUI_EXPORT QItemSelection : public QList<QItemSelectionRange>
  164. {
  165. public:
  166.     QItemSelection() {}
  167.     QItemSelection(const QModelIndex &topLeft, const QModelIndex &bottomRight);
  168.     void select(const QModelIndex &topLeft, const QModelIndex &bottomRight);
  169.     bool contains(const QModelIndex &index) const;
  170.     QModelIndexList indexes() const;
  171.     void merge(const QItemSelection &other, QItemSelectionModel::SelectionFlags command);
  172.     static void split(const QItemSelectionRange &range,
  173.                       const QItemSelectionRange &other,
  174.                       QItemSelection *result);
  175. };
  176. #ifndef QT_NO_DEBUG_STREAM
  177. Q_GUI_EXPORT QDebug operator<<(QDebug, const QItemSelectionRange &);
  178. #endif
  179. #endif // QT_NO_ITEMVIEWS
  180. QT_END_NAMESPACE
  181. QT_END_HEADER
  182. #endif // QITEMSELECTIONMODEL_H