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

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 "mimeparttreeview.h"
0008 #include "mimetreemodel.h"
0009 #include "settings/messageviewersettings.h"
0010 
0011 #include <KMime/Content>
0012 
0013 #include <KConfigGroup>
0014 #include <QHeaderView>
0015 
0016 using namespace MessageViewer;
0017 namespace
0018 {
0019 static const char myMimePartTreeViewConfigGroupName[] = "MimePartTree";
0020 }
0021 MimePartTreeView::MimePartTreeView(QWidget *parent)
0022     : QTreeView(parent)
0023     , mMimePartModel(new MimeTreeModel(this))
0024 {
0025     setObjectName(QLatin1StringView("mMimePartTree"));
0026 
0027     setModel(mMimePartModel);
0028     setSelectionMode(QAbstractItemView::ExtendedSelection);
0029     setSelectionBehavior(QAbstractItemView::SelectRows);
0030     setContextMenuPolicy(Qt::CustomContextMenu);
0031     header()->setSectionResizeMode(QHeaderView::ResizeToContents);
0032     connect(mMimePartModel, &MimeTreeModel::modelReset, this, &MimePartTreeView::expandAll);
0033     restoreMimePartTreeConfig();
0034     setDragEnabled(true);
0035 }
0036 
0037 MimePartTreeView::~MimePartTreeView()
0038 {
0039     // root is either null or a modified tree that we need to clean up
0040     clearModel();
0041     saveMimePartTreeConfig();
0042 }
0043 
0044 MimeTreeModel *MimePartTreeView::mimePartModel() const
0045 {
0046     return mMimePartModel;
0047 }
0048 
0049 void MimePartTreeView::restoreMimePartTreeConfig()
0050 {
0051     KConfigGroup grp(KSharedConfig::openStateConfig(), QLatin1StringView(myMimePartTreeViewConfigGroupName));
0052     header()->restoreState(grp.readEntry("State", QByteArray()));
0053 }
0054 
0055 void MimePartTreeView::saveMimePartTreeConfig()
0056 {
0057     KConfigGroup grp(KSharedConfig::openStateConfig(), QLatin1StringView(myMimePartTreeViewConfigGroupName));
0058     grp.writeEntry("State", header()->saveState());
0059 }
0060 
0061 void MimePartTreeView::clearModel()
0062 {
0063     delete mMimePartModel->root();
0064     mMimePartModel->setRoot(nullptr);
0065 }
0066 
0067 void MimePartTreeView::setRoot(KMime::Content *root)
0068 {
0069     delete mMimePartModel->root();
0070     mMimePartModel->setRoot(root);
0071 }
0072 
0073 KMime::Content::List MimePartTreeView::selectedContents() const
0074 {
0075     KMime::Content::List contents;
0076     QItemSelectionModel *selectModel = selectionModel();
0077     const QModelIndexList selectedRows = selectModel->selectedRows();
0078     contents.reserve(selectedRows.count());
0079     for (const QModelIndex &index : selectedRows) {
0080         auto content = static_cast<KMime::Content *>(index.internalPointer());
0081         if (content) {
0082             contents.append(content);
0083         }
0084     }
0085     return contents;
0086 }
0087 
0088 #include "moc_mimeparttreeview.cpp"