File indexing completed on 2025-03-09 04:54:45

0001 /*
0002    SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "opensavedfilefolderwidget.h"
0008 
0009 #include <KIO/JobUiDelegateFactory>
0010 #include <KIO/OpenFileManagerWindowJob>
0011 #include <KIO/OpenUrlJob>
0012 #include <KLocalizedString>
0013 #include <KMessageBox>
0014 
0015 #include <QTimer>
0016 
0017 #include <QAction>
0018 #include <chrono>
0019 
0020 using namespace std::chrono_literals;
0021 using namespace MessageViewer;
0022 
0023 OpenSavedFileFolderWidget::OpenSavedFileFolderWidget(QWidget *parent)
0024     : KMessageWidget(parent)
0025     , mTimer(new QTimer(this))
0026     , mShowFolderAction(new QAction(i18nc("@action", "Open folder where attachment was saved"), this))
0027     , mOpenFileAction(new QAction(i18nc("@action", "Open File"), this))
0028 {
0029     setPosition(KMessageWidget::Header);
0030     mTimer->setSingleShot(true);
0031     mTimer->setInterval(5s); // 5 seconds
0032     connect(mTimer, &QTimer::timeout, this, &OpenSavedFileFolderWidget::slotTimeOut);
0033     setVisible(false);
0034     setCloseButtonVisible(true);
0035     setMessageType(Positive);
0036     setWordWrap(true);
0037     auto action = this->findChild<QAction *>(); // should give us the close action...
0038     if (action) {
0039         connect(action, &QAction::triggered, this, &OpenSavedFileFolderWidget::slotExplicitlyClosed);
0040     }
0041 
0042     connect(mShowFolderAction, &QAction::triggered, this, &OpenSavedFileFolderWidget::slotOpenSavedFileFolder);
0043     addAction(mShowFolderAction);
0044     connect(mOpenFileAction, &QAction::triggered, this, &OpenSavedFileFolderWidget::slotOpenFile);
0045     addAction(mOpenFileAction);
0046 }
0047 
0048 OpenSavedFileFolderWidget::~OpenSavedFileFolderWidget() = default;
0049 
0050 void OpenSavedFileFolderWidget::slotExplicitlyClosed()
0051 {
0052     if (mTimer->isActive()) {
0053         mTimer->stop();
0054     }
0055 }
0056 
0057 void OpenSavedFileFolderWidget::setUrls(const QList<QUrl> &urls, FileType fileType)
0058 {
0059     mUrls = urls;
0060     switch (fileType) {
0061     case FileType::Attachment:
0062         mShowFolderAction->setText(i18np("Open folder where attachment was saved", "Open folder where attachments were saved", mUrls.count()));
0063         break;
0064     case FileType::Pdf:
0065         mShowFolderAction->setText(i18n("Open folder where PDF file was saved"));
0066         break;
0067     }
0068 }
0069 
0070 void OpenSavedFileFolderWidget::slotOpenFile()
0071 {
0072     for (const auto &url : std::as_const(mUrls)) {
0073         auto job = new KIO::OpenUrlJob(url);
0074         job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
0075         job->setDeleteTemporaryFile(true);
0076         connect(job, &KIO::OpenUrlJob::result, this, [this](KJob *job) {
0077             if (job->error() == KIO::ERR_USER_CANCELED) {
0078                 KMessageBox::error(this, i18n("KMail was unable to open the attachment."), job->errorString());
0079             }
0080         });
0081         job->start();
0082     }
0083 }
0084 
0085 void OpenSavedFileFolderWidget::slotOpenSavedFileFolder()
0086 {
0087     if (!mUrls.isEmpty()) {
0088         KIO::highlightInFileManager(mUrls);
0089         slotHideWarning();
0090     }
0091 }
0092 
0093 void OpenSavedFileFolderWidget::slotHideWarning()
0094 {
0095     if (mTimer->isActive()) {
0096         mTimer->stop();
0097     }
0098     animatedHide();
0099 }
0100 
0101 void OpenSavedFileFolderWidget::slotShowWarning()
0102 {
0103     if (mTimer->isActive()) {
0104         mTimer->stop();
0105     }
0106     mTimer->start();
0107     animatedShow();
0108 }
0109 
0110 void OpenSavedFileFolderWidget::slotTimeOut()
0111 {
0112     animatedHide();
0113 }
0114 
0115 #include "moc_opensavedfilefolderwidget.cpp"