| 75 | } |
| 76 | |
| 77 | bool lessThan(const QModelIndex & source_left, const QModelIndex & source_right) const override |
| 78 | { |
| 79 | ModFolderModel *model = qobject_cast<ModFolderModel *>(sourceModel()); |
| 80 | if( |
| 81 | !model || |
| 82 | !source_left.isValid() || |
| 83 | !source_right.isValid() || |
| 84 | source_left.column() != source_right.column() |
| 85 | ) { |
| 86 | return QSortFilterProxyModel::lessThan(source_left, source_right); |
| 87 | } |
| 88 | |
| 89 | // we are now guaranteed to have two valid indexes in the same column... we love the provided invariants unconditionally and proceed. |
| 90 | |
| 91 | auto column = (ModFolderModel::Columns) source_left.column(); |
| 92 | bool invert = false; |
| 93 | switch(column) { |
| 94 | // GH-2550 - sort by enabled/disabled |
| 95 | case ModFolderModel::ActiveColumn: { |
| 96 | auto dataL = source_left.data(Qt::CheckStateRole).toBool(); |
| 97 | auto dataR = source_right.data(Qt::CheckStateRole).toBool(); |
| 98 | if(dataL != dataR) { |
| 99 | return dataL > dataR; |
| 100 | } |
| 101 | // fallthrough |
| 102 | invert = sortOrder() == Qt::DescendingOrder; |
| 103 | } |
| 104 | // GH-2722 - sort mod names in a way that discards "The" prefixes |
| 105 | case ModFolderModel::NameColumn: { |
| 106 | auto dataL = model->data(model->index(source_left.row(), ModFolderModel::NameColumn)).toString(); |
| 107 | RemoveThePrefix(dataL); |
| 108 | auto dataR = model->data(model->index(source_right.row(), ModFolderModel::NameColumn)).toString(); |
| 109 | RemoveThePrefix(dataR); |
| 110 | |
| 111 | auto less = dataL.compare(dataR, sortCaseSensitivity()); |
| 112 | if(less != 0) { |
| 113 | return invert ? (less > 0) : (less < 0); |
| 114 | } |
| 115 | // fallthrough |
| 116 | invert = sortOrder() == Qt::DescendingOrder; |
| 117 | } |
| 118 | // GH-2762 - sort versions by parsing them as versions |
| 119 | case ModFolderModel::VersionColumn: { |
| 120 | auto dataL = Version(model->data(model->index(source_left.row(), ModFolderModel::VersionColumn)).toString()); |
| 121 | auto dataR = Version(model->data(model->index(source_right.row(), ModFolderModel::VersionColumn)).toString()); |
| 122 | return invert ? (dataL > dataR) : (dataL < dataR); |
| 123 | } |
| 124 | default: { |
| 125 | return QSortFilterProxyModel::lessThan(source_left, source_right); |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | }; |
| 130 | |
| 131 | ModFolderPage::ModFolderPage( |