From kde-commits Fri Sep 30 22:30:28 2011 From: Jaroslaw Staniek Date: Fri, 30 Sep 2011 22:30:28 +0000 To: kde-commits Subject: [calligra] /: Initial api for async report items Message-Id: <20110930223028.897F0A60BE () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=131742185105026 Git commit ab1218e6072789aacce40478050acb26aa8538ec by Jaroslaw Staniek, on behalf of Adam Pigg. Committed on 27/09/2011 at 22:46. Pushed by staniek into branch 'master'. Initial api for async report items M +3 -1 libs/koreport/CMakeLists.txt A +21 -0 libs/koreport/common/KoReportASyncItemBase.cpp [License: LGPL (v2.1+)] A +46 -0 libs/koreport/common/KoReportASyncItemBase.h [License: LGPL (v2.1+)] A +66 -0 libs/koreport/renderer/KoReportASyncItemManager.cpp [License: LGPL (v2.1+)] A +61 -0 libs/koreport/renderer/KoReportASyncItemManager.h [License: LGPL (v2.1+)] M +23 -2 libs/koreport/renderer/KoReportPreRenderer.cpp M +2 -2 plugins/reporting/maps/KoReportItemMaps.h http://commits.kde.org/calligra/ab1218e6072789aacce40478050acb26aa8538ec diff --git a/libs/koreport/CMakeLists.txt b/libs/koreport/CMakeLists.txt index 2b8d64e..d0737c9 100644 --- a/libs/koreport/CMakeLists.txt +++ b/libs/koreport/CMakeLists.txt @@ -12,11 +12,12 @@ include_directories( ${KOMAIN_INCLUDES} ) #build a shared library -set(koreport_LIB_SRCS +set(koreport_LIB_SRCS common/krutils.cpp common/krpos.cpp common/krsize.cpp common/KoReportItemBase.cpp + common/KoReportASyncItemBase.cpp common/krsectiondata.cpp common/labelsizeinfo.cpp common/reportpageoptions.cpp @@ -31,6 +32,7 @@ set(koreport_LIB_SRCS renderer/KoReportPrintRenderer.cpp renderer/KoReportPreRenderer.cpp + renderer/KoReportASyncItemManager.cpp renderer/KoReportScreenRenderer.cpp renderer/KoReportHTMLTableRenderer.cpp renderer/KoReportHTMLCSSRenderer.cpp diff --git a/libs/koreport/common/KoReportASyncItemBase.cpp b/libs/koreport/common/KoReportASyncItemBase.cpp new file mode 100644 index 0000000..1ff8021 --- /dev/null +++ b/libs/koreport/common/KoReportASyncItemBase.cpp @@ -0,0 +1,21 @@ +/* + + Copyright (C) 2011 Adam Pigg + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include "KoReportASyncItemBase.h" diff --git a/libs/koreport/common/KoReportASyncItemBase.h b/libs/koreport/common/KoReportASyncItemBase.h new file mode 100644 index 0000000..a2780a0 --- /dev/null +++ b/libs/koreport/common/KoReportASyncItemBase.h @@ -0,0 +1,46 @@ +/* + + Copyright (C) 2011 Adam Pigg + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef KOREPORTASYNCITEMBASE_H +#define KOREPORTASYNCITEMBASE_H + +#include + + + +class KOREPORT_EXPORT KoReportASyncItemBase : public KoReportItemBase +{ + Q_OBJECT +public: + + virtual int render(OROPage* page, OROSection* section, QPointF offset, QVariant data, KRScriptHandler *script) = 0; + +protected: + +signals: + void finishedRendering(); + +public: + +private: + +}; + +#endif // KOREPORTASYNCITEMBASE_H diff --git a/libs/koreport/renderer/KoReportASyncItemManager.cpp b/libs/koreport/renderer/KoReportASyncItemManager.cpp new file mode 100644 index 0000000..667b293 --- /dev/null +++ b/libs/koreport/renderer/KoReportASyncItemManager.cpp @@ -0,0 +1,66 @@ +/* + + Copyright (C) 2011 Adam Pigg + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include "KoReportASyncItemManager.h" +#include "common/KoReportASyncItemBase.h" + +KoReportASyncItemManager::KoReportASyncItemManager(QObject* parent): QObject(parent) +{ + +} + +KoReportASyncItemManager::~KoReportASyncItemManager() +{ + +} + +void KoReportASyncItemManager::addItem(KoReportASyncItemBase* item, OROPage* page, OROSection* section, QPointF offset, QVariant data, KRScriptHandler* script) +{ + RenderData *rdata = new RenderData(); + rdata->item = item; + rdata->page = page; + rdata->section = section; + rdata->offset = offset; + rdata->data = data; + rdata->script = script; + + m_renderList.enqueue(rdata); + + connect(item, SIGNAL(finishedRendering()), this, SLOT(itemFinished())); +} + +void KoReportASyncItemManager::itemFinished() +{ + if (m_renderList.count() > 0) { + RenderData *rdata = m_renderList.dequeue(); + } else { + emit(finished()); + } +} + +void KoReportASyncItemManager::startRendering() +{ + 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()); + } +} diff --git a/libs/koreport/renderer/KoReportASyncItemManager.h b/libs/koreport/renderer/KoReportASyncItemManager.h new file mode 100644 index 0000000..2472839 --- /dev/null +++ b/libs/koreport/renderer/KoReportASyncItemManager.h @@ -0,0 +1,61 @@ +/* + + Copyright (C) 2011 Adam Pigg + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef KOREPORTASYNCITEMMANAGER_H +#define KOREPORTASYNCITEMMANAGER_H + +#include +#include "KoReportASyncItemBase.h" +#include + +class RenderData { +public: + KoReportASyncItemBase* item; + OROPage* page; + OROSection* section; + QPointF offset; + QVariant data; + KRScriptHandler* script; +}; + +class KoReportASyncItemManager : public QObject +{ + Q_OBJECT + +public: + KoReportASyncItemManager(QObject *parent); + virtual ~KoReportASyncItemManager(); + + void addItem(KoReportASyncItemBase *item, OROPage *page, OROSection *section, QPointF offset, QVariant data, KRScriptHandler *script); + + void startRendering(); + +private: + QQueue m_renderList; + +private slots: + void itemFinished(); + +signals: + void finished(); + +}; + +#endif // KOREPORTASYNCITEMMANAGER_H diff --git a/libs/koreport/renderer/KoReportPreRenderer.cpp b/libs/koreport/renderer/KoReportPreRenderer.cpp index ddc971b..6d4939e 100644 --- a/libs/koreport/renderer/KoReportPreRenderer.cpp +++ b/libs/koreport/renderer/KoReportPreRenderer.cpp @@ -33,6 +33,7 @@ #include "scripting/krscripthandler.h" #include #include +#include "KoReportASyncItemManager.h" // // KoReportPreRendererPrivate @@ -78,6 +79,11 @@ public: ///Scripting Stuff KRScriptHandler *m_scriptHandler; void initEngine(); + + KoReportASyncItemManager* asyncManager; + +private slots: + void asyncItemsFinished(); signals: void enteredGroup(const QString&, const QVariant&); @@ -97,6 +103,9 @@ KoReportPreRendererPrivate::KoReportPreRendererPrivate() m_pageCounter = 0; m_maxHeight = m_maxWidth = 0.0; m_kodata = 0; + asyncManager = new KoReportASyncItemManager(this); + + connect(asyncManager, SIGNAL(finished()), this, SLOT(asyncItemsFinished())); } KoReportPreRendererPrivate::~KoReportPreRendererPrivate() @@ -386,9 +395,14 @@ qreal KoReportPreRendererPrivate::renderSection(const KRSectionData & sectionDat QVariant itemData = m_kodata->value(ob->itemDataSource()); if (ob->supportsSubQuery()) { - itemHeight = ob->render(m_page, sec, offset, m_kodata, m_scriptHandler); + itemHeight = ob->render(m_page, sec, offset, m_kodata, m_scriptHandler); } else { - itemHeight = ob->render(m_page, sec, offset, itemData, m_scriptHandler); + KoReportASyncItemBase *async_ob = dynamic_cast(ob); + if (async_ob){ + asyncManager->addItem(async_ob, m_page, sec, offset, itemData, m_scriptHandler); + } else { + itemHeight = ob->render(m_page, sec, offset, itemData, m_scriptHandler); + } } if (itemHeight > sectionHeight) { @@ -420,6 +434,11 @@ void KoReportPreRendererPrivate::initEngine() connect(this, SIGNAL(renderingSection(KRSectionData*, OROPage*, QPointF)), m_scriptHandler, SLOT(slotEnteredSection(KRSectionData*, OROPage*, QPointF))); } +void KoReportPreRendererPrivate::asyncItemsFinished(){ + kDebug() << "Finished rendering async items"; +} + + //===========================KoReportPreRenderer=============================== KoReportPreRenderer::KoReportPreRenderer(const QDomElement & pDocument) : d(new KoReportPreRendererPrivate()) @@ -617,6 +636,8 @@ ORODocument* KoReportPreRenderer::generate() tb->setText(d->m_scriptHandler->evaluate(tb->text()).toString()); } + + d->asyncManager->startRendering(); d->m_scriptHandler->displayErrors(); diff --git a/plugins/reporting/maps/KoReportItemMaps.h b/plugins/reporting/maps/KoReportItemMaps.h index 7dd346f..e94e048 100644 --- a/plugins/reporting/maps/KoReportItemMaps.h +++ b/plugins/reporting/maps/KoReportItemMaps.h @@ -17,7 +17,7 @@ */ #ifndef KRIMAGEDATA_H #define KRIMAGEDATA_H -#include +#include #include #include #include @@ -45,7 +45,7 @@ class Maps; /** @author */ -class KoReportItemMaps : public KoReportItemBase +class KoReportItemMaps : public KoReportASyncItemBase { Q_OBJECT public: