13 #include "ui_MapThemeDownloadDialog.h"
20 #include <QTextDocument>
21 #include <QAbstractTextDocumentLayout>
22 #include <QStyledItemDelegate>
27 class MapItemDelegate :
public QStyledItemDelegate
30 MapItemDelegate( QListView* view, NewstuffModel* newstuffModel,
MarbleWidget* marbleWidget );
31 void paint(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
32 QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
35 bool editorEvent( QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index );
49 int buttonWidth(
const QStyleOptionViewItem &option )
const;
50 QStyleOptionButton button( Element element,
const QStyleOptionViewItem &option )
const;
51 QRect position( Element element,
const QStyleOptionViewItem &option )
const;
52 QString text(
const QModelIndex &index )
const;
54 NewstuffModel* m_newstuffModel;
55 mutable int m_buttonWidth;
61 class MapThemeDownloadDialog::Private :
public Ui::MapThemeDownloadDialog
68 NewstuffModel m_model;
78 d->m_model.setProvider(
"http://edu.kde.org/marble/newstuff/maps-4.5.xml" );
81 d->listView->setIconSize( QSize( 130, 130 ) );
82 d->listView->setAlternatingRowColors(
true );
83 d->listView->setUniformItemSizes(
false );
84 d->listView->setResizeMode( QListView::Adjust );
85 d->listView->setItemDelegate(
new MapItemDelegate( d->listView, &d->m_model, marbleWidget ) );
86 d->listView->setModel( &d->m_model );
96 m_newstuffModel( newstuffModel ),
100 m_marbleWidget( marbleWidget )
105 void MapItemDelegate::paint(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
107 QStyleOptionViewItemV4 styleOption = option;
108 styleOption.text = QString();
109 QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &styleOption, painter);
111 QAbstractTextDocumentLayout::PaintContext paintContext;
112 if (styleOption.state & QStyle::State_Selected) {
113 paintContext.palette.setColor(QPalette::Text,
114 styleOption.palette.color(QPalette::Active, QPalette::HighlightedText));
118 QRect
const iconRect = position( Icon, option );
119 QIcon
const icon = index.data( Qt::DecorationRole ).value<QIcon>();
120 painter->drawPixmap( iconRect, icon.pixmap( iconRect.size() ) );
123 QTextDocument document;
124 QRect
const textRect = position( Text, option );
125 document.setTextWidth( textRect.width() );
126 document.setDefaultFont( option.font );
127 document.setHtml( text( index ) );
130 painter->translate( textRect.topLeft() );
131 painter->setClipRect( 0, 0, textRect.width(), textRect.height() );
132 document.documentLayout()->draw( painter, paintContext );
140 QStyleOptionProgressBar progressBarOption;
141 progressBarOption.rect = position( ProgressReport, option );
142 progressBarOption.minimum = 0;
143 progressBarOption.maximum = 100;
144 progressBarOption.progress = ( 100.0 * progress / total );
145 progressBarOption.text = QString::number( progressBarOption.progress ) +
"%";
146 progressBarOption.textVisible =
true;
147 QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
149 QStyleOptionButton cancelButton = button( CancelButton, option );
150 QRect installRect = position( CancelButton, option );
151 cancelButton.rect = installRect;
152 QApplication::style()->drawControl( QStyle::CE_PushButton, &cancelButton, painter );
156 Element element = InstallButton;
158 element = upgradable ? UpgradeButton : OpenButton;
160 QStyleOptionButton actionButton = button( element, option );
161 QRect installRect = position( element, option );
162 actionButton.rect = installRect;
163 QApplication::style()->drawControl( QStyle::CE_PushButton, &actionButton, painter );
166 QStyleOptionButton removeButton = button( RemoveButton, option );
167 QRect removeRect = position( RemoveButton, option );
168 removeButton.rect = removeRect;
169 QApplication::style()->drawControl( QStyle::CE_PushButton, &removeButton, painter );
174 QSize MapItemDelegate::sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index)
const
176 if ( index.column() == 0 ) {
177 QSize
const iconSize = option.decorationSize;
179 doc.setDefaultFont( option.font );
180 doc.setTextWidth( qMax( 200, m_view->contentsRect().width() - iconSize.width() - buttonWidth( option ) - 3 * m_margin ) );
181 doc.setHtml( text( index ) );
182 return QSize( iconSize.width() + doc.size().width() + buttonWidth( option ) + 3 * m_margin,
183 2 + qMax( iconSize.height(), qRound( doc.size().height() ) ) );
189 bool MapItemDelegate::editorEvent(QEvent *event,
QAbstractItemModel *,
const QStyleOptionViewItem &option,
const QModelIndex &index)
191 if ( ( event->type() == QEvent::MouseButtonRelease ) ) {
192 QMouseEvent *mouseEvent =
static_cast<QMouseEvent*
>( event );
194 QRect cancelRect = position( CancelButton, option );
195 if ( cancelRect.contains( mouseEvent->pos() ) ) {
196 m_newstuffModel->cancel( index.row() );
203 if ( !installed || upgradable ) {
204 QRect installRect = position( InstallButton, option );
205 if ( installRect.contains( mouseEvent->pos() ) ) {
206 m_newstuffModel->install( index.row() );
211 if ( installed && !upgradable && m_marbleWidget ) {
212 QRect openRect = position( OpenButton, option );
213 if ( openRect.contains( mouseEvent->pos() ) ) {
215 foreach(
const QString &file, files ) {
216 if ( file.endsWith(
".dgml" ) ) {
217 QFileInfo dgmlFile( file );
218 QDir baseDir = dgmlFile.dir();
221 int const index = baseDir.absolutePath().size();
222 QString
const mapTheme = dgmlFile.absoluteFilePath().mid( index+1 );
223 m_marbleWidget->setMapThemeId( mapTheme );
231 QRect removeRect = position( RemoveButton, option );
232 if ( removeRect.contains( mouseEvent->pos() ) ) {
233 m_newstuffModel->uninstall( index.row() );
243 int MapItemDelegate::buttonWidth(
const QStyleOptionViewItem &option)
const
245 if ( m_buttonWidth <= 0 ) {
246 int const installWidth = option.fontMetrics.size( 0, tr(
"Install" ) ).width();
247 int const removeWidth = option.fontMetrics.size( 0, tr(
"Remove" ) ).width();
248 int const cancelWidth = option.fontMetrics.size( 0, tr(
"Cancel" ) ).width();
249 int const upgradeWidth = option.fontMetrics.size( 0, tr(
"Upgrade" ) ).width();
250 m_buttonWidth = 2 * m_iconSize + qMax( qMax( installWidth, removeWidth ),
251 qMax( cancelWidth, upgradeWidth ) );
254 return m_buttonWidth;
257 QStyleOptionButton MapItemDelegate::button( Element element,
const QStyleOptionViewItem &option )
const
259 QStyleOptionButton result;
260 result.state = option.state;
261 result.state &= ~QStyle::State_HasFocus;
263 result.palette = option.palette;
268 result.text = tr(
"Install" );
269 result.icon = QIcon(
":/marble/dialog-ok.png" );
270 result.iconSize = QSize( m_iconSize, m_iconSize );
273 result.text = tr(
"Update" );
274 result.icon = QIcon(
":/marble/system-software-update.png" );
275 result.iconSize = QSize( m_iconSize, m_iconSize );
278 result.text = tr(
"Open" );
279 result.icon = QIcon(
":/marble/document-open.png" );
280 result.iconSize = QSize( m_iconSize, m_iconSize );
283 result.text = tr(
"Cancel" );
286 result.text = tr(
"Remove" );
287 result.icon = QIcon(
":/marble/edit-delete.png" );
288 result.iconSize = QSize( m_iconSize, m_iconSize );
298 QRect MapItemDelegate::position(Element element,
const QStyleOptionViewItem &option )
const
300 int const width = buttonWidth( option );
301 QPoint
const topLeftCol1 = option.rect.topLeft() + QPoint( 0, 2 );
302 QPoint
const topLeftCol2 = topLeftCol1 + QPoint( option.decorationSize.width(), 0 );
303 QPoint
const topLeftCol3 = topLeftCol2 + QPoint( option.rect.width() - 3 * m_margin - width - option.decorationSize.width(), 0 );
306 return QRect( topLeftCol1, option.decorationSize );
308 return QRect( topLeftCol2, QSize( topLeftCol3.x()-topLeftCol2.x(), option.rect.height() ) );
313 QStyleOptionButton optionButton = button( element, option );
314 QSize size = option.fontMetrics.size( 0, optionButton.text ) + QSize( 4, 4 );
315 QSize buttonSize = QApplication::style()->sizeFromContents( QStyle::CT_PushButton, &optionButton, size );
316 buttonSize.setWidth( width );
317 return QRect( topLeftCol3, buttonSize );
322 QStyleOptionButton optionButton = button( element, option );
323 QSize size = option.fontMetrics.size( 0, optionButton.text ) + QSize( 4, 4 );
324 QSize buttonSize = QApplication::style()->sizeFromContents( QStyle::CT_PushButton, &optionButton, size );
325 buttonSize.setWidth( width );
326 return QRect( topLeftCol3 + QPoint( 0, option.fontMetrics.height() + 8 + m_margin ), buttonSize );
330 QSize
const progressSize = QSize( width, option.fontMetrics.height() + 4 );
331 return QRect( topLeftCol3 + QPoint( 0, m_margin ), progressSize );
339 QString MapItemDelegate::text(
const QModelIndex &index )
const
344 int const maxEntrySize = 4096;
345 return QString(
"<p><b>%1</b><br />%2</p><p>Author: %3<br />License: %4<br />Version %5 (%6) %7</p>")
346 .arg( index.data().toString() )
352 .arg( size > 0 ? QString(
"%1 MB" ).arg( size, 0,
'f', 1 ) : QString() );
357 #include "MapThemeDownloadDialog.moc"
static QString localPath()
MapThemeDownloadDialog(MarbleWidget *marbleWidget)
const QSize iconSize(16, 16)
~MapThemeDownloadDialog()