3 #include <QGraphicsScene>
5 #include "headingobj.h"
9 /////////////////////////////////////////////////////////////////
11 /////////////////////////////////////////////////////////////////
12 HeadingObj::HeadingObj(QGraphicsItem *parent) :MapObj(parent)
14 //qDebug() << "Const HeadingObj (s) ";
18 HeadingObj::~HeadingObj()
20 // qDebug() << "Destr. HeadingObj "<<heading;
21 while (!textline.isEmpty())
22 delete textline.takeFirst();
25 void HeadingObj::init()
28 color=QColor ("black");
34 void HeadingObj::copy(HeadingObj *other)
37 textwidth=other->textwidth;
40 setText (other->text() );
43 void HeadingObj::move(double x, double y)
47 qreal h; // height of a textline
48 qreal ho; // offset of height while drawing all lines
50 if (!textline.isEmpty() )
51 h=textline.first()->boundingRect().height();
55 for (int i=0; i<textline.size(); ++i)
57 textline.at(i)->setPos(x,y+ho);
63 void HeadingObj::moveBy(double x, double y)
65 move (x+absPos.x(),y+absPos.y() );
68 void HeadingObj::positionBBox()
70 bbox.setX (absPos.x());
71 bbox.setY (absPos.y());
74 void HeadingObj::calcBBoxSize()
78 // Using Backspace an empty heading might easily be created, then there
79 // would be textline.first()==NULL This can be worked around by the following, but
80 // then no selection would be visible, thus we prevent it in ::setText()
81 if (!textline.isEmpty() )
83 for (int i=0; i<textline.size(); i++)
85 h+=textline.at(i)->boundingRect().height();
86 if (w<textline.at(i)->boundingRect().width() )
87 w=textline.at(i)->boundingRect().width();
90 bbox.setSize (QSizeF(w,h));
93 QGraphicsTextItem* HeadingObj::newLine(QString s)
95 QGraphicsTextItem *t=new QGraphicsTextItem (s,parentItem());
97 t->setZValue(dZ_TEXT);
98 t->setDefaultTextColor(color);
99 t->setRotation (angle);
103 void HeadingObj::setTransformOriginPoint (const QPointF & p)
105 for (int i=0; i<textline.size(); i++)
107 textline.at(i)->setTransformOriginPoint (p);
111 void HeadingObj::setRotation (const qreal &a)
114 for (int i=0; i<textline.size(); i++)
115 textline.at(i)->setRotation (angle);
118 qreal HeadingObj::getRotation()
123 void HeadingObj::setText (QString s)
127 // remove old textlines and prepare generating new ones
128 while (!textline.isEmpty())
129 delete textline.takeFirst();
131 if (s.startsWith("<html>")||
132 s.startsWith("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">")
135 QGraphicsTextItem *t=new QGraphicsTextItem ();
137 t->setZValue(dZ_TEXT);
139 t->setDefaultTextColor(color);
140 t->setRotation (angle);
141 scene()->addItem (t);
145 // prevent empty textline, so at least a small selection stays
146 // visible for this heading
147 if (s.length()==0) s=" ";
149 int i=0; // index for actual search for ws
150 int j=0; // index of last ws
151 int k=0; // index of "<br>" or similar linebreak
152 int br=0; // width of found break, e.g. for <br> it is 4
153 QRegExp re("<br.*/>");
154 re.setMinimal (true);
156 // set the text and wrap lines
159 // ok, some people wanted manual linebreaks, here we go
163 br=re.cap(0).length();
168 { // no ws found at all in s
170 textline.append (newLine(s));
175 { // no ws found in actual search
176 if (s.length()<=textwidth)
178 textline.append (newLine(s));
182 textline.append (newLine(s.left(j)));
183 s=s.mid(j+1,s.length());
188 if (i>= 0 && i<=static_cast <int> (textwidth))
189 { // there is a ws in textwidth
192 // here is a linebreak
193 textline.append (newLine(s.left(i)));
194 s=s.mid(i+br,s.length());
205 if (i>static_cast <int> (textwidth) )
208 { // a ws out of textwidth, but we have also one in
209 textline.append (newLine(s.left(j)));
210 s=s.mid(j+1,s.length());
214 { // a ws out of text, but none in
215 textline.append (newLine(s.left(i)));
216 s=s.mid(i+1,s.length());
224 } // ASCII heading with multiple lines
225 setVisibility (visible);
226 move (absPos.x(),absPos.y());
230 QString HeadingObj::text ()
235 void HeadingObj::setFont (QFont f)
244 QFont HeadingObj::getFont()
250 void HeadingObj::setColor (QColor c)
255 for (int i=0; i<textline.size(); ++i)
257 textline.at(i)->setDefaultTextColor(c);
259 //textline.at(i)->setBrush(c);
263 QColor HeadingObj::getColor()
268 void HeadingObj::setZValue (double z)
270 for (int i=0; i<textline.size(); ++i)
271 textline.at(i)->setZValue (z);
274 void HeadingObj::setVisibility (bool v)
276 MapObj::setVisibility(v);
277 for (int i=0; i<textline.size(); ++i)
279 textline.at(i)->show();
281 textline.at(i)->hide();
284 qreal HeadingObj::getHeight ()
286 return bbox.height();
289 qreal HeadingObj::getWidth()