aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO2
m---------depends/html-search0
-rw-r--r--include/Body.hpp9
-rw-r--r--src/Body.cpp143
-rw-r--r--src/plugins/Fourchan.cpp2
5 files changed, 35 insertions, 121 deletions
diff --git a/TODO b/TODO
index 96646ee..2d03656 100644
--- a/TODO
+++ b/TODO
@@ -130,4 +130,4 @@ Youtube now requires signing in to view age restricted content. For such videos
Notification race condition when fetching the first notifications page and receiving a notification immediately after the first sync? we might end up with a duplicate notification.
Submit on notifications item in matrix should jump to the message in the room.
Notifications should load their replied-to-message.
-Readd updateGeometry in Body.cpp. They were commented out because they caused a crash in Text.cpp \ No newline at end of file
+Readd copying of Text in Body copy constructor. Find out why we need to make the text dirty on copy. \ No newline at end of file
diff --git a/depends/html-search b/depends/html-search
-Subproject 7edc6c0d896088cb981ea7bf60d929d62c7bb7e
+Subproject fdcdf3e62230b8bf14d9ee22bb067040d173ea7
diff --git a/include/Body.hpp b/include/Body.hpp
index e74d459..2d18bdd 100644
--- a/include/Body.hpp
+++ b/include/Body.hpp
@@ -280,8 +280,6 @@ namespace QuickMedia {
int get_previous_visible_item(int start_index);
// Returns -1 if not found
int get_next_visible_item(int start_index);
- float get_offset_to_first_visible_item(sf::Vector2f body_size);
- float get_offset_to_last_visible_item(sf::Vector2f body_size);
private:
enum class DirtyState {
FALSE,
@@ -289,6 +287,12 @@ namespace QuickMedia {
FORCE_TRUE
};
+ enum class TargetSetState {
+ NOT_SET,
+ SET,
+ APPLIED
+ };
+
Program *program;
int selected_item;
int prev_selected_item;
@@ -338,6 +342,7 @@ namespace QuickMedia {
bool render_selected_item_bg = true;
float item_background_target_pos_y = 0.0f;
float item_background_target_height = 0.0f;
+ TargetSetState target_y_set = TargetSetState::NOT_SET;
// TODO: Instead of using this, add functions for modifying |items| and apply the filter on those new items
DirtyState items_dirty = DirtyState::FALSE;
std::string current_filter;
diff --git a/src/Body.cpp b/src/Body.cpp
index 3ebd715..6d06061 100644
--- a/src/Body.cpp
+++ b/src/Body.cpp
@@ -49,27 +49,15 @@ namespace QuickMedia {
url = other.url;
thumbnail_url = other.thumbnail_url;
visible = other.visible;
- dirty = other.dirty;
- dirty_description = other.dirty_description;
- dirty_author = other.dirty_author;
- dirty_timestamp = other.dirty_timestamp;
+ dirty = !other.title.empty();
+ dirty_description = !other.description.empty();
+ dirty_author = !other.author.empty();
+ dirty_timestamp = other.timestamp != 0;
thumbnail_is_local = other.thumbnail_is_local;
- if(other.title_text)
- title_text = std::make_unique<Text>(*other.title_text);
- else
- title_text = nullptr;
- if(other.description_text)
- description_text = std::make_unique<Text>(*other.description_text);
- else
- description_text = nullptr;
- if(other.author_text)
- author_text = std::make_unique<Text>(*other.author_text);
- else
- author_text = nullptr;
- if(other.timestamp_text)
- timestamp_text = std::make_unique<sf::Text>(*other.timestamp_text);
- else
- timestamp_text = nullptr;
+ title_text.reset();
+ description_text.reset();
+ author_text.reset();
+ timestamp_text.reset();
replies_to = other.replies_to;
replies = other.replies;
post_number = other.post_number;
@@ -80,7 +68,7 @@ namespace QuickMedia {
embedded_item.reset(new BodyItem(""));
*embedded_item = *other.embedded_item;
} else {
- embedded_item = nullptr;
+ embedded_item.reset();
}
thumbnail_mask_type = other.thumbnail_mask_type;
thumbnail_size = other.thumbnail_size;
@@ -494,6 +482,7 @@ namespace QuickMedia {
items_dirty = DirtyState::FALSE;
}
+ body_pos = pos;
const float scissor_y = pos.y;
pos.y = 0.0f;
@@ -512,7 +501,6 @@ namespace QuickMedia {
prev_selected_item = selected_item;
}
- body_pos = pos;
bool body_size_changed = std::abs(size.x - body_size.x) > 0.1f || std::abs(size.y - body_size.y) > 0.1f;
if(body_size_changed) {
body_size = size;
@@ -811,14 +799,20 @@ namespace QuickMedia {
window.setView(new_view);
if(prev_num_visible_items > 0) {
+ bool instant_move = false;
+ if(target_y_set == TargetSetState::SET) {
+ target_y_set = TargetSetState::APPLIED;
+ instant_move = true;
+ }
+
const float item_background_prev_pos_y = item_background.get_position().y;
const float item_background_pos_diff = item_background_target_pos_y - item_background_prev_pos_y;
- const float item_background_move_speed = 50.0f;
+ float item_background_move_speed = instant_move ? 1000.0f : 50.0f;
item_background.set_position(sf::Vector2f(pos.x, item_background_prev_pos_y + (item_background_pos_diff * std::min(1.0f, frame_time * item_background_move_speed))));
const float item_background_prev_height = item_background.get_size().y;
const float item_background_height_diff = item_background_target_height - item_background_prev_height;
- const float item_background_height_speed = 50.0f;
+ const float item_background_height_speed = instant_move ? 1000.0f : 50.0f;
item_background.set_size(sf::Vector2f(size.x, item_background_prev_height + (item_background_height_diff * std::min(1.0f, frame_time * item_background_height_speed))));
if(render_selected_item_bg)
@@ -978,7 +972,7 @@ namespace QuickMedia {
else
body_item->title_text = std::make_unique<Text>(std::move(str), false, std::floor(16 * get_ui_scale()), width, title_mark_urls);
body_item->title_text->setFillColor(body_item->get_title_color());
- //body_item->title_text->updateGeometry();
+ body_item->title_text->updateGeometry();
}
if(body_item->dirty_description) {
@@ -989,7 +983,7 @@ namespace QuickMedia {
else
body_item->description_text = std::make_unique<Text>(std::move(str), false, std::floor(14 * get_ui_scale()), width, true);
body_item->description_text->setFillColor(body_item->get_description_color());
- //body_item->description_text->updateGeometry();
+ body_item->description_text->updateGeometry();
}
if(body_item->dirty_author) {
@@ -1000,7 +994,7 @@ namespace QuickMedia {
else
body_item->author_text = std::make_unique<Text>(std::move(str), true, std::floor(14 * get_ui_scale()), width);
body_item->author_text->setFillColor(body_item->get_author_color());
- //body_item->author_text->updateGeometry();
+ body_item->author_text->updateGeometry();
}
if(body_item->dirty_timestamp) {
@@ -1082,93 +1076,6 @@ namespace QuickMedia {
return -1;
}
- // TODO: Remove
- float Body::get_offset_to_first_visible_item(sf::Vector2f body_size) {
- float start_pos = page_scroll;
- float pos = start_pos;
- for(int i = selected_item - 1; i >= 0;) {
- auto &item = items[i];
-
- // TODO: Find a better solution?
- if(!item->visible) {
- --i;
- continue;
- }
-
- int prev_body_item_index = get_previous_visible_item(i);
- const bool merge_with_previous = body_item_merge_handler && body_item_merge_handler(prev_body_item_index == -1 ? nullptr : items[prev_body_item_index].get(), item.get());
-
- float item_height = get_item_height(item.get(), body_size.x, true, true, merge_with_previous, i);
- float item_height_with_merge = item_height + spacing_y;
- pos -= item_height_with_merge;
-
- if(start_pos - (pos + item_height_with_merge) >= body_size.y) {
- pos = start_pos - body_pos.y;
- break;
- //return body_pos.y;
- }
-
- if(merge_with_previous)
- pos += spacing_y;
-
- i = prev_body_item_index;
- }
-
- //int prev_body_item_index = get_previous_visible_item(selected_item);
- //const bool merge_with_previous = body_item_merge_handler && body_item_merge_handler(prev_body_item_index == -1 ? nullptr : items[prev_body_item_index].get(), items[selected_item].get());
-//
- //pos -= selected_item_height;
- //if(merge_with_previous)
- // pos += spacing_y*2.0f;
-//
- //int next_body_item_index = get_next_visible_item(selected_item);
- //const bool merge_with_next = next_body_item_index != -1 && body_item_merge_handler && body_item_merge_handler(items[selected_item].get(), items[next_body_item_index].get());
- //if(!merge_with_previous && merge_with_next)
- // pos += spacing_y;
-
- return start_pos - pos;
- }
-
- // TODO: Remove
- float Body::get_offset_to_last_visible_item(sf::Vector2f body_size) {
- const int prev_body_item_index = get_previous_visible_item(selected_item);
- BodyItem *prev_body_item = prev_body_item_index == -1 ? nullptr : items[prev_body_item_index].get();
-
- float start_pos = page_scroll;
- float pos = start_pos;
- const int num_items = (int)items.size();
- for(int i = selected_item; i < num_items;) {
- auto &item = items[i];
-
- // TODO: Find a better solution?
- if(!item->visible) {
- ++i;
- continue;
- }
-
- bool merge_with_previous = body_item_merge_handler && body_item_merge_handler(prev_body_item, item.get());
- if(merge_with_previous)
- pos -= spacing_y;
-
- if(pos - start_pos >= body_size.y)
- return body_size.y;
-
- float item_height = get_item_height(item.get(), body_size.x, true, true, merge_with_previous, i);
- pos += item_height + spacing_y;
- ++num_visible_items;
- last_visible_item = i;
-
- int next_body_item_index = get_next_visible_item(i);
-
- prev_body_item = items[i].get();
-
- i = next_body_item_index;
- if(i == -1)
- break;
- }
- return pos - start_pos;
- }
-
static sf::Vector2f to_vec2f(const sf::Vector2i &vec) {
return sf::Vector2f(vec.x, vec.y);
}
@@ -1211,7 +1118,7 @@ namespace QuickMedia {
item_pos.y = std::floor(pos.y);
if(body_item_select_callback && mouse_left_clicked && !clicked_body_item) {
- sf::FloatRect item_box(pos, sf::Vector2f(size.x, item_height));
+ sf::FloatRect item_box(pos + body_pos, sf::Vector2f(size.x, item_height));
// TODO: Scale mouse_press_pixels_moved_abs with monitor PPI instead of using get_ui_scale()
if(item_box.contains(mouse_click_pos) && item_box.contains(mouse_release_pos) && mouse_press_pixels_moved_abs <= 50.0 * get_ui_scale()) {
clicked_body_item = items[item_index];
@@ -1226,6 +1133,8 @@ namespace QuickMedia {
if(item_index == selected_item) {
item_background_target_pos_y = item_pos.y;
item_background_target_height = item_height;
+ if(target_y_set == TargetSetState::NOT_SET)
+ target_y_set = TargetSetState::SET;
}
float text_offset_x = padding_x;
@@ -1349,7 +1258,7 @@ namespace QuickMedia {
for(int i = 0; i < item->reactions.size(); ++i) {
auto &reaction = item->reactions[i];
reaction.text->setMaxWidth(size.x - text_offset_x - image_padding_x);
- //reaction.text->updateGeometry();
+ reaction.text->updateGeometry();
reaction_max_height = std::max(reaction_max_height, reaction.text->getHeight());
reaction.text->setPosition(std::floor(item_pos.x + text_offset_x + reaction_offset_x + reaction_background_padding_x), std::floor(item_pos.y + padding_y - 4.0f + reaction_background_padding_y));
reaction_background.set_position(sf::Vector2f(std::floor(item_pos.x + text_offset_x + reaction_offset_x), std::floor(item_pos.y + padding_y)));
@@ -1451,7 +1360,7 @@ namespace QuickMedia {
for(int i = 0; i < item->reactions.size(); ++i) {
auto &reaction = item->reactions[i];
reaction.text->setMaxWidth(width - text_offset_x - image_padding_x);
- //reaction.text->updateGeometry();
+ reaction.text->updateGeometry();
reaction_max_height = std::max(reaction_max_height, reaction.text->getHeight());
reaction_offset_x += reaction.text->getWidth() + reaction_background_padding_x * 2.0f + reaction_spacing_x;
if(text_offset_x + reaction_offset_x + reaction.text->getWidth() + reaction_background_padding_x * 2.0f > width && i < (int)item->reactions.size() - 1) {
diff --git a/src/plugins/Fourchan.cpp b/src/plugins/Fourchan.cpp
index 2b31e70..07b5425 100644
--- a/src/plugins/Fourchan.cpp
+++ b/src/plugins/Fourchan.cpp
@@ -152,7 +152,7 @@ namespace QuickMedia {
static void extract_comment_pieces(const char *html_source, size_t size, CommentPieceCallback callback) {
TidyDoc doc = tidyCreate();
tidyOptSetBool(doc, TidyShowWarnings, no);
- tidyOptSetBool(doc, TidyUseCustomTags, yes);
+ tidyOptSetInt(doc, TidyUseCustomTags, 1);
tidyOptSetInt(doc, TidyWrapLen, 0);
if(tidyParseString(doc, html_source) < 0) {
CommentPiece comment_piece;