20 #include "agentinstancewidget.h"
22 #include "agentfilterproxymodel.h"
23 #include "agentinstance.h"
24 #include "agentinstancemodel.h"
27 #include <KIconLoader>
30 #include <QtCore/QUrl>
31 #include <QApplication>
32 #include <QTextDocument>
33 #include <QHBoxLayout>
40 static void iconsEarlyCleanup();
45 : readyPixmap( KIcon( QLatin1String(
"user-online" ) ).pixmap( QSize( 16, 16 ) ) )
46 , syncPixmap( KIcon( QLatin1String(
"network-connect" ) ).pixmap( QSize( 16, 16 ) ) )
47 , errorPixmap( KIcon( QLatin1String(
"dialog-error" ) ).pixmap( QSize( 16, 16 ) ) )
48 , offlinePixmap( KIcon( QLatin1String(
"network-disconnect" ) ).pixmap( QSize( 16, 16 ) ) )
50 qAddPostRoutine( iconsEarlyCleanup );
52 QPixmap readyPixmap, syncPixmap, errorPixmap, offlinePixmap;
55 K_GLOBAL_STATIC( Icons, s_icons )
58 void iconsEarlyCleanup() {
59 Icons *
const ic = s_icons;
60 ic->readyPixmap = ic->syncPixmap = ic->errorPixmap = ic->offlinePixmap = QPixmap();
63 static const int s_delegatePaddingSize = 7;
69 class AgentInstanceWidgetDelegate :
public QAbstractItemDelegate
72 AgentInstanceWidgetDelegate( QObject *parent = 0 );
74 virtual void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
75 virtual QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
80 using Akonadi::Internal::AgentInstanceWidgetDelegate;
85 class AgentInstanceWidget::Private
89 : mParent( parent ), mView( 0 ), mModel( 0 ), proxy( 0 )
93 void currentAgentInstanceChanged(
const QModelIndex&,
const QModelIndex& );
94 void currentAgentInstanceDoubleClicked(
const QModelIndex& );
95 void currentAgentInstanceClicked(
const QModelIndex ¤tIndex );
99 AgentInstanceModel *mModel;
100 AgentFilterProxyModel *proxy;
103 void AgentInstanceWidget::Private::currentAgentInstanceChanged(
const QModelIndex ¤tIndex,
const QModelIndex &previousIndex )
105 AgentInstance currentInstance;
106 if ( currentIndex.isValid() ) {
110 AgentInstance previousInstance;
111 if ( previousIndex.isValid() ) {
115 emit mParent->currentChanged( currentInstance, previousInstance );
118 void AgentInstanceWidget::Private::currentAgentInstanceDoubleClicked(
const QModelIndex ¤tIndex )
120 AgentInstance currentInstance;
121 if ( currentIndex.isValid() ) {
125 emit mParent->doubleClicked( currentInstance );
128 void AgentInstanceWidget::Private::currentAgentInstanceClicked(
const QModelIndex ¤tIndex )
130 AgentInstance currentInstance;
131 if ( currentIndex.isValid() ) {
135 emit mParent->clicked( currentInstance );
139 : QWidget( parent ), d( new Private( this ) )
141 QHBoxLayout *layout =
new QHBoxLayout(
this );
142 layout->setMargin( 0 );
144 d->mView =
new QListView(
this );
145 d->mView->setContextMenuPolicy( Qt::NoContextMenu );
146 d->mView->setItemDelegate(
new Internal::AgentInstanceWidgetDelegate( d->mView ) );
147 d->mView->setVerticalScrollMode( QAbstractItemView::ScrollPerPixel );
148 d->mView->setAlternatingRowColors(
true );
149 d->mView->setSelectionMode( QAbstractItemView::ExtendedSelection );
150 layout->addWidget( d->mView );
155 d->proxy->setSourceModel( d->mModel );
156 d->mView->setModel( d->proxy );
158 d->mView->selectionModel()->setCurrentIndex( d->mView->model()->index( 0, 0 ), QItemSelectionModel::Select );
159 d->mView->scrollTo( d->mView->model()->index( 0, 0 ) );
161 connect( d->mView->selectionModel(), SIGNAL(
currentChanged(QModelIndex,QModelIndex)),
162 this, SLOT(currentAgentInstanceChanged(QModelIndex,QModelIndex)) );
164 this, SLOT(currentAgentInstanceDoubleClicked(QModelIndex)) );
165 connect( d->mView, SIGNAL(
clicked(QModelIndex)),
166 this, SLOT(currentAgentInstanceClicked(QModelIndex)) );
176 QItemSelectionModel *selectionModel = d->mView->selectionModel();
177 if ( !selectionModel ) {
181 QModelIndex index = selectionModel->currentIndex();
182 if ( !index.isValid() ) {
191 QList<AgentInstance> list;
192 QItemSelectionModel *selectionModel = d->mView->selectionModel();
193 if ( !selectionModel ) {
197 const QModelIndexList indexes = selectionModel->selection().indexes();
199 foreach (
const QModelIndex &index, indexes ) {
217 AgentInstanceWidgetDelegate::AgentInstanceWidgetDelegate( QObject *parent )
218 : QAbstractItemDelegate( parent )
222 void AgentInstanceWidgetDelegate::paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
224 if ( !index.isValid() ) {
228 QStyle *style = QApplication::style();
229 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0);
231 QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();
232 const QString name = index.model()->data( index, Qt::DisplayRole ).toString();
237 QPixmap statusPixmap;
240 statusPixmap = s_icons->offlinePixmap;
242 statusPixmap = s_icons->readyPixmap;
244 statusPixmap = s_icons->syncPixmap;
246 statusPixmap = s_icons->errorPixmap;
250 statusMessage.append(QString::fromLatin1(
" (%1%)").arg(progress));
253 QRect innerRect = option.rect.adjusted( s_delegatePaddingSize, s_delegatePaddingSize, -s_delegatePaddingSize, -s_delegatePaddingSize );
255 const QSize decorationSize( KIconLoader::global()->currentSize( KIconLoader::Desktop ), KIconLoader::global()->currentSize( KIconLoader::Desktop ) );
256 const QSize statusIconSize = QSize(16,16);
258 QFont nameFont = option.font;
259 nameFont.setBold(
true);
261 QFont statusTextFont = option.font;
262 const QRect decorationRect( innerRect.left(), innerRect.top(), decorationSize.width(), innerRect.height() );
263 const QRect nameTextRect( decorationRect.topRight() + QPoint( 4, 0 ), innerRect.topRight() + QPoint( 0, innerRect.height() / 2) );
264 const QRect statusTextRect( decorationRect.bottomRight() + QPoint( 4, - innerRect.height()/2 ), innerRect.bottomRight() );
266 const QPixmap iconPixmap = icon.pixmap(decorationSize);
268 QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
269 if ( cg == QPalette::Normal && ! ( option.state & QStyle::State_Active ) ) {
270 cg = QPalette::Inactive;
273 if ( option.state & QStyle::State_Selected ) {
274 painter->setPen(option.palette.color( cg, QPalette::HighlightedText ) );
276 painter->setPen(option.palette.color( cg, QPalette::Text ) );
279 painter->drawPixmap( style->itemPixmapRect( decorationRect, Qt::AlignCenter, iconPixmap ), iconPixmap );
281 painter->setFont(nameFont);
282 painter->drawText(nameTextRect, Qt::AlignVCenter | Qt::AlignLeft, name);
284 painter->setFont(statusTextFont);
285 painter->drawText(statusTextRect.adjusted( statusIconSize.width() + 4, 0, 0, 0 ), Qt::AlignVCenter | Qt::AlignLeft, statusMessage );
286 painter->drawPixmap(style->itemPixmapRect( statusTextRect, Qt::AlignVCenter | Qt::AlignLeft, statusPixmap ), statusPixmap );
289 QSize AgentInstanceWidgetDelegate::sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
293 const int iconHeight = KIconLoader::global()->currentSize(KIconLoader::Desktop) + ( s_delegatePaddingSize*2 );
294 const int textHeight = option.fontMetrics.height() + qMax( option.fontMetrics.height(), 16 ) + ( s_delegatePaddingSize*2 );
296 return QSize( 1,qMax( iconHeight, textHeight ) );
301 #include "moc_agentinstancewidget.cpp"