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 <QHBoxLayout>
39 static void iconsEarlyCleanup();
44 : readyPixmap( KIcon( QLatin1String(
"user-online" ) ).pixmap( QSize( 16, 16 ) ) )
45 , syncPixmap( KIcon( QLatin1String(
"network-connect" ) ).pixmap( QSize( 16, 16 ) ) )
46 , errorPixmap( KIcon( QLatin1String(
"dialog-error" ) ).pixmap( QSize( 16, 16 ) ) )
47 , offlinePixmap( KIcon( QLatin1String(
"network-disconnect" ) ).pixmap( QSize( 16, 16 ) ) )
49 qAddPostRoutine( iconsEarlyCleanup );
51 QPixmap readyPixmap, syncPixmap, errorPixmap, offlinePixmap;
54 K_GLOBAL_STATIC( Icons, s_icons )
57 void iconsEarlyCleanup() {
58 Icons *
const ic = s_icons;
59 ic->readyPixmap = ic->syncPixmap = ic->errorPixmap = ic->offlinePixmap = QPixmap();
62 static const int s_delegatePaddingSize = 7;
68 class AgentInstanceWidgetDelegate :
public QAbstractItemDelegate
71 AgentInstanceWidgetDelegate( QObject *parent = 0 );
73 virtual void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
74 virtual QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
79 using Akonadi::Internal::AgentInstanceWidgetDelegate;
84 class AgentInstanceWidget::Private
88 : mParent( parent ), mView( 0 ), mModel( 0 ), proxy( 0 )
92 void currentAgentInstanceChanged(
const QModelIndex&,
const QModelIndex& );
93 void currentAgentInstanceDoubleClicked(
const QModelIndex& );
94 void currentAgentInstanceClicked(
const QModelIndex ¤tIndex );
98 AgentInstanceModel *mModel;
99 AgentFilterProxyModel *proxy;
102 void AgentInstanceWidget::Private::currentAgentInstanceChanged(
const QModelIndex ¤tIndex,
const QModelIndex &previousIndex )
104 AgentInstance currentInstance;
105 if ( currentIndex.isValid() ) {
109 AgentInstance previousInstance;
110 if ( previousIndex.isValid() ) {
114 emit mParent->currentChanged( currentInstance, previousInstance );
117 void AgentInstanceWidget::Private::currentAgentInstanceDoubleClicked(
const QModelIndex ¤tIndex )
119 AgentInstance currentInstance;
120 if ( currentIndex.isValid() ) {
124 emit mParent->doubleClicked( currentInstance );
127 void AgentInstanceWidget::Private::currentAgentInstanceClicked(
const QModelIndex ¤tIndex )
129 AgentInstance currentInstance;
130 if ( currentIndex.isValid() ) {
134 emit mParent->clicked( currentInstance );
138 : QWidget( parent ), d( new Private( this ) )
140 QHBoxLayout *layout =
new QHBoxLayout(
this );
141 layout->setMargin( 0 );
143 d->mView =
new QListView(
this );
144 d->mView->setContextMenuPolicy( Qt::NoContextMenu );
145 d->mView->setItemDelegate(
new Internal::AgentInstanceWidgetDelegate( d->mView ) );
146 d->mView->setVerticalScrollMode( QAbstractItemView::ScrollPerPixel );
147 d->mView->setAlternatingRowColors(
true );
148 d->mView->setSelectionMode( QAbstractItemView::ExtendedSelection );
149 layout->addWidget( d->mView );
154 d->proxy->setSourceModel( d->mModel );
155 d->mView->setModel( d->proxy );
157 d->mView->selectionModel()->setCurrentIndex( d->mView->model()->index( 0, 0 ), QItemSelectionModel::Select );
158 d->mView->scrollTo( d->mView->model()->index( 0, 0 ) );
160 connect( d->mView->selectionModel(), SIGNAL(
currentChanged(QModelIndex,QModelIndex)),
161 this, SLOT(currentAgentInstanceChanged(QModelIndex,QModelIndex)) );
163 this, SLOT(currentAgentInstanceDoubleClicked(QModelIndex)) );
164 connect( d->mView, SIGNAL(
clicked(QModelIndex)),
165 this, SLOT(currentAgentInstanceClicked(QModelIndex)) );
175 QItemSelectionModel *selectionModel = d->mView->selectionModel();
176 if ( !selectionModel ) {
180 QModelIndex index = selectionModel->currentIndex();
181 if ( !index.isValid() ) {
190 QList<AgentInstance> list;
191 QItemSelectionModel *selectionModel = d->mView->selectionModel();
192 if ( !selectionModel ) {
196 const QModelIndexList indexes = selectionModel->selection().indexes();
198 foreach (
const QModelIndex &index, indexes ) {
216 AgentInstanceWidgetDelegate::AgentInstanceWidgetDelegate( QObject *parent )
217 : QAbstractItemDelegate( parent )
221 void AgentInstanceWidgetDelegate::paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
223 if ( !index.isValid() ) {
227 QStyle *style = QApplication::style();
228 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0);
230 QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();
231 const QString name = index.model()->data( index, Qt::DisplayRole ).toString();
236 QPixmap statusPixmap;
239 statusPixmap = s_icons->offlinePixmap;
241 statusPixmap = s_icons->readyPixmap;
243 statusPixmap = s_icons->syncPixmap;
245 statusPixmap = s_icons->errorPixmap;
249 statusMessage.append(QString::fromLatin1(
"(%1%)").arg(progress));
252 QRect innerRect = option.rect.adjusted( s_delegatePaddingSize, s_delegatePaddingSize, -s_delegatePaddingSize, -s_delegatePaddingSize );
254 const QSize decorationSize( KIconLoader::global()->currentSize( KIconLoader::Desktop ), KIconLoader::global()->currentSize( KIconLoader::Desktop ) );
255 const QSize statusIconSize = QSize(16,16);
257 QFont nameFont = option.font;
258 nameFont.setBold(
true);
260 QFont statusTextFont = option.font;
261 const QRect decorationRect( innerRect.left(), innerRect.top(), decorationSize.width(), innerRect.height() );
262 const QRect nameTextRect( decorationRect.topRight() + QPoint( 4, 0 ), innerRect.topRight() + QPoint( 0, innerRect.height() / 2) );
263 const QRect statusTextRect( decorationRect.bottomRight() + QPoint( 4, - innerRect.height()/2 ), innerRect.bottomRight() );
265 const QPixmap iconPixmap = icon.pixmap(decorationSize);
267 QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
268 if ( cg == QPalette::Normal && ! ( option.state & QStyle::State_Active ) ) {
269 cg = QPalette::Inactive;
272 if ( option.state & QStyle::State_Selected ) {
273 painter->setPen(option.palette.color( cg, QPalette::HighlightedText ) );
275 painter->setPen(option.palette.color( cg, QPalette::Text ) );
278 painter->drawPixmap( style->itemPixmapRect( decorationRect, Qt::AlignCenter, iconPixmap ), iconPixmap );
280 painter->setFont(nameFont);
281 painter->drawText(nameTextRect, Qt::AlignVCenter | Qt::AlignLeft, name);
283 painter->setFont(statusTextFont);
284 painter->drawText(statusTextRect.adjusted( statusIconSize.width() + 4, 0, 0, 0 ), Qt::AlignVCenter | Qt::AlignLeft, statusMessage );
285 painter->drawPixmap(style->itemPixmapRect( statusTextRect, Qt::AlignVCenter | Qt::AlignLeft, statusPixmap ), statusPixmap );
288 QSize AgentInstanceWidgetDelegate::sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
292 const int iconHeight = KIconLoader::global()->currentSize(KIconLoader::Desktop) + ( s_delegatePaddingSize*2 );
293 const int textHeight = option.fontMetrics.height() + qMax( option.fontMetrics.height(), 16 ) + ( s_delegatePaddingSize*2 );
295 return QSize( 1,qMax( iconHeight, textHeight ) );
300 #include "moc_agentinstancewidget.cpp"