[core] use stale sprite data
This is a naïve implementation that essentially merges updated data into existing data. It will *not* remove icons from the stale sprite if they aren't present in the fresh sprite (we aren't tracking the source of a sprite, and the user could have changed it as well). Similarly, it will not update icons that have changed in dimension. This is a rare edge case and probably not worth implementing.
This commit is contained in:
@@ -40,15 +40,17 @@ void SpriteStore::setURL(const std::string& url) {
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
loader->jsonRequest = fs->request({ Resource::Kind::SpriteJSON, jsonURL },
|
||||
[this, jsonURL](Response res) {
|
||||
if (res.stale) {
|
||||
// Only handle fresh responses.
|
||||
return;
|
||||
}
|
||||
loader->jsonRequest = nullptr;
|
||||
|
||||
if (res.error) {
|
||||
observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
|
||||
} else {
|
||||
}
|
||||
|
||||
if (res.notModified) {
|
||||
// We got the same data back as last time. Abort early.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!loader->json || *loader->json != *res.data) {
|
||||
// Only trigger a sprite loaded event we got new data.
|
||||
loader->json = res.data;
|
||||
emitSpriteLoadedIfComplete();
|
||||
}
|
||||
@@ -57,15 +59,16 @@ void SpriteStore::setURL(const std::string& url) {
|
||||
loader->spriteRequest =
|
||||
fs->request({ Resource::Kind::SpriteImage, spriteURL },
|
||||
[this, spriteURL](Response res) {
|
||||
if (res.stale) {
|
||||
// Only handle fresh responses.
|
||||
return;
|
||||
}
|
||||
loader->spriteRequest = nullptr;
|
||||
|
||||
if (res.error) {
|
||||
observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
|
||||
} else {
|
||||
}
|
||||
|
||||
if (res.notModified) {
|
||||
// We got the same data back as last time. Abort early.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!loader->image || *loader->image != *res.data) {
|
||||
loader->image = res.data;
|
||||
emitSpriteLoadedIfComplete();
|
||||
}
|
||||
@@ -79,8 +82,7 @@ void SpriteStore::emitSpriteLoadedIfComplete() {
|
||||
return;
|
||||
}
|
||||
|
||||
auto local = std::move(loader);
|
||||
auto result = parseSprite(*local->image, *local->json);
|
||||
auto result = parseSprite(*loader->image, *loader->json);
|
||||
if (result.is<Sprites>()) {
|
||||
loaded = true;
|
||||
setSprites(result.get<Sprites>());
|
||||
|
||||
Reference in New Issue
Block a user