Public Member Functions | Protected Member Functions

QmitkPropertyDelegate Class Reference

Own includes. More...

#include <QmitkPropertyDelegate.h>

List of all members.

Public Member Functions

 QmitkPropertyDelegate (QObject *parent=0)
void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QWidget * createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
void setEditorData (QWidget *editor, const QModelIndex &index) const
void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
void updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
 Fit an editor to some geometry (overwritten from QItemDelegate)

Protected Member Functions

bool eventFilter (QObject *o, QEvent *e)

Detailed Description

Own includes.

Toolkit includes. Forward declarations.

An item delegate for rendering and editing mitk::Properties in a QTableView.

See also:
QmitkPropertiesTableModel

Definition at line 34 of file QmitkPropertyDelegate.h.


Constructor & Destructor Documentation

QmitkPropertyDelegate::QmitkPropertyDelegate ( QObject *  parent = 0 )

Creates a new PropertyDelegate.

Definition at line 39 of file QmitkPropertyDelegate.cpp.

{
}

Member Function Documentation

QWidget * QmitkPropertyDelegate::createEditor ( QWidget *  parent,
const QStyleOptionViewItem &  option,
const QModelIndex &  index 
) const

Create an editor for a specific property (overwritten from QItemDelegate)

Definition at line 73 of file QmitkPropertyDelegate.cpp.

References QuadProgPP::max(), and min.

{
  QVariant data = index.data(Qt::EditRole);
  QVariant displayData = index.data(Qt::DisplayRole);
  QString name = index.model()->data(index.model()->index(index.row(), index.column()-1)).value<QString>();

  if(data.isValid())
  {
  
    QWidget* editorWidget = NULL;

    if(data.type() == QVariant::Color)
    {
      QPushButton* colorBtn = new QPushButton(parent);
      QColor color = data.value<QColor>();
      
      QColor result = QColorDialog::getColor(color);
      if(result.isValid())
      {       
        QPalette palette = colorBtn->palette();
        palette.setColor(QPalette::Button, result);
        colorBtn->setPalette(palette);
        colorBtn->setStyleSheet(QString("background-color: %1;foreground-color: %1; border-style: none;").arg(result.name()));
        //colorBtn->setFlat(true);
      }
      // QColorDialog closed by 'Cancel' button, use the old property color
      else
      {
        QPalette palette = colorBtn->palette();
        palette.setColor(QPalette::Button, color);
        colorBtn->setPalette(palette);
        colorBtn->setStyleSheet(QString("background-color: %1;foreground-color: %1; border-style: none;").arg(color.name()));
      
      }

      connect(colorBtn, SIGNAL(pressed()), this, SLOT(commitAndCloseEditor()));

      editorWidget = colorBtn;
    }

/*
    else if(data.type() == QVariant::Bool)
    {
      QCheckBox *visibilityCheckBox = new QCheckBox(parent);
      connect(visibilityCheckBox, SIGNAL(editingFinished()),
        this, SLOT(commitAndCloseEditor()));

      return visibilityCheckBox;
    }*/


    else if(data.type() == QVariant::Int)
    {
      QSpinBox* spinBox = new QSpinBox(parent);
      spinBox->setSingleStep(1);
      spinBox->setMinimum(std::numeric_limits<int>::min());
      spinBox->setMaximum(std::numeric_limits<int>::max());
      editorWidget = spinBox;
    }
    // see qt documentation. cast is correct, it would be obsolete if we 
    // store doubles
    else if(static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
    {
      QDoubleSpinBox* spinBox = new QDoubleSpinBox(parent);
      spinBox->setDecimals(2);
      spinBox->setSingleStep(0.1);
      if(name == "opacity")
      {
        spinBox->setMinimum(0.0);
        spinBox->setMaximum(1.0);
      }
      else
      {
        spinBox->setMinimum(std::numeric_limits<float>::min());
        spinBox->setMaximum(std::numeric_limits<float>::max());
      }
      
      editorWidget = spinBox;
    }

    else if(data.type() == QVariant::StringList)
    {
      QStringList entries = data.value<QStringList>();
      QComboBox* comboBox = new QComboBox(parent);
      comboBox->setEditable(false);
      comboBox->addItems(entries);

      editorWidget = comboBox;
    }

    
    else
    {
      editorWidget = QStyledItemDelegate::createEditor(parent, option, index);
    }

    if ( editorWidget )
    {
      // install event filter
      editorWidget->installEventFilter( const_cast<QmitkPropertyDelegate*>(this) );
    }

    return editorWidget;

  }
  else
    return new QLabel(displayData.toString(), parent);

}
bool QmitkPropertyDelegate::eventFilter ( QObject *  o,
QEvent *  e 
) [protected]

Definition at line 382 of file QmitkPropertyDelegate.cpp.

References mitk::RenderingManager::GetInstance().

{
  // filter all kind of events on our editor widgets
  // when certain events occur, repaint all render windows, because rendering relevant properties might have changed
  switch ( e->type() )
  {
    case QEvent::KeyRelease:
    case QEvent::MouseButtonRelease:
    case QEvent::MouseButtonDblClick:
    case QEvent::Wheel:
    case QEvent::FocusIn:
    {
      if( QWidget* editor = dynamic_cast<QWidget*>(o) )
      {
        emit commitData(editor);
      }

      mitk::RenderingManager::GetInstance()->RequestUpdateAll();
      break;
    }
    default:
    {
      break;
    }
  }

  return false;
}
void QmitkPropertyDelegate::paint ( QPainter *  painter,
const QStyleOptionViewItem &  option,
const QModelIndex &  index 
) const

Renders a specific property (overwritten from QItemDelegate)

Definition at line 43 of file QmitkPropertyDelegate.cpp.

{

  QVariant data = index.data(Qt::DisplayRole);

  QString name = data.value<QString>();

  if(index.column() == 1 && data.type() == QVariant::Color)
  {
    QColor qcol = data.value<QColor>();

    painter->save();
    painter->fillRect(option.rect, qcol);
    QRect rect = option.rect;
    rect.setWidth(rect.width()-1);
    rect.setHeight(rect.height()-1);
    QPen pen;
    pen.setWidth(1);
    painter->setPen(pen);
    painter->drawRect(rect);
    painter->restore();

  }
  else
  {
    QStyledItemDelegate::paint(painter, option, index);
  }
}
void QmitkPropertyDelegate::setEditorData ( QWidget *  editor,
const QModelIndex &  index 
) const

Create an editor for a specific property (overwritten from QItemDelegate)

Definition at line 184 of file QmitkPropertyDelegate.cpp.

{

  QVariant data = index.data(Qt::EditRole);
  QVariant displayData = index.data(Qt::DisplayRole);

  if(data.isValid())
  {

    if(data.type() == QVariant::Color)
    {

      /*
      QPushButton *colorBtn = qobject_cast<QPushButton *>(editor);
      QColor qcol = data.value<QColor>();
      colorBtn->setPalette(QPalette(qcol));


      QColor result = QColorDialog::getColor(qcol);
      if(result.isValid())
      {
        colorBtn->setPalette(QPalette(result));
      }
*/

    }


/*
    else if(data.type() == QVariant::Bool)
    {
      QCheckBox *visibilityCheckBox = qobject_cast<QCheckBox *>(editor);
      visibilityCheckBox->setChecked(data.toBool());
    }*/

    /*else*/ if(data.type() == QVariant::Int)
    {
      QSpinBox* spinBox = qobject_cast<QSpinBox *>(editor);
      spinBox->setValue(data.toInt());
    }
    // see qt documentation. cast is correct, it would be obsolete if we 
    // store doubles
    else if(static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
    {
      QDoubleSpinBox* spinBox = qobject_cast<QDoubleSpinBox *>(editor);
      spinBox->setValue(data.toDouble());
    }

    else if(data.type() == QVariant::StringList)
    {
      QComboBox* comboBox = qobject_cast<QComboBox *>(editor);
      QString displayString = displayData.value<QString>();
      comboBox->setCurrentIndex(comboBox->findData(displayString));

//       connect(comboBox, SIGNAL(currentIndexChanged(int)),
//         this, SLOT(ComboBoxCurrentIndexChanged(int)));
    }

    else
      return QStyledItemDelegate::setEditorData(editor, index);
  }
}
void QmitkPropertyDelegate::setModelData ( QWidget *  editor,
QAbstractItemModel *  model,
const QModelIndex &  index 
) const

When the user accepts input this func commits the data to the model (overwritten from QItemDelegate)

Definition at line 247 of file QmitkPropertyDelegate.cpp.

{
  QVariant data = index.data(Qt::EditRole);
  QVariant displayData = index.data(Qt::DisplayRole);

  if(data.isValid())
  {

    if(data.type() == QVariant::Color)
    {
      QWidget *colorBtn = qobject_cast<QWidget *>(editor);
      QVariant colorVariant;
      colorVariant.setValue<QColor>(colorBtn->palette().color(QPalette::Button));
      model->setData(index, colorVariant);
    }

    else if(data.type() == QVariant::Int)
    {
      QSpinBox* spinBox = qobject_cast<QSpinBox *>(editor);
      int intValue = spinBox->value();

      QVariant intValueVariant;
      intValueVariant.setValue<float>(static_cast<float>(intValue));
      model->setData(index, intValueVariant);
    }

    else if(static_cast<QMetaType::Type>(data.type()) == QMetaType::Float)
    {
      QDoubleSpinBox* spinBox = qobject_cast<QDoubleSpinBox *>(editor);
      double doubleValue = spinBox->value();

      QVariant doubleValueVariant;
      doubleValueVariant.setValue<float>(static_cast<float>(doubleValue));
      model->setData(index, doubleValueVariant);
    }

    else if(data.type() == QVariant::StringList)
    {
      QString displayData = data.value<QString>();

      QComboBox* comboBox = qobject_cast<QComboBox *>(editor);
      QString comboBoxValue = comboBox->currentText();

      QVariant comboBoxValueVariant;
      comboBoxValueVariant.setValue<QString>(comboBoxValue);
      model->setData(index, comboBoxValueVariant);
    }

    else
      QStyledItemDelegate::setModelData(editor, model, index);
  }

}
void QmitkPropertyDelegate::updateEditorGeometry ( QWidget *  editor,
const QStyleOptionViewItem &  option,
const QModelIndex &  index 
) const

Fit an editor to some geometry (overwritten from QItemDelegate)

Definition at line 335 of file QmitkPropertyDelegate.cpp.

{
/*
  QRect rect = option.rect;

  if (QCheckBox* checkBoxEditor = qobject_cast<QCheckBox*>(editor))
  {
    const QStyle *style = QApplication::style();

    const int indicatorWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &option);
    const int indicatorHeight = style->pixelMetric(QStyle::PM_IndicatorHeight, &option);
    rect = QRect(option.rect.x()+ option.rect.width()/2-indicatorWidth/2,
      option.rect.y()+ option.rect.height()/2-indicatorHeight/2,
      indicatorWidth, indicatorHeight);
  }
*/

  editor->setGeometry(option.rect);
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines