Continued implementing ComboBoxDelegate ... not tested yet ...
authorMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 5 Dec 2010 23:43:36 +0000 (01:43 +0200)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 5 Dec 2010 23:43:36 +0000 (01:43 +0200)
compiles.

src/delegates/comboboxdelegate.cpp
src/delegates/comboboxdelegate.h

index 75a55bc..bf63904 100644 (file)
@@ -1,22 +1,34 @@
 #include <QtGui>
+#include <QSqlQueryModel>
 #include "comboboxdelegate.h"
 #include "emufrontquerymodel.h"
 #include "emufrontobject.h"
 
-ComboBoxDelegate::ComboBoxDelegate(int column, EmuFrontQueryModel *model, QWidget *parent) :
-    QStyledItemDelegate(parent), column(column), model(model)
+ComboBoxDelegate::ComboBoxDelegate(int viewColumn, QSqlQueryModel *model, int modelIdColumn, int modelDisplayColumn, QWidget *parent) :
+    QStyledItemDelegate(parent), viewColumn(viewColumn), model(model), modelIdColumn(modelIdColumn), modelDisplayColumn(modelDisplayColumn)
 { }
 
 void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
-    if (index.column() != column) {
+    if (index.column() != viewColumn) {
         QStyledItemDelegate::paint(painter, option, index);
         return;
     }
 
+    // get the item id from the hosting view's model
     int objid = index.model()->data(index,  Qt::DisplayRole).toInt();
-    EmuFrontObject *efo = model->getObject(objid);
-    QString txt = efo->getName();
+
+    // find matching object from QComboBox's model
+    QModelIndex startInd = model->index(0, modelIdColumn);
+    QModelIndexList indList = model->match(startInd, Qt::DisplayRole, objid);
+
+    QModelIndex ind = indList.empty() ?
+        QModelIndex() :
+        model->index(startInd.row(), modelDisplayColumn);
+
+    QString txt = ind.isValid() ?
+        model->data(ind).toString() : "";
+
     painter->save();
     //initStyleOption(&option, index);
     painter->drawText(option.rect, txt);
@@ -27,7 +39,7 @@ void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
 
 QWidget* ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
-    if (index.column() != column) {
+    if (index.column() != viewColumn) {
         return QStyledItemDelegate::createEditor(parent, option, index);
     }
 
@@ -40,14 +52,39 @@ QWidget* ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewI
 
 void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
 {
+    if (index.column() != viewColumn) {
+        return QStyledItemDelegate::setEditorData(editor, index);
+    }
 
+    // set the correct item selected for the editor:
+    // get the item id from the parent view's model
+    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);
+    // search an index for selected item in parent view
+    QModelIndexList indList = model->match(startInd, Qt::DisplayRole, id);
+    // if no match set no item selected
+    int ind = indList.empty() ? -1 : indList.first().row();
+    cbox->setCurrentIndex(ind);
 }
 
 void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
 {
+    if (index.column() != viewColumn) {
+        return QStyledItemDelegate::setModelData(editor, model, index);
+    }
+    QComboBox *cbox = qobject_cast<QComboBox *>(editor);
+    if (cbox->currentIndex() == -1) return;
+    QModelIndex mi = model->index(cbox->currentIndex(), modelIdColumn);
+    int id = model->data(mi).toInt();
+    model->setData(index, id);
 }
 
 void ComboBoxDelegate::commitAndCloseEditor()
 {
+    QComboBox *editor = qobject_cast<QComboBox *>(sender());
+    emit commitData(editor);
+    emit closeEditor(editor);
 }
 
index a517a3e..0b93ae4 100644 (file)
@@ -3,13 +3,13 @@
 
 #include <QStyledItemDelegate>
 
-class EmuFrontQueryModel;
+class QSqlQueryModel;
 
 class ComboBoxDelegate : public QStyledItemDelegate
 {
     Q_OBJECT
 public:
-    ComboBoxDelegate(int column, EmuFrontQueryModel *, QWidget *parent = 0);
+    ComboBoxDelegate(int column, QSqlQueryModel *, int modelIdColumn, int modelDisplayColumn, 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;
@@ -19,8 +19,10 @@ public:
 private slots:
     void commitAndCloseEditor();
 private:
-    EmuFrontQueryModel *model;
-    int column;
+    int viewColumn;
+    QSqlQueryModel *model;
+    int modelIdColumn;
+    int modelDisplayColumn;
 };
 
 #endif // COMBOBOXDELEGATE_H