MCPcopy Create free account
hub / github.com/PolyMC/PolyMC / applyUpdates

Method applyUpdates

launcher/minecraft/mod/ResourceFolderModel.h:237–332  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

235/* Template definition to avoid some code duplication */
236template <typename T>
237void 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();

Callers

nothing calls this directly

Calls 15

QModelIndexClass · 0.85
dateTimeChangedMethod · 0.80
isResolvingMethod · 0.80
resolutionTicketMethod · 0.80
appendMethod · 0.80
beginMethod · 0.80
endMethod · 0.80
internal_idMethod · 0.80
atMethod · 0.45
containsMethod · 0.45
getMethod · 0.45
findMethod · 0.45

Tested by

no test coverage detected