@@ -289,7 +289,7 @@ QgsFeature *QgsGrassProvider::getFirstFeature(bool fetchAttributes)
289
289
std::cout << " QgsGrassProvider::getFirstFeature()" << std::endl;
290
290
#endif
291
291
292
- if ( isEdited () )
292
+ if ( isEdited () || isFrozen () )
293
293
return 0 ;
294
294
295
295
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -309,7 +309,7 @@ bool QgsGrassProvider::getNextFeature(QgsFeature &feature, bool fetchAttributes)
309
309
std::cout << " QgsGrassProvider::getNextFeature()" << std::endl;
310
310
#endif
311
311
312
- if ( isEdited () )
312
+ if ( isEdited () || isFrozen () )
313
313
return 0 ;
314
314
315
315
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -330,7 +330,7 @@ QgsFeature *QgsGrassProvider::getNextFeature(bool fetchAttributes)
330
330
<< " fetchAttributes = " << fetchAttributes << std::endl;
331
331
#endif
332
332
333
- if ( isEdited () )
333
+ if ( isEdited () || isFrozen () )
334
334
return 0 ;
335
335
336
336
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -357,7 +357,7 @@ QgsFeature* QgsGrassProvider::getNextFeature(std::list<int> const& attlist, int
357
357
std::cout << " QgsGrassProvider::getNextFeature( attlist )" << std::endl;
358
358
#endif
359
359
360
- if ( isEdited () )
360
+ if ( isEdited () || isFrozen () )
361
361
return 0 ;
362
362
363
363
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -486,7 +486,7 @@ void QgsGrassProvider::select(QgsRect *rect, bool useIntersect)
486
486
std::cout << " QgsGrassProvider::select() useIntersect = " << useIntersect << std::endl;
487
487
#endif
488
488
489
- if ( isEdited () )
489
+ if ( isEdited () || isFrozen () )
490
490
return ;
491
491
492
492
// check if outdated and update if necessary
@@ -560,7 +560,7 @@ std::vector<QgsFeature>& QgsGrassProvider::identify(QgsRect * rect)
560
560
561
561
// TODO: does not return vector of features! Should it?
562
562
563
- if ( !isEdited () ) {
563
+ if ( !isEdited () && ! isFrozen () ) {
564
564
select (rect, true );
565
565
}
566
566
}
@@ -614,7 +614,7 @@ int QgsGrassProvider::keyField()
614
614
615
615
void QgsGrassProvider::reset ()
616
616
{
617
- if ( isEdited () )
617
+ if ( isEdited () || isFrozen () )
618
618
return ;
619
619
620
620
int mapId = mLayers [mLayerId ].mapId ;
@@ -1013,6 +1013,8 @@ int QgsGrassProvider::openMap(QString gisdbase, QString location, QString mapset
1013
1013
}
1014
1014
1015
1015
GMAP map;
1016
+ map.valid = false ;
1017
+ map.frozen = false ;
1016
1018
map.gisdbase = gisdbase;
1017
1019
map.location = location;
1018
1020
map.mapset = mapset;
@@ -1096,6 +1098,8 @@ int QgsGrassProvider::openMap(QString gisdbase, QString location, QString mapset
1096
1098
#ifdef QGISDEBUG
1097
1099
std::cerr << " GRASS map successfully opened" << std::endl;
1098
1100
#endif
1101
+
1102
+ map.valid = true ;
1099
1103
1100
1104
// Add new map to maps
1101
1105
mMaps .push_back (map);
@@ -1373,6 +1377,49 @@ bool QgsGrassProvider::isEdited ( void )
1373
1377
return (map->update );
1374
1378
}
1375
1379
1380
+ bool QgsGrassProvider::isFrozen ( void )
1381
+ {
1382
+ #if QGISDEBUG > 3
1383
+ std::cerr << " QgsGrassProvider::isFrozen" << std::endl;
1384
+ #endif
1385
+
1386
+ GMAP *map = &(mMaps [mLayers [mLayerId ].mapId ]);
1387
+ return (map->frozen );
1388
+ }
1389
+
1390
+ void QgsGrassProvider::freeze ()
1391
+ {
1392
+ #ifdef QGISDEBUG
1393
+ std::cerr << " QgsGrassProvider::freeze" << std::endl;
1394
+ #endif
1395
+
1396
+ if ( !isValid () ) return ;
1397
+
1398
+ GMAP *map = &(mMaps [mLayers [mLayerId ].mapId ]);
1399
+
1400
+ if ( map->frozen ) return ;
1401
+
1402
+ map->frozen = true ;
1403
+ Vect_close ( map->map );
1404
+ }
1405
+
1406
+ void QgsGrassProvider::thaw ()
1407
+ {
1408
+ #ifdef QGISDEBUG
1409
+ std::cerr << " QgsGrassProvider::thaw" << std::endl;
1410
+ #endif
1411
+
1412
+ if ( !isValid () ) return ;
1413
+ GMAP *map = &(mMaps [mLayers [mLayerId ].mapId ]);
1414
+
1415
+ if ( !map->frozen ) return ;
1416
+
1417
+ if ( reopenMap () )
1418
+ {
1419
+ map->frozen = false ;
1420
+ }
1421
+ }
1422
+
1376
1423
bool QgsGrassProvider::startEdit ( void )
1377
1424
{
1378
1425
#ifdef QGISDEBUG
@@ -1485,6 +1532,19 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
1485
1532
1486
1533
Vect_close ( map->map );
1487
1534
1535
+ map->update = false ;
1536
+
1537
+ if ( !reopenMap () ) return false ;
1538
+
1539
+ map->valid = true ;
1540
+
1541
+ return true ;
1542
+ }
1543
+
1544
+ bool QgsGrassProvider::reopenMap ()
1545
+ {
1546
+ GMAP *map = &(mMaps [mLayers [mLayerId ].mapId ]);
1547
+
1488
1548
QFileInfo di ( mGisdbase + " /" + mLocation + " /" + mMapset + " /vector/" + mMapName );
1489
1549
map->lastModified = di.lastModified ();
1490
1550
@@ -1499,7 +1559,7 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
1499
1559
1500
1560
if ( QgsGrass::getError () == QgsGrass::FATAL ) {
1501
1561
std::cerr << " Cannot reopen GRASS vector: " << QgsGrass::getErrorMessage ().toLocal8Bit ().data () << std::endl;
1502
- return - 1 ;
1562
+ return false ;
1503
1563
}
1504
1564
1505
1565
#ifdef QGISDEBUG
@@ -1515,9 +1575,6 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
1515
1575
}
1516
1576
}
1517
1577
1518
- map->update = false ;
1519
- map->valid = true ;
1520
-
1521
1578
return true ;
1522
1579
}
1523
1580
0 commit comments