QComboBox delegate implemented and quickly tested being functional! :)
authorMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 6 Dec 2010 00:44:56 +0000 (02:44 +0200)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 6 Dec 2010 00:44:56 +0000 (02:44 +0200)
src/delegates/comboboxdelegate.cpp
src/delegates/comboboxdelegate.h
src/emufront.pro
src/models/setupmodel.cpp
src/models/setupmodel.h
src/views/setupeditview.cpp

index bf63904..d3993d7 100644 (file)
@@ -4,8 +4,8 @@
 #include "emufrontquerymodel.h"
 #include "emufrontobject.h"
 
-ComboBoxDelegate::ComboBoxDelegate(int viewColumn, QSqlQueryModel *model, int modelIdColumn, int modelDisplayColumn, QWidget *parent) :
-    QStyledItemDelegate(parent), viewColumn(viewColumn), model(model), modelIdColumn(modelIdColumn), modelDisplayColumn(modelDisplayColumn)
+ComboBoxDelegate::ComboBoxDelegate(int viewColumn, QSqlQueryModel *cbmodel, int cbmodelIdColumn, int cbmodelDisplayColumn, QWidget *parent) :
+    QStyledItemDelegate(parent), viewColumn(viewColumn), cbmodel(cbmodel), cbmodelIdColumn(cbmodelIdColumn), cbmodelDisplayColumn(cbmodelDisplayColumn)
 { }
 
 void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
@@ -19,15 +19,16 @@ void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
     int objid = index.model()->data(index,  Qt::DisplayRole).toInt();
 
     // find matching object from QComboBox's model
-    QModelIndex startInd = model->index(0, modelIdColumn);
-    QModelIndexList indList = model->match(startInd, Qt::DisplayRole, objid);
+    QModelIndex startInd = cbmodel->index(0, cbmodelIdColumn);
+    QModelIndexList indList = cbmodel->match(startInd, Qt::DisplayRole, objid);
+
 
     QModelIndex ind = indList.empty() ?
         QModelIndex() :
-        model->index(startInd.row(), modelDisplayColumn);
+        cbmodel->index(indList.first().row(), cbmodelDisplayColumn);
 
     QString txt = ind.isValid() ?
-        model->data(ind).toString() : "";
+        cbmodel->data(ind).toString() : "";
 
     painter->save();
     //initStyleOption(&option, index);
@@ -45,7 +46,8 @@ QWidget* ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewI
 
     QComboBox *editor = new QComboBox(parent);
     editor->setEditable(false);
-    editor->setModel(model);
+    editor->setModel(cbmodel);
+    editor->setModelColumn(cbmodelDisplayColumn);
     connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
     return editor;
 }
@@ -61,9 +63,9 @@ void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index)
     int id = index.model()->data(index, Qt::DisplayRole).toInt();
     QComboBox *cbox = qobject_cast<QComboBox *>(editor);
     // create a start index from combobox model
-    QModelIndex startInd = model->index(0, modelIdColumn);
+    QModelIndex startInd = cbmodel->index(0, cbmodelIdColumn);
     // search an index for selected item in parent view
-    QModelIndexList indList = model->match(startInd, Qt::DisplayRole, id);
+    QModelIndexList indList = cbmodel->match(startInd, Qt::DisplayRole, id);
     // if no match set no item selected
     int ind = indList.empty() ? -1 : indList.first().row();
     cbox->setCurrentIndex(ind);
@@ -76,8 +78,8 @@ void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
     }
     QComboBox *cbox = qobject_cast<QComboBox *>(editor);
     if (cbox->currentIndex() == -1) return;
-    QModelIndex mi = model->index(cbox->currentIndex(), modelIdColumn);
-    int id = model->data(mi).toInt();
+    QModelIndex mi = cbmodel->index(cbox->currentIndex(), cbmodelIdColumn);
+    int id = cbmodel->data(mi).toInt();
     model->setData(index, id);
 }
 
index 0b93ae4..1e53762 100644 (file)
@@ -9,7 +9,12 @@ class ComboBoxDelegate : public QStyledItemDelegate
 {
     Q_OBJECT
 public:
-    ComboBoxDelegate(int column, QSqlQueryModel *, int modelIdColumn, int modelDisplayColumn, QWidget *parent = 0);
+    ComboBoxDelegate(int column,
+        QSqlQueryModel *,
+        int cbmodelIdColumn,
+        int cbmodelDisplayColumn,
+        QWidget *parent = 0);
+
     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
     //QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
     QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
@@ -20,9 +25,9 @@ private slots:
     void commitAndCloseEditor();
 private:
     int viewColumn;
-    QSqlQueryModel *model;
-    int modelIdColumn;
-    int modelDisplayColumn;
+    QSqlQueryModel *cbmodel;
+    int cbmodelIdColumn;
+    int cbmodelDisplayColumn;
 };
 
 #endif // COMBOBOXDELEGATE_H
index 1fa6f53..fc11c07 100644 (file)
@@ -11,6 +11,7 @@ DEPENDPATH += . \
     models \
     utils \
     widgets \
+    delegates \
     views
 INCLUDEPATH += . \
     db \
@@ -20,6 +21,7 @@ INCLUDEPATH += . \
     models \
     utils \
     widgets \
+    delegates \
     views
 QT += sql
 QT += xml
index cea5ccc..a7fe6b7 100644 (file)
@@ -18,6 +18,7 @@
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "setupmodel.h"
+#include <QtSql>
 
 SetupModel::SetupModel(QObject *parent) :
     EmuFrontQueryModel(parent)
@@ -49,3 +50,44 @@ QString SetupModel::constructSelect(QString where) const
         "ORDER BY SetupName"
         ).arg(where);
 }
+
+Qt::ItemFlags SetupModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
+    if (index.column() == Setup_PlatformId) {
+        flags |= Qt::ItemIsEditable;
+    }
+    return flags;
+}
+
+bool SetupModel::setData(const QModelIndex &index, const QVariant &value, int /*role*/)
+{
+    if(index.column() != Setup_PlatformId)
+        return false;
+
+    QModelIndex primaryKeyIndex
+        = QSqlQueryModel::index(index.row(), Setup_Id);
+
+    int id = data(primaryKeyIndex).toInt();
+    clear();
+
+    bool ok;
+    if (index.column() == Setup_PlatformId) {
+        ok = setPlatform(id, value.toInt());
+    }
+
+    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();
+}
index 036a016..906b5ba 100644 (file)
@@ -27,6 +27,8 @@ class SetupModel : public EmuFrontQueryModel
     Q_OBJECT
 public:
     SetupModel(QObject *parent = 0);
+    virtual Qt::ItemFlags flags(const QModelIndex &index) const;
+    virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
     enum { Setup_Id = 0,
            Setup_PlatformId,
            Setup_MediaTypeId,
@@ -37,6 +39,7 @@ public:
 protected:
     virtual void refresh();
     virtual QString constructSelect(QString where = "") const;
+    virtual bool setPlatform(int id, int platformId);
 };
 
 #endif // SETUPMODEL_H
index dbf7e91..15cdeba 100644 (file)
 #include <QtGui>
 #include "setupeditview.h"
 #include "setupmodel.h"
+#include "comboboxdelegate.h"
+#include "platformmodel.h"
+#include <QSqlTableModel>
 
 SetupEditView::SetupEditView(QWidget *parent) :
     EmuFrontEditView(parent)
 {
     model = new SetupModel(this);
     objectList->setModel(model);
+    /*QSqlTableModel *platformModel = new QSqlTableModel(this);
+    platformModel->setTable("platform");
+    platformModel->removeColumn(Plat)*/
+    PlatformModel *plfModel = new PlatformModel(this);
+    ComboBoxDelegate *platformDelegate = new ComboBoxDelegate(SetupModel::Setup_PlatformId, plfModel, PlatformModel::EmuFrontFileObject_Id, PlatformModel::EmuFrontFileObject_Name, this);
+    objectList->setItemDelegate(platformDelegate);
     postInit();
 }