File indexing completed on 2024-10-06 06:49:33

0001 /***************************************************************************
0002  *   Copyright 2007      Johannes Bergmeier <johannes.bergmeier@gmx.net>   *
0003  *   Copyright 2015      Ian Wadham <iandw.au@gmail.com>                   *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
0019  ***************************************************************************/
0020 
0021 #ifndef _KSUDOKUGAMEVARIANTS_H_
0022 #define _KSUDOKUGAMEVARIANTS_H_
0023 
0024 #include <QAbstractListModel>
0025 #include <QItemDelegate>
0026 #include <QList>
0027 #include <QObject>
0028 #include <QUrl>
0029 
0030 class SKGraph;
0031 namespace ksudoku {
0032 
0033 class KsView;
0034 class Game;
0035 class GameVariantCollection;
0036 class GameVariant {
0037 public:
0038     explicit GameVariant(const QString& name, GameVariantCollection* collection=nullptr);
0039     virtual ~GameVariant() {}
0040 
0041 public:
0042     QString name() const { return m_name; }
0043     QString description() const { return m_description; }
0044     void setDescription(const QString& descr);
0045     QString icon() const { return m_icon; }
0046     void setIcon(const QString& icon);
0047 
0048     /// This method returs whether the variant has an configure option
0049     virtual bool canConfigure() const = 0;
0050 
0051     /// Shows a configure dialog and changes the settings
0052     virtual bool configure() = 0;
0053 
0054     /// Whether this variant can be started without any values in the grid
0055     virtual bool canStartEmpty() const = 0;
0056 
0057     /// Creates a game without a puzzle but with an empty grid
0058     virtual Game startEmpty() = 0;
0059 
0060     /// Creates an instance of this game variant
0061     virtual Game createGame(int difficulty, int symmetry) = 0;
0062 
0063     /// Creates the correct view for the game.
0064     /// Game needs to be compatible with this GameVariant
0065     virtual KsView* createView(const Game& game) const = 0;
0066 
0067 private:
0068     QString m_name;
0069     QString m_description;
0070     QString m_icon;
0071 };
0072 
0073 class GameVariantCollection : public QAbstractListModel {
0074 friend class GameVariant;
0075 Q_OBJECT
0076 public:
0077     GameVariantCollection(QObject* parent, bool autoDel);
0078     ~GameVariantCollection() override;
0079 
0080 public:
0081     void addVariant(GameVariant* variant);
0082 
0083 public:
0084     QVariant data(const QModelIndex &index, int role) const override;
0085     int rowCount(const QModelIndex&) const override;
0086     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
0087     GameVariant* variant(const QModelIndex&) const;
0088 
0089 Q_SIGNALS:
0090     void newVariant(GameVariant* variant);
0091 
0092 public:
0093     QList<GameVariant*> m_variants;
0094     bool m_autoDelete;
0095 };
0096 
0097 class GameVariantDelegate : public QItemDelegate {
0098 Q_OBJECT
0099 public:
0100     enum Roles {
0101         Description = 33
0102     };
0103 
0104 public:
0105     explicit GameVariantDelegate(QObject* parent = nullptr, QWidget * viewport = nullptr);
0106 public:
0107     QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
0108     void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
0109 
0110 protected:
0111     bool eventFilter(QObject* watched, QEvent* event) override;
0112 
0113 public:
0114     QString title(const QModelIndex& index) const;
0115     QString description(const QModelIndex& index) const;
0116     QString icon(const QModelIndex& index) const;
0117     bool configurable(const QModelIndex& index) const;
0118 private:
0119     QWidget * m_viewport;
0120 
0121     static const int m_iconWidth = 48;
0122     static const int m_iconHeight = 48;
0123     static const int m_leftMargin = 16;
0124     static const int m_rightMargin = 12;
0125     static const int m_separatorPixels = 8;
0126     static const int m_minWidth = m_leftMargin + m_rightMargin +
0127                       4 * (m_iconWidth + m_separatorPixels*2);
0128 };
0129 
0130 class SudokuGame : public GameVariant {
0131 public:
0132     SudokuGame(const QString& name, uint order, GameVariantCollection* collection=nullptr);
0133     ~SudokuGame() override;
0134 
0135 public:
0136     bool canConfigure() const override;
0137     bool configure() override;
0138     bool canStartEmpty() const override;
0139     Game startEmpty() override;
0140     Game createGame(int difficulty, int symmetry) override;
0141     KsView* createView(const Game& game) const override;
0142 
0143 private:
0144     uint m_order;
0145     uint m_symmetry;
0146 
0147     SKGraph *m_graph;
0148 };
0149 
0150 class RoxdokuGame : public GameVariant {
0151 public:
0152     RoxdokuGame(const QString& name, uint order, GameVariantCollection* collection=nullptr);
0153     ~RoxdokuGame() override;
0154 
0155 public:
0156     bool canConfigure() const override;
0157     bool configure() override;
0158     bool canStartEmpty() const override;
0159     Game startEmpty() override;
0160     Game createGame(int difficulty, int symmetry) override;
0161     KsView* createView(const Game& game) const override;
0162 
0163 private:
0164     uint m_order;
0165     uint m_symmetry;
0166 
0167     SKGraph* m_graph;
0168 };
0169 
0170 class CustomGame : public GameVariant {
0171 public:
0172     CustomGame(const QString& name, const QUrl& url, GameVariantCollection* collection=nullptr);
0173     ~CustomGame() override;
0174 
0175 public:
0176     bool canConfigure() const override;
0177     bool configure() override;
0178     bool canStartEmpty() const override;
0179     Game startEmpty() override;
0180     Game createGame(int difficulty, int symmetry) override;
0181     KsView* createView(const Game& game) const override;
0182 
0183 private:
0184     uint m_order;
0185     uint m_symmetry;
0186 
0187     QUrl m_url;
0188     SKGraph* m_graph;
0189     bool createSKGraphObject();
0190 };
0191 
0192 }
0193 
0194 #endif