[TD]Balloon ends and kink

This commit is contained in:
wandererfan
2020-01-12 18:33:59 -05:00
committed by WandererFan
parent e6b3fad6e1
commit 05577c267c
9 changed files with 192 additions and 111 deletions

View File

@@ -89,6 +89,7 @@ const char* DrawViewBalloon::endTypeEnums[]= { "FILLED_TRIANGLE",
"OPEN_CIRCLE",
"FORK",
"PYRAMID",
"NONE",
NULL};
//const char* DrawViewBalloon::endTypeEnums[]= {"Arrow",
@@ -123,19 +124,15 @@ DrawViewBalloon::DrawViewBalloon(void)
ADD_PROPERTY_TYPE(TextWrapLen,(-1),"",(App::PropertyType)(App::Prop_None),"Balloon symbol scale");
// OriginX.setStatus(App::Property::Hidden,false);
// OriginY.setStatus(App::Property::Hidden,false);
ADD_PROPERTY_TYPE(KinkLength,(prefKinkLength()),"",(App::PropertyType)(App::Prop_None),
"Distance from symbol to leader kink");
OriginIsSet.setStatus(App::Property::Hidden,false);
OriginIsSet.setStatus(App::Property::ReadOnly,true);
SourceView.setScope(App::LinkScope::Global);
// SourceView.setStatus(App::Property::Hidden,true);
Rotation.setStatus(App::Property::Hidden,true);
// ScaleType.setStatus(App::Property::Hidden,true);
// Scale.setStatus(App::Property::Hidden,true);
Caption.setStatus(App::Property::Hidden,true);
// X.setStatus(App::Property::Hidden,true);
// Y.setStatus(App::Property::Hidden,true);
}
DrawViewBalloon::~DrawViewBalloon()
@@ -145,6 +142,14 @@ DrawViewBalloon::~DrawViewBalloon()
void DrawViewBalloon::onChanged(const App::Property* prop)
{
if (!isRestoring()) {
if ( (prop == &EndType) ||
(prop == &Symbol) ||
(prop == &Text) ||
(prop == &KinkLength) ) {
requestPaint();
}
}
DrawView::onChanged(prop);
}
@@ -255,6 +260,16 @@ App::DocumentObjectExecReturn *DrawViewBalloon::execute(void)
requestPaint();
return App::DocumentObject::execute();
}
double DrawViewBalloon::prefKinkLength(void) const
{
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->
GetGroup("Mod/TechDraw/Dimensions");
double length = hGrp->GetFloat("BalloonKink", 5.0);
return length;
}
/*
PyObject *DrawViewBalloon::getPyObject(void)
{

View File

@@ -60,6 +60,8 @@ public:
App::PropertyBool OriginIsSet;
App::PropertyFloat TextWrapLen;
App::PropertyDistance KinkLength;
short mustExecute() const override;
DrawViewPart* getViewPart() const;
@@ -68,9 +70,7 @@ public:
//virtual PyObject *getPyObject(void);
virtual App::DocumentObjectExecReturn *execute(void) override;
//@}
/// returns the type name of the ViewProvider
virtual const char* getViewProviderName(void) const override {
return "TechDrawGui::ViewProviderBalloon";
}
@@ -80,11 +80,17 @@ public:
void handleXYLock(void) override;
double prefKinkLength(void) const;
protected:
void onChanged(const App::Property* prop) override;
/* virtual void onDocumentRestored();*/
virtual void handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property * prop) override;
virtual void handleChangedPropertyName(Base::XMLReader &reader, const char * TypeName, const char *PropName) override;
virtual void handleChangedPropertyType(Base::XMLReader &reader,
const char *TypeName,
App::Property * prop) override;
virtual void handleChangedPropertyName(Base::XMLReader &reader,
const char * TypeName,
const char *PropName) override;
private:
};

View File

@@ -43,7 +43,7 @@ using namespace TechDrawGui;
QGIArrow::QGIArrow() :
m_fill(Qt::SolidPattern),
m_size(5.0),
m_size(getPrefArrowSize()),
m_style(0),
m_dirMode(false),
m_dir(Base::Vector3d(1.0,0.0,0.0))
@@ -63,45 +63,39 @@ QGIArrow::QGIArrow() :
void QGIArrow::draw() {
QPainterPath path;
if (m_style == FILLED_TRIANGLE) {
setFillStyle(Qt::SolidPattern);
if (m_dirMode) {
path = makeFilledTriangle(getDirection(), m_size,m_size/6.0);
} else {
path = makeFilledTriangle(m_size,m_size/6.0,isFlipped()); //"arrow l/w sb 3/1" ??
}
} else if (m_style == OPEN_ARROW) {
setFillStyle(Qt::NoBrush);
if (m_dirMode) {
path = makeOpenArrow(getDirection(), m_size,m_size/3.0); //broad arrow?
} else {
path = makeOpenArrow(m_size,m_size/3.0,isFlipped());
}
} else if (m_style == HASH_MARK) {
setFillStyle(Qt::NoBrush);
if (m_dirMode) {
path = makeHashMark(getDirection(), m_size/2.0,m_size/2.0); //big enough?
} else {
path = makeHashMark(m_size/2.0,m_size/2.0,isFlipped()); //big enough?
}
} else if (m_style == DOT) {
setFillStyle(Qt::SolidPattern);
path = makeDot(m_size/2.0,m_size/2.0,isFlipped());
} else if (m_style == OPEN_CIRCLE) {
path = makeOpenDot(m_size/2.0,m_size/2.0,isFlipped());
} else if (m_style == FORK) {
setFillStyle(Qt::NoBrush);
if (m_dirMode) {
path = makeForkArrow(getDirection(), m_size/2.0,m_size/2.0); //big enough?
} else {
path = makeForkArrow(m_size/2.0,m_size/2.0,isFlipped()); //big enough?
}
} else if (m_style == PYRAMID){
setFillStyle(Qt::SolidPattern);
if (m_dirMode) {
path = makePyramid(getDirection(), m_size);
} else {
path = makePyramid(m_size,isFlipped());
}
if (m_dirMode) {
path = makePyramid(getDirection(), m_size);
} else {
path = makePyramid(m_size,isFlipped());
}
}else {
path = makeFilledTriangle(m_size,m_size/6.0,isFlipped()); //sb a question mark or ???
}
@@ -271,50 +265,51 @@ QPainterPath QGIArrow::makeForkArrow(Base::Vector3d dir, double length, double w
QPainterPath QGIArrow::makePyramid(double length, bool flipped)
{
double half_width = length/2.;
double top = -length;
double base = 0.;
// [(0,-width), (0, width)] is base of arrow
if (flipped) {
top = 0.;
base = -length;
}
top = Rez::guiX(top);
base = Rez::guiX(base);
QPainterPath path;
path.moveTo(QPointF(top, 0.));
path.lineTo(QPointF(base,Rez::guiX(-half_width)));
path.lineTo(QPointF(base,Rez::guiX(half_width)));
path.closeSubpath();
setFillStyle(Qt::SolidPattern);
return path;
double half_width = length/2.;
double top = -length;
double base = 0.;
// [(0,-width), (0, width)] is base of arrow
if (flipped) {
top = 0.;
base = -length;
}
top = Rez::guiX(top);
base = Rez::guiX(base);
QPainterPath path;
path.moveTo(QPointF(top, 0.));
path.lineTo(QPointF(base,Rez::guiX(-half_width)));
path.lineTo(QPointF(base,Rez::guiX(half_width)));
path.closeSubpath();
setFillStyle(Qt::SolidPattern);
return path;
}
QPainterPath QGIArrow::makePyramid(Base::Vector3d dir, double length)
{
//(0,0) is tip of arrow
// dir is direction arrow points
Base::Vector3d negDir = -dir;
negDir.Normalize();
double width = length / 2.;
Base::Vector3d perp(-negDir.y,negDir.x, 0.0);
Base::Vector3d barb1 = perp * width;
Base::Vector3d barb2 = perp * -width;
Base::Vector3d top = negDir * length;
//(0,0) is tip of arrow
// dir is direction arrow points
Base::Vector3d negDir = -dir;
negDir.Normalize();
double width = length / 2.;
Base::Vector3d perp(-negDir.y,negDir.x, 0.0);
Base::Vector3d barb1 = perp * width;
Base::Vector3d barb2 = perp * -width;
Base::Vector3d top = negDir * length;
QPainterPath path;
path.moveTo(QPointF(Rez::guiX(top.x),Rez::guiX(top.y)));
path.lineTo(QPointF(Rez::guiX(barb1.x),Rez::guiX(barb1.y)));
path.lineTo(QPointF(Rez::guiX(barb2.x),Rez::guiX(barb2.y)));
path.closeSubpath();
setFillStyle(Qt::SolidPattern);
return path;
QPainterPath path;
path.moveTo(QPointF(Rez::guiX(top.x),Rez::guiX(top.y)));
path.lineTo(QPointF(Rez::guiX(barb1.x),Rez::guiX(barb1.y)));
path.lineTo(QPointF(Rez::guiX(barb2.x),Rez::guiX(barb2.y)));
path.closeSubpath();
setFillStyle(Qt::SolidPattern);
return path;
}
int QGIArrow::getPrefArrowStyle()
{
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Dimensions");
GetGroup("BaseApp")->GetGroup("Preferences")->
GetGroup("Mod/TechDraw/Dimensions");
int style = hGrp->GetInt("ArrowStyle", 0);
return style;
}
@@ -356,8 +351,11 @@ double QGIArrow::getOverlapAdjust(int style, double size)
result = 0.0;
break;
case PYRAMID:
result = 0.0;
break;
result = size;
break;
case NONE:
result = 0.0;
break;
default: //unknown
result = 1.0;
}

View File

@@ -42,7 +42,8 @@ enum ArrowType {
DOT,
OPEN_CIRCLE,
FORK,
PYRAMID
PYRAMID,
NONE
};
class TechDrawGuiExport QGIArrow : public QGIPrimPath

View File

@@ -43,8 +43,9 @@ using namespace TechDrawGui;
QGIPrimPath::QGIPrimPath():
m_width(0),
m_capStyle(Qt::RoundCap),
m_fillStyleCurrent (Qt::NoBrush)
// m_fillStyleCurrent (Qt::SolidPattern)
m_fillStyleCurrent (Qt::NoBrush),
// m_fillStyleCurrent (Qt::SolidPattern),
m_fillOverride(false)
{
setCacheMode(QGraphicsItem::NoCache);
setFlag(QGraphicsItem::ItemIsSelectable, true);
@@ -128,13 +129,17 @@ void QGIPrimPath::setPrettyNormal() {
void QGIPrimPath::setPrettyPre() {
// Base::Console().Message("QGIPP::setPrettyPre()\n");
m_colCurrent = getPreColor();
m_fillColorCurrent = getPreColor();
if (!m_fillOverride) {
m_fillColorCurrent = getPreColor();
}
}
void QGIPrimPath::setPrettySel() {
// Base::Console().Message("QGIPP::setPrettySel()\n");
m_colCurrent = getSelectColor();
m_fillColorCurrent = getSelectColor();
if (!m_fillOverride) {
m_fillColorCurrent = getSelectColor();
}
}
//wf: why would a face use it's parent's normal colour?

View File

@@ -68,6 +68,7 @@ public:
void resetFill();
void setFillColor(QColor c);
QColor getFillColor(void) { return m_colDefFill; }
void setFillOverride(bool b) { m_fillOverride = b; }
protected:
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
@@ -101,6 +102,7 @@ protected:
Qt::BrushStyle m_styleNormal; //current Normal fill style
Qt::BrushStyle m_styleSelect; //Select/preSelect fill style
bool m_fillOverride;
private:

View File

@@ -265,6 +265,8 @@ QGIViewBalloon::QGIViewBalloon() :
balloonShape = new QGIDimLines();
addToGroup(balloonShape);
balloonShape->setNormalColor(getNormalColor());
balloonShape->setFill(Qt::white, Qt::SolidPattern);
balloonShape->setFillOverride(true);
balloonShape->setPrettyNormal();
arrow = new QGIArrow();
@@ -272,6 +274,7 @@ QGIViewBalloon::QGIViewBalloon() :
arrow->setNormalColor(getNormalColor());
arrow->setFillColor(getNormalColor());
arrow->setPrettyNormal();
arrow->setStyle(prefDefaultArrow());
balloonLabel->setZValue(ZVALUE::LABEL);
arrow->setZValue(ZVALUE::DIMENSION);
@@ -279,7 +282,7 @@ QGIViewBalloon::QGIViewBalloon() :
balloonLines->setZValue(ZVALUE::DIMENSION);
balloonLines->setStyle(Qt::SolidLine);
balloonShape->setZValue(ZVALUE::DIMENSION);
balloonShape->setZValue(ZVALUE::DIMENSION + 1); //above balloonLines!
balloonShape->setStyle(Qt::SolidLine);
oldLabelCenter = new QPointF;
@@ -305,7 +308,6 @@ QGIViewBalloon::QGIViewBalloon() :
balloonLabel, SIGNAL(hover(bool)),
this , SLOT (hover(bool)));
// toggleBorder(false);
setZValue(ZVALUE::DIMENSION);
}
@@ -441,7 +443,6 @@ void QGIViewBalloon::balloonLabelDragFinished()
return;
}
//this needs to be scaled?
double x = Rez::appX(balloonLabel->X()),
y = Rez::appX(balloonLabel->Y());
Gui::Command::openCommand("Drag Balloon");
@@ -509,7 +510,7 @@ void QGIViewBalloon::draw()
void QGIViewBalloon::draw_modifier(bool modifier)
{
if (!isVisible()) { //should this be controlled by parent ViewPart?
if (!isVisible()) {
return;
}
@@ -539,9 +540,6 @@ void QGIViewBalloon::draw_modifier(bool modifier)
return;
}
m_colNormal = getNormalColor();
// balloonLabel->setColor(m_colNormal);
m_lineWidth = Rez::guiX(vp->LineWidth.getValue());
double textWidth = balloonLabel->getDimText()->boundingRect().width();
@@ -556,7 +554,7 @@ void QGIViewBalloon::draw_modifier(bool modifier)
Base::Vector3d dLineStart;
Base::Vector3d kinkPoint;
double kinkLength = Rez::guiX(5.0);
double kinkLength = Rez::guiX(balloon->KinkLength.getValue());
float orginX = Rez::guiX(balloon->OriginX.getValue());
float orginY = Rez::guiX(balloon->OriginY.getValue());
@@ -564,7 +562,7 @@ void QGIViewBalloon::draw_modifier(bool modifier)
const char *balloonType = balloon->Symbol.getValueAsString();
float scale = balloon->SymbolScale.getValue();
double offset = 0;
double offsetLR = 0;
QPainterPath balloonPath;
if (strcmp(balloonType, "Circular") == 0) {
@@ -572,10 +570,10 @@ void QGIViewBalloon::draw_modifier(bool modifier)
balloonRadius = balloonRadius * scale;
balloonPath.moveTo(lblCenter.x, lblCenter.y);
balloonPath.addEllipse(lblCenter.x - balloonRadius,lblCenter.y - balloonRadius, balloonRadius * 2, balloonRadius * 2);
offset = balloonRadius;
offsetLR = balloonRadius;
} else if (strcmp(balloonType, "None") == 0) {
balloonPath = QPainterPath();
offset = (textWidth / 2.0) + Rez::guiX(2.0);
offsetLR = (textWidth / 2.0) + Rez::guiX(2.0);
} else if (strcmp(balloonType, "Rectangle") == 0) {
//Add some room
textHeight = (textHeight * scale) + Rez::guiX(1.0);
@@ -586,13 +584,14 @@ void QGIViewBalloon::draw_modifier(bool modifier)
}
}
textWidth = (textWidth * scale) + Rez::guiX(2.0);
textHeight = (textHeight * scale) + Rez::guiX(2.0);
balloonPath.addRect(lblCenter.x -(textWidth / 2.0), lblCenter.y - (textHeight / 2.0), textWidth, textHeight);
offset = (textWidth / 2.0);
offsetLR = (textWidth / 2.0);
} else if (strcmp(balloonType, "Triangle") == 0) {
double radius = sqrt(pow((textHeight / 2.0), 2) + pow((textWidth / 2.0), 2));
radius = radius * scale;
radius += Rez::guiX(3.0);
offset = (tan(30 * M_PI / 180) * radius);
offsetLR = (tan(30 * M_PI / 180) * radius);
QPolygonF triangle;
double startAngle = -M_PI / 2;
double angle = startAngle;
@@ -612,19 +611,19 @@ void QGIViewBalloon::draw_modifier(bool modifier)
balloonPath.arcTo(textBoxCorner.x() + textWidth - (textHeight / 2.0), textBoxCorner.y(), textHeight, textHeight, 90, -180);
balloonPath.lineTo(textBoxCorner.x(), textBoxCorner.y() + textHeight);
balloonPath.arcTo(textBoxCorner.x() - (textHeight / 2), textBoxCorner.y(), textHeight, textHeight, -90, -180);
offset = (textWidth / 2.0) + (textHeight / 2.0);
offsetLR = (textWidth / 2.0) + (textHeight / 2.0);
} else if (strcmp(balloonType, "Square") == 0) {
//Add some room
textWidth = (textWidth * scale) + Rez::guiX(2.0);
textHeight = (textHeight * scale) + Rez::guiX(1.0);
double max = std::max(textWidth, textHeight);
balloonPath.addRect(lblCenter.x -(max / 2.0), lblCenter.y - (max / 2.0), max, max);
offset = (max / 2.0);
offsetLR = (max / 2.0);
} else if (strcmp(balloonType, "Hexagon") == 0) {
double radius = sqrt(pow((textHeight / 2.0), 2) + pow((textWidth / 2.0), 2));
radius = radius * scale;
radius += Rez::guiX(1.0);
offset = radius;
offsetLR = radius;
QPolygonF triangle;
double startAngle = -2 * M_PI / 3;
double angle = startAngle;
@@ -636,12 +635,20 @@ void QGIViewBalloon::draw_modifier(bool modifier)
balloonPath.addPolygon(triangle);
}
offset = (lblCenter.x < orginX) ? offset : -offset;
dLineStart.y = lblCenter.y;
dLineStart.x = lblCenter.x + offset;
kinkLength = (lblCenter.x < orginX) ? kinkLength : -kinkLength;
kinkPoint.y = dLineStart.y;
kinkPoint.x = dLineStart.x + kinkLength;
balloonShape->setPath(balloonPath);
offsetLR = (lblCenter.x < orginX) ? offsetLR : -offsetLR ;
if (DrawUtil::fpCompare(kinkLength, 0.0)) { //if no kink, then dLine start sb on line from center to arrow
dLineStart = lblCenter;
kinkPoint = dLineStart;
} else {
dLineStart.y = lblCenter.y;
dLineStart.x = lblCenter.x + offsetLR ;
kinkLength = (lblCenter.x < orginX) ? kinkLength : -kinkLength;
kinkPoint.y = dLineStart.y;
kinkPoint.x = dLineStart.x + kinkLength;
}
QPainterPath dLinePath;
dLinePath.moveTo(dLineStart.x, dLineStart.y);
@@ -655,35 +662,61 @@ void QGIViewBalloon::draw_modifier(bool modifier)
orginX = Rez::guiX(balloon->OriginX.getValue());
orginY = Rez::guiX(balloon->OriginY.getValue());
dLinePath.lineTo(orginX, orginY);
oldLabelCenter->setX(lblCenter.x);
oldLabelCenter->setY(lblCenter.y);
balloonLines->setPath(dLinePath);
balloonShape->setPath(balloonPath);
// const char *endType = balloon->EndType.getValueAsString();
// if (strcmp(endType, "FILLED_TRIANGLE") == 0) {
// arrow->setStyle(QGIArrow::getPrefArrowStyle());
// } else if (strcmp(endType, "DOT") == 0) {
// arrow->setStyle(3);
// }
double xAdj = 0.0;
double yAdj = 0.0;
int endType = balloon->EndType.getValue();
arrow->setStyle(endType);
std::string endTypeString = balloon->EndType.getValueAsString();
double arrowAdj = QGIArrow::getOverlapAdjust(endType,
QGIArrow::getPrefArrowSize());
arrow->setSize(QGIArrow::getPrefArrowSize());
arrow->draw();
if (endTypeString == "NONE") {
arrow->hide();
} else {
arrow->setStyle(endType);
Base::Vector3d orign(orginX, orginY, 0.0);
Base::Vector3d dirballoonLinesLine = (orign - kinkPoint).Normalize();
float arAngle = atan2(dirballoonLinesLine.y, dirballoonLinesLine.x) * 180 / M_PI;
arrow->setSize(QGIArrow::getPrefArrowSize());
arrow->draw();
arrow->setPos(orginX, orginY);
arrow->setRotation(arAngle);
arrow->show();
Base::Vector3d orign(orginX, orginY, 0.0);
Base::Vector3d dirballoonLinesLine;
if (!DrawUtil::fpCompare(kinkLength, 0.0)) {
dirballoonLinesLine = (orign - kinkPoint).Normalize();
} else {
dirballoonLinesLine = (orign - dLineStart).Normalize();
}
float arAngle = atan2(dirballoonLinesLine.y, dirballoonLinesLine.x) * 180 / M_PI;
arrow->setPos(orginX, orginY);
if ( (endTypeString == "PYRAMID") &&
(prefOrthoPyramid()) ) {
if (arAngle < 0.0) {
arAngle += 360.0;
}
//set the angle to closest cardinal direction
if ( (45.0 < arAngle) && (arAngle < 135.0) ) {
arAngle = 90.0;
} else if ( (135.0 < arAngle) && (arAngle < 225.0) ) {
arAngle = 180.0;
} else if ( (225.0 < arAngle) && (arAngle < 315.0) ) {
arAngle = 270.0;
} else {
arAngle = 0;
}
double radAngle = arAngle * M_PI / 180.0;
double sinAngle = sin(radAngle);
double cosAngle = cos(radAngle);
xAdj = Rez::guiX(arrowAdj * cosAngle);
yAdj = Rez::guiX(arrowAdj * sinAngle);
}
arrow->setRotation(arAngle);
arrow->show();
}
dLinePath.lineTo(orginX - xAdj, orginY - yAdj);
balloonLines->setPath(dLinePath);
// redraw the Balloon and the parent View
if (hasHover && !isSelected()) {
@@ -694,9 +727,7 @@ void QGIViewBalloon::draw_modifier(bool modifier)
setPrettyNormal();
}
update();
if (parentItem()) {
//TODO: parent redraw still required with new frame/label??
parentItem()->update();
} else {
Base::Console().Log("INFO - QGIVB::draw - no parent to update\n");
@@ -707,6 +738,9 @@ void QGIViewBalloon::draw_modifier(bool modifier)
void QGIViewBalloon::setPrettyPre(void)
{
arrow->setPrettyPre();
//TODO: primPath needs override for fill
//balloonShape->setFillOverride(true); //don't fill with pre or select colours.
// balloonShape->setFill(Qt::white, Qt::NoBrush);
balloonShape->setPrettyPre();
balloonLines->setPrettyPre();
}
@@ -715,6 +749,7 @@ void QGIViewBalloon::setPrettySel(void)
{
// Base::Console().Message("QGIVBal::setPrettySel()\n");
arrow->setPrettySel();
// balloonShape->setFill(Qt::white, Qt::NoBrush);
balloonShape->setPrettySel();
balloonLines->setPrettySel();
}
@@ -722,6 +757,7 @@ void QGIViewBalloon::setPrettySel(void)
void QGIViewBalloon::setPrettyNormal(void)
{
arrow->setPrettyNormal();
// balloonShape->setFill(Qt::white, Qt::SolidPattern);
balloonShape->setPrettyNormal();
balloonLines->setPrettyNormal();
}
@@ -794,4 +830,15 @@ int QGIViewBalloon::prefDefaultArrow() const
return arrow;
}
//should this be an object property or global preference?
//when would you want a crooked pyramid?
bool QGIViewBalloon::prefOrthoPyramid() const
{
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter()
.GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Dimensions");
bool ortho = hGrp->GetBool("OrthoPyramid", true);
return ortho;
}
#include <Mod/TechDraw/Gui/moc_QGIViewBalloon.cpp>

View File

@@ -151,6 +151,8 @@ public:
virtual QColor getNormalColor(void) override;
int prefDefaultArrow() const;
bool prefOrthoPyramid() const;
public Q_SLOTS:
void balloonLabelDragged(bool ctrl);

View File

@@ -92,6 +92,11 @@
<normaloff>:/icons/arrowpyramid.svg</normaloff>:/icons/arrowpyramid.svg</iconset>
</property>
</item>
<item>
<property name="text">
<string>NONE</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">