From 640b0ee4057a0993a515d7db7c875d314aab9bdf Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 3 Sep 2020 17:01:58 +0200 Subject: Port top bar to Qml Also fixes some resize issues with stupid workarounds to our resize logic. This really needs to be cleaned up at some point! --- src/timeline/TimelineModel.cpp | 64 ++++++++++++++++++++++++++++++++++++ src/timeline/TimelineModel.h | 12 +++++++ src/timeline/TimelineViewManager.cpp | 35 ++++++++++++++++---- src/timeline/TimelineViewManager.h | 32 +++++++++++++++++- 4 files changed, 135 insertions(+), 8 deletions(-) (limited to 'src/timeline') diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index b6c2d4bb..f596a587 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -517,6 +517,25 @@ TimelineModel::fetchMore(const QModelIndex &) events.fetchMore(); } +void +TimelineModel::syncState(const mtx::responses::State &s) +{ + using namespace mtx::events; + + for (const auto &e : s.events) { + if (std::holds_alternative>(e)) + emit roomAvatarUrlChanged(); + else if (std::holds_alternative>(e)) + emit roomNameChanged(); + else if (std::holds_alternative>(e)) + emit roomTopicChanged(); + else if (std::holds_alternative>(e)) { + emit roomAvatarUrlChanged(); + emit roomNameChanged(); + } + } +} + void TimelineModel::addEvents(const mtx::responses::Timeline &timeline) { @@ -526,6 +545,7 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline) events.handleSync(timeline); using namespace mtx::events; + for (auto e : timeline.events) { if (auto encryptedEvent = std::get_if>(&e)) { MegolmSessionIndex index; @@ -549,6 +569,16 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline) emit newCallEvent(event); }, e); + else if (std::holds_alternative>(e)) + emit roomAvatarUrlChanged(); + else if (std::holds_alternative>(e)) + emit roomNameChanged(); + else if (std::holds_alternative>(e)) + emit roomTopicChanged(); + else if (std::holds_alternative>(e)) { + emit roomAvatarUrlChanged(); + emit roomNameChanged(); + } } updateLastMessage(); } @@ -1594,3 +1624,37 @@ TimelineModel::formatMemberEvent(QString id) return rendered; } + +QString +TimelineModel::roomName() const +{ + auto info = cache::getRoomInfo({room_id_.toStdString()}); + + if (!info.count(room_id_)) + return ""; + else + return QString::fromStdString(info[room_id_].name); +} + +QString +TimelineModel::roomAvatarUrl() const +{ + auto info = cache::getRoomInfo({room_id_.toStdString()}); + + if (!info.count(room_id_)) + return ""; + else + return QString::fromStdString(info[room_id_].avatar_url); +} + +QString +TimelineModel::roomTopic() const +{ + auto info = cache::getRoomInfo({room_id_.toStdString()}); + + if (!info.count(room_id_)) + return ""; + else + return utils::replaceEmoji(utils::linkifyMessage( + utils::escapeBlacklistedHtml(QString::fromStdString(info[room_id_].topic)))); +} diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 156606e6..34f2f78a 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -137,6 +137,9 @@ class TimelineModel : public QAbstractListModel Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply) Q_PROPERTY( bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged) + Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged) + Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged) + Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged) public: explicit TimelineModel(TimelineViewManager *manager, @@ -217,6 +220,7 @@ public: void updateLastMessage(); void addEvents(const mtx::responses::Timeline &events); + void syncState(const mtx::responses::State &state); template void sendMessageEvent(const T &content, mtx::events::EventType eventType); RelatedInfo relatedInfo(QString id); @@ -253,6 +257,10 @@ public slots: void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; } void clearTimeline() { events.clearTimeline(); } + QString roomName() const; + QString roomTopic() const; + QString roomAvatarUrl() const; + private slots: void addPendingMessage(mtx::events::collections::TimelineEvents event); @@ -270,6 +278,10 @@ signals: void newMessageToSend(mtx::events::collections::TimelineEvents event); void addPendingMessageToStore(mtx::events::collections::TimelineEvents event); + void roomNameChanged(); + void roomTopicChanged(); + void roomAvatarUrlChanged(); + private: void sendEncryptedMessageEvent(const std::string &txn_id, nlohmann::json content, diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 466c3cee..32d8b0b2 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -12,6 +12,7 @@ #include "ColorImageProvider.h" #include "DelegateChooser.h" #include "Logging.h" +#include "MainWindow.h" #include "MatrixClient.h" #include "MxcImageProvider.h" #include "UserSettingsPage.h" @@ -76,7 +77,7 @@ TimelineViewManager::userStatus(QString id) const TimelineViewManager::TimelineViewManager(QSharedPointer userSettings, CallManager *callManager, - QWidget *parent) + ChatPage *parent) : imgProvider(new MxcImageProvider()) , colorImgProvider(new ColorImageProvider()) , blurhashProvider(new BlurhashProvider()) @@ -131,15 +132,12 @@ TimelineViewManager::TimelineViewManager(QSharedPointer userSettin view->engine()->addImageProvider("blurhash", blurhashProvider); view->setSource(QUrl("qrc:///qml/TimelineView.qml")); - connect(dynamic_cast(parent), - &ChatPage::themeChanged, - this, - &TimelineViewManager::updateColorPalette); - connect(dynamic_cast(parent), + connect(parent, &ChatPage::themeChanged, this, &TimelineViewManager::updateColorPalette); + connect(parent, &ChatPage::decryptSidebarChanged, this, &TimelineViewManager::updateEncryptedDescriptions); - connect(dynamic_cast(parent), &ChatPage::loggedOut, this, [this]() { + connect(parent, &ChatPage::loggedOut, this, [this]() { isInitialSync_ = true; emit initialSyncChanged(true); }); @@ -157,6 +155,7 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms) &TimelineModel::newCallEvent, callManager_, &CallManager::syncEvent); + room_model->syncState(room.state); room_model->addEvents(room.timeline); if (!isInitialSync_) disconnect(room_model.data(), @@ -245,6 +244,28 @@ TimelineViewManager::openLink(QString link) const QDesktopServices::openUrl(link); } +void +TimelineViewManager::openInviteUsersDialog() +{ + MainWindow::instance()->openInviteUsersDialog( + [this](const QStringList &invitees) { emit inviteUsers(invitees); }); +} +void +TimelineViewManager::openMemberListDialog() const +{ + MainWindow::instance()->openMemberListDialog(); +} +void +TimelineViewManager::openLeaveRoomDialog() const +{ + MainWindow::instance()->openLeaveRoomDialog(); +} +void +TimelineViewManager::openRoomSettings() const +{ + MainWindow::instance()->openRoomSettings(); +} + void TimelineViewManager::updateReadReceipts(const QString &room_id, const std::vector &event_ids) diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index ea6d1743..2de94b77 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -21,6 +21,7 @@ class BlurhashProvider; class CallManager; class ColorImageProvider; class UserSettings; +class ChatPage; class TimelineViewManager : public QObject { @@ -30,11 +31,13 @@ class TimelineViewManager : public QObject TimelineModel *timeline MEMBER timeline_ READ activeTimeline NOTIFY activeTimelineChanged) Q_PROPERTY( bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged) + Q_PROPERTY( + bool isNarrowView MEMBER isNarrowView_ READ isNarrowView NOTIFY narrowViewChanged) public: TimelineViewManager(QSharedPointer userSettings, CallManager *callManager, - QWidget *parent = nullptr); + ChatPage *parent = nullptr); QWidget *getWidget() const { return container; } void sync(const mtx::responses::Rooms &rooms); @@ -44,6 +47,7 @@ public: Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; } Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; } + bool isNarrowView() const { return isNarrowView_; } Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const; Q_INVOKABLE QColor userColor(QString id, QColor background); @@ -52,6 +56,11 @@ public: Q_INVOKABLE void openLink(QString link) const; + Q_INVOKABLE void openInviteUsersDialog(); + Q_INVOKABLE void openMemberListDialog() const; + Q_INVOKABLE void openLeaveRoomDialog() const; + Q_INVOKABLE void openRoomSettings() const; + signals: void clearRoomMessageCount(QString roomid); void updateRoomsLastMessage(QString roomid, const DescInfo &info); @@ -59,6 +68,9 @@ signals: void initialSyncChanged(bool isInitialSync); void replyingEventChanged(QString replyingEvent); void replyClosed(); + void inviteUsers(QStringList users); + void showRoomList(); + void narrowViewChanged(); public slots: void updateReadReceipts(const QString &room_id, const std::vector &event_ids); @@ -108,6 +120,23 @@ public slots: timeline_->clearTimeline(); } + void enableBackButton() + { + if (isNarrowView_) + return; + isNarrowView_ = true; + emit narrowViewChanged(); + } + void disableBackButton() + { + if (!isNarrowView_) + return; + isNarrowView_ = false; + emit narrowViewChanged(); + } + + void backToRooms() { emit showRoomList(); } + private: #ifdef USE_QUICK_VIEW QQuickView *view; @@ -125,6 +154,7 @@ private: CallManager *callManager_ = nullptr; bool isInitialSync_ = true; + bool isNarrowView_ = false; QSharedPointer settings; QHash userColors; -- cgit 1.5.1 From 77e241b9e57a3248e2efb16e6cb081a19a666db7 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 3 Sep 2020 19:34:17 +0200 Subject: Reenable top bar room settings menus on avatar or title clicks Also fixes a bug with an empty room settings window introduced in the port. --- resources/qml/TimelineView.qml | 15 +++++++++++++++ src/ChatPage.cpp | 3 +++ src/MainWindow.cpp | 13 ++++--------- src/MainWindow.h | 6 +++--- src/timeline/TimelineModel.h | 1 + src/timeline/TimelineViewManager.cpp | 6 +++--- 6 files changed, 29 insertions(+), 15 deletions(-) (limited to 'src/timeline') diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index ea85acf9..49f523a5 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -126,6 +126,11 @@ Page { color: colors.base + MouseArea { + anchors.fill: parent + onClicked: timelineManager.openRoomSettings(); + } + GridLayout { id: topLayout @@ -164,6 +169,11 @@ Page { height: avatarSize url: chat.model.roomAvatarUrl.replace("mxc://", "image://MxcImage/") displayName: chat.model.roomName + + MouseArea { + anchors.fill: parent + onClicked: timelineManager.openRoomSettings(); + } } Label { @@ -173,6 +183,11 @@ Page { font.pointSize: fontMetrics.font.pointSize * 1.1 text: chat.model.roomName + + MouseArea { + anchors.fill: parent + onClicked: timelineManager.openRoomSettings(); + } } MatrixText { Layout.fillWidth: true diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 1339f353..cf1a6062 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -225,6 +225,9 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) } }); + connect(room_list_, &RoomList::roomChanged, this, [this](QString room_id) { + this->current_room_ = room_id; + }); connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::stopTyping); connect(room_list_, &RoomList::roomChanged, splitter, &Splitter::showChatView); connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::focusLineEdit); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 90bffa70..29abed86 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -340,9 +340,7 @@ MainWindow::openUserProfile(const QString &user_id, const QString &room_id) void MainWindow::openRoomSettings(const QString &room_id) { - const auto roomToSearch = room_id.isEmpty() ? chat_page_->currentRoom() : ""; - - auto dialog = new dialogs::RoomSettings(roomToSearch, this); + auto dialog = new dialogs::RoomSettings(room_id, this); showDialog(dialog); } @@ -350,8 +348,7 @@ MainWindow::openRoomSettings(const QString &room_id) void MainWindow::openMemberListDialog(const QString &room_id) { - const auto roomToSearch = room_id.isEmpty() ? chat_page_->currentRoom() : ""; - auto dialog = new dialogs::MemberList(roomToSearch, this); + auto dialog = new dialogs::MemberList(room_id, this); showDialog(dialog); } @@ -359,11 +356,9 @@ MainWindow::openMemberListDialog(const QString &room_id) void MainWindow::openLeaveRoomDialog(const QString &room_id) { - auto roomToLeave = room_id.isEmpty() ? chat_page_->currentRoom() : room_id; - auto dialog = new dialogs::LeaveRoom(this); - connect(dialog, &dialogs::LeaveRoom::leaving, this, [this, roomToLeave]() { - chat_page_->leaveRoom(roomToLeave); + connect(dialog, &dialogs::LeaveRoom::leaving, this, [this, room_id]() { + chat_page_->leaveRoom(room_id); }); showDialog(dialog); diff --git a/src/MainWindow.h b/src/MainWindow.h index e3e04698..4f54a195 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -68,14 +68,14 @@ public: static MainWindow *instance() { return instance_; }; void saveCurrentWindowSize(); - void openLeaveRoomDialog(const QString &room_id = ""); + void openLeaveRoomDialog(const QString &room_id); void openInviteUsersDialog(std::function callback); void openCreateRoomDialog( std::function callback); void openJoinRoomDialog(std::function callback); void openLogoutDialog(); - void openRoomSettings(const QString &room_id = ""); - void openMemberListDialog(const QString &room_id = ""); + void openRoomSettings(const QString &room_id); + void openMemberListDialog(const QString &room_id); void openUserProfile(const QString &user_id, const QString &room_id); void openReadReceiptsDialog(const QString &event_id); diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 34f2f78a..1e482be2 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -260,6 +260,7 @@ public slots: QString roomName() const; QString roomTopic() const; QString roomAvatarUrl() const; + QString roomId() const { return room_id_; } private slots: void addPendingMessage(mtx::events::collections::TimelineEvents event); diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 32d8b0b2..06f0fa3d 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -253,17 +253,17 @@ TimelineViewManager::openInviteUsersDialog() void TimelineViewManager::openMemberListDialog() const { - MainWindow::instance()->openMemberListDialog(); + MainWindow::instance()->openMemberListDialog(timeline_->roomId()); } void TimelineViewManager::openLeaveRoomDialog() const { - MainWindow::instance()->openLeaveRoomDialog(); + MainWindow::instance()->openLeaveRoomDialog(timeline_->roomId()); } void TimelineViewManager::openRoomSettings() const { - MainWindow::instance()->openRoomSettings(); + MainWindow::instance()->openRoomSettings(timeline_->roomId()); } void -- cgit 1.5.1 From b05c10102148a388a5abedc890db52abc70d71b5 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 3 Sep 2020 19:51:50 +0200 Subject: Fix null errors in qml --- resources/qml/Avatar.qml | 2 +- resources/qml/TimelineView.qml | 13 ++++++++----- resources/qml/delegates/MessageDelegate.qml | 2 +- resources/qml/delegates/Reply.qml | 2 +- src/timeline/TimelineModel.cpp | 18 ++++++------------ src/timeline/TimelineModel.h | 1 - src/timeline/TimelineViewManager.cpp | 6 ++++++ src/timeline/TimelineViewManager.h | 1 + 8 files changed, 24 insertions(+), 21 deletions(-) (limited to 'src/timeline') diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml index 0c4343c7..a3943806 100644 --- a/resources/qml/Avatar.qml +++ b/resources/qml/Avatar.qml @@ -14,7 +14,7 @@ Rectangle { Label { anchors.fill: parent - text: chat.model.escapeEmoji(String.fromCodePoint(displayName.codePointAt(0))) + text: timelineManager.escapeEmoji(String.fromCodePoint(displayName.codePointAt(0))) textFormat: Text.RichText font.pixelSize: avatar.height/2 verticalAlignment: Text.AlignVCenter diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 49f523a5..e4643635 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -167,8 +167,9 @@ Page { width: avatarSize height: avatarSize - url: chat.model.roomAvatarUrl.replace("mxc://", "image://MxcImage/") - displayName: chat.model.roomName + + url: chat.model ? chat.model.roomAvatarUrl.replace("mxc://", "image://MxcImage/") : "" + displayName: chat.model ? chat.model.roomName : qsTr("No room selected") MouseArea { anchors.fill: parent @@ -182,7 +183,8 @@ Page { Layout.row: 0 font.pointSize: fontMetrics.font.pointSize * 1.1 - text: chat.model.roomName + + text: chat.model ? chat.model.roomName : qsTr("No room selected") MouseArea { anchors.fill: parent @@ -193,9 +195,10 @@ Page { Layout.fillWidth: true Layout.column: 2 Layout.row: 1 - text: chat.model.roomTopic Layout.maximumHeight: fontMetrics.lineSpacing * 2 // show 2 lines clip: true + + text: chat.model ? chat.model.roomTopic : "" } ImageButton { @@ -387,7 +390,7 @@ Page { Label { id: userName - text: chat.model.escapeEmoji(modelData.userName) + text: timelineManager.escapeEmoji(modelData.userName) color: timelineManager.userColor(modelData.userId, colors.window) textFormat: Text.RichText diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml index 56b8040e..90e52442 100644 --- a/resources/qml/delegates/MessageDelegate.qml +++ b/resources/qml/delegates/MessageDelegate.qml @@ -36,7 +36,7 @@ Item { DelegateChoice { roleValue: MtxEvent.EmoteMessage NoticeMessage { - formatted: chat.model.escapeEmoji(modelData.userName) + " " + model.data.formattedBody + formatted: timelineManager.escapeEmoji(modelData.userName) + " " + model.data.formattedBody color: timelineManager.userColor(modelData.userId, colors.window) } } diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml index f9fd3f11..36a6d373 100644 --- a/resources/qml/delegates/Reply.qml +++ b/resources/qml/delegates/Reply.qml @@ -37,7 +37,7 @@ Item { Text { id: userName - text: chat.model ? chat.model.escapeEmoji(reply.modelData.userName) : "" + text: timelineManager.escapeEmoji(reply.modelData.userName) color: replyComponent.userColor textFormat: Text.RichText diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index f596a587..32e9f92c 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -719,12 +719,6 @@ TimelineModel::formatDateSeparator(QDate date) const return date.toString(fmt); } -QString -TimelineModel::escapeEmoji(QString str) const -{ - return utils::replaceEmoji(str); -} - void TimelineModel::viewRawMessage(QString id) const { @@ -1389,7 +1383,7 @@ TimelineModel::formatTypingUsers(const std::vector &users, QColor bg) QStringList uidWithoutLast; auto formatUser = [this, bg](const QString &user_id) -> QString { - auto uncoloredUsername = escapeEmoji(displayName(user_id)); + auto uncoloredUsername = utils::replaceEmoji(displayName(user_id)); QString prefix = QString("").arg(manager_->userColor(user_id, bg).name()); @@ -1439,7 +1433,7 @@ TimelineModel::formatJoinRuleEvent(QString id) return ""; QString user = QString::fromStdString(event->sender); - QString name = escapeEmoji(displayName(user)); + QString name = utils::replaceEmoji(displayName(user)); switch (event->content.join_rule) { case mtx::events::state::JoinRule::Public: @@ -1464,7 +1458,7 @@ TimelineModel::formatGuestAccessEvent(QString id) return ""; QString user = QString::fromStdString(event->sender); - QString name = escapeEmoji(displayName(user)); + QString name = utils::replaceEmoji(displayName(user)); switch (event->content.guest_access) { case mtx::events::state::AccessState::CanJoin: @@ -1489,7 +1483,7 @@ TimelineModel::formatHistoryVisibilityEvent(QString id) return ""; QString user = QString::fromStdString(event->sender); - QString name = escapeEmoji(displayName(user)); + QString name = utils::replaceEmoji(displayName(user)); switch (event->content.history_visibility) { case mtx::events::state::Visibility::WorldReadable: @@ -1522,7 +1516,7 @@ TimelineModel::formatPowerLevelEvent(QString id) return ""; QString user = QString::fromStdString(event->sender); - QString name = escapeEmoji(displayName(user)); + QString name = utils::replaceEmoji(displayName(user)); // TODO: power levels rendering is actually a bit complex. work on this later. return tr("%1 has changed the room's permissions.").arg(name); @@ -1551,7 +1545,7 @@ TimelineModel::formatMemberEvent(QString id) } QString user = QString::fromStdString(event->state_key); - QString name = escapeEmoji(displayName(user)); + QString name = utils::replaceEmoji(displayName(user)); QString rendered; // see table https://matrix.org/docs/spec/client_server/latest#m-room-member diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 1e482be2..6daaac1b 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -197,7 +197,6 @@ public: Q_INVOKABLE QString formatGuestAccessEvent(QString id); Q_INVOKABLE QString formatPowerLevelEvent(QString id); - Q_INVOKABLE QString escapeEmoji(QString str) const; Q_INVOKABLE void viewRawMessage(QString id) const; Q_INVOKABLE void viewDecryptedRawMessage(QString id) const; Q_INVOKABLE void openUserProfile(QString userid) const; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 06f0fa3d..abb807b3 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -206,6 +206,12 @@ TimelineViewManager::setHistoryView(const QString &room_id) } } +QString +TimelineViewManager::escapeEmoji(QString str) const +{ + return utils::replaceEmoji(str); +} + void TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const { diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index 2de94b77..1a98f64d 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -50,6 +50,7 @@ public: bool isNarrowView() const { return isNarrowView_; } Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const; Q_INVOKABLE QColor userColor(QString id, QColor background); + Q_INVOKABLE QString escapeEmoji(QString str) const; Q_INVOKABLE QString userPresence(QString id) const; Q_INVOKABLE QString userStatus(QString id) const; -- cgit 1.5.1 From 4b36585e4798a24bfcb57fd7cef71e72dff1c0ea Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 19 Sep 2020 15:45:03 +0200 Subject: Fix typo in encryption error message --- resources/langs/nheko_cs.ts | 2 +- resources/langs/nheko_de.ts | 2 +- resources/langs/nheko_el.ts | 4 ++-- resources/langs/nheko_en.ts | 2 +- resources/langs/nheko_et.ts | 2 +- resources/langs/nheko_fi.ts | 2 +- resources/langs/nheko_fr.ts | 2 +- resources/langs/nheko_it.ts | 2 +- resources/langs/nheko_ja.ts | 4 ++-- resources/langs/nheko_nl.ts | 2 +- resources/langs/nheko_pl.ts | 2 +- resources/langs/nheko_ro.ts | 2 +- resources/langs/nheko_ru.ts | 2 +- resources/langs/nheko_si.ts | 2 +- resources/langs/nheko_zh_CN.ts | 2 +- src/timeline/EventStore.cpp | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) (limited to 'src/timeline') diff --git a/resources/langs/nheko_cs.ts b/resources/langs/nheko_cs.ts index e40f1250..38443412 100644 --- a/resources/langs/nheko_cs.ts +++ b/resources/langs/nheko_cs.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts index a014bb73..91b058ba 100644 --- a/resources/langs/nheko_de.ts +++ b/resources/langs/nheko_de.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts index f68b9b17..d0a46653 100644 --- a/resources/langs/nheko_el.ts +++ b/resources/langs/nheko_el.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- @@ -1041,7 +1041,7 @@ Example: https://server.my:8787 Leave room - + Βγές diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts index d0f762f6..242d570e 100644 --- a/resources/langs/nheko_en.ts +++ b/resources/langs/nheko_en.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts index e9a9a729..8233ccac 100644 --- a/resources/langs/nheko_et.ts +++ b/resources/langs/nheko_et.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts index f00a0c25..192c07b2 100644 --- a/resources/langs/nheko_fi.ts +++ b/resources/langs/nheko_fi.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts index e34643a9..d5a054ff 100644 --- a/resources/langs/nheko_fr.ts +++ b/resources/langs/nheko_fr.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_it.ts b/resources/langs/nheko_it.ts index 9741741c..4b9c32d4 100644 --- a/resources/langs/nheko_it.ts +++ b/resources/langs/nheko_it.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts index 33141c45..79fdd9a4 100644 --- a/resources/langs/nheko_ja.ts +++ b/resources/langs/nheko_ja.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- @@ -1040,7 +1040,7 @@ Example: https://server.my:8787 Leave room - + 部屋を出る diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts index 462aa707..e957c578 100644 --- a/resources/langs/nheko_nl.ts +++ b/resources/langs/nheko_nl.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts index a318f41f..fd4657d7 100644 --- a/resources/langs/nheko_pl.ts +++ b/resources/langs/nheko_pl.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_ro.ts b/resources/langs/nheko_ro.ts index 0bf267da..9468bb28 100644 --- a/resources/langs/nheko_ro.ts +++ b/resources/langs/nheko_ro.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts index 034dac8b..95cef767 100644 --- a/resources/langs/nheko_ru.ts +++ b/resources/langs/nheko_ru.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_si.ts b/resources/langs/nheko_si.ts index 325a5131..d490b4d1 100644 --- a/resources/langs/nheko_si.ts +++ b/resources/langs/nheko_si.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts index b8b10957..e4927ff6 100644 --- a/resources/langs/nheko_zh_CN.ts +++ b/resources/langs/nheko_zh_CN.ts @@ -322,7 +322,7 @@ - -- Reply attack! This message index was reused! -- + -- Replay attack! This message index was reused! -- diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp index 20487b28..749d4092 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp @@ -471,7 +471,7 @@ EventStore::decryptEvent(const IdIndex &idx, room_id_, index.sender_key); dummy.content.body = - tr("-- Reply attack! This message index was reused! --").toStdString(); + tr("-- Replay attack! This message index was reused! --").toStdString(); break; case olm::DecryptionErrorCode::UnknownFingerprint: // TODO: don't fail, just show in UI. -- cgit 1.5.1