[QGIS Commit] r14623 - in trunk/qgis/src: app ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Nov 13 17:00:10 EST 2010


Author: jef
Date: 2010-11-13 14:00:10 -0800 (Sat, 13 Nov 2010)
New Revision: 14623

Modified:
   trunk/qgis/src/app/qgisapp.cpp
   trunk/qgis/src/app/qgisapp.h
   trunk/qgis/src/app/qgsoptions.cpp
   trunk/qgis/src/app/qgsprojectproperties.cpp
   trunk/qgis/src/app/qgsprojectproperties.h
   trunk/qgis/src/app/qgssnappingdialog.cpp
   trunk/qgis/src/app/qgssnappingdialog.h
   trunk/qgis/src/ui/qgsoptionsbase.ui
   trunk/qgis/src/ui/qgsprojectpropertiesbase.ui
   trunk/qgis/src/ui/qgssnappingdialogbase.ui
Log:
apply #3206

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgisapp.cpp	2010-11-13 22:00:10 UTC (rev 14623)
@@ -162,6 +162,7 @@
 #include "qgsquerybuilder.h"
 #include "qgsattributeaction.h"
 #include "qgsgpsinformationwidget.h"
+#include "qgssnappingdialog.h"
 
 //
 // Gdal/Ogr includes
@@ -430,6 +431,9 @@
   addDockWidget( Qt::LeftDockWidgetArea, mUndoWidget );
   mUndoWidget->hide();
 
+  mSnappingDialog = new QgsSnappingDialog( this,  mMapCanvas );
+  mSnappingDialog->setObjectName( "SnappingOption" );
+
   mInternalClipboard = new QgsClipboard; // create clipboard
   mQgisInterface = new QgisAppInterface( this ); // create the interfce
 
@@ -862,6 +866,11 @@
   connect( mActionRotatePointSymbols, SIGNAL( triggered() ), this, SLOT( rotatePointSymbols() ) );
   mActionRotatePointSymbols->setEnabled( false );
 
+  mActionSnappingOptions = new QAction( getThemeIcon( "mActionSnappingOptions.png" ), tr( "Snapping Options..." ), this );
+  shortcuts->registerAction( mActionSnappingOptions );
+  mActionSnappingOptions->setStatusTip( tr( "Manage the background snapping options" ) );
+  connect( mActionSnappingOptions, SIGNAL( triggered() ), this, SLOT( snappingOptions() ) );
+
   // View Menu Items
 
   mActionPan = new QAction( getThemeIcon( "mActionPan.png" ), tr( "Pan Map" ), this );
@@ -1441,6 +1450,14 @@
   mEditMenu->addAction( mActionNodeTool );
   mEditMenu->addAction( mActionRotatePointSymbols );
 
+  QSettings myQsettings;
+  bool myDockFlag = myQsettings.value( "/qgis/dockSnapping", false ).toBool();
+  if ( !myDockFlag )
+  {
+    mActionEditSeparator4 = mEditMenu->addSeparator();
+    mEditMenu->addAction( mActionSnappingOptions );
+  }
+
   if ( layout == QDialogButtonBox::GnomeLayout || layout == QDialogButtonBox::MacLayout )
   {
     mActionEditSeparator3 = mEditMenu->addSeparator();
@@ -4446,6 +4463,11 @@
   mMapCanvas->setMapTool( mMapTools.mRotatePointSymbolsTool );
 }
 
+void QgisApp::snappingOptions()
+{
+  mSnappingDialog->show();
+}
+
 void QgisApp::splitFeatures()
 {
   mMapCanvas->setMapTool( mMapTools.mSplitFeatures );

Modified: trunk/qgis/src/app/qgisapp.h
===================================================================
--- trunk/qgis/src/app/qgisapp.h	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgisapp.h	2010-11-13 22:00:10 UTC (rev 14623)
@@ -67,6 +67,7 @@
 class QNetworkProxy;
 class QAuthenticator;
 
+class QgsSnappingDialog;
 class QgsGPSInformationWidget;
 
 #include <QMainWindow>
@@ -78,6 +79,7 @@
 #include "qgsconfig.h"
 #include "qgsfeature.h"
 #include "qgspoint.h"
+#include "qgssnappingdialog.h"
 
 /*! \class QgisApp
  * \brief Main window for the Qgis application
@@ -242,6 +244,8 @@
     QAction *actionDeletePart() { return mActionDeletePart; }
     QAction *actionNodeTool() { return mActionNodeTool; }
     QAction *actionEditSeparator2() { return mActionEditSeparator2; }
+    QAction *actionSnappingOptions() { return mActionSnappingOptions; }
+    QAction *actionEditSeparator4() { return mActionEditSeparator4; }
 
     QAction *actionPan() { return mActionPan; }
     QAction *actionZoomIn() { return mActionZoomIn; }
@@ -618,6 +622,8 @@
     void nodeTool();
     //! activates the rotate points tool
     void rotatePointSymbols();
+    //! shows the snapping Options
+    void snappingOptions();
 
     //! activates the selection tool
     void select();
@@ -900,6 +906,8 @@
     QAction *mActionNodeTool;
     QAction *mActionRotatePointSymbols;
     QAction *mActionEditSeparator3;
+    QAction *mActionSnappingOptions;
+    QAction *mActionEditSeparator4;
 
     QAction *mActionPan;
     QAction *mActionZoomIn;
@@ -1015,6 +1023,7 @@
     QDockWidget *mpTileScaleDock;
     QDockWidget *mpGpsDock;
 
+
 #ifdef Q_WS_MAC
     //! Window menu action to select this window
     QAction *mWindowAction;
@@ -1165,6 +1174,8 @@
 
     QgsUndoWidget* mUndoWidget;
 
+    QgsSnappingDialog* mSnappingDialog;
+
     //! Persistent tile scale slider
     QgsTileScaleWidget * mpTileScaleWidget;
 

Modified: trunk/qgis/src/app/qgsoptions.cpp
===================================================================
--- trunk/qgis/src/app/qgsoptions.cpp	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgsoptions.cpp	2010-11-13 22:00:10 UTC (rev 14623)
@@ -249,6 +249,7 @@
   cbxHideSplash->setChecked( settings.value( "/qgis/hideSplash", false ).toBool() );
   cbxAttributeTableDocked->setChecked( settings.value( "/qgis/dockAttributeTable", false ).toBool() );
   cbxIdentifyResultsDocked->setChecked( settings.value( "/qgis/dockIdentifyResults", false ).toBool() );
+  cbxSnappingOptionsDocked->setChecked( settings.value( "/qgis/dockSnapping", false ).toBool() );
   cbxAddPostgisDC->setChecked( settings.value( "/qgis/addPostgisDC", false ).toBool() );
   cbxAddNewLayersToCurrentGroup->setChecked( settings.value( "/qgis/addNewLayersToCurrentGroup", false ).toBool() );
   cbxCreateRasterLegendIcons->setChecked( settings.value( "/qgis/createRasterLegendIcons", true ).toBool() );
@@ -505,6 +506,7 @@
   settings.setValue( "/qgis/dockAttributeTable", cbxAttributeTableDocked->isChecked() );
   settings.setValue( "/qgis/attributeTableBehaviour", cmbAttrTableBehaviour->currentIndex() );
   settings.setValue( "/qgis/dockIdentifyResults", cbxIdentifyResultsDocked->isChecked() );
+  settings.setValue( "/qgis/dockSnapping", cbxSnappingOptionsDocked->isChecked() );
   settings.setValue( "/qgis/addPostgisDC", cbxAddPostgisDC->isChecked() );
   settings.setValue( "/qgis/addNewLayersToCurrentGroup", cbxAddNewLayersToCurrentGroup->isChecked() );
   settings.setValue( "/qgis/createRasterLegendIcons", cbxCreateRasterLegendIcons->isChecked() );

Modified: trunk/qgis/src/app/qgsprojectproperties.cpp
===================================================================
--- trunk/qgis/src/app/qgsprojectproperties.cpp	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgsprojectproperties.cpp	2010-11-13 22:00:10 UTC (rev 14623)
@@ -127,91 +127,8 @@
     }
   }
 
-  bool layerIdListOk, enabledListOk, toleranceListOk, toleranceUnitListOk, snapToListOk;
-  QStringList layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", &layerIdListOk );
-  QStringList enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", &enabledListOk );
-  QStringList toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", & toleranceListOk );
-  QStringList toleranceUnitList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceUnitList", & toleranceUnitListOk );
-  QStringList snapToList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnapToList", &snapToListOk );
-
-  QStringList::const_iterator idIter = layerIdList.constBegin();
-  QStringList::const_iterator enabledIter = enabledList.constBegin();
-  QStringList::const_iterator tolIter = toleranceList.constBegin();
-  QStringList::const_iterator tolUnitIter = toleranceUnitList.constBegin();
-  QStringList::const_iterator snapToIter = snapToList.constBegin();
-
   QgsMapLayer* currentLayer = 0;
 
-  //create the new layer entries
-  for ( ; idIter != layerIdList.constEnd(); ++idIter, ++enabledIter, ++tolIter, ++tolUnitIter, ++snapToIter )
-  {
-    if ( layerIdListOk )
-    {
-      currentLayer = QgsMapLayerRegistry::instance()->mapLayer( *idIter );
-    }
-    else
-    {
-      break;
-    }
-
-    if ( currentLayer )
-    {
-      LayerEntry newEntry;
-      newEntry.layerName = currentLayer->name();
-
-      newEntry.checked = false;
-      if ( enabledListOk && enabledIter != enabledList.constEnd() )
-      {
-        if (( *enabledIter ) == "enabled" )
-        {
-          newEntry.checked = true;
-        }
-      }
-
-      //snap to vertex / segment / vertex and segment
-      if ( snapToListOk && snapToIter != snapToList.constEnd() )
-      {
-        if (( *snapToIter ) == "to_vertex" )
-        {
-          newEntry.snapTo = 0;
-        }
-        else if (( *snapToIter ) == "to_segment" )
-        {
-          newEntry.snapTo = 1;
-        }
-        else //to vertex and segment
-        {
-          newEntry.snapTo = 2;
-        }
-      }
-      else
-      {
-        newEntry.snapTo = 0;
-      }
-
-      //snap tolerance
-      if ( toleranceListOk && tolIter != toleranceList.constEnd() )
-      {
-        newEntry.tolerance = tolIter->toDouble();
-      }
-      else
-      {
-        newEntry.tolerance = 0;
-      }
-
-      //snap tolerance unit
-      if ( toleranceUnitListOk && tolUnitIter != toleranceUnitList.constEnd() )
-      {
-        newEntry.toleranceUnit = tolUnitIter->toInt();
-      }
-      else
-      {
-        newEntry.toleranceUnit = 0;
-      }
-      mSnappingLayerSettings.insert( *idIter, newEntry );
-    }
-  }
-
   QStringList noIdentifyLayerIdList = QgsProject::instance()->readListEntry( "Identify", "/disabledLayers" );
 
   const QMap<QString, QgsMapLayer*> &mapLayers = QgsMapLayerRegistry::instance()->mapLayers();
@@ -418,51 +335,6 @@
   QgsProject::instance()->writeEntry( "Digitizing", "/AvoidIntersectionsList", avoidIntersectionList );
 
 
-  QMap<QString, LayerEntry>::const_iterator layerEntryIt;
-
-  //store the layer snapping settings as string lists
-  QStringList layerIdList;
-  QStringList snapToList;
-  QStringList toleranceList;
-  QStringList enabledList;
-  QStringList toleranceUnitList;
-
-  for ( layerEntryIt = mSnappingLayerSettings.constBegin(); layerEntryIt != mSnappingLayerSettings.constEnd(); ++layerEntryIt )
-  {
-    layerIdList << layerEntryIt.key();
-    toleranceList << QString::number( layerEntryIt->tolerance, 'f' );
-    toleranceUnitList << QString::number(( int )layerEntryIt->toleranceUnit );
-    if ( layerEntryIt->checked )
-    {
-      enabledList << "enabled";
-    }
-    else
-    {
-      enabledList << "disabled";
-    }
-    if ( layerEntryIt->snapTo == 0 )
-    {
-      snapToList << "to_vertex";
-    }
-    else if ( layerEntryIt->snapTo == 1 )
-    {
-      snapToList << "to_segment";
-    }
-    else //to vertex and segment
-    {
-      snapToList << "to_vertex_and_segment";
-    }
-  }
-
-  if ( mSnappingLayerSettings.size() > 0 )
-  {
-    QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingList", layerIdList );
-    QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnapToList", snapToList );
-    QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingToleranceList", toleranceList );
-    QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingToleranceUnitList", toleranceUnitList );
-    QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingEnabledList", enabledList );
-  }
-
   QStringList noIdentifyLayerList;
   for ( int i = 0; i < twIdentifyLayers->rowCount(); i++ )
   {
@@ -517,15 +389,6 @@
   }
 }
 
-void QgsProjectProperties::on_mSnappingOptionsPushButton_clicked()
-{
-  QgsSnappingDialog d( mMapCanvas, mSnappingLayerSettings );
-  if ( d.exec() == QDialog::Accepted )
-  {
-    //retrieve the new layer snapping settings from the dialog
-    d.layerSettings( mSnappingLayerSettings );
-  }
-}
 
 void QgsProjectProperties::on_cbxProjectionEnabled_stateChanged( int state )
 {

Modified: trunk/qgis/src/app/qgsprojectproperties.h
===================================================================
--- trunk/qgis/src/app/qgsprojectproperties.h	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgsprojectproperties.h	2010-11-13 22:00:10 UTC (rev 14623)
@@ -95,11 +95,6 @@
       */
     void on_mAvoidIntersectionsPushButton_clicked();
 
-    /*!
-     * Slot to show dialog for the layer snapping options
-     */
-    void on_mSnappingOptionsPushButton_clicked();
-
     void on_cbxProjectionEnabled_stateChanged( int state );
 
     /*!
@@ -118,15 +113,9 @@
   private:
     QgsMapCanvas* mMapCanvas;
 
-    /**Snapping settings to pass/read from QgsSnappingDialog.
-     Key is the layer id, the pair consists of snap to vertex = 0/snap to segment = 1,
-    snapping tolerance*/
-    QMap<QString, LayerEntry> mSnappingLayerSettings;
-
     /**Stores ids of layers where intersections of new polygons is considered. Is passed to / read from QgsAvoidIntersectionsDialog*/
     QSet<QString> mAvoidIntersectionsSettings;
 
-
     /*!
      * Function to save dialog window state
      */

Modified: trunk/qgis/src/app/qgssnappingdialog.cpp
===================================================================
--- trunk/qgis/src/app/qgssnappingdialog.cpp	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgssnappingdialog.cpp	2010-11-13 22:00:10 UTC (rev 14623)
@@ -19,174 +19,203 @@
 #include "qgsmapcanvas.h"
 #include "qgsmaplayer.h"
 #include "qgsvectorlayer.h"
+#include "qgsmaplayerregistry.h"
+#include "qgisapp.h"
+#include "qgsproject.h"
 #include <QCheckBox>
 #include <QDoubleValidator>
 #include <QComboBox>
 #include <QLineEdit>
+#include <QDockWidget>
 
-QgsSnappingDialog::QgsSnappingDialog( QgsMapCanvas* canvas, const QMap<QString, LayerEntry >& settings ): mMapCanvas( canvas )
+
+class QgsSnappingDock : public QDockWidget
 {
-  setupUi( this );
-  connect( mButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) );
-  connect( mButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) );
+  public:
+    QgsSnappingDock( const QString & title, QWidget * parent = 0, Qt::WindowFlags flags = 0 )
+        : QDockWidget( title, parent, flags )
+    {
+      setObjectName( "Snapping Options" ); // set object name so the position can be saved
+    }
 
-  //an entry for each layer
-  int nLayers = mMapCanvas->layerCount();
-  int nVectorLayers = 0;
-  //mLayerTableWidget->setRowCount(nLayers);
+    virtual void closeEvent( QCloseEvent * ev )
+    {
+      //deleteLater();
+    }
 
-  QgsMapLayer* currentLayer = 0;
-  QgsVectorLayer* currentVectorLayer = 0;
-  QString currentLayerName;
-  QMap<QString, LayerEntry >::const_iterator settingIt;
-  QTreeWidgetItem* newItem = 0;
+};
 
-  if ( mMapCanvas )
+QgsSnappingDialog::QgsSnappingDialog( QWidget* parent, QgsMapCanvas* canvas ): QDialog( parent ), mMapCanvas( canvas )
+{
+  setupUi( this );
+
+  QSettings myQsettings;
+  bool myDockFlag = myQsettings.value( "/qgis/dockSnapping", false ).toBool();
+  if ( myDockFlag )
   {
-    for ( int i = 0; i < nLayers; ++i )
-    {
-      currentLayer = mMapCanvas->layer( i );
-      if ( currentLayer )
-      {
-        currentVectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
-        if ( currentVectorLayer )
-        {
-          //snap to layer yes/no
-          newItem = new QTreeWidgetItem( mLayerTreeWidget );
-          newItem->setText( 0, currentLayer->name() );
-          mLayerIds << currentLayer->getLayerID(); //store also the layer id
-          newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
-          newItem->setCheckState( 0, Qt::Unchecked );
+    mDock = new QgsSnappingDock( tr( "Snapping Options" ), QgisApp::instance() );
+    mDock->setAllowedAreas( Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea );
+    mDock->setWidget( this );
+    connect( this, SIGNAL( destroyed() ), mDock, SLOT( close() ) );
+    QgisApp::instance()->addDockWidget( Qt::BottomDockWidgetArea, mDock );
+    mButtonBox->setVisible( false );
+  }
+  else
+  {
+    connect( mButtonBox, SIGNAL( accepted() ), this, SLOT( apply() ) );
+  }
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer * ) ), this, SLOT( update() ) );
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( update() ) );
 
-          //snap to vertex/ snap to segment
-          QComboBox* snapToComboBox = new QComboBox( mLayerTreeWidget );
-          snapToComboBox->insertItem( 0, tr( "to vertex" ) );
-          snapToComboBox->insertItem( 1, tr( "to segment" ) );
-          snapToComboBox->insertItem( 2, tr( "to vertex and segment" ) );
-          mLayerTreeWidget->setItemWidget( newItem, 1, snapToComboBox );
+  update();
 
-          //snapping tolerance
-          QLineEdit* snappingToleranceEdit = new QLineEdit( mLayerTreeWidget );
-          QDoubleValidator* validator = new QDoubleValidator( snappingToleranceEdit );
-          snappingToleranceEdit->setValidator( validator );
-          mLayerTreeWidget->setItemWidget( newItem, 2, snappingToleranceEdit );
-
-          //snap to vertex/ snap to segment
-          QComboBox* toleranceUnitsComboBox = new QComboBox( mLayerTreeWidget );
-          toleranceUnitsComboBox->insertItem( 0, tr( "map units" ) );
-          toleranceUnitsComboBox->insertItem( 1, tr( "pixels" ) );
-          mLayerTreeWidget->setItemWidget( newItem, 3, toleranceUnitsComboBox );
-
-          settingIt = settings.find( currentVectorLayer->getLayerID() );
-          if ( settingIt != settings.constEnd() )
-          {
-            snappingToleranceEdit->setText( QString::number( settingIt.value().tolerance ) );
-            int index;
-            if ( settingIt.value().snapTo == 0 )//to segment
-            {
-              index = snapToComboBox->findText( tr( "to vertex" ) );
-            }
-            else if ( settingIt.value().snapTo == 1 ) //to vertex
-            {
-              index = snapToComboBox->findText( tr( "to segment" ) );
-            }
-            else //to vertex and segment
-            {
-              index = snapToComboBox->findText( tr( "to vertex and segment" ) );
-            }
-            snapToComboBox->setCurrentIndex( index );
-            if ( settingIt.value().toleranceUnit == 0 )//map units
-            {
-              index = toleranceUnitsComboBox->findText( tr( "map units" ) );
-            }
-            else
-            {
-              index = toleranceUnitsComboBox->findText( tr( "pixels" ) );
-            }
-            toleranceUnitsComboBox->setCurrentIndex( index );
-            if ( settingIt.value().checked )
-            {
-              newItem->setCheckState( 0, Qt::Checked );
-            }
-          }
-          else //insert the default values
-          {
-            snappingToleranceEdit->setText( "0" );
-          }
-          ++nVectorLayers;
-        }
-      }
-    }
-    mLayerTreeWidget->resizeColumnToContents( 0 );
-    mLayerTreeWidget->setColumnWidth( 1, 200 );  //hardcoded for now
-    mLayerTreeWidget->resizeColumnToContents( 2 );
-    mLayerTreeWidget->resizeColumnToContents( 3 );
-  }
+  mLayerTreeWidget->setHeaderLabels( QStringList() << "" );
+  mLayerTreeWidget->resizeColumnToContents( 0 );
+  mLayerTreeWidget->setColumnWidth( 1, 200 );  //hardcoded for now
+  mLayerTreeWidget->setColumnWidth( 2, 200 );  //hardcoded for now
+  mLayerTreeWidget->resizeColumnToContents( 3 );
+  mLayerTreeWidget->resizeColumnToContents( 4 );
+  mLayerTreeWidget->setSortingEnabled( true );
 }
 
 QgsSnappingDialog::QgsSnappingDialog()
 {
-
 }
 
 QgsSnappingDialog::~QgsSnappingDialog()
 {
+}
 
+void QgsSnappingDialog::closeEvent( QCloseEvent* event )
+{
+  QDialog::closeEvent( event );
+
+  if ( mDock == NULL )
+  {
+    QSettings settings;
+    settings.setValue( "/Windows/BetterSnapping/geometry", saveGeometry() );
+  }
 }
 
-void QgsSnappingDialog::layerSettings( QMap<QString, LayerEntry>& settings ) const
+
+void QgsSnappingDialog::update()
 {
-  settings.clear();
+  if ( !mMapCanvas )
+    return;
 
-  int nRows = mLayerTreeWidget->topLevelItemCount();
-  QTreeWidgetItem* currentItem = 0;
-  QString layerId;
-  QString layerName;
-  QString snapToItemText;
-  QString toleranceItemText;
-  int snapTo;
-  int toleranceUnit;
-  double tolerance;
-  bool checked = false;
+  QSettings myQsettings;
+  bool myDockFlag = myQsettings.value( "/qgis/dockSnapping", false ).toBool();
 
-  for ( int i = 0; i < nRows; ++i )
+  bool layerIdListOk, enabledListOk, toleranceListOk, toleranceUnitListOk, snapToListOk;
+  QStringList layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", &layerIdListOk );
+  QStringList enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", &enabledListOk );
+  QStringList toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", & toleranceListOk );
+  QStringList toleranceUnitList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceUnitList", & toleranceUnitListOk );
+  QStringList snapToList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnapToList", &snapToListOk );
+
+  mLayerTreeWidget->clear();
+
+  for ( int i = 0; i < mMapCanvas->layerCount(); ++i )
   {
-    currentItem = mLayerTreeWidget->topLevelItem( i );
-    if ( !currentItem )
+    QgsVectorLayer *currentVectorLayer = qobject_cast<QgsVectorLayer *>( mMapCanvas->layer( i ) );
+    if ( !currentVectorLayer )
+      continue;
+
+    //snap to layer yes/no
+    QTreeWidgetItem *item = new QTreeWidgetItem( mLayerTreeWidget );
+
+    QCheckBox *cbxEnable = new QCheckBox( mLayerTreeWidget );
+    mLayerTreeWidget->setItemWidget( item, 0, cbxEnable );
+    item->setData( 0, Qt::UserRole, currentVectorLayer->getLayerID() );
+
+    item->setText( 1, currentVectorLayer->name() );
+
+    //snap to vertex/ snap to segment
+    QComboBox *cbxSnapTo = new QComboBox( mLayerTreeWidget );
+    cbxSnapTo->insertItem( 0, tr( "to vertex" ) );
+    cbxSnapTo->insertItem( 1, tr( "to segment" ) );
+    cbxSnapTo->insertItem( 2, tr( "to vertex and segment" ) );
+    mLayerTreeWidget->setItemWidget( item, 2, cbxSnapTo );
+
+    //snapping tolerance
+    QLineEdit *leTolerance = new QLineEdit( mLayerTreeWidget );
+    QDoubleValidator *validator = new QDoubleValidator( leTolerance );
+    leTolerance->setValidator( validator );
+
+    mLayerTreeWidget->setItemWidget( item, 3, leTolerance );
+
+    //snap to vertex/ snap to segment
+    QComboBox *cbxUnits = new QComboBox( mLayerTreeWidget );
+    cbxUnits->insertItem( 0, tr( "map units" ) );
+    cbxUnits->insertItem( 1, tr( "pixels" ) );
+    mLayerTreeWidget->setItemWidget( item, 4, cbxUnits );
+
+    int idx = layerIdList.indexOf( currentVectorLayer->getLayerID() );
+    if ( idx < 0 )
     {
+      // no settings for this layer yet
       continue;
     }
 
-    //get layer id, to vertex/to segment and tolerance
-    layerName = currentItem->text( 0 );
-    layerId = mLayerIds.at( i );
-    checked = ( currentItem->checkState( 0 ) == Qt::Checked );
-    snapToItemText = (( QComboBox* )( mLayerTreeWidget->itemWidget( currentItem, 1 ) ) )->currentText();
-    toleranceItemText = (( QComboBox* )( mLayerTreeWidget->itemWidget( currentItem, 3 ) ) )->currentText();
-    if ( snapToItemText == tr( "to vertex" ) )
+    cbxEnable->setChecked( enabledList[ idx ] == "enabled" );
+    cbxSnapTo->setCurrentIndex( snapToList[idx].toInt() );
+    leTolerance->setText( QString::number( toleranceList[idx].toDouble(), 'f' ) );
+    cbxUnits->setCurrentIndex( toleranceUnitList[i].toInt() );
+  }
+
+  if ( myDockFlag )
+  {
+    for ( int i = 0; i < mLayerTreeWidget->topLevelItemCount(); ++i )
     {
-      snapTo = 0;
+      QTreeWidgetItem *item = mLayerTreeWidget->topLevelItem( i );
+      connect( mLayerTreeWidget->itemWidget( item, 0 ), SIGNAL( stateChanged( int ) ), this, SLOT( apply() ) );
+      connect( mLayerTreeWidget->itemWidget( item, 2 ), SIGNAL( currentIndexChanged( int ) ), this, SLOT( apply() ) );
+      connect( mLayerTreeWidget->itemWidget( item, 3 ), SIGNAL( textEdited( const QString ) ), this, SLOT( apply() ) );
+      connect( mLayerTreeWidget->itemWidget( item, 4 ), SIGNAL( currentIndexChanged( int ) ), this, SLOT( apply() ) );
     }
-    else if ( snapToItemText == tr( "to segment" ) )
+  }
+}
+
+void QgsSnappingDialog::apply()
+{
+  QStringList layerIdList;
+  QStringList snapToList;
+  QStringList toleranceList;
+  QStringList enabledList;
+  QStringList toleranceUnitList;
+
+  for ( int i = 0; i < mLayerTreeWidget->topLevelItemCount(); ++i )
+  {
+    QTreeWidgetItem *currentItem = mLayerTreeWidget->topLevelItem( i );
+    if ( !currentItem )
     {
-      snapTo = 1;
+      continue;
     }
-    else //to vertex and segment
+
+    layerIdList << currentItem->data( 0, Qt::UserRole ).toString();
+    enabledList << ( qobject_cast<QCheckBox*>( mLayerTreeWidget->itemWidget( currentItem, 0 ) )->isChecked() ? "enabled" : "disabled" );
+
+    QString snapToItemText = qobject_cast<QComboBox*>( mLayerTreeWidget->itemWidget( currentItem, 2 ) )->currentText();
+    if ( snapToItemText == tr( "to vertex" ) )
     {
-      snapTo = 2;
+      snapToList << "to_vertex";
     }
-    if ( toleranceItemText == tr( "map units" ) )
+    else if ( snapToItemText == tr( "to segment" ) )
     {
-      toleranceUnit = 0;
+      snapToList << "to_segment";
     }
     else //to vertex and segment
     {
-      toleranceUnit = 1;
+      snapToList << "to_vertex_and_segment";
     }
-    tolerance = (( QLineEdit* )( mLayerTreeWidget->itemWidget( currentItem, 2 ) ) )->text().toDouble();
-    LayerEntry newEntry;
-    newEntry.checked = checked; newEntry.snapTo = snapTo; newEntry.layerName = layerName;
-    newEntry.tolerance = tolerance; newEntry.toleranceUnit = toleranceUnit;
-    settings.insert( layerId, newEntry );
+
+    toleranceList << QString::number( qobject_cast<QLineEdit*>( mLayerTreeWidget->itemWidget( currentItem, 3 ) )->text().toDouble(), 'f' );
+    toleranceUnitList << QString::number( qobject_cast<QComboBox*>( mLayerTreeWidget->itemWidget( currentItem, 4 ) )->currentIndex() );
   }
+
+  QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingList", layerIdList );
+  QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnapToList", snapToList );
+  QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingToleranceList", toleranceList );
+  QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingToleranceUnitList", toleranceUnitList );
+  QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingEnabledList", enabledList );
 }

Modified: trunk/qgis/src/app/qgssnappingdialog.h
===================================================================
--- trunk/qgis/src/app/qgssnappingdialog.h	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/app/qgssnappingdialog.h	2010-11-13 22:00:10 UTC (rev 14623)
@@ -20,17 +20,10 @@
 
 #include "ui_qgssnappingdialogbase.h"
 
+class QDockWidget;
+
 class QgsMapCanvas;
 
-struct LayerEntry
-{
-  bool checked;
-  int snapTo; //0 = to vertex, 1 = to segment, 2 = to vertex and to segment
-  QString layerName;
-  double tolerance;
-  int toleranceUnit; // 0 = map units, 1 = pixels
-};
-
 /**A dialog to enter advanced editing properties, e.g. topological editing, snapping settings
 for the individual layers*/
 class QgsSnappingDialog: public QDialog, private Ui::QgsSnappingDialogBase
@@ -38,23 +31,44 @@
     Q_OBJECT
 
   public:
-    /**Constructor
-     @param canvas pointer to the map canvas (for detecting which vector layers are loaded
-    @param settings existing snapping layer settings*/
-    QgsSnappingDialog( QgsMapCanvas* canvas, const QMap<QString, LayerEntry >& settings );
+
+    //! Returns the instance pointer, creating the object on the first call
+    //static QgsSnappingDialog * instance( QgsMapCanvas* canvas );
+    QgsSnappingDialog( QWidget* parent, QgsMapCanvas* canvas );
     ~QgsSnappingDialog();
 
-    /**Returns the snapping settings per layer. Key of the map is the layer id and value the
-     corresponding layer entry*/
-    void layerSettings( QMap<QString, LayerEntry>& settings ) const;
+  public slots:
+    /**
+     * apply the changes
+     */
+    void apply();
+    /**
+     * update the Dialog
+     */
+    void update();
 
+
+
+  protected:
+    /**Constructor
+    @param canvas pointer to the map canvas (for detecting which vector layers are loaded
+    */
+    //QgsSnappingDialog( QgsMapCanvas* canvas );
+    /**
+     * Handle closing of the window
+     * @param event unused
+     */
+    void closeEvent( QCloseEvent* event );
+
+
   private:
     /**Default constructor forbidden*/
     QgsSnappingDialog();
+
     /**Used to query the loaded layers*/
     QgsMapCanvas* mMapCanvas;
-    /**Stores the layer ids from top to bottom*/
-    QStringList mLayerIds;
+
+    QDockWidget *mDock;
 };
 
 #endif

Modified: trunk/qgis/src/ui/qgsoptionsbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsoptionsbase.ui	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/ui/qgsoptionsbase.ui	2010-11-13 22:00:10 UTC (rev 14623)
@@ -247,9 +247,16 @@
                </widget>
               </item>
               <item>
+               <widget class="QCheckBox" name="cbxSnappingOptionsDocked">
+                <property name="text">
+                 <string>Open snapping options  in a dock window (QGIS restart required)</string>
+                </property>
+               </widget>
+              </item>
+              <item>
                <widget class="QCheckBox" name="cbxAttributeTableDocked">
                 <property name="text">
-                 <string>Open attribute table in a dock window</string>
+                 <string>Open attribute table in a dock window (QGIS restart required)</string>
                 </property>
                </widget>
               </item>

Modified: trunk/qgis/src/ui/qgsprojectpropertiesbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsprojectpropertiesbase.ui	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/ui/qgsprojectpropertiesbase.ui	2010-11-13 22:00:10 UTC (rev 14623)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>552</width>
-    <height>525</height>
+    <width>555</width>
+    <height>538</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -301,13 +301,6 @@
             </property>
            </widget>
           </item>
-          <item row="2" column="0">
-           <widget class="QPushButton" name="mSnappingOptionsPushButton">
-            <property name="text">
-             <string>Snapping options...</string>
-            </property>
-           </widget>
-          </item>
          </layout>
         </widget>
        </item>
@@ -413,7 +406,6 @@
   <tabstop>spinBoxDP</tabstop>
   <tabstop>mEnableTopologicalEditingCheckBox</tabstop>
   <tabstop>mAvoidIntersectionsPushButton</tabstop>
-  <tabstop>mSnappingOptionsPushButton</tabstop>
   <tabstop>cbxProjectionEnabled</tabstop>
   <tabstop>twIdentifyLayers</tabstop>
   <tabstop>tabWidget</tabstop>

Modified: trunk/qgis/src/ui/qgssnappingdialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgssnappingdialogbase.ui	2010-11-13 21:27:42 UTC (rev 14622)
+++ trunk/qgis/src/ui/qgssnappingdialogbase.ui	2010-11-13 22:00:10 UTC (rev 14623)
@@ -1,7 +1,8 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>QgsSnappingDialogBase</class>
- <widget class="QDialog" name="QgsSnappingDialogBase" >
-  <property name="geometry" >
+ <widget class="QDialog" name="QgsSnappingDialogBase">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
@@ -9,59 +10,58 @@
     <height>290</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Snapping options</string>
   </property>
-  <layout class="QGridLayout" >
-   <property name="leftMargin" >
+  <layout class="QGridLayout">
+   <property name="margin">
     <number>9</number>
    </property>
-   <property name="topMargin" >
-    <number>9</number>
-   </property>
-   <property name="rightMargin" >
-    <number>9</number>
-   </property>
-   <property name="bottomMargin" >
-    <number>9</number>
-   </property>
-   <property name="horizontalSpacing" >
+   <property name="spacing">
     <number>6</number>
    </property>
-   <property name="verticalSpacing" >
-    <number>6</number>
-   </property>
-   <item row="0" column="0" >
-    <widget class="QTreeWidget" name="mLayerTreeWidget" >
+   <item row="0" column="0">
+    <widget class="QTreeWidget" name="mLayerTreeWidget">
+     <property name="indentation">
+      <number>0</number>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
      <column>
-      <property name="text" >
+      <property name="text">
+       <string> </string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
        <string>Layer</string>
       </property>
      </column>
      <column>
-      <property name="text" >
+      <property name="text">
        <string>Mode</string>
       </property>
      </column>
      <column>
-      <property name="text" >
+      <property name="text">
        <string>Tolerance</string>
       </property>
      </column>
      <column>
-      <property name="text" >
+      <property name="text">
        <string>Units</string>
       </property>
      </column>
     </widget>
    </item>
-   <item row="1" column="0" >
-    <widget class="QDialogButtonBox" name="mButtonBox" >
-     <property name="orientation" >
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="mButtonBox">
+     <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
-     <property name="standardButtons" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
      </property>
     </widget>
    </item>
@@ -75,11 +75,11 @@
    <receiver>QgsSnappingDialogBase</receiver>
    <slot>accept()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>248</x>
      <y>254</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>157</x>
      <y>274</y>
     </hint>
@@ -91,11 +91,11 @@
    <receiver>QgsSnappingDialogBase</receiver>
    <slot>reject()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>316</x>
      <y>260</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>286</x>
      <y>274</y>
     </hint>



More information about the QGIS-commit mailing list