Add Cell, CellModel
diff --git a/ide/CellModel.h b/ide/CellModel.h
new file mode 100644
index 0000000..3920e38
--- /dev/null
+++ b/ide/CellModel.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <QAbstractListModel>
+#include <qqml.h>
+
+#include "Cell.h"
+
+class CellModel : public QAbstractListModel
+{
+    Q_OBJECT
+    QML_ELEMENT
+
+public:
+    explicit CellModel(QObject *parent = nullptr);
+    CellModel(const CellModel &model, QObject *parent = nullptr);
+
+    enum CellRoles
+    {
+        CodeRole = Qt::UserRole + 1,
+        ResultRole
+    };
+
+    // Basic functionality:
+    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+
+    // Editable:
+    Q_INVOKABLE bool setData(const QModelIndex &index, const QVariant &value,
+                             int role = Qt::EditRole) override;
+
+    Qt::ItemFlags flags(const QModelIndex& index) const override;
+
+    // Add data:
+    Q_INVOKABLE bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
+
+    // Remove data:
+    Q_INVOKABLE bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
+
+    QHash<int, QByteArray> roleNames() const override;
+
+    Q_INVOKABLE void addCell(const Cell &cell);
+    Q_INVOKABLE void addCell(QString code, QString result);
+
+private:
+    QList<Cell> _cells;
+};
+
+Q_DECLARE_METATYPE(CellModel)