[QGIS Commit] r9649 - in trunk/qgis/src: app core core/renderer ui
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Mon Nov 17 09:34:42 EST 2008
Author: jef
Date: 2008-11-17 09:34:42 -0500 (Mon, 17 Nov 2008)
New Revision: 9649
Modified:
trunk/qgis/src/app/qgslabeldialog.cpp
trunk/qgis/src/core/qgslabel.cpp
trunk/qgis/src/core/qgslabel.h
trunk/qgis/src/core/qgslabelattributes.cpp
trunk/qgis/src/core/qgslabelattributes.h
trunk/qgis/src/core/qgsmaprenderer.cpp
trunk/qgis/src/core/qgsrendercontext.h
trunk/qgis/src/core/qgsvectorlayer.cpp
trunk/qgis/src/core/renderer/qgsuniquevaluerenderer.cpp
trunk/qgis/src/ui/qgslabeldialogbase.ui
Log:
scale based label visibility and line oriented labels
Modified: trunk/qgis/src/app/qgslabeldialog.cpp
===================================================================
--- trunk/qgis/src/app/qgslabeldialog.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/app/qgslabeldialog.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -54,6 +54,7 @@
void QgsLabelDialog::init( )
{
QgsDebugMsg( "entering." );
+
QgsLabelAttributes * myLabelAttributes = mLabel->layerAttributes();
//populate a string list with all the field names which will be used to set up the
//data bound combos
@@ -133,6 +134,10 @@
cboAngleField->addItems( myFieldStringList );
cboAngleField->setCurrentIndex( itemNoForField( mLabel->labelField( QgsLabel::Angle ), myFieldStringList ) );
+ // set up the scale based layer visibility stuff....
+ chkUseScaleDependentRendering->setChecked( mLabel->scaleBasedVisibility() );
+ spinMinimumScale->setValue(( int )mLabel->minScale() );
+ spinMaximumScale->setValue(( int )mLabel->maxScale() );
//
//set the non-databound fields up now
@@ -197,7 +202,16 @@
spinXOffset->setValue( 0 );
spinYOffset->setValue( 0 );
}
- spinAngle->setValue( static_cast<int>( myLabelAttributes->angle() ) );
+ spinAngle->setRange( -1, 360 );
+ spinAngle->setSpecialValueText( tr("Auto") );
+ if( myLabelAttributes->angleIsAuto() )
+ {
+ spinAngle->setValue( -1 );
+ }
+ else
+ {
+ spinAngle->setValue( static_cast<int>( myLabelAttributes->angle() ) );
+ }
//the values here may seem a bit counterintuitive - basically everything
//is the reverse of the way you think it should be...
@@ -242,6 +256,7 @@
spinBufferSize->setValue( static_cast<int>( myLabelAttributes->bufferSize() ) );
//TODO - transparency attributes for buffers
+ listWidget->setItemSelected( listWidget->item(0), true);
}
@@ -335,8 +350,9 @@
myTypeInt = QgsLabelAttributes::MapUnits;
}
myLabelAttributes->setOffset( spinXOffset->value(), spinYOffset->value(), myTypeInt );
+ myLabelAttributes->setAutoAngle( spinAngle->value() == -1 );
myLabelAttributes->setAngle( spinAngle->value() );
-
+
//the values here may seem a bit counterintuitive - basically everything
//is the reverse of the way you think it should be...
//TODO investigate in QgsLabel why this needs to be the case
@@ -382,6 +398,10 @@
mLabel->setLabelField( QgsLabel::Alignment, fieldIndexFromName( cboAlignmentField->currentText() ) );
mLabel->setLabelField( QgsLabel::Angle, fieldIndexFromName( cboAngleField->currentText() ) );
+ // set up the scale based layer visibility stuff....
+ mLabel->setScaleBasedVisibility( chkUseScaleDependentRendering->isChecked() );
+ mLabel->setMinScale( spinMinimumScale->value() );
+ mLabel->setMaxScale( spinMaximumScale->value() );
}
int QgsLabelDialog::fieldIndexFromName( QString name )
Modified: trunk/qgis/src/core/qgslabel.cpp
===================================================================
--- trunk/qgis/src/core/qgslabel.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgslabel.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -47,6 +47,9 @@
"$Id$";
QgsLabel::QgsLabel( const QgsFieldMap & fields )
+: mMinScale(0 ),
+ mMaxScale(100000000),
+ mScaleBasedVisibility(false)
{
mField = fields;
mLabelFieldIdx.resize( LabelFieldCount );
@@ -358,13 +361,13 @@
}
else
{
- std::vector<QgsPoint> points;
+ std::vector<labelpoint> points;
labelPoint( points, feature );
for ( uint i = 0; i < points.size(); ++i )
{
- renderLabel( painter, points[i], coordinateTransform,
+ renderLabel( painter, points[i].p, coordinateTransform,
transform, text, font, pen, dx, dy,
- xoffset, yoffset, ang, width, height, alignment, sizeScale, rasterScaleFactor );
+ xoffset, yoffset, mLabelAttributes->angleIsAuto() ? points[i].angle : ang, width, height, alignment, sizeScale, rasterScaleFactor );
}
}
}
@@ -398,7 +401,7 @@
double x = point.x();
double y = point.y();
- static const double rad = ang * M_PI / 180;
+ double rad = ang * M_PI / 180;
x = x + xoffset * cos( rad ) - yoffset * sin( rad );
y = y - xoffset * sin( rad ) - yoffset * cos( rad );
@@ -512,13 +515,13 @@
return mLabelAttributes;
}
-void QgsLabel::labelPoint( std::vector<QgsPoint>& points, QgsFeature & feature )
+void QgsLabel::labelPoint( std::vector<labelpoint>& points, QgsFeature & feature )
{
QgsGeometry *geometry = feature.geometry();
unsigned char *geom = geometry->asWkb();
size_t geomlen = geometry->wkbSize();
QGis::WkbType wkbType = geometry->wkbType();
- QgsPoint point;
+ labelpoint point;
switch ( wkbType )
{
@@ -560,7 +563,7 @@
}
}
-unsigned char* QgsLabel::labelPoint( QgsPoint& point, unsigned char *geom, size_t geomlen )
+unsigned char* QgsLabel::labelPoint( labelpoint& point, unsigned char *geom, size_t geomlen )
{
// verify that local types match sizes as WKB spec
Q_ASSERT( sizeof( int ) == 4 );
@@ -592,7 +595,8 @@
{
Q_ASSERT( geom + 2*sizeof( double ) <= geomend );
double *pts = ( double * )geom;
- point.set( pts[0], pts[1] );
+ point.p.set( pts[0], pts[1] );
+ point.angle = 0.0;
geom += 2 * sizeof( double );
}
break;
@@ -630,8 +634,9 @@
{
double k = ( tl - l ) / dl;
- point.set( pts[dims*( i-1 )] + k * dx,
- pts[dims*( i-1 )+1] + k * dy );
+ point.p.set( pts[dims*( i-1 )] + k * dx,
+ pts[dims*( i-1 )+1] + k * dy );
+ point.angle = atan2(dy,dx)*180.0*M_1_PI;
break;
}
@@ -667,8 +672,9 @@
sx += pts[dims*j];
sy += pts[dims*j+1];
}
- point.set( sx / ( nPoints - 1 ),
- sy / ( nPoints - 1 ) );
+ point.p.set( sx / ( nPoints - 1 ),
+ sy / ( nPoints - 1 ) );
+ point.angle = 0.0;
}
geom += nPoints * sizeof( double ) * dims;
@@ -879,6 +885,7 @@
el = scratchNode.toElement();
mLabelAttributes->setAngle( el.attribute( "value", "0.0" ).toDouble() );
setLabelField( Angle, _elementFieldIndex( el ) );
+ mLabelAttributes->setAutoAngle( el.attribute( "auto", "0" )=="1" );
}
/* Alignment */
@@ -962,298 +969,351 @@
-void QgsLabel::writeXML( std::ostream& xml )
+void QgsLabel::writeXML( QDomNode & layer_node,
+ QDomDocument & document )
{
+ QDomElement labelattributes = document.createElement( "labelattributes" );
- xml << "\t\t<labelattributes>\n";
-
// Text
- if ( mLabelAttributes->textIsSet() )
+ QDomElement label = document.createElement( "label" );
+ label.setAttribute("text", mLabelAttributes->text() );
+ if ( mLabelAttributes->textIsSet() && mLabelFieldIdx[Text] != -1 )
{
- if ( mLabelFieldIdx[Text] != -1 )
- {
- xml << "\t\t\t<label text=\"" << mLabelAttributes->text().toUtf8().constData()
- << "\" field=\"" << mLabelFieldIdx[Text] << "\" />\n";
- }
- else
- {
- xml << "\t\t\t<label text=\"" << mLabelAttributes->text().toUtf8().constData()
- << "\" field=\"\" />\n";
- }
+ label.setAttribute("field", mLabelFieldIdx[Text] );
}
else
{
- xml << "\t\t\t<label text=\"" << mLabelAttributes->text().toUtf8().constData()
- << "\" field=\"\" />\n";
+ label.setAttribute("field", "" );
}
+ labelattributes.appendChild(label);
// Family
+ QDomElement family = document.createElement( "family" );
if ( mLabelAttributes->familyIsSet() && !mLabelAttributes->family().isNull() )
{
if ( mLabelFieldIdx[Family] != -1 )
{
- xml << "\t\t\t<family name=\"" << mLabelAttributes->family().toUtf8().constData()
- << "\" field=\"" << mLabelFieldIdx[Family] << "\" />\n";
+ family.setAttribute("name", mLabelAttributes->family() );
+ family.setAttribute("field", mLabelFieldIdx[Family] );
}
else
{
- xml << "\t\t\t<family name=\"" << mLabelAttributes->family().toUtf8().constData()
- << "\" field=\"\" />\n";
+ family.setAttribute("name", mLabelAttributes->family() );
+ family.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<family name=\"Arial\" field=\"\" />\n";
+ family.setAttribute("name", "Arial");
+ family.setAttribute("field", "");
}
+ labelattributes.appendChild(family);
// size and units
+ QDomElement size = document.createElement( "size" );
+ size.setAttribute("value", mLabelAttributes->size());
if ( mLabelAttributes->sizeIsSet() )
{
if ( mLabelFieldIdx[Size] != -1 )
{
if ( mLabelFieldIdx[SizeType] != -1 )
{
- xml << "\t\t\t<size value=\"" << mLabelAttributes->size()
- << "\" unitfield=\"" << mLabelFieldIdx[SizeType]
- << "\" field=\"" << mLabelFieldIdx[Size] << "\" />\n";
+ size.setAttribute("unitfield", mLabelFieldIdx[SizeType] );
}
else
{
- xml << "\t\t\t<size value=\"" << mLabelAttributes->size()
- << "\" units=\"" << QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ).toUtf8().constData()
- << "\" field=\"" << mLabelFieldIdx[Size] << "\" />\n";
+ size.setAttribute("units", QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ) );
}
+ size.setAttribute("field", mLabelFieldIdx[Size] );
}
else
{
- xml << "\t\t\t<size value=\"" << mLabelAttributes->size()
- << "\" units=\"" << QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ).toUtf8().constData()
- << "\" field=\"\" />\n";
+ size.setAttribute("units", QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ) );
+ size.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<size value=\"12\" units=\"Points\" field=\"\" />\n";
+ size.setAttribute("value", "12");
+ size.setAttribute("units", "Points");
+ size.setAttribute("field", "");
}
+ labelattributes.appendChild(size);
-
// bold
+ QDomElement bold = document.createElement("bold");
if ( mLabelAttributes->boldIsSet() )
{
+ bold.setAttribute( "on", mLabelAttributes->bold() );
if ( mLabelFieldIdx[Bold] != -1 )
{
- xml << "\t\t\t<bold on=\"" << mLabelAttributes->bold()
- << "\" field=\"" << mLabelFieldIdx[Bold] << "\" />\n";
+ bold.setAttribute( "field", mLabelFieldIdx[Bold] );
}
else
{
- xml << "\t\t\t<bold on=\"" << mLabelAttributes->bold()
- << "\" field=\"\" />\n";
+ bold.setAttribute( "field", "" );
}
}
else
{
- xml << "\t\t\t<bold on=\"0\" field=\"0\" />\n";
+ bold.setAttribute("on", 0);
+ bold.setAttribute("field", 0);
}
+ labelattributes.appendChild(bold);
// italics
+ QDomElement italic = document.createElement("italic");
if ( mLabelAttributes->italicIsSet() )
{
+ italic.setAttribute("on", mLabelAttributes->italic());
if ( mLabelFieldIdx[Italic] != -1 )
{
- xml << "\t\t\t<italic on=\"" << mLabelAttributes->italic()
- << "\" field=\"" << mLabelFieldIdx[Italic] << "\" />\n";
+ italic.setAttribute("field", mLabelFieldIdx[Italic]);
}
else
{
- xml << "\t\t\t<italic on=\"" << mLabelAttributes->italic()
- << "\" field=\"\" />\n";
+ italic.setAttribute("field", "");
}
}
else
{
- xml << "\t\t\t<italic on=\"0\" field=\"\" />\n";
+ italic.setAttribute("on", "0");
+ italic.setAttribute("field", "");
}
+ labelattributes.appendChild(italic);
// underline
+ QDomElement underline = document.createElement("underline");
if ( mLabelAttributes->underlineIsSet() )
{
+ underline.setAttribute("on", mLabelAttributes->underline());
if ( mLabelFieldIdx[Underline] != -1 )
{
- xml << "\t\t\t<underline on=\"" << mLabelAttributes->underline()
- << "\" field=\"" << mLabelFieldIdx[Underline] << "\" />\n";
+ underline.setAttribute("field", mLabelFieldIdx[Underline] );
}
else
{
- xml << "\t\t\t<underline on=\"" << mLabelAttributes->underline()
- << "\" field=\"\" />\n";
+ underline.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<underline on=\"0\" field=\"\" />\n";
+ underline.setAttribute("on", 0 );
+ underline.setAttribute("field", "" );
}
+ labelattributes.appendChild(underline);
// color
+ QDomElement color = document.createElement("color");
if ( mLabelAttributes->colorIsSet() )
{
+ color.setAttribute("red", mLabelAttributes->color().red());
+ color.setAttribute("green", mLabelAttributes->color().green());
+ color.setAttribute("blue", mLabelAttributes->color().blue());
if ( mLabelFieldIdx[Color] != -1 )
{
- xml << "\t\t\t<color red=\"" << mLabelAttributes->color().red()
- << "\" green=\"" << mLabelAttributes->color().green()
- << "\" blue=\"" << mLabelAttributes->color().blue()
- << "\" field=\"" << mLabelFieldIdx[Color] << "\" />\n";
+ color.setAttribute("field", mLabelFieldIdx[Color]);
}
else
{
- xml << "\t\t\t<color red=\"" << mLabelAttributes->color().red()
- << "\" green=\"" << mLabelAttributes->color().green()
- << "\" blue=\"" << mLabelAttributes->color().blue()
- << "\" field=\"\" />\n";
+ color.setAttribute("field", "");
}
}
else
{
- xml << "\t\t\t<color red=\"0\" green=\"0\" blue=\"0\" field=\"\" />\n";
+ color.setAttribute("red", 0);
+ color.setAttribute("green", 0);
+ color.setAttribute("blue", 0);
+ color.setAttribute("field", "");
}
+ labelattributes.appendChild(color);
-
/* X */
+ QDomElement x = document.createElement("x");
if ( mLabelFieldIdx[XCoordinate] != -1 )
{
- xml << "\t\t\t<x field=\"" << mLabelFieldIdx[XCoordinate] << "\" />\n";
+ x.setAttribute("field", mLabelFieldIdx[XCoordinate] );
}
else
{
- xml << "\t\t\t<x field=\"\" />\n";
+ x.setAttribute("field", "" );
}
+ labelattributes.appendChild(x);
/* Y */
+ QDomElement y = document.createElement("y");
if ( mLabelFieldIdx[YCoordinate] != -1 )
{
- xml << "\t\t\t<y field=\"" << mLabelFieldIdx[YCoordinate] << "\" />\n";
+ y.setAttribute("field", mLabelFieldIdx[YCoordinate] );
}
else
{
- xml << "\t\t\t<y field=\"\" />\n";
+ y.setAttribute("field", "" );
}
+ labelattributes.appendChild(y);
// offset
if ( mLabelAttributes->offsetIsSet() )
{
- xml << "\t\t\t<offset units=\"" << QgsLabelAttributes::unitsName( mLabelAttributes->offsetType() ).toUtf8().constData()
- << "\" x=\"" << mLabelAttributes->xOffset() << "\" xfield=\"" << mLabelFieldIdx[XOffset]
- << "\" y=\"" << mLabelAttributes->yOffset() << "\" yfield=\"" << mLabelFieldIdx[YOffset]
- << "\" />\n";
+ QDomElement offset = document.createElement("offset");
+ offset.setAttribute("units", QgsLabelAttributes::unitsName( mLabelAttributes->offsetType() ) );
+ offset.setAttribute("x", mLabelAttributes->xOffset() );
+ offset.setAttribute("xfield", mLabelFieldIdx[XOffset] );
+ offset.setAttribute("y", mLabelAttributes->yOffset());
+ offset.setAttribute("yfield", mLabelFieldIdx[YOffset]);
+ labelattributes.appendChild(offset);
}
// Angle
+ QDomElement angle = document.createElement("angle");
if ( mLabelAttributes->angleIsSet() )
{
+ angle.setAttribute("value", mLabelAttributes->angle() );
if ( mLabelFieldIdx[Angle] != -1 )
{
- xml << "\t\t\t<angle value=\"" << mLabelAttributes->angle()
- << "\" field=\"" << mLabelFieldIdx[Angle] << "\" />\n";
+ angle.setAttribute("field", mLabelFieldIdx[Angle] );
}
else
{
- xml << "\t\t\t<angle value=\"" << mLabelAttributes->angle() << "\" field=\"\" />\n";
+ angle.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<angle value=\"\" field=\"\" />\n";
+ angle.setAttribute("value", "" );
+ angle.setAttribute("field", "" );
}
+ angle.setAttribute("auto", mLabelAttributes->angleIsAuto() ? "1" : "0");
+ labelattributes.appendChild(angle);
// alignment
if ( mLabelAttributes->alignmentIsSet() )
{
- xml << "\t\t\t<alignment value=\"" << QgsLabelAttributes::alignmentName( mLabelAttributes->alignment() ).toUtf8().constData()
- << "\" field=\"" << mLabelFieldIdx[Alignment] << "\" />\n";
+ QDomElement alignment = document.createElement("alignment");
+ alignment.setAttribute("value", QgsLabelAttributes::alignmentName( mLabelAttributes->alignment() ) );
+ alignment.setAttribute("field", mLabelFieldIdx[Alignment] );
+ labelattributes.appendChild(alignment);
}
// buffer color
+ QDomElement buffercolor = document.createElement("buffercolor");
if ( mLabelAttributes->bufferColorIsSet() )
{
+ buffercolor.setAttribute("red", mLabelAttributes->bufferColor().red());
+ buffercolor.setAttribute("green", mLabelAttributes->bufferColor().green());
+ buffercolor.setAttribute("blue", mLabelAttributes->bufferColor().blue());
if ( mLabelFieldIdx[BufferColor] != -1 )
{
- xml << "\t\t\t<buffercolor red=\"" << mLabelAttributes->bufferColor().red()
- << "\" green=\"" << mLabelAttributes->bufferColor().green()
- << "\" blue=\"" << mLabelAttributes->bufferColor().blue()
- << "\" field=\"" << mLabelFieldIdx[BufferColor] << "\" />\n";
+ buffercolor.setAttribute("field", mLabelFieldIdx[BufferColor] );
}
else
{
- xml << "\t\t\t<buffercolor red=\"" << mLabelAttributes->bufferColor().red()
- << "\" green=\"" << mLabelAttributes->bufferColor().green()
- << "\" blue=\"" << mLabelAttributes->bufferColor().blue()
- << "\" field=\"\" />\n";
+ buffercolor.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<buffercolor red=\"\" green=\"\" blue=\"\" field=\"\" />\n";
+ buffercolor.setAttribute("red", "" );
+ buffercolor.setAttribute("green", "" );
+ buffercolor.setAttribute("blue", "" );
+ buffercolor.setAttribute("field", "" );
}
+ labelattributes.appendChild(buffercolor);
// buffer size
+ QDomElement buffersize = document.createElement("buffersize");
if ( mLabelAttributes->bufferSizeIsSet() )
{
+ buffersize.setAttribute("value", mLabelAttributes->bufferSize() );
+ buffersize.setAttribute("units", QgsLabelAttributes::unitsName( mLabelAttributes->bufferSizeType() ) );
if ( mLabelFieldIdx[BufferSize] != -1 )
{
- xml << "\t\t\t<buffersize value=\"" << mLabelAttributes->bufferSize()
- << "\" units=\"" << QgsLabelAttributes::unitsName( mLabelAttributes->bufferSizeType() ).toUtf8().constData()
- << "\" field=\"" << mLabelFieldIdx[BufferSize] << "\" />\n";
+ buffersize.setAttribute("field", mLabelFieldIdx[BufferSize] );
}
else
{
- xml << "\t\t\t<buffersize value=\"" << mLabelAttributes->bufferSize()
- << "\" units=\"" << QgsLabelAttributes::unitsName( mLabelAttributes->bufferSizeType() ).toUtf8().constData()
- << "\" field=\"\" />\n";
+ buffersize.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<buffersize value=\"\" units=\"\" field=\"\" />\n";
+ buffersize.setAttribute("value", "");
+ buffersize.setAttribute("units", "");
+ buffersize.setAttribute("field", "");
}
+ labelattributes.appendChild(buffersize);
// buffer enabled
+ QDomElement bufferenabled = document.createElement("bufferenabled");
if ( mLabelAttributes->bufferEnabled() )
{
+ bufferenabled.setAttribute("on", mLabelAttributes->bufferEnabled());
if ( mLabelFieldIdx[BufferEnabled] != -1 )
{
- xml << "\t\t\t<bufferenabled on=\"" << mLabelAttributes->bufferEnabled()
- << "\" field=\"" << mLabelFieldIdx[BufferEnabled] << "\" />\n";
+ bufferenabled.setAttribute("field", mLabelFieldIdx[BufferEnabled] );
}
else
{
- xml << "\t\t\t<bufferenabled on=\"" << mLabelAttributes->bufferEnabled()
- << "\" field=\"\" />\n";
+ bufferenabled.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<bufferenabled on=\"" << "\" field=\"" << "\" />\n";
+ bufferenabled.setAttribute("on", "" );
+ bufferenabled.setAttribute("field", "" );
}
+ labelattributes.appendChild( bufferenabled );
// multiline enabled
+ QDomElement multilineenabled = document.createElement("multilineenabled");
if ( mLabelAttributes->multilineEnabled() )
{
+ multilineenabled.setAttribute("on", mLabelAttributes->multilineEnabled());
if ( mLabelFieldIdx[MultilineEnabled] != -1 )
{
- xml << "\t\t\t<multilineenabled on=\"" << mLabelAttributes->multilineEnabled()
- << "\" field=\"" << mLabelFieldIdx[MultilineEnabled] << "\" />\n";
+ multilineenabled.setAttribute("field", mLabelFieldIdx[MultilineEnabled] );
}
else
{
- xml << "\t\t\t<multilineenabled on=\"" << mLabelAttributes->multilineEnabled()
- << "\" field=\"\" />\n";
+ multilineenabled.setAttribute("field", "" );
}
}
else
{
- xml << "\t\t\t<multilineenabled on=\"" << "\" field=\"" << "\" />\n";
+ multilineenabled.setAttribute("on", "" );
+ multilineenabled.setAttribute("field", "" );
}
+ labelattributes.appendChild(multilineenabled);
- xml << "\t\t</labelattributes>\n";
+ layer_node.appendChild(labelattributes);
}
+void QgsLabel::setScaleBasedVisibility( bool theVisibilityFlag )
+{
+ mScaleBasedVisibility = theVisibilityFlag;
+}
+
+bool QgsLabel::scaleBasedVisibility()
+{
+ return mScaleBasedVisibility;
+}
+
+void QgsLabel::setMinScale( float theMinScale )
+{
+ mMinScale = theMinScale;
+}
+
+float QgsLabel::minScale()
+{
+ return mMinScale;
+}
+
+void QgsLabel::setMaxScale( float theMaxScale )
+{
+ mMaxScale = theMaxScale;
+}
+
+float QgsLabel::maxScale()
+{
+ return mMaxScale;
+}
Modified: trunk/qgis/src/core/qgslabel.h
===================================================================
--- trunk/qgis/src/core/qgslabel.h 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgslabel.h 2008-11-17 14:34:42 UTC (rev 9649)
@@ -23,12 +23,14 @@
#include <QList>
#include <QMap>
+#include "qgspoint.h"
+
class QDomNode;
+class QDomDocument;
class QString;
class QPainter;
class QPaintDevice;
-class QgsPoint;
class QgsFeature;
class QgsField;
class QgsLabelAttributes;
@@ -82,6 +84,11 @@
LabelFieldCount
};
+ struct labelpoint {
+ QgsPoint p;
+ double angle;
+ };
+
/** \brief render label
* \param sizeScale global scale factor for size in pixels, labels in map units are not scaled
*/
@@ -96,7 +103,7 @@
void readXML( const QDomNode& node );
/** Writes the contents of the renderer to a configuration file */
- void writeXML( std::ostream& xml );
+ void writeXML( QDomNode & label_node, QDomDocument & document );
//! add vector of required fields to existing list of fields
void addRequiredFields( QgsAttributeList& fields );
@@ -123,6 +130,18 @@
*/
QString fieldValue( int attr, QgsFeature& feature );
+ /** Accessor and mutator for the minimum scale member */
+ void setMinScale( float theMinScale );
+ float minScale();
+
+ /** Accessor and mutator for the maximum scale member */
+ void setMaxScale( float theMaxScale );
+ float maxScale();
+
+ /** Accessor and mutator for the scale based visilibility flag */
+ void setScaleBasedVisibility( bool theVisibilityFlag );
+ bool scaleBasedVisibility();
+
private:
/** Does the actual rendering of a label at the given point
*
@@ -137,10 +156,10 @@
int width, int height, int alignment, double sizeScale = 1.0, double rasterScaleFactor = 1.0 );
/** Get label point for simple feature in map units */
- void labelPoint( std::vector<QgsPoint>&, QgsFeature &feature );
+ void labelPoint( std::vector<labelpoint>&, QgsFeature &feature );
/** Get label point for the given feature in wkb format. */
- unsigned char* labelPoint( QgsPoint& point, unsigned char* wkb, size_t wkblen );
+ unsigned char* labelPoint( labelpoint& point, unsigned char* wkb, size_t wkblen );
/** Color to draw selected features */
QColor mSelectionColor;
@@ -156,6 +175,13 @@
//! Label field indexes
std::vector<int> mLabelFieldIdx;
+
+ /** Minimum scale at which this label should be displayed */
+ float mMinScale;
+ /** Maximum scale at which this label should be displayed */
+ float mMaxScale;
+ /** A flag that tells us whether to use the above vars to restrict the label's visibility */
+ bool mScaleBasedVisibility;
};
#endif
Modified: trunk/qgis/src/core/qgslabelattributes.cpp
===================================================================
--- trunk/qgis/src/core/qgslabelattributes.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgslabelattributes.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -41,6 +41,7 @@
mOffsetIsSet( false ),
mAngle( 0.0 ),
mAngleIsSet( false ),
+ mAngleIsAuto( false ),
mAlignment( 0 ),
mAlignmentIsSet( false ),
mBufferEnabledFlag( false ),
@@ -69,6 +70,7 @@
setOffset( 0, 0, PointUnits );
setAngle( 0 );
+ setAutoAngle(false);
setAlignment( Qt::AlignCenter );
setColor( QColor( 0, 0, 0 ) );
@@ -150,6 +152,16 @@
return mAngle;
}
+bool QgsLabelAttributes::angleIsAuto() const
+{
+ return mAngleIsAuto;
+}
+
+void QgsLabelAttributes::setAutoAngle ( bool state )
+{
+ mAngleIsAuto = state;
+}
+
/* Alignment */
void QgsLabelAttributes::setAlignment( int alignment )
{
Modified: trunk/qgis/src/core/qgslabelattributes.h
===================================================================
--- trunk/qgis/src/core/qgslabelattributes.h 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgslabelattributes.h 2008-11-17 14:34:42 UTC (rev 9649)
@@ -140,6 +140,9 @@
bool angleIsSet( void ) const;
double angle( void ) const;
+ bool angleIsAuto( void ) const;
+ void setAutoAngle(bool state);
+
/* Alignment */
void setAlignment( int alignment );
bool alignmentIsSet( void ) const;
@@ -207,6 +210,7 @@
/** Angle (degrees) */
double mAngle;
bool mAngleIsSet;
+ bool mAngleIsAuto;
/** Alignment */
int mAlignment;
Modified: trunk/qgis/src/core/qgsmaprenderer.cpp
===================================================================
--- trunk/qgis/src/core/qgsmaprenderer.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgsmaprenderer.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -69,7 +69,6 @@
void QgsMapRenderer::updateScale()
{
-
mScale = mScaleCalculator->calculate( mExtent, mSize.width() );
}
@@ -248,6 +247,7 @@
double rasterScaleFactor = ( thePaintDevice->logicalDpiX() + thePaintDevice->logicalDpiY() ) / 2.0 / sceneDpi;
mRenderContext.setScaleFactor( scaleFactor );
mRenderContext.setRasterScaleFactor( rasterScaleFactor );
+ mRenderContext.setRendererScale( mScale );
// render all layers in the stack, starting at the base
QListIterator<QString> li( mLayerSet );
@@ -289,8 +289,7 @@
QgsDebugMsg( " Scale dep. visibility enabled? " + QString( "%1" ).arg( ml->hasScaleBasedVisibility() ) );
QgsDebugMsg( " Input extent: " + ml->extent().toString() );
- if (( ml->hasScaleBasedVisibility() && ml->minimumScale() < mScale && ml->maximumScale() > mScale )
- || ( !ml->hasScaleBasedVisibility() ) )
+ if ( !ml->hasScaleBasedVisibility() || (ml->minimumScale() < mScale && mScale < ml->maximumScale() ) )
{
connect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
@@ -390,8 +389,7 @@
{
// only make labels if the layer is visible
// after scale dep viewing settings are checked
- if (( ml->hasScaleBasedVisibility() && ml->minimumScale() < mScale && ml->maximumScale() > mScale )
- || ( !ml->hasScaleBasedVisibility() ) )
+ if ( !ml->hasScaleBasedVisibility() || (ml->minimumScale() < mScale && mScale < ml->maximumScale() ))
{
bool split = false;
Modified: trunk/qgis/src/core/qgsrendercontext.h
===================================================================
--- trunk/qgis/src/core/qgsrendercontext.h 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgsrendercontext.h 2008-11-17 14:34:42 UTC (rev 9649)
@@ -56,6 +56,8 @@
bool drawEditingInformation() const {return mDrawEditingInformation;}
+ double rendererScale() const {return mRendererScale;}
+
//setters
/**Sets coordinate transformation. QgsRenderContext takes ownership and deletes if necessary*/
@@ -66,6 +68,7 @@
void setRenderingStopped( bool stopped ) {mRenderingStopped = stopped;}
void setScaleFactor( double factor ) {mScaleFactor = factor;}
void setRasterScaleFactor( double factor ) {mRasterScaleFactor = factor;}
+ void setRendererScale( double scale ) {mRendererScale = scale;}
void setPainter( QPainter* p ) {mPainter = p;}
private:
@@ -94,6 +97,9 @@
/**Factor to scale rasters*/
double mRasterScaleFactor;
+
+ /** renderer scale */
+ double mRendererScale;
};
#endif
Modified: trunk/qgis/src/core/qgsvectorlayer.cpp
===================================================================
--- trunk/qgis/src/core/qgsvectorlayer.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/qgsvectorlayer.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -286,7 +286,10 @@
{
QgsDebugMsg( "Starting draw of labels" );
- if ( mRenderer && mLabelOn )
+ if ( mRenderer && mLabelOn &&
+ (!label()->scaleBasedVisibility() ||
+ (label()->minScale()<=rendererContext.rendererScale() &&
+ rendererContext.rendererScale()<=label()->maxScale())) )
{
QgsAttributeList attributes = mRenderer->classificationAttributes();
@@ -1967,8 +1970,6 @@
return mLabelOn;
}
-
-
bool QgsVectorLayer::startEditing()
{
if ( !mDataProvider )
@@ -2057,6 +2058,12 @@
setDisplayField( e.text() );
}
+ // use scale dependent visibility flag
+ QDomElement e = layer_node.toElement();
+ label()->setScaleBasedVisibility( e.attribute( "scaleBasedLabelVisibilityFlag", "0") == "1" );
+ label()->setMinScale( e.attribute( "minLabelScale", "1" ).toFloat() );
+ label()->setMaxScale( e.attribute( "maxLabelScale", "100000000" ).toFloat() );
+
QDomNode editTypesNode = layer_node.namedItem( "edittypes" );
if ( !editTypesNode.isNull() )
{
@@ -2224,7 +2231,7 @@
if ( mapLayerNode.isNull() || ( "maplayer" != mapLayerNode.nodeName() ) )
{
- qDebug( "QgsVectorLayer::writeXML() can't find <maplayer>" );
+ QgsDebugMsg( "can't find <maplayer>" );
return false;
}
@@ -2233,6 +2240,11 @@
// set the geometry type
mapLayerNode.setAttribute( "geometry", QGis::qgisVectorGeometryType[type()] );
+ // use scale dependent visibility flag
+ mapLayerNode.setAttribute( "scaleBasedLabelVisibilityFlag", label()->scaleBasedVisibility() ? 1 : 0 );
+ mapLayerNode.setAttribute( "minLabelScale", label()->minScale() );
+ mapLayerNode.setAttribute( "maxLabelScale", label()->maxScale() );
+
// add provider node
QDomElement provider = document.createElement( "provider" );
@@ -2353,54 +2365,7 @@
layer_node.appendChild( dField );
}
- std::stringstream labelXML;
-
- myLabel->writeXML( labelXML );
-
- QDomDocument labelDom;
-
- std::string rawXML;
- std::string temp_str;
- QString errorMsg;
- int errorLine;
- int errorColumn;
-
- // start with bogus XML header
- rawXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
-
- temp_str = labelXML.str();
-
- rawXML += temp_str;
-
-#ifdef QGISDEBUG
- std::cout << rawXML << std::endl << std::flush; // OK
-
-#endif
- const char * s = rawXML.c_str(); // debugger probe
- // Use the const char * form of the xml to make non-stl qt happy
- if ( ! labelDom.setContent( QString::fromUtf8( s ), &errorMsg, &errorLine, &errorColumn ) )
- {
- qDebug(( "XML import error at line %d column %d " + errorMsg ).toLocal8Bit().data(), errorLine, errorColumn );
-
- return false;
- }
-
- // lastChild() because the first two nodes are the <xml> and
- // <!DOCTYPE> nodes; the label node follows that, and is (hopefully)
- // the last node.
- QDomNode labelDomNode = document.importNode( labelDom.lastChild(), true );
-
- if ( ! labelDomNode.isNull() )
- {
- layer_node.appendChild( labelDomNode );
- }
- else
- {
- qDebug( "not able to import label Dom node" );
-
- // XXX return false?
- }
-
+ myLabel->writeXML( layer_node, document );
}
return true;
@@ -3533,3 +3498,4 @@
return mRanges[ fields[idx].name()];
}
+
Modified: trunk/qgis/src/core/renderer/qgsuniquevaluerenderer.cpp
===================================================================
--- trunk/qgis/src/core/renderer/qgsuniquevaluerenderer.cpp 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/core/renderer/qgsuniquevaluerenderer.cpp 2008-11-17 14:34:42 UTC (rev 9649)
@@ -132,13 +132,11 @@
//first find out the value for the scale classification attribute
const QgsAttributeMap& attrs = f.attributeMap();
fieldScale = sqrt( fabs( attrs[symbol->scaleClassificationField()].toDouble() ) );
- QgsDebugMsg( QString( "Feature has field scale factor %1" ).arg( fieldScale ) );
}
if ( symbol->rotationClassificationField() >= 0 )
{
const QgsAttributeMap& attrs = f.attributeMap();
rotation = attrs[symbol->rotationClassificationField()].toDouble();
- QgsDebugMsg( QString( "Feature has rotation factor %1" ).arg( rotation ) );
}
*img = symbol->getPointSymbolAsImage( widthScale, selected, mSelectionColor,
fieldScale, rotation, rasterScaleFactor );
Modified: trunk/qgis/src/ui/qgslabeldialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgslabeldialogbase.ui 2008-11-17 12:53:04 UTC (rev 9648)
+++ trunk/qgis/src/ui/qgslabeldialogbase.ui 2008-11-17 14:34:42 UTC (rev 9649)
@@ -6,7 +6,7 @@
<x>0</x>
<y>0</y>
<width>516</width>
- <height>447</height>
+ <height>487</height>
</rect>
</property>
<property name="sizePolicy" >
@@ -19,18 +19,9 @@
<string>Form1</string>
</property>
<layout class="QGridLayout" >
- <property name="leftMargin" >
+ <property name="margin" >
<number>0</number>
</property>
- <property name="topMargin" >
- <number>0</number>
- </property>
- <property name="rightMargin" >
- <number>0</number>
- </property>
- <property name="bottomMargin" >
- <number>0</number>
- </property>
<item row="0" column="0" colspan="2" >
<layout class="QHBoxLayout" >
<item>
@@ -91,7 +82,7 @@
</property>
<item>
<property name="text" >
- <string>Font</string>
+ <string>General</string>
</property>
</item>
<item>
@@ -135,9 +126,17 @@
</sizepolicy>
</property>
<property name="currentIndex" >
- <number>1</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="page" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>309</width>
+ <height>394</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<layout class="QGridLayout" >
@@ -236,18 +235,9 @@
<string>Placement</string>
</property>
<layout class="QGridLayout" >
- <property name="leftMargin" >
+ <property name="margin" >
<number>11</number>
</property>
- <property name="topMargin" >
- <number>11</number>
- </property>
- <property name="rightMargin" >
- <number>11</number>
- </property>
- <property name="bottomMargin" >
- <number>11</number>
- </property>
<item row="2" column="2" >
<widget class="QRadioButton" name="radioBelowRight" >
<property name="text" >
@@ -345,7 +335,7 @@
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeHint" >
+ <property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>40</height>
@@ -353,9 +343,88 @@
</property>
</spacer>
</item>
+ <item row="4" column="0" >
+ <widget class="QGroupBox" name="chkUseScaleDependentRendering" >
+ <property name="title" >
+ <string>Use scale dependent rendering</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="textLabel1_2_2_1" >
+ <property name="text" >
+ <string>Maximum</string>
+ </property>
+ <property name="buddy" >
+ <cstring>spinMaximumScale</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel1_1" >
+ <property name="text" >
+ <string>Minimum</string>
+ </property>
+ <property name="buddy" >
+ <cstring>spinMinimumScale</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="spinMinimumScale" >
+ <property name="toolTip" >
+ <string>Minimum scale at which this layer will be displayed. </string>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>100000000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="spinMaximumScale" >
+ <property name="toolTip" >
+ <string>Maximum scale at which this layer will be displayed. </string>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>100000000</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QCheckBox" name="chkUseMultiline" >
+ <property name="text" >
+ <string>Multiline labels?</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="page_2" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>309</width>
+ <height>394</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QCheckBox" name="chkUseBuffer" >
@@ -449,21 +518,11 @@
</widget>
</item>
<item row="5" column="0" >
- <widget class="QCheckBox" name="chkUseMultiline" >
- <property name="text" >
- <string>Multiline labels?</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="6" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeHint" >
+ <property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>40</height>
@@ -474,6 +533,14 @@
</layout>
</widget>
<widget class="QWidget" name="page_3" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="textLabel1_2_3_2" >
@@ -531,7 +598,7 @@
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeHint" >
+ <property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>181</height>
@@ -542,6 +609,14 @@
</layout>
</widget>
<widget class="QWidget" name="page_4" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="lblFont" >
@@ -728,6 +803,14 @@
</layout>
</widget>
<widget class="QWidget" name="page_5" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="textLabel1_2_2_2_2_3" >
@@ -764,6 +847,14 @@
</layout>
</widget>
<widget class="QWidget" name="page_6" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="textLabel1_3_2_2_2" >
@@ -819,6 +910,14 @@
</layout>
</widget>
<widget class="QWidget" name="page_7" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="textLabel1_2" >
@@ -900,18 +999,9 @@
<string>Preview:</string>
</property>
<layout class="QGridLayout" >
- <property name="leftMargin" >
+ <property name="margin" >
<number>11</number>
</property>
- <property name="topMargin" >
- <number>11</number>
- </property>
- <property name="rightMargin" >
- <number>11</number>
- </property>
- <property name="bottomMargin" >
- <number>11</number>
- </property>
<item row="0" column="0" >
<widget class="QLabel" name="lblSample" >
<property name="text" >
More information about the QGIS-commit
mailing list