File indexing completed on 2024-05-12 04:51:53
0001 /* 0002 SPDX-FileCopyrightText: 2009-2010 Michal Malek <michalm@jabster.pl> 0003 SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "k3bvideodvdtitledelegate.h" 0009 #include "k3bvideodvdtitlemodel.h" 0010 0011 #include <QIcon> 0012 #include <QPainter> 0013 #include <QPixmap> 0014 #include <QApplication> 0015 #include <QStyle> 0016 #include <QStyleOptionButton> 0017 #include <QStyleOptionViewItem> 0018 0019 namespace K3b { 0020 0021 namespace { 0022 const int indicatorSpacing = 4; 0023 const int margin = 2; 0024 } // namespace 0025 0026 VideoDVDTitleDelegate::VideoDVDTitleDelegate( QObject* parent ) 0027 : QStyledItemDelegate( parent ) 0028 { 0029 } 0030 0031 0032 VideoDVDTitleDelegate::~VideoDVDTitleDelegate() 0033 { 0034 } 0035 0036 0037 void VideoDVDTitleDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index ) const 0038 { 0039 painter->save(); 0040 0041 QStyle& style = *QApplication::style(); 0042 QStyleOptionViewItem option = opt; 0043 initStyleOption( &option, index ); 0044 style.drawControl( QStyle::CE_ItemViewItem, &option, painter ); 0045 0046 QPalette::ColorRole textRole = (option.state & QStyle::State_Selected) ? 0047 QPalette::HighlightedText : QPalette::WindowText; 0048 0049 if( index.column() == VideoDVDTitleModel::TitleColumn ) { 0050 QFont bold = option.font; 0051 bold.setBold( true ); 0052 QFontMetrics boldMetrics( bold ); 0053 0054 QStyleOptionButton checkOption; 0055 checkOption.direction = option.direction; 0056 checkOption.fontMetrics = option.fontMetrics; 0057 int checkWidth = style.pixelMetric( QStyle::PM_IndicatorWidth, &checkOption ) + 2*indicatorSpacing; 0058 QRect titleRect( option.rect.left()+checkWidth, option.rect.top()+margin, 0059 option.rect.width()-checkWidth-margin, option.rect.height()-2*margin ); 0060 QRect chaptersRect( option.rect.left()+checkWidth, option.rect.top()+boldMetrics.height()+margin, 0061 option.rect.width()-checkWidth-margin, option.rect.height()-2*margin ); 0062 0063 0064 painter->setFont( bold ); 0065 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, titleRect ), 0066 Qt::AlignTop | Qt::AlignLeft, option.palette, 0067 option.state & QStyle::State_Enabled, 0068 boldMetrics.elidedText( index.data().toString(), 0069 option.textElideMode, titleRect.width() ), 0070 textRole ); 0071 0072 painter->setFont( option.font ); 0073 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, chaptersRect ), 0074 Qt::AlignTop | Qt::AlignLeft, option.palette, 0075 option.state & QStyle::State_Enabled, 0076 option.fontMetrics.elidedText( index.data(VideoDVDTitleModel::ChaptersRole).toString(), 0077 option.textElideMode, chaptersRect.width() ), 0078 textRole ); 0079 } 0080 else if( index.column() == VideoDVDTitleModel::PreviewColumn ) { 0081 QVariant data = index.data( VideoDVDTitleModel::PreviewRole ); 0082 QPixmap preview; 0083 if( !data.isNull() ) 0084 { 0085 preview = data.value<QPixmap>().scaled( option.rect.width()-margin, 0086 option.rect.height()-margin, Qt::KeepAspectRatio ); 0087 } 0088 else 0089 { 0090 preview = QIcon::fromTheme( "image-missing" ).pixmap( qMin( option.rect.width()-margin, 0091 option.rect.height()-margin ) ); 0092 } 0093 style.drawItemPixmap( painter, option.rect, Qt::AlignCenter, preview ); 0094 } 0095 else if( index.column() == VideoDVDTitleModel::VideoColumn ) { 0096 QRect videoRect( option.rect.left()+margin, option.rect.top()+margin, 0097 option.rect.width()-2*margin, option.rect.height()-2*margin ); 0098 QRect ratiosRect( option.rect.left()+margin, option.rect.top()+option.fontMetrics.height()+margin, 0099 option.rect.width()-2*margin, option.rect.height()-2*margin ); 0100 0101 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, videoRect ), 0102 Qt::AlignTop | Qt::AlignLeft, option.palette, 0103 option.state & QStyle::State_Enabled, 0104 option.fontMetrics.elidedText( index.data().toString(), 0105 option.textElideMode, option.rect.width() ), 0106 textRole ); 0107 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, ratiosRect ), 0108 Qt::AlignTop | Qt::AlignLeft, option.palette, 0109 option.state & QStyle::State_Enabled, 0110 option.fontMetrics.elidedText( index.data(VideoDVDTitleModel::AspectRatioRole).toString(), 0111 option.textElideMode, ratiosRect.width() ), 0112 textRole ); 0113 } 0114 else if( index.column() == VideoDVDTitleModel::AudioColumn ) { 0115 QRect rect( option.rect.left()+margin, option.rect.top()+margin, 0116 option.rect.width()-2*margin, option.rect.height()-2*margin ); 0117 int lineHeight = option.fontMetrics.height(); 0118 Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::AudioStreamsRole ).toStringList() ) 0119 { 0120 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, rect ), 0121 Qt::AlignTop | Qt::AlignLeft, option.palette, 0122 option.state & QStyle::State_Enabled, 0123 option.fontMetrics.elidedText( line, option.textElideMode, option.rect.width() ), 0124 textRole ); 0125 rect.setTop( rect.top() + lineHeight ); 0126 } 0127 } 0128 else if( index.column() == VideoDVDTitleModel::SubpictureColumn ) { 0129 QRect rect( option.rect.left()+margin, option.rect.top()+margin, 0130 option.rect.width()-2*margin, option.rect.height()-2*margin ); 0131 int lineHeight = option.fontMetrics.height(); 0132 Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::SubpictureStreamsRole ).toStringList() ) 0133 { 0134 style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, rect ), 0135 Qt::AlignTop | Qt::AlignLeft, option.palette, 0136 option.state & QStyle::State_Enabled, 0137 option.fontMetrics.elidedText( line, option.textElideMode, option.rect.width() ), 0138 textRole ); 0139 rect.setTop( rect.top() + lineHeight ); 0140 } 0141 } 0142 0143 painter->restore(); 0144 } 0145 0146 0147 QSize VideoDVDTitleDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const 0148 { 0149 QStyle& style = *QApplication::style(); 0150 if( index.column() == VideoDVDTitleModel::TitleColumn ) { 0151 QStyleOptionButton checkOption; 0152 checkOption.direction = option.direction; 0153 checkOption.fontMetrics = option.fontMetrics; 0154 int checkWidth = style.pixelMetric( QStyle::PM_IndicatorWidth, &checkOption ) + 2*indicatorSpacing; 0155 QFont bold = option.font; 0156 bold.setBold( true ); 0157 QFontMetrics boldMetrics( bold ); 0158 QSize titleSize = boldMetrics.size( 0, index.data().toString() ); 0159 QSize chaptersSize = option.fontMetrics.size( 0, index.data( VideoDVDTitleModel::ChaptersRole ).toString() ); 0160 return QSize( qMax( titleSize.width(), chaptersSize.width() ) + checkWidth + margin + option.fontMetrics.averageCharWidth(), 0161 titleSize.height() + titleSize.height() + 2*margin ); 0162 } 0163 else if( index.column() == VideoDVDTitleModel::VideoColumn ) { 0164 QSize videoSize = option.fontMetrics.size( 0, index.data().toString() ); 0165 QSize ratioSize = option.fontMetrics.size( 0, index.data( VideoDVDTitleModel::AspectRatioRole ).toString() ); 0166 return QSize( qMax( videoSize.width(), ratioSize.width() ) + 2*margin + option.fontMetrics.averageCharWidth(), 0167 videoSize.height() + videoSize.height() + 2*margin ); 0168 } 0169 else if( index.column() == VideoDVDTitleModel::AudioColumn ) { 0170 QSize overallSize; 0171 Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::AudioStreamsRole ).toStringList() ) 0172 { 0173 QSize lineSize = option.fontMetrics.size( 0, line ); 0174 overallSize.setWidth( qMax( overallSize.width(), lineSize.width() ) ); 0175 overallSize.setHeight( overallSize.height() + lineSize.height() ); 0176 } 0177 return overallSize + QSize( 2*margin + option.fontMetrics.averageCharWidth(), 2*margin ); 0178 } 0179 else if( index.column() == VideoDVDTitleModel::SubpictureColumn ) { 0180 QSize overallSize; 0181 Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::SubpictureStreamsRole ).toStringList() ) 0182 { 0183 QSize lineSize = option.fontMetrics.size( 0, line ); 0184 overallSize.setWidth( qMax( overallSize.width(), lineSize.width() ) ); 0185 overallSize.setHeight( overallSize.height() + lineSize.height() ); 0186 } 0187 return overallSize + QSize( 2*margin + option.fontMetrics.averageCharWidth(), 2*margin ); 0188 } 0189 else { 0190 return QSize(); 0191 } 0192 } 0193 0194 0195 void VideoDVDTitleDelegate::initStyleOption( QStyleOptionViewItem* option, const QModelIndex& index ) const 0196 { 0197 if( index.isValid() && index.column() == VideoDVDTitleModel::TitleColumn ) 0198 { 0199 option->index = index; 0200 QVariant value = index.data( Qt::CheckStateRole ); 0201 if( value.isValid() && !value.isNull() ) { 0202 option->features |= QStyleOptionViewItem::HasCheckIndicator; 0203 option->checkState = static_cast<Qt::CheckState>( value.toInt() ); 0204 } 0205 } 0206 } 0207 0208 } // namespace K3b 0209 0210 #include "moc_k3bvideodvdtitledelegate.cpp"