Skip to content

Commit 333842b

Browse files
author
wonder
committed
Improved categorized renderer settings in renderer dialog.
Fixed some bugs with marker cache image size, categorized renderer. Added dump() functions for easier debugging. git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@10805 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7877deb commit 333842b

12 files changed

+402
-206
lines changed

python/core/symbology-ng-core.sip

+4-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public:
2929

3030
virtual ~QgsFeatureRendererV2();
3131

32+
virtual QString dump();
33+
34+
3235
void renderFeature(QgsFeature& feature, QgsRenderContext& context);
3336

3437
protected:
@@ -304,7 +307,7 @@ public:
304307

305308
QImage bigSymbolPreviewImage();
306309

307-
void dump();
310+
QString dump();
308311

309312
virtual QgsSymbolV2* clone() const = 0 /Factory/;
310313

src/core/qgsvectorlayer.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,8 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
684684
{
685685
if (mRendererV2 == NULL)
686686
return FALSE;
687+
688+
QgsDebugMsg("rendering v2:\n" + mRendererV2->dump());
687689

688690
mRendererV2->startRender(rendererContext);
689691

@@ -3714,3 +3716,22 @@ QgsVectorOverlay* QgsVectorLayer::findOverlayByType( const QString& typeName )
37143716
}
37153717
return 0; //not found
37163718
}
3719+
3720+
3721+
QgsFeatureRendererV2* QgsVectorLayer::rendererV2()
3722+
{
3723+
return mRendererV2;
3724+
}
3725+
void QgsVectorLayer::setRendererV2(QgsFeatureRendererV2* r)
3726+
{
3727+
delete mRendererV2;
3728+
mRendererV2 = r;
3729+
}
3730+
bool QgsVectorLayer::isUsingRendererV2()
3731+
{
3732+
return mUsingRendererV2;
3733+
}
3734+
void QgsVectorLayer::setUsingRendererV2(bool usingRendererV2)
3735+
{
3736+
mUsingRendererV2 = usingRendererV2;
3737+
}

src/core/qgsvectorlayer.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,13 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
163163
void setRenderer( QgsRenderer * r );
164164

165165
/** Return renderer V2. Added in QGIS 1.2 */
166-
QgsFeatureRendererV2* rendererV2() { return mRendererV2; }
166+
QgsFeatureRendererV2* rendererV2();
167167
/** Set renderer V2. Added in QGIS 1.2 */
168-
void setRendererV2(QgsFeatureRendererV2* r) { mRendererV2 = r; }
168+
void setRendererV2(QgsFeatureRendererV2* r);
169169
/** Return whether using renderer V2. Added in QGIS 1.2 */
170-
bool isUsingRendererV2() { return mUsingRendererV2; }
170+
bool isUsingRendererV2();
171171
/** set whether to use renderer V2 for drawing. Added in QGIS 1.2 */
172-
void setUsingRendererV2(bool usingRendererV2) { mUsingRendererV2 = usingRendererV2; }
172+
void setUsingRendererV2(bool usingRendererV2);
173173

174174
/** Returns point, line or polygon */
175175
QGis::GeometryType geometryType() const;

src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

+10-7
Original file line numberDiff line numberDiff line change
@@ -148,16 +148,22 @@ void QgsSimpleMarkerSymbolLayerV2::startRender(QgsRenderContext& context)
148148
// cache the marker
149149
// TODO: use caching only when drawing to screen (not printer)
150150
// TODO: decide whether to use QImage or QPixmap - based on the render context
151-
double s = mSize+2;
152-
mCache = QImage(QSize(s,s), QImage::Format_ARGB32_Premultiplied);
151+
152+
// calculate necessary image size for the cache
153+
int pw = (( mPen.width() == 0 ? 1 : mPen.width() ) + 1 ) / 2 * 2; // make even (round up); handle cosmetic pen
154+
int imageSize = (( int ) mSize + pw ) / 2 * 2 + 1; // make image width, height odd; account for pen width
155+
156+
double center = ((double) imageSize / 2) + 0.5; // add 1/2 pixel for proper rounding when the figure's coordinates are added
157+
158+
mCache = QImage(QSize(imageSize,imageSize), QImage::Format_ARGB32_Premultiplied);
153159
mCache.fill(0);
154160

155161
QPainter p;
156162
p.begin(&mCache);
157163
p.setRenderHint( QPainter::Antialiasing );
158164
p.setBrush(mBrush);
159165
p.setPen(mPen);
160-
p.translate(QPointF(s/2.0, s/2.0));
166+
p.translate(QPointF(center, center));
161167
drawMarker(&p);
162168
p.end();
163169
}
@@ -176,13 +182,10 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint(const QPointF& point, QgsRenderCo
176182
//p->translate(point);
177183

178184
//drawMarker(p);
179-
double s = mSize+2;
185+
double s = mCache.width();
180186
//if (mCache.isValid())
181187
p->drawImage(point + QPointF(-s/2.0, -s/2.0), mCache);
182-
//else
183-
//qDebug("WTF!!!!!!!!!");
184188

185-
//p->translate(-point); // TODO: maybe save+restore is faster?
186189
//p->restore();
187190
}
188191

src/core/symbology-ng/qgsrendererv2.cpp

+41-15
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ void QgsFeatureRendererV2::renderFeature(QgsFeature& feature, QgsRenderContext&
236236
}
237237
}
238238

239+
QString QgsFeatureRendererV2::dump()
240+
{
241+
return "UNKNOWN RENDERER\n";
242+
}
243+
244+
239245
///////////////////
240246

241247
QgsSingleSymbolRendererV2::QgsSingleSymbolRendererV2(QgsSymbolV2* symbol)
@@ -280,6 +286,12 @@ void QgsSingleSymbolRendererV2::setSymbol(QgsSymbolV2* s)
280286
mSymbol = s;
281287
}
282288

289+
QString QgsSingleSymbolRendererV2::dump()
290+
{
291+
return QString("SINGLE: %1").arg(mSymbol->dump());
292+
}
293+
294+
283295
///////////////////
284296

285297
QgsRendererCategoryV2::QgsRendererCategoryV2(const QgsRendererCategoryV2& cat)
@@ -300,6 +312,11 @@ void QgsRendererCategoryV2::setSymbol(QgsSymbolV2* s)
300312
mSymbol = s;
301313
}
302314

315+
QString QgsRendererCategoryV2::dump()
316+
{
317+
return QString("%1::%2::%3\n").arg(mValue.toString()).arg(mLabel).arg(mSymbol->dump());
318+
}
319+
303320
///////////////////
304321

305322
QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2(int attrNum, QgsCategoryList categories)
@@ -322,25 +339,23 @@ QgsCategorizedSymbolRendererV2::~QgsCategorizedSymbolRendererV2()
322339
mCategories.clear(); // this should also call destructors of symbols
323340
}
324341

325-
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue(QVariant value)
342+
void QgsCategorizedSymbolRendererV2::rebuildHash()
326343
{
327-
static QHash<QString, QgsSymbolV2*> symbolHash;
328-
static bool first = true;
329-
330-
// init the hash table if not yet filled
331-
// TODO: special case for int, double
332-
if (first)
344+
mSymbolHash.clear();
345+
346+
for (int i = 0; i < mCategories.count(); ++i)
333347
{
334-
for (int i = 0; i < mCategories.count(); ++i)
335-
{
336-
QgsRendererCategoryV2& cat = mCategories[i];
337-
symbolHash.insert(cat.value().toString(), cat.symbol());
338-
}
339-
first = false;
348+
QgsRendererCategoryV2& cat = mCategories[i];
349+
mSymbolHash.insert(cat.value().toString(), cat.symbol());
340350
}
351+
}
352+
353+
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue(QVariant value)
354+
{
355+
// TODO: special case for int, double
341356

342-
QHash<QString, QgsSymbolV2*>::iterator it = symbolHash.find(value.toString());
343-
if (it == symbolHash.end())
357+
QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find(value.toString());
358+
if (it == mSymbolHash.end())
344359
{
345360
QgsDebugMsg("attribute value not found: " + value.toString());
346361
return NULL;
@@ -405,6 +420,9 @@ void QgsCategorizedSymbolRendererV2::deleteAllCategories()
405420

406421
void QgsCategorizedSymbolRendererV2::startRender(QgsRenderContext& context)
407422
{
423+
// make sure that the hash table is up to date
424+
rebuildHash();
425+
408426
QgsCategoryList::iterator it = mCategories.begin();
409427
for ( ; it != mCategories.end(); ++it)
410428
it->symbol()->startRender(context);
@@ -424,6 +442,14 @@ QList<int> QgsCategorizedSymbolRendererV2::usedAttributes()
424442
return lst;
425443
}
426444

445+
QString QgsCategorizedSymbolRendererV2::dump()
446+
{
447+
QString s = QString("CATEGORIZED: idx %1\n").arg(mAttrNum);
448+
for (int i=0; i<mCategories.count();i++)
449+
s += mCategories[i].dump();
450+
return s;
451+
}
452+
427453

428454
/////////////////////////
429455
// graduated

src/core/symbology-ng/qgsrendererv2.h

+16-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class QgsFeatureRendererV2
3838
virtual ~QgsFeatureRendererV2() {}
3939

4040
void renderFeature(QgsFeature& feature, QgsRenderContext& context);
41+
42+
//! for debugging
43+
virtual QString dump();
4144

4245
//TODO: symbols() for symbol levels
4346

@@ -66,6 +69,8 @@ class QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2
6669
QgsSymbolV2* symbol() const;
6770
void setSymbol(QgsSymbolV2* s);
6871

72+
virtual QString dump();
73+
6974
protected:
7075
QgsSymbolV2* mSymbol;
7176
};
@@ -90,6 +95,9 @@ class QgsRendererCategoryV2
9095

9196
void setSymbol(QgsSymbolV2* s);
9297
void setLabel(QString label) { mLabel = label; }
98+
99+
// debugging
100+
QString dump();
93101

94102
protected:
95103
QVariant mValue;
@@ -115,6 +123,8 @@ class QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
115123

116124
virtual QList<int> usedAttributes();
117125

126+
virtual QString dump();
127+
118128
const QgsCategoryList& categories() { return mCategories; }
119129

120130
//! return index of category with specified value (-1 if not found)
@@ -132,7 +142,12 @@ class QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
132142
protected:
133143
QgsCategoryList mCategories;
134144
int mAttrNum;
135-
145+
146+
//! hashtable for faster access to symbols
147+
QHash<QString, QgsSymbolV2*> mSymbolHash;
148+
149+
void rebuildHash();
150+
136151
QgsSymbolV2* symbolForValue(QVariant value);
137152
};
138153

src/core/symbology-ng/qgssymbollayerv2.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void QgsMarkerSymbolLayerV2::drawPreviewIcon(QPainter* painter, QSize size)
2929
context.setPainter(painter);
3030

3131
startRender(context);
32-
renderPoint(QPointF(size.width()/2 + 0.5, size.height()/2 + 0.5), context);
32+
renderPoint(QPointF(size.width()/2, size.height()/2), context);
3333
stopRender(context);
3434
}
3535

src/core/symbology-ng/qgssymbolv2.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,23 @@ QImage QgsSymbolV2::bigSymbolPreviewImage()
190190
}
191191

192192

193-
void QgsSymbolV2::dump()
193+
QString QgsSymbolV2::dump()
194194
{
195+
QString t;
196+
switch (type())
197+
{
198+
case QgsSymbolV2::Marker: t = "MARKER"; break;
199+
case QgsSymbolV2::Line: t = "LINE"; break;
200+
case QgsSymbolV2::Fill: t = "FILL"; break;
201+
default: Q_ASSERT(0 && "unknown symbol type");
202+
}
203+
QString s = QString("%1 SYMBOL (%2 layers) color %3").arg(t).arg(mLayers.count()).arg(QgsSymbolLayerV2Utils::encodeColor(color()));
204+
195205
for (QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it)
196206
{
197207
// TODO:
198208
}
209+
return s;
199210
}
200211

201212
QgsSymbolLayerV2List QgsSymbolV2::cloneLayers() const

src/core/symbology-ng/qgssymbolv2.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class QgsSymbolV2
6464

6565
QImage bigSymbolPreviewImage();
6666

67-
void dump();
67+
QString dump();
6868

6969
virtual QgsSymbolV2* clone() const = 0;
7070

src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp

+28-11
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,14 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog(QgsVectorLayer* lay
4747
labels << "Value" << "Label";
4848
m->setHorizontalHeaderLabels(labels);
4949
viewCategories->setModel(m);
50-
50+
51+
mCategorizedSymbol = createDefaultSymbol();
52+
5153
connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
5254

5355
connect(viewCategories, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(categoriesDoubleClicked(const QModelIndex &)));
5456

57+
connect(btnChangeCategorizedSymbol, SIGNAL(clicked()), this, SLOT(changeCategorizedSymbol()));
5558
connect(btnAddCategories, SIGNAL(clicked()), this, SLOT(addCategories()));
5659
connect(btnDeleteCategory, SIGNAL(clicked()), this, SLOT(deleteCategory()));
5760
connect(btnDeleteAllCategories, SIGNAL(clicked()), this, SLOT(deleteAllCategories()));
@@ -144,7 +147,8 @@ void QgsRendererV2PropertiesDialog::updateUiFromRenderer()
144147
radCategorized->setChecked(true);
145148

146149
stackedWidget->setCurrentWidget(pageCategorized);
147-
150+
updateCategorizedSymbolIcon();
151+
148152
{
149153
int idx = rendererCategorized()->attributeIndex();
150154
cboCategorizedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
@@ -201,6 +205,21 @@ QgsSymbolV2* QgsRendererV2PropertiesDialog::createDefaultSymbol()
201205
}
202206
}
203207

208+
void QgsRendererV2PropertiesDialog::changeCategorizedSymbol()
209+
{
210+
QgsSymbolV2SelectorDialog dlg(mCategorizedSymbol, mStyle, this);
211+
if (!dlg.exec())
212+
return;
213+
214+
updateCategorizedSymbolIcon();
215+
}
216+
217+
void QgsRendererV2PropertiesDialog::updateCategorizedSymbolIcon()
218+
{
219+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mCategorizedSymbol, btnChangeCategorizedSymbol->iconSize());
220+
btnChangeCategorizedSymbol->setIcon(icon);
221+
}
222+
204223
void QgsRendererV2PropertiesDialog::populateCategories()
205224
{
206225
QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
@@ -310,16 +329,10 @@ void QgsRendererV2PropertiesDialog::addCategories()
310329
//if (!dlg.exec())
311330
// return;
312331

313-
QgsSymbolV2* newSymbol = createDefaultSymbol();
314-
QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
315-
if (!dlg.exec())
316-
{
317-
delete newSymbol;
318-
return;
319-
}
332+
QgsVectorColorRampV2* ramp = mStyle->colorRamp( cboCategorizedColorRamp->currentText() );
320333

321334
QgsCategoryList cats;
322-
::createCategories(cats, unique_vals, newSymbol, new QgsVectorGradientColorRampV2()); // dlg.activeRamp());
335+
::createCategories(cats, unique_vals, mCategorizedSymbol, ramp );
323336

324337
// TODO: if not all categories are desired, delete some!
325338
/*
@@ -393,11 +406,15 @@ void QgsRendererV2PropertiesDialog::populateColorRamps()
393406
{
394407
QSize rampIconSize(50,16);
395408
cboGraduatedColorRamp->setIconSize(rampIconSize);
409+
cboCategorizedColorRamp->setIconSize(rampIconSize);
410+
396411
QStringList rampNames = mStyle->colorRampNames();
397412
for (QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it)
398413
{
399414
QgsVectorColorRampV2* ramp = mStyle->colorRamp(*it);
400-
cboGraduatedColorRamp->addItem( QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize), *it);
415+
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize);
416+
cboGraduatedColorRamp->addItem(icon, *it);
417+
cboCategorizedColorRamp->addItem(icon, *it);
401418
delete ramp;
402419
}
403420
}

0 commit comments

Comments
 (0)