mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
add support for multiline labels (applies #1138)
git-svn-id: http://svn.osgeo.org/qgis/trunk@8775 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
parent
3c13ecf648
commit
b5948bde31
@ -37,6 +37,7 @@ public:
|
||||
BorderWidth,
|
||||
BorderColor,
|
||||
BorderStyle,
|
||||
MultilineEnabled,
|
||||
LabelFieldCount
|
||||
};
|
||||
|
||||
|
@ -102,5 +102,7 @@ public:
|
||||
bool borderStyleIsSet ( ) const;
|
||||
Qt::PenStyle borderStyle ( ) const;
|
||||
|
||||
bool multilineEnabled() const;
|
||||
void setMultilineEnabled( bool useMultiline );
|
||||
};
|
||||
|
||||
|
@ -239,6 +239,8 @@ void QgsLabelDialog::init ( )
|
||||
{
|
||||
spinBufferSize->setValue(1);
|
||||
}
|
||||
//set the state of the multiline enabled checkbox
|
||||
chkUseMultiline->setChecked(myLabelAttributes->multilineEnabled());
|
||||
//set the state of the buffer enabled checkbox
|
||||
chkUseBuffer->setChecked(myLabelAttributes->bufferEnabled());
|
||||
|
||||
@ -360,6 +362,7 @@ void QgsLabelDialog::apply()
|
||||
if (radioBelow->isChecked()) myLabelAttributes->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
|
||||
if (radioOver->isChecked()) myLabelAttributes->setAlignment(Qt::AlignCenter);
|
||||
|
||||
myLabelAttributes->setMultilineEnabled(chkUseMultiline->isChecked());
|
||||
myLabelAttributes->setBufferEnabled(chkUseBuffer->isChecked());
|
||||
myLabelAttributes->setBufferColor(mBufferColor);
|
||||
myTypeInt = 0;
|
||||
|
@ -214,8 +214,26 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
|
||||
/* Alignment */
|
||||
int alignment;
|
||||
QFontMetrics fm ( font );
|
||||
int width = fm.width ( text );
|
||||
int height = fm.height();
|
||||
int width, height;
|
||||
|
||||
if( mLabelAttributes->multilineEnabled() )
|
||||
{
|
||||
QStringList texts = text.split("\n");
|
||||
|
||||
width=0;
|
||||
for(int i=0; i<texts.size(); i++) {
|
||||
int w = fm.width(texts[i]);
|
||||
if(w>width)
|
||||
width=w;
|
||||
}
|
||||
|
||||
height = fm.height()*texts.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
width = fm.width ( text );
|
||||
height = fm.height();
|
||||
}
|
||||
int dx = 0;
|
||||
int dy = 0;
|
||||
|
||||
@ -319,7 +337,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
|
||||
{
|
||||
renderLabel(painter, overridePoint, coordTransform,
|
||||
transform, text, font, pen, dx, dy,
|
||||
xoffset, yoffset, ang);
|
||||
xoffset, yoffset, ang, width, height, alignment);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -329,7 +347,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
|
||||
{
|
||||
renderLabel(painter, points[i], coordTransform,
|
||||
transform, text, font, pen, dx, dy,
|
||||
xoffset, yoffset, ang);
|
||||
xoffset, yoffset, ang, width, height, alignment);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -340,7 +358,8 @@ void QgsLabel::renderLabel(QPainter* painter, QgsPoint point,
|
||||
QString text, QFont font, QPen pen,
|
||||
int dx, int dy,
|
||||
double xoffset, double yoffset,
|
||||
double ang)
|
||||
double ang,
|
||||
int width, int height, int alignment)
|
||||
{
|
||||
// Convert point to projected units
|
||||
if (coordTransform)
|
||||
@ -372,6 +391,7 @@ void QgsLabel::renderLabel(QPainter* painter, QgsPoint point,
|
||||
painter->setFont ( font );
|
||||
painter->translate ( x, y );
|
||||
painter->rotate ( -ang );
|
||||
|
||||
//
|
||||
// Draw a buffer behind the text if one is desired
|
||||
//
|
||||
@ -390,12 +410,18 @@ void QgsLabel::renderLabel(QPainter* painter, QgsPoint point,
|
||||
{
|
||||
for (int j = dy-myBufferSize; j <= dy+myBufferSize; j++)
|
||||
{
|
||||
if( mLabelAttributes->multilineEnabled() )
|
||||
painter->drawText( i , j-height, width, height, alignment, text);
|
||||
else
|
||||
painter->drawText( i , j, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
painter->setPen ( pen );
|
||||
if( mLabelAttributes->multilineEnabled() )
|
||||
painter->drawText ( dx, dy-height, width, height, alignment, text );
|
||||
else
|
||||
painter->drawText ( dx, dy, text );
|
||||
painter->restore();
|
||||
}
|
||||
@ -882,6 +908,20 @@ void QgsLabel::readXML( const QDomNode& node )
|
||||
setLabelField ( BufferEnabled, _elementFieldIndex(el) );
|
||||
}
|
||||
|
||||
scratchNode = node.namedItem("multilineenabled");
|
||||
|
||||
if ( scratchNode.isNull() )
|
||||
{
|
||||
QgsDebugMsg("couldn't find QgsLabel ``multilineenabled'' attribute");
|
||||
}
|
||||
else
|
||||
{
|
||||
el = scratchNode.toElement();
|
||||
|
||||
mLabelAttributes->setMultilineEnabled ( (bool)el.attribute("on","0").toInt() );
|
||||
setLabelField ( MultilineEnabled, _elementFieldIndex(el) );
|
||||
}
|
||||
|
||||
} // QgsLabel::readXML()
|
||||
|
||||
|
||||
@ -1158,6 +1198,26 @@ void QgsLabel::writeXML(std::ostream& xml)
|
||||
{
|
||||
xml << "\t\t\t<bufferenabled on=\"" << "\" field=\"" << "\" />\n";
|
||||
}
|
||||
|
||||
// multiline enabled
|
||||
if (mLabelAttributes->multilineEnabled())
|
||||
{
|
||||
if (mLabelFieldIdx[MultilineEnabled] != -1)
|
||||
{
|
||||
xml << "\t\t\t<multilineenabled on=\"" << mLabelAttributes->multilineEnabled()
|
||||
<< "\" field=\"" << mLabelFieldIdx[MultilineEnabled] << "\" />\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
xml << "\t\t\t<multilineenabled on=\"" << mLabelAttributes->multilineEnabled()
|
||||
<< "\" field=\"\" />\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
xml << "\t\t\t<multilineenabled on=\"" << "\" field=\"" << "\" />\n";
|
||||
}
|
||||
|
||||
xml << "\t\t</labelattributes>\n";
|
||||
}
|
||||
|
||||
|
@ -73,6 +73,7 @@ public:
|
||||
BorderWidth,
|
||||
BorderColor,
|
||||
BorderStyle,
|
||||
MultilineEnabled,
|
||||
LabelFieldCount
|
||||
};
|
||||
|
||||
@ -127,7 +128,8 @@ private:
|
||||
QString text, QFont font, QPen pen,
|
||||
int dx, int dy,
|
||||
double xoffset, double yoffset,
|
||||
double ang);
|
||||
double ang,
|
||||
int width, int height, int alignment);
|
||||
|
||||
/** Get label point for simple feature in map units */
|
||||
void labelPoint ( std::vector<QgsPoint>&, QgsFeature & feature );
|
||||
|
@ -51,7 +51,8 @@ QgsLabelAttributes::QgsLabelAttributes( bool def )
|
||||
mBufferStyleIsSet( false ),
|
||||
mBorderColorIsSet( false ),
|
||||
mBorderWidthIsSet( false ),
|
||||
mBorderStyleIsSet( false )
|
||||
mBorderStyleIsSet( false ),
|
||||
mMultilineEnabledFlag( false )
|
||||
{
|
||||
|
||||
if ( def ) { // set defaults
|
||||
@ -388,9 +389,21 @@ Qt::PenStyle QgsLabelAttributes::borderStyle ( void ) const
|
||||
return mBorderPen.style();
|
||||
}
|
||||
|
||||
/* Multiline */
|
||||
bool QgsLabelAttributes::multilineEnabled() const
|
||||
{
|
||||
return mMultilineEnabledFlag;
|
||||
}
|
||||
void QgsLabelAttributes::setMultilineEnabled(bool useMultilineFlag)
|
||||
{
|
||||
mMultilineEnabledFlag=useMultilineFlag;
|
||||
}
|
||||
|
||||
/* units */
|
||||
QString QgsLabelAttributes::unitsName ( int units )
|
||||
{
|
||||
if ( units == MapUnits ){
|
||||
if ( units == MapUnits )
|
||||
{
|
||||
return QString("mu");
|
||||
}
|
||||
|
||||
@ -406,6 +419,7 @@ int QgsLabelAttributes::unitsCode ( const QString &name )
|
||||
return PointUnits;
|
||||
}
|
||||
|
||||
/* alignment */
|
||||
QString QgsLabelAttributes::alignmentName ( int alignment )
|
||||
{
|
||||
std::cout << "QString QgsLabelAttributes::alignmentName (" << alignment << ")" << std::endl;
|
||||
|
@ -172,6 +172,9 @@ public:
|
||||
bool borderStyleIsSet ( void ) const;
|
||||
Qt::PenStyle borderStyle ( void ) const;
|
||||
|
||||
bool multilineEnabled() const;
|
||||
void setMultilineEnabled( bool useMultiline );
|
||||
|
||||
protected:
|
||||
/* Text */
|
||||
QString mText;
|
||||
@ -224,6 +227,9 @@ public:
|
||||
bool mBorderColorIsSet;
|
||||
bool mBorderWidthIsSet;
|
||||
bool mBorderStyleIsSet;
|
||||
|
||||
/** Multiline enablement */
|
||||
bool mMultilineEnabledFlag;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -449,6 +449,16 @@
|
||||
</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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user