#include "PgLabItemDelegate.h" #include #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(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(CustomDataTypeRole); // get OID if (value.isValid()) oid = value.toUInt(); //getType(index.column()); value = index.data(CustomDataMeaningRole); DataMeaning meaning = value.isValid() ? static_cast(value.toInt()) : DataMeaningNormal; 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->features |= QStyleOptionViewItem::HasDisplay; if (oid == Pgsql::bool_oid) option->text = FormatBoolForDisplay(value.toBool()); else { if (meaning == DataMeaningBytes) { QString suffix; auto s = value.toLongLong(); double val; if (s > 1024 * 1024 * 1000) { val = s / (1024 * 1024 * 1024); suffix = "GiB"; forground_color = QColorConstants::Svg::darkorange; option->font.setBold(true); } else if (s > 1024 * 1000) { val = s / (1024 * 1024); suffix = "MiB"; forground_color = QColorConstants::Svg::darkgoldenrod; } else if (s > 1000) { val = s / 1024; suffix = "KiB"; forground_color = QColorConstants::Svg::darkgreen; } else { val = s; suffix = "B"; forground_color = QColorConstants::Svg::darkblue; } option->text = QString{ "%1 %2" }.arg(val, 3, 'g', -1 ).arg(suffix) ; } else { auto str = value.toString(); auto s = str.left(100); // auto f = s.indexOf('\n'); // option->text = ((f > 0) ? s.left(f) : s).toString(); option->text = s; } option->palette.setBrush(QPalette::Text, QBrush(forground_color)); } } 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 = 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; }