RetroShare/plugins/patience_plugin/Patience/MainWindow.cpp
defnax 0b78ed6ff8 added patience plugin
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@2245 b45a01b8-16f6-495d-af2f-9b41ad6348cc
2010-02-08 22:33:14 +00:00

351 lines
11 KiB
C++

#include "MainWindow.h"
#include "Scene.h"
#include "Highscore.h"
#include "Speichern_frage.h"
#include <QMessageBox>
#include <QSettings>
#include <QMessageBox>
#include <QActionGroup>
#include <QLabel>
#include <QCloseEvent>
using namespace std;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
// die benutzeroberflaeche aufbauen
setupUi(this);
// osx spezifische einstellungen vornehmen
#ifdef Q_WS_MAC
setUnifiedTitleAndToolBarOnMac(true);
#endif
// einstellungen erstellen
einstellungen = new QSettings("konarski-wuppertal", "Patience", this);
// es ist noetigm das einige einstellungen vorab geladen werden, damit sie von vorne herein verfuegbar sind !!!
// den kartentyp laden
QString kartentyp(einstellungen->value("deckblatt", "french").toString());
// sicherstellen, das der geladene kartentyp gueltig ist
if (kartentyp != "french" && kartentyp != "german") kartentyp = "french";
// action_french und action_german zu einer gruppe verbinden
QActionGroup *deckblatt_gruppe = new QActionGroup(this);
deckblatt_gruppe->addAction(action_french);
deckblatt_gruppe->addAction(action_german);
// die action gruppe initialisieren
if (kartentyp == "french") action_french->setChecked(true);
else action_german->setChecked(true);
// action_eine_ziehen und action_drei_ziehen zu einer gruppe verbinden ...
QActionGroup *spieltyp_gruppe = new QActionGroup(this);
spieltyp_gruppe->addAction(action_eine_ziehen);
spieltyp_gruppe->addAction(action_drei_ziehen);
// ... und initialisieren
action_eine_ziehen->setChecked(true);
// action_speichern und action_nicht_speichern zu eoner gruppe verbinden
QActionGroup *speichern_gruppe = new QActionGroup(this);
speichern_gruppe->addAction(action_speichern);
speichern_gruppe->addAction(action_nicht_speichern);
// scene erstellen ...
scene = new Scene(kartentyp, viewer);
scene->setObjectName("scene");
scene->setSceneRect(0, 0, 795, 595);
scene->registriere_einstellungen(einstellungen);
// ... und in viewer registrieren
viewer->setScene(scene);
// siegmeldung erzeugen
siegmeldung = new QMessageBox(this);
siegmeldung->setWindowModality(Qt::WindowModal);
siegmeldung->setWindowTitle(tr("Patience - You won !"));
siegmeldung->setText(tr("You won, but you don't reach a highscore."));
siegmeldung->addButton(QMessageBox::Ok);
sicherheitsfrage = new QMessageBox(this);
sicherheitsfrage->setWindowModality(Qt::WindowModal);
sicherheitsfrage->setWindowTitle(tr("Patience - Start new game ?"));
sicherheitsfrage->setText(tr("Start a new Game and break the current Game ?"));
sicherheitsfrage->addButton(QMessageBox::Yes);
sicherheitsfrage->addButton(QMessageBox::No);
// punktelabel und zeitlabel erzeugen ...
punktelabel = new QLabel(this);
zeitlabel = new QLabel(this);
// ... und der statusleiste als permanentes widget hinzufuegen
statusBar()->addPermanentWidget(punktelabel);
statusBar()->addPermanentWidget(zeitlabel);
// highscore erzeugen
highscore = new Highscore(this);
highscore->registriere_einstellungen(einstellungen);
// speichern_frage erstellen
speichern_frage = new Speichern_frage(this);
speichern_frage->setObjectName("speichern_frage");
// signal - slot verbindungen
// das starten neuer spiele ermoeglichen
connect(action_neues_spiel, SIGNAL(triggered(bool)), this, SLOT(neues_spiel()));
// action_about ermoeglichen
connect(action_about, SIGNAL(triggered(bool)), this, SLOT(about()));
// action_about_qt ermoeglichen
connect(action_about_qt, SIGNAL(triggered(bool)), qApp, SLOT(aboutQt()));
// das anzeigen der siegmeldung ermoeglichen
connect(scene, SIGNAL(gewonnen(int, long)), this, SLOT(gewonnen(int, long)));
// das umschalten des deckblattes waehrend des spiels ermoeglichen
connect(action_french, SIGNAL(triggered(bool)), scene, SLOT(lade_franzoesisches_deckblatt()));
connect(action_german, SIGNAL(triggered(bool)), scene, SLOT(lade_deutsches_deckblatt()));
// das aktualisieren der punkte ermoeglichen
connect(scene, SIGNAL(neue_punktzahl(int)), this, SLOT(aktualisiere_punktelabel(int)));
// das aktualisieren der spielzeit ermoeglichen
connect(scene, SIGNAL(verstrichene_sekunden(long)), this, SLOT(aktualisiere_spielzeit(long)));
// das anzeigen der highscore ermoeglichen
connect(action_highscore, SIGNAL(triggered(bool)), highscore, SLOT(show()));
// das umschalten des spieltyps ermoeglichen
connect(action_eine_ziehen, SIGNAL(triggered(bool)), this, SLOT(eine_ziehen()));
connect(action_drei_ziehen, SIGNAL(triggered(bool)), this, SLOT(drei_ziehen()));
// das steuern der rahmen sichtbarkeit ermoeglichen
connect(action_rahmen, SIGNAL(triggered(bool)), scene, SIGNAL(rahmen_anzeigen(bool)));
// action_schliessen ermoeglichen
connect(action_beenden, SIGNAL(triggered(bool)), this, SLOT(close()));
// action_undo ermoeglichen
connect(action_undo, SIGNAL(triggered(bool)), scene, SLOT(rueckgaengig()));
// steuerung der verfuegbarkeit von action_undo ermoeglichen
connect(scene, SIGNAL(undo_verfuegbar(bool)), action_undo, SLOT(setEnabled(bool)));
// action_fragen und speichern_frage verbinden
connect(action_fragen, SIGNAL(toggled(bool)), speichern_frage, SLOT(verbindung_merken(bool)));
connect(speichern_frage, SIGNAL(verbindung_merk_status(bool)), action_fragen, SLOT(setChecked(bool)));
// den speicher status mit action_speichern und action_nicht_speichern verbinden
connect(speichern_frage, SIGNAL(wird_gespeichert(bool)), action_speichern, SLOT(setChecked(bool)));
connect(speichern_frage, SIGNAL(wird_nicht_gespeichert(bool)), action_nicht_speichern, SLOT(setChecked(bool)));
connect(action_speichern, SIGNAL(toggled(bool)), speichern_frage, SLOT(setze_speichern(bool)));
// die restlichen einstellungen laden
restliche_einstellungen_laden();
}
MainWindow::~MainWindow()
{
// die einstellungen speichern
einstellungen_speichern();
}
void MainWindow::neues_spiel()
{
// wenn kein spiel laueft, einfach eins starten ...
if (scene->laufendes_spiel() == false) scene->neues_spiel();
// ansonsten erst nach einer sicherheitsfrage ein neues spiel starten
else
{
QAbstractButton *sicherheitsfrage_ja = sicherheitsfrage->button(QMessageBox::Yes);
sicherheitsfrage->exec();
if (sicherheitsfrage->clickedButton() == sicherheitsfrage_ja) scene->neues_spiel();
}
}
void MainWindow::about()
{
QMessageBox::about(this, tr("About Patience"), tr("Patience Version " VERSION " \n\nAuthor:\tAndreas Konarski\nLizenz:\tgpl\n\nKontakt:\n\nprogrammieren@konarski-wuppertal.de\nwww.konarski-wuppertal.de"));
}
void MainWindow::restliche_einstellungen_laden()
{
// die fenstergeometrie laden
restoreGeometry(einstellungen->value("mainwindow/geometry").toByteArray());
// den spieltyp laden
if (einstellungen->value("spieltyp", 1).toInt() == 3)
{
scene->drei_ziehen();
action_drei_ziehen->setChecked(true);
}
// die sichtbarkeit des rahmens laden
action_rahmen->setChecked(einstellungen->value("mainwindow/rahmen", true).toBool());
scene->initialisiere_rahmen(action_rahmen->isChecked());
// die highscore laden
highscore->einstellungen_laden();
// den spielstand laden oder ein neues spiel starten
if (einstellungen->value("begonnenes_spiel", false).toBool() == false) scene->neues_spiel();
else scene->lade_spielstand();
// einstellungen fuer speichern_frage laden
speichern_frage->setze_merken(einstellungen->value("speichern_frage/merken", false).toBool());
speichern_frage->setze_speichern(einstellungen->value("speichern_frage/speichern", true).toBool());
}
void MainWindow::einstellungen_speichern()
{
// die fenstergeometrie speichern
einstellungen->setValue("mainwindow/geometry", saveGeometry());
// den spieltyp speichern
if (scene->nur_eine_wird_gezogen() == true) einstellungen->setValue("spieltyp", 1);
else einstellungen->setValue("spieltyp", 3);
// die sichtbarkeit des rahmens speichern
einstellungen->setValue("mainwindow/rahmen", action_rahmen->isChecked());
// die deckblatt sprache speichern
if (action_french->isChecked() == true) einstellungen->setValue("deckblatt", "french");
else einstellungen->setValue("deckblatt", "german");
// die highscore speichern
highscore->einstellungen_speichern();
// wenn ein spiel laueft und der spielstand gespeichert werden soll, den spielstand speichern
if (scene->begonnenes_spiel() == true && speichern_frage->soll_speichern() == true)
{
scene->speichere_spielstand();
// speichern, ob ein spiel begonnen wurde
einstellungen->setValue("begonnenes_spiel", scene->begonnenes_spiel());
}
else einstellungen->setValue("begonnenes_spiel", false);
// einstellungen fuer speichern_frage speichern
einstellungen->setValue("speichern_frage/merken", speichern_frage->soll_merken());
einstellungen->setValue("speichern_frage/speichern", speichern_frage->soll_speichern());
}
void MainWindow::gewonnen(int punkte, long sekunden)
{
if (highscore->neues_ergebnis(punkte, sekunden) == false) siegmeldung->show();
}
void MainWindow::aktualisiere_punktelabel(int wert)
{
punktelabel->setText(QString::number(wert) + tr(" Points"));
}
void MainWindow::aktualisiere_spielzeit(long verstrichene_sekunden)
{
// die verstrichenen sekunden aufbereiten
int stunden = verstrichene_sekunden / 3600;
int minuten = (verstrichene_sekunden - (stunden * 3600)) / 60;
int sekunden = verstrichene_sekunden - (minuten * 60) - (stunden * 3600);
QString stunden_string = QString::number(stunden);
QString minuten_string = QString::number(minuten);
QString sekunden_string = QString::number(sekunden);
if (stunden < 10) stunden_string.prepend('0');
if (minuten < 10) minuten_string.prepend('0');
if (sekunden < 10) sekunden_string.prepend('0');
zeitlabel->setText(stunden_string + ":" + minuten_string + ":" + sekunden_string);
}
void MainWindow::eine_ziehen()
{
// wenn kein spiel laueft, einfach eins starten ...
if (scene->laufendes_spiel() == false)
{
scene->eine_ziehen();
scene->neues_spiel();
}
// ansonsten erst nach einer sicherheitsfrage ein neues spiel starten
else
{
QAbstractButton *sicherheitsfrage_ja = sicherheitsfrage->button(QMessageBox::Yes);
sicherheitsfrage->exec();
if (sicherheitsfrage->clickedButton() == sicherheitsfrage_ja)
{
scene->eine_ziehen();
scene->neues_spiel();
}
else action_drei_ziehen->setChecked(true);
}
}
void MainWindow::drei_ziehen()
{
// wenn kein spiel laueft, einfach eins starten ...
if (scene->laufendes_spiel() == false)
{
scene->drei_ziehen();
scene->neues_spiel();
}
// ansonsten erst nach einer sicherheitsfrage ein neues spiel starten
else
{
QAbstractButton *sicherheitsfrage_ja = sicherheitsfrage->button(QMessageBox::Yes);
sicherheitsfrage->exec();
if (sicherheitsfrage->clickedButton() == sicherheitsfrage_ja)
{
scene->drei_ziehen();
scene->neues_spiel();
}
else action_eine_ziehen->setChecked(true);
}
}
void MainWindow::closeEvent(QCloseEvent* event)
{
bool brauche_frage = true;
// wenn kein spiel begonnen wurde oder speichern_frage auf merken (dabei jedoch nicht auf reject) eingestellt ist wird keine frage gebraucht
if (scene->begonnenes_spiel() == false || (speichern_frage->soll_merken() == true && speichern_frage->result() != QDialog::Rejected)) brauche_frage = false;
// wenn eine frage gebraucht wird
if (brauche_frage == true) speichern_frage->exec();
// wenn speichern_frage akzeptiert wurde das schliessen der anwendung erlauben, ...
if (speichern_frage->result() == QDialog::Accepted) QMainWindow::closeEvent(event);
// ... ansonsten, wenn nicht akzeptiert, verhindern
else if (speichern_frage->result() == QDialog::Rejected) event->ignore();
}