Skip to content

Commit

Permalink
a lot of changes to simplify the interactions between renderers, rend…
Browse files Browse the repository at this point in the history
…erer dialogs and qgsdlgvectorlayerproperties. E.g. the vector layer properties is now created/ destroyed each time it is opened/ closed. The unique value has not been changed yet. Also, the item legend is disabled for vector layers at the moment.

git-svn-id: http://svn.osgeo.org/qgis/trunk@3548 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Jun 7, 2005
1 parent f5f0083 commit 5656eb3
Show file tree
Hide file tree
Showing 29 changed files with 693 additions and 1,171 deletions.
36 changes: 10 additions & 26 deletions qgis.dtd
Expand Up @@ -44,7 +44,11 @@
--
-->

<!ELEMENT symbol (outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern) >
<!ELEMENT symbol (lowervalue, uppervalue, label,
outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern) >
<!ELEMENT lowervalue (#PCDATA) >
<!ELEMENT uppervalue (#PCDATA) >
<!ELEMENT label (#PCDATA) >
<!ELEMENT outlinecolor EMPTY >
<!ELEMENT outlinestyle (#PCDATA) >
<!ELEMENT outlinewidth (#PCDATA) >
Expand All @@ -63,41 +67,21 @@
blue CDATA #REQUIRED
>

<!ELEMENT
markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern)
>
<!ELEMENT svgpath (#PCDATA) >
<!ELEMENT scalefactor (#PCDATA) >

<!--
-- renderitem and rangerenderitem
--
-->

<!ELEMENT renderitem (value,(symbol | markersymbol),label) >
<!ELEMENT value (#PCDATA) >
<!ELEMENT label (#PCDATA) >

<!ELEMENT rangerenderitem (lowervalue,uppervalue,(symbol | markersymbol),label) >
<!ELEMENT lowervalue (#PCDATA) >
<!ELEMENT uppervalue (#PCDATA) >

<!--
-- elements to store the settings of the different symbology types
--
-->

<!ELEMENT singlesymbol (renderitem) >
<!ELEMENT singlesymbol (symbol) >
<!ELEMENT singlemarker (renderitem) >
<!ELEMENT graduatedsymbol (classificationfield,rangerenderitem+) >
<!ELEMENT graduatedsymbol (classificationfield,symbol+) >
<!ELEMENT graduatedmarker (classificationfield,rangerenderitem+) >
<!ELEMENT uniquevalue (classificationfield,renderitem+) >
<!ELEMENT uniquevaluemarker (classificationfield,renderitem+) >
<!ELEMENT classificationfield (#PCDATA) >
<!ELEMENT continuoussymbol (classificationfield,lowestitem,highestitem) >
<!ELEMENT lowestitem (renderitem) >
<!ELEMENT highestitem (renderitem) >

<!ELEMENT continuoussymbol (classificationfield,lowestsymbol,highestsymbol) >
<!ELEMENT lowestsymbol (symbol) >
<!ELEMENT highestsymbol (symbol) >

<!--
-- Raster Layer Properties
Expand Down
13 changes: 5 additions & 8 deletions src/qgisapp.cpp
Expand Up @@ -1130,7 +1130,7 @@ bool QgisApp::addLayer(QFileInfo const & vectorFile)
// XXX QgsProject::read() (If layers added via that.)

//add single symbol renderer as default
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer();
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(layer->vectorType());

Q_CHECK_PTR( renderer );

Expand All @@ -1146,7 +1146,7 @@ bool QgisApp::addLayer(QFileInfo const & vectorFile)
}

layer->setRenderer(renderer);
renderer->initializeSymbology(layer);

// not necessary since registry will add to canvas mMapCanvas->addLayer(layer);
// XXX some day will not necessary since connect up a request from
// the raster layer to show in overview map
Expand Down Expand Up @@ -1269,7 +1269,7 @@ bool QgisApp::addLayer(QStringList const &theLayerQStringList, const QString& en
// XXX now taken care of in legend layer->initContextMenu(this);

//add single symbol renderer as default
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer();
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(layer->vectorType());

Q_CHECK_PTR( renderer );

Expand All @@ -1283,7 +1283,6 @@ bool QgisApp::addLayer(QStringList const &theLayerQStringList, const QString& en
}

layer->setRenderer(renderer);
renderer->initializeSymbology(layer);

// map canvas and overview canvas already know about this layer
// when it is added to map registry
Expand Down Expand Up @@ -1419,9 +1418,8 @@ void QgisApp::addDatabaseLayer()
// XXX now taken care of in legend layer->initContextMenu(this);

// give it a random color
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(); // add single symbol renderer as default
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(layer->vectorType()); // add single symbol renderer as default
layer->setRenderer(renderer);
renderer->initializeSymbology(layer);
// add it to the mapcanvas collection
// mMapCanvas->addLayer(layer);
//connect up a request from the raster layer to show in overview map
Expand Down Expand Up @@ -4076,9 +4074,8 @@ void QgisApp::addVectorLayer(QString vectorLayerPath, QString baseName, QString
// now taken care of in legend layer->initContextMenu(this);

// give it a random color
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(); //add single symbol renderer as default
QgsSingleSymRenderer *renderer = new QgsSingleSymRenderer(layer->vectorType()); //add single symbol renderer as default
layer->setRenderer(renderer);
renderer->initializeSymbology(layer);
// add it to the mapcanvas collection
// mMapCanvas->addLayer(layer); No longer necessary since adding to registry will add to canvas

Expand Down
28 changes: 12 additions & 16 deletions src/qgscomposervectorlegend.cpp
Expand Up @@ -315,14 +315,14 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
if ( (group > 0 && group2 == group) || ( group == 0 && j == i ) ) {
groupLayers.push_back(j);

std::list<QgsRenderItem*> items = renderer->items();
std::list<QgsSymbol*> symbols = renderer->symbols();

if ( sectionTitle.length() == 0 ) {
sectionTitle = layer2->name();
}

if ( items.size() > sectionItemsCount ) {
sectionItemsCount = items.size();
if ( symbols.size() > sectionItemsCount ) {
sectionItemsCount = symbols.size();
itemHeights.resize(sectionItemsCount);
itemLabels.resize(sectionItemsCount);
}
Expand All @@ -335,10 +335,9 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
double scale = map->symbolScale() * mComposition->scale();

int icnt = 0;
for ( std::list<QgsRenderItem*>::iterator it = items.begin(); it != items.end(); ++it ) {
for ( std::list<QgsSymbol*>::iterator it = symbols.begin(); it != symbols.end(); ++it ) {

QgsRenderItem *ri = (*it);
QgsSymbol *sym = ri->getSymbol();
QgsSymbol* sym = (*it);

// height
if ( itemHeights[icnt] < mSymbolHeight ) { // init first
Expand All @@ -353,10 +352,10 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
}

if ( itemLabels[icnt].length() == 0 ) {
if ( ri->label().length() > 0 ) {
itemLabels[icnt] = ri->label();
if ( sym->label().length() > 0 ) {
itemLabels[icnt] = sym->label();
} else {
itemLabels[icnt] = ri->value();
itemLabels[icnt] = sym->lowerValue();
}
}

Expand Down Expand Up @@ -404,17 +403,14 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
QgsRenderer *renderer = vector->renderer();

// Symbol
std::list<QgsRenderItem*> items = renderer->items();
std::list<QgsSymbol*> symbols = renderer->symbols();

int icnt = 0;
for ( std::list<QgsRenderItem*>::iterator it = items.begin(); it != items.end(); ++it ) {
for ( std::list<QgsSymbol*>::iterator it = symbols.begin(); it != symbols.end(); ++it ) {
localHeight += mSymbolSpace;

int symbolHeight = itemHeights[icnt];

QgsRenderItem *ri = (*it);

QgsSymbol *sym = ri->getSymbol();
QgsSymbol* sym = (*it);

QPen pen = sym->pen();
double widthScale = map->widthScale() * mComposition->scale();
Expand Down
150 changes: 60 additions & 90 deletions src/qgscontcoldialog.cpp
Expand Up @@ -78,34 +78,24 @@ QgsContColDialog::QgsContColDialog(QgsVectorLayer * layer)

//restore the correct colors for minimum and maximum values

QgsContinuousColRenderer *renderer;

if (mVectorLayer->propertiesDialog())
{
renderer = dynamic_cast < QgsContinuousColRenderer * >(layer->propertiesDialog()->getBufferRenderer());
}
else
{
renderer = dynamic_cast < QgsContinuousColRenderer * >(layer->renderer());
}

classificationComboBox->setCurrentItem(renderer->classificationField());
QgsContinuousColRenderer *renderer = dynamic_cast < QgsContinuousColRenderer * >(layer->renderer());;

if (renderer)
{
QgsRenderItem *minitem = renderer->minimumItem();
QgsRenderItem *maxitem = renderer->maximumItem();
classificationComboBox->setCurrentItem(renderer->classificationField());
QgsSymbol* minsymbol = renderer->minimumSymbol();
QgsSymbol* maxsymbol = renderer->maximumSymbol();
if (mVectorLayer->vectorType() == QGis::Line || mVectorLayer->vectorType() == QGis::Point)
{
lblMinValue->setPaletteBackgroundColor(minitem->getSymbol()->pen().color());
lblMaxValue->setPaletteBackgroundColor(maxitem->getSymbol()->pen().color());
lblMinValue->setPaletteBackgroundColor(minsymbol->pen().color());
lblMaxValue->setPaletteBackgroundColor(maxsymbol->pen().color());
}
else
{
lblMinValue->setPaletteBackgroundColor(minitem->getSymbol()->brush().color());
lblMaxValue->setPaletteBackgroundColor(maxitem->getSymbol()->brush().color());
lblMinValue->setPaletteBackgroundColor(minsymbol->brush().color());
lblMaxValue->setPaletteBackgroundColor(maxsymbol->brush().color());
}
outlinewidthspinbox->setValue(minitem->getSymbol()->pen().width());
outlinewidthspinbox->setValue(minsymbol->pen().width());
outlinewidthspinbox->setMinValue(1);
}
}
Expand Down Expand Up @@ -150,7 +140,7 @@ void QgsContColDialog::apply()


//create the render items for minimum and maximum value
QgsSymbol* minsymbol = new QgsSymbol();
QgsSymbol* minsymbol = new QgsSymbol(mVectorLayer->vectorType(), QString::number(minimum, 'f'), "", "");
if (mVectorLayer->vectorType() == QGis::Line || mVectorLayer->vectorType() == QGis::Point)
{
minsymbol->setPen(QPen(lblMinValue->paletteBackgroundColor(),outlinewidthspinbox->value()));
Expand All @@ -160,10 +150,8 @@ void QgsContColDialog::apply()
minsymbol->setBrush(QBrush(lblMinValue->paletteBackgroundColor()));
minsymbol->setPen(QPen(QColor(0, 0, 0), outlinewidthspinbox->value()));
}
QgsRenderItem *minimumitem = new QgsRenderItem(minsymbol, QString::number(minimum, 'f'), " ");


QgsSymbol* maxsymbol = new QgsSymbol();
QgsSymbol* maxsymbol = new QgsSymbol(mVectorLayer->vectorType(), QString::number(maximum, 'f'), "", "");
if (mVectorLayer->vectorType() == QGis::Line || mVectorLayer->vectorType() == QGis::Point)
{
maxsymbol->setPen(QPen(lblMaxValue->paletteBackgroundColor(),outlinewidthspinbox->value()));
Expand All @@ -173,94 +161,76 @@ void QgsContColDialog::apply()
maxsymbol->setBrush(QBrush(lblMaxValue->paletteBackgroundColor()));
maxsymbol->setPen(QPen(QColor(0, 0, 0), outlinewidthspinbox->value()));
}
QgsRenderItem *maximumitem = new QgsRenderItem(maxsymbol, QString::number(maximum, 'f'), " ");

//set the render items to the buffer renderer of the property dialog (if there is one)
QgsContinuousColRenderer *renderer;
if (mVectorLayer->propertiesDialog())
{
renderer = dynamic_cast < QgsContinuousColRenderer * >(mVectorLayer->propertiesDialog()->getBufferRenderer());
}
else
{
renderer = dynamic_cast < QgsContinuousColRenderer * >(mVectorLayer->renderer());
}
QgsContinuousColRenderer *renderer = dynamic_cast < QgsContinuousColRenderer * >(mVectorLayer->propertiesDialog()->getBufferRenderer());

if (renderer)
if(!renderer)
{
renderer->setMinimumItem(minimumitem);
renderer->setMaximumItem(maximumitem);
renderer->setClassificationField(classfield);
}
else
{
qWarning("Warning, typecast failed in QgsContColDialog::apply()");
return;
renderer = new QgsContinuousColRenderer(mVectorLayer->vectorType());
mVectorLayer->setRenderer(renderer);
}

renderer->setMinimumSymbol(minsymbol);
renderer->setMaximumSymbol(maxsymbol);
renderer->setClassificationField(classfield);

//add a pixmap to the legend item

//font tor the legend text
QFont f("arial", 10, QFont::Normal);
QFontMetrics fm(f);
//QFont f("arial", 10, QFont::Normal);
//QFontMetrics fm(f);

//spaces in pixel
int topspace = 5; //space between top of pixmap and first row
int leftspace = 10; //space between left side and text/graphics
int rightspace = 5; //space betwee text/graphics and right side
int bottomspace = 5; //space between last row and bottom of the pixmap
int gradientwidth = 40; //widht of the gradient
int gradientheight = 100; //height of the gradient
int wordspace = 10; //space between graphics/word
//int topspace = 5; //space between top of pixmap and first row
//int leftspace = 10; //space between left side and text/graphics
//int rightspace = 5; //space betwee text/graphics and right side
//int bottomspace = 5; //space between last row and bottom of the pixmap
//int gradientwidth = 40; //widht of the gradient
//int gradientheight = 100; //height of the gradient
//int wordspace = 10; //space between graphics/word

//add a pixmap to the QgsLegendItem
QPixmap *pix = mVectorLayer->legendPixmap();
//QPixmap *pix = mVectorLayer->legendPixmap();
//use the name and the maximum value to estimate the necessary width of the pixmap
QString name;
if (mVectorLayer->propertiesDialog())
{
name = mVectorLayer->propertiesDialog()->displayName();
}
else
{
name = "";
}
int namewidth = fm.width(name);
int numberlength = gradientwidth + wordspace + fm.width(QString::number(maximum, 'f', 2));
int pixwidth = (numberlength > namewidth) ? numberlength : namewidth;
pix->resize(leftspace + pixwidth + rightspace, topspace + 2 * fm.height() + gradientheight + bottomspace);
pix->fill();
QPainter p(pix);

p.setPen(QPen(QColor(0, 0, 0), 1));
p.setFont(f);
//QString name;
//if (mVectorLayer->propertiesDialog())
//{
// name = mVectorLayer->propertiesDialog()->displayName();
//}
//else
//{
//name = "";
//}
//int namewidth = fm.width(name);
//int numberlength = gradientwidth + wordspace + fm.width(QString::number(maximum, 'f', 2));
//int pixwidth = (numberlength > namewidth) ? numberlength : namewidth;
//pix->resize(leftspace + pixwidth + rightspace, topspace + 2 * fm.height() + gradientheight + bottomspace);
//pix->fill();
//QPainter p(pix);

//p.setPen(QPen(QColor(0, 0, 0), 1));
//p.setFont(f);
//draw the layer name and the name of the classification field into the pixmap
p.drawText(leftspace, topspace + fm.height(), name);
p.drawText(leftspace, topspace + fm.height() * 2, classificationComboBox->currentText());
//p.drawText(leftspace, topspace + fm.height(), name);
//p.drawText(leftspace, topspace + fm.height() * 2, classificationComboBox->currentText());

int rangeoffset = topspace + fm.height() * 2;
//int rangeoffset = topspace + fm.height() * 2;

//draw the color range line by line
for (int i = 0; i < gradientheight; i++)
{
p.setPen(QColor(lblMinValue->paletteBackgroundColor().red() + (lblMaxValue->paletteBackgroundColor().red() - lblMinValue->paletteBackgroundColor().red()) / gradientheight * i, lblMinValue->paletteBackgroundColor().green() + (lblMaxValue->paletteBackgroundColor().green() - lblMinValue->paletteBackgroundColor().green()) / gradientheight * i, lblMinValue->paletteBackgroundColor().blue() + (lblMaxValue->paletteBackgroundColor().blue() - lblMinValue->paletteBackgroundColor().blue()) / gradientheight * i)); //use the appropriate color
p.drawLine(leftspace, rangeoffset + i, leftspace + gradientwidth, rangeoffset + i);
}
//for (int i = 0; i < gradientheight; i++)
//{
//p.setPen(QColor(lblMinValue->paletteBackgroundColor().red() + (lblMaxValue->paletteBackgroundColor().red() - lblMinValue->paletteBackgroundColor().red()) / gradientheight * i, lblMinValue->paletteBackgroundColor().green() + (lblMaxValue->paletteBackgroundColor().green() - lblMinValue->paletteBackgroundColor().green()) / gradientheight * i, lblMinValue->paletteBackgroundColor().blue() + (lblMaxValue->paletteBackgroundColor().blue() - lblMinValue->paletteBackgroundColor().blue()) / gradientheight * i)); //use the appropriate color
//p.drawLine(leftspace, rangeoffset + i, leftspace + gradientwidth, rangeoffset + i);
//}

//draw the minimum and maximum values beside the color range
p.setPen(QPen(QColor(0, 0, 0)));
p.setFont(f);
p.drawText(leftspace + gradientwidth + wordspace, rangeoffset + fm.height(), QString::number(minimum, 'f', 2));
p.drawText(leftspace + gradientwidth + wordspace, rangeoffset + gradientheight, QString::number(maximum, 'f', 2));

mVectorLayer->updateItemPixmap();

if (mVectorLayer->propertiesDialog())
{
mVectorLayer->propertiesDialog()->setRendererDirty(false);
}
//p.setPen(QPen(QColor(0, 0, 0)));
//p.setFont(f);
//p.drawText(leftspace + gradientwidth + wordspace, rangeoffset + fm.height(), QString::number(minimum, 'f', 2));
//p.drawText(leftspace + gradientwidth + wordspace, rangeoffset + gradientheight, QString::number(maximum, 'f', 2));

mVectorLayer->triggerRepaint();
//mVectorLayer->updateItemPixmap();
}

void QgsContColDialog::selectMinimumColor()
Expand Down

0 comments on commit 5656eb3

Please sign in to comment.