Implemented removeRows for SetupModel.
[emufront] / src / models / setupmodel.cpp
index a7fe6b7..031d495 100644 (file)
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "setupmodel.h"
+#include "emufrontexception.h"
 #include <QtSql>
 
+const QString SetupModel::FILE_TYPE_EXTENSION_SEPARATOR = QString("|");
+
 SetupModel::SetupModel(QObject *parent) :
     EmuFrontQueryModel(parent)
 {
@@ -54,7 +57,10 @@ QString SetupModel::constructSelect(QString where) const
 Qt::ItemFlags SetupModel::flags(const QModelIndex &index) const
 {
     Qt::ItemFlags flags = QSqlQueryModel::flags(index);
-    if (index.column() == Setup_PlatformId) {
+    int col = index.column();
+    if (col == Setup_PlatformId ||
+        col == Setup_MediaTypeId ||
+        col == Setup_FileTypeExtensions) {
         flags |= Qt::ItemIsEditable;
     }
     return flags;
@@ -62,7 +68,10 @@ Qt::ItemFlags SetupModel::flags(const QModelIndex &index) const
 
 bool SetupModel::setData(const QModelIndex &index, const QVariant &value, int /*role*/)
 {
-    if(index.column() != Setup_PlatformId)
+    int col = index.column();
+    if(col != Setup_PlatformId &&
+        col != Setup_MediaTypeId &&
+        col != Setup_FileTypeExtensions)
         return false;
 
     QModelIndex primaryKeyIndex
@@ -72,22 +81,119 @@ bool SetupModel::setData(const QModelIndex &index, const QVariant &value, int /*
     clear();
 
     bool ok;
-    if (index.column() == Setup_PlatformId) {
+    switch(index.column()) {
+
+    case Setup_PlatformId:
         ok = setPlatform(id, value.toInt());
-    }
+        break;
+
+    case Setup_MediaTypeId:
+        ok = setMediaType(id, value.toInt());
+        break;
+
+    case Setup_FileTypeExtensions:
+        ok = setSupportedExtensions(id, value.toString());
+        break;
 
+    default:
+        qDebug() << "Setup model, this shouldn't be happening!";
+    };
     refresh();
     return ok;
 }
 
 bool SetupModel::setPlatform(int id, int platformId)
 {
-    qDebug() << "updating setup " << id << " to platform " << platformId;
     QSqlQuery query;
     query.prepare(QString("update setup set platformid = :platformid where id = :id"));
     query.bindValue(":platformid", platformId);
     query.bindValue(":id", id);
-    qDebug() << query.lastQuery();
-    qDebug() << query.lastError();
     return query.exec();
 }
+
+bool SetupModel::setMediaType(int id, int mediaTypeId)
+{
+    QSqlQuery query;
+    query.prepare(QString("update setup set mediatypeid = :mediatypeid where id = :id"));
+    query.bindValue(":mediatypeid", mediaTypeId);
+    query.bindValue(":id", id);
+    return query.exec();
+}
+
+bool SetupModel::setSupportedExtensions(int id, QString exts)
+{
+    QSqlQuery query;
+    query.prepare(QString("update setup set filetypeextensions = :exts where id = :id"));
+    query.bindValue(":exts", exts);
+    query.bindValue(":id", id);
+    return query.exec();
+}
+
+bool SetupModel::insertRows(int row, int count, const QModelIndex &parent)
+{
+    if (parent.isValid())
+        return false; // This is a flat model
+    if (rowCount() < row)
+        row = rowCount() + 1;
+    // we need a default value for platformid and mediatypeid and if none is yet
+    // available an error message must be shown!
+    int plfId = -1;
+    int mdtId = -1;
+    QSqlQuery q;
+    q.exec(QString("SELECT id FROM platform ORDER BY name LIMIT 1"));
+    if (q.first()){
+        qDebug() << "Got id " << plfId << " for default platform.";
+        plfId = q.value(0).toInt();
+    }
+    else {
+        throw EmuFrontException(tr("No platforms yet available for setup configuration!"));
+    }
+    q.exec(QString("SELECT id FROM mediatype ORDER BY name LIMIT 1"));
+    if (q.first()) {
+        qDebug() << "Got id " << mdtId << " for default media type.";
+        mdtId = q.value(0).toInt();
+    }
+    else {
+        throw EmuFrontException(tr("No media types yet available for setup configuration!"));
+    }
+    q.prepare(QString("INSERT INTO setup (id, platformid, mediatypeid, filetypeextensions) "
+        " VALUES (NULL, :plfid, :mdtid, '') "));
+    beginInsertRows(QModelIndex(), row, row + count - 1);
+    for (int i = 0; i < count; ++i) {
+        q.bindValue(":plfid", plfId);
+        q.bindValue(":mdtid", mdtId);
+        if (!q.exec()) {
+            throw EmuFrontException(tr("Failed creating new setup: %1").
+                arg(q.lastError().text()));
+        }
+    }
+    endInsertRows();
+    refresh();
+    return true;
+}
+
+bool SetupModel::removeRows(int row, int count, const QModelIndex &parent)
+{
+    if (parent.isValid()) {
+        return false; // This is a flat model
+    }
+    if (rowCount() < row + count - 1)
+        return false;
+
+    QSqlQuery q;
+    q.prepare(QString("DELETE FROM setup WHERE id=:id"));
+    QModelIndex primaryIndex;
+    int id = -1;
+    beginRemoveRows(QModelIndex(), row, row + count - 1);
+    for(int i = 0; i < count; ++i) {
+        primaryIndex = QSqlQueryModel::index(row + i, Setup_Id);
+        id = data(primaryIndex).toInt();
+        qDebug() << "Removing data item with id " << id;
+        q.bindValue(":id", id);
+        q.exec();
+    }
+    endRemoveRows();
+    refresh();
+    return true;
+}
+