00001
00008 #include "jobpropertydelegate.h"
00009 #include "jobpropertyitem.h"
00010
00011
00012 #include <QKeyEvent>
00013 #include <QApplication>
00014 #include <QPen>
00015 #include <QPainter>
00016 #include <QFont>
00017 #include <QLineEdit>
00018 #include <QAbstractItemView>
00019
00025 JobPropertyDelegate::JobPropertyDelegate(QObject *parent)
00026 : QItemDelegate(parent),
00027 m_syncing(false),
00028 m_lastEdited(0)
00029 {
00030 }
00031
00035 JobPropertyDelegate::~JobPropertyDelegate()
00036 {
00037 }
00038
00047 bool JobPropertyDelegate::eventFilter(QObject *object, QEvent *event)
00048 {
00049 QWidget *editor = qobject_cast<QWidget*>(object);
00050 if (editor && qobject_cast<QLineEdit*>(editor->parent()))
00051 editor = editor->parentWidget();
00052
00053 switch (event->type()) {
00054 case QEvent::KeyPress:
00055 case QEvent::KeyRelease:
00056 {
00057 QKeyEvent *ke = static_cast<QKeyEvent*>(event);
00058 if (!(ke->modifiers() & Qt::ControlModifier)
00059 && (ke->key() == Qt::Key_Up || ke->key() == Qt::Key_Down)) {
00060 event->ignore();
00061 return true;
00062 }
00063 if (object->metaObject()->className() == QLatin1String("QtKeySequenceEdit"))
00064 {
00065 event->ignore();
00066 return false;
00067 }
00068 } break;
00069
00070 case QEvent::FocusOut:
00071 if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor))
00072 {
00073 emit commitData(editor);
00074 emit closeEditor(editor);
00075 }
00076 return false;
00077
00078 default:
00079 break;
00080 }
00081
00082 return QItemDelegate::eventFilter(editor ? editor : object, event);
00083 }
00084
00092 void JobPropertyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt, const QModelIndex &index) const
00093 {
00094 QStyleOptionViewItem option = opt;
00095
00096 if (index.column() == 1)
00097 {
00098 option.state &= ~QStyle::State_Selected;
00099 }
00100
00101 option.state &= ~QStyle::State_HasFocus;
00102
00103 const QPen savedPen = painter->pen();
00104
00105 QItemDelegate::paint(painter, option, index);
00106
00107 const QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &option));
00108 painter->setPen(QPen(color));
00109 if (index.column() == 1 )
00110 {
00111 const int right = (option.direction == Qt::LeftToRight) ? option.rect.right() : option.rect.left();
00112 painter->drawLine(right, option.rect.y(), right, option.rect.bottom());
00113 }
00114 painter->drawLine(option.rect.x(), option.rect.bottom(),
00115 option.rect.right(), option.rect.bottom());
00116 painter->setPen(savedPen);
00117 }
00118
00125 QSize JobPropertyDelegate::sizeHint(const QStyleOptionViewItem &opt, const QModelIndex &index) const
00126 {
00127 return QItemDelegate::sizeHint(opt, index) + QSize(4, 4);
00128 }
00129
00130
00136 void JobPropertyDelegate::slotDestroyed(QObject *object)
00137 {
00138 if (m_lastEdited == object)
00139 {
00140 m_lastEdited = 0;
00141 emit editorClosed();
00142 }
00143 }
00144
00152 QWidget *JobPropertyDelegate::createEditor(QWidget *parent,
00153 const QStyleOptionViewItem &option,
00154 const QModelIndex &index) const
00155 {
00156 Q_UNUSED(option);
00157
00158 JobPropertyModel *model = const_cast<JobPropertyModel *>(static_cast<const JobPropertyModel *>(index.model()));
00159 const JobPropertyItem *property = model->getItem(index);
00160 if (property == 0)
00161 return 0;
00162
00163 QWidget *editor = 0;
00164
00165 if (!property->isReadOnly() && index.column() != 0)
00166 {
00167 editor = property->createEditor(parent, this, SLOT(sync()));
00168 editor->installEventFilter(const_cast<JobPropertyDelegate *>(this));
00169
00170 connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotDestroyed(QObject *)));
00171
00172 JobPropertyDelegate *that = const_cast<JobPropertyDelegate *>(this);
00173 if (!m_lastEdited)
00174 emit that->editorOpened();
00175 m_lastEdited = editor;
00176 }
00177 return editor;
00178 }
00179
00186 void JobPropertyDelegate::setEditorData(QWidget *editor,
00187 const QModelIndex &index) const
00188 {
00189 const QAbstractItemModel *model = index.model();
00190 JobPropertyItem *property = static_cast<const JobPropertyModel*>(model)->getItem(index);
00191 if (property)
00192 {
00193 property->updateEditorContents(editor);
00194 }
00195 }
00196
00204 void JobPropertyDelegate::setModelData(QWidget *editor,
00205 QAbstractItemModel *model,
00206 const QModelIndex &index) const
00207 {
00208 if (JobPropertyItem *property = static_cast<const JobPropertyModel*>(model)->getItem(index))
00209 {
00210 property->updateValue(editor);
00211 model->setData(index, property->data());
00212 }
00213 }
00214
00215
00219 void JobPropertyDelegate::sync()
00220 {
00221 m_syncing = true;
00222 QWidget *w = qobject_cast<QWidget*>(sender());
00223 if (w == 0)
00224 return;
00225 emit commitData(w);
00226 m_syncing = false;
00227 }
00228
00232 void JobPropertyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
00233 {
00234 QItemDelegate::updateEditorGeometry(editor, option, index);
00235 editor->setGeometry(editor->geometry().adjusted(0, 0, -1, -1));
00236 }
00237
00243 void JobPropertyDelegate::onCustomContextMenuRequested(const QPoint & pos)
00244 {
00245 QModelIndex idx = dynamic_cast<QAbstractItemView *>(parent())->indexAt(pos);
00246 JobPropertyModel *model = const_cast<JobPropertyModel *>(static_cast<const JobPropertyModel *>(idx.model()));
00247 if (model)
00248 {
00249 JobPropertyItem *jpi = model->getItem(idx);
00250
00251 if (jpi && jpi->hasContextMenu())
00252 jpi->createCustomContextMenu(dynamic_cast<QWidget *>(parent()), pos);
00253 }
00254 }