diff options
-rw-r--r-- | message.cpp | 19 | ||||
-rw-r--r-- | message.h | 2 | ||||
-rw-r--r-- | qml/Message.qml | 60 |
3 files changed, 80 insertions, 1 deletions
diff --git a/message.cpp b/message.cpp index 4da0fd1..6d02db1 100644 --- a/message.cpp +++ b/message.cpp @@ -52,6 +52,25 @@ DcMessage::getTimestamp() return QDateTime::fromSecsSinceEpoch (dc_msg_get_timestamp(m_message), Qt::UTC); } +bool +DcMessage::saveAttach(QString dest) +{ + if(!dest.isNull()){ + char *file = dc_msg_get_file(m_message); + QString fileUrl{file}; + dc_str_unref(file); + // we need to replace, so we delete file first + if (QFile::exists(dest)){ + if(!QFile::remove(dest)) + return false; + } + return QFile::copy(fileUrl, dest); + } + else{ + return false; + } +} + void DcMessage::setText(QString text) { @@ -2,6 +2,7 @@ #include <QDateTime> #include <QObject> +#include <QFile> #include <deltachat.h> @@ -44,6 +45,7 @@ public: Q_INVOKABLE QDateTime getTimestamp(); //Q_INVOKABLE int64_t getReceivedTimestamp(); //Q_INVOKABLE int64_t getSortTimestamp(); + Q_INVOKABLE bool saveAttach(QString); Q_INVOKABLE void setText(QString); Q_INVOKABLE void setFile(QString); Q_INVOKABLE QString getText(); diff --git a/qml/Message.qml b/qml/Message.qml index 9d8f377..fc69e8f 100644 --- a/qml/Message.qml +++ b/qml/Message.qml @@ -12,6 +12,8 @@ RowLayout { property DcMessage message property DcContext context + property var saveAsUrl: "" + property var saveSuccess: false readonly property DcContact from: context.getContact(message.fromId) readonly property DcMessage quoteMessage: message.quotedMessage readonly property DcContact quoteFrom: quoteMessage ? context.getContact(quoteMessage.fromId) : null @@ -33,6 +35,49 @@ RowLayout { } } + Popup { + id: saveAsPopup + + modal: true + focus: true + anchors.centerIn: parent + width: 400 + height: 100 + padding: 10 + onClosed: saveAsUrl = "" + contentChildren: [ + Text { + text: saveSuccess == true ? "Success !" : "Failure !" + bottomPadding: 10 + font.bold: true + font.pixelSize: 14 + }, + Text { + text: saveSuccess == true ? "The file has been saved locally at <br><b>" + saveAsUrl + "</b>" : "An error was detected. Maybe you<br>dont have enough permissions to copy the file to <br><b>" + saveAsUrl + "</b>" + topPadding: 20 + leftPadding: 10 + bottomPadding: 20 + } + ] + } + + FileDialog { + id: saveAsDialog + + title: "Save attachment `" + root.message.filename + "` as ..." + folder: shortcuts.home + selectFolder: false + selectExisting: false + onAccepted: { + var url = saveAsDialog.fileUrl.toString(); + if (url.startsWith("file://")) { + saveAsUrl = url.substring(7); + saveSuccess = root.message.saveAttach(saveAsUrl); + saveAsPopup.open(); + } + } + } + Rectangle { Layout.leftMargin: Kirigami.Units.largeSpacing Layout.preferredWidth: messageContents.width @@ -174,7 +219,7 @@ RowLayout { padding: 5 icon.name: "document-save-as" text: "Save attachment" - onClicked: console.log("dummy") + onClicked: saveAsDialog.open() } } @@ -220,11 +265,24 @@ RowLayout { Menu { id: contextMenu + Component.onCompleted: { + if (!root.message.filename.length > 0) + contextMenu.removeAction(saveAsContext); + + } + Action { text: "Info" onTriggered: messageDialog.open() } + Action { + id: saveAsContext + + text: "Save attachment as ..." + onTriggered: saveAsDialog.open() + } + } } |