File indexing completed on 2024-04-28 07:51:16

0001 /*
0002     This file is part of the KDE project "KAtomic"
0003 
0004     SPDX-FileCopyrightText: 2006-2009 Dmitry Suzdalev <dimsuz@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "chooselevelsetdialog.h"
0010 
0011 
0012 #include "levelset.h"
0013 #include "levelsetdelegate.h"
0014 
0015 #include "commondefs.h"
0016 
0017 #include <KNSWidgets/Button>
0018 
0019 #include <QDialogButtonBox>
0020 #include <QPushButton>
0021 #include <QVBoxLayout>
0022 #include <QDir>
0023 
0024 ChooseLevelSetDialog::ChooseLevelSetDialog(QWidget* parent)
0025     : QDialog(parent)
0026 {
0027     setAttribute(Qt::WA_DeleteOnClose);
0028 
0029     setWindowTitle(i18n("Level Sets"));
0030     m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel|QDialogButtonBox::Apply);
0031     QWidget *mainWidget = new QWidget(this);
0032     QVBoxLayout *mainLayout = new QVBoxLayout;
0033     setLayout(mainLayout);
0034     mainLayout->addWidget(mainWidget);
0035     QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok);
0036     okButton->setDefault(true);
0037     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0038     connect(m_buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &ChooseLevelSetDialog::slotOkClicked);
0039     connect(m_buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &ChooseLevelSetDialog::slotApplyClicked);
0040     connect(m_buttonBox, &QDialogButtonBox::rejected, this, &ChooseLevelSetDialog::reject);
0041 
0042     QWidget* chooseWidget = new QWidget(this);
0043     m_ui.setupUi(chooseWidget);
0044 
0045     m_ui.m_lwLevelSets->setItemDelegate(new LevelSetDelegate(this));
0046     m_ui.m_lwLevelSets->setSortingEnabled(true);
0047 
0048     m_ui.m_pbNewStuff->setConfigFile(QStringLiteral("katomic.knsrc"));
0049 
0050     mainLayout->addWidget(chooseWidget);
0051     mainLayout->addWidget(m_buttonBox);
0052 
0053 
0054     resize(550, 350);
0055 
0056     loadData();
0057 
0058     connect(m_ui.m_lwLevelSets, &QListWidget::currentItemChanged, this, &ChooseLevelSetDialog::updateApplyButton);
0059     connect(m_ui.m_pbNewStuff, &KNSWidgets::Button::dialogFinished, this, &ChooseLevelSetDialog::newStuffDone);
0060 }
0061 
0062 void ChooseLevelSetDialog::newStuffDone(const QList<KNSCore::Entry>& entries)
0063 {
0064     if (!entries.isEmpty())
0065         loadData();
0066 }
0067 
0068 void ChooseLevelSetDialog::loadData()
0069 {
0070     m_ui.m_lwLevelSets->clear();
0071     QStringList fileList;
0072     const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::AppDataLocation, QStringLiteral("levels"), QStandardPaths::LocateDirectory);
0073     for (const QString& dir : dirs) {
0074         const QStringList fileNames = QDir(dir).entryList({QStringLiteral("*.dat")});
0075         for (const QString& file : fileNames) {
0076             fileList.append(dir + QLatin1Char('/') + file);
0077         }
0078     }
0079 
0080     LevelSet ls;
0081     for (const QString& fileName : fileList)
0082     {
0083         ls.loadFromFile(fileName);
0084         QString visibleName = ls.visibleName();
0085         if (!visibleName.isEmpty())
0086         {
0087             QListWidgetItem* item = new QListWidgetItem;
0088             item->setIcon(QIcon::fromTheme( QStringLiteral( "katomic" )));
0089             item->setText(visibleName);
0090             item->setData(KAtomic::LevelSetNameRole, ls.name());
0091             item->setData(KAtomic::LevelSetDescriptionRole, ls.description());
0092             item->setData(KAtomic::LevelSetAuthorRole, ls.author());
0093             item->setData(KAtomic::LevelSetAuthorEmailRole, ls.authorEmail());
0094             item->setData(KAtomic::LevelSetLevelCountRole, ls.levelCount());
0095             m_ui.m_lwLevelSets->addItem(item);
0096         }
0097     }
0098 
0099     // reselect current levelset if it is set
0100     if(!m_gameCurrentLevelSetName.isEmpty())
0101         setCurrentLevelSet(m_gameCurrentLevelSetName);
0102 }
0103 
0104 void ChooseLevelSetDialog::setCurrentLevelSet(const QString& levelSetName)
0105 {
0106     m_gameCurrentLevelSetName = levelSetName;
0107 
0108     int count = m_ui.m_lwLevelSets->count();
0109     for (int i=0;i<count;++i)
0110     {
0111         QListWidgetItem* item = m_ui.m_lwLevelSets->item(i);
0112         if (!item)
0113             continue;
0114 
0115         if (item->data(KAtomic::LevelSetNameRole).toString() == levelSetName)
0116         {
0117             m_ui.m_lwLevelSets->setCurrentItem(item);
0118             break;
0119         }
0120     }
0121 }
0122 
0123 void ChooseLevelSetDialog::saveSettings()
0124 {
0125     QListWidgetItem* item = m_ui.m_lwLevelSets->currentItem();
0126     if (item)
0127     {
0128         QString levelSetName = item->data(KAtomic::LevelSetNameRole).toString();
0129         Q_EMIT levelSetChanged(levelSetName);
0130 
0131         m_gameCurrentLevelSetName = levelSetName;
0132         updateApplyButton();
0133     }
0134 }
0135 
0136 void ChooseLevelSetDialog::slotApplyClicked()
0137 {
0138     saveSettings();
0139 }
0140 
0141 void ChooseLevelSetDialog::slotOkClicked()
0142 {
0143     saveSettings();
0144     accept();
0145 }
0146 
0147 void ChooseLevelSetDialog::updateApplyButton()
0148 {
0149     QListWidgetItem* item = m_ui.m_lwLevelSets->currentItem();
0150     if (item)
0151     {
0152         m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(item->data(KAtomic::LevelSetNameRole).toString() != m_gameCurrentLevelSetName);
0153     }
0154 }
0155 
0156 #include "moc_chooselevelsetdialog.cpp"