QGIS API Documentation  2.7.0-Master
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
qgsattributetabledelegate.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  QgsAttributeTableDelegate.cpp
3  --------------------------------------
4  Date : Feb 2009
5  Copyright : (C) 2009 Vita Cizek
6  Email : weetya (at) gmail.com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include <QItemDelegate>
17 #include <QLineEdit>
18 #include <QComboBox>
19 #include <QPainter>
20 
21 #include "qgsattributeeditor.h"
24 #include "qgsattributetablemodel.h"
25 #include "qgsattributetableview.h"
28 #include "qgslogger.h"
29 #include "qgsvectordataprovider.h"
30 
31 
32 QgsVectorLayer* QgsAttributeTableDelegate::layer( const QAbstractItemModel *model )
33 {
34  const QgsAttributeTableModel *tm = qobject_cast<const QgsAttributeTableModel *>( model );
35  if ( tm )
36  return tm->layer();
37 
38  const QgsAttributeTableFilterModel *fm = dynamic_cast<const QgsAttributeTableFilterModel *>( model );
39  if ( fm )
40  return fm->layer();
41 
42  return 0;
43 }
44 
45 const QgsAttributeTableModel* QgsAttributeTableDelegate::masterModel( const QAbstractItemModel* model )
46 {
47  const QgsAttributeTableModel *tm = qobject_cast<const QgsAttributeTableModel *>( model );
48  if ( tm )
49  return tm;
50 
51  const QgsAttributeTableFilterModel *fm = dynamic_cast<const QgsAttributeTableFilterModel *>( model );
52  if ( fm )
53  return fm->masterModel();
54 
55  return 0;
56 }
57 
59  QWidget *parent,
60  const QStyleOptionViewItem &option,
61  const QModelIndex &index ) const
62 {
63  Q_UNUSED( option );
64  QgsVectorLayer *vl = layer( index.model() );
65  if ( !vl )
66  return NULL;
67 
68  int fieldIdx = index.model()->data( index, QgsAttributeTableModel::FieldIndexRole ).toInt();
69 
70  QString widgetType = vl->editorWidgetV2( fieldIdx );
71  QgsEditorWidgetConfig cfg = vl->editorWidgetV2Config( fieldIdx );
72  QgsAttributeEditorContext context( masterModel( index.model() )->editorContext(), QgsAttributeEditorContext::Popup );
73  QgsEditorWidgetWrapper* eww = QgsEditorWidgetRegistry::instance()->create( widgetType, vl, fieldIdx, cfg, 0, parent, context );
74  QWidget* w = eww->widget();
75 
76  w->setAutoFillBackground( true );
77 
78  eww->setEnabled( vl->fieldEditable( fieldIdx ) );
79 
80  return w;
81 }
82 
83 void QgsAttributeTableDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
84 {
85  QgsVectorLayer *vl = layer( model );
86  if ( vl == NULL )
87  return;
88 
89  int fieldIdx = model->data( index, QgsAttributeTableModel::FieldIndexRole ).toInt();
90  QgsFeatureId fid = model->data( index, QgsAttributeTableModel::FeatureIdRole ).toLongLong();
91  QVariant oldValue = model->data( index, Qt::EditRole );
92 
93  QVariant newValue;
95  if ( !eww )
96  return;
97 
98  newValue = eww->value();
99 
100  if (( oldValue != newValue && newValue.isValid() ) || oldValue.isNull() != newValue.isNull() )
101  {
102  vl->beginEditCommand( tr( "Attribute changed" ) );
103  vl->changeAttributeValue( fid, fieldIdx, newValue, oldValue );
104  vl->endEditCommand();
105  }
106 }
107 
108 void QgsAttributeTableDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const
109 {
111  if ( !eww )
112  return;
113 
114  eww->setValue( index.model()->data( index, Qt::EditRole ) );
115 }
116 
118 {
119  mFeatureSelectionModel = featureSelectionModel;
120 }
121 
122 void QgsAttributeTableDelegate::paint( QPainter * painter,
123  const QStyleOptionViewItem & option,
124  const QModelIndex & index ) const
125 {
126  QgsFeatureId fid = index.model()->data( index, QgsAttributeTableModel::FeatureIdRole ).toLongLong();
127 
128  QStyleOptionViewItem myOpt = option;
129 
130  if ( index.model()->data( index, Qt::EditRole ).isNull() )
131  {
132  myOpt.font.setItalic( true );
133  myOpt.palette.setColor( QPalette::Text, QColor( "gray" ) );
134  }
135 
136  if ( mFeatureSelectionModel->isSelected( fid ) )
137  myOpt.state |= QStyle::State_Selected;
138 
139  QItemDelegate::paint( painter, myOpt, index );
140 
141  if ( option.state & QStyle::State_HasFocus )
142  {
143  QRect r = option.rect.adjusted( 1, 1, -1, -1 );
144  QPen p( QBrush( QColor( 0, 255, 127 ) ), 2 );
145  painter->save();
146  painter->setPen( p );
147  painter->drawRect( r );
148  painter->restore();
149  }
150 }
const QgsEditorWidgetConfig editorWidgetV2Config(int fieldIdx) const
Get the configuration for the editor widget used to represent the field at the given index...
static unsigned index
bool fieldEditable(int idx)
is edit widget editable
virtual bool isSelected(QgsFeatureId fid)
Returns the selection status of a given feature id.
This class contains context information for attribute editor widgets.
Manages an editor widget Widget and wrapper share the same parent.
void beginEditCommand(QString text)
Create edit command for undo/redo operations.
virtual QVariant value()=0
Will be used to access the widget's value.
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Used to create an editor for when the user tries to change the contents of a cell.
A model backed by a QgsVectorLayerCache which is able to provide feature/attribute information to a Q...
static QgsEditorWidgetRegistry * instance()
This class is a singleton and has therefore to be accessed with this method instead of a constructor...
void setFeatureSelectionModel(QgsFeatureSelectionModel *featureSelectionModel)
QgsVectorLayer * layer() const
Returns the layer this filter acts on.
A widget was opened as a popup (e.g. attribute table editor widget)
QgsEditorWidgetWrapper * create(const QString &widgetId, QgsVectorLayer *vl, int fieldIdx, const QgsEditorWidgetConfig &config, QWidget *editor, QWidget *parent, const QgsAttributeEditorContext context=QgsAttributeEditorContext())
Create an attribute editor widget wrapper of a given type for a given field.
const QString editorWidgetV2(int fieldIdx) const
Get the id for the editor widget used to represent the field at the given index.
static QgsEditorWidgetWrapper * fromWidget(QWidget *widget)
Will return a wrapper for a given widget.
Q_DECL_DEPRECATED bool changeAttributeValue(QgsFeatureId fid, int field, QVariant value, bool emitSignal)
Changes an attribute value (but does not commit it)
virtual void setValue(const QVariant &value)=0
Is called, when the value of the widget needs to be changed.
void endEditCommand()
Finish edit command and add it to undo/redo stack.
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Sets data from editor back to model.
void setEditorData(QWidget *editor, const QModelIndex &index) const
Sets data from model into the editor.
QgsAttributeTableModel * masterModel() const
Returns the table model this filter is using.
QgsVectorLayer * layer() const
Returns the layer this model uses as backend.
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Overloads the paint method form the QItemDelegate bas class.
QMap< QString, QVariant > QgsEditorWidgetConfig
Holds a set of configuration parameters for a editor widget wrapper.
qint64 QgsFeatureId
Definition: qgsfeature.h:30
QWidget * widget()
Access the widget managed by this wrapper.
Represents a vector layer which manages a vector based data sets.
#define tr(sourceText)