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"