presentation/QuickRuleModel.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "QuickRuleModel.h" | ||
| 2 | |||
| 3 | #include "RuleSentence.h" | ||
| 4 | |||
| 5 | #include <QCryptographicHash> | ||
| 6 | #include <QSet> | ||
| 7 | |||
| 8 | 383 | bool QuickRuleModel::Row::operator==(const Row &other) const { | |
| 9 |
4/6✓ Branch 4 → 5 taken 363 times.
✓ Branch 4 → 33 taken 20 times.
✓ Branch 6 → 7 taken 363 times.
✗ Branch 6 → 33 not taken.
✓ Branch 8 → 9 taken 363 times.
✗ Branch 8 → 33 not taken.
|
1129 | return key == other.key && blockIndex == other.blockIndex && kind == other.kind && |
| 10 |
3/4✓ Branch 9 → 10 taken 363 times.
✗ Branch 9 → 33 not taken.
✓ Branch 10 → 11 taken 351 times.
✓ Branch 10 → 33 taken 12 times.
|
726 | name == other.name && named == other.named && enabled == other.enabled && |
| 11 |
4/6✓ Branch 11 → 12 taken 351 times.
✗ Branch 11 → 33 not taken.
✓ Branch 13 → 14 taken 336 times.
✓ Branch 13 → 33 taken 15 times.
✓ Branch 15 → 16 taken 336 times.
✗ Branch 15 → 33 not taken.
|
351 | position == other.position && sentence == other.sentence && target == other.target && |
| 12 |
3/6✓ Branch 16 → 17 taken 336 times.
✗ Branch 16 → 33 not taken.
✓ Branch 17 → 18 taken 336 times.
✗ Branch 17 → 33 not taken.
✓ Branch 18 → 19 taken 336 times.
✗ Branch 18 → 33 not taken.
|
336 | stop == other.stop && forward == other.forward && destructive == other.destructive && |
| 13 |
6/8✓ Branch 20 → 21 taken 336 times.
✗ Branch 20 → 33 not taken.
✓ Branch 22 → 23 taken 336 times.
✗ Branch 22 → 33 not taken.
✓ Branch 23 → 24 taken 267 times.
✓ Branch 23 → 33 taken 69 times.
✓ Branch 25 → 26 taken 260 times.
✓ Branch 25 → 33 taken 7 times.
|
603 | unsupported == other.unsupported && excerpt == other.excerpt && line == other.line && |
| 14 |
4/8✓ Branch 3 → 4 taken 383 times.
✗ Branch 3 → 33 not taken.
✓ Branch 27 → 28 taken 260 times.
✗ Branch 27 → 33 not taken.
✓ Branch 29 → 30 taken 260 times.
✗ Branch 29 → 33 not taken.
✓ Branch 31 → 32 taken 260 times.
✗ Branch 31 → 33 not taken.
|
1033 | health == other.health && healthFix == other.healthFix && healthAlternative == other.healthAlternative && matchCount == other.matchCount; |
| 15 | } | ||
| 16 | |||
| 17 | 3953 | int QuickRuleModel::rowCount(const QModelIndex &parent) const { | |
| 18 |
1/2✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 3953 times.
|
3953 | return parent.isValid() ? 0 : m_rows.size(); |
| 19 | } | ||
| 20 | |||
| 21 | 38 | QHash<int, QByteArray> QuickRuleModel::roleNames() const { | |
| 22 | ✗ | return {{KeyRole, "ruleKey"}, {BlockIndexRole, "blockIndex"}, | |
| 23 | ✗ | {KindRole, "ruleKind"}, {NameRole, "ruleName"}, | |
| 24 | ✗ | {NamedRole, "ruleNamed"}, {EnabledRole, "ruleEnabled"}, | |
| 25 | ✗ | {PositionRole, "rulePosition"}, {SentenceRole, "ruleSentence"}, | |
| 26 | ✗ | {PlainSentenceRole, "ruleSentencePlain"}, {TargetRole, "ruleTarget"}, | |
| 27 | ✗ | {StopRole, "ruleStops"}, {ForwardRole, "ruleForwards"}, | |
| 28 | ✗ | {DestructiveRole, "ruleDestructive"}, {UnsupportedRole, "ruleUnsupported"}, | |
| 29 | ✗ | {ExcerptRole, "ruleExcerpt"}, {LineRole, "ruleLine"}, | |
| 30 | ✗ | {HealthRole, "ruleHealth"}, {HealthFixRole, "ruleHealthFix"}, {HealthAlternativeRole, "ruleHealthAlternative"}, | |
| 31 |
2/4✓ Branch 25 → 26 taken 798 times.
✓ Branch 25 → 27 taken 38 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
|
836 | {MatchCountRole, "ruleMatchCount"}, {AccessibleRole, "ruleAccessibleName"}}; |
| 32 | 38 | } | |
| 33 | |||
| 34 | 2587 | QVariant QuickRuleModel::data(const QModelIndex &index, int role) const { | |
| 35 |
5/6✓ Branch 3 → 4 taken 2586 times.
✓ Branch 3 → 7 taken 1 time.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 2586 times.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 11 taken 2586 times.
|
2587 | if (!index.isValid() || index.row() >= m_rows.size()) |
| 36 | 1 | return {}; | |
| 37 | 2586 | const Row &row = m_rows.at(index.row()); | |
| 38 |
22/22✓ Branch 13 → 14 taken 135 times.
✓ Branch 13 → 15 taken 135 times.
✓ Branch 13 → 16 taken 135 times.
✓ Branch 13 → 17 taken 137 times.
✓ Branch 13 → 18 taken 1 time.
✓ Branch 13 → 19 taken 135 times.
✓ Branch 13 → 20 taken 135 times.
✓ Branch 13 → 21 taken 136 times.
✓ Branch 13 → 22 taken 135 times.
✓ Branch 13 → 23 taken 136 times.
✓ Branch 13 → 24 taken 135 times.
✓ Branch 13 → 25 taken 135 times.
✓ Branch 13 → 26 taken 135 times.
✓ Branch 13 → 27 taken 136 times.
✓ Branch 13 → 28 taken 135 times.
✓ Branch 13 → 29 taken 1 time.
✓ Branch 13 → 30 taken 142 times.
✓ Branch 13 → 31 taken 138 times.
✓ Branch 13 → 32 taken 137 times.
✓ Branch 13 → 33 taken 135 times.
✓ Branch 13 → 34 taken 136 times.
✓ Branch 13 → 44 taken 1 time.
|
2586 | switch (role) { |
| 39 | 135 | case KeyRole: return row.key; | |
| 40 | 135 | case BlockIndexRole: return row.blockIndex; | |
| 41 | 135 | case KindRole: return row.kind; | |
| 42 | 137 | case NameRole: return row.name; | |
| 43 | 1 | case NamedRole: return row.named; | |
| 44 | 135 | case EnabledRole: return row.enabled; | |
| 45 | 135 | case PositionRole: return row.position; | |
| 46 | 136 | case SentenceRole: return row.sentence; | |
| 47 | 135 | case PlainSentenceRole: return row.plainSentence; | |
| 48 | 136 | case TargetRole: return row.target; | |
| 49 | 135 | case StopRole: return row.stop; | |
| 50 | 135 | case ForwardRole: return row.forward; | |
| 51 | 135 | case DestructiveRole: return row.destructive; | |
| 52 | 136 | case UnsupportedRole: return row.unsupported; | |
| 53 | 135 | case ExcerptRole: return row.excerpt; | |
| 54 | 1 | case LineRole: return row.line; | |
| 55 | 142 | case HealthRole: return row.health; | |
| 56 | 138 | case HealthFixRole: return row.healthFix; | |
| 57 | 137 | case HealthAlternativeRole: return row.healthAlternative; | |
| 58 | 135 | case MatchCountRole: return row.matchCount; | |
| 59 | 136 | case AccessibleRole: | |
| 60 | //: Accessible name of a rule row: name, on/off state, sentence. | ||
| 61 |
1/1✓ Branch 34 → 35 taken 136 times.
|
136 | return tr("Rule %1, %2: %3") |
| 62 |
5/5✓ Branch 35 → 36 taken 108 times.
✓ Branch 35 → 37 taken 28 times.
✓ Branch 36 → 38 taken 108 times.
✓ Branch 37 → 38 taken 28 times.
✓ Branch 38 → 39 taken 136 times.
|
136 | .arg(row.name, row.enabled ? tr("on") : tr("off"), row.plainSentence); |
| 63 | 1 | default: return {}; | |
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | 164 | QList<QuickRuleModel::Row> QuickRuleModel::rowsFor(const Sieve::Document &document, | |
| 68 | const QStringList &serverExtensions) { | ||
| 69 | 164 | QList<Row> rows; | |
| 70 | 164 | QHash<QString, int> occurrences; | |
| 71 | 164 | int position = 0; | |
| 72 |
2/2✓ Branch 196 → 3 taken 1332 times.
✓ Branch 196 → 197 taken 164 times.
|
1496 | for (int i = 0; i < document.blocks.size(); ++i) { |
| 73 | 1332 | const Sieve::Block &block = document.blocks.at(i); | |
| 74 |
4/4✓ Branch 4 → 5 taken 262 times.
✓ Branch 4 → 8 taken 1070 times.
✓ Branch 5 → 6 taken 227 times.
✓ Branch 5 → 8 taken 35 times.
|
1332 | if (block.kind != Sieve::BlockKind::Rule && block.kind != Sieve::BlockKind::Vacation && |
| 75 |
2/2✓ Branch 6 → 7 taken 165 times.
✓ Branch 6 → 8 taken 62 times.
|
227 | block.kind != Sieve::BlockKind::Advanced) |
| 76 | 165 | continue; | |
| 77 | 1167 | Row row; | |
| 78 | 1167 | row.blockIndex = i; | |
| 79 | 1167 | row.line = block.line; | |
| 80 | 1167 | row.named = block.named; | |
| 81 |
2/2✓ Branch 8 → 9 taken 1070 times.
✓ Branch 8 → 74 taken 97 times.
|
1167 | if (block.kind == Sieve::BlockKind::Rule) { |
| 82 | 1070 | row.kind = QStringLiteral("rule"); | |
| 83 | 1070 | row.position = ++position; | |
| 84 | 1070 | const Sieve::Rule &rule = block.rule; | |
| 85 |
1/3✓ Branch 15 → 16 taken 1070 times.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
|
1070 | row.name = block.named ? block.name : RuleSentence::generatedName(rule); |
| 86 | 1070 | row.enabled = rule.enabled; | |
| 87 |
1/1✓ Branch 20 → 21 taken 1070 times.
|
1070 | row.sentence = RuleSentence::sentence(rule, RuleSentence::rich); |
| 88 |
1/1✓ Branch 23 → 24 taken 1070 times.
|
1070 | row.plainSentence = RuleSentence::sentence(rule); |
| 89 |
1/1✓ Branch 26 → 27 taken 1070 times.
|
1070 | row.target = RuleSentence::target(rule); |
| 90 | 1070 | row.stop = rule.stop; | |
| 91 |
2/2✓ Branch 43 → 31 taken 1136 times.
✓ Branch 43 → 44 taken 1070 times.
|
2206 | for (const Sieve::Action &action : rule.actions) { |
| 92 |
4/4✓ Branch 32 → 33 taken 1135 times.
✓ Branch 32 → 34 taken 1 time.
✓ Branch 33 → 34 taken 7 times.
✓ Branch 33 → 35 taken 1128 times.
|
1136 | row.forward = row.forward || action.kind == Sieve::Action::Kind::Redirect; |
| 93 |
3/4✓ Branch 36 → 37 taken 1136 times.
✗ Branch 36 → 39 not taken.
✓ Branch 37 → 38 taken 1135 times.
✓ Branch 37 → 39 taken 1 time.
|
2271 | row.destructive = row.destructive || action.kind == Sieve::Action::Kind::Discard || |
| 94 |
2/2✓ Branch 38 → 39 taken 5 times.
✓ Branch 38 → 40 taken 1130 times.
|
1135 | action.kind == Sieve::Action::Kind::Reject; |
| 95 | } | ||
| 96 |
1/2✓ Branch 45 → 46 taken 1070 times.
✗ Branch 45 → 157 not taken.
|
1070 | if (!serverExtensions.isEmpty()) |
| 97 |
5/5✓ Branch 46 → 47 taken 1070 times.
✓ Branch 47 → 48 taken 1070 times.
✓ Branch 48 → 49 taken 1070 times.
✓ Branch 71 → 50 taken 1132 times.
✓ Branch 71 → 72 taken 1070 times.
|
2202 | for (const QString &extension : Sieve::extensionsFor(rule)) |
| 98 |
1/2✗ Branch 52 → 53 not taken.
✓ Branch 52 → 62 taken 1132 times.
|
1132 | if (!serverExtensions.contains(extension) && |
| 99 | ✗ | !(extension == QLatin1String("imap4flags") && | |
| 100 |
3/8✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 1132 times.
✗ Branch 65 → 66 not taken.
✓ Branch 65 → 67 taken 1132 times.
✗ Branch 67 → 68 not taken.
✓ Branch 67 → 69 taken 1132 times.
|
1132 | serverExtensions.contains(QStringLiteral("imapflags")))) |
| 101 |
0/1✗ Branch 68 → 69 not taken.
|
1070 | row.unsupported.append(extension); |
| 102 |
2/2✓ Branch 74 → 75 taken 35 times.
✓ Branch 74 → 93 taken 62 times.
|
97 | } else if (block.kind == Sieve::BlockKind::Vacation) { |
| 103 | 35 | row.kind = QStringLiteral("vacation"); | |
| 104 |
1/3✓ Branch 81 → 82 taken 35 times.
✗ Branch 81 → 83 not taken.
✗ Branch 83 → 84 not taken.
|
35 | row.name = block.named ? block.name : tr("Out of office"); |
| 105 | 35 | row.enabled = block.vacation.enabled; | |
| 106 |
1/1✓ Branch 86 → 87 taken 35 times.
|
35 | row.plainSentence = RuleSentence::vacationSummary(block.vacation); |
| 107 |
1/1✓ Branch 89 → 90 taken 35 times.
|
35 | row.sentence = row.plainSentence.toHtmlEscaped(); |
| 108 | } else { | ||
| 109 | 62 | row.kind = QStringLiteral("advanced"); | |
| 110 | 62 | row.position = ++position; | |
| 111 |
3/3✓ Branch 99 → 100 taken 32 times.
✓ Branch 99 → 101 taken 30 times.
✓ Branch 101 → 102 taken 30 times.
|
62 | row.name = block.named ? block.name : tr("Advanced block"); |
| 112 |
2/2✓ Branch 105 → 106 taken 62 times.
✓ Branch 106 → 107 taken 62 times.
|
62 | const QByteArray body = block.original.mid(block.leading.size()).trimmed(); |
| 113 |
1/1✓ Branch 108 → 109 taken 62 times.
|
62 | const QList<QByteArray> lines = body.split('\n'); |
| 114 | // The first lines that say something: no marker comment (the name is | ||
| 115 | // shown above it) and no lone braces. | ||
| 116 | 62 | QStringList excerpt; | |
| 117 |
6/6✓ Branch 138 → 139 taken 187 times.
✓ Branch 138 → 142 taken 31 times.
✓ Branch 140 → 141 taken 156 times.
✓ Branch 140 → 142 taken 31 times.
✓ Branch 143 → 110 taken 156 times.
✓ Branch 143 → 144 taken 62 times.
|
218 | for (int l = 0; l < lines.size() && excerpt.size() < 2; ++l) { |
| 118 |
2/2✓ Branch 111 → 112 taken 156 times.
✓ Branch 112 → 113 taken 156 times.
|
156 | const QString line = QString::fromUtf8(lines.at(l)).trimmed(); |
| 119 |
4/6✓ Branch 115 → 116 taken 156 times.
✗ Branch 115 → 125 not taken.
✓ Branch 118 → 119 taken 125 times.
✓ Branch 118 → 125 taken 31 times.
✓ Branch 121 → 122 taken 125 times.
✗ Branch 121 → 125 not taken.
|
281 | if (line.isEmpty() || line == QLatin1String("{") || line == QLatin1String("}") || |
| 120 |
5/5✓ Branch 123 → 124 taken 125 times.
✓ Branch 124 → 125 taken 32 times.
✓ Branch 124 → 126 taken 93 times.
✓ Branch 127 → 128 taken 63 times.
✓ Branch 127 → 129 taken 93 times.
|
281 | line.startsWith(QLatin1String("# rule:["))) |
| 121 | 63 | continue; | |
| 122 |
1/1✓ Branch 129 → 130 taken 93 times.
|
93 | excerpt.append(line); |
| 123 | 156 | } | |
| 124 |
1/1✓ Branch 146 → 147 taken 62 times.
|
62 | row.excerpt = excerpt.join(QLatin1Char('\n')); |
| 125 | 62 | row.plainSentence = row.excerpt; | |
| 126 |
1/1✓ Branch 150 → 151 taken 62 times.
|
62 | row.sentence = row.excerpt.toHtmlEscaped(); |
| 127 | 62 | } | |
| 128 |
1/3✓ Branch 160 → 161 taken 1137 times.
✗ Branch 253 → 254 not taken.
✗ Branch 253 → 255 not taken.
|
2274 | QString base = block.named ? row.kind + QLatin1Char(':') + block.name |
| 129 |
3/5✓ Branch 168 → 169 taken 30 times.
✓ Branch 170 → 171 taken 30 times.
✓ Branch 170 → 172 taken 1137 times.
✗ Branch 234 → 235 not taken.
✗ Branch 234 → 236 not taken.
|
1197 | : row.kind + QLatin1Char(':') + |
| 130 |
6/10✓ Branch 163 → 164 taken 30 times.
✓ Branch 165 → 166 taken 30 times.
✓ Branch 172 → 173 taken 30 times.
✓ Branch 172 → 174 taken 1137 times.
✓ Branch 178 → 179 taken 1137 times.
✓ Branch 178 → 180 taken 30 times.
✗ Branch 240 → 241 not taken.
✗ Branch 240 → 242 not taken.
✗ Branch 248 → 249 not taken.
✗ Branch 248 → 250 not taken.
|
2394 | QString::fromLatin1(QCryptographicHash::hash( |
| 131 |
9/11✓ Branch 157 → 158 taken 1137 times.
✓ Branch 157 → 162 taken 30 times.
✓ Branch 161 → 170 taken 1137 times.
✓ Branch 164 → 165 taken 30 times.
✓ Branch 169 → 170 taken 30 times.
✓ Branch 174 → 175 taken 30 times.
✓ Branch 174 → 176 taken 1137 times.
✓ Branch 176 → 177 taken 30 times.
✓ Branch 176 → 178 taken 1137 times.
✗ Branch 244 → 245 not taken.
✗ Branch 244 → 246 not taken.
|
3561 | block.original, QCryptographicHash::Sha1).toHex()); |
| 132 |
4/4✓ Branch 180 → 181 taken 1167 times.
✓ Branch 181 → 182 taken 1167 times.
✓ Branch 184 → 185 taken 1167 times.
✓ Branch 185 → 186 taken 1167 times.
|
1167 | row.key = base + QLatin1Char('#') + QString::number(occurrences[base]++); |
| 133 |
1/1✓ Branch 190 → 191 taken 1167 times.
|
1167 | rows.append(row); |
| 134 | 1167 | } | |
| 135 | 164 | return rows; | |
| 136 | 164 | } | |
| 137 | |||
| 138 | 1222 | bool QuickRuleModel::accepts(const Row &row) const { | |
| 139 |
4/4✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 5 taken 1219 times.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 1 time.
|
1222 | if (m_offOnly && row.enabled) |
| 140 | 2 | return false; | |
| 141 |
7/8✓ Branch 5 → 6 taken 3 times.
✓ Branch 5 → 11 taken 1217 times.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 11 taken 2 times.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 11 not taken.
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 14 taken 1219 times.
|
1220 | if (m_problemsOnly && row.health.isEmpty() && row.unsupported.isEmpty()) |
| 142 | 1 | return false; | |
| 143 |
2/2✓ Branch 17 → 18 taken 25 times.
✓ Branch 17 → 29 taken 6 times.
|
31 | if (!m_folder.isEmpty() && row.target != m_folder && |
| 144 |
8/10✓ Branch 15 → 16 taken 31 times.
✓ Branch 15 → 29 taken 1188 times.
✓ Branch 20 → 21 taken 25 times.
✓ Branch 21 → 22 taken 25 times.
✓ Branch 22 → 23 taken 24 times.
✓ Branch 22 → 29 taken 1 time.
✓ Branch 34 → 35 taken 24 times.
✓ Branch 34 → 36 taken 1195 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
|
2493 | !row.target.startsWith(m_folder + QLatin1Char('/')) && |
| 145 |
7/10✓ Branch 25 → 26 taken 24 times.
✓ Branch 26 → 27 taken 24 times.
✓ Branch 27 → 28 taken 24 times.
✗ Branch 27 → 29 not taken.
✓ Branch 30 → 31 taken 24 times.
✓ Branch 30 → 32 taken 1195 times.
✓ Branch 32 → 33 taken 25 times.
✓ Branch 32 → 34 taken 1194 times.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
|
1243 | !row.target.startsWith(m_folder + QLatin1Char('.'))) |
| 146 | 24 | return false; | |
| 147 |
2/2✓ Branch 39 → 40 taken 2 times.
✓ Branch 39 → 45 taken 1 time.
|
1198 | if (!m_text.isEmpty() && !row.name.contains(m_text, Qt::CaseInsensitive) && |
| 148 |
5/6✓ Branch 37 → 38 taken 3 times.
✓ Branch 37 → 45 taken 1192 times.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 45 not taken.
✓ Branch 46 → 47 taken 2 times.
✓ Branch 46 → 48 taken 1193 times.
|
1200 | !row.plainSentence.contains(m_text, Qt::CaseInsensitive) && |
| 149 |
1/2✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 45 not taken.
|
2 | !row.target.contains(m_text, Qt::CaseInsensitive)) |
| 150 | 2 | return false; | |
| 151 | 1193 | return true; | |
| 152 | } | ||
| 153 | |||
| 154 | 964 | void QuickRuleModel::setRows(const QList<Row> &rows) { | |
| 155 | 964 | m_all = rows; | |
| 156 | 964 | QList<Row> target; | |
| 157 |
4/4✓ Branch 3 → 4 taken 964 times.
✓ Branch 4 → 5 taken 964 times.
✓ Branch 12 → 6 taken 1167 times.
✓ Branch 12 → 13 taken 964 times.
|
2131 | for (const Row &row : m_all) |
| 158 |
3/3✓ Branch 7 → 8 taken 1167 times.
✓ Branch 8 → 9 taken 1156 times.
✓ Branch 8 → 10 taken 11 times.
|
1167 | if (accepts(row)) |
| 159 |
1/1✓ Branch 9 → 10 taken 1156 times.
|
1156 | target.append(row); |
| 160 |
1/1✓ Branch 13 → 14 taken 964 times.
|
964 | applyVisible(target); |
| 161 | 964 | } | |
| 162 | |||
| 163 | // Keyed incremental update of the visible rows: removals, moves, inserts | ||
| 164 | // and dataChanged — never a reset (S95.3.2). | ||
| 165 | 964 | void QuickRuleModel::applyVisible(const QList<Row> &target) { | |
| 166 | 964 | const int before = m_rows.size(); | |
| 167 | 964 | QSet<QString> wanted; | |
| 168 |
2/2✓ Branch 10 → 6 taken 1156 times.
✓ Branch 10 → 11 taken 964 times.
|
2120 | for (const Row &row : target) |
| 169 |
1/1✓ Branch 7 → 8 taken 1156 times.
|
1156 | wanted.insert(row.key); |
| 170 |
2/2✓ Branch 22 → 13 taken 402 times.
✓ Branch 22 → 23 taken 964 times.
|
1366 | for (int i = m_rows.size() - 1; i >= 0; --i) { |
| 171 |
2/2✓ Branch 15 → 16 taken 383 times.
✓ Branch 15 → 17 taken 19 times.
|
402 | if (wanted.contains(m_rows.at(i).key)) |
| 172 | 383 | continue; | |
| 173 |
1/1✓ Branch 18 → 19 taken 19 times.
|
19 | beginRemoveRows({}, i, i); |
| 174 |
1/1✓ Branch 19 → 20 taken 19 times.
|
19 | m_rows.removeAt(i); |
| 175 |
1/1✓ Branch 20 → 21 taken 19 times.
|
19 | endRemoveRows(); |
| 176 | } | ||
| 177 |
2/2✓ Branch 60 → 24 taken 1156 times.
✓ Branch 60 → 61 taken 964 times.
|
2120 | for (int i = 0; i < target.size(); ++i) { |
| 178 | 1156 | const Row &row = target.at(i); | |
| 179 | 1156 | int found = -1; | |
| 180 |
2/2✓ Branch 32 → 26 taken 402 times.
✓ Branch 32 → 33 taken 773 times.
|
1175 | for (int j = i; j < m_rows.size(); ++j) |
| 181 |
2/2✓ Branch 28 → 29 taken 383 times.
✓ Branch 28 → 30 taken 19 times.
|
402 | if (m_rows.at(j).key == row.key) { |
| 182 | 383 | found = j; | |
| 183 | 383 | break; | |
| 184 | } | ||
| 185 |
2/2✓ Branch 33 → 34 taken 773 times.
✓ Branch 33 → 39 taken 383 times.
|
1156 | if (found < 0) { |
| 186 |
1/1✓ Branch 35 → 36 taken 773 times.
|
773 | beginInsertRows({}, i, i); |
| 187 |
1/1✓ Branch 36 → 37 taken 773 times.
|
773 | m_rows.insert(i, row); |
| 188 |
1/1✓ Branch 37 → 38 taken 773 times.
|
773 | endInsertRows(); |
| 189 | 773 | continue; | |
| 190 | } | ||
| 191 |
2/2✓ Branch 39 → 40 taken 3 times.
✓ Branch 39 → 45 taken 380 times.
|
383 | if (found != i) { |
| 192 |
1/1✓ Branch 42 → 43 taken 3 times.
|
3 | beginMoveRows({}, found, found, {}, i); |
| 193 |
1/1✓ Branch 43 → 44 taken 3 times.
|
3 | m_rows.move(found, i); |
| 194 |
1/1✓ Branch 44 → 45 taken 3 times.
|
3 | endMoveRows(); |
| 195 | } | ||
| 196 |
3/3✓ Branch 46 → 47 taken 383 times.
✓ Branch 47 → 48 taken 123 times.
✓ Branch 47 → 58 taken 260 times.
|
383 | if (!(m_rows.at(i) == row)) { |
| 197 |
1/1✓ Branch 48 → 49 taken 123 times.
|
123 | m_rows[i] = row; |
| 198 |
3/3✓ Branch 52 → 53 taken 123 times.
✓ Branch 54 → 55 taken 123 times.
✓ Branch 55 → 56 taken 123 times.
|
123 | emit dataChanged(index(i), index(i)); |
| 199 | } | ||
| 200 | } | ||
| 201 |
2/2✓ Branch 62 → 63 taken 99 times.
✓ Branch 62 → 64 taken 865 times.
|
964 | if (before != m_rows.size()) |
| 202 |
1/1✓ Branch 63 → 64 taken 99 times.
|
99 | emit countChanged(); |
| 203 | 964 | } | |
| 204 | |||
| 205 | 12 | void QuickRuleModel::setFilter(const QString &text, const QString &folder, bool problemsOnly, | |
| 206 | bool offOnly) { | ||
| 207 |
8/10✓ Branch 3 → 4 taken 10 times.
✓ Branch 3 → 9 taken 2 times.
✓ Branch 5 → 6 taken 4 times.
✓ Branch 5 → 9 taken 6 times.
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 9 taken 2 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 2 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 12 times.
|
12 | if (text == m_text && folder == m_folder && problemsOnly == m_problemsOnly && offOnly == m_offOnly) |
| 208 | ✗ | return; | |
| 209 |
1/1✓ Branch 12 → 13 taken 12 times.
|
12 | m_text = text.trimmed(); |
| 210 | 12 | m_folder = folder; | |
| 211 | 12 | m_problemsOnly = problemsOnly; | |
| 212 | 12 | m_offOnly = offOnly; | |
| 213 | 12 | beginResetModel(); | |
| 214 | 12 | m_rows.clear(); | |
| 215 |
4/4✓ Branch 18 → 19 taken 12 times.
✓ Branch 19 → 20 taken 12 times.
✓ Branch 27 → 21 taken 55 times.
✓ Branch 27 → 28 taken 12 times.
|
67 | for (const Row &row : m_all) |
| 216 |
3/3✓ Branch 22 → 23 taken 55 times.
✓ Branch 23 → 24 taken 37 times.
✓ Branch 23 → 25 taken 18 times.
|
55 | if (accepts(row)) |
| 217 |
1/1✓ Branch 24 → 25 taken 37 times.
|
37 | m_rows.append(row); |
| 218 | 12 | endResetModel(); | |
| 219 | 12 | emit countChanged(); | |
| 220 | } | ||
| 221 | |||
| 222 | ✗ | void QuickRuleModel::setMatchCount(const QString &key, const QString &text) { | |
| 223 | ✗ | for (Row &row : m_all) | |
| 224 | ✗ | if (row.key == key) | |
| 225 | ✗ | row.matchCount = text; | |
| 226 | ✗ | for (int i = 0; i < m_rows.size(); ++i) | |
| 227 | ✗ | if (m_rows.at(i).key == key && m_rows.at(i).matchCount != text) { | |
| 228 | ✗ | m_rows[i].matchCount = text; | |
| 229 | ✗ | emit dataChanged(index(i), index(i), {MatchCountRole}); | |
| 230 | } | ||
| 231 | ✗ | } | |
| 232 | |||
| 233 | 13 | int QuickRuleModel::blockIndexAt(int row) const { | |
| 234 |
3/4✓ Branch 2 → 3 taken 13 times.
✗ Branch 2 → 7 not taken.
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 7 taken 1 time.
|
13 | return row >= 0 && row < m_rows.size() ? m_rows.at(row).blockIndex : -1; |
| 235 | } | ||
| 236 | |||
| 237 | 5 | int QuickRuleModel::rowForBlock(int blockIndex) const { | |
| 238 |
2/2✓ Branch 8 → 3 taken 29 times.
✓ Branch 8 → 9 taken 1 time.
|
30 | for (int i = 0; i < m_rows.size(); ++i) |
| 239 |
2/2✓ Branch 4 → 5 taken 4 times.
✓ Branch 4 → 6 taken 25 times.
|
29 | if (m_rows.at(i).blockIndex == blockIndex) |
| 240 | 4 | return i; | |
| 241 | 1 | return -1; | |
| 242 | } | ||
| 243 | |||
| 244 | 2 | QString QuickRuleModel::keyAt(int row) const { | |
| 245 |
3/4✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 7 taken 1 time.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 7 not taken.
|
2 | return row >= 0 && row < m_rows.size() ? m_rows.at(row).key : QString(); |
| 246 | } | ||
| 247 | |||
| 248 | 89 | int QuickRuleModel::problemCount() const { | |
| 249 | 89 | int count = 0; | |
| 250 |
2/2✓ Branch 15 → 4 taken 613 times.
✓ Branch 15 → 16 taken 89 times.
|
702 | for (const Row &row : m_all) |
| 251 |
5/6✓ Branch 6 → 7 taken 551 times.
✓ Branch 6 → 9 taken 62 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 551 times.
✓ Branch 11 → 12 taken 62 times.
✓ Branch 11 → 13 taken 551 times.
|
613 | if (!row.health.isEmpty() || !row.unsupported.isEmpty()) |
| 252 | 62 | ++count; | |
| 253 | 89 | return count; | |
| 254 | } | ||
| 255 | |||
| 256 | 44 | int QuickRuleModel::offCount() const { | |
| 257 | 44 | int count = 0; | |
| 258 |
2/2✓ Branch 9 → 4 taken 306 times.
✓ Branch 9 → 10 taken 44 times.
|
350 | for (const Row &row : m_all) |
| 259 |
2/2✓ Branch 5 → 6 taken 67 times.
✓ Branch 5 → 7 taken 239 times.
|
306 | if (!row.enabled) |
| 260 | 67 | ++count; | |
| 261 | 44 | return count; | |
| 262 | } | ||
| 263 | |||
| 264 | 263 | QStringList QuickRuleModel::targets() const { | |
| 265 | 263 | QStringList result; | |
| 266 |
2/2✓ Branch 15 → 4 taken 2331 times.
✓ Branch 15 → 16 taken 263 times.
|
2594 | for (const Row &row : m_all) |
| 267 |
6/6✓ Branch 6 → 7 taken 1853 times.
✓ Branch 6 → 10 taken 478 times.
✓ Branch 8 → 9 taken 1682 times.
✓ Branch 8 → 10 taken 171 times.
✓ Branch 11 → 12 taken 1682 times.
✓ Branch 11 → 13 taken 649 times.
|
2331 | if (!row.target.isEmpty() && !result.contains(row.target)) |
| 268 |
1/1✓ Branch 12 → 13 taken 1682 times.
|
1682 | result.append(row.target); |
| 269 |
1/1✓ Branch 16 → 17 taken 263 times.
|
263 | result.sort(Qt::CaseInsensitive); |
| 270 | 263 | return result; | |
| 271 | ✗ | } | |
| 272 |