Imported needed functionality from (soon) deprecated database
authorMikko Keinänen <mikko.keinanen@gmail.com>
Tue, 14 Dec 2010 22:17:03 +0000 (00:17 +0200)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Tue, 14 Dec 2010 22:17:03 +0000 (00:17 +0200)
classes to model classes. Added two new database tables:
titlename and titlename_file.

20 files changed:
src/db/dbcreator.cpp
src/emulauncher.cpp
src/emulauncher.h
src/models/emufrontfileobjectmodel.cpp
src/models/emufrontfileobjectmodel.h
src/models/emufrontquerymodel.cpp
src/models/emufrontquerymodel.h
src/models/externalexecutablemodel.cpp
src/models/externalexecutablemodel.h
src/models/filepathmodel.cpp
src/models/filepathmodel.h
src/models/mediatypemodel.cpp
src/models/mediatypemodel.h
src/models/platformmodel.cpp
src/models/platformmodel.h
src/models/setupmodel.cpp
src/models/setupmodel.h
src/views/emufronteditview.h
src/views/filepatheditview.cpp
src/views/filepatheditview.h

index 708b6e6..a3b249d 100644 (file)
@@ -94,7 +94,16 @@ bool DbCreator::createDB()
 
         if (!ret) throw QString("tbl config");
 
-        ret = query.exec("CREATE TABLE IF NOT EXISTS file"
+        ret = query.exec(
+            "CREATE TABLE IF NOT EXISTS titlename "
+            "(id INTEGER PRIMARY KEY, "
+            " name TEXT)"
+            // TODO: more fields here...
+        );
+
+        if (!ret) throw QString("tbl titlename");
+
+        ret = query.exec("CREATE TABLE IF NOT EXISTS file "
                         "(id INTEGER PRIMARY KEY, "
                         "name TEXT, "
                         "type INTEGER, "
@@ -105,6 +114,12 @@ bool DbCreator::createDB()
 
         if (!ret) throw QString("tbl file");
 
+        ret = query.exec(
+            "CREATE TABLE IF NOT EXISTS file titlename_file "
+            "(titlenameid INTEGER REFERENCES titlename(id), "
+            "fileid INTEGER REFERENCES file(id))"
+        );
+
         qDebug() << "Creating TABLE platform";
 
         ret = query.exec("CREATE TABLE IF NOT EXISTS platform "
index 94724f3..0e15d46 100644 (file)
 #include <QSqlTableModel>
 #include <QItemSelectionModel>
 #include "emulauncher.h"
-//#include "dbmediatype.h"
-//#include "mediatypemodel.h"
-//#include "dbplatform.h"
-//#include "platformmodel.h"
-//#include "dbexecutable.h"
 #include "setupmodel.h"
 #include "externalexecutablemodel.h"
 #include "dbmediaimagecontainer.h"
 #include "executable.h"
 #include "emuhelper.h"
 #include "emufrontinputdialog.h"
-//#include "mediatype.h"
-//#include "platform.h"
 
 EmuLauncher::EmuLauncher(QErrorMessage *errorMessage, QWidget *parent, QString tmp) :
     QWidget(parent), tmpDirPath(tmp), errorMessage(errorMessage)
 {
-    //dbPlatform = new DbPlatform(this);
-    //dbMediaType = new DbMediaType(this);
-    //dbExec = new DbExecutable(this);
     dbMic = 0;
     emuHelper = new EmuHelper(this);
     initWidgets();
@@ -64,9 +54,6 @@ EmuLauncher::~EmuLauncher()
 
 void EmuLauncher::updateData()
 {
-    //platformSelectBox->updateDataModel();
-    //mediaTypeSelectBox->updateDataModel();
-    //execSelectBox->updateDataModel();
 }
 
 void EmuLauncher::initWidgets()
@@ -75,21 +62,7 @@ void EmuLauncher::initWidgets()
     micTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     micTable->setCornerButtonEnabled(false);
     micTable->verticalHeader()->setVisible(false);
-    //micTable->horizontalHeader()->setDisabled(true);
     micTable->horizontalHeader()->setClickable(false);
-    //mediaTypeSelectBox = new EFFileObjectComboBox(dbMediaType, this);
-    //platformSelectBox = new EFFileObjectComboBox(dbPlatform, this);
-    //execSelectBox = new ExecutableComboBox(dbExec, this);
-
-    /*MediaTypeModel *mtModel = new MediaTypeModel(this);
-    mediaTypeSelectBox = new QComboBox(this);
-    mediaTypeSelectBox->setModel(mtModel);
-    mediaTypeSelectBox->setModelColumn(MediaTypeModel::EmuFrontFileObject_Name);
-
-    PlatformModel *plfModel = new PlatformModel(this);
-    platformSelectBox = new QComboBox(this);
-    platformSelectBox->setModel(plfModel);
-    platformSelectBox->setModelColumn(PlatformModel::EmuFrontFileObject_Name);*/
 
     SetupModel *supModel = new SetupModel(this);
     setupSelectBox = new QComboBox(this);
@@ -108,8 +81,6 @@ void EmuLauncher::initWidgets()
 void EmuLauncher::layout()
 {
     QGridLayout *grid = new QGridLayout;
-    //grid->addWidget(platformSelectBox, 0, 0);
-    //grid->addWidget(mediaTypeSelectBox, 0, 1);
     grid->addWidget(setupSelectBox, 0, 0, 1, 2);
     grid->addWidget(selectButton, 0, 2);
     grid->setColumnStretch(3, 1);
@@ -131,49 +102,24 @@ void EmuLauncher::connectSignals()
 
 void EmuLauncher::updateMediaImageContainers()
 {
-    /*if (platformSelectBox->currentIndex() == -1 ||
-        mediaTypeSelectBox->currentIndex() == -1)
-        return;
-        */
-
     if (setupSelectBox->currentIndex() == -1) return;
 
-    //int mtid, plfid = -1;
-
-    //MediaType *mt = 0;
-    //Platform *plf = 0;
-
-    // TODO: maybe rewrite EFFileObjectComboBox and put the following there:
-    /*QAbstractItemModel *plfAbsModel = platformSelectBox->model();
-    PlatformModel *plfModel = qobject_cast<PlatformModel *>(plfAbsModel);
-    if (!plfModel) return;
+    // 1. get selected platform and media type id
+    QAbstractItemModel *setupAbsModel = setupSelectBox->model();
+    SetupModel *supModel = qobject_cast<SetupModel *>(setupAbsModel);
+    if (!supModel) return;
     QModelIndex plfInd =
-        plfModel->index(platformSelectBox->currentIndex(), PlatformModel::EmuFrontFileObject_Id);
-    plfid = plfModel->data(plfInd).toInt();
-
-    // TODO: maybe rewrite EFFileObjectComboBox and put the following there:
-    QAbstractItemModel *mtAbsModel = mediaTypeSelectBox->model();
-    MediaTypeModel *mtModel = qobject_cast<MediaTypeModel *>(mtAbsModel);
-    if (!mtModel) return;
+        supModel->index(setupSelectBox->currentIndex(), SetupModel::Setup_PlatformId);
+    int plfid = supModel->data(plfInd).toInt();
     QModelIndex mtInd =
-        mtModel->index(mediaTypeSelectBox->currentIndex(), MediaTypeModel::EmuFrontFileObject_Id);
-    mtid = mtModel->data(mtInd).toInt();*/
+        supModel->index(setupSelectBox->currentIndex(), SetupModel::Setup_MediaTypeId);
+    int mtid = supModel->data(mtInd).toInt();
 
-    /*try {
-        mt = dynamic_cast<MediaType*>(mediaTypeSelectBox->getSelected());
-        plf = dynamic_cast<Platform*>(platformSelectBox->getSelected());
-    }
-    catch(EmuFrontException &e){
-        errorMessage->showMessage(e.what());
-        return;
-    }*/
-    /*mtid = mt ? mt->getId() : -1;
-    plfid = plf ? plf->getId() : -1;
-    if (mt) delete mt;
-    if (plf) delete plf;*/
+    if (mtid < 0 || plfid < 0) return;
 
+    // 2. fetch available media image containers
     if (!dbMic) dbMic = new DbMediaImageContainer(this);
-    //dbMic->filter(mtid, plfid);
+    dbMic->filter(mtid, plfid);
     micTable->setModel(dbMic->getDataModel());
     micTable->hideColumn(DbMediaImageContainer::MIC_FileId);
     micTable->hideColumn(DbMediaImageContainer::MIC_FileSize);
@@ -186,7 +132,15 @@ void EmuLauncher::updateMediaImageContainers()
     micTable->hideColumn(DbMediaImageContainer::MIC_MediaTypeName);
     micTable->hideColumn(DbMediaImageContainer::MIC_MediaTypeId);
     micTable->resizeColumnsToContents();
-    //execSelectBox->updateToSetup(plfid, mtid);
+
+    // 3. filter available emulators
+    QModelIndex supInd =
+            supModel->index(setupSelectBox->currentIndex(), SetupModel::Setup_Id);
+    int supid = supModel->data(supInd).toInt();
+    QAbstractItemModel *execAbsModel = execSelectBox->model();
+    ExternalExecutableModel *execModel = qobject_cast<ExternalExecutableModel*>(execAbsModel);
+    if (!execModel) return;
+    execModel->filterBySetup(supid);
 }
 
 void EmuLauncher::launchEmu()
index 27a8872..c657267 100644 (file)
@@ -27,12 +27,7 @@ class QTableView;
 class QPushButton;
 class QComboBox;
 class QErrorMessage;
-//class DbMediaType;
-//class DbPlatform;
 class DbMediaImageContainer;
-//class DbExecutable;
-//class EFFileObjectComboBox;
-//class ExecutableComboBox;
 class Executable;
 class MediaImageContainer;
 class EmuHelper;
@@ -56,26 +51,15 @@ private slots:
 
 private:
     QTableView *micTable;
-    /*EFFileObjectComboBox *platformSelectBox;
-    EFFileObjectComboBox *mediaTypeSelectBox;
-    ExecutableComboBox *execSelectBox;*/
-    //QComboBox *platformSelectBox;
-    //QComboBox *mediaTypeSelectBox;
     QComboBox *setupSelectBox;
     QComboBox *execSelectBox;
-
     QPushButton *selectButton;
     QPushButton *launchButton;
-    //DbPlatform *dbPlatform;
-    //DbMediaType *dbMediaType;
     DbMediaImageContainer *dbMic;
-    //DbExecutable *dbExec;
     EmuHelper *emuHelper;
     void initWidgets();
     void layout();
     void connectSignals();
-    //void populatePlatformSelectBox();
-    //void populateMediaTypeSelectBox();
     void launch(const Executable*, const MediaImageContainer*);
     void cleanTmp();
     QString tmpDirPath;
index fa71cfc..0720a4b 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <QtSql>
 #include "emufrontfileobjectmodel.h"
+#include "emufrontfile.h"
+#include "emufrontfileobject.h"
 
 EmuFrontFileObjectModel::EmuFrontFileObjectModel(QObject *parent) :
     EmuFrontQueryModel(parent)
@@ -135,3 +137,25 @@ bool EmuFrontFileObjectModel::removeRows(int row, int count, const QModelIndex &
     refresh();
     return true;
 }
+
+// Implemented for EmuFrontQueryModel:
+EmuFrontObject* EmuFrontFileObjectModel::recordToDataObject(const QSqlRecord* record)
+{
+    int id = record->value(EmuFrontFileObject_Id).toInt();
+    QString name = record->value(EmuFrontFileObject_Name).toString();
+    int fileId = record->value(EmuFrontFileObject_FileId).toInt();
+    EmuFrontFile *f = 0;
+    /*if (fileId > 0)
+    {
+        // TODO: need fileModel
+        EmuFrontObject *o = fileModel.getDataObject(fileId);
+        f = dynamic_cast<EmuFrontFile*>(o);
+    }*/
+    EmuFrontObject *efo = createEmuFrontFileObject(id, name, f);
+    return efo;
+}
+
+QString EmuFrontFileObjectModel::constructFilterById(int id) const
+{
+    return QString("maintbl.id = %1").arg(id);
+}
index 218ba72..f2cbc4e 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "emufrontquerymodel.h"
 
+class EmuFrontFile;
+
 class EmuFrontFileObjectModel : public EmuFrontQueryModel
 {
     Q_OBJECT
@@ -46,6 +48,13 @@ protected:
     virtual void refresh();
     virtual QString constructSelect(QString where = "") const;
     virtual bool setName(int id, const QString &name);
+    // Implemented for EmuFrontQueryModel:
+    virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
+    virtual QString constructFilterById(int id) const;
+
+private:
+    virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) = 0;
+
 };
 
 #endif // EMUFRONTFILEOBJECTMODEL_H
index 09b2640..4ae2adf 100644 (file)
 */
 #include "emufrontquerymodel.h"
 #include "emufrontobject.h"
+#include "platform.h"
+#include "mediatype.h"
+#include <QtSql>
 
 EmuFrontQueryModel::EmuFrontQueryModel(QObject *parent) :
     QSqlQueryModel(parent)
 {
 }
 
-EmuFrontObject* EmuFrontQueryModel::getObject(int id) const
+EmuFrontObject* EmuFrontQueryModel::getObject(int row) const
 {
     // TODO
     return 0;
 }
+
+/*Platform* EmuFrontQueryModel::getPlatform(int id) const
+{
+}*/
+
+EmuFrontObject* EmuFrontQueryModel::getDataObject(int id)
+{
+    filterById(id);
+    return getFilteredDataObject();
+}
+
+EmuFrontObject* EmuFrontQueryModel::getDataObject(QString filter)
+{
+    QList<QString> filters;
+    filters.append(filter);
+    filterDataObjects(filters);
+    return getFilteredDataObject();
+}
+
+EmuFrontObject* EmuFrontQueryModel::getFilteredDataObject()
+{
+    EmuFrontObject *plf = 0;
+    // TODO: if record has more than one the first instance is returned
+    // ... check if this is ok in all cases!
+    if (rowCount() >= 1)
+    {
+        QSqlRecord rec = record(0);
+        if (rec.isEmpty()) {
+            return 0;
+        }
+        else plf = recordToDataObject(&rec);
+    }
+     return plf;
+}
+
+EmuFrontObject* EmuFrontQueryModel::getDataObject(const QModelIndex &index)
+{
+    QSqlRecord rec = record(index.row());
+    return recordToDataObject(&rec);
+}
+
+int EmuFrontQueryModel::getCurrentTimeStamp() {
+    return QDateTime::currentDateTime().toTime_t();
+}
+
+void EmuFrontQueryModel::filterById(int id)
+{
+    QList<QString> filters;
+    filters.append(constructFilterById(id));
+    filterDataObjects(filters);
+}
+
+/* filters is a list of SQL conditions e.g. setup.id=1 */
+void EmuFrontQueryModel::filterDataObjects(QList<QString> filters)
+{
+    QString where = constructWhereByFilters(filters);
+    QString query = constructSelect(where);
+    setQuery(query);
+}
+
+QString EmuFrontQueryModel::constructWhereByFilters(QList<QString>filters)
+{
+    if (filters.count() == 0) return "";
+    QString where = " WHERE ";
+    int c = 0;
+    foreach(QString filter, filters){
+        where.append(QString(" %1 ").arg(filter));
+        if (++c < filters.count())
+            where.append(" AND ");
+    }
+    return where;
+}
+
+void EmuFrontQueryModel::clearFilters()
+{
+    setQuery(constructSelect());
+}
+
index ca64d27..f238e00 100644 (file)
 #include <QSqlQueryModel>
 
 class EmuFrontObject;
+class Platform;
+class MediaType;
 
 class EmuFrontQueryModel : public QSqlQueryModel
 {
     Q_OBJECT
+
 public:
     EmuFrontQueryModel(QObject *parent = 0);
-    EmuFrontObject* getObject(int id) const;
-
-signals:
-
-public slots:
+    EmuFrontObject* getDataObject(int id);
+    EmuFrontObject* getDataObject(const QModelIndex &index);
+    EmuFrontObject* getObject(int row) const;
+    static int getCurrentTimeStamp();
 
 protected:
     QString tableName;
     QList<int> editableColumns;
+    void filterDataObjects(QList<QString> filter);
+    QString constructWhereByFilters(QList<QString> filters);
+    EmuFrontObject* getDataObject(QString filter);
+    virtual void filterById(int id);
+    void clearFilters();
+    virtual EmuFrontObject* recordToDataObject(const QSqlRecord* ) = 0;
+    virtual QString constructFilterById(int id) const = 0;
+    virtual QString constructSelect(QString whereClause = "") const = 0;
+
+private:
+    EmuFrontObject* getFilteredDataObject();
 };
 
 #endif // EMUFRONTQUERYMODEL_H
index ec46b25..a8c0ab5 100644 (file)
@@ -21,6 +21,8 @@
 
 #include "externalexecutablemodel.h"
 #include "executable.h"
+#include "setup.h"
+#include "setupmodel.h"
 #include "emufrontexception.h"
 #include <QtSql>
 
@@ -60,7 +62,7 @@ QString ExternalExecutableModel::constructSelect(QString where) const
                    "INNER JOIN setup ON executable.setupid = setup.id "
                    "INNER JOIN platform ON setup.platformid=platform.id "
                    "INNER JOIN mediatype ON setup.mediatypeid=mediatype.id "
-                   "%1 "
+                   " %1 "
                    "ORDER BY executable.name").arg(where);
 }
 
@@ -207,3 +209,33 @@ bool ExternalExecutableModel::setExecutableName(int id, QString name)
     q.bindValue(":id", id);
     return q.exec();
 }
+
+void ExternalExecutableModel::filterBySetup(int setupid)
+{
+    QList<QString> filters;
+    filters.append(QString("executable.setupid=%1").arg(setupid));
+    filterDataObjects(filters);
+}
+
+// Implemented for EmuFrontQueryModel:
+EmuFrontObject* ExternalExecutableModel::recordToDataObject(const QSqlRecord* rec)
+{
+    Executable *ex = 0;
+    if (!rec) return ex;
+    int id = rec->value(Executable_Id).toInt();
+    int supid = rec->value(Executable_SetupId).toInt();
+    SetupModel supModel;
+    EmuFrontObject *ob = supModel.getDataObject(supid);
+    Setup *sup = dynamic_cast<Setup*>(ob);
+    QString name = rec->value(Executable_Name).toString();
+    QString exec = rec->value(Executable_Executable).toString();
+    QString opts = rec->value(Executable_Options).toString();
+    int type = rec->value(Executable_TypeId).toInt();
+    ex = new Executable(id, name, exec, opts, sup, type);
+    return ex;
+}
+
+QString ExternalExecutableModel::constructFilterById(int id) const
+{
+    return QString("executable.id=%1").arg(id);
+}
index 08b4dde..e5ce786 100644 (file)
@@ -33,6 +33,7 @@ public:
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
     virtual bool insertRows(int row, int count, const QModelIndex &parent);
     virtual bool removeRows(int row, int count, const QModelIndex &parent);
+    void filterBySetup(int setupId);
     enum {
         Executable_Id = 0,
         Executable_Name,
@@ -50,6 +51,11 @@ protected:
     virtual bool setExecutableName(int id, QString name);
     virtual bool setExecutable(int id, QString name);
     virtual bool setOptions(int id, QString options);
+
+    // Implemented for EmuFrontQueryModel:
+    virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
+    virtual QString constructFilterById(int id) const;
+
 };
 
 #endif // EXTERNALEXECUTABLEMODEL_H
index 6462527..bd59729 100644 (file)
@@ -22,6 +22,9 @@
 #include "filepathmodel.h"
 #include "emufrontfile.h"
 #include "emufrontexception.h"
+#include "filepathobject.h"
+#include "setup.h"
+#include "setupmodel.h"
 #include <QtSql>
 
 FilePathModel::FilePathModel(QObject *parent) :
@@ -180,3 +183,36 @@ bool FilePathModel::setFilePath(int id, QString filePath)
     q.bindValue(":id", id);
     return q.exec();
 }
+
+bool FilePathModel::setScanned(int id)
+{
+    QSqlQuery q;
+    q.prepare(QString("UPDATE filepath SET lastscanned = :timestamp WHERE id = :id"));
+    q.bindValue(":timestamp", getCurrentTimeStamp());
+    q.bindValue(":id", id);
+    return q.exec();
+}
+
+FilePathObject* FilePathModel::getFilePathObject(const QModelIndex &index)
+{
+    if (!index.isValid()) return 0;
+    EmuFrontObject *efo = getDataObject(index);
+    return dynamic_cast<FilePathObject *>(efo);
+}
+
+EmuFrontObject* FilePathModel::recordToDataObject(const QSqlRecord* rec)
+{
+    int id = rec->value(FilePath_Id).toInt();
+    QString fpath = rec->value(FilePath_Name).toString();
+    int setupId = rec->value(FilePath_SetupId).toInt();
+    int fileType = rec->value(FilePath_FileTypeId).toInt();
+    SetupModel supModel;
+    EmuFrontObject *efo = supModel.getDataObject(setupId);
+    Setup *sup = dynamic_cast<Setup*>(efo);
+    return new FilePathObject(id, fpath, fileType, sup);
+}
+
+QString FilePathModel::constructFilterById(int id) const
+{
+    return QString("filepath.id = %1").arg(id);
+}
index a6691e3..712ba35 100644 (file)
@@ -23,6 +23,7 @@
 #define FILEPATHMODEL_H
 
 #include "emufrontquerymodel.h"
+class FilePathObject;
 
 class FilePathModel : public EmuFrontQueryModel
 {
@@ -40,12 +41,18 @@ public:
            FilePath_SetupName,
            FilePath_FileTypeId
        };
+    FilePathObject* getFilePathObject(const QModelIndex &index);
+    virtual bool setScanned(int id);
 
 protected:
     virtual void refresh();
     virtual QString constructSelect(QString where = "") const;
     virtual bool setFilePath(int id, QString filePath);
     virtual bool setSetup(int isd, int setupId);
+
+    // Implemented for EmuFrontQueryModel:
+    virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
+    virtual QString constructFilterById(int id) const;
 };
 
 #endif // FILEPATHMODEL_H
index 7b569e5..c3d31a4 100644 (file)
@@ -19,6 +19,7 @@
 ** along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "mediatype.h"
 #include "mediatypemodel.h"
 
 MediaTypeModel::MediaTypeModel(QObject *parent) :
@@ -27,3 +28,7 @@ MediaTypeModel::MediaTypeModel(QObject *parent) :
     tableName = "mediatype";
     refresh();
 }
+
+EmuFrontObject* MediaTypeModel::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f)
+{   return new MediaType(id, name, f); }
+
index 8450a65..75b3c83 100644 (file)
 **
 ** You should have received a copy of the GNU General Public License
 ** along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
-*/#ifndef MEDIATYPEMODEL_H
+*/
+#ifndef MEDIATYPEMODEL_H
 #define MEDIATYPEMODEL_H
 
 #include "emufrontfileobjectmodel.h"
 
+class EmuFrontObject;
+class EmuFrontFile;
+
 class MediaTypeModel : public EmuFrontFileObjectModel
 {
     Q_OBJECT
 public:
     MediaTypeModel(QObject *parent = 0);
+private:
+    EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
 };
 
 #endif // MEDIATYPEMODEL_H
index 01a30f0..bc652a6 100644 (file)
@@ -18,6 +18,7 @@
 ** You should have received a copy of the GNU General Public License
 ** along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 */
+#include "platform.h"
 #include "platformmodel.h"
 
 PlatformModel::PlatformModel(QObject *parent) :
@@ -26,3 +27,7 @@ PlatformModel::PlatformModel(QObject *parent) :
     tableName = "platform";
     refresh();
 }
+
+EmuFrontObject* PlatformModel::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f)
+{   return new Platform(id, name, f); }
+
index 99330b0..0cad578 100644 (file)
 
 #include "emufrontfileobjectmodel.h"
 
+class EmuFrontObject;
+class EmuFrontFile;
 class PlatformModel : public EmuFrontFileObjectModel
 {
     Q_OBJECT
 public:
     PlatformModel(QObject *parent = 0);
+private:
+    EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
 };
 
 #endif // PLATFORMMODEL_H
index 1dfa16d..6c52270 100644 (file)
 ** You should have received a copy of the GNU General Public License
 ** along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 */
+#include "setup.h"
 #include "setupmodel.h"
+#include "platform.h"
+#include "mediatype.h"
+#include "platformmodel.h"
+#include "mediatypemodel.h"
 #include "emufrontexception.h"
 #include <QtSql>
 
@@ -199,3 +204,33 @@ bool SetupModel::removeRows(int row, int count, const QModelIndex &parent)
     return true;
 }
 
+// Implemented for EmuFrontQueryModel:
+EmuFrontObject* SetupModel::recordToDataObject(const QSqlRecord *rec)
+{
+    Setup *s = 0;
+    if (!rec) return s;
+
+    int id = rec->value(Setup_Id).toInt();
+    QString extensions = rec->value(Setup_FileTypeExtensions).toString().trimmed();
+    QStringList list;
+    if (!extensions.isEmpty())
+        list = extensions.split(FILE_TYPE_EXTENSION_SEPARATOR);
+    int plfId = rec->value(Setup_PlatformId).toInt();
+    int mtId = rec->value(Setup_MediaTypeId).toInt();
+    PlatformModel plfModel;
+    EmuFrontObject *efo_plf = plfModel.getDataObject(plfId);
+    Platform *plf = dynamic_cast<Platform*>(efo_plf);
+
+    MediaTypeModel mdtModel;
+    EmuFrontObject *efo_mdt = mdtModel.getDataObject(mtId);
+    MediaType *mt = dynamic_cast<MediaType*>(efo_mdt);
+
+    s = new Setup(id, plf, mt, list);
+    return s;
+}
+
+QString SetupModel::constructFilterById(int id) const
+{
+     return QString("setup.id = %1").arg(id);
+}
+
index 7114563..f1082f7 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "emufrontquerymodel.h"
 
+class SetupLt;
+
 class SetupModel : public EmuFrontQueryModel
 {
     Q_OBJECT
@@ -31,12 +33,14 @@ public:
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
     virtual bool insertRows(int row, int count, const QModelIndex &parent);
     virtual bool removeRows(int row, int count, const QModelIndex &parent);
+    //virtual EmuFrontObject* getObject(int row) const;
     enum { Setup_Id = 0,
            Setup_PlatformId,
            Setup_MediaTypeId,
            Setup_FileTypeExtensions,
            Setup_Name };
     static const QString FILE_TYPE_EXTENSION_SEPARATOR;
+    SetupLt* getCurrentItem();
 
 protected:
     virtual void refresh();
@@ -44,6 +48,10 @@ protected:
     virtual bool setPlatform(int id, int platformId);
     virtual bool setMediaType(int id, int platformId);
     virtual bool setSupportedExtensions(int id, QString);
+
+    // Implemented for EmuFrontQueryModel:
+    virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
+    virtual QString constructFilterById(int id) const;
 };
 
 #endif // SETUPMODEL_H
index f2cccde..8235a15 100644 (file)
@@ -44,6 +44,7 @@ protected:
     QDialogButtonBox *buttonBox;
     QTableView *objectList;
     void postInit();
+    virtual void connectSignals();
 
 private:
     QPushButton *editButton;
@@ -52,7 +53,6 @@ private:
     void layout();
     virtual void setHiddenColumns();
     void hideColumns();
-    virtual void connectSignals();
     void setButtonsEnabled(bool);
 
 };
index b03adea..24504ed 100644 (file)
 */
 #include "filepatheditview.h"
 #include "filepathmodel.h"
+#include "fileutil.h"
 #include "setupmodel.h"
 #include "comboboxdelegate.h"
 #include "filesystembrowsedelegate.h"
+#include "dbmediaimagecontainer.h"
 #include <QtGui>
 
 FilePathEditView::FilePathEditView(QWidget *parent) :
     EmuFrontEditView(parent)
 {
+    scanButton = new QPushButton(tr("&Scan"));
+    buttonBox->addButton(scanButton, QDialogButtonBox::ActionRole);
+    fileUtil = new FileUtil(this);
+    initProgressDialog();
+
+    dbMediaImageContainer = new DbMediaImageContainer(this);
+
     model = new FilePathModel(this);
     objectList->setModel(model);
     SetupModel *stupMdl = new SetupModel(this);
@@ -42,3 +51,65 @@ FilePathEditView::FilePathEditView(QWidget *parent) :
     objectList->setItemDelegateForColumn(FilePathModel::FilePath_Name, fsBrowseDelegate);
     postInit();
 }
+
+void FilePathEditView::initProgressDialog()
+{
+    progressDialog = new QProgressDialog(this);
+    progressDialog->setWindowTitle(tr("Scanning files"));
+    progressDialog->setCancelButtonText(tr("Abort"));
+    progressDialog->setWindowModality(Qt::WindowModal);
+}
+
+void FilePathEditView::connectSignals()
+{
+    EmuFrontEditView::connectSignals();
+    connect(scanButton, SIGNAL(clicked()), this, SLOT(beginScanFilePath()));
+}
+
+void FilePathEditView::beginScanFilePath()
+{
+    QModelIndex index = objectList->currentIndex();
+    if (!index.isValid()) return;
+
+    if (QMessageBox::question(this,
+        tr("Confirm"),
+        tr("Do you want to continue? "
+        "If you have tons of huge files this may take even hours! "
+        "If you are low on battery power, consider carefully!"),
+        QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton ) == QMessageBox::No)
+    { return; }
+
+    FilePathModel *fpModel = qobject_cast<FilePathModel*>(model);
+    FilePathObject *fpo = fpModel->getFilePathObject(index);
+    if (!fpo) {
+        errorMessage->showMessage(tr("Failed creating a file path object of selected file path."));
+        return;
+    }
+    try
+    {
+        QStringList l;
+        l << "*.zip"; // TODO set filters in a global constant class
+
+        // Remove old instances scanned from this file path
+        dbMediaImageContainer->removeFromFilePath(fpo->getId());
+
+        progressDialog->show();
+
+        //setUIEnabled(false);
+        int count = fileUtil->scanFilePath(fpo, l, dbMediaImageContainer, progressDialog);
+        progressDialog->hide();
+
+        QMessageBox msgBox;
+        msgBox.setText(tr("Scanned %1 files to database.").arg(count)); msgBox.exec();
+        fpModel->setScanned(fpo->getId());
+        //updateList();
+    }
+    catch (EmuFrontException s)
+    {
+        errorMessage->showMessage( s.what() );
+    }
+    //setUIEnabled(true);
+    delete fpo;
+    fpo = 0;
+}
+
index 60cd4f9..db199f6 100644 (file)
 
 #include "emufronteditview.h"
 
+class FileUtil;
+class QProgressDialog;
+class DbMediaImageContainer;
+
 class FilePathEditView : public EmuFrontEditView
 {
     Q_OBJECT
 public:
     FilePathEditView(QWidget *parent = 0);
 
-signals:
+protected:
+    virtual void connectSignals();
 
-public slots:
+private slots:
+    void beginScanFilePath();
 
+private:
+    QPushButton* scanButton;
+    FileUtil *fileUtil;
+    DbMediaImageContainer *dbMediaImageContainer;
+    QProgressDialog *progressDialog;
+    void scanFilePath(const QString path, const QStringList filters);
+    void initProgressDialog();
 };
 
 #endif // FILEPATHEDITVIEW_H