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"