From: Mikko Keinänen Date: Sun, 5 Dec 2010 23:43:36 +0000 (+0200) Subject: Continued implementing ComboBoxDelegate ... not tested yet ... X-Git-Url: http://vcs.maemo.org/git/?a=commitdiff_plain;h=4cb90b39ede93044959777b9be45dbc88a61fdd9;hp=fafad1907a7b2ddea75ca1c3763e35e20f78a5a3;p=emufront Continued implementing ComboBoxDelegate ... not tested yet ... compiles. --- diff --git a/src/delegates/comboboxdelegate.cpp b/src/delegates/comboboxdelegate.cpp index 75a55bc..bf63904 100644 --- a/src/delegates/comboboxdelegate.cpp +++ b/src/delegates/comboboxdelegate.cpp @@ -1,22 +1,34 @@ #include +#include #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(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(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(sender()); + emit commitData(editor); + emit closeEditor(editor); } diff --git a/src/delegates/comboboxdelegate.h b/src/delegates/comboboxdelegate.h index a517a3e..0b93ae4 100644 --- a/src/delegates/comboboxdelegate.h +++ b/src/delegates/comboboxdelegate.h @@ -3,13 +3,13 @@ #include -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