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.