File indexing completed on 2024-04-21 04:51:05

0001 /*
0002 SPDX-FileCopyrightText: 2022 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003 This file is part of Kdenlive. See www.kdenlive.org.
0004 
0005 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "markersortmodel.h"
0009 #include "markerlistmodel.hpp"
0010 
0011 MarkerSortModel::MarkerSortModel(QObject *parent)
0012     : QSortFilterProxyModel(parent)
0013     , m_sortColumn(1)
0014     , m_sortOrder(0)
0015 {
0016     setDynamicSortFilter(true);
0017 }
0018 
0019 // Responsible for item sorting!
0020 bool MarkerSortModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
0021 {
0022     if (filterAcceptsRowItself(sourceRow, sourceParent)) {
0023         return true;
0024     }
0025     return false;
0026 }
0027 
0028 bool MarkerSortModel::filterAcceptsRowItself(int sourceRow, const QModelIndex &sourceParent) const
0029 {
0030     if (m_filterList.isEmpty()) {
0031         return filterString(sourceRow, sourceParent);
0032     }
0033     QModelIndex row = sourceModel()->index(sourceRow, 0, sourceParent);
0034     if (m_filterList.contains(sourceModel()->data(row, MarkerListModel::TypeRole).toInt())) {
0035         return filterString(sourceRow, sourceParent);
0036     } else {
0037         m_ignoredPositions << sourceModel()->data(row, MarkerListModel::FrameRole).toInt();
0038     }
0039     return false;
0040 }
0041 
0042 bool MarkerSortModel::filterString(int sourceRow, const QModelIndex &sourceParent) const
0043 {
0044     if (m_searchString.isEmpty()) {
0045         return true;
0046     }
0047     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
0048     if (!index0.isValid()) {
0049         return false;
0050     }
0051     auto data = sourceModel()->data(index0);
0052     if (data.toString().contains(m_searchString, Qt::CaseInsensitive)) {
0053         return true;
0054     }
0055     return false;
0056 }
0057 
0058 void MarkerSortModel::slotSetFilters(const QList<int> filters)
0059 {
0060     m_filterList = filters;
0061     m_ignoredPositions.clear();
0062     invalidateFilter();
0063 }
0064 
0065 void MarkerSortModel::slotClearSearchFilters()
0066 {
0067     m_filterList.clear();
0068     m_ignoredPositions.clear();
0069     invalidateFilter();
0070 }
0071 
0072 void MarkerSortModel::slotSetFilterString(const QString &filter)
0073 {
0074     m_searchString = filter;
0075     invalidateFilter();
0076 }
0077 
0078 std::vector<int> MarkerSortModel::getIgnoredSnapPoints() const
0079 {
0080     std::vector<int> markers(m_ignoredPositions.cbegin(), m_ignoredPositions.cend());
0081     return markers;
0082 }
0083 
0084 void MarkerSortModel::slotSetSortColumn(int column)
0085 {
0086     m_sortColumn = column;
0087     invalidate();
0088 }
0089 
0090 void MarkerSortModel::slotSetSortOrder(bool descending)
0091 {
0092     m_sortOrder = descending ? Qt::DescendingOrder : Qt::AscendingOrder;
0093     invalidate();
0094 }
0095 
0096 bool MarkerSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
0097 {
0098     switch (m_sortColumn) {
0099     case 0: {
0100         // Sort by category
0101         int leftCategory = sourceModel()->data(left, MarkerListModel::TypeRole).toInt();
0102         int rightCategory = sourceModel()->data(right, MarkerListModel::TypeRole).toInt();
0103         if (leftCategory == rightCategory) {
0104             // sort by time
0105             double leftTime = sourceModel()->data(left, MarkerListModel::PosRole).toDouble();
0106             double rightTime = sourceModel()->data(right, MarkerListModel::PosRole).toDouble();
0107             if (m_sortOrder == Qt::AscendingOrder) {
0108                 return leftTime < rightTime;
0109             }
0110             return leftTime > rightTime;
0111         }
0112         if (m_sortOrder == Qt::AscendingOrder) {
0113             return leftCategory < rightCategory;
0114         }
0115         return leftCategory > rightCategory;
0116     }
0117     case 2: {
0118         // Sort by comment
0119         const QString leftComment = sourceModel()->data(left, MarkerListModel::CommentRole).toString();
0120         const QString rightComment = sourceModel()->data(right, MarkerListModel::CommentRole).toString();
0121         if (leftComment == rightComment) {
0122             // sort by time
0123             double leftTime = sourceModel()->data(left, MarkerListModel::PosRole).toDouble();
0124             double rightTime = sourceModel()->data(right, MarkerListModel::PosRole).toDouble();
0125             if (m_sortOrder == Qt::AscendingOrder) {
0126                 return leftTime < rightTime;
0127             }
0128             return leftTime > rightTime;
0129         }
0130         if (m_sortOrder == Qt::AscendingOrder) {
0131             return QString::localeAwareCompare(leftComment, rightComment) < 0;
0132         }
0133         return QString::localeAwareCompare(leftComment, rightComment) > 0;
0134     }
0135     case 1:
0136     default: {
0137         double leftTime = sourceModel()->data(left, MarkerListModel::PosRole).toDouble();
0138         double rightTime = sourceModel()->data(right, MarkerListModel::PosRole).toDouble();
0139         if (m_sortOrder == Qt::AscendingOrder) {
0140             return leftTime < rightTime;
0141         }
0142         return leftTime > rightTime;
0143     }
0144     }
0145 }