Git commit 899c0c10f06b54903e9f6056c61ea2fce88ebe66 by Jaroslaw Staniek, on behalf of Adam Pigg. Committed on 29/09/2011 at 19:40. Pushed by staniek into branch 'master'. Improve the async backend. Add some debugging and dont check async items for height changes as its not allowed M +2 -0 libs/koreport/common/renderobjects.cpp M +10 -1 libs/koreport/renderer/KoReportASyncItemManager.cpp M +1 -0 libs/koreport/renderer/KoReportASyncItemManager.h M +13 -6 libs/koreport/renderer/KoReportPreRenderer.cpp http://commits.kde.org/calligra/899c0c10f06b54903e9f6056c61ea2fce88ebe66 diff --git a/libs/koreport/common/renderobjects.cpp b/libs/koreport/common/renderobjects.cpp index d326010..eeec023 100644 --- a/libs/koreport/common/renderobjects.cpp +++ b/libs/koreport/common/renderobjects.cpp @@ -116,6 +116,8 @@ OROPrimitive* OROPage::primitive(int idx) void OROPage::addPrimitive(OROPrimitive* p, bool atBeginning) { + kDebug() << "Adding primitive" << p->type() << "to page" << page(); + if (p == 0) return; diff --git a/libs/koreport/renderer/KoReportASyncItemManager.cpp b/libs/koreport/renderer/KoReportASyncItemManager.cpp index 667b293..5041725 100644 --- a/libs/koreport/renderer/KoReportASyncItemManager.cpp +++ b/libs/koreport/renderer/KoReportASyncItemManager.cpp @@ -20,6 +20,7 @@ #include "KoReportASyncItemManager.h" #include "common/KoReportASyncItemBase.h" +#include KoReportASyncItemManager::KoReportASyncItemManager(QObject* parent): QObject(parent) { @@ -43,13 +44,20 @@ void KoReportASyncItemManager::addItem(KoReportASyncItemBase* item, OROPage* pag m_renderList.enqueue(rdata); - connect(item, SIGNAL(finishedRendering()), this, SLOT(itemFinished())); + //Just connect the first instance + if (!m_itemList.contains(item)) { + m_itemList.append(item); + connect(item, SIGNAL(finishedRendering()), this, SLOT(itemFinished())); + } + kDebug() << m_renderList.count(); } void KoReportASyncItemManager::itemFinished() { + kDebug(); if (m_renderList.count() > 0) { RenderData *rdata = m_renderList.dequeue(); + rdata->item->render(rdata->page, rdata->section, rdata->offset, rdata->data, rdata->script); } else { emit(finished()); } @@ -57,6 +65,7 @@ void KoReportASyncItemManager::itemFinished() void KoReportASyncItemManager::startRendering() { + kDebug(); if (m_renderList.count() > 0) { RenderData *rdata = m_renderList.dequeue(); rdata->item->render(rdata->page, rdata->section, rdata->offset, rdata->data, rdata->script); diff --git a/libs/koreport/renderer/KoReportASyncItemManager.h b/libs/koreport/renderer/KoReportASyncItemManager.h index 2472839..a3510ff 100644 --- a/libs/koreport/renderer/KoReportASyncItemManager.h +++ b/libs/koreport/renderer/KoReportASyncItemManager.h @@ -49,6 +49,7 @@ public: private: QQueue m_renderList; + QList m_itemList; private slots: void itemFinished(); diff --git a/libs/koreport/renderer/KoReportPreRenderer.cpp b/libs/koreport/renderer/KoReportPreRenderer.cpp index 6d4939e..98e07e9 100644 --- a/libs/koreport/renderer/KoReportPreRenderer.cpp +++ b/libs/koreport/renderer/KoReportPreRenderer.cpp @@ -353,11 +353,16 @@ qreal KoReportPreRendererPrivate::renderSectionSize(const KRSectionData & sectio foreach(KoReportItemBase *ob, objects) { QPointF offset(m_leftMargin, m_yOffset); QVariant itemData = m_kodata->value(ob->itemDataSource()); - - itemHeight = ob->render(0, 0, offset, itemData, m_scriptHandler); - - if (itemHeight > intHeight) { - intHeight = itemHeight; + + //ASync objects cannot alter the section height + KoReportASyncItemBase *async_ob = qobject_cast(ob); + + if (!async_ob) { + itemHeight = ob->render(0, 0, offset, itemData, m_scriptHandler); + + if (itemHeight > intHeight) { + intHeight = itemHeight; + } } } @@ -397,10 +402,12 @@ qreal KoReportPreRendererPrivate::renderSection(const KRSectionData & sectionDat if (ob->supportsSubQuery()) { itemHeight = ob->render(m_page, sec, offset, m_kodata, m_scriptHandler); } else { - KoReportASyncItemBase *async_ob = dynamic_cast(ob); + KoReportASyncItemBase *async_ob = qobject_cast(ob); if (async_ob){ + kDebug() << "async object"; asyncManager->addItem(async_ob, m_page, sec, offset, itemData, m_scriptHandler); } else { + kDebug() << "sync object"; itemHeight = ob->render(m_page, sec, offset, itemData, m_scriptHandler); } }