From 9c2e17a660396c886f43b3018f64f7555784f556 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Sun, 22 Apr 2012 01:17:57 -0400 Subject: [PATCH] Still get no output, but at least the debug looks good now, and fixed segfault on exit --- src/TomahawkApp.cpp | 2 - src/libtomahawk/AclRegistry.cpp | 4 +- src/libtomahawk/jobview/AclJobItem.cpp | 87 ++++++++++++++++++---- src/libtomahawk/jobview/AclJobItem.h | 2 - src/libtomahawk/jobview/JobStatusModel.cpp | 3 + src/libtomahawk/jobview/JobStatusView.cpp | 7 +- 6 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/TomahawkApp.cpp b/src/TomahawkApp.cpp index 08de78118..8529e8b02 100644 --- a/src/TomahawkApp.cpp +++ b/src/TomahawkApp.cpp @@ -409,8 +409,6 @@ TomahawkApp::registerMetaTypes() qRegisterMetaType< QHash< QString, QMap > >("QHash< QString, QMap >"); qRegisterMetaType< QMap< QString, QMap< unsigned int, unsigned int > > >("QMap< QString, QMap< unsigned int, unsigned int > >"); qRegisterMetaType< PairList >("PairList"); - qRegisterMetaType< JobStatusItem* >("JobStatusItem*"); - qRegisterMetaType< AclJobItem* >("AclJobItem*"); qRegisterMetaType< GeneratorMode>("GeneratorMode"); qRegisterMetaType("Tomahawk::GeneratorMode"); diff --git a/src/libtomahawk/AclRegistry.cpp b/src/libtomahawk/AclRegistry.cpp index ef462ded2..78f370ee5 100644 --- a/src/libtomahawk/AclRegistry.cpp +++ b/src/libtomahawk/AclRegistry.cpp @@ -70,8 +70,8 @@ ACLRegistry::isAuthorizedUser( const QString& dbid, const QString &username, ACL } //FIXME: Remove when things are working - emit aclResult( dbid, username, ACLRegistry::Stream ); - return ACLRegistry::NotFound; + emit aclResult( dbid, username, ACLRegistry::Stream ); + return ACLRegistry::NotFound; bool found = false; QMutableListIterator< ACLRegistry::User > i( m_cache ); diff --git a/src/libtomahawk/jobview/AclJobItem.cpp b/src/libtomahawk/jobview/AclJobItem.cpp index 6dbcc415e..45793cbf1 100644 --- a/src/libtomahawk/jobview/AclJobItem.cpp +++ b/src/libtomahawk/jobview/AclJobItem.cpp @@ -31,6 +31,8 @@ #define ROW_HEIGHT 40 #define ICON_PADDING 1 #define PADDING 2 + + AclJobDelegate::AclJobDelegate( QObject* parent ) : QStyledItemDelegate ( parent ) , m_parentView( qobject_cast< QListView* >( parent ) ) @@ -42,6 +44,7 @@ AclJobDelegate::AclJobDelegate( QObject* parent ) void AclJobDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO; QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, index ); QFontMetrics fm( opt.font ); @@ -49,26 +52,62 @@ AclJobDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, co opt.state &= ~QStyle::State_MouseOver; QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget ); + painter->setRenderHint( QPainter::Antialiasing ); + + QString mainText; + AclJobItem* item = dynamic_cast< AclJobItem* >( index.data( JobStatusModel::JobDataRole ).value< JobStatusItem* >() ); + if ( !item ) + mainText = tr( "Error displaying ACL info" ); + else + mainText = QString( tr( "Allow %1 to\nconnect and stream from you?" ) ).arg( item->username() ); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Displaying text:" << mainText; + + const QString text = QString( tr( "Allow %1 to\nconnect and stream from you?" ) ).arg( item->username() ); + const int w = fm.width( text ); + const QRect rRect( opt.rect.left() + PADDING, ROW_HEIGHT + PADDING, opt.rect.width() - 2*PADDING, opt.rect.height() - 2*PADDING ); + painter->drawText( rRect, Qt::AlignCenter, text ); + + +/* + QStyleOptionViewItemV4 opt = option; + initStyleOption( &opt, index ); + QFontMetrics fm( opt.font ); + const bool allowMultiLine = index.data( JobStatusModel::AllowMultiLineRole ).toBool(); + + opt.state &= ~QStyle::State_MouseOver; + QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget ); + // painter->drawLine( opt.rect.topLeft(), opt.rect.topRight() ); painter->setRenderHint( QPainter::Antialiasing ); - //QRect iconRect( ICON_PADDING, ICON_PADDING + opt.rect.y(), ROW_HEIGHT - 2*ICON_PADDING, ROW_HEIGHT - 2*ICON_PADDING ); - //QPixmap p = index.data( Qt::DecorationRole ).value< QPixmap >(); - //p = p.scaledToHeight( iconRect.height(), Qt::SmoothTransformation ); - //painter->drawPixmap( iconRect, p ); + QRect iconRect( ICON_PADDING, ICON_PADDING + opt.rect.y(), ROW_HEIGHT - 2*ICON_PADDING, ROW_HEIGHT - 2*ICON_PADDING ); + if ( allowMultiLine ) + iconRect.moveTop( opt.rect.top() + opt.rect.height() / 2 - iconRect.height() / 2); + QPixmap p = index.data( Qt::DecorationRole ).value< QPixmap >(); + p = p.scaledToHeight( iconRect.height(), Qt::SmoothTransformation ); + painter->drawPixmap( iconRect, p ); // draw right column if there is one - AclJobItem* item = index.data( JobStatusModel::JobDataRole ).value< AclJobItem* >(); - const QString text = QString( tr( "Allow %1 to\nconnect and stream from you?" ) ).arg( item->username() ); - const int w = fm.width( text ); - const QRect rRect( opt.rect.left() + PADDING, opt.rect.y() - PADDING, opt.rect.width() - 2*PADDING, opt.rect.height() - 2*PADDING ); - painter->drawText( rRect, Qt::AlignCenter, text ); + const QString rCol = index.data( JobStatusModel::RightColumnRole ).toString(); + int rightEdge = opt.rect.right(); + if ( !rCol.isEmpty() ) + { + const int w = fm.width( rCol ); + const QRect rRect( opt.rect.right() - PADDING - w, PADDING + opt.rect.y(), w, opt.rect.height() - 2*PADDING ); + painter->drawText( rRect, Qt::AlignCenter, rCol ); - /* - rightEdge = rRect.left(); + rightEdge = rRect.left(); + } + QString mainText; + AclJobItem* item = dynamic_cast< AclJobItem* >( index.data( JobStatusModel::JobDataRole ).value< JobStatusItem* >() ); + //QString mainText = index.data( Qt::DisplayRole ).toString(); + if ( !item ) + mainText = tr( "Error displaying ACL info" ); + else + mainText = QString( tr( "Allow %1 to\nconnect and stream from you?" ) ).arg( item->username() ); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Displaying text:" << mainText; const int mainW = rightEdge - 3*PADDING - iconRect.right(); - QString mainText = index.data( Qt::DisplayRole ).toString(); QTextOption to( Qt::AlignLeft | Qt::AlignVCenter ); if ( !allowMultiLine ) mainText = fm.elidedText( mainText, Qt::ElideRight, mainW ); @@ -81,7 +120,29 @@ AclJobDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, co QSize AclJobDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO; return QSize( QStyledItemDelegate::sizeHint ( option, index ).width(), ROW_HEIGHT ); + + /* + const bool allowMultiLine = index.data( JobStatusModel::AllowMultiLineRole ).toBool(); + + if ( !allowMultiLine ) + return QSize( QStyledItemDelegate::sizeHint ( option, index ).width(), ROW_HEIGHT ); + else if ( m_cachedMultiLineHeights.contains( index ) ) + return QSize( QStyledItemDelegate::sizeHint ( option, index ).width(), m_cachedMultiLineHeights[ index ] ); + + // Don't elide, but stretch across as many rows as required + QStyleOptionViewItemV4 opt = option; + initStyleOption( &opt, index ); + + const QString text = index.data( Qt::DisplayRole ).toString(); + const int leftEdge = ICON_PADDING + ROW_HEIGHT + 2*PADDING; + const QRect rect = opt.fontMetrics.boundingRect( leftEdge, opt.rect.top(), m_parentView->width() - leftEdge, 200, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, text ); + + m_cachedMultiLineHeights.insert( index, rect.height() + 4*PADDING ); + + return QSize( QStyledItemDelegate::sizeHint ( option, index ).width(), rect.height() + 4*PADDING ); + */ } @@ -96,8 +157,6 @@ AclJobItem::AclJobItem( ACLRegistry::User user, const QString &username ) AclJobItem::~AclJobItem() { - if ( m_delegate ) - delete m_delegate; } diff --git a/src/libtomahawk/jobview/AclJobItem.h b/src/libtomahawk/jobview/AclJobItem.h index b79302691..fd5377ca1 100644 --- a/src/libtomahawk/jobview/AclJobItem.h +++ b/src/libtomahawk/jobview/AclJobItem.h @@ -76,6 +76,4 @@ private: const QString m_username; }; -Q_DECLARE_METATYPE( AclJobItem* ); - #endif // ACLJOBITEM_H diff --git a/src/libtomahawk/jobview/JobStatusModel.cpp b/src/libtomahawk/jobview/JobStatusModel.cpp index ab2275790..8be72d328 100644 --- a/src/libtomahawk/jobview/JobStatusModel.cpp +++ b/src/libtomahawk/jobview/JobStatusModel.cpp @@ -78,7 +78,10 @@ JobStatusModel::addJob( JobStatusItem* item ) m_items.append( item ); endInsertRows(); if ( item->hasCustomDelegate() ) + { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "job has custom delegate"; emit customDelegateJobInserted( currentEndRow, item ); + } } diff --git a/src/libtomahawk/jobview/JobStatusView.cpp b/src/libtomahawk/jobview/JobStatusView.cpp index 5d27ef08d..204ae9182 100644 --- a/src/libtomahawk/jobview/JobStatusView.cpp +++ b/src/libtomahawk/jobview/JobStatusView.cpp @@ -87,18 +87,21 @@ JobStatusView::setModel( JobStatusModel* m ) connect( m_view->model(), SIGNAL( rowsInserted( QModelIndex, int, int ) ), this, SLOT( checkCount() ) ); connect( m_view->model(), SIGNAL( rowsRemoved( QModelIndex, int, int ) ), this, SLOT( checkCount() ) ); connect( m_view->model(), SIGNAL( modelReset() ), this, SLOT( checkCount() ) ); - connect( m_view->model(), SIGNAL( customDelegateJobInserted( int, QStyledItemDelegate* ) ), this, SLOT( customDelegateJobInserted( int, QStyledItemDelegate* ) ) ); - connect( m_view->model(), SIGNAL( customDelegateJobRemoved( int, QStyledItemDelegate* ) ), this, SLOT( customDelegateJobRemoved( int, QStyledItemDelegate* ) ) ); + connect( m_view->model(), SIGNAL( customDelegateJobInserted( int, JobStatusItem* ) ), this, SLOT( customDelegateJobInserted( int, JobStatusItem* ) ) ); + connect( m_view->model(), SIGNAL( customDelegateJobRemoved( int ) ), this, SLOT( customDelegateJobRemoved( int ) ) ); } void JobStatusView::customDelegateJobInserted( int row, JobStatusItem* item ) { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO; if ( !item ) return; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "telling item to create delegate"; item->createDelegate( m_view ); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "item delegate is " << item->customDelegate(); m_view->setItemDelegateForRow( row, item->customDelegate() ); }