← index
Qt.Projects/source/desktop/games/PuzzleDrop/high_scores.cpp
Source: Qt.Projects/source/desktop/games/PuzzleDrop/high_scores.cpp
#include "high_scores.hpp"
#include<QPainter>
#include<QTextStream>
#include<string>
#include<QInputDialog>
#include<QPixmap>
#include<QIcon>


Score::Score() : lines{0} {}
Score::Score(QString n, int l) : name{n}, lines{l} {}

bool Score::operator<(const Score &s) const {
    if(s.lines < lines) return true;
    return false;
}

HighScores::HighScores(QWidget *parent) : QDialog(parent), settings("LostSideDead", "PuzzleDrop") {
    setFixedSize(640, 500);
    setWindowTitle("High Scores Window");
    setWindowIcon(QIcon(QPixmap(":/img/green3.png").scaled(32, 32)));
    loadScores();
}

HighScores::~HighScores() {
    saveScores();
}

void HighScores::paintEvent(QPaintEvent *e) {
    Q_UNUSED(e);
    QPainter paint(this);
    paint.fillRect(0, 0, 640, 500, QBrush("#000000"));
    QFont font = paint.font();
    QPen pen = paint.pen();
    pen.setColor(QColor(QRgb(0xFF0000)));
    font.setPixelSize(40);
    font.setBold(true);
    paint.setFont(font);
    paint.setPen(pen);
    paint.drawText(50, 50, "High Scores");
    pen.setColor(QColor(QRgb(0xFFFFFF)));
    font.setPixelSize(30);
    font.setBold(true);
    paint.setPen(pen);
    font.setUnderline(true);
    paint.setFont(font);
    paint.drawText(50, 100, "Rank\t\tLines\t\tName");
    font.setUnderline(false);
    paint.setFont(font);
    int pos = 150;
    for(int i = 0; i < 10; ++i) {
        QString value;
        QTextStream stream(&value);
        stream << (i+1) << "\t\t" << scores[i].lines << "\t\t" << scores[i].name;
        paint.drawText(50,pos, value);
        pos += 35;
    }
}

void HighScores::loadScores() {
    for(int i = 0; i < 10; ++i) {
        QString key1, value1;
        QTextStream stream1(&key1), stream2(&value1);
        stream1 << i;
        stream2 << "Anonymous:" << i*5;
        QString score_val = settings.value(key1, value1).toString();
        std::string value = score_val.toStdString();
        auto pos = value.find(":");
        std::string left = value.substr(0, pos);
        std::string right = value.substr(pos+1, value.length());
        Score score;
        score.name = left.c_str();
        score.lines = atoi(right.c_str());
        scores.push_back(score);
    }
    std::sort(scores.begin(), scores.end());
}

void HighScores::saveScores() {
    for(int i = 0; i < 10; ++i) {
        QString key1, value1;
        QTextStream stream1(&key1), stream2(&value1);
        stream1 << i;
        stream2 << scores[i].name << ":" << scores[i].lines;
        settings.setValue(key1, value1);
    }
}

void HighScores::addScore(QString name, int lines) {
    scores.push_back({name, lines});
    std::sort(scores.begin(), scores.end());
    saveScores();
}

bool HighScores::inputName(QString &text) {
    bool ok;
    text = QInputDialog::getText(this, tr("Input Your Name"),tr("Your name:"), QLineEdit::Normal,"", &ok);
    std::string name = text.toStdString();
    for(auto i = name.begin(); i != name.end(); ++i) {
        if(*i == ':')
            *i = ' ';
    }
    text = name.c_str();
    return ok;
}