Imported needed functionality from (soon) deprecated database
[emufront] / src / models / emufrontfileobjectmodel.cpp
1 /*
2 ** EmuFront
3 ** Copyright 2010 Mikko Keinänen
4 **
5 ** This file is part of EmuFront.
6 **
7 **
8 ** EmuFront is free software: you can redistribute it and/or modify
9 ** it under the terms of the GNU General Public License version 2 as published by
10 ** the Free Software Foundation and appearing in the file gpl.txt included in the
11 ** packaging of this file.
12 **
13 ** EmuFront is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ** GNU General Public License for more details.
17 **
18 ** You should have received a copy of the GNU General Public License
19 ** along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <QtSql>
23 #include "emufrontfileobjectmodel.h"
24 #include "emufrontfile.h"
25 #include "emufrontfileobject.h"
26
27 EmuFrontFileObjectModel::EmuFrontFileObjectModel(QObject *parent) :
28     EmuFrontQueryModel(parent)
29 { }
30
31 Qt::ItemFlags EmuFrontFileObjectModel::flags(const QModelIndex &index) const
32 {
33     Qt::ItemFlags flags = QSqlQueryModel::flags(index);
34     if (index.column() == EmuFrontFileObject_Name) {
35         flags |= Qt::ItemIsEditable;
36     }
37     return flags;
38 }
39
40 bool EmuFrontFileObjectModel::setData(const QModelIndex &index, const QVariant &value, int /*role*/)
41 {
42     if(index.column() != EmuFrontFileObject_Name)
43         return false;
44
45     QModelIndex primaryKeyIndex
46         = QSqlQueryModel::index(index.row(), EmuFrontFileObject_Id);
47
48     int id = data(primaryKeyIndex).toInt();
49     clear();
50
51     bool ok;
52     if (index.column() == EmuFrontFileObject_Name) {
53         ok = setName(id, value.toString());
54     }
55
56     refresh();
57     return ok;
58 }
59
60 void EmuFrontFileObjectModel::refresh()
61  {
62      setQuery(constructSelect());
63      setHeaderData(EmuFrontFileObject_Id, Qt::Horizontal, tr("ID"));
64      setHeaderData(EmuFrontFileObject_Name, Qt::Horizontal, tr("Name"));
65      setHeaderData(EmuFrontFileObject_FileId, Qt::Horizontal, tr("FileID"));
66      setHeaderData(EmuFrontFileObject_FileName, Qt::Horizontal, tr("File Name"));
67      setHeaderData(EmuFrontFileObject_FileCheckSum, Qt::Horizontal, tr("File Checksum"));
68      setHeaderData(EmuFrontFileObject_FileSize, Qt::Horizontal, tr("File Size"));
69      setHeaderData(EmuFrontFileObject_FileType, Qt::Horizontal, tr("File Type"));
70      setHeaderData(EmuFrontFileObject_FileUpdateTime, Qt::Horizontal, tr("File Updated"));
71  }
72
73 QString EmuFrontFileObjectModel::constructSelect(QString where) const
74 {
75     return QString("SELECT maintbl.id AS FileObjectId, "
76             "maintbl.name AS Name, "
77             "file.id AS FileId, "
78             "file.name AS FileName, "
79             "file.type AS FileType, "
80             "file.checksum AS FileChecksum, "
81             "file.size AS FileSize, "
82             "file.updatetime AS FileUpdateTime "
83             "FROM %1 AS maintbl "
84             "LEFT OUTER JOIN file ON maintbl.fileid=file.id "
85             "%2 "
86             "ORDER BY Name").arg(tableName).arg(where);
87 }
88
89 bool EmuFrontFileObjectModel::setName(int id, const QString &name)
90 {
91     QSqlQuery query;
92     query.prepare(QString("update %1 set name = :name where id = :id").arg(tableName));
93     query.bindValue(":name", name);
94     query.bindValue(":id", id);
95     return query.exec();
96 }
97
98 bool EmuFrontFileObjectModel::insertRows(int row, int count, const QModelIndex &parent)
99 {
100     if (parent.isValid())
101         return false; // This is a flat model
102     if (rowCount() < row)
103         row = rowCount() + 1;
104     QSqlQuery q;
105     q.prepare(QString("INSERT INTO %1 (id, name, fileid) "
106         " VALUES (NULL, '', NULL) ").arg(tableName));
107     beginInsertRows(QModelIndex(), row, row + count - 1);
108     for (int i = 0; i < count; ++i) {
109         q.exec();
110     }
111     endInsertRows();
112     refresh();
113     return true;
114 }
115
116 bool EmuFrontFileObjectModel::removeRows(int row, int count, const QModelIndex &parent)
117 {
118      if (parent.isValid()) {
119         return false; // This is a flat model
120     }
121     if (rowCount() < row + count - 1)
122         return false;
123
124     QSqlQuery q;
125     q.prepare(QString("DELETE FROM %1 WHERE id=:id").arg(tableName));
126     QModelIndex primaryIndex;
127     int id = -1;
128     beginRemoveRows(QModelIndex(), row, row + count - 1);
129     for(int i = 0; i < count; ++i) {
130         primaryIndex = QSqlQueryModel::index(row + i, EmuFrontFileObject_Id);
131         id = data(primaryIndex).toInt();
132         qDebug() << "Removing data item with id " << id;
133         q.bindValue(":id", id);
134         q.exec();
135     }
136     endRemoveRows();
137     refresh();
138     return true;
139 }
140
141 // Implemented for EmuFrontQueryModel:
142 EmuFrontObject* EmuFrontFileObjectModel::recordToDataObject(const QSqlRecord* record)
143 {
144     int id = record->value(EmuFrontFileObject_Id).toInt();
145     QString name = record->value(EmuFrontFileObject_Name).toString();
146     int fileId = record->value(EmuFrontFileObject_FileId).toInt();
147     EmuFrontFile *f = 0;
148     /*if (fileId > 0)
149     {
150         // TODO: need fileModel
151         EmuFrontObject *o = fileModel.getDataObject(fileId);
152         f = dynamic_cast<EmuFrontFile*>(o);
153     }*/
154     EmuFrontObject *efo = createEmuFrontFileObject(id, name, f);
155     return efo;
156 }
157
158 QString EmuFrontFileObjectModel::constructFilterById(int id) const
159 {
160     return QString("maintbl.id = %1").arg(id);
161 }