File indexing completed on 2024-06-16 05:00:37

0001 /*
0002    SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "synchronizeresourcedialog.h"
0008 #include <KListWidgetSearchLine>
0009 #include <KLocalizedString>
0010 
0011 #include <KConfigGroup>
0012 #include <KSharedConfig>
0013 #include <KWindowConfig>
0014 #include <QDialogButtonBox>
0015 #include <QLabel>
0016 #include <QListWidget>
0017 #include <QPushButton>
0018 #include <QVBoxLayout>
0019 #include <QWindow>
0020 
0021 namespace
0022 {
0023 static const char mySynchronizeResourceDialogGroupName[] = "SynchronizeResourceDialog";
0024 }
0025 SynchronizeResourceDialog::SynchronizeResourceDialog(QWidget *parent)
0026     : QDialog(parent)
0027     , mListResourceWidget(new QListWidget(this))
0028 {
0029     setWindowTitle(i18nc("@title:window", "Synchronize Resources"));
0030     auto topLayout = new QVBoxLayout(this);
0031 
0032     auto lab = new QLabel(i18n("Some resources were added but data were not sync. Select resources that you want to sync:"), this);
0033     lab->setWordWrap(true);
0034     lab->setObjectName(QLatin1StringView("label"));
0035 
0036     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0037     buttonBox->setObjectName(QLatin1StringView("buttonbox"));
0038     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0039     okButton->setDefault(true);
0040     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0041     mListResourceWidget->setObjectName(QLatin1StringView("listresourcewidget"));
0042     auto listWidgetSearchLine = new KListWidgetSearchLine(this, mListResourceWidget);
0043     listWidgetSearchLine->setObjectName(QLatin1StringView("listwidgetsearchline"));
0044 
0045     auto hbox = new QHBoxLayout;
0046     auto selectAll = new QPushButton(i18n("Select All"));
0047     selectAll->setObjectName(QLatin1StringView("selectall_button"));
0048     connect(selectAll, &QPushButton::clicked, this, &SynchronizeResourceDialog::slotSelectAll);
0049     hbox->addWidget(selectAll);
0050 
0051     auto unselectAll = new QPushButton(i18n("Unselect All"));
0052     unselectAll->setObjectName(QLatin1StringView("unselectall_button"));
0053     connect(unselectAll, &QPushButton::clicked, this, &SynchronizeResourceDialog::slotUnselectAll);
0054     hbox->addWidget(unselectAll);
0055 
0056     connect(buttonBox, &QDialogButtonBox::accepted, this, &SynchronizeResourceDialog::slotAccepted);
0057     connect(buttonBox, &QDialogButtonBox::rejected, this, &SynchronizeResourceDialog::reject);
0058     setModal(true);
0059 
0060     topLayout->addWidget(lab);
0061     topLayout->addWidget(listWidgetSearchLine);
0062     topLayout->addWidget(mListResourceWidget);
0063     topLayout->addLayout(hbox);
0064     topLayout->addWidget(buttonBox);
0065     readConfig();
0066 }
0067 
0068 SynchronizeResourceDialog::~SynchronizeResourceDialog()
0069 {
0070     writeConfig();
0071 }
0072 
0073 void SynchronizeResourceDialog::slotSelectAll()
0074 {
0075     selectItem(true);
0076 }
0077 
0078 void SynchronizeResourceDialog::slotUnselectAll()
0079 {
0080     selectItem(false);
0081 }
0082 
0083 void SynchronizeResourceDialog::selectItem(bool state)
0084 {
0085     for (int i = 0; i < mListResourceWidget->count(); ++i) {
0086         QListWidgetItem *item = mListResourceWidget->item(i);
0087         item->setCheckState(state ? Qt::Checked : Qt::Unchecked);
0088     }
0089 }
0090 
0091 void SynchronizeResourceDialog::setResources(const QHash<QString, QString> &resources)
0092 {
0093     QHashIterator<QString, QString> i(resources);
0094     while (i.hasNext()) {
0095         i.next();
0096         auto item = new QListWidgetItem(mListResourceWidget);
0097         item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
0098         item->setCheckState(Qt::Unchecked);
0099         item->setText(i.key());
0100         item->setData(ResourceIdentifier, i.value());
0101     }
0102 }
0103 
0104 QStringList SynchronizeResourceDialog::resources() const
0105 {
0106     QStringList lst;
0107     for (int i = 0; i < mListResourceWidget->count(); ++i) {
0108         QListWidgetItem *item = mListResourceWidget->item(i);
0109         if (item->checkState() == Qt::Checked) {
0110             lst << item->data(ResourceIdentifier).toString();
0111         }
0112     }
0113     return lst;
0114 }
0115 
0116 void SynchronizeResourceDialog::slotAccepted()
0117 {
0118     accept();
0119 }
0120 
0121 void SynchronizeResourceDialog::readConfig()
0122 {
0123     create(); // ensure a window is created
0124     windowHandle()->resize(QSize(600, 400));
0125     KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySynchronizeResourceDialogGroupName));
0126     KWindowConfig::restoreWindowSize(windowHandle(), group);
0127     resize(windowHandle()->size()); // workaround for QTBUG-40584
0128 }
0129 
0130 void SynchronizeResourceDialog::writeConfig()
0131 {
0132     KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySynchronizeResourceDialogGroupName));
0133     KWindowConfig::saveWindowSize(windowHandle(), group);
0134     group.sync();
0135 }
0136 
0137 #include "moc_synchronizeresourcedialog.cpp"