mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-26 20:03:13 +00:00
311 lines
9.1 KiB
C++
311 lines
9.1 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2015 The Qt Company Ltd.
|
|
** Copyright (C) 2016-2019 Ivailo Monev
|
|
**
|
|
** This file is part of the QtGui module of the Katie Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** Commercial License Usage
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
** accordance with the commercial license agreement provided with the
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
** and conditions see http://www.qt.io/terms-conditions. For further
|
|
** information use the contact form at http://www.qt.io/contact-us.
|
|
**
|
|
** GNU Lesser General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
** following information to ensure the GNU Lesser General Public License
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** As a special exception, The Qt Company gives you certain additional
|
|
** rights. These rights are described in The Qt Company 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.
|
|
**
|
|
** $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)
|
|
{
|
|
emit beginResetModel();
|
|
lst = strings;
|
|
emit endResetModel();
|
|
}
|
|
|
|
/*!
|
|
\reimp
|
|
*/
|
|
Qt::DropActions QStringListModel::supportedDropActions() const
|
|
{
|
|
return QAbstractItemModel::supportedDropActions() | Qt::MoveAction;
|
|
}
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
|
|
#include "moc_qstringlistmodel.h"
|
|
|
|
#endif // QT_NO_STRINGLISTMODEL
|