20#include "agenttypewidget.h"
24#include <QApplication>
29#include "agentfilterproxymodel.h"
31#include "agenttypemodel.h"
39class 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;
53using Akonadi::Internal::AgentTypeWidgetDelegate;
58class AgentTypeWidget::Private
61 Private(AgentTypeWidget *parent)
66 void currentAgentTypeChanged(
const QModelIndex &,
const QModelIndex &);
68 void typeActivated(
const QModelIndex &index)
70 if (index.flags() & (Qt::ItemIsSelectable | Qt::ItemIsEnabled)) {
71 emit mParent->activated();
75 AgentTypeWidget *mParent;
77 AgentTypeModel *mModel;
78 AgentFilterProxyModel *proxyModel;
81void AgentTypeWidget::Private::currentAgentTypeChanged(
const QModelIndex ¤tIndex,
const QModelIndex &previousIndex)
83 AgentType currentType;
84 if (currentIndex.isValid()) {
88 AgentType previousType;
89 if (previousIndex.isValid()) {
93 emit mParent->currentChanged(currentType, previousType);
98 , 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;
152AgentTypeWidgetDelegate::AgentTypeWidgetDelegate(QObject *parent)
153 : QAbstractItemDelegate(parent)
157void 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);
225QSize AgentTypeWidgetDelegate::sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index)
const
227 if (!index.isValid()) {
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);
259void 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 proxy model for filtering AgentType or AgentInstance.
Provides a data model for agent types.
@ TypeRole
The agent type itself.
@ DescriptionRole
A description of the agent type.
A representation of an agent type.
FreeBusyManager::Singleton.