File indexing completed on 2024-06-23 05:13:50

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     crypto/gui/objectspage.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include <config-kleopatra.h>
0011 
0012 #include "objectspage.h"
0013 
0014 #include <utils/filedialog.h>
0015 
0016 #include <KLocalizedString>
0017 #include <QIcon>
0018 
0019 #include <QFileInfo>
0020 #include <QHBoxLayout>
0021 #include <QListWidget>
0022 #include <QPushButton>
0023 #include <QVBoxLayout>
0024 
0025 using namespace Kleo;
0026 using namespace Kleo::Crypto::Gui;
0027 
0028 class ObjectsPage::Private
0029 {
0030     friend class ::Kleo::Crypto::Gui::ObjectsPage;
0031     ObjectsPage *const q;
0032 
0033 public:
0034     explicit Private(ObjectsPage *qq);
0035     ~Private();
0036     void add();
0037     void addFile(const QFileInfo &i);
0038     void remove();
0039     void listSelectionChanged();
0040     enum Role {
0041         AbsoluteFilePathRole = Qt::UserRole,
0042     };
0043 
0044 private:
0045     QListWidget *fileListWidget;
0046     QPushButton *removeButton;
0047 };
0048 
0049 ObjectsPage::Private::Private(ObjectsPage *qq)
0050     : q(qq)
0051 {
0052     q->setTitle(i18n("<b>Objects</b>"));
0053     auto const top = new QVBoxLayout(q);
0054     fileListWidget = new QListWidget;
0055     fileListWidget->setSelectionMode(QAbstractItemView::MultiSelection);
0056     connect(fileListWidget, SIGNAL(itemSelectionChanged()), q, SLOT(listSelectionChanged()));
0057     top->addWidget(fileListWidget);
0058     auto const buttonWidget = new QWidget;
0059     auto const buttonLayout = new QHBoxLayout(buttonWidget);
0060     removeButton = new QPushButton;
0061     removeButton->setText(i18n("Remove Selected"));
0062     connect(removeButton, SIGNAL(clicked()), q, SLOT(remove()));
0063     buttonLayout->addWidget(removeButton);
0064     buttonLayout->addStretch();
0065     top->addWidget(buttonWidget);
0066     listSelectionChanged();
0067 }
0068 
0069 ObjectsPage::Private::~Private()
0070 {
0071 }
0072 
0073 void ObjectsPage::Private::add()
0074 {
0075     const QString fname = FileDialog::getOpenFileName(q, i18n("Select File"), QStringLiteral("enc"));
0076     if (fname.isEmpty()) {
0077         return;
0078     }
0079     addFile(QFileInfo(fname));
0080     Q_EMIT q->completeChanged();
0081 }
0082 
0083 void ObjectsPage::Private::remove()
0084 {
0085     const QList<QListWidgetItem *> selected = fileListWidget->selectedItems();
0086     Q_ASSERT(!selected.isEmpty());
0087     for (QListWidgetItem *const i : selected) {
0088         delete i;
0089     }
0090     Q_EMIT q->completeChanged();
0091 }
0092 
0093 void ObjectsPage::Private::listSelectionChanged()
0094 {
0095     removeButton->setEnabled(!fileListWidget->selectedItems().isEmpty());
0096 }
0097 
0098 ObjectsPage::ObjectsPage(QWidget *parent, Qt::WindowFlags f)
0099     : WizardPage(parent, f)
0100     , d(new Private(this))
0101 {
0102 }
0103 
0104 ObjectsPage::~ObjectsPage()
0105 {
0106 }
0107 
0108 void ObjectsPage::setFiles(const QStringList &list)
0109 {
0110     d->fileListWidget->clear();
0111     for (const QString &i : list) {
0112         d->addFile(QFileInfo(i));
0113     }
0114     Q_EMIT completeChanged();
0115 }
0116 
0117 void ObjectsPage::Private::addFile(const QFileInfo &info)
0118 {
0119     auto const item = new QListWidgetItem;
0120     if (info.isDir()) {
0121         item->setIcon(QIcon::fromTheme(QStringLiteral("folder")));
0122     }
0123     item->setText(info.fileName());
0124     item->setData(AbsoluteFilePathRole, info.absoluteFilePath());
0125     fileListWidget->addItem(item);
0126 }
0127 
0128 QStringList ObjectsPage::files() const
0129 {
0130     QStringList list;
0131     for (int i = 0; i < d->fileListWidget->count(); ++i) {
0132         const QListWidgetItem *const item = d->fileListWidget->item(i);
0133         list.push_back(item->data(Private::AbsoluteFilePathRole).toString());
0134     }
0135     return list;
0136 }
0137 
0138 bool ObjectsPage::isComplete() const
0139 {
0140     return d->fileListWidget->count() > 0;
0141 }
0142 
0143 #include "moc_objectspage.cpp"