• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
  • cloudsync
RouteItemDelegate.cpp
Go to the documentation of this file.
1 #include "RouteItemDelegate.h"
2 
3 #include <QPainter>
4 #include <QWebView>
5 #include <QApplication>
6 #include <QAbstractTextDocumentLayout>
7 
8 namespace Marble {
9 
10 RouteItemDelegate::RouteItemDelegate( QListView *view, CloudRouteModel *model ) :
11  m_view( view ),
12  m_model( model ),
13  m_buttonWidth( 0 ),
14  m_iconSize( 16 ),
15  m_previewSize( 128 ),
16  m_margin( 8 )
17 {
18 }
19 
20 void RouteItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
21 {
22  QStyleOptionViewItemV4 styleOption = option;
23  styleOption.text = QString();
24  QApplication::style()->drawControl( QStyle::CE_ItemViewItem, &styleOption, painter );
25 
26  QAbstractTextDocumentLayout::PaintContext paintContext;
27  if ( styleOption.state & QStyle::State_Selected) {
28  paintContext.palette.setColor( QPalette::Text, styleOption.palette.color( QPalette::Active, QPalette::HighlightedText ) );
29  }
30 
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() ) );
34 
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 ) );
40 
41  painter->save();
42  painter->translate( textRect.topLeft() );
43  painter->setClipRect( 0, 0, textRect.width(), textRect.height() );
44  document.documentLayout()->draw( painter, paintContext );
45  painter->restore();
46 
47  bool cached = index.data( CloudRouteModel::IsCached ).toBool();
48  bool downloading = index.data( CloudRouteModel::IsDownloading ).toBool();
49  bool onCloud = index.data( CloudRouteModel::IsOnCloud ).toBool();
50 
51  if ( downloading ) {
52  qint64 total = m_model->totalSize();
53  qint64 progress = m_model->downloadedSize();
54 
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 );
68 
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 );
78 
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 );
83 
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 );
93 
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 );
98  }
99 }
100 
101 QSize RouteItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const
102 {
103  if ( index.column() == 0 ) {
104  QTextDocument doc;
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() ) ) );
110  }
111 
112  return QSize();
113 }
114 
115 bool RouteItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index )
116 {
117  Q_UNUSED( model );
118 
119  if ( ( event->type() == QEvent::MouseButtonRelease ) ) {
120  QMouseEvent *mouseEvent = static_cast<QMouseEvent*>( event );
121  QPoint pos = mouseEvent->pos();
122 
123  bool cached = index.data( CloudRouteModel::IsCached ).toBool();
124  bool onCloud = index.data( CloudRouteModel::IsOnCloud ).toBool();
125 
126  if( cached && !onCloud ) {
127  QRect uploadRect = position( UploadToCloudButton, option );
128 
129  if ( uploadRect.contains( pos ) ) {
130  QString timestamp = index.data( CloudRouteModel::Timestamp ).toString();
131  emit uploadToCloudButtonClicked( timestamp );
132  return true;
133  }
134  }
135 
136  if ( cached ) {
137  QRect openRect = position( OpenButton, option );
138  QRect cacheRemoveRect = position( RemoveFromCacheButton, option );
139 
140  if ( openRect.contains( pos ) ) {
141  QString timestamp = index.data( CloudRouteModel::Timestamp ).toString();
142  emit openButtonClicked( timestamp );
143  return true;
144  } else if ( cacheRemoveRect.contains( pos ) ) {
145  QString timestamp = index.data( CloudRouteModel::Timestamp ).toString();
146  emit removeFromCacheButtonClicked( timestamp );
147  return true;
148  }
149  } else {
150  QRect downloadRect = position( DownloadButton, option );
151  QRect cloudRemoveRect = position( RemoveFromCloudButton, option );
152 
153  if ( downloadRect.contains( pos ) ) {
154  QString timestamp = index.data( CloudRouteModel::Timestamp ).toString();
155  m_model->setDownloadingItem( index );
156  emit downloadButtonClicked( timestamp );
157  return true;
158  }
159 
160  if ( cloudRemoveRect.contains( pos ) ) {
161  QString timestamp = index.data( CloudRouteModel::Timestamp ).toString();
162  emit deleteButtonClicked( timestamp );
163  return true;
164  }
165  }
166  }
167 
168  return false;
169 }
170 
171 int RouteItemDelegate::buttonWidth( const QStyleOptionViewItem &option ) const
172 {
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 ) );
179  }
180 
181  return m_buttonWidth;
182 }
183 
184 QStyleOptionButton RouteItemDelegate::button( Element element, const QStyleOptionViewItem &option ) const
185 {
186  QStyleOptionButton result;
187  result.state = option.state;
188  result.state &= ~QStyle::State_HasFocus;
189 
190  result.palette = option.palette;
191  result.features = QStyleOptionButton::None;
192 
193  switch ( element ) {
194  case OpenButton:
195  result.text = tr( "Open" );
196  result.icon = QIcon( ":/marble/document-open.png" );
197  result.iconSize = QSize( m_iconSize, m_iconSize );
198  break;
199  case DownloadButton:
200  result.text = tr( "Load" );
201  result.icon = QIcon( ":/marble/dialog-ok.png" );
202  result.iconSize = QSize( m_iconSize, m_iconSize );
203  break;
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 );
208  break;
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 );
213  break;
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 );
218  break;
219  default:
220  // Ignored.
221  break;
222  }
223 
224  return result;
225 }
226 
227 QString RouteItemDelegate::text( const QModelIndex& index )
228 {
229  return QString( "%0" ).arg( index.data( CloudRouteModel::Name ).toString() );
230  // TODO: Show distance and duration
231  //return QString( "%0<br /><b>Duration:</b> %1<br/><b>Distance:</b> %2" )
232  //.arg( index.data( CloudRouteModel::Name ).toString() )
233  //.arg( index.data( CloudRouteModel::Duration ).toString() )
234  //.arg( index.data( CloudRouteModel::Distance ).toString() );
235 }
236 
237 QRect RouteItemDelegate::position( Element element, const QStyleOptionViewItem& option ) const
238 {
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() );
243 
244  switch (element) {
245  case Text:
246  return QRect( secondColumn, QSize( thirdColumn.x() - secondColumn.x(), option.rect.height() ) );
247  case OpenButton:
248  case DownloadButton:
249  {
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 );
255  }
256  case RemoveFromCacheButton:
257  case RemoveFromCloudButton:
258  {
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 );
264  }
265  case Progressbar:
266  {
267  QSize const progressSize = QSize( width, option.fontMetrics.height() + 4 );
268  return QRect( thirdColumn + QPoint( 0, 10 ), progressSize );
269  }
270  case Preview:
271  {
272  return QRect( firstColumn, QSize( m_previewSize, m_previewSize) );
273  }
274  case UploadToCloudButton:
275  {
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 );
281  }
282  }
283 
284  return QRect();
285 }
286 
287 }
288 
289 #include "RouteItemDelegate.moc"
Marble::CloudRouteModel::setDownloadingItem
void setDownloadingItem(const QPersistentModelIndex &index)
Marks the route at given index as being downloaded.
Definition: CloudRouteModel.cpp:125
QModelIndex
QEvent
QRect::size
QSize size() const
QEvent::type
Type type() const
Marble::CloudRouteModel
Definition: CloudRouteModel.h:25
Marble::RouteItemDelegate::RouteItemDelegate
RouteItemDelegate(QListView *view, CloudRouteModel *model)
Definition: RouteItemDelegate.cpp:10
QWidget::contentsRect
QRect contentsRect() const
Marble::RouteItemDelegate::removeFromCacheButtonClicked
void removeFromCacheButtonClicked(QString timestamp)
QStyleOptionProgressBar
Marble::RouteItemDelegate::paint
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: RouteItemDelegate.cpp:20
QPainter::save
void save()
RouteItemDelegate.h
Marble::CloudRouteModel::IsCached
Definition: CloudRouteModel.h:36
QVariant::value
T value() const
QRect::height
int height() const
QPoint
Marble::RouteItemDelegate::deleteButtonClicked
void deleteButtonClicked(QString timestamp)
QMouseEvent
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QPoint::x
int x() const
QPoint::y
int y() const
QStyleOptionButton
QIcon::pixmap
QPixmap pixmap(const QSize &size, Mode mode, State state) const
QObject::event
virtual bool event(QEvent *e)
QListView
Marble::RouteItemDelegate::openButtonClicked
void openButtonClicked(QString timestamp)
QRect
QString::number
QString number(int n, int base)
Marble::None
Definition: tools/osm-addresses/OsmParser.h:40
QStyleOptionViewItem
Marble::RouteItemDelegate::downloadButtonClicked
void downloadButtonClicked(QString timestamp)
QStyle
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QSize::setWidth
void setWidth(int width)
QPainter
Marble::CloudRouteModel::IsDownloading
Definition: CloudRouteModel.h:37
QTextDocument::documentLayout
QAbstractTextDocumentLayout * documentLayout() const
QRect::contains
bool contains(const QPoint &point, bool proper) const
QString
QAbstractTextDocumentLayout::PaintContext
QTextDocument::size
size
Marble::CloudRouteModel::Name
Definition: CloudRouteModel.h:32
Marble::RouteItemDelegate::uploadToCloudButtonClicked
void uploadToCloudButtonClicked(QString timestamp)
QTextDocument::setDefaultFont
void setDefaultFont(const QFont &font)
Marble::RouteItemDelegate::sizeHint
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: RouteItemDelegate.cpp:101
QSize
QPainter::restore
void restore()
QTextDocument::setTextWidth
void setTextWidth(qreal width)
QRect::width
int width() const
Marble::RouteItemDelegate::editorEvent
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Definition: RouteItemDelegate.cpp:115
Marble::CloudRouteModel::IsOnCloud
Definition: CloudRouteModel.h:38
QPainter::setClipRect
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
Marble::CloudRouteModel::totalSize
qint64 totalSize() const
Total size of the item currently being downloaded.
Definition: CloudRouteModel.cpp:135
QModelIndex::data
QVariant data(int role) const
QApplication::style
QStyle * style()
QTextDocument
QStyle::drawControl
virtual void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const =0
Marble::CloudRouteModel::downloadedSize
qint64 downloadedSize() const
Returns how much of the route are downloaded as bytes.
Definition: CloudRouteModel.cpp:140
QSize::height
int height() const
QRect::topLeft
QPoint topLeft() const
QModelIndex::column
int column() const
QVariant::toBool
bool toBool() const
QPainter::translate
void translate(const QPointF &offset)
QAbstractItemModel
QTextDocument::setHtml
void setHtml(const QString &html)
QAbstractTextDocumentLayout::draw
virtual void draw(QPainter *painter, const PaintContext &context)=0
QMouseEvent::pos
const QPoint & pos() const
QStyleOptionViewItemV4
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QVariant::toString
QString toString() const
Marble::CloudRouteModel::Timestamp
Definition: CloudRouteModel.h:31
QStyle::sizeFromContents
virtual QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const =0
QIcon
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal