22#include <QTableWidgetItem> 
   26class SubLayerItem : 
public QTreeWidgetItem
 
   29    SubLayerItem( 
const QStringList &strings, 
int type = QTreeWidgetItem::Type )
 
   30      :  QTreeWidgetItem( strings, type )
 
   33    bool operator <( 
const QTreeWidgetItem &other )
 const override 
   36      const int col = treeWidget()->sortColumn();
 
   38      if ( col == 0 || ( col > 0 && d->
countColumn() == col ) )
 
   39        return text( col ).toInt() < other.text( col ).toInt();
 
   41        return text( col ) < other.text( col );
 
   50                                        const QString &dataSourceUri )
 
   51  : QDialog( parent, fl )
 
   58  switch ( providerType )
 
   61      title = tr( 
"Select Vector Layers to Add…" );
 
   62      layersTable->setHeaderLabels( QStringList() << tr( 
"Layer ID" ) << tr( 
"Layer name" )
 
   63                                    << tr( 
"Number of features" ) << tr( 
"Geometry type" ) << tr( 
"Description" ) );
 
   69      title = tr( 
"Select Raster Layers to Add…" );
 
   70      layersTable->setHeaderLabels( QStringList() << tr( 
"Layer ID" ) << tr( 
"Layer name" ) );
 
   73      title = tr( 
"Select Mesh Layers to Add…" );
 
   74      layersTable->setHeaderLabels( QStringList() << tr( 
"Layer ID" ) << tr( 
"Mesh name" ) );
 
   77      title = tr( 
"Select Layers to Add…" );
 
   78      layersTable->setHeaderLabels( QStringList() << tr( 
"Layer ID" ) << tr( 
"Layer name" )
 
   84  const QString dataSourceFilePath = dataSourceUriParsed.value( QStringLiteral( 
"path" ) ).toString();
 
   85  const QString filePath = dataSourceFilePath.isEmpty() ? dataSourceUri : dataSourceFilePath;
 
   86  const QString fileName = QFileInfo( filePath ).fileName();
 
   88  setWindowTitle( fileName.isEmpty() ? title : QStringLiteral( 
"%1 | %2" ).arg( title, fileName ) );
 
   89  mLblFilePath->setText( QDir::toNativeSeparators( QFileInfo( filePath ).canonicalFilePath() ) );
 
   90  mLblFilePath->setVisible( ! fileName.isEmpty() );
 
   93  connect( mBtnSelectAll, &QAbstractButton::pressed, layersTable, &QTreeView::selectAll );
 
   94  connect( mBtnDeselectAll, &QAbstractButton::pressed, 
this, &QgsSublayersDialog::mBtnDeselectAll_pressed );
 
   95  connect( layersTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsSublayersDialog::layersTable_selectionChanged );
 
   97  mCbxAddToGroup->setVisible( 
false );
 
  103  settings.
setValue( 
"/Windows/" + 
mName + 
"SubLayers/headerColumnCount",
 
  104                     layersTable->columnCount() );
 
  105  settings.
setValue( 
"/Windows/" + 
mName + 
"SubLayers/headerState",
 
  106                     layersTable->header()->saveState() );
 
  109static bool _isLayerIdUnique( 
int layerId, QTreeWidget *layersTable )
 
  112  for ( 
int j = 0; j < layersTable->topLevelItemCount(); j++ )
 
  114    if ( layersTable->topLevelItem( j )->text( 0 ).toInt() == layerId )
 
  125  for ( 
int i = 0; i < layersTable->selectedItems().size(); i++ )
 
  127    QTreeWidgetItem *item = layersTable->selectedItems().at( i );
 
  130    def.
layerId = item->text( 0 ).toInt();
 
  136      if ( !_isLayerIdUnique( def.
layerId, layersTable ) )
 
  148  const auto constList = list;
 
  151    QStringList elements;
 
  152    elements << QString::number( item.layerId ) << item.layerName;
 
  156                    ? tr( 
"Unknown" ) : QString::number( item.count ) );
 
  158      elements << item.type;
 
  160      elements << item.description;
 
  161    layersTable->addTopLevelItem( 
new SubLayerItem( elements ) );
 
  166  const QByteArray ba = settings.
value( 
"/Windows/" + 
mName + 
"SubLayers/headerState" ).toByteArray();
 
  167  const int savedColumnCount = settings.
value( 
"/Windows/" + 
mName + 
"SubLayers/headerColumnCount" ).toInt();
 
  168  if ( ! ba.isNull() && savedColumnCount == layersTable->columnCount() )
 
  170    layersTable->header()->restoreState( ba );
 
  174    for ( 
int i = 0; i < layersTable->columnCount(); i++ )
 
  175      layersTable->resizeColumnToContents( i );
 
  176    layersTable->setColumnWidth( 1, layersTable->columnWidth( 1 ) + 10 );
 
  189  if ( layersTable->topLevelItemCount() == 0 )
 
  190    return QDialog::Rejected;
 
  192  layersTable->selectAll();
 
  196    return QDialog::Rejected;
 
  198    return QDialog::Accepted;
 
  201  if ( layersTable->topLevelItemCount() == 1 )
 
  202    return QDialog::Accepted;
 
  204  layersTable->sortByColumn( 1, Qt::AscendingOrder );
 
  205  layersTable->setSortingEnabled( 
true );
 
  210  const bool overrideCursor = 
nullptr != QApplication::overrideCursor();
 
  211  if ( overrideCursor )
 
  213    cursor = QCursor( * QApplication::overrideCursor() );
 
  214    QApplication::restoreOverrideCursor();
 
  218  if ( mShowAddToGroupCheckbox )
 
  220    mCbxAddToGroup->setVisible( 
true );
 
  221    const bool addToGroup = settings.
value( QStringLiteral( 
"/qgis/openSublayersInGroup" ), 
false ).toBool();
 
  222    mCbxAddToGroup->setChecked( addToGroup );
 
  225  const int ret = QDialog::exec();
 
  226  if ( overrideCursor )
 
  227    QApplication::setOverrideCursor( cursor );
 
  229  if ( mShowAddToGroupCheckbox )
 
  230    settings.
setValue( QStringLiteral( 
"/qgis/openSublayersInGroup" ), mCbxAddToGroup->isChecked() );
 
  234void QgsSublayersDialog::layersTable_selectionChanged( 
const QItemSelection &, 
const QItemSelection & )
 
  236  buttonBox->button( QDialogButtonBox::Ok )->setEnabled( layersTable->selectedItems().length() > 0 );
 
  239void QgsSublayersDialog::mBtnDeselectAll_pressed()
 
  241  layersTable->selectionModel()->clear();
 
SublayerPromptMode
Specifies how to handle layer sources with multiple sublayers.
 
@ AlwaysAsk
Always ask users to select from available sublayers, if sublayers are present.
 
@ NeverAskLoadAll
Never ask users to select sublayers, instead automatically load all available sublayers.
 
@ NeverAskSkip
Never ask users to select sublayers, instead don't load anything.
 
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
 
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
 
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
 
bool mShowType
Whether to show type in the table.
 
QList< QgsSublayersDialog::LayerDefinition > LayerDefinitionList
List of layer definitions for the purpose of this dialog.
 
Q_DECL_DEPRECATED QgsSublayersDialog(ProviderType providerType, const QString &name, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), const QString &dataSourceUri=QString())
Constructor for QgsSublayersDialog.
 
LayerDefinitionList selection()
Returns list of selected layers.
 
bool mShowCount
Whether to show number of features in the table.
 
bool mShowDescription
Whether to show description in the table.
 
~QgsSublayersDialog() override
 
void populateLayerTable(const LayerDefinitionList &list)
Populate the table with layers.
 
int countColumn() const
Returns column with count or -1.
 
QString mName
Provider type name.
 
@ Uncounted
Feature count not yet computed.
 
@ UnknownCount
Provider returned an unknown feature count.
 
bool operator<(const QVariant &v1, const QVariant &v2)
Compares two QVariant values and returns whether the first is less than the second.
 
A structure that defines layers for the purpose of this dialog.
 
QString layerName
Name of the layer (not necessarily unique)
 
QString type
Extra type depending on the use (e.g. geometry type for vector sublayers)
 
int layerId
Identifier of the layer (one unique layer id may have multiple types though)