5 #include <QApplication> 
    6 #include <QAbstractTextDocumentLayout> 
   22     QStyleOptionViewItemV4 styleOption = option;
 
   23     styleOption.text = QString();
 
   24     QApplication::style()->drawControl( QStyle::CE_ItemViewItem, &styleOption, painter );
 
   26     QAbstractTextDocumentLayout::PaintContext paintContext;
 
   27     if ( styleOption.state & QStyle::State_Selected)  {
 
   28         paintContext.palette.setColor( QPalette::Text, styleOption.palette.color( QPalette::Active, QPalette::HighlightedText ) );
 
   31     QRect 
const iconRect = position( Preview, option );
 
   32     QIcon 
const icon = index.data( Qt::DecorationRole ).value<QIcon>();
 
   33     painter->drawPixmap( iconRect, icon.pixmap( iconRect.size() ) );
 
   35     QTextDocument document;
 
   36     QRect 
const textRect = position( Text, option );
 
   37     document.setTextWidth( textRect.width() );
 
   38     document.setDefaultFont( option.font );
 
   39     document.setHtml( text( index ) );
 
   42     painter->translate( textRect.topLeft() );
 
   43     painter->setClipRect( 0, 0, textRect.width(), textRect.height() );
 
   44     document.documentLayout()->draw( painter, paintContext );
 
   55         QStyleOptionProgressBar progressBarOption;
 
   56         progressBarOption.rect = position( Progressbar, option );
 
   57         progressBarOption.minimum = 0;
 
   58         progressBarOption.maximum = 100;
 
   59         progressBarOption.progress = ( 100.0 * progress / total );
 
   60         progressBarOption.text = QString::number( progressBarOption.progress ) + 
"%";
 
   61         progressBarOption.textVisible = 
true;
 
   62         QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
 
   63     } 
else if ( !cached && onCloud ) {
 
   64         QStyleOptionButton downloadButton = button( DownloadButton, option );
 
   65         QRect downloadRect = position( DownloadButton, option );
 
   66         downloadButton.rect = downloadRect;
 
   67         QApplication::style()->drawControl( QStyle::CE_PushButton, &downloadButton, painter );
 
   69         QStyleOptionButton cloudRemoveButton = button( RemoveFromCloudButton, option );
 
   70         QRect cloudRemoveRect = position( RemoveFromCloudButton, option );
 
   71         cloudRemoveButton.rect = cloudRemoveRect;
 
   72         QApplication::style()->drawControl( QStyle::CE_PushButton, &cloudRemoveButton, painter );
 
   73     } 
else if ( cached && !onCloud ) {
 
   74         QStyleOptionButton openButton = button( OpenButton, option );
 
   75         QRect openRect = position( OpenButton, option );
 
   76         openButton.rect = openRect;
 
   77         QApplication::style()->drawControl( QStyle::CE_PushButton, &openButton, painter );
 
   79         QStyleOptionButton cacheRemoveButton = button( RemoveFromCacheButton, option );
 
   80         QRect cacheRemoveRect = position( RemoveFromCacheButton, option );
 
   81         cacheRemoveButton.rect = cacheRemoveRect;
 
   82         QApplication::style()->drawControl( QStyle::CE_PushButton, &cacheRemoveButton, painter );
 
   84         QStyleOptionButton uploadButton = button( UploadToCloudButton, option );
 
   85         QRect uploadRect = position( UploadToCloudButton, option );
 
   86         uploadButton.rect = uploadRect;
 
   87         QApplication::style()->drawControl( QStyle::CE_PushButton, &uploadButton, painter );
 
   88     } 
else if ( cached && onCloud ) {
 
   89         QStyleOptionButton openButton = button( OpenButton, option );
 
   90         QRect openRect = position( OpenButton, option );
 
   91         openButton.rect = openRect;
 
   92         QApplication::style()->drawControl( QStyle::CE_PushButton, &openButton, painter );
 
   94         QStyleOptionButton cacheRemoveButton = button( RemoveFromCacheButton, option );
 
   95         QRect cacheRemoveRect = position( RemoveFromCacheButton, option );
 
   96         cacheRemoveButton.rect = cacheRemoveRect;
 
   97         QApplication::style()->drawControl( QStyle::CE_PushButton, &cacheRemoveButton, painter );
 
  103     if ( index.column() == 0 ) {
 
  105         doc.setDefaultFont( option.font );
 
  106         doc.setTextWidth( qMax( 128, m_view->contentsRect().width() - m_previewSize - buttonWidth( option ) ) );
 
  107         doc.setHtml( text( index ) );
 
  108         return QSize( qMax( 256, qRound( m_previewSize + buttonWidth( option ) + doc.size().width() + m_margin * 2 ) ),
 
  109                       qMax( m_previewSize + m_margin * 2, qRound( doc.size().height() ) ) );
 
  119     if ( ( event->type() == QEvent::MouseButtonRelease ) ) {
 
  120         QMouseEvent *mouseEvent = 
static_cast<QMouseEvent*
>( event );
 
  121         QPoint pos = mouseEvent->pos();
 
  126         if( cached && !onCloud ) {
 
  127             QRect uploadRect = position( UploadToCloudButton, option );
 
  129             if ( uploadRect.contains( pos ) ) {
 
  137             QRect openRect = position( OpenButton, option );
 
  138             QRect cacheRemoveRect = position( RemoveFromCacheButton, option );
 
  140             if ( openRect.contains( pos ) ) {
 
  144             } 
else if ( cacheRemoveRect.contains( pos ) ) {
 
  150             QRect downloadRect = position( DownloadButton, option );
 
  151             QRect cloudRemoveRect = position( RemoveFromCloudButton, option );
 
  153             if ( downloadRect.contains( pos ) ) {
 
  160             if ( cloudRemoveRect.contains( pos ) ) {
 
  171 int RouteItemDelegate::buttonWidth( 
const QStyleOptionViewItem &option )
 const 
  173     if ( m_buttonWidth <= 0 ) {
 
  174         int const openWidth = option.fontMetrics.size( 0, tr( 
"Open" ) ).width();
 
  175         int const downloadWidth = option.fontMetrics.size( 0, tr( 
"Load" ) ).width();
 
  176         int const cacheWidth = option.fontMetrics.size( 0, tr( 
"Remove from device" ) ).width();
 
  177         int const cloudWidth = option.fontMetrics.size( 0, tr( 
"Delete from cloud" ) ).width();
 
  178         m_buttonWidth = 2 * m_iconSize + qMax( qMax( openWidth, downloadWidth ), qMax( cacheWidth, cloudWidth ) );
 
  181     return m_buttonWidth;
 
  184 QStyleOptionButton RouteItemDelegate::button( Element element, 
const QStyleOptionViewItem &option )
 const 
  186     QStyleOptionButton result;
 
  187     result.state = option.state;
 
  188     result.state &= ~QStyle::State_HasFocus;
 
  190     result.palette = option.palette;
 
  195         result.text = tr( 
"Open" );
 
  196         result.icon = QIcon( 
":/marble/document-open.png" );
 
  197         result.iconSize = QSize( m_iconSize, m_iconSize );
 
  200         result.text = tr( 
"Load" );
 
  201         result.icon = QIcon( 
":/marble/dialog-ok.png" );
 
  202         result.iconSize = QSize( m_iconSize, m_iconSize );
 
  204     case RemoveFromCacheButton:
 
  205         result.text = tr( 
"Remove from device" );
 
  206         result.icon = QIcon( 
":/marble/edit-clear.png" );
 
  207         result.iconSize = QSize( m_iconSize, m_iconSize );
 
  209     case RemoveFromCloudButton:
 
  210         result.text = tr( 
"Delete from cloud" );
 
  211         result.icon = QIcon( 
":/marble/edit-delete.png" );
 
  212         result.iconSize = QSize( m_iconSize, m_iconSize );
 
  214     case UploadToCloudButton:
 
  215         result.text = tr( 
"Upload to cloud" );
 
  216         result.icon = QIcon( 
":/icons/cloud-upload.png" );
 
  217         result.iconSize = QSize( m_iconSize, m_iconSize );
 
  227 QString RouteItemDelegate::text( 
const QModelIndex& index )
 const 
  237 QRect RouteItemDelegate::position( Element element, 
const QStyleOptionViewItem& option )
 const 
  239     int const width = buttonWidth( option );
 
  240     QPoint 
const firstColumn = option.rect.topLeft() + QPoint( m_margin, m_margin );
 
  241     QPoint 
const secondColumn = firstColumn + QPoint( m_previewSize + m_margin, 0 );
 
  242     QPoint 
const thirdColumn = QPoint( option.rect.width() - width - option.decorationSize.width(), firstColumn.y() );
 
  246         return QRect( secondColumn, QSize( thirdColumn.x() - secondColumn.x(), option.rect.height() ) );
 
  250         QStyleOptionButton optionButton = button( element, option );
 
  251         QSize size = option.fontMetrics.size( 0, optionButton.text ) + QSize( 4, 4 );
 
  252         QSize buttonSize = QApplication::style()->sizeFromContents( QStyle::CT_PushButton, &optionButton, size );
 
  253         buttonSize.setWidth( width );
 
  254         return QRect( thirdColumn, buttonSize );
 
  256     case RemoveFromCacheButton:
 
  257     case RemoveFromCloudButton:
 
  259         QStyleOptionButton optionButton = button( element, option );
 
  260         QSize size = option.fontMetrics.size( 0, optionButton.text ) + QSize( 4, 4 );
 
  261         QSize buttonSize = QApplication::style()->sizeFromContents( QStyle::CT_PushButton, &optionButton, size );
 
  262         buttonSize.setWidth( width );
 
  263         return QRect( thirdColumn + QPoint( 0, buttonSize.height() ), buttonSize );
 
  267         QSize 
const progressSize = QSize( width, option.fontMetrics.height() + 4 );
 
  268         return QRect( thirdColumn + QPoint( 0, 10 ), progressSize );
 
  272         return QRect( firstColumn, QSize( m_previewSize, m_previewSize) );
 
  274     case UploadToCloudButton:
 
  276         QStyleOptionButton optionButton = button( element, option );
 
  277         QSize size = option.fontMetrics.size( 0, optionButton.text ) + QSize( 4, 4 );
 
  278         QSize buttonSize = QApplication::style()->sizeFromContents( QStyle::CT_PushButton, &optionButton, size );
 
  279         buttonSize.setWidth( width );
 
  280         return QRect( thirdColumn + QPoint( 0, buttonSize.height() * 2 ), buttonSize );
 
  289 #include "RouteItemDelegate.moc" 
void setDownloadingItem(const QPersistentModelIndex &index)
Marks the route at given index as being downloaded. 
 
RouteItemDelegate(QListView *view, CloudRouteModel *model)
 
void removeFromCacheButtonClicked(QString timestamp)
 
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
 
void deleteButtonClicked(QString timestamp)
 
void openButtonClicked(QString timestamp)
 
void downloadButtonClicked(QString timestamp)
 
void uploadToCloudButtonClicked(QString timestamp)
 
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const 
 
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
 
qint64 totalSize() const 
Total size of the item currently being downloaded. 
 
qint64 downloadedSize() const 
Returns how much of the route are downloaded as bytes.