color scheme, randomizing, state saving/restore
[colorflood] / colorflood / src / field.cpp
index d47250a..3465e78 100644 (file)
 
 #include <QtGui>
 #include "field.hpp"
+#include "colorscheme.hpp"
 
 static const int fieldWidth = 420;
 
 const int Field::rects[Field::NUM_SIZES] = { 14, 21, 28 };
 const int Field::turns[Field::NUM_SIZES] = { 25, 35, 50 };
 
-Field::Field (QWidget *parent)
-    : QWidget (parent)
+// we declare out QVector<FieldRect> metatype
+// and stream operators to save whole field to settings
+Q_DECLARE_METATYPE(Field::RectVector);
+
+static QDataStream &operator<< (QDataStream &out, const Field::RectVector &rv)
 {
-    // FIXME -- restore saved state
+    for (QVector<Field::FieldRect>::const_iterator rect = rv.begin();
+         rect != rv.end();
+         rect++)
+    {
+        out << (*rect).brush;
+        out << (*rect).flood;
+    }
+
+    return out;
 }
 
-Field::Field (QWidget *parent, const QVector<QBrush> &brushes, FieldSize size)
+static QDataStream &operator>> (QDataStream &in, Field::RectVector &rv)
+{
+    Field::FieldRect r;
+
+    rv.clear();
+
+    for (; !in.atEnd() ;)
+    {
+        in >> r.brush >> r.flood;
+        rv << r;
+    }
+
+    rv.pop_back();
+
+    return in;
+}
+
+Field::Field (QWidget *parent)
     : QWidget (parent)
 {
-    init(brushes, size);
+    setFixedSize(fieldWidth, fieldWidth);
+
+    // restore field size and field itself from settings
+
+    qRegisterMetaType<RectVector>("Field::RectVector");
+    qRegisterMetaTypeStreamOperators<RectVector>("Field::RectVector");
+
+    QSettings settings;
+
+    int size = settings.value("field/fieldSize", SIZE_SMALL).toInt();
+
+    if (size < SIZE_SMALL || size >= NUM_SIZES)
+        size = SIZE_SMALL;
+
+    this->size = (FieldSize)size;
+
+    if (settings.contains("field/data"))
+        data = settings.value("field/data").value<RectVector>();
+
+    if (data.size() != rects[size] * rects[size])
+        randomize();
 }
 
 Field::~Field ()
 {
-    // FIXME -- save state
+    QSettings settings;
+
+    settings.setValue("field/size", size);
+
+    QVariant v;
+    v.setValue(data);
+    settings.setValue("field/data", v);
 }
 
 Field::FieldSize Field::getSize () const
@@ -41,27 +96,26 @@ Field::FieldSize Field::getSize () const
     return size;
 }
 
-/*
-=================
-randomize
-=================
-*/
 void Field::randomize ()
 {
-    Field::FieldRect rect;
+    FieldRect rect;
     rect.flood = false;
 
     data.clear();
-    data = QVector<FieldRect> (rects[size] * rects[size], rect);
+    data = RectVector(rects[size] * rects[size], rect);
 
     qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
 
-    for (QVector<Field::FieldRect>::iterator rect = data.begin();
+    int numBrushes = ColorScheme::instance().getScheme().size();
+
+    for (QVector<FieldRect>::iterator rect = data.begin();
          rect != data.end();
          rect++)
     {
-        (*rect).brush = qrand() % brushes.size();
+        (*rect).brush = qrand() % numBrushes;
     }
+
+    update();
 }
 
 int Field::getNumRectsOfSize (FieldSize size)
@@ -74,15 +128,6 @@ int Field::getNumTurnsOfSize (FieldSize size)
     return turns[size];
 }
 
-void Field::init (const QVector<QBrush> &brushes, FieldSize size)
-{
-    this->size = size;
-    this->brushes = brushes;
-
-    setFixedSize(fieldWidth, fieldWidth);
-    randomize();
-}
-
 int Field::getRectSize (FieldSize size)
 {
     return fieldWidth / rects[size];
@@ -95,6 +140,8 @@ void Field::paintEvent (QPaintEvent *event)
 
     QRect rect = QRect(0, 0, getRectSize(size), getRectSize(size));
 
+    const QVector<QBrush> &scheme = ColorScheme::instance().getScheme();
+
     for (int y = 0; y < rects[size] ;y++)
     {
         int n = y * rects[size];
@@ -104,7 +151,7 @@ void Field::paintEvent (QPaintEvent *event)
             rect.moveTo(x * rect.width(), y * rect.height());
 
             if (rect.intersects(event->rect()))
-                painter.fillRect(rect, brushes.at(data[n].brush));
+                painter.fillRect(rect, scheme.at(data[n].brush));
         }
     }