| 235 | /* Template definition to avoid some code duplication */ |
| 236 | template <typename T> |
| 237 | void ResourceFolderModel::applyUpdates(QSet<QString>& current_set, QSet<QString>& new_set, QMap<QString, T>& new_resources) |
| 238 | { |
| 239 | // see if the kept resources changed in some way |
| 240 | { |
| 241 | QSet<QString> kept_set = current_set; |
| 242 | kept_set.intersect(new_set); |
| 243 | |
| 244 | for (auto const& kept : kept_set) { |
| 245 | auto row_it = m_resources_index.constFind(kept); |
| 246 | Q_ASSERT(row_it != m_resources_index.constEnd()); |
| 247 | auto row = row_it.value(); |
| 248 | |
| 249 | auto& new_resource = new_resources[kept]; |
| 250 | auto const& current_resource = m_resources.at(row); |
| 251 | |
| 252 | if (new_resource->dateTimeChanged() == current_resource->dateTimeChanged()) { |
| 253 | // no significant change, ignore... |
| 254 | continue; |
| 255 | } |
| 256 | |
| 257 | // If the resource is resolving, but something about it changed, we don't want to |
| 258 | // continue the resolving. |
| 259 | if (current_resource->isResolving()) { |
| 260 | auto ticket = current_resource->resolutionTicket(); |
| 261 | if (m_active_parse_tasks.contains(ticket)) { |
| 262 | auto task = (*m_active_parse_tasks.find(ticket)).get(); |
| 263 | task->abort(); |
| 264 | } |
| 265 | } |
| 266 | |
| 267 | m_resources[row].reset(new_resource); |
| 268 | resolveResource(m_resources.at(row).get()); |
| 269 | emit dataChanged(index(row, 0), index(row, columnCount(QModelIndex()) - 1)); |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | // remove resources no longer present |
| 274 | { |
| 275 | QSet<QString> removed_set = current_set; |
| 276 | removed_set.subtract(new_set); |
| 277 | |
| 278 | QList<int> removed_rows; |
| 279 | for (auto& removed : removed_set) |
| 280 | removed_rows.append(m_resources_index[removed]); |
| 281 | |
| 282 | std::sort(removed_rows.begin(), removed_rows.end(), std::greater<int>()); |
| 283 | |
| 284 | for (auto& removed_index : removed_rows) { |
| 285 | auto removed_it = m_resources.begin() + removed_index; |
| 286 | |
| 287 | Q_ASSERT(removed_it != m_resources.end()); |
| 288 | Q_ASSERT(removed_set.contains(removed_it->get()->internal_id())); |
| 289 | |
| 290 | if ((*removed_it)->isResolving()) { |
| 291 | auto ticket = (*removed_it)->resolutionTicket(); |
| 292 | if (m_active_parse_tasks.contains(ticket)) { |
| 293 | auto task = (*m_active_parse_tasks.find(ticket)).get(); |
| 294 | task->abort(); |
nothing calls this directly
no test coverage detected