From 4ff87535e7aae35bfbd66fe88402dcb513af249c Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 19 Aug 2021 16:40:42 +0200 Subject: Matrix: add ctrl+r to navigate to replied to message and navigate to message from notifications tab --- plugins/Matrix.hpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'plugins') diff --git a/plugins/Matrix.hpp b/plugins/Matrix.hpp index a27a4f6..0d29821 100644 --- a/plugins/Matrix.hpp +++ b/plugins/Matrix.hpp @@ -91,6 +91,8 @@ namespace QuickMedia { // TODO: Store body item ref here }; + using Messages = std::vector>; + struct RoomData { std::shared_ptr get_user_by_id(const std::string &user_id); void add_user(std::shared_ptr user); @@ -106,9 +108,9 @@ namespace QuickMedia { void set_user_avatar_url(std::shared_ptr &user, std::string avatar_url); // Ignores duplicates, returns the number of added messages - size_t prepend_messages_reverse(const std::vector> &new_messages); + size_t prepend_messages_reverse(const Messages &new_messages); // Ignores duplicates, returns the number of added messages - size_t append_messages(const std::vector> &new_messages); + size_t append_messages(const Messages &new_messages); std::shared_ptr get_message_by_id(const std::string &id); @@ -118,7 +120,7 @@ namespace QuickMedia { void acquire_room_lock(); void release_room_lock(); - const std::vector>& get_messages_thread_unsafe() const; + const Messages& get_messages_thread_unsafe() const; const std::vector& get_pinned_events_thread_unsafe() const; bool has_prev_batch(); @@ -177,7 +179,7 @@ namespace QuickMedia { // Each room has its own list of user data, even if multiple rooms has the same user // because users can have different display names and avatars in different rooms. std::unordered_map> user_info_by_user_id; - std::vector> messages; + Messages messages; std::unordered_map> message_by_event_id; std::vector pinned_events; std::set tags; @@ -204,8 +206,6 @@ namespace QuickMedia { std::string content_uri; }; - using Messages = std::vector>; - struct SyncData { Messages messages; std::optional> pinned_events; @@ -422,7 +422,7 @@ namespace QuickMedia { class MatrixChatPage : public Page { public: - MatrixChatPage(Program *program, std::string room_id, MatrixRoomsPage *rooms_page); + MatrixChatPage(Program *program, std::string room_id, MatrixRoomsPage *rooms_page, std::string jump_to_event_id = ""); ~MatrixChatPage(); const char* get_title() const override { return ""; } @@ -443,6 +443,8 @@ namespace QuickMedia { Body *chat_body = nullptr; bool messages_tab_visible = false; + + const std::string jump_to_event_id; private: RoomData *current_room = nullptr; Body *users_body = nullptr; @@ -522,7 +524,8 @@ namespace QuickMedia { void get_all_synced_room_messages(RoomData *room, Messages &messages); void get_all_pinned_events(RoomData *room, std::vector &events); - PluginResult get_previous_room_messages(RoomData *room, Messages &messages, bool latest_messages = false); + PluginResult get_messages_in_direction(RoomData *room, const std::string &token, MessageDirection message_dir, Messages &messages, std::string &new_token); + PluginResult get_previous_room_messages(RoomData *room, Messages &messages, bool latest_messages = false, bool *reached_end = nullptr); PluginResult get_previous_notifications(std::function callback_func); void get_cached_notifications(std::function callback_func); @@ -577,6 +580,8 @@ namespace QuickMedia { // Returns nullptr if message cant be found. Note: cached std::shared_ptr get_message_by_id(RoomData *room, const std::string &event_id); + PluginResult get_message_context(RoomData *room, const std::string &event_id, std::shared_ptr &message, Messages &before_messages, Messages &after_messages, std::string &before_token, std::string &after_token); + void clear_previous_messages_token(RoomData *room); RoomData* get_room_by_id(const std::string &id); void update_room_users(RoomData *room); @@ -600,7 +605,7 @@ namespace QuickMedia { PluginResult parse_notifications(const rapidjson::Value ¬ifications_json, std::function callback_func); PluginResult parse_sync_account_data(const rapidjson::Value &account_data_json, std::optional> &dm_rooms); PluginResult parse_sync_room_data(const rapidjson::Value &rooms_json, bool is_additional_messages_sync, bool initial_sync); - PluginResult get_previous_room_messages(RoomData *room_data, bool latest_messages, size_t &num_new_messages); + PluginResult get_previous_room_messages(RoomData *room_data, bool latest_messages, size_t &num_new_messages, bool *reached_end = nullptr); void events_add_user_info(const rapidjson::Value &events_json, RoomData *room_data); std::shared_ptr parse_user_info(const rapidjson::Value &json, const std::string &user_id, RoomData *room_data); void events_set_user_read_marker(const rapidjson::Value &events_json, RoomData *room_data, std::shared_ptr &me); -- cgit v1.2.3