aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp118
1 files changed, 12 insertions, 106 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 5bbcfd7..a9956d3 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -3952,11 +3952,13 @@ namespace QuickMedia {
Tabs ui_tabs(&rounded_rectangle_shader, sf::Color::Transparent);
const int PINNED_TAB_INDEX = ui_tabs.add_tab("Pinned messages (0)");
const int MESSAGES_TAB_INDEX = ui_tabs.add_tab("Messages");
- const int USERS_TAB_INDEX = ui_tabs.add_tab("Users");
+ const int USERS_TAB_INDEX = ui_tabs.add_tab("Users (0)");
ui_tabs.set_selected(MESSAGES_TAB_INDEX);
matrix_chat_page->chat_body = tabs[MESSAGES_TAB_INDEX].body.get();
matrix_chat_page->messages_tab_visible = true;
+ matrix_chat_page->set_current_room(current_room, tabs[USERS_TAB_INDEX].body.get());
+ size_t prev_num_users_in_room = 0;
bool redraw = true;
@@ -4994,91 +4996,6 @@ namespace QuickMedia {
//tabs.clear();
};
- auto on_add_user_event = [&ui_tabs, &tabs, USERS_TAB_INDEX](MatrixAddUserEvent *event) {
- // Ignore if the user already exists in the room
- // TODO: Remove the need for this
- for(auto &body_item : tabs[USERS_TAB_INDEX].body->items) {
- if(body_item->url == event->user_info.user_id)
- return;
- }
-
- std::string display_name = event->user_info.display_name.value_or(event->user_info.user_id);
- size_t insert_position = get_body_item_sorted_insert_position_by_author(tabs[USERS_TAB_INDEX].body->items, display_name, 0);
-
- auto body_item = BodyItem::create("");
- body_item->url = event->user_info.user_id;
- body_item->set_author(std::move(display_name));
- body_item->set_author_color(user_id_to_color(event->user_info.user_id));
- body_item->set_description(event->user_info.user_id);
- body_item->set_description_color(sf::Color(179, 179, 179));
- if(event->user_info.avatar_url)
- body_item->thumbnail_url = event->user_info.avatar_url.value();
- body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE;
- body_item->thumbnail_size = AVATAR_THUMBNAIL_SIZE;
- tabs[USERS_TAB_INDEX].body->items.insert(tabs[USERS_TAB_INDEX].body->items.begin() + insert_position, std::move(body_item));
- tabs[USERS_TAB_INDEX].body->items_set_dirty();
-
- ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(tabs[USERS_TAB_INDEX].body->items.size()) + ")");
- };
-
- // TODO: Actually trigger this when a user leaves the room. Also remove the user from the room in the matrix plugin
- auto on_remove_user_event = [&ui_tabs, &tabs, USERS_TAB_INDEX](MatrixRemoveUserEvent *event) {
- for(auto it = tabs[USERS_TAB_INDEX].body->items.begin(), end = tabs[USERS_TAB_INDEX].body->items.end(); it != end; ++it) {
- if((*it)->url == event->user_info.user_id) {
- tabs[USERS_TAB_INDEX].body->items.erase(it);
- ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(tabs[USERS_TAB_INDEX].body->items.size()) + ")");
- return;
- }
- }
- };
-
- auto on_user_info_event = [&tabs, USERS_TAB_INDEX](MatrixUserInfoEvent *event) {
- for(auto it = tabs[USERS_TAB_INDEX].body->items.begin(), end = tabs[USERS_TAB_INDEX].body->items.end(); it != end; ++it) {
- if((*it)->url == event->user_info.user_id) {
- if(event->user_info.avatar_url)
- (*it)->thumbnail_url = event->user_info.avatar_url.value();
-
- if(event->user_info.display_name) {
- std::string display_name;
- if(event->user_info.display_name.value().empty())
- display_name = event->user_info.user_id;
- else
- display_name = event->user_info.display_name.value();
-
- (*it)->set_author(std::move(display_name));
-
- auto user_body_item = *it;
- tabs[USERS_TAB_INDEX].body->items.erase(it);
-
- // TODO: extract_first_line_remove_newline_elipses(room->get_user_display_name(message->user), AUTHOR_MAX_LENGTH),
- // But that should be done in Text because we need author to be 100% the same as in the input to reorder users
- size_t insert_position = get_body_item_sorted_insert_position_by_author(tabs[USERS_TAB_INDEX].body->items, user_body_item->get_author(), 0);
- tabs[USERS_TAB_INDEX].body->items.insert(tabs[USERS_TAB_INDEX].body->items.begin() + insert_position, std::move(user_body_item));
- tabs[USERS_TAB_INDEX].body->items_set_dirty();
- }
-
- return;
- }
- }
- };
-
- matrix->enable_event_queue(current_room);
- {
- auto users_in_room = current_room->get_users();
- for(auto &user : users_in_room) {
- std::string display_name = current_room->get_user_display_name(user);
- std::string avatar_url = current_room->get_user_avatar_url(user);
-
- MatrixEventUserInfo user_info;
- user_info.user_id = user->user_id;
- user_info.display_name = std::move(display_name);
- user_info.avatar_url = std::move(avatar_url);
-
- MatrixAddUserEvent add_user_event(std::move(user_info));
- on_add_user_event(&add_user_event);
- }
- }
-
// TODO: Remove this once synapse bug has been resolved where /sync does not include user info for new messages when using message filter that limits number of messages for initial sync,
// and then only call this when viewing the users tab for the first time.
// Note that this is not needed when new users join the room, as those will be included in the sync timeline (with membership events)
@@ -5390,22 +5307,11 @@ namespace QuickMedia {
matrix->update();
mention.update();
-
- std::unique_ptr<MatrixEvent> matrix_event;
- while((matrix_event = matrix->pop_event()) != nullptr) {
- if(matrix_event) {
- switch(matrix_event->type) {
- case MatrixEvent::Type::ADD_USER:
- on_add_user_event(static_cast<MatrixAddUserEvent*>(matrix_event.get()));
- break;
- case MatrixEvent::Type::REMOVE_USER:
- on_remove_user_event(static_cast<MatrixRemoveUserEvent*>(matrix_event.get()));
- break;
- case MatrixEvent::Type::USER_INFO:
- on_user_info_event(static_cast<MatrixUserInfoEvent*>(matrix_event.get()));
- break;
- }
- }
+
+ const size_t num_users_in_room = matrix_chat_page->get_num_users_in_current_room();
+ if(num_users_in_room != prev_num_users_in_room) {
+ prev_num_users_in_room = num_users_in_room;
+ ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(num_users_in_room) + ")");
}
while((provisional_message = provisional_message_queue.pop_if_available()) != std::nullopt) {
@@ -5451,7 +5357,7 @@ namespace QuickMedia {
break;
}
case PageType::CHAT_LOGIN: {
- matrix->disable_event_queue();
+ matrix_chat_page->set_current_room(nullptr, nullptr);
previous_messages_future.cancel();
cleanup_tasks();
tabs.clear();
@@ -5818,7 +5724,7 @@ namespace QuickMedia {
if(matrix && !matrix->is_initial_sync_finished()) {
std::string err_msg;
if(matrix->did_initial_sync_fail(err_msg)) {
- matrix->disable_event_queue();
+ matrix_chat_page->set_current_room(nullptr, nullptr);
previous_messages_future.cancel();
cleanup_tasks();
tabs.clear();
@@ -5848,7 +5754,7 @@ namespace QuickMedia {
while(!matrix->is_initial_sync_finished()) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
if(matrix->did_initial_sync_fail(err_msg)) {
- matrix->disable_event_queue();
+ matrix_chat_page->set_current_room(nullptr, nullptr);
previous_messages_future.cancel();
cleanup_tasks();
tabs.clear();
@@ -5899,7 +5805,7 @@ namespace QuickMedia {
}
chat_page_end:
- matrix->disable_event_queue();
+ matrix_chat_page->set_current_room(nullptr, nullptr);
previous_messages_future.cancel();
cleanup_tasks();
window.setTitle("QuickMedia - matrix");