aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-14 17:37:38 +0200
committerdec05eba <dec05eba@protonmail.com>2020-10-14 18:15:58 +0200
commitb7885c4536e1e376eb9fe5c3dc720482e84be338 (patch)
treebc520eb8b67b33350f31a2dff16b66c024a3fca9 /src
parente68fd8ebef3ae5e7dd1fbd31a1138519837f95f2 (diff)
Test: fix image loading stutter of body items
Diffstat (limited to 'src')
-rw-r--r--src/Body.cpp69
1 files changed, 41 insertions, 28 deletions
diff --git a/src/Body.cpp b/src/Body.cpp
index ac63e0f..75706c1 100644
--- a/src/Body.cpp
+++ b/src/Body.cpp
@@ -361,7 +361,7 @@ namespace QuickMedia {
int i = prev_selected_item;
while(num_items_scrolled < selected_int_diff_abs && i < num_items) {
if(items[i]->visible) {
- page_scroll += (get_item_height(items[i].get()) + spacing_y);
+ page_scroll += (get_item_height(items[i].get(), selected_int_diff_abs < 50) + spacing_y);
}
++num_items_scrolled;
++i;
@@ -372,7 +372,7 @@ namespace QuickMedia {
int i = prev_selected_item - 1;
while(num_items_scrolled < selected_int_diff_abs && i >= 0) {
if(items[i]->visible) {
- page_scroll -= (get_item_height(items[i].get()) + spacing_y);
+ page_scroll -= (get_item_height(items[i].get(), selected_int_diff_abs < 50) + spacing_y);
}
++num_items_scrolled;
--i;
@@ -561,28 +561,15 @@ namespace QuickMedia {
void Body::draw_item(sf::RenderWindow &window, BodyItem *item, const sf::Vector2f &pos, const sf::Vector2f &size, const float item_height, const int item_index, const Json::Value &content_progress) {
// TODO: Instead of generating a new hash everytime to access textures, cache the hash of the thumbnail url
std::shared_ptr<ThumbnailData> item_thumbnail;
- auto item_thumbnail_it = item_thumbnail_textures.find(item->thumbnail_url);
- if(item_thumbnail_it == item_thumbnail_textures.end()) {
- item_thumbnail = std::make_shared<ThumbnailData>();
- item_thumbnail_textures.insert(std::make_pair(item->thumbnail_url, item_thumbnail));
- } else {
- item_thumbnail = item_thumbnail_it->second;
- }
- item_thumbnail->referenced = true;
-
if(draw_thumbnails) {
- if(!item->thumbnail_url.empty() && item_thumbnail->loading_state == LoadingState::NOT_LOADED) {
- async_image_loader.load_thumbnail(item->thumbnail_url, item->thumbnail_is_local, thumbnail_resize_target_size, program->is_tor_enabled(), item_thumbnail);
- }
-
- if(item_thumbnail->loading_state == LoadingState::FINISHED_LOADING && item_thumbnail->image->getSize().x > 0 && item_thumbnail->image->getSize().y > 0) {
- if(!item_thumbnail->texture.loadFromImage(*item_thumbnail->image))
- fprintf(stderr, "Warning: failed to load texture from image: %s\n", item->thumbnail_url.c_str());
- //item_thumbnail->texture.setSmooth(true);
- //item_thumbnail->texture.generateMipmap();
- item_thumbnail->image.reset();
- item_thumbnail->loading_state = LoadingState::APPLIED_TO_TEXTURE;
+ auto item_thumbnail_it = item_thumbnail_textures.find(item->thumbnail_url);
+ if(item_thumbnail_it == item_thumbnail_textures.end()) {
+ item_thumbnail = std::make_shared<ThumbnailData>();
+ item_thumbnail_textures.insert(std::make_pair(item->thumbnail_url, item_thumbnail));
+ } else {
+ item_thumbnail = item_thumbnail_it->second;
}
+ item_thumbnail->referenced = true;
}
sf::Vector2f item_pos;
@@ -686,7 +673,7 @@ namespace QuickMedia {
}
}
- float Body::get_item_height(BodyItem *item) {
+ float Body::get_item_height(BodyItem *item, bool load_texture) {
float item_height = 0.0f;
if(item->title_text) {
item_height += item->title_text->getHeight() - 2.0f;
@@ -699,14 +686,40 @@ namespace QuickMedia {
}
if(draw_thumbnails && !item->thumbnail_url.empty()) {
float image_height = image_fallback.getSize().y;
+
+ std::shared_ptr<ThumbnailData> item_thumbnail;
auto item_thumbnail_it = item_thumbnail_textures.find(item->thumbnail_url);
- if(item_thumbnail_it != item_thumbnail_textures.end()) {
- std::shared_ptr<ThumbnailData> &item_thumbnail = item_thumbnail_it->second;
- if(item_thumbnail->loading_state == LoadingState::APPLIED_TO_TEXTURE && item_thumbnail->texture.getNativeHandle() != 0) {
- auto image_size = item_thumbnail->texture.getSize();
- image_height = std::min(image_max_height, (float)image_size.y);
+ if(item_thumbnail_it == item_thumbnail_textures.end()) {
+ if(load_texture) {
+ item_thumbnail = std::make_shared<ThumbnailData>();
+ item_thumbnail_textures.insert(std::make_pair(item->thumbnail_url, item_thumbnail));
}
+ } else {
+ item_thumbnail = item_thumbnail_it->second;
}
+
+ if(load_texture) {
+ item_thumbnail->referenced = true;
+
+ if(!item->thumbnail_url.empty() && item_thumbnail->loading_state == LoadingState::NOT_LOADED) {
+ async_image_loader.load_thumbnail(item->thumbnail_url, item->thumbnail_is_local, thumbnail_resize_target_size, program->is_tor_enabled(), item_thumbnail);
+ }
+
+ if(item_thumbnail->loading_state == LoadingState::FINISHED_LOADING && item_thumbnail->image->getSize().x > 0 && item_thumbnail->image->getSize().y > 0) {
+ if(!item_thumbnail->texture.loadFromImage(*item_thumbnail->image))
+ fprintf(stderr, "Warning: failed to load texture from image: %s\n", item->thumbnail_url.c_str());
+ //item_thumbnail->texture.setSmooth(true);
+ //item_thumbnail->texture.generateMipmap();
+ item_thumbnail->image.reset();
+ item_thumbnail->loading_state = LoadingState::APPLIED_TO_TEXTURE;
+ }
+ }
+
+ if(item_thumbnail && item_thumbnail->loading_state == LoadingState::APPLIED_TO_TEXTURE && item_thumbnail->texture.getNativeHandle() != 0) {
+ auto image_size = item_thumbnail->texture.getSize();
+ image_height = std::min(image_max_height, (float)image_size.y);
+ }
+
item_height = std::max(item_height, image_height);
}
return item_height + padding_y * 2.0f;