| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the examples of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:BSD$ |
| ** 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 https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** BSD License Usage |
| ** Alternatively, you may use this file under the terms of the BSD license |
| ** as follows: |
| ** |
| ** "Redistribution and use in source and binary forms, with or without |
| ** modification, are permitted provided that the following conditions are |
| ** met: |
| ** * Redistributions of source code must retain the above copyright |
| ** notice, this list of conditions and the following disclaimer. |
| ** * Redistributions in binary form must reproduce the above copyright |
| ** notice, this list of conditions and the following disclaimer in |
| ** the documentation and/or other materials provided with the |
| ** distribution. |
| ** * Neither the name of The Qt Company Ltd nor the names of its |
| ** contributors may be used to endorse or promote products derived |
| ** from this software without specific prior written permission. |
| ** |
| ** |
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include "sortfilterproxymodel.h" |
| #include <QtDebug> |
| #include <QtQml> |
| |
| SortFilterProxyModel::SortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), m_complete(false) |
| { |
| connect(this, &QSortFilterProxyModel::rowsInserted, this, &SortFilterProxyModel::countChanged); |
| connect(this, &QSortFilterProxyModel::rowsRemoved, this, &SortFilterProxyModel::countChanged); |
| } |
| |
| int SortFilterProxyModel::count() const |
| { |
| return rowCount(); |
| } |
| |
| QObject *SortFilterProxyModel::source() const |
| { |
| return sourceModel(); |
| } |
| |
| void SortFilterProxyModel::setSource(QObject *source) |
| { |
| setSourceModel(qobject_cast<QAbstractItemModel *>(source)); |
| } |
| |
| QByteArray SortFilterProxyModel::sortRole() const |
| { |
| return m_sortRole; |
| } |
| |
| void SortFilterProxyModel::setSortRole(const QByteArray &role) |
| { |
| if (m_sortRole != role) { |
| m_sortRole = role; |
| if (m_complete) |
| QSortFilterProxyModel::setSortRole(roleKey(role)); |
| } |
| } |
| |
| void SortFilterProxyModel::setSortOrder(Qt::SortOrder order) |
| { |
| QSortFilterProxyModel::sort(0, order); |
| } |
| |
| QByteArray SortFilterProxyModel::filterRole() const |
| { |
| return m_filterRole; |
| } |
| |
| void SortFilterProxyModel::setFilterRole(const QByteArray &role) |
| { |
| if (m_filterRole != role) { |
| m_filterRole = role; |
| if (m_complete) |
| QSortFilterProxyModel::setFilterRole(roleKey(role)); |
| } |
| } |
| |
| QString SortFilterProxyModel::filterString() const |
| { |
| return filterRegExp().pattern(); |
| } |
| |
| void SortFilterProxyModel::setFilterString(const QString &filter) |
| { |
| setFilterRegExp(QRegExp(filter, filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(filterSyntax()))); |
| } |
| |
| SortFilterProxyModel::FilterSyntax SortFilterProxyModel::filterSyntax() const |
| { |
| return static_cast<FilterSyntax>(filterRegExp().patternSyntax()); |
| } |
| |
| void SortFilterProxyModel::setFilterSyntax(SortFilterProxyModel::FilterSyntax syntax) |
| { |
| setFilterRegExp(QRegExp(filterString(), filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(syntax))); |
| } |
| |
| QJSValue SortFilterProxyModel::get(int idx) const |
| { |
| QJSEngine *engine = qmlEngine(this); |
| QJSValue value = engine->newObject(); |
| if (idx >= 0 && idx < count()) { |
| QHash<int, QByteArray> roles = roleNames(); |
| for (auto it = roles.cbegin(), end = roles.cend(); it != end; ++it) |
| value.setProperty(QString::fromUtf8(it.value()), data(index(idx, 0), it.key()).toString()); |
| } |
| return value; |
| } |
| |
| void SortFilterProxyModel::classBegin() |
| { |
| } |
| |
| void SortFilterProxyModel::componentComplete() |
| { |
| m_complete = true; |
| if (!m_sortRole.isEmpty()) |
| QSortFilterProxyModel::setSortRole(roleKey(m_sortRole)); |
| if (!m_filterRole.isEmpty()) |
| QSortFilterProxyModel::setFilterRole(roleKey(m_filterRole)); |
| } |
| |
| int SortFilterProxyModel::roleKey(const QByteArray &role) const |
| { |
| return roleNames().key(role, -1); |
| } |
| |
| QHash<int, QByteArray> SortFilterProxyModel::roleNames() const |
| { |
| if (QAbstractItemModel *source = sourceModel()) |
| return source->roleNames(); |
| return QHash<int, QByteArray>(); |
| } |
| |
| bool SortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const |
| { |
| QRegExp rx = filterRegExp(); |
| if (rx.isEmpty()) |
| return true; |
| QAbstractItemModel *model = sourceModel(); |
| if (filterRole().isEmpty()) { |
| QHash<int, QByteArray> roles = roleNames(); |
| for (auto it = roles.cbegin(), end = roles.cend(); it != end; ++it) { |
| QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent); |
| QString key = model->data(sourceIndex, it.key()).toString(); |
| if (key.contains(rx)) |
| return true; |
| } |
| return false; |
| } |
| QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent); |
| if (!sourceIndex.isValid()) |
| return true; |
| QString key = model->data(sourceIndex, roleKey(filterRole())).toString(); |
| return key.contains(rx); |
| } |