diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagetraining.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagetraining.cpp Wed Sep 28 19:27:56 2011 +0200 @@ -0,0 +1,234 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "pagetraining.h" +#include "hwconsts.h" + +QLayout * PageTraining::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + +// left column + + // declare start button, caption and description + btnPreview = formattedButton(":/res/Trainings.png", true); + btnPreview->setToolTip(QPushButton::tr("Go!")); + + // make both rows equal height + pageLayout->setRowStretch(0, 1); + pageLayout->setRowStretch(1, 1); + + // add start button, caption and description to 3 different rows + pageLayout->addWidget(btnPreview, 0, 0); + + // center preview + pageLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter); + + +// right column + + // info area (caption on top, description below) + QVBoxLayout * infoLayout = new QVBoxLayout(); + + lblCaption = new QLabel(); + lblCaption->setMinimumWidth(360); + lblCaption->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); + lblCaption->setWordWrap(true); + lblDescription = new QLabel(); + lblDescription->setMinimumWidth(360); + lblDescription->setAlignment(Qt::AlignHCenter | Qt::AlignTop); + lblDescription->setWordWrap(true); + + infoLayout->addWidget(lblCaption); + infoLayout->addWidget(lblDescription); + + pageLayout->addLayout(infoLayout, 0, 1); + pageLayout->setAlignment(infoLayout, Qt::AlignLeft); + + + // mission list + lstMissions = new QListWidget(this); + pageLayout->addWidget(lstMissions, 1, 0, 1, 2); // span 2 columns + + // let's not make the list use more space than needed + lstMissions->setFixedWidth(360); + pageLayout->setAlignment(lstMissions, Qt::AlignHCenter); + + return pageLayout; +} + +QLayout * PageTraining::footerLayoutDefinition() +{ + QBoxLayout * bottomLayout = new QVBoxLayout(); + + btnStart = formattedButton(QPushButton::tr("Go!")); + btnStart->setFixedWidth(140); + + bottomLayout->addWidget(btnStart); + + bottomLayout->setAlignment(btnStart, Qt::AlignRight | Qt::AlignVCenter); + + return bottomLayout; +} + + +void PageTraining::connectSignals() +{ + connect(lstMissions, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstMissions, SIGNAL(clicked()), this, SLOT(updateInfo())); + connect(lstMissions, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + connect(btnPreview, SIGNAL(clicked()), this, SLOT(startSelected())); + connect(btnStart, SIGNAL(clicked()), this, SLOT(startSelected())); +} + + +PageTraining::PageTraining(QWidget* parent) : AbstractPage(parent) +{ + initPage(); + + // get locale + QSettings settings(cfgdir->absolutePath() + "/hedgewars.ini", + QSettings::IniFormat); + + QString loc = settings.value("misc/locale", "").toString(); + if (loc.isEmpty()) + loc = QLocale::system().name(); + + QString infoFile = + datadir->absolutePath() + "/Locale/missions_" + loc + ".txt"; + + // if file is non-existant try with language only + if (!QFile::exists(infoFile)) + infoFile = datadir->absolutePath() + "/Locale/missions_" + + loc.replace(QRegExp("_.*$"),"") + ".txt"; + + // fallback if file for current locale is non-existant + if (!QFile::exists(infoFile)) + infoFile = datadir->absolutePath() + "/Locale/missions_en.txt"; + + // preload mission info for current locale + m_info = new QSettings(infoFile, QSettings::IniFormat, this); + +// TODO -> this should be done in a tool "DataDir" class + QDir tmpdir; + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data/Missions/Training"); + QStringList missionList = scriptList(tmpdir); + missionList.sort(); + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Missions/Training"); + QStringList defaultList = scriptList(tmpdir); + defaultList.sort(); + + // add non-duplicate default scripts to the list + foreach (const QString & mission, defaultList) + { + if (!missionList.contains(mission)) + missionList.append(mission); + } + + // add default scripts that have names different from detected user scripts + foreach (const QString & mission, missionList) + { + QListWidgetItem * item = new QListWidgetItem(mission); + + // fallback name: replace underscores in mission name with spaces + QString name = item->text().replace("_", " "); + + // see if we can get a prettier/translated name + name = m_info->value(mission + ".name", name).toString(); + + item->setText(name); + + // store original name in data + item->setData(Qt::UserRole, mission); + + lstMissions->addItem(item); + } + + updateInfo(); + + // pre-select first mission + if (lstMissions->count() > 0) + lstMissions->setCurrentRow(0); +} + +QStringList PageTraining::scriptList(const QDir & scriptDir) const +{ + QDir dir = scriptDir; + dir.setFilter(QDir::Files); + return dir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1"); +} + + +void PageTraining::startSelected() +{ + QListWidgetItem * curItem = lstMissions->currentItem(); + + if (curItem != NULL) + emit startMission(curItem->data(Qt::UserRole).toString()); +} + + +void PageTraining::updateInfo() +{ + if (lstMissions->currentItem()) + { + // TODO also use .pngs in userdata folder + QString thumbFile = datadir->absolutePath() + + "/Graphics/Missions/Training/" + + lstMissions->currentItem()->data(Qt::UserRole).toString() + + ".png"; + + if (QFile::exists(thumbFile)) + btnPreview->setIcon(QIcon(thumbFile)); + else + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + + QString realName = lstMissions->currentItem()->data( + Qt::UserRole).toString(); + + QString caption = m_info->value(realName + ".name", + lstMissions->currentItem()->text()).toString(); + + QString description = m_info->value(realName + ".desc", + tr("No description available")).toString(); + + lblCaption->setText("

" + caption +"

"); + lblDescription->setText(description); + } + else + { + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + lblCaption->setText(tr("Select a mission!")); + // TODO better text and tr() + lblDescription->setText(""); + } +}