QTfrontend/ui/page/pagemain.cpp
author nemo
Mon, 24 Oct 2022 10:06:52 -0400
branch1.0.0
changeset 15885 ed84eb580643
parent 14804 d7b40d61729f
permissions -rw-r--r--
cfgdir needs a default value to avoid writing stubs to current path

/*
 * Hedgewars, a free turn based strategy game
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include <QGridLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QTime>
#include <QSettings>

#include "pagemain.h"
#include "hwconsts.h"
#include "hwform.h"
#include "DataManager.h"

QLayout * PageMain::bodyLayoutDefinition()
{
    QGridLayout * pageLayout = new QGridLayout();
    //pageLayout->setColumnStretch(0, 1);
    //pageLayout->setColumnStretch(1, 2);
    //pageLayout->setColumnStretch(2, 1);

    //QPushButton* btnLogo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
    //pageLayout->setAlignment(btnLogo, Qt::AlignHCenter);
    pageLayout->setRowStretch(0, 1);
    pageLayout->setRowStretch(1, 1);
    pageLayout->setRowStretch(2, 0);
    pageLayout->setRowStretch(3, 1);
    pageLayout->setRowStretch(4, 1);

    BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
    BtnSinglePlayer->setWhatsThis(tr("Play a game on a single computer"));
    pageLayout->setAlignment(BtnSinglePlayer, Qt::AlignHCenter);

    //BtnNet = addButton(":/res/NetworkPlay.png", (QBoxLayout*)netLayout, 1, true);
    BtnNet = addButton(":/res/NetworkPlay.png", pageLayout, 2, 2, 1, 2, true);
    BtnNet->setWhatsThis(tr("Play a game across a network"));
    pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);

    originalNetworkIcon = BtnNet->icon();
    disabledNetworkIcon = QIcon(":/res/NetworkPlayDisabled.png");

    //QWidget *netLayoutWidget = new QWidget();
    QVBoxLayout *netLayout = new QVBoxLayout(BtnNet);
    //pageLayout->addWidget(netLayoutWidget, 2, 2, 1, 2);
    //netLayoutWidget->setStyleSheet("background: green;");
    //netLayoutWidget->setFixedSize(314, 260);
    netLayout->setSpacing(20);
    netLayout->setAlignment(Qt::AlignHCenter);

    BtnNetLocal = addButton(tr("Play local network game"), (QBoxLayout*)netLayout, 0, false);
    BtnNetLocal->setWhatsThis(tr("Play a game across a local area network"));
    BtnNetLocal->setFixedSize(BtnNet->width() - 50, 60);
    BtnNetLocal->setVisible(false);

    BtnNetOfficial = addButton(tr("Play official network game"), (QBoxLayout*)netLayout, 0, false);
    BtnNetOfficial->setWhatsThis(tr("Play a game on an official server"));
    BtnNetOfficial->setFixedSize(BtnNet->width() - 50, 60);
    BtnNetOfficial->setVisible(false);

    // button order matters for overlapping (what's on top and what isn't)
    BtnTitle = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
    BtnTitle ->setObjectName("infoButton");
    BtnTitle->setWhatsThis(tr("Read about who is behind the Hedgewars Project"));
    pageLayout->setAlignment(BtnTitle, Qt::AlignHCenter);

    BtnInfo = addButton(":/res/AboutIcon.png", pageLayout, 0, 0, 1, 1, true);
    BtnInfo->setWhatsThis(tr("Read about who is behind the Hedgewars Project"));
    pageLayout->setAlignment(BtnInfo, Qt::AlignLeft | Qt::AlignTop);

    BtnFeedback = addButton(tr("Feedback"), pageLayout, 4, 0, 1, 4, false);
    BtnFeedback->setStyleSheet("padding: 5px 10px");
    BtnFeedback->setWhatsThis(tr("Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars"));
    pageLayout->setAlignment(BtnFeedback, Qt::AlignHCenter);

    BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 5, 0, 1, 4, false);
    BtnDataDownload->setStyleSheet("padding: 5px 10px");
    BtnDataDownload->setWhatsThis(tr("Access the user created content downloadable from our website"));
    pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);

    // disable exit button sound
    btnBack->isSoundEnabled = false;

    return pageLayout;
}

QLayout * PageMain::footerLayoutDefinition()
{
    QHBoxLayout * bottomLayout = new QHBoxLayout();

    mainNote = new QLabel(this);
    mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    mainNote->setWordWrap(true);

    bottomLayout->addWidget(mainNote, 0);
    bottomLayout->setStretch(0,1);

    btnBack->setWhatsThis(tr("Exit game"));

#ifdef VIDEOREC
    BtnVideos = addButton(":/res/Videos.png", bottomLayout, 1, true, Qt::AlignBottom);
    BtnVideos->setWhatsThis(tr("Manage videos recorded from game"));
#endif

    BtnHelp = addButton(":/res/Help.png", bottomLayout, 2, true, Qt::AlignBottom);
    BtnHelp->setWhatsThis(tr("Open the Hedgewars online game manual in your web browser"));

    BtnSetup = addButton(":/res/Settings.png", bottomLayout, 3, true, Qt::AlignBottom);
    BtnSetup->setWhatsThis(tr("Edit game preferences"));

    return bottomLayout;
}

void PageMain::connectSignals()
{
#ifndef QT_DEBUG
    connect(this, SIGNAL(pageEnter()), this, SLOT(updateTip()));
#endif
    connect(BtnNet, SIGNAL(clicked()), this, SLOT(toggleNetworkChoice()));
    //connect(BtnNetLocal, SIGNAL(clicked()), this, SLOT(toggleNetworkChoice()));
    //connect(BtnNetOfficial, SIGNAL(clicked()), this, SLOT(toggleNetworkChoice()));
    // TODO: add signal-forwarding required by (currently missing) encapsulation
}

PageMain::PageMain(QWidget* parent) : AbstractPage(parent)
{
    initPage();

    if(frontendEffects)
        setAttribute(Qt::WA_NoSystemBackground, true);
    mainNote->setOpenExternalLinks(true);
#ifdef QT_DEBUG
    setDefaultDescription(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete!"));
#else
    setDefaultDescription(QLabel::tr("Tip: %1").arg(randomTip()));
#endif
}

void PageMain::updateTip()
{
    setDefaultDescription(QLabel::tr("Tip: %1").arg(randomTip()));
}

QString PageMain::randomTip()
{
#ifdef _WIN32
    int platform = 1;
#elif defined __APPLE__
    int platform = 2;
#else
    int platform = 3;
#endif
    if(!Tips.length())
    {
        DataManager & dataMgr = DataManager::instance();

        // get locale
        QSettings settings(dataMgr.settingsFileName(),
                           QSettings::IniFormat);

        QString loc = QLocale().name();

        QString tipFile = QString("physfs://Locale/tips_" + loc + ".xml");

        // if file is non-existant try with language only
        if (!QFile::exists(tipFile))
            tipFile = QString("physfs://Locale/tips_" + loc.remove(QRegExp("_.*$")) + ".xml");

        // fallback if file for current locale is non-existant
        if (!QFile::exists(tipFile))
            tipFile = QString("physfs://Locale/tips_en.xml");

        QFile file(tipFile);
        file.open(QIODevice::ReadOnly);
        QTextStream in(&file);
        in.setCodec("UTF-8");
        QString line = in.readLine();
        int tip_platform = 0;
        while (!line.isNull()) {
            if(line.contains("<windows-only>", Qt::CaseSensitive))
                tip_platform = 1;
            if(line.contains("<mac-only>", Qt::CaseSensitive))
                tip_platform = 2;
            if(line.contains("<linux-only>", Qt::CaseSensitive))
                tip_platform = 3;
            if(line.contains("</windows-only>", Qt::CaseSensitive) ||
                    line.contains("</mac-only>", Qt::CaseSensitive) ||
                    line.contains("</linux-only>", Qt::CaseSensitive)) {
                tip_platform = 0;
            }
            QStringList split_string = line.split(QRegExp("</?tip>"));
            if((tip_platform == platform || tip_platform == 0) && split_string.size() != 1)
                Tips << split_string[1];
            line = in.readLine();
        }
        // The following tip will require links to app store entries first.
        //Tips << tr("Want to play Hedgewars any time? Grab the Mobile version for %1 and %2.", "Tips").arg("").arg("");
        // the ios version is located here: http://itunes.apple.com/us/app/hedgewars/id391234866

        file.close();
    }

    if(Tips.length())
        return Tips[QTime(0, 0, 0).secsTo(QTime::currentTime()) % Tips.length()];
    else
        return QString();
}

void PageMain::toggleNetworkChoice()
{
    bool visible = BtnNetLocal->isVisible();
    BtnNetLocal->setVisible(!visible);
    BtnNetOfficial->setVisible(!visible);
    if (visible)    BtnNet->setIcon(originalNetworkIcon);
    else            BtnNet->setIcon(disabledNetworkIcon);
}

void PageMain::resetNetworkChoice()
{
    BtnNetLocal->setVisible(false);
    BtnNetOfficial->setVisible(false);
    BtnNet->setIcon(originalNetworkIcon);
}