1 // SPDX-FileCopyrightText: 2021 Nheko Contributors 2 // 3 // SPDX-License-Identifier: GPL-3.0-or-later 4 5 #pragma once 6 7 #include <QHash> 8 #include <QQuickItem> 9 #include <QQuickTextDocument> 10 #include <QQuickView> 11 #include <QQuickWidget> 12 #include <QWidget> 13 14 #include <mtx/common.hpp> 15 #include <mtx/responses/messages.hpp> 16 #include <mtx/responses/sync.hpp> 17 18 #include "Cache.h" 19 #include "JdenticonProvider.h" 20 #include "Logging.h" 21 #include "TimelineModel.h" 22 #include "Utils.h" 23 #include "emoji/EmojiModel.h" 24 #include "emoji/Provider.h" 25 #include "encryption/VerificationManager.h" 26 #include "timeline/CommunitiesModel.h" 27 #include "timeline/RoomlistModel.h" 28 #include "voip/CallManager.h" 29 #include "voip/WebRTCSession.h" 30 31 class MxcImageProvider; 32 class BlurhashProvider; 33 class ColorImageProvider; 34 class UserSettings; 35 class ChatPage; 36 class ImagePackListModel; 37 38 class TimelineViewManager : public QObject 39 { 40 Q_OBJECT 41 42 Q_PROPERTY( 43 bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged) 44 Q_PROPERTY( 45 bool isWindowFocused MEMBER isWindowFocused_ READ isWindowFocused NOTIFY focusChanged) 46 47 public: 48 TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr); getWidget()49 QWidget *getWidget() const { return container; } 50 51 void sync(const mtx::responses::Rooms &rooms); 52 imageProvider()53 MxcImageProvider *imageProvider() { return imgProvider; } callManager()54 CallManager *callManager() { return callManager_; } verificationManager()55 VerificationManager *verificationManager() { return verificationManager_; } 56 clearAll()57 void clearAll() { rooms_->clear(); } 58 isInitialSync()59 Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; } isWindowFocused()60 bool isWindowFocused() const { return isWindowFocused_; } 61 Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId); 62 Q_INVOKABLE void openImagePackSettings(QString roomid); 63 Q_INVOKABLE QColor userColor(QString id, QColor background); 64 Q_INVOKABLE QString escapeEmoji(QString str) const; htmlEscape(QString str)65 Q_INVOKABLE QString htmlEscape(QString str) const { return str.toHtmlEscaped(); } 66 67 Q_INVOKABLE QString userPresence(QString id) const; 68 Q_INVOKABLE QString userStatus(QString id) const; 69 70 Q_INVOKABLE void openRoomMembers(TimelineModel *room); 71 Q_INVOKABLE void openRoomSettings(QString room_id); 72 Q_INVOKABLE void openInviteUsers(QString roomId); 73 Q_INVOKABLE void openGlobalUserProfile(QString userId); 74 75 Q_INVOKABLE void focusMessageInput(); 76 77 Q_INVOKABLE void fixImageRendering(QQuickTextDocument *t, QQuickItem *i); 78 79 signals: 80 void activeTimelineChanged(TimelineModel *timeline); 81 void initialSyncChanged(bool isInitialSync); 82 void replyingEventChanged(QString replyingEvent); 83 void replyClosed(); 84 void inviteUsers(QString roomId, QStringList users); 85 void showRoomList(); 86 void narrowViewChanged(); 87 void focusChanged(); 88 void focusInput(); 89 void openImageOverlayInternalCb(QString eventId, QImage img); 90 void openRoomMembersDialog(MemberList *members, TimelineModel *room); 91 void openRoomSettingsDialog(RoomSettings *settings); 92 void openInviteUsersDialog(InviteesModel *invitees); 93 void openProfile(UserProfile *profile); 94 void showImagePackSettings(ImagePackListModel *packlist); 95 void openLeaveRoomDialog(QString roomid); 96 97 public slots: 98 void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids); 99 void receivedSessionKey(const std::string &room_id, const std::string &session_id); 100 void initializeRoomlist(); chatFocusChanged(bool focused)101 void chatFocusChanged(bool focused) 102 { 103 isWindowFocused_ = focused; 104 emit focusChanged(); 105 } 106 107 void showEvent(const QString &room_id, const QString &event_id); 108 void focusTimeline(); 109 110 void updateColorPalette(); 111 void queueReply(const QString &roomid, const QString &repliedToEvent, const QString &replyBody); 112 void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &); 113 void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &); 114 void queueCallMessage(const QString &roomid, const mtx::events::msg::CallAnswer &); 115 void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &); 116 117 void setVideoCallItem(); 118 119 QObject *completerFor(QString completerName, QString roomId = ""); 120 void forwardMessageToRoom(mtx::events::collections::TimelineEvents *e, QString roomId); 121 rooms()122 RoomlistModel *rooms() { return rooms_; } 123 124 private slots: 125 void openImageOverlayInternal(QString eventId, QImage img); 126 127 private: 128 #ifdef USE_QUICK_VIEW 129 QQuickView *view; 130 #else 131 QQuickWidget *view; 132 #endif 133 QWidget *container; 134 135 MxcImageProvider *imgProvider; 136 ColorImageProvider *colorImgProvider; 137 BlurhashProvider *blurhashProvider; 138 JdenticonProvider *jdenticonProvider; 139 140 bool isInitialSync_ = true; 141 bool isWindowFocused_ = false; 142 143 RoomlistModel *rooms_ = nullptr; 144 CommunitiesModel *communities_ = nullptr; 145 146 // don't move this above the rooms_ 147 CallManager *callManager_ = nullptr; 148 VerificationManager *verificationManager_ = nullptr; 149 150 QHash<QPair<QString, quint64>, QColor> userColors; 151 }; 152 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationAccept) 153 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationCancel) 154 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationDone) 155 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationKey) 156 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationMac) 157 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationReady) 158 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationRequest) 159 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationStart) 160