mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
I had to immprove the TankInfoModel with two new methods, insertRows and setData, because the delegate used this model to show what kind of Tanks we are offering. Since the user can enter a new type of Tank, it's important to add this tank to all lists using the delegates. I Also added two new methods on the delegate itself, to correctly shows the data, and set the data on the model. This also will help dirk with a working example on how to edit things while using a delegate. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
85 lines
2.4 KiB
C++
85 lines
2.4 KiB
C++
#include "modeldelegates.h"
|
|
#include "../dive.h"
|
|
#include "../divelist.h"
|
|
#include "starwidget.h"
|
|
#include "models.h"
|
|
|
|
#include <QtDebug>
|
|
#include <QPainter>
|
|
#include <QSortFilterProxyModel>
|
|
#include <QStyle>
|
|
#include <QStyleOption>
|
|
#include <QComboBox>
|
|
#include <QCompleter>
|
|
#include <QLineEdit>
|
|
|
|
StarWidgetsDelegate::StarWidgetsDelegate(QWidget* parent):
|
|
QStyledItemDelegate(parent),
|
|
parentWidget(parent)
|
|
{
|
|
|
|
}
|
|
|
|
void StarWidgetsDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
|
|
{
|
|
QStyledItemDelegate::paint(painter, option, index);
|
|
|
|
if (!index.isValid())
|
|
return;
|
|
|
|
QVariant value = index.model()->data(index, TreeItemDT::STAR_ROLE);
|
|
|
|
if (!value.isValid())
|
|
return;
|
|
|
|
int rating = value.toInt();
|
|
|
|
painter->save();
|
|
painter->setRenderHint(QPainter::Antialiasing, true);
|
|
|
|
for(int i = 0; i < rating; i++)
|
|
painter->drawPixmap(option.rect.x() + i * IMG_SIZE + SPACING, option.rect.y(), StarWidget::starActive());
|
|
|
|
for(int i = rating; i < TOTALSTARS; i++)
|
|
painter->drawPixmap(option.rect.x() + i * IMG_SIZE + SPACING, option.rect.y(), StarWidget::starInactive());
|
|
|
|
painter->restore();
|
|
}
|
|
|
|
QSize StarWidgetsDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
|
|
{
|
|
return QSize(IMG_SIZE * TOTALSTARS + SPACING * (TOTALSTARS-1), IMG_SIZE);
|
|
}
|
|
|
|
QWidget* TankInfoDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
|
|
{
|
|
QComboBox *comboDelegate = new QComboBox(parent);
|
|
TankInfoModel *model = TankInfoModel::instance();
|
|
comboDelegate->setModel(model);
|
|
comboDelegate->setEditable(true);
|
|
comboDelegate->setAutoCompletion(true);
|
|
comboDelegate->setAutoCompletionCaseSensitivity(Qt::CaseInsensitive);
|
|
comboDelegate->completer()->setCompletionMode(QCompleter::PopupCompletion);
|
|
return comboDelegate;
|
|
}
|
|
|
|
void TankInfoDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
|
|
{
|
|
QComboBox *c = qobject_cast<QComboBox*>(editor);
|
|
QString data = index.model()->data(index, Qt::DisplayRole).toString();
|
|
int i = c->findText(data);
|
|
if (i != -1)
|
|
c->setCurrentIndex(i);
|
|
else
|
|
c->setEditText(data);
|
|
}
|
|
|
|
void TankInfoDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
|
|
{
|
|
QComboBox *c = static_cast<QComboBox*>(editor);
|
|
model->setData(index, c->currentText(), Qt::EditRole);
|
|
}
|
|
|
|
TankInfoDelegate::TankInfoDelegate(QObject* parent): QStyledItemDelegate(parent)
|
|
{
|
|
}
|