23 #include "kwidgetitemdelegate_p.h"
29 #include <QHoverEvent>
30 #include <QFocusEvent>
38 #include <QApplication>
39 #include <QStyleOption>
40 #include <QPaintEngine>
41 #include <QCoreApplication>
42 #include <QAbstractItemView>
43 #include <QAbstractProxyModel>
46 #include "kwidgetitemdelegatepool_p.h"
58 , widgetPool(new KWidgetItemDelegatePool(q))
61 , viewDestroyed(false)
66 KWidgetItemDelegatePrivate::~KWidgetItemDelegatePrivate()
69 widgetPool->fullClear();
74 void KWidgetItemDelegatePrivate::_k_slotRowsInserted(
const QModelIndex &parent,
int start,
int end)
79 updateRowRange(parent, start, model->rowCount(parent),
false);
82 void KWidgetItemDelegatePrivate::_k_slotRowsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end)
84 updateRowRange(parent, start, end,
true);
87 void KWidgetItemDelegatePrivate::_k_slotRowsRemoved(
const QModelIndex &parent,
int start,
int end)
92 updateRowRange(parent, start, model->rowCount(parent),
false);
95 void KWidgetItemDelegatePrivate::_k_slotDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight)
97 for (
int i = topLeft.row(); i <= bottomRight.row(); ++i) {
98 for (
int j = topLeft.column(); j <= bottomRight.column(); ++j) {
99 const QModelIndex index = model->index(i, j, topLeft.parent());
100 widgetPool->findWidgets(index, optionView(index));
105 void KWidgetItemDelegatePrivate::_k_slotLayoutChanged()
107 foreach (
QWidget *widget, widgetPool->invalidIndexesWidgets()) {
108 widget->setVisible(
false);
110 QTimer::singleShot(0,
this, SLOT(initializeModel()));
113 void KWidgetItemDelegatePrivate::_k_slotModelReset()
115 widgetPool->fullClear();
116 QTimer::singleShot(0,
this, SLOT(initializeModel()));
119 void KWidgetItemDelegatePrivate::_k_slotSelectionChanged(
const QItemSelection &selected,
const QItemSelection &deselected)
121 foreach (
const QModelIndex &index, selected.indexes()) {
122 widgetPool->findWidgets(index, optionView(index));
124 foreach (
const QModelIndex &index, deselected.indexes()) {
125 widgetPool->findWidgets(index, optionView(index));
129 void KWidgetItemDelegatePrivate::updateRowRange(
const QModelIndex &parent,
int start,
int end,
bool isRemoving)
133 for (
int j = 0; j < model->columnCount(parent); ++j) {
134 const QModelIndex index = model->index(i, j, parent);
135 QList<QWidget*> widgetList = widgetPool->findWidgets(index, optionView(index), isRemoving ? KWidgetItemDelegatePool::NotUpdateWidgets
136 : KWidgetItemDelegatePool::UpdateWidgets);
138 widgetPool->d->allocatedWidgets.removeAll(widgetList);
139 foreach (
QWidget *widget, widgetList) {
140 const QModelIndex idx = widgetPool->d->widgetInIndex[widget];
141 widgetPool->d->usedWidgets.remove(idx);
142 widgetPool->d->widgetInIndex.remove(widget);
151 inline QStyleOptionViewItemV4 KWidgetItemDelegatePrivate::optionView(
const QModelIndex &index)
153 QStyleOptionViewItemV4 optionView;
154 optionView.initFrom(itemView->viewport());
155 optionView.rect = itemView->visualRect(index);
156 optionView.decorationSize = itemView->iconSize();
160 void KWidgetItemDelegatePrivate::initializeModel(
const QModelIndex &parent)
165 for (
int i = 0; i < model->rowCount(parent); ++i) {
166 for (
int j = 0; j < model->columnCount(parent); ++j) {
167 const QModelIndex index = model->index(i, j, parent);
168 if (index.isValid()) {
169 widgetPool->findWidgets(index, optionView(index));
174 const QModelIndex index = model->index(i, 0, parent);
175 if (index.isValid() && model->hasChildren(index)) {
176 initializeModel(index);
183 : QAbstractItemDelegate(parent)
184 , d(new KWidgetItemDelegatePrivate(this))
188 itemView->setMouseTracking(
true);
189 itemView->viewport()->setAttribute(Qt::WA_Hover);
193 itemView->viewport()->installEventFilter(d);
194 itemView->installEventFilter(d);
196 if(qobject_cast<QTreeView*>(itemView)) {
197 connect(itemView, SIGNAL(collapsed(QModelIndex)),
198 d, SLOT(initializeModel()));
199 connect(itemView, SIGNAL(expanded(QModelIndex)),
200 d, SLOT(initializeModel()));
216 const QPersistentModelIndex idx = d->widgetPool->d->widgetInIndex.value(QApplication::focusWidget());
221 const QPoint pos = d->itemView->viewport()->mapFromGlobal(QCursor::pos());
222 return d->itemView->indexAt(pos);
225 #ifndef KDE_NO_DEPRECATED
227 const QPersistentModelIndex &index)
const
236 bool KWidgetItemDelegatePrivate::eventFilter(
QObject *watched, QEvent *event)
238 if (event->type() == QEvent::Destroy) {
243 if (watched == itemView) {
244 viewDestroyed =
true;
251 if (model != itemView->model()) {
253 disconnect(model, SIGNAL(rowsInserted(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsInserted(QModelIndex,
int,
int)));
254 disconnect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsAboutToBeRemoved(QModelIndex,
int,
int)));
255 disconnect(model, SIGNAL(rowsRemoved(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsRemoved(QModelIndex,
int,
int)));
256 disconnect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), q, SLOT(_k_slotDataChanged(QModelIndex,QModelIndex)));
257 disconnect(model, SIGNAL(layoutChanged()), q, SLOT(_k_slotLayoutChanged()));
258 disconnect(model, SIGNAL(modelReset()), q, SLOT(_k_slotModelReset()));
260 model = itemView->model();
261 connect(model, SIGNAL(rowsInserted(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsInserted(QModelIndex,
int,
int)));
262 connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsAboutToBeRemoved(QModelIndex,
int,
int)));
263 connect(model, SIGNAL(rowsRemoved(QModelIndex,
int,
int)), q, SLOT(_k_slotRowsRemoved(QModelIndex,
int,
int)));
264 connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), q, SLOT(_k_slotDataChanged(QModelIndex,QModelIndex)));
265 connect(model, SIGNAL(layoutChanged()), q, SLOT(_k_slotLayoutChanged()));
266 connect(model, SIGNAL(modelReset()), q, SLOT(_k_slotModelReset()));
267 QTimer::singleShot(0,
this, SLOT(initializeModel()));
270 if (selectionModel != itemView->selectionModel()) {
271 if (selectionModel) {
272 disconnect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), q, SLOT(_k_slotSelectionChanged(QItemSelection,QItemSelection)));
274 selectionModel = itemView->selectionModel();
275 connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), q, SLOT(_k_slotSelectionChanged(QItemSelection,QItemSelection)));
276 QTimer::singleShot(0,
this, SLOT(initializeModel()));
279 switch (event->type()) {
282 if (!qobject_cast<QAbstractItemView*>(watched)) {
283 QTimer::singleShot(0,
this, SLOT(initializeModel()));
286 case QEvent::FocusIn:
287 case QEvent::FocusOut:
288 if (qobject_cast<QAbstractItemView*>(watched)) {
289 foreach (
const QModelIndex &index, selectionModel->selectedIndexes()) {
290 if (index.isValid()) {
291 widgetPool->findWidgets(index, optionView(index));
299 return QObject::eventFilter(watched, event);
305 widget->setProperty(
"goya:blockedEventTypes", qVariantFromValue(types));
310 return widget->property(
"goya:blockedEventTypes").value<QList<QEvent::Type> >();
313 #include "kwidgetitemdelegate.moc"
314 #include "kwidgetitemdelegate_p.moc"