[kde-doc-english] [trojita] src/Gui: GUI: unbreak saving of individual message parts and add proper menu for saving complete messages

Jan Kundrát jkt at flaska.net
Tue May 21 21:43:15 UTC 2013


Git commit 62195e4182e169ee154a340ea490396b54578823 by Jan Kundrát.
Committed on 21/05/2013 at 23:38.
Pushed by jkt into branch 'master'.

GUI: unbreak saving of individual message parts and add proper menu for saving complete messages

Also instantiate the download managers on demand to cut down the excessive
memory use.

This has apparently been broken since I merged the patch which added the
FullMessageCombiner. Thanks to Caspar for his bugreport.

fixes #643

M  +41   -7    src/Gui/SimplePartWidget.cpp
M  +7    -3    src/Gui/SimplePartWidget.h

http://commits.kde.org/trojita/62195e4182e169ee154a340ea490396b54578823

diff --git a/src/Gui/SimplePartWidget.cpp b/src/Gui/SimplePartWidget.cpp
index 6210705..7546398 100644
--- a/src/Gui/SimplePartWidget.cpp
+++ b/src/Gui/SimplePartWidget.cpp
@@ -33,13 +33,15 @@
 #include "Gui/Util.h"
 #include "Imap/Model/ItemRoles.h"
 #include "Imap/Model/MailboxTree.h"
+#include "Imap/Model/Model.h"
 #include "Imap/Network/FileDownloadManager.h"
 
 namespace Gui
 {
 
 SimplePartWidget::SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAccessManager *manager, const QModelIndex &partIndex):
-    EmbeddedWebView(parent, manager), flowedFormat(Composer::Util::FORMAT_PLAIN)
+    EmbeddedWebView(parent, manager), m_partIndex(partIndex), m_netAccessManager(manager),
+    flowedFormat(Composer::Util::FORMAT_PLAIN)
 {
     Q_ASSERT(partIndex.isValid());
     QUrl url;
@@ -52,12 +54,13 @@ SimplePartWidget::SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAcc
         flowedFormat = Composer::Util::FORMAT_FLOWED;
     load(url);
 
-    fileDownloadManager = new Imap::Network::FileDownloadManager(this, manager, partIndex);
-    connect(fileDownloadManager, SIGNAL(fileNameRequested(QString *)), this, SLOT(slotFileNameRequested(QString *)));
+    m_savePart = new QAction(tr("Save this message part..."), this);
+    connect(m_savePart, SIGNAL(triggered()), this, SLOT(slotDownloadPart()));
+    this->addAction(m_savePart);
 
-    saveAction = new QAction(tr("Save..."), this);
-    connect(saveAction, SIGNAL(triggered()), fileDownloadManager, SLOT(downloadMessage()));
-    this->addAction(saveAction);
+    m_saveMessage = new QAction(tr("Save whole message..."), this);
+    connect(m_saveMessage, SIGNAL(triggered()), this, SLOT(slotDownloadMessage()));
+    this->addAction(m_saveMessage);
 
     m_findAction = new QAction(tr("Search..."), this);
     m_findAction->setShortcut(tr("Ctrl+F"));
@@ -173,7 +176,7 @@ void SimplePartWidget::reloadContents()
 
 QList<QAction *> SimplePartWidget::contextMenuSpecificActions() const
 {
-    return QList<QAction*>() << saveAction << m_findAction;
+    return QList<QAction*>() << m_savePart << m_saveMessage << m_findAction;
 }
 
 /** @short Connect various signals which require a certain reaction from the rest of the GUI */
@@ -190,5 +193,36 @@ void SimplePartWidget::connectGuiInteractionEvents(QObject *guiInteractionTarget
     connect(this, SIGNAL(searchDialogRequested()), guiInteractionTarget, SLOT(triggerSearchDialog()));
 }
 
+void SimplePartWidget::slotDownloadPart()
+{
+    Imap::Network::FileDownloadManager *manager = new Imap::Network::FileDownloadManager(this, m_netAccessManager, m_partIndex);
+    connect(manager, SIGNAL(fileNameRequested(QString *)), this, SLOT(slotFileNameRequested(QString *)));
+    connect(manager, SIGNAL(transferError(QString)), this, SLOT(slotTransferError(QString)));
+    connect(manager, SIGNAL(transferError(QString)), manager, SLOT(deleteLater()));
+    connect(manager, SIGNAL(succeeded()), manager, SLOT(deleteLater()));
+    manager->downloadPart();
+}
+
+void SimplePartWidget::slotDownloadMessage()
+{
+    QModelIndex index;
+    if (m_partIndex.isValid()) {
+        const Imap::Mailbox::Model *model = 0;
+        Imap::Mailbox::TreeItem *item = Imap::Mailbox::Model::realTreeItem(m_partIndex, &model);
+        Q_ASSERT(model);
+        Q_ASSERT(item);
+        Imap::Mailbox::TreeItemMessage *messagePtr = dynamic_cast<Imap::Mailbox::TreeItemPart*>(item)->message();
+        Q_ASSERT(messagePtr);
+        index = messagePtr->toIndex(const_cast<Imap::Mailbox::Model*>(model));
+    }
+
+    Imap::Network::FileDownloadManager *manager = new Imap::Network::FileDownloadManager(this, m_netAccessManager, index);
+    connect(manager, SIGNAL(fileNameRequested(QString *)), this, SLOT(slotFileNameRequested(QString *)));
+    connect(manager, SIGNAL(transferError(QString)), this, SLOT(slotTransferError(QString)));
+    connect(manager, SIGNAL(transferError(QString)), manager, SLOT(deleteLater()));
+    connect(manager, SIGNAL(succeeded()), manager, SLOT(deleteLater()));
+    manager->downloadMessage();
+}
+
 }
 
diff --git a/src/Gui/SimplePartWidget.h b/src/Gui/SimplePartWidget.h
index ee25246..3eb9cae 100644
--- a/src/Gui/SimplePartWidget.h
+++ b/src/Gui/SimplePartWidget.h
@@ -27,6 +27,7 @@
 #include "Composer/PlainTextFormatter.h"
 #include <QAction>
 #include <QFile>
+#include <QPersistentModelIndex>
 
 class QModelIndex;
 class QNetworkReply;
@@ -35,7 +36,6 @@ namespace Imap
 {
 namespace Network
 {
-class FileDownloadManager;
 class MsgPartNetAccessManager;
 }
 }
@@ -62,13 +62,17 @@ private slots:
     void slotTransferError(const QString &errorString);
     void slotFileNameRequested(QString *fileName);
     void slotMarkupPlainText();
+    void slotDownloadPart();
+    void slotDownloadMessage();
 signals:
     void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void searchDialogRequested();
 private:
-    QAction *saveAction;
+    QPersistentModelIndex m_partIndex;
+    QAction *m_savePart;
+    QAction *m_saveMessage;
     QAction *m_findAction;
-    Imap::Network::FileDownloadManager *fileDownloadManager;
+    Imap::Network::MsgPartNetAccessManager *m_netAccessManager;
     Composer::Util::FlowedFormat flowedFormat;
 
     SimplePartWidget(const SimplePartWidget &); // don't implement


More information about the kde-doc-english mailing list