File indexing completed on 2024-03-24 04:04:40
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"