164 lines
5.1 KiB
C++
164 lines
5.1 KiB
C++
#include "PgLabItemDelegate.h"
|
|
#include <QApplication>
|
|
|
|
#include "Pgsql_oids.h"
|
|
#include "ResultTableModelUtil.h"
|
|
#include "CustomDataRole.h"
|
|
#include "AbstractEditorFactory.h"
|
|
|
|
PgLabItemDelegate::PgLabItemDelegate(QObject *parent)
|
|
: QStyledItemDelegate(parent)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void PgLabItemDelegate::initStyleOption(QStyleOptionViewItem *option,
|
|
const QModelIndex &index) const
|
|
{
|
|
QVariant value;
|
|
// value = index.data(Qt::FontRole);
|
|
// if (value.isValid() && !value.isNull()) {
|
|
// option->font = qvariant_cast<QFont>(value).resolve(option->font);
|
|
// option->fontMetrics = QFontMetrics(option->font);
|
|
// }
|
|
|
|
// value = index.data(Qt::TextAlignmentRole);
|
|
// if (value.isValid() && !value.isNull())
|
|
// option->displayAlignment = Qt::Alignment(value.toInt());
|
|
|
|
// value = index.data(Qt::ForegroundRole);
|
|
// if (value.canConvert<QBrush>())
|
|
// option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
|
|
|
|
|
|
option->index = index;
|
|
// value = index.data(Qt::CheckStateRole);
|
|
// if (value.isValid() && !value.isNull()) {
|
|
// option->features |= QStyleOptionViewItem::HasCheckIndicator;
|
|
// option->checkState = static_cast<Qt::CheckState>(value.toInt());
|
|
// }
|
|
|
|
// value = index.data(Qt::DecorationRole);
|
|
// if (value.isValid() && !value.isNull()) {
|
|
// option->features |= QStyleOptionViewItem::HasDecoration;
|
|
// switch (value.type()) {
|
|
// case QVariant::Icon: {
|
|
// option->icon = qvariant_cast<QIcon>(value);
|
|
// QIcon::Mode mode;
|
|
// if (!(option->state & QStyle::State_Enabled))
|
|
// mode = QIcon::Disabled;
|
|
// else if (option->state & QStyle::State_Selected)
|
|
// mode = QIcon::Selected;
|
|
// else
|
|
// mode = QIcon::Normal;
|
|
// QIcon::State state = option->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
|
|
// QSize actualSize = option->icon.actualSize(option->decorationSize, mode, state);
|
|
// // For highdpi icons actualSize might be larger than decorationSize, which we don't want. Clamp it to decorationSize.
|
|
// option->decorationSize = QSize(qMin(option->decorationSize.width(), actualSize.width()),
|
|
// qMin(option->decorationSize.height(), actualSize.height()));
|
|
// break;
|
|
// }
|
|
// case QVariant::Color: {
|
|
// QPixmap pixmap(option->decorationSize);
|
|
// pixmap.fill(qvariant_cast<QColor>(value));
|
|
// option->icon = QIcon(pixmap);
|
|
// break;
|
|
// }
|
|
// case QVariant::Image: {
|
|
// QImage image = qvariant_cast<QImage>(value);
|
|
// option->icon = QIcon(QPixmap::fromImage(image));
|
|
// option->decorationSize = image.size() / image.devicePixelRatio();
|
|
// break;
|
|
// }
|
|
// case QVariant::Pixmap: {
|
|
// QPixmap pixmap = qvariant_cast<QPixmap>(value);
|
|
// option->icon = QIcon(pixmap);
|
|
// option->decorationSize = pixmap.size() / pixmap.devicePixelRatio();
|
|
// break;
|
|
// }
|
|
// default:
|
|
// break;
|
|
// }
|
|
// }
|
|
|
|
Oid oid = InvalidOid;
|
|
value = index.data(CustomDataTypeRole); // get OID
|
|
if (value.isValid())
|
|
oid = value.toUInt(); //getType(index.column());
|
|
|
|
value = index.data(Qt::DisplayRole);
|
|
|
|
option->displayAlignment = GetDefaultAlignmentForType(oid);
|
|
|
|
|
|
if (value.isValid() && ! value.isNull()) {
|
|
QColor forground_color = oid == Pgsql::bool_oid
|
|
? GetDefaultBoolColor(value.toBool())
|
|
: GetDefaultColorForType(oid);
|
|
option->palette.setBrush(QPalette::Text, QBrush(forground_color));
|
|
|
|
option->features |= QStyleOptionViewItem::HasDisplay;
|
|
option->text = oid == Pgsql::bool_oid
|
|
? FormatBoolForDisplay(value.toBool())
|
|
: displayText(value, option->locale);
|
|
}
|
|
else {
|
|
option->palette.setBrush(QPalette::Text, QBrush(GetDefaultNullColor()));
|
|
|
|
option->features |= QStyleOptionViewItem::HasDisplay;
|
|
option->text = "null";
|
|
}
|
|
|
|
|
|
// option->backgroundBrush = qvariant_cast<QBrush>(index.data(Qt::BackgroundRole));
|
|
|
|
// disable style animations for checkboxes etc. within itemviews (QTBUG-30146)
|
|
option->styleObject = nullptr;
|
|
}
|
|
|
|
void PgLabItemDelegate::paint(QPainter *painter,
|
|
const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
{
|
|
Q_ASSERT(index.isValid());
|
|
|
|
QStyleOptionViewItem opt = option;
|
|
initStyleOption(&opt, index);
|
|
|
|
const QWidget *widget = option.widget; // QStyledItemDelegatePrivate::widget(option);
|
|
QStyle *style = widget ? widget->style() : QApplication::style();
|
|
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
|
|
}
|
|
|
|
QWidget *PgLabItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
{
|
|
if (m_editorFactory)
|
|
return m_editorFactory->createEditor(parent, option, index);
|
|
return QStyledItemDelegate::createEditor(parent, option, index);
|
|
}
|
|
|
|
void PgLabItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
|
|
{
|
|
if (m_editorFactory)
|
|
m_editorFactory->setEditorData(editor, index);
|
|
else
|
|
QStyledItemDelegate::setEditorData(editor, index);
|
|
}
|
|
|
|
void PgLabItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
|
{
|
|
if (m_editorFactory)
|
|
m_editorFactory->setModelData(editor, model, index);
|
|
else
|
|
QStyledItemDelegate::setModelData(editor, model, index);
|
|
}
|
|
|
|
AbstractEditorFactory* PgLabItemDelegate::editorFactory()
|
|
{
|
|
return m_editorFactory;
|
|
}
|
|
|
|
void PgLabItemDelegate::setEditorFactory(AbstractEditorFactory *editor_factory)
|
|
{
|
|
m_editorFactory = editor_factory;
|
|
}
|