From a2d3b380295b7eb1cf4d3e67452b43f70c258460 Mon Sep 17 00:00:00 2001 From: jef Date: Fri, 27 Mar 2009 17:37:59 +0000 Subject: [PATCH] use QgsDebugMsg instead of iostream in BEATA and reindent git-svn-id: http://svn.osgeo.org/qgis/trunk@10425 c8812cc2-4d05-0410-92ff-de0c093fc19c --- src/app/attributetable/BeataDialog.cpp | 303 ++++++++------- src/app/attributetable/BeataModel.cpp | 507 +++++++++++++------------ 2 files changed, 413 insertions(+), 397 deletions(-) diff --git a/src/app/attributetable/BeataDialog.cpp b/src/app/attributetable/BeataDialog.cpp index edebd46fc45..c45efcf083b 100644 --- a/src/app/attributetable/BeataDialog.cpp +++ b/src/app/attributetable/BeataDialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - BeataDialog.cpp + BeataDialog.cpp BEtter Attribute TAble ------------------- date : Feb 2009 @@ -29,6 +29,7 @@ #include "qgisapp.h" #include "qgssearchquerybuilder.h" +#include "qgslogger.h" class QBeataTableDock : public QDockWidget @@ -37,7 +38,7 @@ class QBeataTableDock : public QDockWidget QBeataTableDock( const QString & title, QWidget * parent = 0, Qt::WindowFlags flags = 0 ) : QDockWidget( title, parent, flags ) { - setObjectName("AttributeTable"); // set object name so the position can be saved + setObjectName( "AttributeTable" ); // set object name so the position can be saved } virtual void closeEvent( QCloseEvent * ev ) @@ -47,21 +48,21 @@ class QBeataTableDock : public QDockWidget }; -BeataDialog::BeataDialog(QgsVectorLayer *theLayer, QWidget *parent, Qt::WindowFlags flags) - : QDialog(parent, flags), mDock(NULL) +BeataDialog::BeataDialog( QgsVectorLayer *theLayer, QWidget *parent, Qt::WindowFlags flags ) + : QDialog( parent, flags ), mDock( NULL ) { mLayer = theLayer; - setupUi(this); - - setAttribute(Qt::WA_DeleteOnClose); + setupUi( this ); + + setAttribute( Qt::WA_DeleteOnClose ); QSettings settings; restoreGeometry( settings.value( "/Windows/BetterAttributeTable/geometry" ).toByteArray() ); - - mView->setLayer(mLayer); - mFilterModel = (BeataFilterModel *) mView->model(); - mModel = (BeataModel *)((BeataFilterModel *)mView->model())->sourceModel(); + + mView->setLayer( mLayer ); + mFilterModel = ( BeataFilterModel * ) mView->model(); + mModel = ( BeataModel * )(( BeataFilterModel * )mView->model() )->sourceModel(); mQuery = query; mColumnBox = columnBox; @@ -78,35 +79,35 @@ BeataDialog::BeataDialog(QgsVectorLayer *theLayer, QWidget *parent, Qt::WindowFl } setWindowTitle( tr( "Attribute table - %1" ).arg( mLayer->name() ) ); - - mRemoveSelectionButton->setIcon(getThemeIcon( "/mActionUnselectAttributes.png" )); - mSelectedToTopButton->setIcon(getThemeIcon( "/mActionSelectedToTop.png" )); - mCopySelectedRowsButton->setIcon(getThemeIcon( "/mActionCopySelected.png" )); - mZoomMapToSelectedRowsButton->setIcon(getThemeIcon( "/mActionZoomToSelected.png" ) ); - mInvertSelectionButton->setIcon(getThemeIcon( "/mActionInvertSelection.png" ) ); - mToggleEditingButton->setIcon(getThemeIcon( "/mActionToggleEditing.png" ) ); + + mRemoveSelectionButton->setIcon( getThemeIcon( "/mActionUnselectAttributes.png" ) ); + mSelectedToTopButton->setIcon( getThemeIcon( "/mActionSelectedToTop.png" ) ); + mCopySelectedRowsButton->setIcon( getThemeIcon( "/mActionCopySelected.png" ) ); + mZoomMapToSelectedRowsButton->setIcon( getThemeIcon( "/mActionZoomToSelected.png" ) ); + mInvertSelectionButton->setIcon( getThemeIcon( "/mActionInvertSelection.png" ) ); + mToggleEditingButton->setIcon( getThemeIcon( "/mActionToggleEditing.png" ) ); // toggle editing mToggleEditingButton->setCheckable( true ); mToggleEditingButton->setEnabled( mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ); - + // info from table to application connect( this, SIGNAL( editingToggled( QgsMapLayer * ) ), QgisApp::instance(), SLOT( toggleEditing( QgsMapLayer * ) ) ); // info from layer to table connect( mLayer, SIGNAL( editingStarted() ), this, SLOT( editingToggled() ) ); connect( mLayer, SIGNAL( editingStopped() ), this, SLOT( editingToggled() ) ); - - connect(searchButton, SIGNAL(clicked()), this, SLOT(search())); - connect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); - connect(mLayer, SIGNAL(layerDeleted()), this, SLOT( close())); - connect(mView->verticalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(updateRowSelection(int))); - connect(mModel, SIGNAL(modelChanged()), this, SLOT(updateSelection())); - + connect( searchButton, SIGNAL( clicked() ), this, SLOT( search() ) ); + + connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); + connect( mLayer, SIGNAL( layerDeleted() ), this, SLOT( close() ) ); + connect( mView->verticalHeader(), SIGNAL( sectionClicked( int ) ), this, SLOT( updateRowSelection( int ) ) ); + connect( mModel, SIGNAL( modelChanged() ), this, SLOT( updateSelection() ) ); + //make sure to show all recs on first load on_cbxShowSelectedOnly_toggled( false ); mLastClickedHeaderIndex = 0; - mSelectionModel = new QItemSelectionModel(mFilterModel); + mSelectionModel = new QItemSelectionModel( mFilterModel ); updateSelectionFromLayer(); } @@ -117,7 +118,7 @@ BeataDialog::~BeataDialog() void BeataDialog::closeEvent( QCloseEvent* event ) { QDialog::closeEvent( event ); - + if ( mDock == NULL ) { QSettings settings; @@ -129,7 +130,7 @@ void BeataDialog::closeEvent( QCloseEvent* event ) QIcon BeataDialog::getThemeIcon( const QString theName ) { // copied from QgisApp::getThemeIcon. To be removed when merged to SVN - + QString myPreferredPath = QgsApplication::activeThemePath() + QDir::separator() + theName; QString myDefaultPath = QgsApplication::defaultThemePath() + QDir::separator() + theName; if ( QFile::exists( myPreferredPath ) ) @@ -150,7 +151,7 @@ QIcon BeataDialog::getThemeIcon( const QString theName ) void BeataDialog::showAdvanced() { - mMenuActions->exec(QCursor::pos()); + mMenuActions->exec( QCursor::pos() ); } void BeataDialog::on_mSelectedToTopButton_clicked() @@ -163,29 +164,29 @@ void BeataDialog::on_mSelectedToTopButton_clicked() mModel->incomingChangeLayout(); QgsFeatureIds::Iterator it = mSelectedFeatures.begin(); - for (; it != mSelectedFeatures.end(); ++it, ++freeIndex) + for ( ; it != mSelectedFeatures.end(); ++it, ++freeIndex ) { - QModelIndex sourceIndex = mFilterModel->mapToSource(mFilterModel->index(freeIndex, 0)); - mModel->swapRows(mModel->rowToId(sourceIndex.row()), *it); + QModelIndex sourceIndex = mFilterModel->mapToSource( mFilterModel->index( freeIndex, 0 ) ); + mModel->swapRows( mModel->rowToId( sourceIndex.row() ), *it ); } -/* - while (it != fids.end()) - { //map!!!! - //mModel->swapRows(mModel->rowToId(freeIndex), *it); - //QModelIndex index = mFilterModel->mapFromSource(mModel->index(mModel->idToRow(*it), 0)); - QModelIndex sourceIndex = mFilterModel->mapToSource(mFilterModel->index(freeIndex, 0)); - mModel->swapRows(mModel->rowToId(sourceIndex.row()), *it); - //mModel->swapRows(freeIndex, *it); + /* + while (it != fids.end()) + { //map!!!! + //mModel->swapRows(mModel->rowToId(freeIndex), *it); + //QModelIndex index = mFilterModel->mapFromSource(mModel->index(mModel->idToRow(*it), 0)); + QModelIndex sourceIndex = mFilterModel->mapToSource(mFilterModel->index(freeIndex, 0)); + mModel->swapRows(mModel->rowToId(sourceIndex.row()), *it); + //mModel->swapRows(freeIndex, *it); - if (fids.empty()) - break; - else - ++it; + if (fids.empty()) + break; + else + ++it; - ++freeIndex; - } -*/ + ++freeIndex; + } + */ // just select proper rows //mModel->reload(mModel->index(0,0), mModel->index(mModel->rowCount(), mModel->columnCount())); //mModel->changeLayout(); @@ -195,7 +196,7 @@ void BeataDialog::on_mSelectedToTopButton_clicked() void BeataDialog::on_mCopySelectedRowsButton_clicked() { - QgisApp::instance()->editCopy(mLayer); + QgisApp::instance()->editCopy( mLayer ); } void BeataDialog::on_mZoomMapToSelectedRowsButton_clicked() @@ -226,8 +227,8 @@ void BeataDialog::columnBoxInit() QgsFieldMap fieldMap = mLayer->dataProvider()->fields(); QgsFieldMap::Iterator it = fieldMap.begin(); - for (; it != fieldMap.end(); ++it) - mColumnBox->addItem(it.value().name()); + for ( ; it != fieldMap.end(); ++it ) + mColumnBox->addItem( it.value().name() ); } int BeataDialog::columnBoxColumnId() @@ -235,8 +236,8 @@ int BeataDialog::columnBoxColumnId() QgsFieldMap fieldMap = mLayer->dataProvider()->fields(); QgsFieldMap::Iterator it = fieldMap.begin(); - for (; it != fieldMap.end(); ++it) - if (it.value().name() == mColumnBox->currentText()) + for ( ; it != fieldMap.end(); ++it ) + if ( it.value().name() == mColumnBox->currentText() ) return it.key(); return 0; @@ -245,137 +246,145 @@ int BeataDialog::columnBoxColumnId() void BeataDialog::updateSelection() { QModelIndex index; - mView->setSelectionMode(QAbstractItemView::MultiSelection); + mView->setSelectionMode( QAbstractItemView::MultiSelection ); QItemSelection selection; - + QgsFeatureIds::Iterator it = mSelectedFeatures.begin(); - for (; it != mSelectedFeatures.end(); ++it) + for ( ; it != mSelectedFeatures.end(); ++it ) { - QModelIndex leftUpIndex = mFilterModel->mapFromSource(mModel->index(mModel->idToRow(*it), 0)); - QModelIndex rightBottomIndex = mFilterModel->mapFromSource(mModel->index(mModel->idToRow(*it), mModel->columnCount() - 1)); - selection.append(QItemSelectionRange(leftUpIndex, rightBottomIndex)); + QModelIndex leftUpIndex = mFilterModel->mapFromSource( mModel->index( mModel->idToRow( *it ), 0 ) ); + QModelIndex rightBottomIndex = mFilterModel->mapFromSource( mModel->index( mModel->idToRow( *it ), mModel->columnCount() - 1 ) ); + selection.append( QItemSelectionRange( leftUpIndex, rightBottomIndex ) ); //selection.append(QItemSelectionRange(leftUpIndex, leftUpIndex)); } - mSelectionModel->select(selection, QItemSelectionModel::ClearAndSelect);// | QItemSelectionModel::Columns); - mView->setSelectionModel(mSelectionModel); - mView->setSelectionMode(QAbstractItemView::NoSelection); + mSelectionModel->select( selection, QItemSelectionModel::ClearAndSelect );// | QItemSelectionModel::Columns); + mView->setSelectionModel( mSelectionModel ); + mView->setSelectionMode( QAbstractItemView::NoSelection ); /*for (int i = 0; i < mModel->rowCount(); ++i) { - int id = mModel->rowToId(i); - std::cout << id << "\n"; + int id = mModel->rowToId(i); + QgsDebugMsg(id); } - std::cout << "--------------\n"; -*/ + QgsDebugMsg("--------------"); + */ } -void BeataDialog::updateRowSelection(int index) +void BeataDialog::updateRowSelection( int index ) { // map index to filter model //index = mFilterModel->mapFromSource(mModel->index(index, 0)).row(); - if (mView->shiftPressed) { - std::cout << "shift\n"; + if ( mView->shiftPressed ) + { + QgsDebugMsg( "shift" ); // get the first and last index of the rows to be selected/deselected int first, last; - if (index > mLastClickedHeaderIndex) { + if ( index > mLastClickedHeaderIndex ) + { first = mLastClickedHeaderIndex + 1; last = index; } - else if (index == mLastClickedHeaderIndex) { + else if ( index == mLastClickedHeaderIndex ) + { // row was selected and now it is shift-clicked // ignore the shift and deselect the row first = last = index; } - else { + else + { first = index; last = mLastClickedHeaderIndex - 1; } - + // for all the rows update the selection, without starting a new selection - if (first <= last) - updateRowSelection(first, last, false); - + if ( first <= last ) + updateRowSelection( first, last, false ); + mLastClickedHeaderIndex = last; } - else if (mView->ctrlPressed) { - std::cout << "ctrl\n"; + else if ( mView->ctrlPressed ) + { + QgsDebugMsg( "ctrl" ); // update the single row selection, without starting a new selection - updateRowSelection(index, index, false); - + updateRowSelection( index, index, false ); + // the next shift would start from here mLastClickedHeaderIndex = index; - } - else { - std::cout << "ordinary click\n"; + } + else + { + QgsDebugMsg( "ordinary click" ); // update the single row selection, start a new selection if the row was not selected - updateRowSelection(index, index, true); - + updateRowSelection( index, index, true ); + // the next shift would start from here mLastClickedHeaderIndex = index; } } // fast row deselection needed -void BeataDialog::updateRowSelection(int first, int last, bool startNewSelection) -{ - disconnect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); +void BeataDialog::updateRowSelection( int first, int last, bool startNewSelection ) +{ + disconnect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); //index = mFilterModel->mapFromSource(mModel->index(index, 0)).row(); // Id must be mapped to table/view row - QModelIndex index = mFilterModel->mapToSource(mFilterModel->index(first, 0)); - int fid = mModel->rowToId(index.row()); - bool wasSelected = mSelectedFeatures.contains(fid); + QModelIndex index = mFilterModel->mapToSource( mFilterModel->index( first, 0 ) ); + int fid = mModel->rowToId( index.row() ); + bool wasSelected = mSelectedFeatures.contains( fid ); // new selection should be created - if (startNewSelection) + if ( startNewSelection ) { mView->clearSelection(); mSelectedFeatures.clear(); - if (wasSelected) + if ( wasSelected ) { mLayer->removeSelection(); - connect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); + connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); return; } // set clicked row to current - mView->setCurrentIndex(mFilterModel->index(first, 0)); - mView->setSelectionMode(QAbstractItemView::SingleSelection); + mView->setCurrentIndex( mFilterModel->index( first, 0 ) ); + mView->setSelectionMode( QAbstractItemView::SingleSelection ); //QModelIndex index = mFilterModel->mapFromSource(mModel->index(first, 0)); - mView->selectRow(first); - mView->setSelectionMode(QAbstractItemView::NoSelection); + mView->selectRow( first ); + mView->setSelectionMode( QAbstractItemView::NoSelection ); - mSelectedFeatures.insert(fid); + mSelectedFeatures.insert( fid ); //mLayer->setSelectedFeatures(mSelectedFeatures); mLayer->removeSelection(); - mLayer->select(fid); + mLayer->select( fid ); //mFilterModel->invalidate(); - connect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); + connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); return; } // existing selection should be updated - for (int i = first; i <= last; ++i) { - if (i > first) { + for ( int i = first; i <= last; ++i ) + { + if ( i > first ) + { // Id must be mapped to table/view row - index = mFilterModel->mapToSource(mFilterModel->index(i, 0)); - fid = mModel->rowToId(index.row()); - wasSelected = mSelectedFeatures.contains(fid); + index = mFilterModel->mapToSource( mFilterModel->index( i, 0 ) ); + fid = mModel->rowToId( index.row() ); + wasSelected = mSelectedFeatures.contains( fid ); } - - if (wasSelected) - mSelectedFeatures.remove(fid); + + if ( wasSelected ) + mSelectedFeatures.remove( fid ); else - mSelectedFeatures.insert(fid); + mSelectedFeatures.insert( fid ); } //mFilterModel->invalidate(); - + /* QItemSelection selection; QModelIndex leftUpIndex = mFilterModel->index(first, 0); @@ -385,72 +394,72 @@ void BeataDialog::updateRowSelection(int first, int last, bool startNewSelection mView->setSelectionModel(mSelectionModel); */ updateSelection(); - mLayer->setSelectedFeatures(mSelectedFeatures); - connect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); + mLayer->setSelectedFeatures( mSelectedFeatures ); + connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); } void BeataDialog::updateSelectionFromLayer() { - std::cout << "updateFromLayer\n"; + QgsDebugMsg( "updateFromLayer" ); mSelectedFeatures = mLayer->selectedFeaturesIds(); updateSelection(); } -void BeataDialog::doSearch(QString searchString) +void BeataDialog::doSearch( QString searchString ) { // parse search string and build parsed tree QgsSearchString search; - if (!search.setString(searchString)) + if ( !search.setString( searchString ) ) { - QMessageBox::critical(this, tr("Search string parsing error"), search.parserErrorMsg()); + QMessageBox::critical( this, tr( "Search string parsing error" ), search.parserErrorMsg() ); return; } QgsSearchTreeNode* searchTree = search.tree(); - if (searchTree == NULL) + if ( searchTree == NULL ) { - QMessageBox::information(this, tr("Search results"), tr("You've supplied an empty search string.")); + QMessageBox::information( this, tr( "Search results" ), tr( "You've supplied an empty search string." ) ); return; } - QApplication::setOverrideCursor(Qt::WaitCursor); + QApplication::setOverrideCursor( Qt::WaitCursor ); mSelectedFeatures.clear(); - mLayer->select(mLayer->pendingAllAttributesList(), QgsRectangle(), false); + mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false ); QgsFeature f; - while (mLayer->nextFeature(f)) + while ( mLayer->nextFeature( f ) ) { - if (searchTree->checkAgainst(mLayer->pendingFields(), f.attributeMap())) + if ( searchTree->checkAgainst( mLayer->pendingFields(), f.attributeMap() ) ) mSelectedFeatures << f.id(); // check if there were errors during evaluating - if (searchTree->hasError()) + if ( searchTree->hasError() ) break; } QApplication::restoreOverrideCursor(); - if (searchTree->hasError()) + if ( searchTree->hasError() ) { - QMessageBox::critical(this, tr("Error during search"), searchTree->errorMsg()); + QMessageBox::critical( this, tr( "Error during search" ), searchTree->errorMsg() ); return; } // update view updateSelection(); - disconnect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); - mLayer->setSelectedFeatures(mSelectedFeatures); - connect(mLayer, SIGNAL(selectionChanged()), this, SLOT(updateSelectionFromLayer())); + disconnect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); + mLayer->setSelectedFeatures( mSelectedFeatures ); + connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); QString str; - if (mSelectedFeatures.size()) - str.sprintf(tr("Found %d matching features.", "", mSelectedFeatures.size()).toUtf8(), mSelectedFeatures.size()); + if ( mSelectedFeatures.size() ) + str.sprintf( tr( "Found %d matching features.", "", mSelectedFeatures.size() ).toUtf8(), mSelectedFeatures.size() ); else - str = tr("No matching features found."); + str = tr( "No matching features found." ); - QMessageBox::information(this, tr("Search results"), str); + QMessageBox::information( this, tr( "Search results" ), str ); } void BeataDialog::search() @@ -459,28 +468,28 @@ void BeataDialog::search() QString str = mColumnBox->currentText(); const QgsFieldMap& flds = mLayer->dataProvider()->fields(); - int fldIndex = mLayer->dataProvider()->fieldNameIndex(str); + int fldIndex = mLayer->dataProvider()->fieldNameIndex( str ); QVariant::Type fldType = flds[fldIndex].type(); - bool numeric = (fldType == QVariant::Int || fldType == QVariant::Double); - - if (numeric) + bool numeric = ( fldType == QVariant::Int || fldType == QVariant::Double ); + + if ( numeric ) str += " = '"; else str += " ~ '"; - + str += mQuery->displayText(); str += "'"; - doSearch(str); + doSearch( str ); } void BeataDialog::on_mAdvancedSearchButton_clicked() { - QgsSearchQueryBuilder dlg(mLayer, this); - dlg.setSearchString(mQuery->displayText()); + QgsSearchQueryBuilder dlg( mLayer, this ); + dlg.setSearchString( mQuery->displayText() ); - if (dlg.exec()) - doSearch(dlg.searchString()); + if ( dlg.exec() ) + doSearch( dlg.searchString() ); } void BeataDialog::on_mToggleEditingButton_toggled() @@ -491,10 +500,10 @@ void BeataDialog::on_mToggleEditingButton_toggled() void BeataDialog::editingToggled() { mToggleEditingButton->setChecked( mLayer->isEditable() ); - + // (probably reload data if user stopped editing - possible revert) - mModel->reload(mModel->index(0,0), mModel->index(mModel->rowCount(), mModel->columnCount())); - + mModel->reload( mModel->index( 0, 0 ), mModel->index( mModel->rowCount(), mModel->columnCount() ) ); + // not necessary to set table read only if layer is not editable // because model always reflects actual state when returning item flags } @@ -516,5 +525,5 @@ void BeataDialog::revert() { mLayer->rollBack(); mModel->revert(); - mModel->reload(mModel->index(0,0), mModel->index(mModel->rowCount(), mModel->columnCount())); + mModel->reload( mModel->index( 0, 0 ), mModel->index( mModel->rowCount(), mModel->columnCount() ) ); } diff --git a/src/app/attributetable/BeataModel.cpp b/src/app/attributetable/BeataModel.cpp index fe36dbd20d6..8162a1ddde2 100644 --- a/src/app/attributetable/BeataModel.cpp +++ b/src/app/attributetable/BeataModel.cpp @@ -1,7 +1,7 @@ /*************************************************************************** BeataModel.cpp -------------------------------------- - Date : Feb 2009 + Date : Feb 2009 Copyright : (C) 2009 Vita Cizek Email : weetya (at) gmail.com *************************************************************************** @@ -23,18 +23,19 @@ #include #include #include +#include "qgslogger.h" //could be faster when type guessed before sorting -bool idColumnPair::operator<(const idColumnPair &b) const +bool idColumnPair::operator<( const idColumnPair &b ) const { //QVariat thinks gid is a string! QVariant::Type columnType = columnItem.type(); - if (columnType == QVariant::Int || columnType == QVariant::UInt || columnType == QVariant::LongLong || columnType == QVariant::ULongLong) + if ( columnType == QVariant::Int || columnType == QVariant::UInt || columnType == QVariant::LongLong || columnType == QVariant::ULongLong ) return columnItem.toLongLong() < b.columnItem.toLongLong(); - if (columnType == QVariant::Double) - return columnItem.toDouble() < b.columnItem.toDouble(); + if ( columnType == QVariant::Double ) + return columnItem.toDouble() < b.columnItem.toDouble(); return columnItem.toString() < b.columnItem.toString(); } @@ -43,23 +44,23 @@ bool idColumnPair::operator<(const idColumnPair &b) const // Filter Model // ////////////////// -void BeataFilterModel::sort(int column, Qt::SortOrder order) +void BeataFilterModel::sort( int column, Qt::SortOrder order ) { - ((BeataModel *)sourceModel())->sort(column, order); + (( BeataModel * )sourceModel() )->sort( column, order ); } -BeataFilterModel::BeataFilterModel(QgsVectorLayer* theLayer) +BeataFilterModel::BeataFilterModel( QgsVectorLayer* theLayer ) { mLayer = theLayer; mHideUnselected = false; - setDynamicSortFilter(true); + setDynamicSortFilter( true ); } -bool BeataFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +bool BeataFilterModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const { - if(mHideUnselected) - // unreadable? yes, i agree :-) - return mLayer->selectedFeaturesIds().contains(((BeataModel *)sourceModel())->rowToId(sourceRow)); + if ( mHideUnselected ) + // unreadable? yes, i agree :-) + return mLayer->selectedFeaturesIds().contains((( BeataModel * )sourceModel() )->rowToId( sourceRow ) ); return true; } @@ -80,8 +81,9 @@ QModelIndex BeataFilterModel::mapToSource ( const QModelIndex& filterIndex ) con // BeataModel // //////////////// -BeataModel::BeataModel(QgsVectorLayer *theLayer, QObject *parent) -: QAbstractTableModel(parent) { +BeataModel::BeataModel( QgsVectorLayer *theLayer, QObject *parent ) + : QAbstractTableModel( parent ) +{ mLastRowId = -1; mLastRow = NULL; mLayer = theLayer; @@ -89,106 +91,107 @@ BeataModel::BeataModel(QgsVectorLayer *theLayer, QObject *parent) mFieldCount = mLayer->dataProvider()->fieldCount(); mAttributes = mLayer->dataProvider()->attributeIndexes(); - connect(mLayer, SIGNAL(layerModified(bool)), this, SLOT( layerModified(bool))); + connect( mLayer, SIGNAL( layerModified( bool ) ), this, SLOT( layerModified( bool ) ) ); //connect(mLayer, SIGNAL(attributeAdded(int)), this, SLOT( attributeAdded(int))); //connect(mLayer, SIGNAL(attributeDeleted(int)), this, SLOT( attributeDeleted(int))); //connect(mLayer, SIGNAL(attributeValueChanged(int, int, const QVariant&)), this, SLOT( attributeValueChanged(int, int, const QVariant&))); //connect(mLayer, SIGNAL(featureDeleted(int)), this, SLOT( featureDeleted(int))); //connect(mLayer, SIGNAL(featureAdded(int)), this, SLOT( featureAdded(int))); - + loadLayer(); } -void BeataModel::featureDeleted(int fid) +void BeataModel::featureDeleted( int fid ) { - std::cout << "BM feature deleted\n"; + QgsDebugMsg( "entered." ); int idx = mIdRowMap[fid]; - std::cout << idx; - std::cout << fid; + QgsDebugMsg( idx ); + QgsDebugMsg( fid ); + +#if 0 + --mFeatureCount; + mIdRowMap.remove( fid ); + mRowIdMap.remove( idx ); - /*--mFeatureCount; - mIdRowMap.remove(fid); - mRowIdMap.remove(idx); - // fill the hole in the view - if (idx != mFeatureCount) + if ( idx != mFeatureCount ) { - std::cout << "jo"; + QgsDebugMsg( "jo" ); //mRowIdMap[idx] = mRowIdMap[mFeatureCount]; //mIdRowMap[mRowIdMap[idx]] = idx; int movedId = mRowIdMap[mFeatureCount]; - mRowIdMap.remove(mFeatureCount); - mRowIdMap.insert(idx, movedId); + mRowIdMap.remove( mFeatureCount ); + mRowIdMap.insert( idx, movedId ); mIdRowMap[movedId] = idx; //mIdRowMap.remove(mRowIdMap[idx]); //mIdRowMap.insert(mRowIdMap[idx], idx); } - std::cout << "map sizes:" << mRowIdMap.size() << ", " << mIdRowMap.size(); + QgsDebugMsg( QString( "map sizes:%1, %2" ).arg( mRowIdMap.size() ).arg( mIdRowMap.size() ) ); emit layoutChanged(); //reload(index(0,0), index(rowCount(), columnCount())); - std::cout << "\n"; -*/ - std::cout << "id->row"; +#endif + + QgsDebugMsg( "id->row" ); QMap::iterator it; - for (it = mIdRowMap.begin(); it != mIdRowMap.end(); ++it) - std::cout << it.key() << "->" << *it << "\n"; + for ( it = mIdRowMap.begin(); it != mIdRowMap.end(); ++it ) + QgsDebugMsg( QString( "%1->%2" ).arg( it.key() ).arg( *it ) ); - std::cout << "row->id"; + QgsDebugMsg( "row->id" ); - for (it = mRowIdMap.begin(); it != mRowIdMap.end(); ++it) - std::cout << it.key() << "->" << *it << "\n"; + for ( it = mRowIdMap.begin(); it != mRowIdMap.end(); ++it ) + QgsDebugMsg( QString( "%1->%2" ).arg( it.key() ).arg( *it ) ); } - -void BeataModel::featureAdded(int fid) + +void BeataModel::featureAdded( int fid ) { - std::cout << "BM feature added\n"; + QgsDebugMsg( "BM feature added" ); ++mFeatureCount; - mIdRowMap.insert(fid, mFeatureCount - 1); - mRowIdMap.insert(mFeatureCount - 1, fid); - std::cout << "map sizes:" << mRowIdMap.size() << ", " << mIdRowMap.size() << "\n";; - reload(index(0,0), index(rowCount(), columnCount())); + mIdRowMap.insert( fid, mFeatureCount - 1 ); + mRowIdMap.insert( mFeatureCount - 1, fid ); + QgsDebugMsg( QString( "map sizes:%1, %2" ).arg( mRowIdMap.size() ).arg( mIdRowMap.size() ) ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); } - -void BeataModel::attributeAdded (int idx) + +void BeataModel::attributeAdded( int idx ) { -std::cout << "BM attribute added\n"; + QgsDebugMsg( "BM attribute added" ); loadLayer(); - std::cout << "map sizes:" << mRowIdMap.size() << ", " << mIdRowMap.size() << "\n";; - reload(index(0,0), index(rowCount(), columnCount())); + QgsDebugMsg( QString( "map sizes:%1, %2" ).arg( mRowIdMap.size() ).arg( mIdRowMap.size() ) ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); emit modelChanged(); } - -void BeataModel::attributeDeleted (int idx) + +void BeataModel::attributeDeleted( int idx ) { -std::cout << "BM attribute deleted\n"; + QgsDebugMsg( "BM attribute deleted" ); loadLayer(); - std::cout << "map sizes:" << mRowIdMap.size() << ", " << mIdRowMap.size() << "\n";; - reload(index(0,0), index(rowCount(), columnCount())); + QgsDebugMsg( QString( "map sizes:%1, %2" ).arg( mRowIdMap.size() ).arg( mIdRowMap.size() ) ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); emit modelChanged(); } - + void BeataModel::layerDeleted() { -std::cout << "BM attribute deleted\n"; + QgsDebugMsg( "entered." ); mIdRowMap.clear(); mRowIdMap.clear(); - std::cout << "map sizes:" << mRowIdMap.size() << ", " << mIdRowMap.size() << "\n";; - reload(index(0,0), index(rowCount(), columnCount())); -} - -//TODO: check whether caching in data()/setData() doesn't cache old value -void BeataModel::attributeValueChanged (int fid, int idx, const QVariant &value) -{ - std::cout << "BM attribute changed\n"; - reload(index(0,0), index(rowCount(), columnCount())); + QgsDebugMsg( QString( "map sizes:%1, %2" ).arg( mRowIdMap.size() ).arg( mIdRowMap.size() ) ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); } -void BeataModel::layerModified(bool onlyGeometry) +//TODO: check whether caching in data()/setData() doesn't cache old value +void BeataModel::attributeValueChanged( int fid, int idx, const QVariant &value ) { - if (onlyGeometry) + QgsDebugMsg( "entered." ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); +} + +void BeataModel::layerModified( bool onlyGeometry ) +{ + if ( onlyGeometry ) return; loadLayer(); @@ -197,7 +200,7 @@ void BeataModel::layerModified(bool onlyGeometry) void BeataModel::loadLayer() { - std::cout << "BM loadlayer\n"; + QgsDebugMsg( "entered." ); QgsFeature f; bool ins = false, rm = false; @@ -205,157 +208,157 @@ void BeataModel::loadLayer() mRowIdMap.clear(); mIdRowMap.clear(); - if (mFeatureCount < mLayer->pendingFeatureCount()) + if ( mFeatureCount < mLayer->pendingFeatureCount() ) { - std::cout<<"ins\n"; - ins = true; - beginInsertRows(QModelIndex(), mFeatureCount, mLayer->pendingFeatureCount() - 1); - //std::cout << mFeatureCount << ", " << mLayer->pendingFeatureCount() - 1 << "\n"; + QgsDebugMsg( "ins" ); + ins = true; + beginInsertRows( QModelIndex(), mFeatureCount, mLayer->pendingFeatureCount() - 1 ); +// QgsDebugMsg(QString("%1, %2").arg(mFeatureCount).arg(mLayer->pendingFeatureCount() - 1)); } - else if (mFeatureCount > mLayer->pendingFeatureCount()) + else if ( mFeatureCount > mLayer->pendingFeatureCount() ) { - std::cout<<"rm\n"; - rm = true; - beginRemoveRows(QModelIndex(), mLayer->pendingFeatureCount(), mFeatureCount - 1); - //std::cout << mFeatureCount << ", " << mLayer->pendingFeatureCount() -1 << "\n"; + QgsDebugMsg( "rm" ); + rm = true; + beginRemoveRows( QModelIndex(), mLayer->pendingFeatureCount(), mFeatureCount - 1 ); +// QgsDebugMsg(QString("%1, %2").arg(mFeatureCount).arg(mLayer->pendingFeatureCount() -1)); } - mLayer->select(QgsAttributeList(), QgsRectangle(), false); + mLayer->select( QgsAttributeList(), QgsRectangle(), false ); - for (int i = 0; mLayer->nextFeature(f); ++i) + for ( int i = 0; mLayer->nextFeature( f ); ++i ) { - mRowIdMap.insert(i, f.id()); - mIdRowMap.insert(f.id(), i); + mRowIdMap.insert( i, f.id() ); + mIdRowMap.insert( f.id(), i ); } // not needed when we have featureAdded signal mFeatureCount = mLayer->pendingFeatureCount(); mFieldCount = mLayer->dataProvider()->fieldCount(); - if (ins) + if ( ins ) { endInsertRows(); - std::cout << "end ins\n"; + QgsDebugMsg( "end ins" ); } - else if (rm) + else if ( rm ) { endRemoveRows(); - std::cout << "end rm\n"; + QgsDebugMsg( "end rm" ); } -/* std::cout << "id->row"; +#if 0 + QgsDebugMsg( "id->row" ); QMap::iterator it; - for (it = mIdRowMap.begin(); it != mIdRowMap.end(); ++it) - std::cout << it.key() << "->" << *it << "\n"; - - std::cout << "row->id"; - - for (it = mRowIdMap.begin(); it != mRowIdMap.end(); ++it) - std::cout << it.key() << "->" << *it << "\n";*/ + for ( it = mIdRowMap.begin(); it != mIdRowMap.end(); ++it ) + QgsDebugMsg( QString( "%1->%2" ).arg( it.key() ).arg( *it ) ); + QgsDebugMsg( "row->id" ); + for ( it = mRowIdMap.begin(); it != mRowIdMap.end(); ++it ) + QgsDebugMsg( QString( "%1->%2" ).arg( it.key() ).arg( *it ) ); +#endif } -void BeataModel::swapRows(int a, int b) +void BeataModel::swapRows( int a, int b ) { - if (a == b) + if ( a == b ) return; - int rowA = idToRow(a); - int rowB = idToRow(b); + int rowA = idToRow( a ); + int rowB = idToRow( b ); //emit layoutAboutToBeChanged(); - mRowIdMap.remove(rowA); - mRowIdMap.remove(rowB); - mRowIdMap.insert(rowA, b); - mRowIdMap.insert(rowB, a); + mRowIdMap.remove( rowA ); + mRowIdMap.remove( rowB ); + mRowIdMap.insert( rowA, b ); + mRowIdMap.insert( rowB, a ); - mIdRowMap.remove(a); - mIdRowMap.remove(b); - mIdRowMap.insert(a, rowB); - mIdRowMap.insert(b, rowA); + mIdRowMap.remove( a ); + mIdRowMap.remove( b ); + mIdRowMap.insert( a, rowB ); + mIdRowMap.insert( b, rowA ); //emit layoutChanged(); } -int BeataModel::idToRow(const int id) const +int BeataModel::idToRow( const int id ) const { - if (!mIdRowMap.contains(id)) + if ( !mIdRowMap.contains( id ) ) { - std::cout << "idToRow: id " << id << " not in map\n"; + QgsDebugMsg( QString( "idToRow: id %1 not in map" ).arg( id ) ); return -1; } return mIdRowMap[id]; } -int BeataModel::rowToId(const int id) const +int BeataModel::rowToId( const int id ) const { - if (!mRowIdMap.contains(id)) + if ( !mRowIdMap.contains( id ) ) { - std::cout << "rowToId: row " << id << " not in map\n"; + QgsDebugMsg( QString( "rowToId: row %1 not in map" ).arg( id ) ); return -1; } return mRowIdMap[id]; } -int BeataModel::rowCount(const QModelIndex &parent) const +int BeataModel::rowCount( const QModelIndex &parent ) const { return mFeatureCount; } -int BeataModel::columnCount(const QModelIndex &parent) const +int BeataModel::columnCount( const QModelIndex &parent ) const { return mFieldCount; } -QVariant BeataModel::headerData(int section, Qt::Orientation orientation, int role) const +QVariant BeataModel::headerData( int section, Qt::Orientation orientation, int role ) const { - if (role == Qt::DisplayRole) + if ( role == Qt::DisplayRole ) { - if (orientation == Qt::Vertical) //row + if ( orientation == Qt::Vertical ) //row { - return QVariant(section); + return QVariant( section ); } else { QgsField field = mLayer->dataProvider()->fields()[section]; //column - return QVariant(field.name()); + return QVariant( field.name() ); } } else return QVariant(); } -void BeataModel::sort(int column, Qt::SortOrder order) +void BeataModel::sort( int column, Qt::SortOrder order ) { QgsAttributeMap row; idColumnPair pair; QgsAttributeList attrs; QgsFeature f; - attrs.append(column); + attrs.append( column ); emit layoutAboutToBeChanged(); - //std::cout << "SORTing\n"; +// QgsDebugMsg("SORTing"); mSortList.clear(); - mLayer->select(attrs, QgsRectangle(), false); - while (mLayer->nextFeature(f)) + mLayer->select( attrs, QgsRectangle(), false ); + while ( mLayer->nextFeature( f ) ) { row = f.attributeMap(); pair.id = f.id(); pair.columnItem = row[column]; - mSortList.append(pair); + mSortList.append( pair ); } - if (order == Qt::AscendingOrder) - qStableSort(mSortList.begin(), mSortList.end()); + if ( order == Qt::AscendingOrder ) + qStableSort( mSortList.begin(), mSortList.end() ); else - qStableSort(mSortList.begin(), mSortList.end(), qGreater()); + qStableSort( mSortList.begin(), mSortList.end(), qGreater() ); // recalculate id<->row maps mRowIdMap.clear(); @@ -363,10 +366,10 @@ void BeataModel::sort(int column, Qt::SortOrder order) int i = 0; QList::Iterator it; - for (it = mSortList.begin(); it != mSortList.end(); ++it, ++i) + for ( it = mSortList.begin(); it != mSortList.end(); ++it, ++i ) { - mRowIdMap.insert(i, it->id); - mIdRowMap.insert(it->id, i); + mRowIdMap.insert( i, it->id ); + mIdRowMap.insert( it->id, i ); } // restore selection @@ -375,96 +378,97 @@ void BeataModel::sort(int column, Qt::SortOrder order) emit modelChanged(); } -QVariant BeataModel::data(const QModelIndex &index, int role) const +QVariant BeataModel::data( const QModelIndex &index, int role ) const { - if (!index.isValid() || (role != Qt::TextAlignmentRole && role != Qt::DisplayRole && role != Qt::EditRole) ) + if ( !index.isValid() || ( role != Qt::TextAlignmentRole && role != Qt::DisplayRole && role != Qt::EditRole ) ) return QVariant(); QVariant::Type fldType = mLayer->dataProvider()->fields()[index.column()].type(); - bool fldNumeric = (fldType == QVariant::Int || fldType == QVariant::Double); - - if (role == Qt::TextAlignmentRole) - { - if (fldNumeric) - return QVariant(Qt::AlignRight); - else - return QVariant(Qt::AlignLeft); - } - - // if we don't have the row in current cache, load it from layer first - if (mLastRowId != rowToId(index.row())) - { - bool res = mLayer->featureAtId(rowToId(index.row()), mFeat, false, true); + bool fldNumeric = ( fldType == QVariant::Int || fldType == QVariant::Double ); - if (!res) - return QVariant("ERROR"); - - mLastRowId = rowToId(index.row()); - mLastRow = (QgsAttributeMap *)(&(mFeat.attributeMap())); + if ( role == Qt::TextAlignmentRole ) + { + if ( fldNumeric ) + return QVariant( Qt::AlignRight ); + else + return QVariant( Qt::AlignLeft ); } - - QVariant& val = (*mLastRow)[index.column()]; - - if (val.isNull()) + + // if we don't have the row in current cache, load it from layer first + if ( mLastRowId != rowToId( index.row() ) ) + { + bool res = mLayer->featureAtId( rowToId( index.row() ), mFeat, false, true ); + + if ( !res ) + return QVariant( "ERROR" ); + + mLastRowId = rowToId( index.row() ); + mLastRow = ( QgsAttributeMap * )( &( mFeat.attributeMap() ) ); + } + + QVariant& val = ( *mLastRow )[index.column()]; + + if ( val.isNull() ) { // if the value is NULL, show that in table, but don't show "NULL" text in editor - if (role == Qt::EditRole) + if ( role == Qt::EditRole ) return QVariant(); else - return QVariant("NULL"); + return QVariant( "NULL" ); } - + // force also numeric data for EditRole to be strings // otherwise it creates spinboxes instead of line edits // (probably not what we do want) - if (fldNumeric && role == Qt::EditRole) + if ( fldNumeric && role == Qt::EditRole ) return val.toString(); - + // convert to QString from some other representation // this prevents displaying greater numbers in exponential format return val.toString(); } -bool BeataModel::setData(const QModelIndex &index, const QVariant &value, int role) +bool BeataModel::setData( const QModelIndex &index, const QVariant &value, int role ) { - if (!index.isValid() || role != Qt::EditRole) + if ( !index.isValid() || role != Qt::EditRole ) return false; - if (!mLayer->isEditable()) + if ( !mLayer->isEditable() ) return false; - bool res = mLayer->featureAtId(rowToId(index.row()), mFeat, false, true); + bool res = mLayer->featureAtId( rowToId( index.row() ), mFeat, false, true ); - if (res) { - mLastRowId = rowToId(index.row()); - mLastRow = (QgsAttributeMap *)(&(mFeat.attributeMap())); + if ( res ) + { + mLastRowId = rowToId( index.row() ); + mLastRow = ( QgsAttributeMap * )( &( mFeat.attributeMap() ) ); - mLayer->changeAttributeValue(rowToId(index.row()), index.column(), value, true); - } + mLayer->changeAttributeValue( rowToId( index.row() ), index.column(), value, true ); + } - if (!mLayer->isModified()) + if ( !mLayer->isModified() ) return false; - emit dataChanged(index, index); + emit dataChanged( index, index ); return true; } -Qt::ItemFlags BeataModel::flags(const QModelIndex &index) const +Qt::ItemFlags BeataModel::flags( const QModelIndex &index ) const { - if (!index.isValid()) + if ( !index.isValid() ) return Qt::ItemIsEnabled; - Qt::ItemFlags flags = QAbstractItemModel::flags(index); - - if (mLayer->isEditable()) + Qt::ItemFlags flags = QAbstractItemModel::flags( index ); + + if ( mLayer->isEditable() ) flags |= Qt::ItemIsEditable; - + return flags; } -void BeataModel::reload(const QModelIndex &index1, const QModelIndex &index2) +void BeataModel::reload( const QModelIndex &index1, const QModelIndex &index2 ) { - emit dataChanged(index1, index2); + emit dataChanged( index1, index2 ); } void BeataModel::resetModel() @@ -489,142 +493,145 @@ void BeataModel::incomingChangeLayout() void BeataMemModel::loadLayer() { BeataModel::loadLayer(); - mLayer->select(mLayer->pendingAllAttributesList(), QgsRectangle(), false); + mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false ); QgsFeature f; - while (mLayer->nextFeature(f)) - mFeatureMap.insert(f.id(), f); + while ( mLayer->nextFeature( f ) ) + mFeatureMap.insert( f.id(), f ); } BeataMemModel::BeataMemModel -(QgsVectorLayer *theLayer) -: BeataModel(theLayer) +( QgsVectorLayer *theLayer ) + : BeataModel( theLayer ) { loadLayer(); } -QVariant BeataMemModel::data(const QModelIndex &index, int role) const +QVariant BeataMemModel::data( const QModelIndex &index, int role ) const { - if (!index.isValid() || (role != Qt::TextAlignmentRole && role != Qt::DisplayRole && role != Qt::EditRole)) + if ( !index.isValid() || ( role != Qt::TextAlignmentRole && role != Qt::DisplayRole && role != Qt::EditRole ) ) return QVariant(); QVariant::Type fldType = mLayer->dataProvider()->fields()[index.column()].type(); - bool fldNumeric = (fldType == QVariant::Int || fldType == QVariant::Double); - - if (role == Qt::TextAlignmentRole) + bool fldNumeric = ( fldType == QVariant::Int || fldType == QVariant::Double ); + + if ( role == Qt::TextAlignmentRole ) { - if (fldNumeric) - return QVariant(Qt::AlignRight); + if ( fldNumeric ) + return QVariant( Qt::AlignRight ); else - return QVariant(Qt::AlignLeft); + return QVariant( Qt::AlignLeft ); } - + // if we don't have the row in current cache, load it from layer first - if (mLastRowId != rowToId(index.row())) + if ( mLastRowId != rowToId( index.row() ) ) { //bool res = mLayer->featureAtId(rowToId(index.row()), mFeat, false, true); - bool res = mFeatureMap.contains(rowToId(index.row())); + bool res = mFeatureMap.contains( rowToId( index.row() ) ); - if (!res) - return QVariant("ERROR"); - - mLastRowId = rowToId(index.row()); - mFeat = mFeatureMap[rowToId(index.row())]; - mLastRow = (QgsAttributeMap *)(&(mFeat.attributeMap())); + if ( !res ) + return QVariant( "ERROR" ); + + mLastRowId = rowToId( index.row() ); + mFeat = mFeatureMap[rowToId( index.row() )]; + mLastRow = ( QgsAttributeMap * )( &( mFeat.attributeMap() ) ); } - - QVariant& val = (*mLastRow)[index.column()]; - if (val.isNull()) + QVariant& val = ( *mLastRow )[index.column()]; + + if ( val.isNull() ) { // if the value is NULL, show that in table, but don't show "NULL" text in editor - if (role == Qt::EditRole) + if ( role == Qt::EditRole ) return QVariant(); else - return QVariant("NULL"); + return QVariant( "NULL" ); } - + // force also numeric data for EditRole to be strings // otherwise it creates spinboxes instead of line edits // (probably not what we do want) - if (fldNumeric && role == Qt::EditRole) + if ( fldNumeric && role == Qt::EditRole ) return val.toString(); - + // convert to QString from some other representation // this prevents displaying greater numbers in exponential format return val.toString(); } -bool BeataMemModel::setData(const QModelIndex &index, const QVariant &value, int role) +bool BeataMemModel::setData( const QModelIndex &index, const QVariant &value, int role ) { - if (!index.isValid() || role != Qt::EditRole) + if ( !index.isValid() || role != Qt::EditRole ) return false; - if (!mLayer->isEditable()) + if ( !mLayer->isEditable() ) return false; //bool res = mLayer->featureAtId(rowToId(index.row()), mFeat, false, true); - bool res = mFeatureMap.contains(rowToId(index.row())); + bool res = mFeatureMap.contains( rowToId( index.row() ) ); - if (res) { - mLastRowId = rowToId(index.row()); - mFeat = mFeatureMap[rowToId(index.row())]; - mLastRow = (QgsAttributeMap *)(&(mFeat.attributeMap())); + if ( res ) + { + mLastRowId = rowToId( index.row() ); + mFeat = mFeatureMap[rowToId( index.row() )]; + mLastRow = ( QgsAttributeMap * )( &( mFeat.attributeMap() ) ); - //std::cout << mFeatureMap[rowToId(index.row())].id(); - mFeatureMap[rowToId(index.row())].changeAttribute(index.column(), value); +// QgsDebugMsg(mFeatureMap[rowToId(index.row())].id()); + mFeatureMap[rowToId( index.row() )].changeAttribute( index.column(), value ); // propagate back to the layer - mLayer->changeAttributeValue(rowToId(index.row()), index.column(), value, true); + mLayer->changeAttributeValue( rowToId( index.row() ), index.column(), value, true ); } - if (!mLayer->isModified()) + if ( !mLayer->isModified() ) return false; - emit dataChanged(index, index); + emit dataChanged( index, index ); return true; } -void BeataMemModel::featureDeleted(int fid) +void BeataMemModel::featureDeleted( int fid ) { -std::cout << "BMM feature deleted\n"; - mFeatureMap.remove(fid); - BeataModel::featureDeleted(fid); + QgsDebugMsg( "entered." ); + mFeatureMap.remove( fid ); + BeataModel::featureDeleted( fid ); } - -void BeataMemModel::featureAdded(int fid) + +void BeataMemModel::featureAdded( int fid ) { - std::cout << "BMM feature added\n"; + QgsDebugMsg( "entered." ); QgsFeature f; - mLayer->featureAtId(fid, f, false, true); - mFeatureMap.insert(fid, f); - BeataModel::featureAdded(fid); + mLayer->featureAtId( fid, f, false, true ); + mFeatureMap.insert( fid, f ); + BeataModel::featureAdded( fid ); } - -/*void BeataMemModel::attributeAdded (int idx) + +#if 0 +void BeataMemModel::attributeAdded( int idx ) { - std::cout << "attribute added\n"; + QgsDebugMsg( "entered." ); loadLayer(); - reload(index(0,0), index(rowCount(), columnCount())); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); } - -void BeataMemModel::attributeDeleted (int idx) + +void BeataMemModel::attributeDeleted( int idx ) { - std::cout << "attribute deleted\n"; + QgsDebugMsg( "entered." ); loadLayer(); - reload(index(0,0), index(rowCount(), columnCount())); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); } - */ -void BeataMemModel::layerDeleted () +#endif + +void BeataMemModel::layerDeleted() { - std::cout << "BMM layer del\n"; + QgsDebugMsg( "entered." ); mFeatureMap.clear(); BeataModel::layerDeleted(); } - -void BeataMemModel::attributeValueChanged (int fid, int idx, const QVariant &value) + +void BeataMemModel::attributeValueChanged( int fid, int idx, const QVariant &value ) { - std::cout << "BMM attribute changed\n"; - mFeatureMap[fid].changeAttribute(idx, value); - reload(index(0,0), index(rowCount(), columnCount())); + QgsDebugMsg( "entered." ); + mFeatureMap[fid].changeAttribute( idx, value ); + reload( index( 0, 0 ), index( rowCount(), columnCount() ) ); }