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 }