diff --git a/src/k3bdevicedelegate.cpp b/src/k3bdevicedelegate.cpp index 33db7006a..34b378802 100644 --- a/src/k3bdevicedelegate.cpp +++ b/src/k3bdevicedelegate.cpp @@ -1,183 +1,183 @@ /* * * Copyright (C) 2008 Sebastian Trueg * Copyright (C) 2009-2010 Michal Malek * * This file is part of the K3b project. * Copyright (C) 1998-2008 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3bdevicedelegate.h" #include "k3bdevicemodel.h" #include #include #include #include #include // FIXME: Get the whole animated hovering code from KFileItemDelegate and put it into a generic class which we can then reuse here // To keep KFileItemDelegate BC it could simply forward calls to a subclass of the new generic delegate. // A lot of code is from KFileItemDelegate. Sadly this is all hidden in the private stuff namespace { QPixmap decoration( const QStyleOptionViewItem& option, const QModelIndex& index, const QSize& size ) { QIcon icon = qvariant_cast( index.data( Qt::DecorationRole ) ); QPixmap pixmap = icon.pixmap( size ); if (!pixmap.isNull()) { // If the item is selected, and the selection rectangle only covers the // text label, blend the pixmap with the highlight color. if (!option.showDecorationSelected && option.state & QStyle::State_Selected) { QPainter p(&pixmap); QColor color = option.palette.color(QPalette::Highlight); color.setAlphaF(0.5); p.setCompositionMode(QPainter::CompositionMode_SourceAtop); p.fillRect(pixmap.rect(), color); } if ( option.state & QStyle::State_MouseOver ) { KIconEffect *effect = KIconLoader::global()->iconEffect(); // Note that in KIconLoader terminology, active = hover. // ### We're assuming that the icon group is desktop/filemanager, since this // is KFileItemDelegate. if (effect->hasEffect(KIconLoader::Desktop, KIconLoader::ActiveState)) return effect->apply(pixmap, KIconLoader::Desktop, KIconLoader::ActiveState); } } return pixmap; } QFont cloneFont( const QFont& font, int pointSize, bool bold, bool italic ) { QFont cloned( font ); cloned.setPointSize( pointSize ); cloned.setBold( bold ); cloned.setItalic( italic ); return cloned; } struct FontsAndMetrics { FontsAndMetrics( const QFont& font ); QFont mediumFont; QFont deviceFont; QFontMetrics fontM; QFontMetrics mediumFontM; QFontMetrics deviceFontM; int margin; int spacing; }; FontsAndMetrics::FontsAndMetrics( const QFont& font ) : mediumFont( cloneFont( font, font.pointSize()+2, true, false ) ), deviceFont( cloneFont( font, font.pointSize()-2, false, true ) ), fontM( font ), mediumFontM( mediumFont ), deviceFontM( deviceFont ), margin( fontM.descent() ), spacing( 0 ) { } } // namespace K3b::DeviceDelegate::DeviceDelegate( QObject* parent ) : KFileItemDelegate( parent ) { } K3b::DeviceDelegate::~DeviceDelegate() { } QSize K3b::DeviceDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { if ( index.data( K3b::DeviceModel::IsDevice ).toBool() ) { const FontsAndMetrics fam( option.font ); // It seems that width-part of size hint is not used anwyay so // we're ommiting here a computation of text's width return QSize( 0, fam.margin + fam.mediumFontM.height() + fam.spacing + fam.deviceFontM.height() + fam.margin ); } else { return KFileItemDelegate::sizeHint( option, index ); } } void K3b::DeviceDelegate::paint( QPainter* painter, const QStyleOptionViewItem& optionOrig, const QModelIndex& index ) const { if ( index.data( K3b::DeviceModel::IsDevice ).toBool() ) { painter->save(); painter->setRenderHint(QPainter::Antialiasing); // HACK: we erase the branch - QStyleOptionViewItemV4 option( optionOrig ); + QStyleOptionViewItem option( optionOrig ); option.rect.setLeft( 0 ); painter->fillRect( option.rect, option.palette.base() ); QStyle* style = QApplication::style(); const FontsAndMetrics fam( option.font ); const QPalette::ColorRole textRole = (option.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text; const QRect itemRect( option.rect.left() + fam.margin, option.rect.top() + fam.margin, option.rect.width() - 2*fam.margin, option.rect.height() - 2*fam.margin ); const QSize iconSize( itemRect.height(), itemRect.height() ); const QSize mediumSize( itemRect.width() - iconSize.width() - fam.margin, itemRect.height() - fam.spacing - fam.deviceFontM.height() ); const QSize devicemSize( itemRect.width() - iconSize.width() - fam.margin, itemRect.height() - fam.spacing - fam.mediumFontM.height() ); const QRect iconRect = style->alignedRect( option.direction, Qt::AlignLeft | Qt::AlignVCenter, iconSize, itemRect ); const QRect mediumRect = style->alignedRect( option.direction, Qt::AlignRight | Qt::AlignTop, mediumSize, itemRect ); const QRect deviceRect = style->alignedRect( option.direction, Qt::AlignRight | Qt::AlignBottom, devicemSize, itemRect ); // draw background style->drawPrimitive( QStyle::PE_PanelItemViewItem, &option, painter ); // draw decoration QPixmap pixmap = decoration( option, index, iconSize ); painter->drawPixmap( iconRect, pixmap ); // draw medium text painter->setFont( fam.mediumFont ); QString text = index.data( Qt::DisplayRole ).toString(); style->drawItemText( painter, mediumRect, option.displayAlignment, option.palette, option.state & QStyle::State_Enabled, fam.mediumFontM.elidedText( text, option.textElideMode, mediumRect.width() ), textRole ); // draw fixed device text painter->setFont( fam.deviceFont ); text = index.data( K3b::DeviceModel::Vendor ).toString() + " - " + index.data( K3b::DeviceModel::Description ).toString(); style->drawItemText( painter, deviceRect, option.displayAlignment, option.palette, option.state & QStyle::State_Enabled, fam.deviceFontM.elidedText( text, option.textElideMode, deviceRect.width() ), textRole ); painter->restore(); } else { KFileItemDelegate::paint( painter, optionOrig, index ); } } diff --git a/src/projects/k3baudioprojectdelegate.cpp b/src/projects/k3baudioprojectdelegate.cpp index 61942f398..8f3cb5342 100644 --- a/src/projects/k3baudioprojectdelegate.cpp +++ b/src/projects/k3baudioprojectdelegate.cpp @@ -1,104 +1,103 @@ /* * * Copyright (C) 2010 Michal Malek * * This file is part of the K3b project. * Copyright (C) 1998-2010 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3baudioprojectdelegate.h" #include "k3baudioprojectmodel.h" #include #include #include namespace K3b { AudioProjectDelegate::AudioProjectDelegate( QAbstractItemView& view, QObject* parent ) : QStyledItemDelegate( parent ), m_view( view ) { } AudioProjectDelegate::~AudioProjectDelegate() { } QWidget* AudioProjectDelegate::createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const { m_current = index; QWidget* widget = QStyledItemDelegate::createEditor( parent, option, index ); widget->installEventFilter( const_cast( this ) ); return widget; } void AudioProjectDelegate::setPlayingTrack( const QModelIndex& index ) { if( m_playingTrack.isValid() ) { m_view.viewport()->update( m_view.visualRect( m_playingTrack ) ); } if( index.isValid() ) { m_playingTrack = index.model()->index( index.row(), AudioProjectModel::TitleColumn ); m_view.viewport()->update( m_view.visualRect( m_playingTrack ) ); } else { m_playingTrack = QPersistentModelIndex(); } } void AudioProjectDelegate::initStyleOption( QStyleOptionViewItem* option, const QModelIndex& index ) const { QStyledItemDelegate::initStyleOption( option, index ); - if( option->version == 4 && index.isValid() && index == m_playingTrack ) { - QStyleOptionViewItemV4* optionV4 = static_cast( option ); - optionV4->icon = QIcon::fromTheme( "media-playback-start" ); - optionV4->features |= QStyleOptionViewItemV2::HasDecoration; + if( index.isValid() && index == m_playingTrack ) { + option->icon = QIcon::fromTheme( "media-playback-start" ); + option->features |= QStyleOptionViewItem::HasDecoration; } } bool AudioProjectDelegate::eventFilter( QObject* object, QEvent* event ) { if( event->type() == QEvent::KeyPress ) { QKeyEvent* keyEvent = dynamic_cast( event ); if( keyEvent->key() == Qt::Key_Return ) { QWidget* editor = dynamic_cast( object ); Q_EMIT commitData( editor ); if( m_current.row() < m_current.model()->rowCount( m_current.parent() ) - 1 ) Q_EMIT closeEditor( editor, EditNextItem ); else Q_EMIT closeEditor( editor, NoHint ); event->accept(); return true; } else if( keyEvent->key() == Qt::Key_Up ) { Q_EMIT closeEditor( dynamic_cast( object ), EditPreviousItem ); event->accept(); return true; } else if( keyEvent->key() == Qt::Key_Down ) { Q_EMIT closeEditor( dynamic_cast( object ), EditNextItem ); event->accept(); return true; } } return QStyledItemDelegate::eventFilter( object, event ); } } // namespace K3b diff --git a/src/rip/videodvd/k3bvideodvdtitledelegate.cpp b/src/rip/videodvd/k3bvideodvdtitledelegate.cpp index 0eb7e4cb1..7caabca29 100644 --- a/src/rip/videodvd/k3bvideodvdtitledelegate.cpp +++ b/src/rip/videodvd/k3bvideodvdtitledelegate.cpp @@ -1,219 +1,217 @@ /* * * Copyright (C) 2009-2010 Michal Malek * * This file is part of the K3b project. * Copyright (C) 1998-2008 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3bvideodvdtitledelegate.h" #include "k3bvideodvdtitlemodel.h" #include #include #include #include #include #include -#include +#include namespace K3b { namespace { const int indicatorSpacing = 4; const int margin = 2; } // namespace VideoDVDTitleDelegate::VideoDVDTitleDelegate( QObject* parent ) : QStyledItemDelegate( parent ) { } VideoDVDTitleDelegate::~VideoDVDTitleDelegate() { } void VideoDVDTitleDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index ) const { painter->save(); QStyle& style = *QApplication::style(); - QStyleOptionViewItemV4 option = opt; + QStyleOptionViewItem option = opt; initStyleOption( &option, index ); style.drawControl( QStyle::CE_ItemViewItem, &option, painter ); QPalette::ColorRole textRole = (option.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::WindowText; if( index.column() == VideoDVDTitleModel::TitleColumn ) { QFont bold = option.font; bold.setBold( true ); QFontMetrics boldMetrics( bold ); QStyleOptionButton checkOption; checkOption.direction = option.direction; checkOption.fontMetrics = option.fontMetrics; int checkWidth = style.pixelMetric( QStyle::PM_IndicatorWidth, &checkOption ) + 2*indicatorSpacing; QRect titleRect( option.rect.left()+checkWidth, option.rect.top()+margin, option.rect.width()-checkWidth-margin, option.rect.height()-2*margin ); QRect chaptersRect( option.rect.left()+checkWidth, option.rect.top()+boldMetrics.height()+margin, option.rect.width()-checkWidth-margin, option.rect.height()-2*margin ); painter->setFont( bold ); style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, titleRect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, boldMetrics.elidedText( index.data().toString(), option.textElideMode, titleRect.width() ), textRole ); painter->setFont( option.font ); style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, chaptersRect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, option.fontMetrics.elidedText( index.data(VideoDVDTitleModel::ChaptersRole).toString(), option.textElideMode, chaptersRect.width() ), textRole ); } else if( index.column() == VideoDVDTitleModel::PreviewColumn ) { QVariant data = index.data( VideoDVDTitleModel::PreviewRole ); QPixmap preview; if( !data.isNull() ) { preview = data.value().scaled( option.rect.width()-margin, option.rect.height()-margin, Qt::KeepAspectRatio ); } else { preview = QIcon::fromTheme( "image-missing" ).pixmap( qMin( option.rect.width()-margin, option.rect.height()-margin ) ); } style.drawItemPixmap( painter, option.rect, Qt::AlignCenter, preview ); } else if( index.column() == VideoDVDTitleModel::VideoColumn ) { QRect videoRect( option.rect.left()+margin, option.rect.top()+margin, option.rect.width()-2*margin, option.rect.height()-2*margin ); QRect ratiosRect( option.rect.left()+margin, option.rect.top()+option.fontMetrics.height()+margin, option.rect.width()-2*margin, option.rect.height()-2*margin ); style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, videoRect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, option.fontMetrics.elidedText( index.data().toString(), option.textElideMode, option.rect.width() ), textRole ); style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, ratiosRect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, option.fontMetrics.elidedText( index.data(VideoDVDTitleModel::AspectRatioRole).toString(), option.textElideMode, ratiosRect.width() ), textRole ); } else if( index.column() == VideoDVDTitleModel::AudioColumn ) { QRect rect( option.rect.left()+margin, option.rect.top()+margin, option.rect.width()-2*margin, option.rect.height()-2*margin ); int lineHeight = option.fontMetrics.height(); Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::AudioStreamsRole ).toStringList() ) { style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, rect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, option.fontMetrics.elidedText( line, option.textElideMode, option.rect.width() ), textRole ); rect.setTop( rect.top() + lineHeight ); } } else if( index.column() == VideoDVDTitleModel::SubpictureColumn ) { QRect rect( option.rect.left()+margin, option.rect.top()+margin, option.rect.width()-2*margin, option.rect.height()-2*margin ); int lineHeight = option.fontMetrics.height(); Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::SubpictureStreamsRole ).toStringList() ) { style.drawItemText( painter, QStyle::visualRect( option.direction, option.rect, rect ), Qt::AlignTop | Qt::AlignLeft, option.palette, option.state & QStyle::State_Enabled, option.fontMetrics.elidedText( line, option.textElideMode, option.rect.width() ), textRole ); rect.setTop( rect.top() + lineHeight ); } } painter->restore(); } QSize VideoDVDTitleDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { QStyle& style = *QApplication::style(); if( index.column() == VideoDVDTitleModel::TitleColumn ) { QStyleOptionButton checkOption; checkOption.direction = option.direction; checkOption.fontMetrics = option.fontMetrics; int checkWidth = style.pixelMetric( QStyle::PM_IndicatorWidth, &checkOption ) + 2*indicatorSpacing; QFont bold = option.font; bold.setBold( true ); QFontMetrics boldMetrics( bold ); QSize titleSize = boldMetrics.size( 0, index.data().toString() ); QSize chaptersSize = option.fontMetrics.size( 0, index.data( VideoDVDTitleModel::ChaptersRole ).toString() ); return QSize( qMax( titleSize.width(), chaptersSize.width() ) + checkWidth + margin + option.fontMetrics.averageCharWidth(), titleSize.height() + titleSize.height() + 2*margin ); } else if( index.column() == VideoDVDTitleModel::VideoColumn ) { QSize videoSize = option.fontMetrics.size( 0, index.data().toString() ); QSize ratioSize = option.fontMetrics.size( 0, index.data( VideoDVDTitleModel::AspectRatioRole ).toString() ); return QSize( qMax( videoSize.width(), ratioSize.width() ) + 2*margin + option.fontMetrics.averageCharWidth(), videoSize.height() + videoSize.height() + 2*margin ); } else if( index.column() == VideoDVDTitleModel::AudioColumn ) { QSize overallSize; Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::AudioStreamsRole ).toStringList() ) { QSize lineSize = option.fontMetrics.size( 0, line ); overallSize.setWidth( qMax( overallSize.width(), lineSize.width() ) ); overallSize.setHeight( overallSize.height() + lineSize.height() ); } return overallSize + QSize( 2*margin + option.fontMetrics.averageCharWidth(), 2*margin ); } else if( index.column() == VideoDVDTitleModel::SubpictureColumn ) { QSize overallSize; Q_FOREACH( const QString& line, index.data( VideoDVDTitleModel::SubpictureStreamsRole ).toStringList() ) { QSize lineSize = option.fontMetrics.size( 0, line ); overallSize.setWidth( qMax( overallSize.width(), lineSize.width() ) ); overallSize.setHeight( overallSize.height() + lineSize.height() ); } return overallSize + QSize( 2*margin + option.fontMetrics.averageCharWidth(), 2*margin ); } else { return QSize(); } } void VideoDVDTitleDelegate::initStyleOption( QStyleOptionViewItem* option, const QModelIndex& index ) const { if( index.isValid() && index.column() == VideoDVDTitleModel::TitleColumn ) { - if( QStyleOptionViewItemV4 *v4 = qstyleoption_cast(option) ) { - v4->index = index; - QVariant value = index.data( Qt::CheckStateRole ); - if( value.isValid() && !value.isNull() ) { - v4->features |= QStyleOptionViewItemV2::HasCheckIndicator; - v4->checkState = static_cast( value.toInt() ); - } + option->index = index; + QVariant value = index.data( Qt::CheckStateRole ); + if( value.isValid() && !value.isNull() ) { + option->features |= QStyleOptionViewItem::HasCheckIndicator; + option->checkState = static_cast( value.toInt() ); } } } } // namespace K3b