From 4bde2d48dda8e7e96f61630219ea2ed21f849444 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Tue, 15 Jul 2014 16:28:41 +0200 Subject: [PATCH] Iterate over svgitem Don't upload textures every time we resize, makes the resize much smoother. Make it possible to show and hide borders --- src/declarativeimports/core/framesvgitem.cpp | 113 ++++++++++--------- src/declarativeimports/core/framesvgitem.h | 1 + 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/declarativeimports/core/framesvgitem.cpp b/src/declarativeimports/core/framesvgitem.cpp index f36da6946..df8a08a15 100644 --- a/src/declarativeimports/core/framesvgitem.cpp +++ b/src/declarativeimports/core/framesvgitem.cpp @@ -35,36 +35,61 @@ namespace Plasma class FrameItemNode : public SVGTextureNode { public: - FrameItemNode(FrameSvgItem* frameSvg, FrameSvg::EnabledBorders borders, const QString& prefix) + FrameItemNode(FrameSvgItem* frameSvg, FrameSvg::EnabledBorders borders, QSGNode* parent) : SVGTextureNode() , m_frameSvg(frameSvg) , m_border(borders) + , m_lastParent(parent) { - setPrefix(prefix); + m_lastParent->appendChildNode(this); + fetchPrefix(); } - void setPrefix(const QString& prefix) + void fetchPrefix() { - QString elementId = prefix % FrameSvgPrivate::borderToElementId(m_border); + QString prefix = m_frameSvg->prefix(); + + QString elementId = FrameSvgPrivate::borderToElementId(m_border); + if (!prefix.isEmpty()) + elementId.prepend(prefix + '-'); + QSize someSize = m_frameSvg->frameSvg()->elementSize(elementId); QImage image = m_frameSvg->frameSvg()->image(someSize, elementId); - auto texture = m_frameSvg->window()->createTextureFromImage(image); - texture->setFiltering(QSGTexture::Nearest); - setTexture(texture); + setVisible(!image.isNull()); + if(!image.isNull()) { + QSGTexture* texture = m_frameSvg->window()->createTextureFromImage(image); + setTexture(texture); + } else { + qDebug() << "not painting " << elementId; + } } - void reposition(const QRect& geometry) { + void reposition(const QRect& geometry) + { FrameData* frameData = m_frameSvg->frameData(); + if (!frameData) + return; - QRect newGeometry = FrameSvgPrivate::sectionRect(frameData, m_border, geometry); - qDebug() << "repositioning" << newGeometry << m_border; - setRect(newGeometry); + setRect(FrameSvgPrivate::sectionRect(frameData, m_border, geometry)); + } + + void setVisible(bool visible) + { + if (visible == bool(parent())) + return; + + if (visible) { + m_lastParent->appendChildNode(this); + } else { + m_lastParent->removeChildNode(this); + } } private: FrameSvgItem* m_frameSvg; FrameSvg::EnabledBorders m_border; + QSGNode *m_lastParent; }; @@ -135,7 +160,8 @@ bool FrameSvgItemMargins::isFixed() const FrameSvgItem::FrameSvgItem(QQuickItem *parent) : QQuickItem(parent), - m_textureChanged(false) + m_textureChanged(false), + m_sizeChanged(false) { m_frameSvg = new Plasma::FrameSvg(this); m_margins = new FrameSvgItemMargins(m_frameSvg, this); @@ -252,7 +278,7 @@ void FrameSvgItem::geometryChanged(const QRectF &newGeometry, { if (isComponentComplete()) { m_frameSvg->resizeFrame(newGeometry.size()); - m_textureChanged = true; + m_sizeChanged = true; } QQuickItem::geometryChanged(newGeometry, oldGeometry); } @@ -267,7 +293,7 @@ void FrameSvgItem::doUpdate() setImplicitHeight(m_frameSvg->marginSize(Plasma::Types::TopMargin) + m_frameSvg->marginSize(Plasma::Types::BottomMargin)); } - m_textureChanged = true; + m_sizeChanged = true; update(); } @@ -315,55 +341,40 @@ QSGNode *FrameSvgItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaint return Q_NULLPTR; } - if(!oldNode) { //FIXME or theme changed or enabled borders changed + if (m_textureChanged) { delete oldNode; - oldNode = new QSGNode; - //we're abusing transformOrigin enum here to get access to values - //these MUST be uploaded in the same order - - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::LeftBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::RightBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::TopBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::BottomBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::LeftBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::RightBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::LeftBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::RightBorder, m_prefix)); - oldNode->appendChildNode(new FrameItemNode(this, FrameSvg::NoBorder, m_prefix)); - //set sizeDirty=true + oldNode = 0; } + if (!oldNode) { + oldNode = new QSGNode; - //FIXME if (m_sizeDirty) + new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::LeftBorder, oldNode); + new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::RightBorder, oldNode); + new FrameItemNode(this, FrameSvg::TopBorder, oldNode); + new FrameItemNode(this, FrameSvg::BottomBorder, oldNode); + new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::LeftBorder, oldNode); + new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::RightBorder, oldNode); + new FrameItemNode(this, FrameSvg::LeftBorder, oldNode); + new FrameItemNode(this, FrameSvg::RightBorder, oldNode); + new FrameItemNode(this, FrameSvg::NoBorder, oldNode); + + m_sizeChanged = true; + m_textureChanged = false; + } + + FrameData* frame = frameData(); + if (frame && m_sizeChanged) { -// QRect geometry = m_frameSvg->contentsRect().toRect(); - QRect geometry = m_frameSvg->d->contentGeometry(frameData(), QSize(width(), height())); - //TODO cast root node add a convenience method on it? + QRect geometry = m_frameSvg->d->contentGeometry(frame, QSize(width(), height())); for(int i = 0; ichildCount(); ++i) { FrameItemNode* it = static_cast(oldNode->childAtIndex(i)); it->reposition(geometry); } - - //TODO sizeDirty = false + m_sizeChanged = false; } -// SVGTextureNode *textureNode = static_cast(oldNode); -// if (!textureNode) { -// textureNode = new SVGTextureNode; -// textureNode->setFiltering(QSGTexture::Nearest); -// m_textureChanged = true; //force updating the texture on our newly created node -// } -// -// if (m_textureChanged || textureNode->texture()->textureSize() != m_frameSvg->size()) { -// const QImage image = m_frameSvg->framePixmap().toImage(); -// QSGTexture *texture = window()->createTextureFromImage(image); -// texture->setFiltering(QSGTexture::Nearest); -// textureNode->setTexture(texture); -// m_textureChanged = false; -// textureNode->setRect(0, 0, width(), height()); -// } - return oldNode; } diff --git a/src/declarativeimports/core/framesvgitem.h b/src/declarativeimports/core/framesvgitem.h index dfb614fb7..7ac253b22 100644 --- a/src/declarativeimports/core/framesvgitem.h +++ b/src/declarativeimports/core/framesvgitem.h @@ -192,6 +192,7 @@ private: QString m_prefix; Units m_units; bool m_textureChanged; + bool m_sizeChanged; }; }