@@ -9,25 +9,23 @@ QgsLabelingWidget::QgsLabelingWidget( QgsVectorLayer* layer, QgsMapCanvas* canva
99 : QWidget( parent )
1010 , mLayer( layer )
1111 , mCanvas( canvas )
12+ , mWidget( 0 )
1213{
1314 setupUi ( this );
1415
1516 connect ( mEngineSettingsButton , SIGNAL ( clicked () ), this , SLOT ( showEngineConfigDialog () ) );
1617
17- mWidgetSimple = new QgsLabelingGui ( layer, canvas, this );
18- mWidgetRules = new QgsRuleBasedLabelingWidget ( layer, canvas, this );
19- mStackedWidget ->addWidget ( mWidgetSimple );
20- mStackedWidget ->addWidget ( mWidgetRules );
18+ mLabelModeComboBox ->setCurrentIndex ( -1 );
2119
22- mStackedWidget ->setCurrentIndex ( 0 );
23- }
20+ connect ( mLabelModeComboBox , SIGNAL ( currentIndexChanged ( int ) ), this , SLOT ( labelModeChanged ( int ) ) );
2421
25- void QgsLabelingWidget::init ()
26- {
27- if ( !mLayer ->labeling () || mLayer ->labeling ()->type () == " simple" )
22+ // pick the right mode of the layer
23+ if ( mLayer ->labeling () && mLayer ->labeling ()->type () == " rule-based" )
24+ {
25+ mLabelModeComboBox ->setCurrentIndex ( 3 );
26+ }
27+ else
2828 {
29- mStackedWidget ->setCurrentIndex ( 0 );
30-
3129 // load labeling settings from layer
3230 QgsPalLayerSettings lyr;
3331 lyr.readFromLayer ( mLayer );
@@ -41,41 +39,56 @@ void QgsLabelingWidget::init()
4139 {
4240 mLabelModeComboBox ->setCurrentIndex ( lyr.drawLabels ? 1 : 2 );
4341 }
44-
45- mWidgetSimple ->init ();
46- }
47- else if ( mLayer ->labeling () && mLayer ->labeling ()->type () == " rule-based" )
48- {
49- mStackedWidget ->setCurrentIndex ( 1 );
50- mWidgetRules ->init ();
5142 }
5243}
5344
5445void QgsLabelingWidget::writeSettingsToLayer ()
5546{
56- if ( mLabelModeComboBox ->currentIndex () < 3 )
47+ if ( mLabelModeComboBox ->currentIndex () == 3 )
5748 {
58- mWidgetSimple ->writeSettingsToLayer ();
49+ qobject_cast<QgsRuleBasedLabelingWidget*>( mWidget ) ->writeSettingsToLayer ();
5950 }
6051 else
6152 {
62- mWidgetRules ->writeSettingsToLayer ();
53+ qobject_cast<QgsLabelingGui*>( mWidget ) ->writeSettingsToLayer ();
6354 }
6455}
6556
6657
67- void QgsLabelingWidget::on_mLabelModeComboBox_currentIndexChanged ( int index )
58+ void QgsLabelingWidget::labelModeChanged ( int index )
6859{
6960 if ( index < 3 )
7061 {
71- mStackedWidget ->setCurrentIndex ( 0 );
72- mWidgetSimple ->setLabelMode ( ( QgsLabelingGui::LabelMode ) index );
62+ if ( QgsLabelingGui* widgetSimple = qobject_cast<QgsLabelingGui*>( mWidget ) )
63+ {
64+ // lighter variant - just change the mode of existing widget
65+ widgetSimple->setLabelMode (( QgsLabelingGui::LabelMode ) index );
66+ return ;
67+ }
68+ }
69+
70+ // in general case we need to recreate the widget
71+
72+ if ( mWidget )
73+ mStackedWidget ->removeWidget ( mWidget );
74+
75+ delete mWidget ;
76+ mWidget = 0 ;
77+
78+ if ( index == 3 )
79+ {
80+ mWidget = new QgsRuleBasedLabelingWidget ( mLayer , mCanvas , this );
7381 }
7482 else
7583 {
76- // rule-based labeling
77- mStackedWidget ->setCurrentIndex ( 1 );
84+ QgsLabelingGui* w = new QgsLabelingGui ( mLayer , mCanvas , 0 , this );
85+ w->setLabelMode (( QgsLabelingGui::LabelMode ) index );
86+ w->init ();
87+ mWidget = w;
7888 }
89+
90+ mStackedWidget ->addWidget ( mWidget );
91+ mStackedWidget ->setCurrentWidget ( mWidget );
7992}
8093
8194void QgsLabelingWidget::showEngineConfigDialog ()
0 commit comments