diff --git a/pglab/PgLabItemDelegate.cpp b/pglab/PgLabItemDelegate.cpp new file mode 100644 index 0000000..0806003 --- /dev/null +++ b/pglab/PgLabItemDelegate.cpp @@ -0,0 +1,129 @@ +#include "PgLabItemDelegate.h" +#include + +#include "Pgsql_oids.h" +#include "ResultTableModelUtil.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(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()) +// option->palette.setBrush(QPalette::Text, qvariant_cast(value)); + + + option->index = index; +// value = index.data(Qt::CheckStateRole); +// if (value.isValid() && !value.isNull()) { +// option->features |= QStyleOptionViewItem::HasCheckIndicator; +// option->checkState = static_cast(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(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(value)); +// option->icon = QIcon(pixmap); +// break; +// } +// case QVariant::Image: { +// QImage image = qvariant_cast(value); +// option->icon = QIcon(QPixmap::fromImage(image)); +// option->decorationSize = image.size() / image.devicePixelRatio(); +// break; +// } +// case QVariant::Pixmap: { +// QPixmap pixmap = qvariant_cast(value); +// option->icon = QIcon(pixmap); +// option->decorationSize = pixmap.size() / pixmap.devicePixelRatio(); +// break; +// } +// default: +// break; +// } +// } + + Oid oid = InvalidOid; + value = index.data(Qt::UserRole); // get OID + if (value.isValid()) + oid = value.toInt(); //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(index.data(Qt::BackgroundRole)); + + // disable style animations for checkboxes etc. within itemviews (QTBUG-30146) + option->styleObject = 0; +} + +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); +} diff --git a/pglab/PgLabItemDelegate.h b/pglab/PgLabItemDelegate.h new file mode 100644 index 0000000..a1322cc --- /dev/null +++ b/pglab/PgLabItemDelegate.h @@ -0,0 +1,18 @@ +#ifndef PGLABITEMDELEGATE_H +#define PGLABITEMDELEGATE_H + +#include + +class PgLabItemDelegate : public QStyledItemDelegate +{ +public: + PgLabItemDelegate(QObject *parent = nullptr); + + virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +protected: + virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override; + +}; + +#endif // PGLABITEMDELEGATE_H