void QgsComposerManager::on_mTemplatePathBtn_pressed() { QSettings settings; QString lastTmplDir = settings.value( "/UI/lastComposerTemplateDir", "." ).toString(); QString tmplPath = QFileDialog::getOpenFileName( this, tr( "Choose template" ), lastTmplDir, tr( "Composer templates" ) + " (*.qpt)" ); if ( !tmplPath.isNull() ) { mTemplatePathLineEdit->setText( tmplPath ); settings.setValue( "UI/ComposerManager/templatePath", tmplPath ); QFileInfo tmplFileInfo( tmplPath ); settings.setValue( "UI/lastComposerTemplateDir", tmplFileInfo.absolutePath() ); } }
QgsRasterLayerSaveAsDialog::QgsRasterLayerSaveAsDialog( QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent, Qt::WindowFlags f ) : QDialog( parent, f ) , mRasterLayer( rasterLayer ) , mDataProvider( sourceProvider ) , mCurrentExtent( currentExtent ) , mLayerCrs( layerCrs ) , mCurrentCrs( currentCrs ) , mResolutionState( OriginalResolution ) { setupUi( this ); connect( mRawModeRadioButton, &QRadioButton::toggled, this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled ); connect( mFormatComboBox, static_cast<void ( QComboBox::* )( const QString & )>( &QComboBox::currentIndexChanged ), this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged ); connect( mResolutionRadioButton, &QRadioButton::toggled, this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled ); connect( mOriginalResolutionPushButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked ); connect( mXResolutionLineEdit, &QLineEdit::textEdited, this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited ); connect( mYResolutionLineEdit, &QLineEdit::textEdited, this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited ); connect( mOriginalSizePushButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked ); connect( mColumnsLineEdit, &QLineEdit::textEdited, this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited ); connect( mRowsLineEdit, &QLineEdit::textEdited, this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited ); connect( mAddNoDataManuallyToolButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked ); connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked ); connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked ); connect( mRemoveAllNoDataToolButton, &QPushButton::clicked, this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked ); connect( mTileModeCheckBox, &QCheckBox::toggled, this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled ); connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled, this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled ); mAddNoDataManuallyToolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/symbologyAdd.svg" ) ) ); mLoadTransparentNoDataToolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionFileOpen.svg" ) ) ); mRemoveSelectedNoDataToolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/symbologyRemove.svg" ) ) ); mRemoveAllNoDataToolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionRemove.svg" ) ) ); mNoDataTableWidget->setColumnCount( 2 ); mNoDataTableWidget->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "From" ) ) ); mNoDataTableWidget->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "To" ) ) ); mRawModeRadioButton_toggled( true ); setValidators(); toggleResolutionSize(); insertAvailableOutputFormats(); //fill reasonable default values depending on the provider if ( mDataProvider ) { if ( mDataProvider->capabilities() & QgsRasterDataProvider::Size ) { setOriginalResolution(); int xSize = mDataProvider->xSize(); int ySize = mDataProvider->ySize(); mMaximumSizeXLineEdit->setText( QString::number( xSize ) ); mMaximumSizeYLineEdit->setText( QString::number( ySize ) ); } else //wms, sometimes wcs { mTileModeCheckBox->setChecked( true ); mMaximumSizeXLineEdit->setText( QString::number( 2000 ) ); mMaximumSizeYLineEdit->setText( QString::number( 2000 ) ); } // setup creation option widget mCreateOptionsWidget->setProvider( mDataProvider->name() ); if ( mDataProvider->name() == QLatin1String( "gdal" ) ) { mCreateOptionsWidget->setFormat( mFormatComboBox->currentData().toString() ); } mCreateOptionsWidget->setRasterLayer( mRasterLayer ); mCreateOptionsWidget->update(); } // Only do pyramids if dealing directly with GDAL. if ( mDataProvider && mDataProvider->capabilities() & QgsRasterDataProvider::BuildPyramids ) { // setup pyramids option widget // mPyramidsOptionsWidget->createOptionsWidget()->setType( QgsRasterFormatSaveOptionsWidget::ProfileLineEdit ); mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer ); // TODO enable "use existing", has no effect for now, because using Create() in gdal provider // if ( ! mDataProvider->hasPyramids() ) // mPyramidsButtonGroup->button( QgsRaster::PyramidsCopyExisting )->setEnabled( false ); mPyramidsUseExistingCheckBox->setEnabled( false ); mPyramidsUseExistingCheckBox->setVisible( false ); populatePyramidsLevels(); connect( mPyramidsOptionsWidget, &QgsRasterPyramidsOptionsWidget::overviewListChanged, this, &QgsRasterLayerSaveAsDialog::populatePyramidsLevels ); } else { mPyramidsGroupBox->setEnabled( false ); } // restore checked state for most groupboxes (default is to restore collapsed state) // create options and pyramids will be preset, if user has selected defaults in the gdal options dlg mCreateOptionsGroupBox->setSaveCheckedState( true ); //mTilesGroupBox->setSaveCheckedState( true ); // don't restore nodata, it needs user input // pyramids are not necessarily built every time mCrsSelector->setLayerCrs( mLayerCrs ); //default to layer CRS - see https://issues.qgis.org/issues/14209 for discussion mCrsSelector->setCrs( mLayerCrs ); connect( mCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsRasterLayerSaveAsDialog::crsChanged ); QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok ); if ( okButton ) { okButton->setEnabled( false ); } connect( mButtonBox, &QDialogButtonBox::helpRequested, this, &QgsRasterLayerSaveAsDialog::showHelp ); mExtentGroupBox->setOutputCrs( outputCrs() ); mExtentGroupBox->setOriginalExtent( mDataProvider->extent(), mLayerCrs ); mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs ); mExtentGroupBox->setOutputExtentFromOriginal(); connect( mExtentGroupBox, &QgsExtentGroupBox::extentChanged, this, &QgsRasterLayerSaveAsDialog::extentChanged ); recalcResolutionSize(); QgsSettings settings; restoreGeometry( settings.value( QStringLiteral( "Windows/RasterLayerSaveAs/geometry" ) ).toByteArray() ); if ( mTileModeCheckBox->isChecked() ) { mTilesGroupBox->show(); mFilename->setStorageMode( QgsFileWidget::GetDirectory ); mFilename->setDialogTitle( tr( "Select Output Directory" ) ); } else { mTilesGroupBox->hide(); mFilename->setStorageMode( QgsFileWidget::SaveFile ); mFilename->setDialogTitle( tr( "Save Layer As" ) ); } mFilename->setDefaultRoot( settings.value( QStringLiteral( "UI/lastRasterFileDir" ), QDir::homePath() ).toString() ); connect( mFilename, &QgsFileWidget::fileChanged, this, [ = ]( const QString & filePath ) { QgsSettings settings; QFileInfo tmplFileInfo( filePath ); settings.setValue( QStringLiteral( "UI/lastRasterFileDir" ), tmplFileInfo.absolutePath() ); if ( !filePath.isEmpty() && mLayerName->isEnabled() ) { QFileInfo fileInfo( filePath ); mLayerName->setText( fileInfo.baseName() ); } if ( mTileModeCheckBox->isChecked() ) { QString fileName = filePath; Q_FOREVER { // TODO: would not it be better to select .vrt file instead of directory? //fileName = QFileDialog::getSaveFileName( this, tr( "Select output file" ), QString(), tr( "VRT" ) + " (*.vrt *.VRT)" ); if ( fileName.isEmpty() ) break; // canceled // Check if directory is empty QDir dir( fileName ); QString baseName = QFileInfo( fileName ).baseName(); QStringList filters; filters << QStringLiteral( "%1.*" ).arg( baseName ); QStringList files = dir.entryList( filters ); if ( files.isEmpty() ) break; if ( QMessageBox::warning( this, tr( "Save Raster Layer" ), tr( "The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.join( QStringLiteral( ", " ) ) ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok ) break; fileName = QFileDialog::getExistingDirectory( this, tr( "Select output directory" ), tmplFileInfo.absolutePath() ); } } QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok ); if ( !okButton ) { return; } okButton->setEnabled( tmplFileInfo.absoluteDir().exists() ); } );
QgsNewVectorLayerDialog::QgsNewVectorLayerDialog( QWidget *parent, Qt::WindowFlags fl ) : QDialog( parent, fl ) { setupUi( this ); connect( mAddAttributeButton, &QToolButton::clicked, this, &QgsNewVectorLayerDialog::mAddAttributeButton_clicked ); connect( mRemoveAttributeButton, &QToolButton::clicked, this, &QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked ); connect( mFileFormatComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged ); connect( mTypeBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged ); connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsNewVectorLayerDialog::showHelp ); QgsSettings settings; restoreGeometry( settings.value( QStringLiteral( "Windows/NewVectorLayer/geometry" ) ).toByteArray() ); mAddAttributeButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionNewAttribute.svg" ) ) ); mRemoveAttributeButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionDeleteAttribute.svg" ) ) ); mTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconFieldText.svg" ) ), tr( "Text data" ), "String" ); mTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconFieldInteger.svg" ) ), tr( "Whole number" ), "Integer" ); mTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconFieldFloat.svg" ) ), tr( "Decimal number" ), "Real" ); mTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconFieldDate.svg" ) ), tr( "Date" ), "Date" ); mWidth->setValidator( new QIntValidator( 1, 255, this ) ); mPrecision->setValidator( new QIntValidator( 0, 15, this ) ); mGeometryTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconPointLayer.svg" ) ), tr( "Point" ), QgsWkbTypes::Point ); mGeometryTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconLineLayer.svg" ) ), tr( "Line" ), QgsWkbTypes::LineString ); mGeometryTypeBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "/mIconPolygonLayer.svg" ) ), tr( "Polygon" ), QgsWkbTypes::Polygon ); mOkButton = buttonBox->button( QDialogButtonBox::Ok ); mOkButton->setEnabled( false ); mFileFormatComboBox->addItem( tr( "ESRI Shapefile" ), "ESRI Shapefile" ); #if 0 // Disabled until provider properly supports editing the created file formats // When enabling this, adapt the window-title of the dialog and the title of all actions showing this dialog. mFileFormatComboBox->addItem( tr( "Comma Separated Value" ), "Comma Separated Value" ); mFileFormatComboBox->addItem( tr( "GML" ), "GML" ); mFileFormatComboBox->addItem( tr( "Mapinfo File" ), "Mapinfo File" ); #endif if ( mFileFormatComboBox->count() == 1 ) { mFileFormatComboBox->setVisible( false ); mFileFormatLabel->setVisible( false ); } mFileFormatComboBox->setCurrentIndex( 0 ); mFileEncoding->addItems( QgsVectorDataProvider::availableEncodings() ); // Use default encoding if none supplied QString enc = QgsSettings().value( QStringLiteral( "/UI/encoding" ), "System" ).toString(); // The specified decoding is added if not existing already, and then set current. // This should select it. int encindex = mFileEncoding->findText( enc ); if ( encindex < 0 ) { mFileEncoding->insertItem( 0, enc ); encindex = 0; } mFileEncoding->setCurrentIndex( encindex ); mAttributeView->addTopLevelItem( new QTreeWidgetItem( QStringList() << QStringLiteral( "id" ) << QStringLiteral( "Integer" ) << QStringLiteral( "10" ) << QLatin1String( "" ) ) ); connect( mNameEdit, &QLineEdit::textChanged, this, &QgsNewVectorLayerDialog::nameChanged ); connect( mAttributeView, &QTreeWidget::itemSelectionChanged, this, &QgsNewVectorLayerDialog::selectionChanged ); mAddAttributeButton->setEnabled( false ); mRemoveAttributeButton->setEnabled( false ); mFileName->setStorageMode( QgsFileWidget::SaveFile ); mFileName->setFilter( QgsVectorFileWriter::filterForDriver( mFileFormatComboBox->currentData( Qt::UserRole ).toString() ) ); mFileName->setDialogTitle( tr( "Save Layer as…" ) ); mFileName->setDefaultRoot( settings.value( QStringLiteral( "UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() ); connect( mFileName, &QgsFileWidget::fileChanged, this, [ = ] { QgsSettings settings; QFileInfo tmplFileInfo( mFileName->filePath() ); settings.setValue( QStringLiteral( "UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() ); checkOk(); } ); }
QgsNewGeoPackageLayerDialog::QgsNewGeoPackageLayerDialog( QWidget *parent, Qt::WindowFlags fl ) : QDialog( parent, fl ) { setupUi( this ); connect( mAddAttributeButton, &QToolButton::clicked, this, &QgsNewGeoPackageLayerDialog::mAddAttributeButton_clicked ); connect( mRemoveAttributeButton, &QToolButton::clicked, this, &QgsNewGeoPackageLayerDialog::mRemoveAttributeButton_clicked ); connect( mFieldTypeBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsNewGeoPackageLayerDialog::mFieldTypeBox_currentIndexChanged ); connect( mGeometryTypeBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsNewGeoPackageLayerDialog::mGeometryTypeBox_currentIndexChanged ); connect( mTableNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textChanged ); connect( mTableNameEdit, &QLineEdit::textEdited, this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textEdited ); connect( mLayerIdentifierEdit, &QLineEdit::textEdited, this, &QgsNewGeoPackageLayerDialog::mLayerIdentifierEdit_textEdited ); connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsNewGeoPackageLayerDialog::buttonBox_accepted ); connect( buttonBox, &QDialogButtonBox::rejected, this, &QgsNewGeoPackageLayerDialog::buttonBox_rejected ); connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsNewGeoPackageLayerDialog::showHelp ); QgsSettings settings; restoreGeometry( settings.value( QStringLiteral( "Windows/NewGeoPackageLayer/geometry" ) ).toByteArray() ); mAddAttributeButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionNewAttribute.svg" ) ) ); mRemoveAttributeButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionDeleteAttribute.svg" ) ) ); mGeometryTypeBox->addItem( tr( "Non spatial" ), wkbNone ); mGeometryTypeBox->addItem( tr( "Point" ), wkbPoint ); mGeometryTypeBox->addItem( tr( "Line" ), wkbLineString ); mGeometryTypeBox->addItem( tr( "Polygon" ), wkbPolygon ); mGeometryTypeBox->addItem( tr( "Multi point" ), wkbMultiPoint ); mGeometryTypeBox->addItem( tr( "Multi line" ), wkbMultiLineString ); mGeometryTypeBox->addItem( tr( "Multi polygon" ), wkbMultiPolygon ); #if 0 // QGIS always create CompoundCurve and there's no real interest of having just CircularString. CompoundCurve are more useful mGeometryTypeBox->addItem( tr( "Circular string" ), wkbCircularString ); #endif mGeometryTypeBox->addItem( tr( "Compound curve" ), wkbCompoundCurve ); mGeometryTypeBox->addItem( tr( "Curve polygon" ), wkbCurvePolygon ); mGeometryTypeBox->addItem( tr( "Multi curve" ), wkbMultiCurve ); mGeometryTypeBox->addItem( tr( "Multi surface" ), wkbMultiSurface ); mGeometryWithZCheckBox->setEnabled( false ); mGeometryWithMCheckBox->setEnabled( false ); mGeometryColumnEdit->setEnabled( false ); mCheckBoxCreateSpatialIndex->setEnabled( false ); mCrsSelector->setEnabled( false ); mFieldTypeBox->addItem( tr( "Text data" ), "text" ); mFieldTypeBox->addItem( tr( "Whole number (integer)" ), "integer" ); mFieldTypeBox->addItem( tr( "Whole number (integer 64 bit)" ), "integer64" ); mFieldTypeBox->addItem( tr( "Decimal number (real)" ), "real" ); mFieldTypeBox->addItem( tr( "Date" ), "date" ); mFieldTypeBox->addItem( tr( "Date&time" ), "datetime" ); mOkButton = buttonBox->button( QDialogButtonBox::Ok ); mOkButton->setEnabled( false ); connect( mFieldNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::fieldNameChanged ); connect( mAttributeView, &QTreeWidget::itemSelectionChanged, this, &QgsNewGeoPackageLayerDialog::selectionChanged ); connect( mTableNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::checkOk ); mAddAttributeButton->setEnabled( false ); mRemoveAttributeButton->setEnabled( false ); mCheckBoxCreateSpatialIndex->setChecked( true ); mDatabase->setStorageMode( QgsFileWidget::SaveFile ); mDatabase->setFilter( tr( "GeoPackage" ) + " (*.gpkg)" ); mDatabase->setDialogTitle( tr( "Select Existing or Create a New GeoPackage Database File..." ) ); mDatabase->setDefaultRoot( settings.value( QStringLiteral( "UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() ); mDatabase->setConfirmOverwrite( false ); connect( mDatabase, &QgsFileWidget::fileChanged, this, [ = ]( const QString & filePath ) { QgsSettings settings; QFileInfo tmplFileInfo( filePath ); settings.setValue( QStringLiteral( "UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() ); if ( !filePath.isEmpty() && !mTableNameEdited ) { QFileInfo fileInfo( filePath ); mTableNameEdit->setText( fileInfo.baseName() ); } checkOk(); } ); }