#include "library/stardelegate.h" #include #include #include "library/stareditor.h" #include "library/starrating.h" #include "library/tableitemdelegate.h" #include "moc_stardelegate.cpp" StarDelegate::StarDelegate(QTableView* pTableView) : TableItemDelegate(pTableView), m_pTableView(pTableView), m_isOneCellInEditMode(false) { connect(pTableView, &QTableView::entered, this, &StarDelegate::cellEntered); } void StarDelegate::paintItem( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // let the editor do the painting if this cell is currently being edited if (index == m_currentEditedCellIndex) { return; } paintItemBackground(painter, option, index); StarRating starRating = index.data().value(); starRating.paint(painter, option.rect); } QSize StarDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(option); StarRating starRating = index.data().value(); return starRating.sizeHint(); } QWidget* StarDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { // Populate the correct colors based on the styling QStyleOptionViewItem newOption = option; initStyleOption(&newOption, index); StarEditor* editor = new StarEditor(parent, m_pTableView, index, newOption); connect(editor, &StarEditor::editingFinished, this, &StarDelegate::commitAndCloseEditor); return editor; } void StarDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { StarRating starRating = index.data().value(); StarEditor* starEditor = qobject_cast(editor); starEditor->setStarRating(starRating); } void StarDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { StarEditor* starEditor = qobject_cast(editor); model->setData(index, QVariant::fromValue(starEditor->starRating())); } void StarDelegate::commitAndCloseEditor() { StarEditor* editor = qobject_cast(sender()); emit commitData(editor); emit closeEditor(editor); } void StarDelegate::cellEntered(const QModelIndex& index) { // This slot is called if the mouse pointer enters ANY cell on the // QTableView but the code should only be executed on a column with a // StarRating. if (index.data().canConvert(qMetaTypeId())) { if (m_isOneCellInEditMode) { m_pTableView->closePersistentEditor(m_currentEditedCellIndex); } m_pTableView->openPersistentEditor(index); m_isOneCellInEditMode = true; m_currentEditedCellIndex = index; } else if (m_isOneCellInEditMode) { m_isOneCellInEditMode = false; m_pTableView->closePersistentEditor(m_currentEditedCellIndex); m_currentEditedCellIndex = QModelIndex(); } }