diff --git a/CMakeLists.txt b/CMakeLists.txt
index 577cbffc..2d3c189f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -356,7 +356,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
- GIT_TAG 31e300546eb63ea25b0b879fb255beee6022da03
+ GIT_TAG fee5298f068394958c2de935836a2c145f273906
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index f498dd5a..453d6c8a 100644
--- a/io.github.NhekoReborn.Nheko.json
+++ b/io.github.NhekoReborn.Nheko.json
@@ -220,7 +220,7 @@
"name": "mtxclient",
"sources": [
{
- "commit": "31e300546eb63ea25b0b879fb255beee6022da03",
+ "commit": "fee5298f068394958c2de935836a2c145f273906",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}
diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index 9a83b52b..d665566c 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -261,6 +261,10 @@ Rectangle {
Connections {
ignoreUnknownSignals: true
onInsertText: messageInput.insert(messageInput.cursorPosition, text)
+ onTextChanged: {
+ messageInput.text = newText;
+ messageInput.cursorPosition = newText.length;
+ }
target: TimelineManager.timeline ? TimelineManager.timeline.input : null
}
diff --git a/resources/qml/ReplyPopup.qml b/resources/qml/ReplyPopup.qml
index 4659e075..85b64114 100644
--- a/resources/qml/ReplyPopup.qml
+++ b/resources/qml/ReplyPopup.qml
@@ -10,14 +10,15 @@ Rectangle {
property var room: TimelineManager.timeline
Layout.fillWidth: true
- visible: room && room.reply
+ visible: room && (room.reply || room.edit)
// Height of child, plus margins, plus border
- implicitHeight: replyPreview.height + 10
+ implicitHeight: (room && room.reply ? replyPreview.height : closeEditButton.height) + 10
color: colors.window
z: 3
Reply {
id: replyPreview
+ visible: room && room.reply
anchors.left: parent.left
anchors.leftMargin: 2 * 22 + 3 * 16
@@ -31,9 +32,10 @@ Rectangle {
ImageButton {
id: closeReplyButton
+ visible: room && room.reply
anchors.right: parent.right
- anchors.rightMargin: 15
+ anchors.rightMargin: 16
anchors.top: replyPreview.top
hoverEnabled: true
width: 16
@@ -44,4 +46,17 @@ Rectangle {
onClicked: room.reply = undefined
}
+ Button {
+ id: closeEditButton
+ visible: room && room.edit
+
+ anchors.left: parent.left
+ anchors.rightMargin: 16
+ anchors.topMargin: 10
+ anchors.top: parent.top
+ //height: 16
+ text: qsTr("Abort edit")
+ onClicked: room.edit = undefined
+ }
+
}
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index e4dc267b..d4f058e5 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -89,6 +89,7 @@ Item {
id: editButton
visible: (Settings.buttonsInTimeline && model.isEditable) || model.isEdited
+ buttonTextColor: chat.model.edit == model.id ? colors.highlight : colors.buttonText
Layout.alignment: Qt.AlignRight | Qt.AlignTop
Layout.preferredHeight: 16
width: 16
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index 738fb37c..08cbd15b 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -268,7 +268,18 @@ InputBar::message(QString msg, MarkdownOverride useMarkdown)
text.format = "org.matrix.custom.html";
}
- if (!room->reply().isEmpty()) {
+ if (!room->edit().isEmpty()) {
+ if (!room->reply().isEmpty()) {
+ text.relations.relations.push_back(
+ {mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
+ room->resetReply();
+ }
+
+ text.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+
+ } else if (!room->reply().isEmpty()) {
auto related = room->relatedInfo(room->reply());
QString body;
@@ -321,6 +332,11 @@ InputBar::emote(QString msg)
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
room->resetReply();
}
+ if (!room->edit().isEmpty()) {
+ emote.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+ }
room->sendMessageEvent(emote, mtx::events::EventType::RoomMessage);
}
@@ -352,6 +368,11 @@ InputBar::image(const QString &filename,
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
room->resetReply();
}
+ if (!room->edit().isEmpty()) {
+ image.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+ }
room->sendMessageEvent(image, mtx::events::EventType::RoomMessage);
}
@@ -378,6 +399,11 @@ InputBar::file(const QString &filename,
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
room->resetReply();
}
+ if (!room->edit().isEmpty()) {
+ file.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+ }
room->sendMessageEvent(file, mtx::events::EventType::RoomMessage);
}
@@ -405,6 +431,11 @@ InputBar::audio(const QString &filename,
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
room->resetReply();
}
+ if (!room->edit().isEmpty()) {
+ audio.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+ }
room->sendMessageEvent(audio, mtx::events::EventType::RoomMessage);
}
@@ -431,6 +462,11 @@ InputBar::video(const QString &filename,
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
room->resetReply();
}
+ if (!room->edit().isEmpty()) {
+ video.relations.relations.push_back(
+ {mtx::common::RelationType::Replace, room->edit().toStdString()});
+ room->resetEdit();
+ }
room->sendMessageEvent(video, mtx::events::EventType::RoomMessage);
}
@@ -524,6 +560,8 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
[this](const QByteArray data, const QString &mime, const QString &fn) {
setUploading(true);
+ setText("");
+
auto payload = std::string(data.data(), data.size());
std::optional<mtx::crypto::EncryptedFile> encryptedFile;
if (cache::isRoomEncrypted(room->roomId().toStdString())) {
diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h
index f173bbc0..696a0dd9 100644
--- a/src/timeline/InputBar.h
+++ b/src/timeline/InputBar.h
@@ -41,6 +41,7 @@ public slots:
QString text() const;
QString previousText();
QString nextText();
+ void setText(QString newText) { emit textChanged(newText); }
void send();
void paste(bool fromMouse);
@@ -58,6 +59,7 @@ private slots:
signals:
void insertText(QString text);
+ void textChanged(QString newText);
void uploadingChanged(bool value);
private:
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index dd4f8696..de43d5ea 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -1529,11 +1529,33 @@ TimelineModel::setEdit(QString newEdit)
if (ev) {
setReply(QString::fromStdString(
mtx::accessors::relations(*ev).reply_to().value_or("")));
- // input()->setText(mtx::accessors::body(*ev));
+
+ auto msgType = mtx::accessors::msg_type(*ev);
+ if (msgType == mtx::events::MessageType::Text ||
+ msgType == mtx::events::MessageType::Notice) {
+ input()->setText(relatedInfo(newEdit).quoted_body);
+ } else if (msgType == mtx::events::MessageType::Emote) {
+ input()->setText("/me " + relatedInfo(newEdit).quoted_body);
+ } else {
+ input()->setText("");
+ }
+ } else {
+ input()->setText("");
}
}
}
+void
+TimelineModel::resetEdit()
+{
+ if (!edit_.isEmpty()) {
+ edit_ = "";
+ emit editChanged(edit_);
+ input()->setText("");
+ resetReply();
+ }
+}
+
QString
TimelineModel::roomName() const
{
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 463d8705..0aec27a1 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -274,14 +274,7 @@ public slots:
}
QString edit() const { return edit_; }
void setEdit(QString newEdit);
- void resetEdit()
- {
- if (!edit_.isEmpty()) {
- edit_ = "";
- emit editChanged(edit_);
- resetReply();
- }
- }
+ void resetEdit();
void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; }
void clearTimeline() { events.clearTimeline(); }
void receivedSessionKey(const std::string &session_key)
|