Skip to content

Commit

Permalink
[3d] Don't allow users to set terrain to mesh or DEM without
Browse files Browse the repository at this point in the history
selecting an elevation layer

Instead show a warning advising them that a layer must be
selected
  • Loading branch information
nyalldawson committed Oct 19, 2020
1 parent 670c334 commit 0d9f1da
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 8 deletions.
5 changes: 5 additions & 0 deletions src/app/3d/qgs3dmapcanvasdockwidget.cpp
Expand Up @@ -265,6 +265,11 @@ void Qgs3DMapCanvasDockWidget::configure()
connect( buttons, &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
connect( buttons, &QDialogButtonBox::helpRequested, w, []() { QgsHelp::openHelp( QStringLiteral( "introduction/qgis_gui.html#scene-configuration" ) ); } );

connect( w, &Qgs3DMapConfigWidget::isValidChanged, this, [ = ]( bool valid )
{
buttons->button( QDialogButtonBox::Ok )->setEnabled( valid );
} );

QVBoxLayout *layout = new QVBoxLayout( &dlg );
layout->addWidget( w, 1 );
layout->addWidget( buttons );
Expand Down
33 changes: 33 additions & 0 deletions src/app/3d/qgs3dmapconfigwidget.cpp
Expand Up @@ -311,6 +311,7 @@ void Qgs3DMapConfigWidget::onTerrainTypeChanged()
onTerrainLayerChanged();

updateMaxZoomLevel();
validate();
}

void Qgs3DMapConfigWidget::onTerrainLayerChanged()
Expand All @@ -329,6 +330,7 @@ void Qgs3DMapConfigWidget::onTerrainLayerChanged()
mMeshSymbolWidget->reloadColorRampShaderMinMax();
}
}
validate();
}

void Qgs3DMapConfigWidget::updateMaxZoomLevel()
Expand Down Expand Up @@ -363,3 +365,34 @@ void Qgs3DMapConfigWidget::updateMaxZoomLevel()
labelZoomLevels->setText( QStringLiteral( "0 - %1" ).arg( zoomLevel ) );
}

void Qgs3DMapConfigWidget::validate()
{
mMessageBar->clearWidgets();

bool valid = true;
switch ( static_cast<QgsTerrainGenerator::Type>( cboTerrainType->currentData().toInt() ) )
{
case QgsTerrainGenerator::Dem:
if ( ! cboTerrainLayer->currentLayer() )
{
valid = false;
mMessageBar->pushMessage( tr( "An elevation layer must be selected for a DEM terrain" ), Qgis::Warning, 0 );
}
break;

case QgsTerrainGenerator::Mesh:
if ( ! cboTerrainLayer->currentLayer() )
{
valid = false;
mMessageBar->pushMessage( tr( "An elevation layer must be selected for a mesh terrain" ), Qgis::Warning, 0 );
}
break;

case QgsTerrainGenerator::Online:
case QgsTerrainGenerator::Flat:
break;
}

emit isValidChanged( valid );
}

4 changes: 4 additions & 0 deletions src/app/3d/qgs3dmapconfigwidget.h
Expand Up @@ -41,11 +41,15 @@ class Qgs3DMapConfigWidget : public QWidget, private Ui::Map3DConfigWidget

signals:

void isValidChanged( bool valid );

private slots:
void onTerrainTypeChanged();
void onTerrainLayerChanged();
void updateMaxZoomLevel();

void validate();

private:
Qgs3DMapSettings *mMap = nullptr;
QgsMapCanvas *mMainCanvas = nullptr;
Expand Down
19 changes: 11 additions & 8 deletions src/ui/3d/map3dconfigwidget.ui
Expand Up @@ -13,7 +13,7 @@
<property name="windowTitle">
<string>Configure 3D Map Rendering</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<layout class="QVBoxLayout" name="verticalLayout_4" stretch="0,1">
<property name="leftMargin">
<number>0</number>
</property>
Expand All @@ -26,6 +26,9 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QgsMessageBar" name="mMessageBar" native="true"/>
</item>
<item>
<widget class="QSplitter" name="m3DOptionsSplitter">
<property name="orientation">
Expand Down Expand Up @@ -203,7 +206,7 @@
<x>0</x>
<y>0</y>
<width>705</width>
<height>620</height>
<height>604</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayoutTerrain">
Expand Down Expand Up @@ -842,12 +845,6 @@
<header>qgsscrollarea.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsPhongMaterialWidget</class>
<extends>QWidget</extends>
Expand All @@ -870,6 +867,12 @@
<header>qgslightswidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsMessageBar</class>
<extends>QWidget</extends>
<header>qgsmessagebar.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>spinCameraFieldOfView</tabstop>
Expand Down

0 comments on commit 0d9f1da

Please sign in to comment.