Skip to content

Commit

Permalink
Implement message editing
Browse files Browse the repository at this point in the history
The UI still looks ugly, but I have no good idea atm.

fixes #134
  • Loading branch information
deepbluev7 committed Feb 1, 2021
1 parent f6b09f4 commit 3556899
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 15 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,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 "")
Expand Down
2 changes: 1 addition & 1 deletion io.github.NhekoReborn.Nheko.json
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@
"name": "mtxclient",
"sources": [
{
"commit": "31e300546eb63ea25b0b879fb255beee6022da03",
"commit": "fee5298f068394958c2de935836a2c145f273906",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}
Expand Down
4 changes: 4 additions & 0 deletions resources/qml/MessageInput.qml
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,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
}

Expand Down
21 changes: 18 additions & 3 deletions resources/qml/ReplyPopup.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
}

}
1 change: 1 addition & 0 deletions resources/qml/TimelineRow.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
40 changes: 39 additions & 1 deletion src/timeline/InputBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand Down Expand Up @@ -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())) {
Expand Down
2 changes: 2 additions & 0 deletions src/timeline/InputBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -58,6 +59,7 @@ private slots:

signals:
void insertText(QString text);
void textChanged(QString newText);
void uploadingChanged(bool value);

private:
Expand Down
24 changes: 23 additions & 1 deletion src/timeline/TimelineModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1526,11 +1526,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
{
Expand Down
9 changes: 1 addition & 8 deletions src/timeline/TimelineModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 3556899

Please sign in to comment.