vlc | branch: master | Francois Cartegnie <[email protected]> | Fri Jan 17 21:07:02 2014 +0100| [5f78dc28f844fa043b8c63b48bc50dd882f5f13d] | committer: Francois Cartegnie
Qt: ExtensionItemDelegate: rewrite (fix #10407) does it the right way > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5f78dc28f844fa043b8c63b48bc50dd882f5f13d --- modules/gui/qt4/dialogs/plugins.cpp | 94 ++++++++++++++++------------------- modules/gui/qt4/dialogs/plugins.hpp | 3 ++ 2 files changed, 47 insertions(+), 50 deletions(-) diff --git a/modules/gui/qt4/dialogs/plugins.cpp b/modules/gui/qt4/dialogs/plugins.cpp index b29497e..eaed825 100644 --- a/modules/gui/qt4/dialogs/plugins.cpp +++ b/modules/gui/qt4/dialogs/plugins.cpp @@ -430,6 +430,7 @@ ExtensionItemDelegate::ExtensionItemDelegate( intf_thread_t *p_intf, QListView *view ) : QStyledItemDelegate( view ), view( view ), p_intf( p_intf ) { + margins = QMargins( 4, 4, 4, 4 ); } ExtensionItemDelegate::~ExtensionItemDelegate() @@ -440,80 +441,73 @@ void ExtensionItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const { - int width = option.rect.width(); - - // Pixmap: buffer where to draw - QPixmap pix(option.rect.size()); + QStyleOptionViewItemV4 opt = option; + initStyleOption( &opt, index ); // Draw background - pix.fill( Qt::transparent ); // FIXME - - // ItemView primitive style - QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, - &option, - painter ); - - // Painter on the pixmap - QPainter *pixpaint = new QPainter(&pix); - - // Text font & pen - QFont font = painter->font(); - QPen pen = painter->pen(); - if( view->selectionModel()->selectedIndexes().contains( index ) ) - { - pen.setBrush( option.palette.highlightedText() ); - } - else - { - pen.setBrush( option.palette.text() ); - } - pixpaint->setPen( pen ); - QFontMetrics metrics = option.fontMetrics; + if ( opt.state & QStyle::State_Selected ) + painter->fillRect( opt.rect, opt.palette.highlight() ); // Icon QPixmap icon = index.data( Qt::DecorationRole ).value<QPixmap>(); if( !icon.isNull() ) { - pixpaint->drawPixmap( 7, 7, 2*metrics.height(), 2*metrics.height(), - icon ); + painter->drawPixmap( opt.rect.left() + margins.left(), + opt.rect.top() + margins.top(), + icon.scaled( opt.decorationSize, + Qt::KeepAspectRatio, + Qt::SmoothTransformation ) + ); } - // Title: bold - pixpaint->setRenderHint( QPainter::TextAntialiasing ); + painter->save(); + painter->setRenderHint( QPainter::TextAntialiasing ); + + if ( opt.state & QStyle::State_Selected ) + painter->setPen( opt.palette.highlightedText().color() ); + + QFont font( option.font ); font.setBold( true ); - pixpaint->setFont( font ); - pixpaint->drawText( QRect( 17 + 2 * metrics.height(), 7, - width - 40 - 2 * metrics.height(), - metrics.height() ), - Qt::AlignLeft, index.data( Qt::DisplayRole ).toString() ); + painter->setFont( font ); + QRect textrect( opt.rect ); + textrect.adjust( 2 * margins.left() + margins.right() + opt.decorationSize.width(), + margins.top(), + - margins.right(), + - margins.bottom() - opt.fontMetrics.height() ); - // Short description: normal - font.setBold( false ); - pixpaint->setFont( font ); - pixpaint->drawText( QRect( 17 + 2 * metrics.height(), - 7 + metrics.height(), width - 40, - metrics.height() ), - Qt::AlignLeft, index.data( ExtensionListModel::DescriptionRole ).toString() ); + painter->drawText( textrect, Qt::AlignLeft, + index.data( Qt::DisplayRole ).toString() ); - // Flush paint operations - delete pixpaint; + font.setBold( false ); + painter->setFont( font ); + painter->drawText( textrect.translated( 0, option.fontMetrics.height() ), + Qt::AlignLeft, + index.data( ExtensionListModel::DescriptionRole ).toString() ); - // Draw it on the screen! - painter->drawPixmap( option.rect, pix ); + painter->restore(); } QSize ExtensionItemDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const { - if (index.isValid() && index.column() == 0) + if ( index.isValid() ) { - QFontMetrics metrics = option.fontMetrics; - return QSize( 200, 14 + 2 * metrics.height() ); + return QSize( 200, 2 * option.fontMetrics.height() + + margins.top() + margins.bottom() ); } else return QSize(); } +void ExtensionItemDelegate::initStyleOption( QStyleOptionViewItem *option, + const QModelIndex &index ) const +{ + QStyledItemDelegate::initStyleOption( option, index ); + option->decorationSize = QSize( option->rect.height(), option->rect.height() ); + option->decorationSize -= QSize( margins.left() + margins.right(), + margins.top() + margins.bottom() ); +} + /* "More information" dialog */ ExtensionInfoDialog::ExtensionInfoDialog( const QModelIndex &index, diff --git a/modules/gui/qt4/dialogs/plugins.hpp b/modules/gui/qt4/dialogs/plugins.hpp index 5b26800..e06c9ed 100644 --- a/modules/gui/qt4/dialogs/plugins.hpp +++ b/modules/gui/qt4/dialogs/plugins.hpp @@ -183,8 +183,11 @@ public: const QModelIndex &index ) const; virtual QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const; + virtual void initStyleOption( QStyleOptionViewItem *option, + const QModelIndex &index ) const; private: + QMargins margins; QListView *view; intf_thread_t *p_intf; }; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
