#include "logviewitemdelegate.h"
#include <DApplication>
#include <DGuiApplicationHelper>
#include <DPalette>
#include <DStyle>
#include <DStyleHelper>
#include <QDebug>
#include <QModelIndex>
#include <QPainter>
#include <QStyleOptionViewItem>
#include <QPainterPath>
DWIDGET_USE_NAMESPACE
#define ICON_WIDTH 24
#define ICON_HEIGHT 24
#define ROW_HEIGHT 38
#define ROW_HEIGHT_COMPACT 26
LogViewItemDelegate::LogViewItemDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
qDebug() << "LogViewItemDelegate initialized";
}
* @brief LogViewItemDelegate::paint 绘制内容数据和文字虚函数
* @param painter
* @param option
* @param index
*/
void LogViewItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (!index.isValid()) {
qDebug() << "Invalid index, using default paint";
QStyledItemDelegate::paint(painter, option, index);
return;
}
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
painter->setOpacity(1);
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
QWidget *wnd = DApplication::activeWindow();
DPalette::ColorGroup cg;
if (!(opt.state & DStyle::State_Enabled)) {
cg = DPalette::Disabled;
} else {
if (!wnd) {
cg = DPalette::Inactive;
} else {
cg = DPalette::Active;
}
}
DStyle *style = dynamic_cast<DStyle *>(DApplication::style());
int margin = style->pixelMetric(DStyle::PM_ContentsMargins, &option);
DGuiApplicationHelper *dAppHelper = DGuiApplicationHelper::instance();
DPalette palette = dAppHelper->applicationPalette();
QPen forground;
forground.setColor(palette.color(cg, DPalette::Text));
if (opt.state & DStyle::State_Enabled) {
if (opt.state & DStyle::State_Selected) {
forground.setColor(palette.color(cg, DPalette::HighlightedText));
}
}
painter->setPen(forground);
QRect rect = opt.rect;
QFontMetrics fm(opt.font);
QPainterPath path, clipPath;
QRect textRect = rect;
switch (opt.viewItemPosition) {
case QStyleOptionViewItem::Beginning: {
rect.setX(rect.x() + margin);
} break;
case QStyleOptionViewItem::Middle: {
} break;
case QStyleOptionViewItem::End: {
rect.setWidth(rect.width() - margin);
} break;
case QStyleOptionViewItem::OnlyOne: {
rect.setX(rect.x() + margin);
rect.setWidth(rect.width() - margin);
} break;
default: {
painter->restore();
QStyledItemDelegate::paint(painter, option, index);
return;
}
}
QRect iconRect = rect;
iconRect.setWidth(0);
if (opt.viewItemPosition == QStyleOptionViewItem::Beginning &&
index.data(Qt::DecorationRole).isValid()) {
iconRect.setX(rect.x() + margin);
iconRect.setY((rect.height() - ICON_HEIGHT) / 2 + rect.y());
iconRect.setWidth(ICON_WIDTH);
iconRect.setHeight(ICON_HEIGHT);
QIcon ic = index.data(Qt::DecorationRole).value<QIcon>();
ic.paint(painter, iconRect, Qt::AlignLeft | Qt::AlignVCenter);
}
textRect = rect;
textRect.setX(iconRect.right() + margin - 2);
QString text = fm.elidedText(opt.text, opt.textElideMode, textRect.width());
painter->drawText(textRect, Qt::TextSingleLine | static_cast<int>(opt.displayAlignment), text);
painter->restore();
}
QSize LogViewItemDelegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
qDebug() << "Calculating size hint for row:" << index.row();
QSize size = QStyledItemDelegate::sizeHint(option, index);
int nRowHeight = ROW_HEIGHT;
#ifdef DTKWIDGET_CLASS_DSizeMode
if (DGuiApplicationHelper::isCompactMode())
nRowHeight = ROW_HEIGHT_COMPACT;
else
nRowHeight = ROW_HEIGHT;
#else
nRowHeight = ROW_HEIGHT;
#endif
size.setHeight(nRowHeight);
return size;
}
* @brief LogViewItemDelegate::initStyleOption 初始化样式,文字省略模式,内容居中居左等等
* @param option
* @param index
*/
void LogViewItemDelegate::initStyleOption(QStyleOptionViewItem *option,
const QModelIndex &index) const
{
qDebug() << "Initializing style options for row:" << index.row();
option->showDecorationSelected = true;
bool ok = false;
if (index.data(Qt::TextAlignmentRole).isValid()) {
uint value = index.data(Qt::TextAlignmentRole).toUInt(&ok);
option->displayAlignment = static_cast<Qt::Alignment>(value);
}
if (!ok)
option->displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
option->textElideMode = Qt::ElideRight;
option->features = QStyleOptionViewItem::HasDisplay;
if (index.row() % 2 == 0)
option->features |= QStyleOptionViewItem::Alternate;
if (index.data(Qt::DisplayRole).isValid())
option->text = index.data().toString();
}