diff --git a/imports/Spectral/Component/Timeline/MessageDelegate.qml b/imports/Spectral/Component/Timeline/MessageDelegate.qml index 514ce67..263d334 100644 --- a/imports/Spectral/Component/Timeline/MessageDelegate.qml +++ b/imports/Spectral/Component/Timeline/MessageDelegate.qml @@ -160,7 +160,7 @@ ColumnLayout { id: contentLabel - text: "" + (replyEventId ? display.replace(/.*<\/mx-reply>/g, "") : display) + text: "" + display color: "white" diff --git a/imports/Spectral/Panel/RoomListPanel.qml b/imports/Spectral/Panel/RoomListPanel.qml index 1d5b867..a022131 100644 --- a/imports/Spectral/Panel/RoomListPanel.qml +++ b/imports/Spectral/Panel/RoomListPanel.qml @@ -854,11 +854,30 @@ Rectangle { title: "Action Required" modal: true - standardButtons: Dialog.Ok | Dialog.Cancel contentItem: Label { text: "Accept this invitation?" } - onAccepted: currentRoom.acceptInvitation() - onRejected: currentRoom.forget() + footer: DialogButtonBox { + Button { + text: "Accept" + flat: true + + onClicked: currentRoom.acceptInvitation() + } + + Button { + text: "Reject" + flat: true + + onClicked: currentRoom.forget() + } + + Button { + text: "Reject" + flat: true + + onClicked: inviteDialog.close() + } + } } } diff --git a/imports/Spectral/Panel/RoomPanel.qml b/imports/Spectral/Panel/RoomPanel.qml index 44e0679..d59e8b6 100644 --- a/imports/Spectral/Panel/RoomPanel.qml +++ b/imports/Spectral/Panel/RoomPanel.qml @@ -115,8 +115,6 @@ Item { currentRoom.getPreviousContent(20); } - onMovementEnded: currentRoom.saveViewport(sortedMessageEventModel.mapToSource(indexAt(contentX, contentY)), sortedMessageEventModel.mapToSource(largestVisibleIndex)) - displaced: Transition { NumberAnimation { property: "y"; duration: 200 @@ -126,6 +124,7 @@ Item { delegate: ColumnLayout { width: parent.width + implicitHeight: 32 id: delegateColumn @@ -330,13 +329,14 @@ Item { function goToEvent(eventID) { var index = messageEventModel.eventIDToIndex(eventID) if (index === -1) return - messageListView.currentIndex = -1 - messageListView.currentIndex = sortedMessageEventModel.mapFromSource(index) +// messageListView.currentIndex = sortedMessageEventModel.mapFromSource(index) + messageListView.positionViewAtIndex(sortedMessageEventModel.mapFromSource(index), ListView.Contain) } function saveReadMarker(room) { var readMarker = sortedMessageEventModel.get(messageListView.largestVisibleIndex).eventId if (!readMarker) return room.readMarkerEventId = readMarker + currentRoom.saveViewport(sortedMessageEventModel.mapToSource(messageListView.indexAt(messageListView.contentX, messageListView.contentY)), sortedMessageEventModel.mapToSource(messageListView.largestVisibleIndex)) } } diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index a41eafc..6ec1730 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include // for qmlRegisterType() @@ -265,9 +264,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const { } if (role == MessageRole) { - static const QRegExp rmReplyRegExp("^> <@.*:.*> .*\n\n(.*)"); - return utils::eventToString(evt, m_currentRoom) - .replace(rmReplyRegExp, "\\1"); + return utils::removeReply(utils::eventToString(evt, m_currentRoom)); } if (role == Qt::ToolTipRole) { diff --git a/src/utils.cpp b/src/utils.cpp index 3b87e44..3154dd3 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -6,3 +6,10 @@ QString utils::removeReply(const QString& text) { result.remove(utils::removeReplyRegex); return result; } + +QString utils::cleanHTML(const QString& text, QMatrixClient::Room* room) { + QString result(text); + result.replace(codePillRegExp, "\\1"); + result.replace(userPillRegExp, "\\1"); + return result; +} diff --git a/src/utils.h b/src/utils.h index f754760..cce426d 100644 --- a/src/utils.h +++ b/src/utils.h @@ -5,7 +5,7 @@ #include "user.h" #include -#include +#include #include #include @@ -14,10 +14,18 @@ #include namespace utils { -const QRegExp removeReplyRegex{"> <.*>.*\\n\\n"}; -const QRegExp removeRichReplyRegex{".*"}; +static const QRegularExpression removeReplyRegex{ + "> <.*?>.*?\\n\\n", QRegularExpression::DotMatchesEverythingOption}; +static const QRegularExpression removeRichReplyRegex{ + ".*?", QRegularExpression::DotMatchesEverythingOption}; +static const QRegularExpression codePillRegExp{ + "
(.*?)
", QRegularExpression::DotMatchesEverythingOption}; +static const QRegularExpression userPillRegExp{ + "(.*?)", + QRegularExpression::DotMatchesEverythingOption}; QString removeReply(const QString& text); +QString cleanHTML(const QString& text, QMatrixClient::Room* room); template QString eventToString(const BaseEventT& evt, @@ -33,22 +41,8 @@ QString eventToString(const BaseEventT& evt, if (prettyPrint && e.hasTextContent() && e.mimeType().name() != "text/plain") { - static const QRegExp userPillRegExp( - ".*"); - QString formattedStr( - static_cast(e.content())->body); - int pos = 0; - while ((pos = userPillRegExp.indexIn(formattedStr, pos)) != -1) { - QString userId = userPillRegExp.cap(1); - formattedStr.remove(pos, userPillRegExp.matchedLength()); - formattedStr.insert(pos, "" + - room->user(userId)->displayname() + - ""); - pos += userPillRegExp.matchedLength(); - } - static const QRegExp codePillRegExp("
(.*)
"); - formattedStr.replace(codePillRegExp, "\\1"); - return formattedStr; + return cleanHTML(static_cast(e.content())->body, + room); } if (e.hasFileContent()) { auto fileCaption = e.content()->fileInfo()->originalName;