diff options
Diffstat (limited to 'src/gui/itemviews/qstyleditemdelegate.cpp')
-rw-r--r-- | src/gui/itemviews/qstyleditemdelegate.cpp | 765 |
1 files changed, 0 insertions, 765 deletions
diff --git a/src/gui/itemviews/qstyleditemdelegate.cpp b/src/gui/itemviews/qstyleditemdelegate.cpp deleted file mode 100644 index 931d870acb..0000000000 --- a/src/gui/itemviews/qstyleditemdelegate.cpp +++ /dev/null @@ -1,765 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qstyleditemdelegate.h" - -#ifndef QT_NO_ITEMVIEWS -#include <qabstractitemmodel.h> -#include <qapplication.h> -#include <qbrush.h> -#include <qlineedit.h> -#include <qtextedit.h> -#include <qplaintextedit.h> -#include <qpainter.h> -#include <qpalette.h> -#include <qpoint.h> -#include <qrect.h> -#include <qsize.h> -#include <qstyle.h> -#include <qdatetime.h> -#include <qstyleoption.h> -#include <qevent.h> -#include <qpixmap.h> -#include <qbitmap.h> -#include <qpixmapcache.h> -#include <qitemeditorfactory.h> -#include <private/qitemeditorfactory_p.h> -#include <qmetaobject.h> -#include <qtextlayout.h> -#include <private/qobject_p.h> -#include <private/qdnd_p.h> -#include <private/qtextengine_p.h> -#include <private/qlayoutengine_p.h> -#include <qdebug.h> -#include <qlocale.h> -#include <qdialog.h> -#include <qtableview.h> - -#include <limits.h> - -QT_BEGIN_NAMESPACE - -class QStyledItemDelegatePrivate : public QObjectPrivate -{ - Q_DECLARE_PUBLIC(QStyledItemDelegate) - -public: - QStyledItemDelegatePrivate() : factory(0) { } - - static const QWidget *widget(const QStyleOptionViewItem &option) - { - if (const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option)) - return v3->widget; - return 0; - } - - const QItemEditorFactory *editorFactory() const - { - return factory ? factory : QItemEditorFactory::defaultFactory(); - } - - void _q_commitDataAndCloseEditor(QWidget *editor) - { - Q_Q(QStyledItemDelegate); - emit q->commitData(editor); - emit q->closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); - } - QItemEditorFactory *factory; -}; - -/*! - \class QStyledItemDelegate - - \brief The QStyledItemDelegate class provides display and editing facilities for - data items from a model. - - \ingroup model-view - - \since 4.4 - - When displaying data from models in Qt item views, e.g., a - QTableView, the individual items are drawn by a delegate. Also, - when an item is edited, it provides an editor widget, which is - placed on top of the item view while editing takes place. - QStyledItemDelegate is the default delegate for all Qt item - views, and is installed upon them when they are created. - - The QStyledItemDelegate class is one of the \l{Model/View Classes} - and is part of Qt's \l{Model/View Programming}{model/view - framework}. The delegate allows the display and editing of items - to be developed independently from the model and view. - - The data of items in models are assigned an - \l{Qt::}{ItemDataRole}; each item can store a QVariant for each - role. QStyledItemDelegate implements display and editing for the - most common datatypes expected by users, including booleans, - integers, and strings. - - The data will be drawn differently depending on which role they - have in the model. The following table describes the roles and the - data types the delegate can handle for each of them. It is often - sufficient to ensure that the model returns appropriate data for - each of the roles to determine the appearance of items in views. - - \table - \header \o Role \o Accepted Types - \omit - \row \o \l Qt::AccessibleDescriptionRole \o QString - \row \o \l Qt::AccessibleTextRole \o QString - \endomit - \row \o \l Qt::BackgroundRole \o QBrush - \row \o \l Qt::BackgroundColorRole \o QColor (obsolete; use Qt::BackgroundRole instead) - \row \o \l Qt::CheckStateRole \o Qt::CheckState - \row \o \l Qt::DecorationRole \o QIcon, QPixmap, QImage and QColor - \row \o \l Qt::DisplayRole \o QString and types with a string representation - \row \o \l Qt::EditRole \o See QItemEditorFactory for details - \row \o \l Qt::FontRole \o QFont - \row \o \l Qt::SizeHintRole \o QSize - \omit - \row \o \l Qt::StatusTipRole \o - \endomit - \row \o \l Qt::TextAlignmentRole \o Qt::Alignment - \row \o \l Qt::ForegroundRole \o QBrush - \row \o \l Qt::TextColorRole \o QColor (obsolete; use Qt::ForegroundRole instead) - \omit - \row \o \l Qt::ToolTipRole - \row \o \l Qt::WhatsThisRole - \endomit - \endtable - - Editors are created with a QItemEditorFactory; a default static - instance provided by QItemEditorFactory is installed on all item - delegates. You can set a custom factory using - setItemEditorFactory() or set a new default factory with - QItemEditorFactory::setDefaultFactory(). It is the data stored in - the item model with the \l{Qt::}{EditRole} that is edited. See the - QItemEditorFactory class for a more high-level introduction to - item editor factories. The \l{Color Editor Factory Example}{Color - Editor Factory} example shows how to create custom editors with a - factory. - - \section1 Subclassing QStyledItemDelegate - - If the delegate does not support painting of the data types you - need or you want to customize the drawing of items, you need to - subclass QStyledItemDelegate, and reimplement paint() and possibly - sizeHint(). The paint() function is called individually for each - item, and with sizeHint(), you can specify the hint for each - of them. - - When reimplementing paint(), one would typically handle the - datatypes one would like to draw and use the superclass - implementation for other types. - - The painting of check box indicators are performed by the current - style. The style also specifies the size and the bounding - rectangles in which to draw the data for the different data roles. - The bounding rectangle of the item itself is also calculated by - the style. When drawing already supported datatypes, it is - therefore a good idea to ask the style for these bounding - rectangles. The QStyle class description describes this in - more detail. - - If you wish to change any of the bounding rectangles calculated by - the style or the painting of check box indicators, you can - subclass QStyle. Note, however, that the size of the items can - also be affected by reimplementing sizeHint(). - - It is possible for a custom delegate to provide editors - without the use of an editor item factory. In this case, the - following virtual functions must be reimplemented: - - \list - \o createEditor() returns the widget used to change data from the model - and can be reimplemented to customize editing behavior. - \o setEditorData() provides the widget with data to manipulate. - \o updateEditorGeometry() ensures that the editor is displayed correctly - with respect to the item view. - \o setModelData() returns updated data to the model. - \endlist - - The \l{Star Delegate Example}{Star Delegate} example creates - editors by reimplementing these methods. - - \section1 QStyledItemDelegate vs. QItemDelegate - - Since Qt 4.4, there are two delegate classes: QItemDelegate and - QStyledItemDelegate. However, the default delegate is QStyledItemDelegate. - These two classes are independent alternatives to painting and providing - editors for items in views. The difference between them is that - QStyledItemDelegate uses the current style to paint its items. We therefore - recommend using QStyledItemDelegate as the base class when implementing - custom delegates or when working with Qt style sheets. The code required - for either class should be equal unless the custom delegate needs to use - the style for drawing. - - If you wish to customize the painting of item views, you should - implement a custom style. Please see the QStyle class - documentation for details. - - \sa {Delegate Classes}, QItemDelegate, QAbstractItemDelegate, QStyle, - {Spin Box Delegate Example}, {Star Delegate Example}, {Color - Editor Factory Example} -*/ - - -/*! - Constructs an item delegate with the given \a parent. -*/ -QStyledItemDelegate::QStyledItemDelegate(QObject *parent) - : QAbstractItemDelegate(*new QStyledItemDelegatePrivate(), parent) -{ -} - -/*! - Destroys the item delegate. -*/ -QStyledItemDelegate::~QStyledItemDelegate() -{ -} - -/*! - This function returns the string that the delegate will use to display the - Qt::DisplayRole of the model in \a locale. \a value is the value of the Qt::DisplayRole - provided by the model. - - The default implementation uses the QLocale::toString to convert \a value into - a QString. - - This function is not called for empty model indices, i.e., indices for which - the model returns an invalid QVariant. - - \sa QAbstractItemModel::data() -*/ -QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale& locale) const -{ - QString text; - switch (value.userType()) { - case QMetaType::Float: - case QVariant::Double: - text = locale.toString(value.toReal()); - break; - case QVariant::Int: - case QVariant::LongLong: - text = locale.toString(value.toLongLong()); - break; - case QVariant::UInt: - case QVariant::ULongLong: - text = locale.toString(value.toULongLong()); - break; - case QVariant::Date: - text = locale.toString(value.toDate(), QLocale::ShortFormat); - break; - case QVariant::Time: - text = locale.toString(value.toTime(), QLocale::ShortFormat); - break; - case QVariant::DateTime: - text = locale.toString(value.toDateTime().date(), QLocale::ShortFormat); - text += QLatin1Char(' '); - text += locale.toString(value.toDateTime().time(), QLocale::ShortFormat); - break; - default: - // convert new lines into line separators - text = value.toString(); - for (int i = 0; i < text.count(); ++i) { - if (text.at(i) == QLatin1Char('\n')) - text[i] = QChar::LineSeparator; - } - break; - } - return text; -} - -/*! - Initialize \a option with the values using the index \a index. This method - is useful for subclasses when they need a QStyleOptionViewItem, but don't want - to fill in all the information themselves. This function will check the version - of the QStyleOptionViewItem and fill in the additional values for a - QStyleOptionViewItemV2, QStyleOptionViewItemV3 and QStyleOptionViewItemV4. - - \sa QStyleOption::initFrom() -*/ -void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, - const QModelIndex &index) const -{ - QVariant value = index.data(Qt::FontRole); - if (value.isValid() && !value.isNull()) { - option->font = qvariant_cast<QFont>(value).resolve(option->font); - option->fontMetrics = QFontMetrics(option->font); - } - - value = index.data(Qt::TextAlignmentRole); - if (value.isValid() && !value.isNull()) - option->displayAlignment = Qt::Alignment(value.toInt()); - - value = index.data(Qt::ForegroundRole); - if (value.canConvert<QBrush>()) - option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value)); - - if (QStyleOptionViewItemV4 *v4 = qstyleoption_cast<QStyleOptionViewItemV4 *>(option)) { - v4->index = index; - QVariant value = index.data(Qt::CheckStateRole); - if (value.isValid() && !value.isNull()) { - v4->features |= QStyleOptionViewItemV2::HasCheckIndicator; - v4->checkState = static_cast<Qt::CheckState>(value.toInt()); - } - - value = index.data(Qt::DecorationRole); - if (value.isValid() && !value.isNull()) { - v4->features |= QStyleOptionViewItemV2::HasDecoration; - switch (value.type()) { - case QVariant::Icon: { - v4->icon = qvariant_cast<QIcon>(value); - QIcon::Mode mode; - if (!(option->state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (option->state & QStyle::State_Selected) - mode = QIcon::Selected; - else - mode = QIcon::Normal; - QIcon::State state = option->state & QStyle::State_Open ? QIcon::On : QIcon::Off; - v4->decorationSize = v4->icon.actualSize(option->decorationSize, mode, state); - break; - } - case QVariant::Color: { - QPixmap pixmap(option->decorationSize); - pixmap.fill(qvariant_cast<QColor>(value)); - v4->icon = QIcon(pixmap); - break; - } - case QVariant::Image: { - QImage image = qvariant_cast<QImage>(value); - v4->icon = QIcon(QPixmap::fromImage(image)); - v4->decorationSize = image.size(); - break; - } - case QVariant::Pixmap: { - QPixmap pixmap = qvariant_cast<QPixmap>(value); - v4->icon = QIcon(pixmap); - v4->decorationSize = pixmap.size(); - break; - } - default: - break; - } - } - - value = index.data(Qt::DisplayRole); - if (value.isValid() && !value.isNull()) { - v4->features |= QStyleOptionViewItemV2::HasDisplay; - v4->text = displayText(value, v4->locale); - } - - v4->backgroundBrush = qvariant_cast<QBrush>(index.data(Qt::BackgroundRole)); - } -} - -/*! - Renders the delegate using the given \a painter and style \a option for - the item specified by \a index. - - This function paints the item using the view's QStyle. - - When reimplementing paint in a subclass. Use the initStyleOption() - to set up the \a option in the same way as the - QStyledItemDelegate; the option will always be an instance of - QStyleOptionViewItemV4. Please see its class description for - information on its contents. - - Whenever possible, use the \a option while painting. - Especially its \l{QStyleOption::}{rect} variable to decide - where to draw and its \l{QStyleOption::}{state} to determine - if it is enabled or selected. - - After painting, you should ensure that the painter is returned to - its the state it was supplied in when this function was called. - For example, it may be useful to call QPainter::save() before - painting and QPainter::restore() afterwards. - - \sa QItemDelegate::paint(), QStyle::drawControl(), QStyle::CE_ItemViewItem -*/ -void QStyledItemDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_ASSERT(index.isValid()); - - QStyleOptionViewItemV4 opt = option; - initStyleOption(&opt, index); - - const QWidget *widget = QStyledItemDelegatePrivate::widget(option); - QStyle *style = widget ? widget->style() : QApplication::style(); - style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget); -} - -/*! - Returns the size needed by the delegate to display the item - specified by \a index, taking into account the style information - provided by \a option. - - This function uses the view's QStyle to determine the size of the - item. - - \sa QStyle::sizeFromContents(), QStyle::CT_ItemViewItem -*/ -QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - QVariant value = index.data(Qt::SizeHintRole); - if (value.isValid()) - return qvariant_cast<QSize>(value); - - QStyleOptionViewItemV4 opt = option; - initStyleOption(&opt, index); - const QWidget *widget = QStyledItemDelegatePrivate::widget(option); - QStyle *style = widget ? widget->style() : QApplication::style(); - return style->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), widget); -} - -/*! - Returns the widget used to edit the item specified by \a index - for editing. The \a parent widget and style \a option are used to - control how the editor widget appears. - - \sa QAbstractItemDelegate::createEditor() -*/ -QWidget *QStyledItemDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &, - const QModelIndex &index) const -{ - Q_D(const QStyledItemDelegate); - if (!index.isValid()) - return 0; - QVariant::Type t = static_cast<QVariant::Type>(index.data(Qt::EditRole).userType()); - return d->editorFactory()->createEditor(t, parent); -} - -/*! - Sets the data to be displayed and edited by the \a editor from the - data model item specified by the model \a index. - - The default implementation stores the data in the \a editor - widget's \l {Qt's Property System} {user property}. - - \sa QMetaProperty::isUser() -*/ -void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const -{ -#ifdef QT_NO_PROPERTIES - Q_UNUSED(editor); - Q_UNUSED(index); -#else - Q_D(const QStyledItemDelegate); - QVariant v = index.data(Qt::EditRole); - QByteArray n = editor->metaObject()->userProperty().name(); - - // ### Qt 5: remove - // A work-around for missing "USER true" in qdatetimeedit.h for - // QTimeEdit's time property and QDateEdit's date property. - // It only triggers if the default user property "dateTime" is - // reported for QTimeEdit and QDateEdit. - if (n == "dateTime") { - if (editor->inherits("QTimeEdit")) - n = "time"; - else if (editor->inherits("QDateEdit")) - n = "date"; - } - - // ### Qt 5: give QComboBox a USER property - if (n.isEmpty() && editor->inherits("QComboBox")) - n = d->editorFactory()->valuePropertyName(static_cast<QVariant::Type>(v.userType())); - if (!n.isEmpty()) { - if (!v.isValid()) - v = QVariant(editor->property(n).userType(), (const void *)0); - editor->setProperty(n, v); - } -#endif -} - -/*! - Gets data from the \a editor widget and stores it in the specified - \a model at the item \a index. - - The default implementation gets the value to be stored in the data - model from the \a editor widget's \l {Qt's Property System} {user - property}. - - \sa QMetaProperty::isUser() -*/ -void QStyledItemDelegate::setModelData(QWidget *editor, - QAbstractItemModel *model, - const QModelIndex &index) const -{ -#ifdef QT_NO_PROPERTIES - Q_UNUSED(model); - Q_UNUSED(editor); - Q_UNUSED(index); -#else - Q_D(const QStyledItemDelegate); - Q_ASSERT(model); - Q_ASSERT(editor); - QByteArray n = editor->metaObject()->userProperty().name(); - if (n.isEmpty()) - n = d->editorFactory()->valuePropertyName( - static_cast<QVariant::Type>(model->data(index, Qt::EditRole).userType())); - if (!n.isEmpty()) - model->setData(index, editor->property(n), Qt::EditRole); -#endif -} - -/*! - Updates the \a editor for the item specified by \a index - according to the style \a option given. -*/ -void QStyledItemDelegate::updateEditorGeometry(QWidget *editor, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - if (!editor) - return; - Q_ASSERT(index.isValid()); - const QWidget *widget = QStyledItemDelegatePrivate::widget(option); - - QStyleOptionViewItemV4 opt = option; - initStyleOption(&opt, index); - // let the editor take up all available space - //if the editor is not a QLineEdit - //or it is in a QTableView -#if !defined(QT_NO_TABLEVIEW) && !defined(QT_NO_LINEEDIT) - if (qobject_cast<QExpandingLineEdit*>(editor) && !qobject_cast<const QTableView*>(widget)) - opt.showDecorationSelected = editor->style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, 0, editor); - else -#endif - opt.showDecorationSelected = true; - - QStyle *style = widget ? widget->style() : QApplication::style(); - QRect geom = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, widget); - if ( editor->layoutDirection() == Qt::RightToLeft) { - const int delta = qSmartMinSize(editor).width() - geom.width(); - if (delta > 0) { - //we need to widen the geometry - geom.adjust(-delta, 0, 0, 0); - } - } - - editor->setGeometry(geom); -} - -/*! - Returns the editor factory used by the item delegate. - If no editor factory is set, the function will return null. - - \sa setItemEditorFactory() -*/ -QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const -{ - Q_D(const QStyledItemDelegate); - return d->factory; -} - -/*! - Sets the editor factory to be used by the item delegate to be the \a factory - specified. If no editor factory is set, the item delegate will use the - default editor factory. - - \sa itemEditorFactory() -*/ -void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory) -{ - Q_D(QStyledItemDelegate); - d->factory = factory; -} - - -/*! - \fn bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event) - - Returns true if the given \a editor is a valid QWidget and the - given \a event is handled; otherwise returns false. The following - key press events are handled by default: - - \list - \o \gui Tab - \o \gui Backtab - \o \gui Enter - \o \gui Return - \o \gui Esc - \endlist - - In the case of \gui Tab, \gui Backtab, \gui Enter and \gui Return - key press events, the \a editor's data is comitted to the model - and the editor is closed. If the \a event is a \gui Tab key press - the view will open an editor on the next item in the - view. Likewise, if the \a event is a \gui Backtab key press the - view will open an editor on the \e previous item in the view. - - If the event is a \gui Esc key press event, the \a editor is - closed \e without committing its data. - - \sa commitData(), closeEditor() -*/ -bool QStyledItemDelegate::eventFilter(QObject *object, QEvent *event) -{ - QWidget *editor = qobject_cast<QWidget*>(object); - if (!editor) - return false; - if (event->type() == QEvent::KeyPress) { - switch (static_cast<QKeyEvent *>(event)->key()) { - case Qt::Key_Tab: - emit commitData(editor); - emit closeEditor(editor, QAbstractItemDelegate::EditNextItem); - return true; - case Qt::Key_Backtab: - emit commitData(editor); - emit closeEditor(editor, QAbstractItemDelegate::EditPreviousItem); - return true; - case Qt::Key_Enter: - case Qt::Key_Return: -#ifndef QT_NO_TEXTEDIT - if (qobject_cast<QTextEdit *>(editor) || qobject_cast<QPlainTextEdit *>(editor)) - return false; // don't filter enter key events for QTextEdit - // We want the editor to be able to process the key press - // before committing the data (e.g. so it can do - // validation/fixup of the input). -#endif // QT_NO_TEXTEDIT -#ifndef QT_NO_LINEEDIT - if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) - if (!e->hasAcceptableInput()) - return false; -#endif // QT_NO_LINEEDIT - QMetaObject::invokeMethod(this, "_q_commitDataAndCloseEditor", - Qt::QueuedConnection, Q_ARG(QWidget*, editor)); - return false; - case Qt::Key_Escape: - // don't commit data - emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); - break; - default: - return false; - } - if (editor->parentWidget()) - editor->parentWidget()->setFocus(); - return true; - } else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) { - //the Hide event will take care of he editors that are in fact complete dialogs - if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { - QWidget *w = QApplication::focusWidget(); - while (w) { // don't worry about focus changes internally in the editor - if (w == editor) - return false; - w = w->parentWidget(); - } -#ifndef QT_NO_DRAGANDDROP - // The window may lose focus during an drag operation. - // i.e when dragging involves the taskbar on Windows. - if (QDragManager::self() && QDragManager::self()->object != 0) - return false; -#endif - - emit commitData(editor); - emit closeEditor(editor, NoHint); - } - } else if (event->type() == QEvent::ShortcutOverride) { - if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { - event->accept(); - return true; - } - } - return false; -} - -/*! - \reimp -*/ -bool QStyledItemDelegate::editorEvent(QEvent *event, - QAbstractItemModel *model, - const QStyleOptionViewItem &option, - const QModelIndex &index) -{ - Q_ASSERT(event); - Q_ASSERT(model); - - // make sure that the item is checkable - Qt::ItemFlags flags = model->flags(index); - if (!(flags & Qt::ItemIsUserCheckable) || !(option.state & QStyle::State_Enabled) - || !(flags & Qt::ItemIsEnabled)) - return false; - - // make sure that we have a check state - QVariant value = index.data(Qt::CheckStateRole); - if (!value.isValid()) - return false; - - const QWidget *widget = QStyledItemDelegatePrivate::widget(option); - QStyle *style = widget ? widget->style() : QApplication::style(); - - // make sure that we have the right event type - if ((event->type() == QEvent::MouseButtonRelease) - || (event->type() == QEvent::MouseButtonDblClick) - || (event->type() == QEvent::MouseButtonPress)) { - QStyleOptionViewItemV4 viewOpt(option); - initStyleOption(&viewOpt, index); - QRect checkRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, widget); - QMouseEvent *me = static_cast<QMouseEvent*>(event); - if (me->button() != Qt::LeftButton || !checkRect.contains(me->pos())) - return false; - - if ((event->type() == QEvent::MouseButtonPress) - || (event->type() == QEvent::MouseButtonDblClick)) - return true; - - } else if (event->type() == QEvent::KeyPress) { - if (static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space - && static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select) - return false; - } else { - return false; - } - - Qt::CheckState state = (static_cast<Qt::CheckState>(value.toInt()) == Qt::Checked - ? Qt::Unchecked : Qt::Checked); - return model->setData(index, state, Qt::CheckStateRole); -} - -QT_END_NAMESPACE - -#include "moc_qstyleditemdelegate.cpp" - -#endif // QT_NO_ITEMVIEWS |