#include "Highscore.h" #include "Proportionen.h" #include <QTableWidgetItem> #include <QStringList> #include <QDir> #include <QInputDialog> #include <QSettings> using namespace std; Highscore::Highscore(QWidget *parent) : QDialog(parent), einstellungen(0) { setupUi(this); tabelle->setRowCount(HIGHSCORE_ZEILEN); // die tabelle mit elementen befuellen for (register int idx1 = 0; idx1 < tabelle->rowCount(); idx1++) { for (register int idx2 = 0; idx2 <= HIGHSCORE_ZEIT_POSITION; idx2++) { QTableWidgetItem *tmp_item = new QTableWidgetItem(); tmp_item->setText(HIGHSCORE_LEER); tabelle->setItem(idx1, idx2, tmp_item); } } } Highscore::~Highscore() { } bool Highscore::neues_ergebnis(int punkte, long sekunden) { bool erg = false; int ziel = -1; for (register int idx = HIGHSCORE_ZEILEN - 1; idx >= 0; idx--) { int element_sekundenverbrauch = 0, element_ergebnis = 0; QStringList tmp_zeit(tabelle->item(idx, HIGHSCORE_ZEIT_POSITION)->text().split(HIGHSCORE_SPLITTER, QString::SkipEmptyParts)); // wenn das element an idx leer ist ist es auf jeden fall unterlegen if (tabelle->item(idx, HIGHSCORE_NAME_POSITION)->text() == HIGHSCORE_LEER || tabelle->item(idx, HIGHSCORE_PUNKTE_POSITION)->text() == HIGHSCORE_LEER || tabelle->item(idx, HIGHSCORE_ZEIT_POSITION)->text() == HIGHSCORE_LEER) { ziel = idx; } // ansonsten else if (tmp_zeit.size() == 3) { // die bewertung des tabellenelements an idx berechnen. je mehr mienen und felder, je mehr punkte element_ergebnis = tabelle->item(idx, HIGHSCORE_PUNKTE_POSITION)->text().toInt(); // den sekundenverbrauch fuer des tabellenelements an idx berechnen element_sekundenverbrauch = (tmp_zeit.at(0).toInt() * 3600) + (tmp_zeit.at(1).toInt() * 60) + tmp_zeit.at(2).toInt(); } // wenn das neue ergebnis mehr punkte hat als das tabellenelement oder gleich viel punkte wie das tabellenelement enthaelt, aber weniger zeit verbraucht hat ist es ueberlegen if (punkte > element_ergebnis || (punkte == element_ergebnis && sekunden < element_sekundenverbrauch)) ziel = idx; } // wenn das neue element in die tabelle darf if (ziel >= 0 && ziel < tabelle->rowCount()) { // eine neue reihe an ziel in die tabelle einfuegen ... tabelle->insertRow(ziel); // ... und mit elementen befuellen tabelle->setItem(ziel, HIGHSCORE_NAME_POSITION, new QTableWidgetItem()); tabelle->setItem(ziel, HIGHSCORE_PUNKTE_POSITION, new QTableWidgetItem()); tabelle->setItem(ziel, HIGHSCORE_ZEIT_POSITION, new QTableWidgetItem()); // der letzte muss die tabelle verlassen tabelle->removeRow(tabelle->rowCount() - 1); erg = true; bool ok; // den namen des nutzers abfragen QString name_vorbereitung(QDir::home().dirName()); // wenn name_vorbereitung nicht leer ist if (name_vorbereitung.isEmpty() == false) { QChar erstes_zeichen = name_vorbereitung.at(0); if (erstes_zeichen.isLower() == true) name_vorbereitung[0] = erstes_zeichen.toUpper(); } QString name = QInputDialog::getText(parentWidget(), tr("Patience"), tr("You got a Highscore !"), QLineEdit::Normal, name_vorbereitung, &ok); // wenn kein nutzername eingegeben wurde den namen auf unbekannt setzen if (ok == false || name.isEmpty() == true) name = tr("Unknown"); // wenn der name LEER entspricht den namen ebenfalls auf unbekannt setzen if (name == HIGHSCORE_LEER) name = tr("Unknown"); int stunden = sekunden / 3600; int minuten = (sekunden - (stunden * 3600)) / 60; int sekunden_ = 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'); tabelle->item(ziel, HIGHSCORE_NAME_POSITION)->setText(name); tabelle->item(ziel, HIGHSCORE_PUNKTE_POSITION)->setText(QString::number(punkte)); tabelle->item(ziel, HIGHSCORE_ZEIT_POSITION)->setText(stunden_string + HIGHSCORE_SPLITTER + minuten_string + HIGHSCORE_SPLITTER + sekunden_string); // die highscoretabelle anzeigen show(); } return erg; } void Highscore::registriere_einstellungen(QSettings* einstellungen_) { einstellungen = einstellungen_; } void Highscore::einstellungen_laden() { if (einstellungen != 0) { // die breite der spalten laden tabelle->setColumnWidth(HIGHSCORE_NAME_POSITION, einstellungen->value(QString("tabelle/spalte_") + QString::number(HIGHSCORE_NAME_POSITION), HIGHSCORE_NAME_SPALTE_STANDARTGROESSE).toInt()); tabelle->setColumnWidth(HIGHSCORE_PUNKTE_POSITION, einstellungen->value(QString("tabelle/spalte_") + QString::number(HIGHSCORE_PUNKTE_POSITION), tabelle->columnWidth(HIGHSCORE_PUNKTE_POSITION)).toInt()); tabelle->setColumnWidth(HIGHSCORE_ZEIT_POSITION, einstellungen->value(QString("tabelle/spalte_") + QString::number(HIGHSCORE_ZEIT_POSITION), tabelle->columnWidth(HIGHSCORE_ZEIT_POSITION)).toInt()); } // den inhalt der tabelle laden for (register int idx = 0; idx < tabelle->rowCount() && einstellungen != 0; idx++) { // den namen laden tabelle->item(idx, HIGHSCORE_NAME_POSITION)->setText(einstellungen->value(QString("highscore/") + QString::number(idx) + QString("name"), HIGHSCORE_LEER).toString()); // die punkte laden tabelle->item(idx, HIGHSCORE_PUNKTE_POSITION)->setText(einstellungen->value(QString("highscore/") + QString::number(idx) + QString("breite"), HIGHSCORE_LEER).toString()); // die zeit laden tabelle->item(idx, HIGHSCORE_ZEIT_POSITION)->setText(einstellungen->value(QString("highscore/") + QString::number(idx) + QString("hoehe"), HIGHSCORE_LEER).toString()); } } void Highscore::einstellungen_speichern() { // die breite der spalten speichern einstellungen->setValue(QString("tabelle/spalte_") + QString::number(HIGHSCORE_NAME_POSITION), tabelle->columnWidth(HIGHSCORE_NAME_POSITION)); einstellungen->setValue(QString("tabelle/spalte_") + QString::number(HIGHSCORE_PUNKTE_POSITION), tabelle->columnWidth(HIGHSCORE_PUNKTE_POSITION)); einstellungen->setValue(QString("tabelle/spalte_") + QString::number(HIGHSCORE_ZEIT_POSITION), tabelle->columnWidth(HIGHSCORE_ZEIT_POSITION)); // den inhalt der tabelle speichern for (register int idx = 0; idx < tabelle->rowCount() && einstellungen != 0; idx++) { // den namen speichern einstellungen->setValue(QString("highscore/") + QString::number(idx) + QString("name"), tabelle->item(idx, HIGHSCORE_NAME_POSITION)->text()); // die punkte speichern einstellungen->setValue(QString("highscore/") + QString::number(idx) + QString("breite"), tabelle->item(idx, HIGHSCORE_PUNKTE_POSITION)->text()); // die zeit speichern einstellungen->setValue(QString("highscore/") + QString::number(idx) + QString("hoehe"), tabelle->item(idx, HIGHSCORE_ZEIT_POSITION)->text()); } }