[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