Skip to content

Commit 4c3afbb

Browse files
author
Arunmozhi
committed
Merged the symbol editing with the symbol selector dialog
1 parent 82dfbac commit 4c3afbb

10 files changed

+366
-106
lines changed

python/gui/symbology-ng-gui.sip

-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ class QgsSymbolV2SelectorDialog : QDialog //, private Ui::QgsSymbolV2SelectorDia
9595
void addLayer();
9696
void removeLayer();
9797
void lockLayer();
98-
void layerTypeChanged();
9998
void layerChanged();
10099
void updateLayerPreview();
101100
void updatePreview();

src/gui/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ symbology-ng/qgsellipsesymbollayerv2widget.cpp
3131
symbology-ng/qgspointdisplacementrendererwidget.cpp
3232
symbology-ng/qgsvectorfieldsymbollayerwidget.cpp
3333
symbology-ng/qgssymbolslistwidget.cpp
34+
symbology-ng/qgslayerpropertieswidget.cpp
3435

3536
attributetable/qgsattributetablemodel.cpp
3637
attributetable/qgsattributetablememorymodel.cpp
@@ -126,6 +127,7 @@ symbology-ng/qgsellipsesymbollayerv2widget.h
126127
symbology-ng/qgspointdisplacementrendererwidget.h
127128
symbology-ng/qgsvectorfieldsymbollayerwidget.h
128129
symbology-ng/qgssymbolslistwidget.h
130+
symbology-ng/qgslayerpropertieswidget.h
129131

130132
attributetable/qgsattributetableview.h
131133
attributetable/qgsattributetablemodel.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
/***************************************************************************
2+
qgslayerpropertieswidget.cpp
3+
----------------------------
4+
begin : June 2012
5+
copyright : (C) 2012 by Arunmozhi
6+
email : aruntheguy at gmail.com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgslayerpropertieswidget.h"
17+
18+
#include <QFile>
19+
#include <QStandardItem>
20+
#include <QKeyEvent>
21+
#include <QMessageBox>
22+
23+
#include "qgssymbollayerv2.h"
24+
#include "qgssymbollayerv2registry.h"
25+
26+
#include "qgsapplication.h"
27+
#include "qgslogger.h"
28+
29+
#include "qgssymbollayerv2widget.h"
30+
#include "qgsellipsesymbollayerv2widget.h"
31+
#include "qgsvectorfieldsymbollayerwidget.h"
32+
#include "qgssymbolv2.h" //for the unit
33+
34+
static bool _initWidgetFunction( QString name, QgsSymbolLayerV2WidgetFunc f )
35+
{
36+
QgsSymbolLayerV2Registry* reg = QgsSymbolLayerV2Registry::instance();
37+
38+
QgsSymbolLayerV2AbstractMetadata* abstractMetadata = reg->symbolLayerMetadata( name );
39+
if ( abstractMetadata == NULL )
40+
{
41+
QgsDebugMsg( "Failed to find symbol layer's entry in registry: " + name );
42+
return false;
43+
}
44+
QgsSymbolLayerV2Metadata* metadata = dynamic_cast<QgsSymbolLayerV2Metadata*>( abstractMetadata );
45+
if ( metadata == NULL )
46+
{
47+
QgsDebugMsg( "Failed to cast symbol layer's metadata: " + name );
48+
return false;
49+
}
50+
metadata->setWidgetFunction( f );
51+
return true;
52+
}
53+
54+
static void _initWidgetFunctions()
55+
{
56+
static bool initialized = false;
57+
if ( initialized )
58+
return;
59+
60+
_initWidgetFunction( "SimpleLine", QgsSimpleLineSymbolLayerV2Widget::create );
61+
_initWidgetFunction( "MarkerLine", QgsMarkerLineSymbolLayerV2Widget::create );
62+
_initWidgetFunction( "LineDecoration", QgsLineDecorationSymbolLayerV2Widget::create );
63+
64+
_initWidgetFunction( "SimpleMarker", QgsSimpleMarkerSymbolLayerV2Widget::create );
65+
_initWidgetFunction( "SvgMarker", QgsSvgMarkerSymbolLayerV2Widget::create );
66+
_initWidgetFunction( "FontMarker", QgsFontMarkerSymbolLayerV2Widget::create );
67+
_initWidgetFunction( "EllipseMarker", QgsEllipseSymbolLayerV2Widget::create );
68+
_initWidgetFunction( "VectorField", QgsVectorFieldSymbolLayerWidget::create );
69+
70+
_initWidgetFunction( "SimpleFill", QgsSimpleFillSymbolLayerV2Widget::create );
71+
_initWidgetFunction( "SVGFill", QgsSVGFillSymbolLayerWidget::create );
72+
_initWidgetFunction( "CentroidFill", QgsCentroidFillSymbolLayerV2Widget::create );
73+
_initWidgetFunction( "LinePatternFill", QgsLinePatternFillSymbolLayerWidget::create );
74+
_initWidgetFunction( "PointPatternFill", QgsPointPatternFillSymbolLayerWidget::create );
75+
76+
initialized = true;
77+
}
78+
79+
80+
QgsLayerPropertiesWidget::QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, const QgsSymbolV2* symbol, const QgsVectorLayer* vl, QWidget* parent )
81+
: QWidget( parent )
82+
{
83+
84+
mLayer = layer;
85+
mSymbol = symbol;
86+
mVectorLayer = vl;
87+
88+
setupUi( this );
89+
// initalize the sub-widgets
90+
// XXX Should this thing be here this way? Initalize all th widgets just for the sake of one layer?
91+
// TODO Make this on demand creation
92+
_initWidgetFunctions();
93+
94+
// TODO Algorithm
95+
//
96+
// 3. populate the combo box with the supported layer type
97+
// 4. set the present layer type
98+
// 5. create the widget for the present layer type and set inn stacked widget
99+
// 6. connect comboBox type changed to two things
100+
// 1. emit signal that type has beed changed
101+
// 2. remove the widget and place the new widget corresponding to the changed layer type
102+
//
103+
populateLayerTypes();
104+
// update layer type combo box
105+
int idx = cboLayerType->findData( mLayer->layerType() );
106+
cboLayerType->setCurrentIndex( idx );
107+
// set the corresponding widget
108+
updateSymbolLayerWidget( layer );
109+
connect( cboLayerType, SIGNAL( currentIndexChanged( int ) ), this, SLOT( layerTypeChanged() ) );
110+
}
111+
112+
void QgsLayerPropertiesWidget::populateLayerTypes()
113+
{
114+
QStringList types = QgsSymbolLayerV2Registry::instance()->symbolLayersForType( mSymbol->type() );
115+
116+
for ( int i = 0; i < types.count(); i++ )
117+
cboLayerType->addItem( QgsSymbolLayerV2Registry::instance()->symbolLayerMetadata( types[i] )->visibleName(), types[i] );
118+
119+
if ( mSymbol->type() == QgsSymbolV2::Fill )
120+
{
121+
QStringList typesLine = QgsSymbolLayerV2Registry::instance()->symbolLayersForType( QgsSymbolV2::Line );
122+
for ( int i = 0; i < typesLine.count(); i++ )
123+
{
124+
QString visibleName = QgsSymbolLayerV2Registry::instance()->symbolLayerMetadata( typesLine[i] )->visibleName();
125+
QString name = QString( tr( "Outline: %1" ) ).arg( visibleName );
126+
cboLayerType->addItem( name, typesLine[i] );
127+
}
128+
}
129+
130+
}
131+
132+
void QgsLayerPropertiesWidget::updateSymbolLayerWidget( QgsSymbolLayerV2* layer )
133+
{
134+
if ( stackedWidget->currentWidget() != pageDummy )
135+
{
136+
// stop updating from the original widget
137+
disconnect( stackedWidget->currentWidget(), SIGNAL( changed() ), this, SLOT( emitSignalChanged() ) );
138+
stackedWidget->removeWidget( stackedWidget->currentWidget() );
139+
}
140+
141+
QgsSymbolLayerV2Registry* pReg = QgsSymbolLayerV2Registry::instance();
142+
143+
QString layerType = layer->layerType();
144+
QgsSymbolLayerV2AbstractMetadata* am = pReg->symbolLayerMetadata( layerType );
145+
if ( am )
146+
{
147+
QgsSymbolLayerV2Widget* w = am->createSymbolLayerWidget( mVectorLayer );
148+
if ( w )
149+
{
150+
w->setSymbolLayer( layer );
151+
stackedWidget->addWidget( w );
152+
stackedWidget->setCurrentWidget( w );
153+
// start recieving updates from widget
154+
connect( w , SIGNAL( changed() ), this, SLOT( emitSignalChanged() ) );
155+
return;
156+
}
157+
}
158+
// When anything is not right
159+
stackedWidget->setCurrentWidget( pageDummy );
160+
}
161+
162+
void QgsLayerPropertiesWidget::layerTypeChanged()
163+
{
164+
QgsSymbolLayerV2* layer = mLayer;
165+
if ( !layer )
166+
return;
167+
QString newLayerType = cboLayerType->itemData( cboLayerType->currentIndex() ).toString();
168+
if ( layer->layerType() == newLayerType )
169+
return;
170+
171+
// get creation function for new layer from registry
172+
QgsSymbolLayerV2Registry* pReg = QgsSymbolLayerV2Registry::instance();
173+
QgsSymbolLayerV2AbstractMetadata* am = pReg->symbolLayerMetadata( newLayerType );
174+
if ( am == NULL ) // check whether the metadata is assigned
175+
return;
176+
177+
// change layer to a new (with different type)
178+
QgsSymbolLayerV2* newLayer = am->createSymbolLayer( QgsStringMap() );
179+
if ( newLayer == NULL )
180+
return;
181+
182+
updateSymbolLayerWidget( newLayer );
183+
emit changeLayer( newLayer );
184+
}
185+
186+
void QgsLayerPropertiesWidget::emitSignalChanged()
187+
{
188+
emit changed();
189+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/***************************************************************************
2+
qgslayerpropertieswidget.h
3+
---------------------
4+
begin : June 2012
5+
copyright : (C) 2012 by Martin Dobias
6+
email : aruntheguy at gmail.com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSLAYERPROPERTIESWIDGET_H
17+
#define QGSLAYERPROPERTIESWIDGET_H
18+
19+
#include "ui_widget_layerproperties.h"
20+
21+
class QgsSymbolV2;
22+
class QgsSymbolLayerV2;
23+
class QgsSymbolLayerV2Widget;
24+
class QgsVectorLayer;
25+
26+
class SymbolLayerItem;
27+
28+
#include <QMap>
29+
#include <QStandardItemModel>
30+
31+
32+
class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPropertiesWidget
33+
{
34+
Q_OBJECT
35+
36+
public:
37+
QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, const QgsSymbolV2* symbol, const QgsVectorLayer* vl, QWidget* parent = NULL );
38+
39+
40+
public slots:
41+
void layerTypeChanged();
42+
void emitSignalChanged();
43+
44+
signals:
45+
void changed();
46+
void changeLayer( QgsSymbolLayerV2* );
47+
48+
protected:
49+
void populateLayerTypes();
50+
void updateSymbolLayerWidget( QgsSymbolLayerV2* layer );
51+
52+
protected: // data
53+
QgsSymbolLayerV2* mLayer;
54+
55+
const QgsSymbolV2* mSymbol;
56+
const QgsVectorLayer* mVectorLayer;
57+
};
58+
59+
#endif //QGSLAYERPROPERTIESWIDGET_H

src/gui/symbology-ng/qgssymbolslistwidget.cpp

+6-15
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@
3535
#include <QMenu>
3636

3737

38-
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QWidget* parent ) : QWidget( parent )
38+
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QMenu* menu, QWidget* parent ) : QWidget( parent )
3939
{
4040
mSymbol = symbol;
4141
mStyle = style;
4242

4343
setupUi( this );
4444

4545
btnAdvanced->hide(); // advanced button is hidden by default
46+
if ( menu ) // show it if there is a menu pointer
47+
{
48+
btnAdvanced->setMenu( menu );
49+
btnAdvanced->show();
50+
}
4651

4752
QStandardItemModel* model = new QStandardItemModel( viewSymbols );
4853
viewSymbols->setModel( model );
@@ -270,17 +275,3 @@ void QgsSymbolsListWidget::setSymbolFromStyle( const QModelIndex & index )
270275
emit changed();
271276
}
272277

273-
QMenu* QgsSymbolsListWidget::advancedMenu()
274-
{
275-
if ( mAdvancedMenu == NULL )
276-
{
277-
mAdvancedMenu = new QMenu;
278-
btnAdvanced->setMenu( mAdvancedMenu );
279-
btnAdvanced->show();
280-
}
281-
return mAdvancedMenu;
282-
}
283-
284-
285-
286-

src/gui/symbology-ng/qgssymbolslistwidget.h

+2-10
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,12 @@ class QgsStyleV2;
2525

2626
class QMenu;
2727

28-
class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::WidgetSymbolsList
28+
class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListWidget
2929
{
3030
Q_OBJECT
3131

3232
public:
33-
QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QWidget* parent = NULL );
34-
35-
// static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsVectorFieldSymbolLayerWidget( vl ); }
36-
37-
//! return menu for "advanced" button - create it if doesn't exist and show the advanced button
38-
QMenu* advancedMenu();
33+
QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QMenu* menu, QWidget* parent = NULL );
3934

4035
public slots:
4136
void setSymbolFromStyle( const QModelIndex & index );
@@ -55,7 +50,6 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::WidgetSymbol
5550
protected:
5651
QgsSymbolV2* mSymbol;
5752
QgsStyleV2* mStyle;
58-
QMenu* mAdvancedMenu;
5953

6054
void populateSymbolView();
6155
void updateSymbolColor();
@@ -64,8 +58,6 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::WidgetSymbol
6458
private:
6559
/**Displays alpha value as transparency in mTransparencyLabel*/
6660
void displayTransparency( double alpha );
67-
68-
6961
};
7062

7163
#endif //QGSSYMBOLSLISTWIDGET_H

0 commit comments

Comments
 (0)