Skip to content

Commit

Permalink
use QgsLayerTree for the selection of layers in the offline editing p…
Browse files Browse the repository at this point in the history
…lugin
  • Loading branch information
3nids committed Jan 14, 2015
1 parent 9cdb640 commit b042d8e
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 67 deletions.
2 changes: 2 additions & 0 deletions src/plugins/offline_editing/CMakeLists.txt
Expand Up @@ -48,8 +48,10 @@ INCLUDE_DIRECTORIES(
${SQLITE3_INCLUDE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
../../core
../../core/layertree
../../core/raster
../../gui
../../gui/layertree
..
${GEOS_INCLUDE_DIR}
)
Expand Down
88 changes: 38 additions & 50 deletions src/plugins/offline_editing/offline_editing_plugin_gui.cpp
Expand Up @@ -18,11 +18,14 @@

#include "offline_editing_plugin_gui.h"

#include <qgscontexthelp.h>
#include <qgsmaplayer.h>
#include <qgsmaplayerregistry.h>
#include <qgsvectordataprovider.h>
#include <qgsvectorlayer.h>
#include "qgscontexthelp.h"
#include "qgslayertree.h"
#include "qgslayertreemodel.h"
#include "qgsmaplayer.h"
#include "qgsmaplayerregistry.h"
#include "qgsproject.h"
#include "qgsvectordataprovider.h"
#include "qgsvectorlayer.h"

#include <QFileDialog>
#include <QMessageBox>
Expand All @@ -36,17 +39,23 @@ QgsOfflineEditingPluginGui::QgsOfflineEditingPluginGui( QWidget* parent /*= 0*/,
restoreState();

mOfflineDbFile = "offline.sqlite";
ui_offlineDataPath->setText( QDir( mOfflineDataPath ).absoluteFilePath( mOfflineDbFile ) );
mOfflineDataPathLineEdit->setText( QDir( mOfflineDataPath ).absoluteFilePath( mOfflineDbFile ) );

updateLayerList( checkboxShowEditableLayers->isChecked() );
QgsLayerTreeGroup* rootNode = QgsLayerTree::toGroup( QgsProject::instance()->layerTreeRoot()->clone() );
QgsLayerTreeModel* treeModel = new QgsLayerTreeModel( rootNode, this );
treeModel->setFlag( QgsLayerTreeModel::ShowLegend, false );
treeModel->setFlag( QgsLayerTreeModel::AllowNodeChangeVisibility, true );
mLayerTree->setModel( treeModel );

connect( mSelectAllButton, SIGNAL( clicked() ), this, SLOT( selectAll() ) );
connect( mUnselectAllButton, SIGNAL( clicked() ), this, SLOT( unSelectAll() ) );
}

QgsOfflineEditingPluginGui::~QgsOfflineEditingPluginGui()
{
QSettings settings;
settings.setValue( "Plugin-OfflineEditing/geometry", saveGeometry() );
settings.setValue( "Plugin-OfflineEditing/offline_data_path", mOfflineDataPath );
settings.setValue( "Plugin-OfflineEditing/onlyEditableLayers", checkboxShowEditableLayers->isChecked() );
}

QString QgsOfflineEditingPluginGui::offlineDataPath()
Expand All @@ -64,37 +73,7 @@ QStringList& QgsOfflineEditingPluginGui::selectedLayerIds()
return mSelectedLayerIds;
}

void QgsOfflineEditingPluginGui::updateLayerList( bool filterEditableLayers )
{
ui_layerList->clear();

QMap<QString, QgsMapLayer*> mapLayers = QgsMapLayerRegistry::instance()->mapLayers();
for ( QMap<QString, QgsMapLayer*>::iterator layer_it = mapLayers.begin() ; layer_it != mapLayers.end(); ++layer_it )
{
if ( layer_it.value()->type() == QgsMapLayer::VectorLayer )
{
QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( layer_it.value() );

bool showLayer = true;
if ( filterEditableLayers )
{
int cap = layer->dataProvider()->capabilities();
showLayer = ( cap & QgsVectorDataProvider::AddFeatures ) &&
( cap & QgsVectorDataProvider::DeleteFeatures ) &&
( cap & QgsVectorDataProvider::ChangeAttributeValues ) &&
( cap & QgsVectorDataProvider::AddAttributes ) &&
( cap & QgsVectorDataProvider::ChangeGeometries );
}
if ( showLayer )
{
QListWidgetItem* item = new QListWidgetItem( layer->name(), ui_layerList );
item->setData( Qt::UserRole, QVariant( layer_it.key() ) );
}
}
}
}

void QgsOfflineEditingPluginGui::on_butBrowse_clicked()
void QgsOfflineEditingPluginGui::on_mBrowseButton_clicked()
{
QString fileName = QFileDialog::getSaveFileName( this,
tr( "Select target database for offline data" ),
Expand All @@ -110,16 +89,10 @@ void QgsOfflineEditingPluginGui::on_butBrowse_clicked()
}
mOfflineDbFile = QFileInfo( fileName ).fileName();
mOfflineDataPath = QFileInfo( fileName ).absolutePath();
ui_offlineDataPath->setText( fileName );
mOfflineDataPathLineEdit->setText( fileName );
}
}

void QgsOfflineEditingPluginGui::on_checkboxShowEditableLayers_stateChanged( int state )
{
Q_UNUSED( state );
updateLayerList( checkboxShowEditableLayers->isChecked() );
}

void QgsOfflineEditingPluginGui::on_buttonBox_accepted()
{
if ( QFile( QDir( mOfflineDataPath ).absoluteFilePath( mOfflineDbFile ) ).exists() )
Expand All @@ -137,10 +110,13 @@ void QgsOfflineEditingPluginGui::on_buttonBox_accepted()
}

mSelectedLayerIds.clear();
QList<QListWidgetItem*> layers = ui_layerList->selectedItems();
for ( QList<QListWidgetItem*>::const_iterator it = layers.begin(); it != layers.end(); ++it )
foreach ( QgsLayerTreeLayer* nodeLayer, mLayerTree->layerTreeModel()->rootGroup()->findLayers() )
{
mSelectedLayerIds.append(( *it )->data( Qt::UserRole ).toString() );
if ( nodeLayer->isVisible() )
{
QgsDebugMsg(nodeLayer->layerId());
mSelectedLayerIds.append( nodeLayer->layerId() );
}
}

accept();
Expand All @@ -162,5 +138,17 @@ void QgsOfflineEditingPluginGui::restoreState()
QSettings settings;
mOfflineDataPath = settings.value( "Plugin-OfflineEditing/offline_data_path", QDir().absolutePath() ).toString();
restoreGeometry( settings.value( "Plugin-OfflineEditing/geometry" ).toByteArray() );
checkboxShowEditableLayers->setChecked( settings.value( "Plugin-OfflineEditing/onlyEditableLayers", true ).toBool() );
}

void QgsOfflineEditingPluginGui::selectAll()
{
foreach ( QgsLayerTreeLayer* nodeLayer, mLayerTree->layerTreeModel()->rootGroup()->findLayers() )
nodeLayer->setVisible( Qt::Checked );
}


void QgsOfflineEditingPluginGui::unSelectAll()
{
foreach ( QgsLayerTreeLayer* nodeLayer, mLayerTree->layerTreeModel()->rootGroup()->findLayers() )
nodeLayer->setVisible( Qt::Unchecked );
}
9 changes: 6 additions & 3 deletions src/plugins/offline_editing/offline_editing_plugin_gui.h
Expand Up @@ -34,8 +34,12 @@ class QgsOfflineEditingPluginGui : public QDialog, private Ui::QgsOfflineEditing
QString offlineDbFile();
QStringList& selectedLayerIds();

public slots:
/** change the selection of layers in the list */
void selectAll();
void unSelectAll();

private:
void updateLayerList( bool filterEditableLayers );
void saveState();
void restoreState();

Expand All @@ -44,8 +48,7 @@ class QgsOfflineEditingPluginGui : public QDialog, private Ui::QgsOfflineEditing
QStringList mSelectedLayerIds;

private slots:
void on_butBrowse_clicked();
void on_checkboxShowEditableLayers_stateChanged( int state );
void on_mBrowseButton_clicked();
void on_buttonBox_accepted();
void on_buttonBox_rejected();
void on_buttonBox_helpRequested();
Expand Down
56 changes: 42 additions & 14 deletions src/plugins/offline_editing/offline_editing_plugin_guibase.ui
Expand Up @@ -29,14 +29,14 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="ui_offlineDataPath">
<widget class="QLineEdit" name="mOfflineDataPathLineEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="butBrowse">
<widget class="QPushButton" name="mBrowseButton">
<property name="text">
<string>Browse...</string>
</property>
Expand All @@ -54,26 +54,47 @@
</widget>
</item>
<item>
<widget class="QListWidget" name="ui_layerList">
<widget class="QgsLayerTreeView" name="mLayerTree">
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="mSelectAllButton">
<property name="text">
<string>select all</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="mUnselectAllButton">
<property name="text">
<string>unselect all</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="checkboxShowEditableLayers">
<property name="text">
<string>Show only editable layers</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
Expand All @@ -89,6 +110,13 @@
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsLayerTreeView</class>
<extends>QTreeView</extends>
<header>qgslayertreeview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

0 comments on commit b042d8e

Please sign in to comment.