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"