| /**************************************************************************** |
| ** |
| ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). |
| ** All rights reserved. |
| ** Contact: Nokia Corporation (qt-info@nokia.com) |
| ** |
| ** This file is part of the QtGui module of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:LGPL$ |
| ** GNU Lesser General Public License Usage |
| ** This file may be used under the terms of the GNU Lesser General Public |
| ** License version 2.1 as published by the Free Software Foundation and |
| ** appearing in the file LICENSE.LGPL included in the packaging of this |
| ** file. Please review the following information to ensure the GNU Lesser |
| ** General Public License version 2.1 requirements will be met: |
| ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
| ** |
| ** In addition, as a special exception, Nokia gives you certain additional |
| ** rights. These rights are described in the Nokia Qt LGPL Exception |
| ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU General |
| ** Public License version 3.0 as published by the Free Software Foundation |
| ** and appearing in the file LICENSE.GPL included in the packaging of this |
| ** file. Please review the following information to ensure the GNU General |
| ** Public License version 3.0 requirements will be met: |
| ** http://www.gnu.org/copyleft/gpl.html. |
| ** |
| ** Other Usage |
| ** Alternatively, this file may be used in accordance with the terms and |
| ** conditions contained in a signed written agreement between you and Nokia. |
| ** |
| ** |
| ** |
| ** |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /* |
| A simple model that uses a QStringList as its data source. |
| */ |
| |
| #include "qstringlistmodel.h" |
| |
| #ifndef QT_NO_STRINGLISTMODEL |
| |
| QT_BEGIN_NAMESPACE |
| |
| /*! |
| \class QStringListModel |
| \brief The QStringListModel class provides a model that supplies strings to views. |
| |
| \ingroup model-view |
| |
| |
| QStringListModel is an editable model that can be used for simple |
| cases where you need to display a number of strings in a view |
| widget, such as a QListView or a QComboBox. |
| |
| The model provides all the standard functions of an editable |
| model, representing the data in the string list as a model with |
| one column and a number of rows equal to the number of items in |
| the list. |
| |
| Model indexes corresponding to items are obtained with the |
| \l{QAbstractListModel::index()}{index()} function, and item flags |
| are obtained with flags(). Item data is read with the data() |
| function and written with setData(). The number of rows (and |
| number of items in the string list) can be found with the |
| rowCount() function. |
| |
| The model can be constructed with an existing string list, or |
| strings can be set later with the setStringList() convenience |
| function. Strings can also be inserted in the usual way with the |
| insertRows() function, and removed with removeRows(). The contents |
| of the string list can be retrieved with the stringList() |
| convenience function. |
| |
| An example usage of QStringListModel: |
| |
| \snippet doc/src/snippets/qstringlistmodel/main.cpp 0 |
| |
| \sa QAbstractListModel, QAbstractItemModel, {Model Classes} |
| */ |
| |
| /*! |
| Constructs a string list model with the given \a parent. |
| */ |
| |
| QStringListModel::QStringListModel(QObject *parent) |
| : QAbstractListModel(parent) |
| { |
| } |
| |
| /*! |
| Constructs a string list model containing the specified \a strings |
| with the given \a parent. |
| */ |
| |
| QStringListModel::QStringListModel(const QStringList &strings, QObject *parent) |
| : QAbstractListModel(parent), lst(strings) |
| { |
| } |
| |
| /*! |
| Returns the number of rows in the model. This value corresponds to the |
| number of items in the model's internal string list. |
| |
| The optional \a parent argument is in most models used to specify |
| the parent of the rows to be counted. Because this is a list if a |
| valid parent is specified, the result will always be 0. |
| |
| \sa insertRows(), removeRows(), QAbstractItemModel::rowCount() |
| */ |
| |
| int QStringListModel::rowCount(const QModelIndex &parent) const |
| { |
| if (parent.isValid()) |
| return 0; |
| |
| return lst.count(); |
| } |
| |
| /*! |
| Returns data for the specified \a role, from the item with the |
| given \a index. |
| |
| If the view requests an invalid index, an invalid variant is returned. |
| |
| \sa setData() |
| */ |
| |
| QVariant QStringListModel::data(const QModelIndex &index, int role) const |
| { |
| if (index.row() < 0 || index.row() >= lst.size()) |
| return QVariant(); |
| |
| if (role == Qt::DisplayRole || role == Qt::EditRole) |
| return lst.at(index.row()); |
| |
| return QVariant(); |
| } |
| |
| /*! |
| Returns the flags for the item with the given \a index. |
| |
| Valid items are enabled, selectable, editable, drag enabled and drop enabled. |
| |
| \sa QAbstractItemModel::flags() |
| */ |
| |
| Qt::ItemFlags QStringListModel::flags(const QModelIndex &index) const |
| { |
| if (!index.isValid()) |
| return QAbstractItemModel::flags(index) | Qt::ItemIsDropEnabled; |
| |
| return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; |
| } |
| |
| /*! |
| Sets the data for the specified \a role in the item with the given |
| \a index in the model, to the provided \a value. |
| |
| The dataChanged() signal is emitted if the item is changed. |
| |
| \sa Qt::ItemDataRole, data() |
| */ |
| |
| bool QStringListModel::setData(const QModelIndex &index, const QVariant &value, int role) |
| { |
| if (index.row() >= 0 && index.row() < lst.size() |
| && (role == Qt::EditRole || role == Qt::DisplayRole)) { |
| lst.replace(index.row(), value.toString()); |
| emit dataChanged(index, index); |
| return true; |
| } |
| return false; |
| } |
| |
| /*! |
| Inserts \a count rows into the model, beginning at the given \a row. |
| |
| The \a parent index of the rows is optional and is only used for |
| consistency with QAbstractItemModel. By default, a null index is |
| specified, indicating that the rows are inserted in the top level of |
| the model. |
| |
| \sa QAbstractItemModel::insertRows() |
| */ |
| |
| bool QStringListModel::insertRows(int row, int count, const QModelIndex &parent) |
| { |
| if (count < 1 || row < 0 || row > rowCount(parent)) |
| return false; |
| |
| beginInsertRows(QModelIndex(), row, row + count - 1); |
| |
| for (int r = 0; r < count; ++r) |
| lst.insert(row, QString()); |
| |
| endInsertRows(); |
| |
| return true; |
| } |
| |
| /*! |
| Removes \a count rows from the model, beginning at the given \a row. |
| |
| The \a parent index of the rows is optional and is only used for |
| consistency with QAbstractItemModel. By default, a null index is |
| specified, indicating that the rows are removed in the top level of |
| the model. |
| |
| \sa QAbstractItemModel::removeRows() |
| */ |
| |
| bool QStringListModel::removeRows(int row, int count, const QModelIndex &parent) |
| { |
| if (count <= 0 || row < 0 || (row + count) > rowCount(parent)) |
| return false; |
| |
| beginRemoveRows(QModelIndex(), row, row + count - 1); |
| |
| for (int r = 0; r < count; ++r) |
| lst.removeAt(row); |
| |
| endRemoveRows(); |
| |
| return true; |
| } |
| |
| static bool ascendingLessThan(const QPair<QString, int> &s1, const QPair<QString, int> &s2) |
| { |
| return s1.first < s2.first; |
| } |
| |
| static bool decendingLessThan(const QPair<QString, int> &s1, const QPair<QString, int> &s2) |
| { |
| return s1.first > s2.first; |
| } |
| |
| /*! |
| \reimp |
| */ |
| void QStringListModel::sort(int, Qt::SortOrder order) |
| { |
| emit layoutAboutToBeChanged(); |
| |
| QList<QPair<QString, int> > list; |
| for (int i = 0; i < lst.count(); ++i) |
| list.append(QPair<QString, int>(lst.at(i), i)); |
| |
| if (order == Qt::AscendingOrder) |
| qSort(list.begin(), list.end(), ascendingLessThan); |
| else |
| qSort(list.begin(), list.end(), decendingLessThan); |
| |
| lst.clear(); |
| QVector<int> forwarding(list.count()); |
| for (int i = 0; i < list.count(); ++i) { |
| lst.append(list.at(i).first); |
| forwarding[list.at(i).second] = i; |
| } |
| |
| QModelIndexList oldList = persistentIndexList(); |
| QModelIndexList newList; |
| for (int i = 0; i < oldList.count(); ++i) |
| newList.append(index(forwarding.at(oldList.at(i).row()), 0)); |
| changePersistentIndexList(oldList, newList); |
| |
| emit layoutChanged(); |
| } |
| |
| /*! |
| Returns the string list used by the model to store data. |
| */ |
| QStringList QStringListModel::stringList() const |
| { |
| return lst; |
| } |
| |
| /*! |
| Sets the model's internal string list to \a strings. The model will |
| notify any attached views that its underlying data has changed. |
| |
| \sa dataChanged() |
| */ |
| void QStringListModel::setStringList(const QStringList &strings) |
| { |
| lst = strings; |
| reset(); |
| } |
| |
| /*! |
| \reimp |
| */ |
| Qt::DropActions QStringListModel::supportedDropActions() const |
| { |
| return QAbstractItemModel::supportedDropActions() | Qt::MoveAction; |
| } |
| |
| QT_END_NAMESPACE |
| |
| #endif // QT_NO_STRINGLISTMODEL |