File indexing completed on 2024-05-05 04:38:03

0001 /*
0002     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0003     SPDX-FileCopyrightText: 2012 Morten Danielsen Volden <mvolden2@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "outputdelegate.h"
0009 
0010 #include "outputmodel.h"
0011 #include "filtereditem.h"
0012 
0013 #include <KColorScheme>
0014 
0015 #include <QPainter>
0016 
0017 
0018 namespace KDevelop
0019 {
0020 
0021 class OutputDelegatePrivate
0022 {
0023 public:
0024     OutputDelegatePrivate();
0025     QStyleOptionViewItem modifyStyleOptions(const QStyleOptionViewItem& option, const QModelIndex& index) const;
0026 
0027     KStatefulBrush errorBrush;
0028     KStatefulBrush warningBrush;
0029     KStatefulBrush informationBrush;
0030     KStatefulBrush builtBrush;
0031 };
0032 
0033 
0034 OutputDelegatePrivate::OutputDelegatePrivate()
0035 : errorBrush( KColorScheme::View, KColorScheme::NegativeText )
0036 , warningBrush( KColorScheme::View, KColorScheme::NeutralText )
0037     //TODO: Maybe ActiveText would be better? Not quite sure...
0038 , informationBrush( KColorScheme::View, KColorScheme::LinkText )
0039 , builtBrush( KColorScheme::View, KColorScheme::PositiveText )
0040 {
0041 }
0042 
0043 QStyleOptionViewItem OutputDelegatePrivate::modifyStyleOptions(const QStyleOptionViewItem& option,
0044                                                                const QModelIndex& index) const
0045 {
0046     QStyleOptionViewItem opt = option;
0047     QVariant status = index.data(OutputModel::OutputItemTypeRole);
0048     if( status.isValid() ) {
0049         auto type = static_cast<FilteredItem::FilteredOutputItemType>(status.toInt());
0050         switch(type) {
0051             case FilteredItem::ErrorItem:
0052                 opt.palette.setBrush(QPalette::Text, errorBrush.brush(option.palette));
0053                 opt.font.setBold( true );
0054                 break;
0055             case FilteredItem::WarningItem:
0056                 opt.palette.setBrush(QPalette::Text, warningBrush.brush(option.palette));
0057                 break;
0058             case FilteredItem::InformationItem:
0059                 opt.palette.setBrush(QPalette::Text, informationBrush.brush(option.palette));
0060                 break;
0061             case FilteredItem::ActionItem:
0062                 opt.palette.setBrush(QPalette::Text, builtBrush.brush(option.palette));
0063                 opt.font.setBold( true );
0064                 break;
0065             default:
0066                 break;
0067         }
0068     }
0069     return opt;
0070 }
0071 
0072 OutputDelegate::OutputDelegate(QObject* parent)
0073     : QItemDelegate(parent)
0074     , d_ptr(new OutputDelegatePrivate)
0075 {
0076 }
0077 
0078 OutputDelegate::~OutputDelegate() = default;
0079 
0080 void OutputDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
0081 {
0082     Q_D(const OutputDelegate);
0083 
0084     const QStyleOptionViewItem& opt = d->modifyStyleOptions(option, index);
0085 
0086     QItemDelegate::paint(painter, opt, index);
0087 }
0088 
0089 QSize OutputDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
0090 {
0091     Q_D(const OutputDelegate);
0092 
0093     if (!option.features.testFlag(QStyleOptionViewItem::WrapText)) {
0094         return QItemDelegate::sizeHint(option, index);
0095     }
0096 
0097     // Pass item view's contents rect (adjusted) to QItemDelegate::sizeHint() when word wrapping is enabled.
0098     // QItemDelegate::sizeHint() honors the width of opt.rect but overwrites its height to fit the item's text.
0099     // When opt.rect is not replaced, enabling word wrapping has no effect: each item remains single-line.
0100 
0101     QStyleOptionViewItem opt = d->modifyStyleOptions(option, index);
0102     QRect contentsRect = opt.widget->contentsRect();
0103     // Narrow the rect by the width of a vertical scroll bar to prevent even minuscule horizontal scrolling.
0104     contentsRect.setWidth(contentsRect.width() - opt.widget->style()->pixelMetric(QStyle::PM_ScrollBarExtent));
0105     opt.rect = contentsRect;
0106 
0107     return QItemDelegate::sizeHint(opt, index);
0108 }
0109 }
0110 
0111 #include "moc_outputdelegate.cpp"