Skip to content

Commit 1c34339

Browse files
committedApr 30, 2018
Use modal dialog when in properties dialog, allowing to cancel
the process and add help button (fix #17903). Also fix crash that occurs when pressing ESC button. and fix doc
1 parent 89c2b4b commit 1c34339

6 files changed

+115
-22
lines changed
 

‎python/gui/symbology/qgscategorizedsymbolrendererwidget.sip.in‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ Changes the selected symbols alone for the change button, if there is a selectio
110110
%End
111111

112112
void changeCategorySymbol();
113+
void applyChangeToSymbol();
114+
%Docstring
115+
Applies current symbol to selected categories, or to all categories if none is selected
116+
%End
113117

114118
virtual QList<QgsSymbol *> selectedSymbols();
115119

‎python/gui/symbology/qgsgraduatedsymbolrendererwidget.sip.in‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ Returns a list of indexes for the classes under selection
7878
void changeRange( int rangeIdx );
7979

8080
void changeSelectedSymbols();
81+
void applyChangeToSymbol();
82+
%Docstring
83+
Applies current symbol to selected ranges, or to all ranges if none is selected
84+
%End
8185

8286
virtual QList<QgsSymbol *> selectedSymbols();
8387

‎src/gui/symbology/qgscategorizedsymbolrendererwidget.cpp‎

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -544,14 +544,32 @@ void QgsCategorizedSymbolRendererWidget::changeSelectedSymbols()
544544

545545
void QgsCategorizedSymbolRendererWidget::changeCategorizedSymbol()
546546
{
547+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
547548
QgsSymbol *newSymbol = mCategorizedSymbol->clone();
548-
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, nullptr );
549-
dlg->setContext( mContext );
549+
if ( panel && panel->dockMode() )
550+
{
551+
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, panel );
552+
dlg->setContext( mContext );
553+
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsCategorizedSymbolRendererWidget::updateSymbolsFromWidget );
554+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::cleanUpSymbolSelector );
555+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::updateCategorizedSymbolIcon );
556+
openPanel( dlg );
557+
}
558+
else
559+
{
560+
QgsSymbolSelectorDialog dlg( newSymbol, mStyle, mLayer, panel );
561+
dlg.setContext( mContext );
562+
if ( !dlg.exec() || !newSymbol )
563+
{
564+
delete newSymbol;
565+
return;
566+
}
550567

551-
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsCategorizedSymbolRendererWidget::updateSymbolsFromWidget );
552-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::cleanUpSymbolSelector );
553-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::updateCategorizedSymbolIcon );
554-
openPanel( dlg );
568+
delete mCategorizedSymbol;
569+
mCategorizedSymbol = newSymbol;
570+
updateCategorizedSymbolIcon();
571+
applyChangeToSymbol();
572+
}
555573
}
556574

557575
void QgsCategorizedSymbolRendererWidget::updateCategorizedSymbolIcon()
@@ -593,11 +611,29 @@ void QgsCategorizedSymbolRendererWidget::changeCategorySymbol()
593611
symbol = QgsSymbol::defaultSymbol( mLayer->geometryType() );
594612
}
595613

596-
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( symbol, mStyle, mLayer, nullptr );
597-
dlg->setContext( mContext );
598-
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsCategorizedSymbolRendererWidget::updateSymbolsFromWidget );
599-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::cleanUpSymbolSelector );
600-
openPanel( dlg );
614+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
615+
if ( panel && panel->dockMode() )
616+
{
617+
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( symbol, mStyle, mLayer, panel );
618+
dlg->setContext( mContext );
619+
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsCategorizedSymbolRendererWidget::updateSymbolsFromWidget );
620+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsCategorizedSymbolRendererWidget::cleanUpSymbolSelector );
621+
openPanel( dlg );
622+
}
623+
else
624+
{
625+
QgsSymbolSelectorDialog dlg( symbol, mStyle, mLayer, panel );
626+
dlg.setContext( mContext );
627+
if ( !dlg.exec() || !symbol )
628+
{
629+
delete symbol;
630+
return;
631+
}
632+
633+
delete mCategorizedSymbol;
634+
mCategorizedSymbol = symbol;
635+
applyChangeToSymbol();
636+
}
601637
}
602638

603639
static void _createCategories( QgsCategoryList &cats, QList<QVariant> &values, QgsSymbol *symbol )
@@ -954,6 +990,11 @@ void QgsCategorizedSymbolRendererWidget::updateSymbolsFromWidget()
954990
QgsSymbolSelectorWidget *dlg = qobject_cast<QgsSymbolSelectorWidget *>( sender() );
955991
mCategorizedSymbol.reset( dlg->symbol()->clone() );
956992

993+
applyChangeToSymbol();
994+
}
995+
996+
void QgsCategorizedSymbolRendererWidget::applyChangeToSymbol()
997+
{
957998
// When there is a selection, change the selected symbols only
958999
QItemSelectionModel *m = viewCategories->selectionModel();
9591000
QModelIndexList i = m->selectedRows();

‎src/gui/symbology/qgscategorizedsymbolrendererwidget.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ class GUI_EXPORT QgsCategorizedSymbolRendererWidget : public QgsRendererWidget,
173173
void changeSelectedSymbols();
174174

175175
void changeCategorySymbol();
176+
//! Applies current symbol to selected categories, or to all categories if none is selected
177+
void applyChangeToSymbol();
176178

177179
QList<QgsSymbol *> selectedSymbols() override;
178180
QgsCategoryList selectedCategoryList();

‎src/gui/symbology/qgsgraduatedsymbolrendererwidget.cpp‎

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,11 @@ void QgsGraduatedSymbolRendererWidget::updateSymbolsFromWidget()
754754
QgsSymbolSelectorWidget *dlg = qobject_cast<QgsSymbolSelectorWidget *>( sender() );
755755
mGraduatedSymbol.reset( dlg->symbol()->clone() );
756756

757+
applyChangeToSymbol();
758+
}
759+
760+
void QgsGraduatedSymbolRendererWidget::applyChangeToSymbol()
761+
{
757762
mSizeUnitWidget->blockSignals( true );
758763
mSizeUnitWidget->setUnit( mGraduatedSymbol->outputUnit() );
759764
mSizeUnitWidget->setMapUnitScale( mGraduatedSymbol->mapUnitScale() );
@@ -874,13 +879,31 @@ void QgsGraduatedSymbolRendererWidget::reapplySizes()
874879
void QgsGraduatedSymbolRendererWidget::changeGraduatedSymbol()
875880
{
876881
QgsSymbol *newSymbol = mGraduatedSymbol->clone();
877-
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, nullptr );
878-
dlg->setContext( mContext );
882+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
883+
if ( panel && panel->dockMode() )
884+
{
885+
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, panel );
886+
dlg->setContext( mContext );
887+
888+
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsGraduatedSymbolRendererWidget::updateSymbolsFromWidget );
889+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::cleanUpSymbolSelector );
890+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::updateGraduatedSymbolIcon );
891+
panel->openPanel( dlg );
892+
}
893+
else
894+
{
895+
QgsSymbolSelectorDialog dlg( newSymbol, mStyle, mLayer, panel );
896+
if ( !dlg.exec() || !newSymbol )
897+
{
898+
delete newSymbol;
899+
return;
900+
}
879901

880-
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsGraduatedSymbolRendererWidget::updateSymbolsFromWidget );
881-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::cleanUpSymbolSelector );
882-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::updateGraduatedSymbolIcon );
883-
openPanel( dlg );
902+
delete mGraduatedSymbol;
903+
mGraduatedSymbol = newSymbol;
904+
updateGraduatedSymbolIcon();
905+
applyChangeToSymbol();
906+
}
884907
}
885908

886909
void QgsGraduatedSymbolRendererWidget::updateGraduatedSymbolIcon()
@@ -953,12 +976,29 @@ void QgsGraduatedSymbolRendererWidget::changeSelectedSymbols()
953976
void QgsGraduatedSymbolRendererWidget::changeRangeSymbol( int rangeIdx )
954977
{
955978
QgsSymbol *newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone();
956-
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, nullptr );
957-
dlg->setContext( mContext );
979+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
980+
if ( panel && panel->dockMode() )
981+
{
982+
QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( newSymbol, mStyle, mLayer, panel );
983+
dlg->setContext( mContext );
984+
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsGraduatedSymbolRendererWidget::updateSymbolsFromWidget );
985+
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::cleanUpSymbolSelector );
986+
openPanel( dlg );
987+
}
988+
else
989+
{
990+
QgsSymbolSelectorDialog dlg( newSymbol, mStyle, mLayer, panel );
991+
dlg.setContext( mContext );
992+
if ( !dlg.exec() || !newSymbol )
993+
{
994+
delete newSymbol;
995+
return;
996+
}
958997

959-
connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsGraduatedSymbolRendererWidget::updateSymbolsFromWidget );
960-
connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsGraduatedSymbolRendererWidget::cleanUpSymbolSelector );
961-
openPanel( dlg );
998+
delete mGraduatedSymbol;
999+
mGraduatedSymbol = newSymbol;
1000+
applyChangeToSymbol();
1001+
}
9621002
}
9631003

9641004
void QgsGraduatedSymbolRendererWidget::changeRange( int rangeIdx )

‎src/gui/symbology/qgsgraduatedsymbolrendererwidget.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ class GUI_EXPORT QgsGraduatedSymbolRendererWidget : public QgsRendererWidget, pr
146146
void changeRange( int rangeIdx );
147147

148148
void changeSelectedSymbols();
149+
//! Applies current symbol to selected ranges, or to all ranges if none is selected
150+
void applyChangeToSymbol();
149151

150152
QList<QgsSymbol *> selectedSymbols() override;
151153
QgsSymbol *findSymbolForRange( double lowerBound, double upperBound, const QgsRangeList &ranges ) const;

0 commit comments

Comments
 (0)
Please sign in to comment.