File indexing completed on 2024-04-28 04:05:21

0001 /*
0002     SPDX-FileCopyrightText: 2015 Jakob Gruber <jakob.gruber@gmail.com>
0003     SPDX-FileCopyrightText: 2011 Julian Helfferich <julian.helfferich@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef LEVELLOADER_H
0009 #define LEVELLOADER_H
0010 
0011 #include <QImage>
0012 #include <QList>
0013 #include <QPixmap>
0014 #include <QString>
0015 #include <QSharedPointer>
0016 
0017 #include "src/logic/board.h"
0018 
0019 class QDomDocument;
0020 class QDomElement;
0021 class LevelLoader;
0022 
0023 class Level
0024 {
0025     friend class LevelLoader;
0026 public:
0027     Level();
0028 
0029     QString name() const;
0030     QString author() const;
0031     QString levelset() const { return m_levelset; }
0032     int difficulty() const { return m_difficulty; }
0033     int width() const { return m_width; }
0034     int height() const { return m_height; }
0035     QList<Board::State> map() const { return m_map; }
0036     QPixmap preview() const { return m_preview; }
0037 
0038     QString visibleName() const;
0039     bool solved() const { return m_solved; }
0040     int solvedTime() const { return m_solved_time; }
0041     void setSolved(int seconds);
0042 
0043     bool operator==(const Level &that) const;
0044 
0045 private:
0046     void finalize(); /* needs to be called by loader when done constructing */
0047     void constructPreview();
0048     void readSettings();
0049     void writeSettings(int seconds);
0050     QString key() const;
0051 
0052     QString m_name, m_author, m_levelset;
0053     int m_difficulty;
0054     int m_width, m_height;
0055     QList<Board::State> m_map;
0056     bool m_solved;
0057     int m_solved_time;
0058     QPixmap m_preview;
0059 };
0060 
0061 class LevelLoader
0062 {
0063 public:
0064     explicit LevelLoader(const QString &filename);
0065 
0066     QList<QSharedPointer<Level> > loadLevels();
0067     static QList<QSharedPointer<Level> > load();
0068 
0069 private:
0070     void setLevelset(const QString& levelname);
0071     QSharedPointer<Level> loadLevel(const QDomElement &node) const;
0072     QList<Board::State> loadRow(const QDomElement &node) const;
0073     QImage openXPM(const QDomElement &node) const;
0074     QList<Board::State> loadXPM(const QImage &xpm) const;
0075 
0076     QSharedPointer<QDomDocument> m_levelset;
0077     QString m_levelsetname;
0078 
0079     const QString m_filename;
0080 
0081     bool m_valid;
0082 };
0083 
0084 #endif // LEVELLOADER_H