From 85a1edf8d9c21b830f7ec4a2d42b8e5c1d044845 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 7 Oct 2020 21:14:32 +0200 Subject: Matrix: only show notification on mention if window is not focused or message was received in another room Also fix caret position in text being incorrect after resize. Change caret behavior when pressing up/down at the first/last row, to not go to the beginning/end. --- src/QuickMedia.cpp | 17 +++++++---------- src/Text.cpp | 8 ++++---- 2 files changed, 11 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index a0e9b78..3922ceb 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3434,8 +3434,12 @@ namespace QuickMedia { }; std::unordered_map body_items_by_room_id; + std::string current_room_id; + RoomBodyData *current_room_body_data = nullptr; - auto process_new_room_messages = [matrix, &body_items_by_room_id](RoomSyncMessages &room_sync_messages, bool only_show_mentions) mutable { + bool is_window_focused = window.hasFocus(); + + auto process_new_room_messages = [matrix, &body_items_by_room_id, ¤t_room_id, &is_window_focused](RoomSyncMessages &room_sync_messages, bool only_show_mentions) mutable { for(auto &[room, messages] : room_sync_messages) { bool was_mentioned = false; for(auto &message : messages) { @@ -3443,7 +3447,8 @@ namespace QuickMedia { was_mentioned = true; message->mentions_me = false; // TODO: What if the message or username begins with "-"? also make the notification image be the avatar of the user - show_notification("QuickMedia matrix - " + matrix->message_get_author_displayname(message.get()) + " (" + room->name + ")", message->body); + if(!is_window_focused || room->id != current_room_id) + show_notification("QuickMedia matrix - " + matrix->message_get_author_displayname(message.get()) + " (" + room->name + ")", message->body); } } @@ -3481,12 +3486,6 @@ namespace QuickMedia { } }; - // The room id should be saved in a file when changing viewed room. - std::string current_room_id; - RoomBodyData *current_room_body_data = nullptr; - - // get_all_room_messages is not needed here because its done in the loop, where the initial timeout is 0ms - enum class ChatState { NAVIGATING, TYPING_MESSAGE, @@ -3711,8 +3710,6 @@ namespace QuickMedia { return result; }; - bool is_window_focused = true; - while (current_page == Page::CHAT) { sf::Int32 frame_time_ms = frame_timer.restart().asMilliseconds(); while (window.pollEvent(event)) { diff --git a/src/Text.cpp b/src/Text.cpp index d58473d..c1adc5d 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -97,6 +97,7 @@ namespace QuickMedia { this->maxWidth = maxWidth; dirty = true; + dirtyCaret = true; } } @@ -567,7 +568,7 @@ namespace QuickMedia } if(closest_index != -1) return closest_index; - return 0; + return startIndex; } // TODO: This can be optimized by using binary search @@ -588,7 +589,7 @@ namespace QuickMedia } if(closest_index != -1) return closest_index; - return num_vertices; + return startIndex; } // TODO: Optimize text editing by only processing the changed parts in updateGeometry. @@ -697,8 +698,7 @@ namespace QuickMedia { updateGeometry(); - if(dirtyCaret || caretMoveDirection != CaretMoveDirection::NONE) - { + if(editable && (dirtyCaret || caretMoveDirection != CaretMoveDirection::NONE)) { updateCaret(); dirtyCaret = false; caretMoveDirection = CaretMoveDirection::NONE; -- cgit v1.2.3