QgsGrassOptions::QgsGrassOptions( QWidget *parent ) : QgsOptionsDialogBase( "GrassOptions", parent ) , QgsGrassOptionsBase() , mImportSettingsPath( "/GRASS/browser/import" ) , mModulesSettingsPath( "/GRASS/modules/config" ) { setupUi( this ); initOptionsBase( false ); connect( this, SIGNAL( accepted() ), SLOT( saveOptions() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), SLOT( saveOptions() ) ); QSettings settings; // General QString version = QString( GRASS_VERSION_STRING ).remove( "@(#)" ).trimmed(); QString revision = QString( GIS_H_VERSION ).remove( "$" ).trimmed(); mGrassVersionLabel->setText( tr( "GRASS version" ) + " : " + version + " " + revision ); bool customGisbase = settings.value( "/GRASS/gidbase/custom", false ).toBool(); QString customGisbaseDir = settings.value( "/GRASS/gidbase/customDir" ).toString(); mGisbaseDefaultRadioButton->setText( tr( "Default" ) + " (" + QgsGrass::defaultGisbase() + ")" ); mGisbaseDefaultRadioButton->setChecked( !customGisbase ); mGisbaseCustomRadioButton->setChecked( customGisbase ); mGisbaseLineEdit->setText( customGisbaseDir ); gisbaseChanged(); connect( mGisbaseDefaultRadioButton, SIGNAL( toggled( bool ) ), SLOT( gisbaseChanged() ) ); connect( mGisbaseLineEdit, SIGNAL( textChanged( const QString & ) ), SLOT( gisbaseChanged() ) ); connect( mGisbaseLineEdit, SIGNAL( textEdited( const QString & ) ), SLOT( gisbaseChanged() ) ); connect( mGisbaseGroupBox, SIGNAL( collapsedStateChanged( bool ) ), SLOT( gisbaseChanged() ) ); // Modules bool customModules = settings.value( mModulesSettingsPath + "/custom", false ).toBool(); QString customModulesDir = settings.value( mModulesSettingsPath + "/customDir" ).toString(); mModulesConfigDefaultRadioButton->setText( tr( "Default" ) + " (" + QgsGrass::modulesConfigDefaultDirPath() + ")" ); mModulesConfigDefaultRadioButton->setChecked( !customModules ); mModulesConfigCustomRadioButton->setChecked( customModules ); mModulesConfigDirLineEdit->setText( customModulesDir ); mModulesDebugCheckBox->setChecked( QgsGrass::modulesDebug() ); // Browser QgsRasterProjector::Precision crsTransform = ( QgsRasterProjector::Precision ) settings.value( mImportSettingsPath + "/crsTransform", QgsRasterProjector::Approximate ).toInt(); mCrsTransformationComboBox->addItem( QgsRasterProjector::precisionLabel( QgsRasterProjector::Approximate ), QgsRasterProjector::Approximate ); mCrsTransformationComboBox->addItem( QgsRasterProjector::precisionLabel( QgsRasterProjector::Exact ), QgsRasterProjector::Exact ); mCrsTransformationComboBox->setCurrentIndex( mCrsTransformationComboBox->findData( crsTransform ) ); mImportExternalCheckBox->setChecked( settings.value( mImportSettingsPath + "/external", true ).toBool() ); mTopoLayersCheckBox->setChecked( settings.value( "/GRASS/showTopoLayers", false ).toBool() ); // Region QPen regionPen = QgsGrass::regionPen(); mRegionColorButton->setContext( "gui" ); mRegionColorButton->setColorDialogTitle( tr( "Select color" ) ); mRegionColorButton->setColor( regionPen.color() ); mRegionWidthSpinBox->setValue( regionPen.width() ); restoreOptionsBaseUi(); }
void QgsOptionsDialogBase::initOptionsBase( bool restoreUi ) { // don't add to dialog margins // redefine now, or those in inherited .ui file will be added if ( layout() ) { layout()->setContentsMargins( 0, 0, 0, 0 ); // Qt default spacing } // start with copy of qgsoptionsdialog_template.ui to ensure existence of these objects mOptListWidget = findChild<QListWidget*>( "mOptionsListWidget" ); QFrame* optionsFrame = findChild<QFrame*>("mOptionsFrame"); mOptStackedWidget = findChild<QStackedWidget*>( "mOptionsStackedWidget" ); mOptSplitter = findChild<QSplitter*>( "mOptionsSplitter" ); mOptButtonBox = findChild<QDialogButtonBox*>( "buttonBox" ); QFrame* buttonBoxFrame = findChild<QFrame*>("mButtonBoxFrame"); if ( !mOptListWidget || !mOptStackedWidget || !mOptSplitter || !optionsFrame ) { return; } QSettings settings; int size = settings.value( "/IconSize", 24 ).toInt(); mOptListWidget->setIconSize( QSize(size, size) ); optionsFrame->layout()->setContentsMargins(0,3,3,3); QVBoxLayout* layout = static_cast<QVBoxLayout*>(optionsFrame->layout()); if ( buttonBoxFrame ) { buttonBoxFrame->layout()->setContentsMargins(0,0,0,0); layout->insertWidget(layout->count() + 1, buttonBoxFrame ); } else { layout->insertWidget( layout->count() + 1, mOptButtonBox ); } if ( mOptButtonBox ) { // enforce only one connection per signal, in case added in Qt Designer disconnect( mOptButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( mOptButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); disconnect( mOptButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( mOptButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); } connect( mOptSplitter, SIGNAL( splitterMoved( int, int ) ), this, SLOT( updateOptionsListVerticalTabs() ) ); connect( mOptStackedWidget, SIGNAL( currentChanged( int ) ), this, SLOT( optionsStackedWidget_CurrentChanged( int ) ) ); connect( mOptStackedWidget, SIGNAL( widgetRemoved( int ) ), this, SLOT( optionsStackedWidget_WidgetRemoved( int ) ) ); mInit = true; if ( restoreUi ) restoreOptionsBaseUi(); }
void QgsOptionsDialogBase::initOptionsBase( bool restoreUi, QString title ) { // use pointer to app QSettings if no custom QSettings specified // custom QSettings object may be from Python plugin mDelSettings = false; if ( !mSettings ) { mSettings = new QSettings(); mDelSettings = true; // only delete obj created by class } // save dialog title so it can be used to be concatenated // with category title in icon-only mode if ( title.isEmpty() ) mDialogTitle = windowTitle(); else mDialogTitle = title; // don't add to dialog margins // redefine now, or those in inherited .ui file will be added if ( layout() ) { layout()->setContentsMargins( 0, 0, 0, 0 ); // Qt default spacing } // start with copy of qgsoptionsdialog_template.ui to ensure existence of these objects mOptListWidget = findChild<QListWidget*>( "mOptionsListWidget" ); QFrame* optionsFrame = findChild<QFrame*>( "mOptionsFrame" ); mOptStackedWidget = findChild<QStackedWidget*>( "mOptionsStackedWidget" ); mOptSplitter = findChild<QSplitter*>( "mOptionsSplitter" ); mOptButtonBox = findChild<QDialogButtonBox*>( "buttonBox" ); QFrame* buttonBoxFrame = findChild<QFrame*>( "mButtonBoxFrame" ); if ( !mOptListWidget || !mOptStackedWidget || !mOptSplitter || !optionsFrame ) { return; } int size = mSettings->value( "/IconSize", 24 ).toInt(); // buffer size to match displayed icon size in toolbars, and expected geometry restore // newWidth (above) may need adjusted if you adjust iconBuffer here int iconBuffer = 4; mOptListWidget->setIconSize( QSize( size + iconBuffer, size + iconBuffer ) ); mOptListWidget->setFrameStyle( QFrame::NoFrame ); optionsFrame->layout()->setContentsMargins( 0, 3, 3, 3 ); QVBoxLayout* layout = static_cast<QVBoxLayout*>( optionsFrame->layout() ); if ( buttonBoxFrame ) { buttonBoxFrame->layout()->setContentsMargins( 0, 0, 0, 0 ); layout->insertWidget( layout->count() + 1, buttonBoxFrame ); } else { layout->insertWidget( layout->count() + 1, mOptButtonBox ); } if ( mOptButtonBox ) { // enforce only one connection per signal, in case added in Qt Designer disconnect( mOptButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( mOptButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); disconnect( mOptButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( mOptButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); } connect( mOptSplitter, SIGNAL( splitterMoved( int, int ) ), this, SLOT( updateOptionsListVerticalTabs() ) ); connect( mOptStackedWidget, SIGNAL( currentChanged( int ) ), this, SLOT( optionsStackedWidget_CurrentChanged( int ) ) ); connect( mOptStackedWidget, SIGNAL( widgetRemoved( int ) ), this, SLOT( optionsStackedWidget_WidgetRemoved( int ) ) ); mInit = true; if ( restoreUi ) restoreOptionsBaseUi( mDialogTitle ); }