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/TimelineViewManager.cpp | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src/timeline/TimelineViewManager.cpp') 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) -- 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/TimelineViewManager.cpp') 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/TimelineViewManager.cpp') 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