src/gui/itemviews/qabstractproxymodel.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qabstractproxymodel.h"
       
    43 
       
    44 #ifndef QT_NO_PROXYMODEL
       
    45 
       
    46 #include "qitemselectionmodel.h"
       
    47 #include <private/qabstractproxymodel_p.h>
       
    48 
       
    49 QT_BEGIN_NAMESPACE
       
    50 
       
    51 /*!
       
    52     \since 4.1
       
    53     \class QAbstractProxyModel
       
    54     \brief The QAbstractProxyModel class provides a base class for proxy item
       
    55     models that can do sorting, filtering or other data processing tasks.
       
    56     \ingroup model-view
       
    57 
       
    58     This class defines the standard interface that proxy models must use to be
       
    59     able to interoperate correctly with other model/view components. It is not
       
    60     supposed to be instantiated directly.
       
    61 
       
    62     All standard proxy models are derived from the QAbstractProxyModel class.
       
    63     If you need to create a new proxy model class, it is usually better to
       
    64     subclass an existing class that provides the closest behavior to the one
       
    65     you want to provide.
       
    66 
       
    67     Proxy models that filter or sort items of data from a source model should
       
    68     be created by using or subclassing QSortFilterProxyModel.
       
    69 
       
    70     To subclass QAbstractProxyModel, you need to implement mapFromSource() and
       
    71     mapToSource(). The mapSelectionFromSource() and mapSelectionToSource()
       
    72     functions only need to be reimplemented if you need a behavior different
       
    73     from the default behavior.
       
    74 
       
    75     \note If the source model is deleted or no source model is specified, the
       
    76     proxy model operates on a empty placeholder model.
       
    77 
       
    78     \sa QSortFilterProxyModel, QAbstractItemModel, {Model/View Programming}
       
    79 */
       
    80 
       
    81 //detects the deletion of the source model
       
    82 void QAbstractProxyModelPrivate::_q_sourceModelDestroyed()
       
    83 {
       
    84     model = QAbstractItemModelPrivate::staticEmptyModel();
       
    85 }
       
    86 
       
    87 /*!
       
    88     Constructs a proxy model with the given \a parent.
       
    89 */
       
    90 
       
    91 QAbstractProxyModel::QAbstractProxyModel(QObject *parent)
       
    92     :QAbstractItemModel(*new QAbstractProxyModelPrivate, parent)
       
    93 {
       
    94     setSourceModel(QAbstractItemModelPrivate::staticEmptyModel());
       
    95 }
       
    96 
       
    97 /*!
       
    98     \internal
       
    99 */
       
   100 
       
   101 QAbstractProxyModel::QAbstractProxyModel(QAbstractProxyModelPrivate &dd, QObject *parent)
       
   102     : QAbstractItemModel(dd, parent)
       
   103 {
       
   104     setSourceModel(QAbstractItemModelPrivate::staticEmptyModel());
       
   105 }
       
   106 
       
   107 /*!
       
   108     Destroys the proxy model.
       
   109 */
       
   110 QAbstractProxyModel::~QAbstractProxyModel()
       
   111 {
       
   112 
       
   113 }
       
   114 
       
   115 /*!
       
   116     Sets the given \a sourceModel to be processed by the proxy model.
       
   117 */
       
   118 void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
       
   119 {
       
   120     Q_D(QAbstractProxyModel);
       
   121     if (d->model)
       
   122         disconnect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
       
   123 
       
   124     if (sourceModel) {
       
   125         d->model = sourceModel;
       
   126         connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
       
   127     } else {
       
   128         d->model = QAbstractItemModelPrivate::staticEmptyModel();
       
   129     }
       
   130 }
       
   131 
       
   132 /*!
       
   133     Returns the model that contains the data that is available through the proxy model.
       
   134 */
       
   135 QAbstractItemModel *QAbstractProxyModel::sourceModel() const
       
   136 {
       
   137     Q_D(const QAbstractProxyModel);
       
   138     if (d->model == QAbstractItemModelPrivate::staticEmptyModel())
       
   139         return 0;
       
   140     return d->model;
       
   141 }
       
   142 
       
   143 /*!
       
   144     \reimp
       
   145  */
       
   146 bool QAbstractProxyModel::submit()
       
   147 {
       
   148     Q_D(QAbstractProxyModel);
       
   149     return d->model->submit();
       
   150 }
       
   151 
       
   152 /*!
       
   153     \reimp
       
   154  */
       
   155 void QAbstractProxyModel::revert()
       
   156 {
       
   157     Q_D(QAbstractProxyModel);
       
   158     d->model->revert();
       
   159 }
       
   160 
       
   161 
       
   162 /*!
       
   163   \fn QModelIndex QAbstractProxyModel::mapToSource(const QModelIndex &proxyIndex) const
       
   164 
       
   165   Reimplement this function to return the model index in the source model that
       
   166   corresponds to the \a proxyIndex in the proxy model.
       
   167 
       
   168   \sa mapFromSource()
       
   169 */
       
   170 
       
   171 /*!
       
   172   \fn QModelIndex QAbstractProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
       
   173 
       
   174   Reimplement this function to return the model index in the proxy model that
       
   175   corresponds to the \a sourceIndex from the source model.
       
   176 
       
   177   \sa mapToSource()
       
   178 */
       
   179 
       
   180 /*!
       
   181   Returns a source selection mapped from the specified \a proxySelection.
       
   182 
       
   183   Reimplement this method to map proxy selections to source selections.
       
   184  */
       
   185 QItemSelection QAbstractProxyModel::mapSelectionToSource(const QItemSelection &proxySelection) const
       
   186 {
       
   187     QModelIndexList proxyIndexes = proxySelection.indexes();
       
   188     QItemSelection sourceSelection;
       
   189     for (int i = 0; i < proxyIndexes.size(); ++i)
       
   190         sourceSelection << QItemSelectionRange(mapToSource(proxyIndexes.at(i)));
       
   191     return sourceSelection;
       
   192 }
       
   193 
       
   194 /*!
       
   195   Returns a proxy selection mapped from the specified \a sourceSelection.
       
   196 
       
   197   Reimplement this method to map source selections to proxy selections.
       
   198 */
       
   199 QItemSelection QAbstractProxyModel::mapSelectionFromSource(const QItemSelection &sourceSelection) const
       
   200 {
       
   201     QModelIndexList sourceIndexes = sourceSelection.indexes();
       
   202     QItemSelection proxySelection;
       
   203     for (int i = 0; i < sourceIndexes.size(); ++i)
       
   204         proxySelection << QItemSelectionRange(mapFromSource(sourceIndexes.at(i)));
       
   205     return proxySelection;
       
   206 }
       
   207 
       
   208 /*!
       
   209     \reimp
       
   210  */
       
   211 QVariant QAbstractProxyModel::data(const QModelIndex &proxyIndex, int role) const
       
   212 {
       
   213     Q_D(const QAbstractProxyModel);
       
   214     return d->model->data(mapToSource(proxyIndex), role);
       
   215 }
       
   216 
       
   217 /*!
       
   218     \reimp
       
   219  */
       
   220 QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
       
   221 {
       
   222     Q_D(const QAbstractProxyModel);
       
   223     int sourceSection;
       
   224     if (orientation == Qt::Horizontal) {
       
   225         const QModelIndex proxyIndex = index(0, section);
       
   226         sourceSection = mapToSource(proxyIndex).column();
       
   227     } else {
       
   228         const QModelIndex proxyIndex = index(section, 0);
       
   229         sourceSection = mapToSource(proxyIndex).row();
       
   230     }
       
   231     return d->model->headerData(sourceSection, orientation, role);
       
   232 }
       
   233 
       
   234 /*!
       
   235     \reimp
       
   236  */
       
   237 QMap<int, QVariant> QAbstractProxyModel::itemData(const QModelIndex &proxyIndex) const
       
   238 {
       
   239     Q_D(const QAbstractProxyModel);
       
   240     return d->model->itemData(mapToSource(proxyIndex));
       
   241 }
       
   242 
       
   243 /*!
       
   244     \reimp
       
   245  */
       
   246 Qt::ItemFlags QAbstractProxyModel::flags(const QModelIndex &index) const
       
   247 {
       
   248     Q_D(const QAbstractProxyModel);
       
   249     return d->model->flags(mapToSource(index));
       
   250 }
       
   251 
       
   252 /*!
       
   253     \reimp
       
   254  */
       
   255 bool QAbstractProxyModel::setData(const QModelIndex &index, const QVariant &value, int role)
       
   256 {
       
   257     Q_D(QAbstractProxyModel);
       
   258     return d->model->setData(mapToSource(index), value, role);
       
   259 }
       
   260 
       
   261 /*!
       
   262     \reimp
       
   263  */
       
   264 bool QAbstractProxyModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
       
   265 {
       
   266     Q_D(QAbstractProxyModel);
       
   267     int sourceSection;
       
   268     if (orientation == Qt::Horizontal) {
       
   269         const QModelIndex proxyIndex = index(0, section);
       
   270         sourceSection = mapToSource(proxyIndex).column();
       
   271     } else {
       
   272         const QModelIndex proxyIndex = index(section, 0);
       
   273         sourceSection = mapToSource(proxyIndex).row();
       
   274     }
       
   275     return d->model->setHeaderData(sourceSection, orientation, value, role);
       
   276 }
       
   277 
       
   278 QT_END_NAMESPACE
       
   279 
       
   280 #include "moc_qabstractproxymodel.cpp"
       
   281 
       
   282 #endif // QT_NO_PROXYMODEL