1
0
Fork 0

FGQCanvas clipping / default text color fixes

Also fix some compiler warnings, but the main thing is text now
defaults to white correctly if no color was set explicitly, and
local/parent clip-reference-frames are supported.
This commit is contained in:
James Turner 2019-01-17 10:46:58 +00:00
parent 4deb61d0af
commit da65411ef4
5 changed files with 29 additions and 20 deletions

View file

@ -175,30 +175,34 @@ void FGCanvasElement::paint(FGCanvasPaintContext *context) const
QPainter* p = context->painter(); QPainter* p = context->painter();
p->save(); p->save();
QTransform combined = combinedTransform();
if (_hasClip) if (_hasClip)
{ {
QTransform t = p->transform();
// clip is defined in the global coordinate system // clip is defined in the global coordinate system
if (_clipFrame != ReferenceFrame::GLOBAL) { if (_clipFrame == ReferenceFrame::GLOBAL) {
qWarning() << Q_FUNC_INFO << "implement support for non-global clips"; // this rpelaces the transform entirely
p->setTransform(context->globalCoordinateTransform());
} else if (_clipFrame == ReferenceFrame::LOCAL) {
p->setTransform(combined, true /* combine */);
} else if (_clipFrame == ReferenceFrame::PARENT) {
// incoming transform is already our parent
} else {
qWarning() << "Unhandled clip type:" << static_cast<int>(_clipFrame) << "at" << property()->path();
} }
#if defined(DEBUG_PAINTING) #if defined(DEBUG_PAINTING)
p->save();
p->setTransform(context->globalCoordinateTransform());
p->setPen(Qt::yellow); p->setPen(Qt::yellow);
p->setBrush(QBrush(Qt::yellow, Qt::DiagCrossPattern)); p->setBrush(QBrush(Qt::yellow, Qt::DiagCrossPattern));
p->drawRect(_clipRect); p->drawRect(_clipRect);
p->restore();
#endif #endif
QTransform t = p->transform();
p->setTransform(context->globalCoordinateTransform());
p->setClipRect(_clipRect);
p->setClipping(true); p->setClipping(true);
p->setTransform(t); p->setClipRect(_clipRect);
p->setTransform(t); // restore the previous transformation
} }
QTransform combined = combinedTransform();
p->setTransform(combined, true /* combine */); p->setTransform(combined, true /* combine */);
if (!_fillColor.isValid()) { if (!_fillColor.isValid()) {
@ -385,7 +389,7 @@ void FGCanvasElement::markClipDirty()
requestPolish(); requestPolish();
} }
float FGCanvasElement::parseCSSValue(QByteArray value) const double FGCanvasElement::parseCSSValue(QByteArray value) const
{ {
value = value.trimmed(); value = value.trimmed();
// deal with %, px suffixes // deal with %, px suffixes
@ -396,7 +400,7 @@ float FGCanvasElement::parseCSSValue(QByteArray value) const
value.truncate(value.length() - 2); value.truncate(value.length() - 2);
} }
bool ok = false; bool ok = false;
float v = value.toFloat(&ok); qreal v = value.toDouble(&ok);
if (!ok) { if (!ok) {
qWarning() << "failed to parse:" << value; qWarning() << "failed to parse:" << value;
} }
@ -406,7 +410,7 @@ float FGCanvasElement::parseCSSValue(QByteArray value) const
QColor FGCanvasElement::parseColorValue(QVariant value) const QColor FGCanvasElement::parseColorValue(QVariant value) const
{ {
QString colorString = value.toString(); QString colorString = value.toString();
if (colorString.isEmpty() || colorString == "none") { if (colorString.isEmpty() || (colorString == QStringLiteral("none"))) {
return QColor(); // return an invalid color return QColor(); // return an invalid color
} }

View file

@ -140,7 +140,7 @@ private:
mutable ReferenceFrame _clipFrame = ReferenceFrame::GLOBAL; mutable ReferenceFrame _clipFrame = ReferenceFrame::GLOBAL;
void parseCSSClip(QByteArray value); void parseCSSClip(QByteArray value);
float parseCSSValue(QByteArray value) const; double parseCSSValue(QByteArray value) const;
}; };
using FGCanvasElementVec = std::vector<FGCanvasElement*>; using FGCanvasElementVec = std::vector<FGCanvasElement*>;

View file

@ -218,13 +218,13 @@ signals:
void strokeChanged(QPen stroke); void strokeChanged(QPen stroke);
protected: protected:
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override
{ {
QQuickItem::geometryChanged(newGeometry, oldGeometry); QQuickItem::geometryChanged(newGeometry, oldGeometry);
update(); update();
} }
QRectF boundingRect() const QRectF boundingRect() const override
{ {
if ((width() == 0.0) || (height() == 0.0)) { if ((width() == 0.0) || (height() == 0.0)) {
return QRectF(0.0, 0.0, implicitWidth(), implicitHeight()); return QRectF(0.0, 0.0, implicitWidth(), implicitHeight());

View file

@ -210,7 +210,12 @@ void FGCanvasText::dumpElement()
void FGCanvasText::doPaint(FGCanvasPaintContext *context) const void FGCanvasText::doPaint(FGCanvasPaintContext *context) const
{ {
context->painter()->setFont(_font); context->painter()->setFont(_font);
context->painter()->setPen(fillColor()); QColor c = fillColor();
if (!c.isValid()) {
c = Qt::white;
}
context->painter()->setPen(c);
context->painter()->setBrush(Qt::NoBrush); context->painter()->setBrush(Qt::NoBrush);
QRectF rect(0, 0, 1000, 1000); QRectF rect(0, 0, 1000, 1000);

View file

@ -89,13 +89,13 @@ public:
} }
protected: protected:
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override
{ {
QQuickItem::geometryChanged(newGeometry, oldGeometry); QQuickItem::geometryChanged(newGeometry, oldGeometry);
update(); update();
} }
QRectF boundingRect() const QRectF boundingRect() const override
{ {
if (!widthValid() || !heightValid()) { if (!widthValid() || !heightValid()) {
return QRectF(QPointF(), m_size); return QRectF(QPointF(), m_size);