20 #include "agenttypewidget.h"
24 #include <QApplication>
25 #include <QHBoxLayout>
29 #include "agentfilterproxymodel.h"
30 #include "agenttype.h"
31 #include "agenttypemodel.h"
39 class AgentTypeWidgetDelegate :
public QAbstractItemDelegate
42 AgentTypeWidgetDelegate( QObject *parent = 0 );
44 virtual void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
45 virtual QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const;
48 void drawFocus( QPainter*,
const QStyleOptionViewItem&,
const QRect& )
const;
53 using Akonadi::Internal::AgentTypeWidgetDelegate;
59 class AgentTypeWidget::Private
67 void currentAgentTypeChanged(
const QModelIndex&,
const QModelIndex& );
69 void typeActivated(
const QModelIndex &index )
71 if ( index.flags() & ( Qt::ItemIsSelectable | Qt::ItemIsEnabled ) ) {
72 emit mParent->activated();
78 AgentTypeModel *mModel;
79 AgentFilterProxyModel *proxyModel;
82 void AgentTypeWidget::Private::currentAgentTypeChanged(
const QModelIndex ¤tIndex,
const QModelIndex &previousIndex )
84 AgentType currentType;
85 if ( currentIndex.isValid() ) {
89 AgentType previousType;
90 if ( previousIndex.isValid() ) {
94 emit mParent->currentChanged( currentType, previousType );
98 : QWidget( parent ), d( new Private( this ) )
100 QHBoxLayout *layout =
new QHBoxLayout(
this );
101 layout->setMargin( 0 );
103 d->mView =
new QListView(
this );
104 d->mView->setItemDelegate(
new AgentTypeWidgetDelegate( d->mView ) );
105 d->mView->setVerticalScrollMode( QAbstractItemView::ScrollPerPixel );
106 d->mView->setAlternatingRowColors(
true );
107 layout->addWidget( d->mView );
111 d->proxyModel->setSourceModel( d->mModel );
112 d->proxyModel->sort( 0 );
113 d->mView->setModel( d->proxyModel );
115 d->mView->selectionModel()->setCurrentIndex( d->mView->model()->index( 0, 0 ), QItemSelectionModel::Select );
116 d->mView->scrollTo( d->mView->model()->index( 0, 0 ) );
117 connect( d->mView->selectionModel(), SIGNAL(
currentChanged(QModelIndex,QModelIndex)),
118 this, SLOT(currentAgentTypeChanged(QModelIndex,QModelIndex)) );
119 connect( d->mView, SIGNAL(
activated(QModelIndex)),
120 SLOT(typeActivated(QModelIndex)) );
130 QItemSelectionModel *selectionModel = d->mView->selectionModel();
131 if ( !selectionModel ) {
135 QModelIndex index = selectionModel->currentIndex();
136 if ( !index.isValid() ) {
145 return d->proxyModel;
152 AgentTypeWidgetDelegate::AgentTypeWidgetDelegate( QObject *parent )
153 : QAbstractItemDelegate( parent )
157 void AgentTypeWidgetDelegate::paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
159 if ( !index.isValid() ) {
163 painter->setRenderHint( QPainter::Antialiasing );
165 const QString name = index.model()->data( index, Qt::DisplayRole ).toString();
168 const QVariant data = index.model()->data( index, Qt::DecorationRole );
171 if ( data.isValid() && data.type() == QVariant::Icon ) {
172 pixmap = qvariant_cast<QIcon>( data ).pixmap( 64, 64 );
175 const QFont oldFont = painter->font();
176 QFont boldFont( oldFont );
177 boldFont.setBold(
true );
178 painter->setFont( boldFont );
179 QFontMetrics fm = painter->fontMetrics();
180 int hn = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, name ).height();
181 int wn = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, name ).width();
182 painter->setFont( oldFont );
184 fm = painter->fontMetrics();
185 int hc = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, comment ).height();
186 int wc = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, comment ).width();
187 int wp = pixmap.width();
189 QStyleOptionViewItemV4 opt( option );
190 opt.showDecorationSelected =
true;
191 QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &opt, painter );
193 QPen pen = painter->pen();
194 QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
195 ? QPalette::Normal : QPalette::Disabled;
196 if ( cg == QPalette::Normal && !( option.state & QStyle::State_Active ) ) {
197 cg = QPalette::Inactive;
199 if ( option.state & QStyle::State_Selected ) {
200 painter->setPen( option.palette.color( cg, QPalette::HighlightedText ) );
202 painter->setPen( option.palette.color( cg, QPalette::Text ) );
205 QFont font = painter->font();
206 painter->setFont( option.font );
208 painter->drawPixmap( option.rect.x() + 5, option.rect.y() + 5, pixmap );
210 painter->setFont( boldFont );
211 if ( !name.isEmpty() ) {
212 painter->drawText( option.rect.x() + 5 + wp + 5, option.rect.y() + 7, wn, hn, Qt::AlignLeft, name );
214 painter->setFont( oldFont );
216 if ( !comment.isEmpty() ) {
217 painter->drawText( option.rect.x() + 5 + wp + 5, option.rect.y() + 7 + hn, wc, hc, Qt::AlignLeft, comment );
220 painter->setPen( pen );
222 drawFocus( painter, option, option.rect );
225 QSize AgentTypeWidgetDelegate::sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
227 if ( !index.isValid() ) {
228 return QSize( 0, 0 );
231 const QString name = index.model()->data( index, Qt::DisplayRole ).toString();
234 QFontMetrics fm = option.fontMetrics;
235 int hn = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, name ).height();
236 int wn = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, name ).width();
237 int hc = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, comment ).height();
238 int wc = fm.boundingRect( 0, 0, 0, 0, Qt::AlignLeft, comment ).width();
243 if ( !name.isEmpty() ) {
245 width = qMax( width, wn );
248 if ( !comment.isEmpty() ) {
250 width = qMax( width, wc );
253 height = qMax( height, 64 ) + 10;
256 return QSize( width, height );
259 void AgentTypeWidgetDelegate::drawFocus( QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &rect )
const
261 if ( option.state & QStyle::State_HasFocus ) {
262 QStyleOptionFocusRect o;
263 o.QStyleOption::operator=( option );
265 o.state |= QStyle::State_KeyboardFocusChange;
266 QPalette::ColorGroup cg = ( option.state & QStyle::State_Enabled )
267 ? QPalette::Normal : QPalette::Disabled;
268 o.backgroundColor = option.palette.color( cg, ( option.state & QStyle::State_Selected )
269 ? QPalette::Highlight : QPalette::Background );
270 QApplication::style()->drawPrimitive( QStyle::PE_FrameFocusRect, &o, painter );
276 #include "moc_agenttypewidget.cpp"
A representation of an agent type.
A description of the agent type.
Provides a data model for agent types.
A proxy model for filtering AgentType or AgentInstance.