aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-04-07 15:01:47 +0200
committerdec05eba <dec05eba@protonmail.com>2022-04-08 23:37:43 +0200
commit1406ea55305666958d265855cf400e7fc1cdbbf7 (patch)
tree07dfe40df98cf8939c7f1bcc73188b1ad3a1073c /src
parent8433b0f6f7414a040b25b34515d75b907c584321 (diff)
4chan: move replies text to reactions, clear reactions when not visible on screen
Diffstat (limited to 'src')
-rw-r--r--src/Body.cpp83
-rw-r--r--src/BodyItem.cpp17
-rw-r--r--src/QuickMedia.cpp2
-rw-r--r--src/plugins/Fourchan.cpp2
4 files changed, 65 insertions, 39 deletions
diff --git a/src/Body.cpp b/src/Body.cpp
index 6bf816d..c79f836 100644
--- a/src/Body.cpp
+++ b/src/Body.cpp
@@ -100,7 +100,6 @@ namespace QuickMedia {
prev_selected_item(0),
loading_icon(&loading_icon_texture),
progress_text("", *FontLoader::get_font(FontLoader::FontType::LATIN, get_config().body.progress_font_size * get_config().scale * get_config().font_scale)),
- replies_text("", *FontLoader::get_font(FontLoader::FontType::LATIN, get_config().body.replies_font_size * get_config().scale * get_config().font_scale)),
embedded_item_load_text("", *FontLoader::get_font(FontLoader::FontType::LATIN, body_spacing[body_theme].embedded_item_font_size)),
num_visible_items(0),
top_cut_off(false),
@@ -111,7 +110,6 @@ namespace QuickMedia {
rounded_rectangle_mask_shader(rounded_rectangle_mask_shader)
{
progress_text.set_color(get_theme().text_color);
- replies_text.set_color(get_theme().replies_text_color);
thumbnail_max_size.x = 600;
thumbnail_max_size.y = 337;
mgl::vec2f loading_icon_size(loading_icon.get_texture()->get_size().x, loading_icon.get_texture()->get_size().y);
@@ -925,6 +923,20 @@ namespace QuickMedia {
body_item->timestamp_text->set_color(get_theme().timestamp_text_color);
}
}
+
+ if((body_item->dirty_reactions && !body_item->reactions.empty()) || (body_size_changed && !body_item->reactions.empty() && body_item->reactions.front().text)) {
+ body_item->dirty_reactions = false;
+ for(auto &reaction : body_item->reactions) {
+ if(reaction.text) {
+ reaction.text->setString(reaction.text_str);
+ reaction.text->setMaxWidth(width);
+ } else {
+ reaction.text = std::make_unique<Text>(reaction.text_str, false, floor(get_config().body.reaction_font_size * get_config().scale * get_config().font_scale), width);
+ }
+ reaction.text->set_color(reaction.text_color);
+ reaction.size = { 0.0f, 0.0f };
+ }
+ }
}
void Body::clear_body_item_cache(BodyItem *body_item) {
@@ -944,6 +956,12 @@ namespace QuickMedia {
body_item->timestamp_text.reset();
body_item->dirty_timestamp = true;
}
+ if(!body_item->reactions.empty()) {
+ for(auto &reaction : body_item->reactions) {
+ reaction.text.reset();
+ }
+ body_item->dirty_reactions = true;
+ }
body_item->keep_alive_frames = 0;
}
@@ -1429,20 +1447,6 @@ namespace QuickMedia {
if(item->author_text && !merge_with_previous) {
item->author_text->set_position(vec2f_floor(item_pos.x + text_offset_x, item_pos.y + padding_y - text_offset_y));
item->author_text->draw(window);
-
- mgl::vec2f replies_text_pos = item->author_text->get_position();
- replies_text_pos.x += item->author_text->getWidth() + 5.0f;
- replies_text.set_position(replies_text_pos);
-
- std::string replies_text_str;
- for(size_t reply_index : item->replies) {
- BodyItem *reply_item = items[reply_index].get();
- replies_text_str += " >>";
- replies_text_str += reply_item->post_number;
- }
- replies_text.set_string(std::move(replies_text_str));
- window.draw(replies_text);
-
item_pos.y += item->author_text->getHeight() - 2.0f + std::floor(3.0f * get_config().scale);
}
@@ -1483,21 +1487,27 @@ namespace QuickMedia {
float reaction_offset_x = 0.0f;
item_pos.y += body_spacing[body_theme].reaction_padding_y;
float reaction_max_height = 0.0f;
- // TODO: Fix first row wrap-around
+ int row = 0;
for(int i = 0; i < (int)item->reactions.size(); ++i) {
auto &reaction = item->reactions[i];
reaction.text->updateGeometry();
- reaction_max_height = std::max(reaction_max_height, reaction.text->getHeight());
- reaction.text->set_position(vec2f_floor(item_pos.x + text_offset_x + reaction_offset_x + body_spacing[body_theme].reaction_background_padding_x, item_pos.y + padding_y - 4.0f + body_spacing[body_theme].reaction_background_padding_y));
- reaction_background.set_position(vec2f_floor(item_pos.x + text_offset_x + reaction_offset_x, item_pos.y + padding_y));
- reaction_background.set_size(mgl::vec2f(reaction.text->getWidth() + body_spacing[body_theme].reaction_background_padding_x * 2.0f, reaction.text->getHeight() + body_spacing[body_theme].reaction_background_padding_y * 2.0f));
+ reaction.size = { reaction.text->getWidth(), reaction.text->getHeight() };
+ reaction_max_height = std::max(reaction_max_height, reaction.size.y);
+ reaction_background.set_size(mgl::vec2f(reaction.size.x + body_spacing[body_theme].reaction_background_padding_x * 2.0f, reaction.size.y + body_spacing[body_theme].reaction_background_padding_y * 2.0f));
reaction_background.draw(window);
- reaction_offset_x += reaction.text->getWidth() + body_spacing[body_theme].reaction_background_padding_x * 2.0f + body_spacing[body_theme].reaction_spacing_x;
+
+ const float new_reaction_offset_x = reaction.size.x + body_spacing[body_theme].reaction_background_padding_x * 2.0f + body_spacing[body_theme].reaction_spacing_x;
reaction.text->draw(window);
- if(text_offset_x + reaction_offset_x + reaction.text->getWidth() + body_spacing[body_theme].reaction_background_padding_x * 2.0f > size.x && i < (int)item->reactions.size() - 1) {
+ if(text_offset_x + new_reaction_offset_x > size.x && row != 0) {
reaction_offset_x = 0.0f;
- item_pos.y += reaction.text->getHeight() + body_spacing[body_theme].reaction_padding_y + text_offset_y;
- reaction_max_height = reaction.text->getHeight();
+ item_pos.y += reaction_max_height + body_spacing[body_theme].reaction_padding_y + text_offset_y;
+ reaction_max_height = reaction.size.y;
+ row = 0;
+ } else {
+ reaction_background.set_position(vec2f_floor(item_pos.x + text_offset_x + reaction_offset_x, item_pos.y + padding_y));
+ reaction.text->set_position(vec2f_floor(item_pos.x + text_offset_x + reaction_offset_x + body_spacing[body_theme].reaction_background_padding_x, item_pos.y + padding_y - 4.0f + body_spacing[body_theme].reaction_background_padding_y));
+ reaction_offset_x = new_reaction_offset_x;
+ ++row;
}
}
item_pos.y += reaction_max_height + body_spacing[body_theme].reaction_padding_y;
@@ -1705,16 +1715,25 @@ namespace QuickMedia {
float reaction_offset_x = 0.0f;
item_height += body_spacing[body_theme].reaction_padding_y;
float reaction_max_height = 0.0f;
+ int row = 0;
for(int i = 0; i < (int)item->reactions.size(); ++i) {
auto &reaction = item->reactions[i];
- reaction.text->setMaxWidth(text_max_width);
- reaction.text->updateGeometry();
- reaction_max_height = std::max(reaction_max_height, reaction.text->getHeight());
- reaction_offset_x += reaction.text->getWidth() + body_spacing[body_theme].reaction_background_padding_x * 2.0f + body_spacing[body_theme].reaction_spacing_x;
- if(text_offset_x + reaction_offset_x + reaction.text->getWidth() + body_spacing[body_theme].reaction_background_padding_x * 2.0f > width && i < (int)item->reactions.size() - 1) {
+ if(reaction.size.x < 0.001f && reaction.text) {
+ reaction.text->setMaxWidth(text_max_width);
+ reaction.text->updateGeometry();
+ reaction.size = { reaction.text->getWidth(), reaction.text->getHeight() };
+ }
+ reaction_max_height = std::max(reaction_max_height, reaction.size.y);
+
+ const float new_reaction_offset_x = reaction.size.x + body_spacing[body_theme].reaction_background_padding_x * 2.0f + body_spacing[body_theme].reaction_spacing_x;
+ if(text_offset_x + new_reaction_offset_x > width && row != 0) {
reaction_offset_x = 0.0f;
- item_height += reaction.text->getHeight() + body_spacing[body_theme].reaction_padding_y + std::floor(6.0f * get_config().scale);
- reaction_max_height = reaction.text->getHeight();
+ item_height += reaction_max_height + body_spacing[body_theme].reaction_padding_y + std::floor(6.0f * get_config().scale);
+ reaction_max_height = reaction.size.y;
+ row = 0;
+ } else {
+ reaction_offset_x = new_reaction_offset_x;
+ ++row;
}
}
item_height += reaction_max_height + body_spacing[body_theme].reaction_padding_y;
diff --git a/src/BodyItem.cpp b/src/BodyItem.cpp
index 0c6e1ce..431616d 100644
--- a/src/BodyItem.cpp
+++ b/src/BodyItem.cpp
@@ -3,10 +3,6 @@
#include "../include/Config.hpp"
namespace QuickMedia {
- static float floor(float v) {
- return (int)v;
- }
-
// static
std::shared_ptr<BodyItem> BodyItem::create(std::string title, bool selectable) {
return std::shared_ptr<BodyItem>(new BodyItem(std::move(title), selectable));
@@ -18,6 +14,7 @@ namespace QuickMedia {
dirty_description(false),
dirty_author(false),
dirty_timestamp(false),
+ dirty_reactions(false),
thumbnail_is_local(false),
userdata(nullptr),
timestamp(0),
@@ -38,6 +35,7 @@ namespace QuickMedia {
dirty_description = !other.description.empty();
dirty_author = !other.author.empty();
dirty_timestamp = other.timestamp != 0;
+ dirty_reactions = !other.reactions.empty();
thumbnail_is_local = other.thumbnail_is_local;
title_text.reset();
description_text.reset();
@@ -79,11 +77,18 @@ namespace QuickMedia {
return *this;
}
- void BodyItem::add_reaction(std::string text, void *userdata) {
+ void BodyItem::add_reaction(std::string text, void *userdata, mgl::Color text_color) {
Reaction reaction;
- reaction.text = std::make_unique<Text>(std::move(text), false, floor(get_config().body.reaction_font_size * get_config().scale * get_config().font_scale), 0.0f);
+ reaction.text_str = std::move(text);
+ reaction.text = nullptr;
reaction.userdata = userdata;
+ reaction.text_color = text_color;
reactions.push_back(std::move(reaction));
+ dirty_reactions = true;
+ }
+
+ void BodyItem::add_reaction(std::string text, void *userdata) {
+ add_reaction(std::move(text), userdata, get_theme().text_color);
}
void BodyItem::draw_list(Body *body, mgl::Window &render_target) {
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 45c0bd1..b83f64a 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -7054,7 +7054,7 @@ namespace QuickMedia {
chat_input_shade.set_position(mgl::vec2f(body_pos.x, window_size.y - chat_input_shade.get_size().y));
chat_input.set_max_width(window_size.x - (logo_padding_x + logo_size.x + chat_input_padding_x + logo_padding_x + body_pos.x));
- chat_input.set_position(vec2f_floor(body_pos.x + logo_padding_x + logo_size.x + chat_input_padding_x, window_size.y - chat_height - chat_input_padding_y - 5.0f * get_config().scale));
+ chat_input.set_position(vec2f_floor(body_pos.x + logo_padding_x + logo_size.x + chat_input_padding_x, window_size.y - chat_height - chat_input_padding_y));
more_messages_below_rect.set_size(mgl::vec2f(chat_input_shade.get_size().x, gradient_height));
more_messages_below_rect.set_position(mgl::vec2f(chat_input_shade.get_position().x, std::floor(window_size.y - chat_input_height_full - gradient_height)));
diff --git a/src/plugins/Fourchan.cpp b/src/plugins/Fourchan.cpp
index 51a3cc5..4522a56 100644
--- a/src/plugins/Fourchan.cpp
+++ b/src/plugins/Fourchan.cpp
@@ -4,6 +4,7 @@
#include "../../include/StringUtils.hpp"
#include "../../include/NetUtils.hpp"
#include "../../include/Notification.hpp"
+#include "../../include/Theme.hpp"
#include "../../external/cppcodec/base64_rfc4648.hpp"
#include "../../include/QuickMedia.hpp"
#include <HtmlParser.h>
@@ -273,6 +274,7 @@ namespace QuickMedia {
} else {
result_items[body_item_index]->replies_to.push_back(it->second);
result_items[it->second]->replies.push_back(body_item_index);
+ result_items[it->second]->add_reaction(">>" + result_items[body_item_index]->post_number, nullptr, get_theme().replies_text_color);
}
break;
}