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"