summary refs log tree commit diff
path: root/src/timeline
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-02-01 02:22:53 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2021-02-09 20:22:53 +0100
commit9b7d33e847b02031fdc153716614f125992b3734 (patch)
treef75327037c6898accb8004fd610c57fd35048df4 /src/timeline
parentDisplay edits correctly (diff)
downloadnheko-9b7d33e847b02031fdc153716614f125992b3734.tar.xz
Implement message editing
The UI still looks ugly, but I have no good idea atm.

fixes #134
Diffstat (limited to 'src/timeline')
-rw-r--r--src/timeline/InputBar.cpp40
-rw-r--r--src/timeline/InputBar.h2
-rw-r--r--src/timeline/TimelineModel.cpp24
-rw-r--r--src/timeline/TimelineModel.h9
4 files changed, 65 insertions, 10 deletions
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)