mirror of
https://github.com/python-LimeReport/LimeReport.git
synced 2025-03-13 22:03:54 +03:00
Finish TOC-Refactoring
This commit is contained in:
commit
aa4e1204da
@ -210,7 +210,10 @@ namespace LimeReport {
|
||||
void multiItemsSelected(QList<QObject*>* objectsList);
|
||||
void miltiItemsSelectionFinished();
|
||||
void commandHistoryChanged();
|
||||
void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue);
|
||||
void itemPropertyChanged(const QString& objectName,
|
||||
const QString& propertyName,
|
||||
const QVariant& oldValue,
|
||||
const QVariant& newValue);
|
||||
void itemAdded(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item);
|
||||
void itemRemoved(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item);
|
||||
void bandAdded(LimeReport::PageDesignIntf* page, LimeReport::BandDesignIntf* band);
|
||||
@ -247,7 +250,9 @@ namespace LimeReport {
|
||||
void setBorders(const BaseDesignIntf::BorderLines& border);
|
||||
private slots:
|
||||
void slotPageGeometryChanged(QObject*, QRectF, QRectF );
|
||||
void slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant &newValue);
|
||||
void slotItemPropertyChanged(QString propertyName,
|
||||
const QVariant &oldValue,
|
||||
const QVariant &newValue);
|
||||
void slotItemPropertyObjectNameChanged(const QString& oldName, const QString& newName);
|
||||
void bandDeleted(QObject* band);
|
||||
void slotPageItemLoaded(QObject *);
|
||||
@ -262,7 +267,10 @@ namespace LimeReport {
|
||||
void checkSizeOrPosChanges();
|
||||
CommandIf::Ptr createChangePosCommand();
|
||||
CommandIf::Ptr createChangeSizeCommand();
|
||||
void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, const QVariant& oldPropertyValue, const QVariant& newPropertyValue);
|
||||
void saveChangeProppertyCommand(const QString& objectName,
|
||||
const QString& propertyName,
|
||||
const QVariant& oldPropertyValue,
|
||||
const QVariant& newPropertyValue);
|
||||
void changeSelectedGroupProperty(const QString& name,const QVariant& value);
|
||||
|
||||
private:
|
||||
|
@ -82,7 +82,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) :
|
||||
m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"),
|
||||
m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage),
|
||||
m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0),
|
||||
m_previewScaleType(FitWidth), m_previewScalePercent(0)
|
||||
m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0)
|
||||
{
|
||||
#ifdef HAVE_STATIC_BUILD
|
||||
initResources();
|
||||
@ -1147,6 +1147,9 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai
|
||||
|
||||
ReportPages ReportEnginePrivate::renderToPages()
|
||||
{
|
||||
int startTOCPage = -1;
|
||||
int pageAfterTOCIndex = -1;
|
||||
|
||||
if (m_reportRendering) return ReportPages();
|
||||
initReport();
|
||||
m_reportRender = ReportRender::Ptr(new ReportRender);
|
||||
@ -1183,10 +1186,15 @@ ReportPages ReportEnginePrivate::renderToPages()
|
||||
activateLanguage(m_reportLanguage);
|
||||
emit renderStarted();
|
||||
|
||||
foreach(PageItemDesignIntf* page , m_renderingPages){
|
||||
for(int i = 0; i < m_renderingPages.count(); ++i){
|
||||
PageItemDesignIntf* page = m_renderingPages.at(i);
|
||||
if (!page->isTOC() && page->isPrintable()){
|
||||
page->setReportSettings(&m_reportSettings);
|
||||
result.append(m_reportRender->renderPageToPages(page));
|
||||
} else {
|
||||
startTOCPage = result.count();
|
||||
pageAfterTOCIndex = i+1;
|
||||
m_reportRender->createTOCMarker(page->resetPageNumber());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1194,16 +1202,17 @@ ReportPages ReportEnginePrivate::renderToPages()
|
||||
PageItemDesignIntf* page = m_renderingPages.at(i);
|
||||
if (page->isTOC()){
|
||||
page->setReportSettings(&m_reportSettings);
|
||||
if (i==0){
|
||||
if (i < m_renderingPages.count()){
|
||||
PageItemDesignIntf* secondPage = 0;
|
||||
if (m_pages.count()>1) secondPage = m_renderingPages.at(1);
|
||||
if ( m_renderingPages.count() > (pageAfterTOCIndex))
|
||||
secondPage = m_renderingPages.at(pageAfterTOCIndex);
|
||||
ReportPages pages = m_reportRender->renderTOC(
|
||||
page,
|
||||
true,
|
||||
secondPage && secondPage->resetPageNumber()
|
||||
);
|
||||
for (int j=0; j<pages.count(); ++j){
|
||||
result.insert(j,pages.at(j));
|
||||
result.insert(startTOCPage+j,pages.at(j));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -283,6 +283,7 @@ private:
|
||||
QMap<QString, ReportExporterInterface*> exporters;
|
||||
ScaleType m_previewScaleType;
|
||||
int m_previewScalePercent;
|
||||
int m_startTOCPage;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){
|
||||
|
||||
ReportRender::ReportRender(QObject *parent)
|
||||
:QObject(parent), m_renderPageItem(0), m_pageCount(0),
|
||||
m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false), m_renderingFirstTOC(false)
|
||||
m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false)
|
||||
{
|
||||
initColumns();
|
||||
}
|
||||
@ -192,18 +192,13 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool
|
||||
{
|
||||
m_currentNameIndex = 0;
|
||||
m_patternPageItem = patternPage;
|
||||
m_renderingFirstTOC = isTOC && isFirst;
|
||||
|
||||
if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) {
|
||||
resetPageNumber(PageReset);
|
||||
}
|
||||
|
||||
if (m_renderingFirstTOC && resetPageNumbers){
|
||||
PagesRange range;
|
||||
range.firstPage = 0;
|
||||
range.lastPage = 0;
|
||||
m_ranges.insert(0,range);
|
||||
m_pageCount = 0;
|
||||
if (m_patternPageItem->resetPageNumber() && !isTOC && m_pageCount == 0){
|
||||
m_pagesRanges.startNewRange();
|
||||
}
|
||||
|
||||
m_renderCanceled = false;
|
||||
@ -248,11 +243,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool
|
||||
|
||||
savePage(true);
|
||||
|
||||
if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){
|
||||
m_ranges[1].firstPage = m_ranges.at(0).lastPage+1;
|
||||
m_ranges[1].lastPage += m_ranges.at(0).lastPage+1;
|
||||
}
|
||||
|
||||
#ifndef USE_QJSENGINE
|
||||
ScriptEngineManager::instance().scriptEngine()->popContext();
|
||||
#endif
|
||||
@ -1138,21 +1128,26 @@ void ReportRender::secondRenderPass(ReportPages renderedPages)
|
||||
for(int i=0; i<renderedPages.count(); ++i){
|
||||
PageItemDesignIntf::Ptr page = renderedPages.at(i);
|
||||
foreach(BaseDesignIntf* item, page->childBaseItems()){
|
||||
updateTOC(item, findPageNumber(i));
|
||||
updateTOC(item, m_pagesRanges.findPageNumber(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0; i<renderedPages.count(); ++i){
|
||||
PageItemDesignIntf::Ptr page = renderedPages.at(i);
|
||||
m_datasources->setReportVariable("#PAGE",findPageNumber(i));
|
||||
m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i));
|
||||
m_datasources->setReportVariable("#PAGE",m_pagesRanges.findPageNumber(i));
|
||||
m_datasources->setReportVariable("#PAGE_COUNT",m_pagesRanges.findLastPageNumber(i));
|
||||
foreach(BaseDesignIntf* item, page->childBaseItems()){
|
||||
item->updateItemSize(m_datasources, SecondPass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ReportRender::createTOCMarker(bool startNewRange)
|
||||
{
|
||||
m_pagesRanges.addTOCMarker(startNewRange);
|
||||
}
|
||||
|
||||
BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand)
|
||||
{
|
||||
int sliceHeight = height;
|
||||
@ -1256,37 +1251,11 @@ void ReportRender::startNewPage(bool isFirst)
|
||||
|
||||
void ReportRender::resetPageNumber(ResetPageNuberType resetType)
|
||||
{
|
||||
PagesRange range;
|
||||
if (!m_ranges.isEmpty()){
|
||||
currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1;
|
||||
range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0);
|
||||
} else {
|
||||
range.firstPage = m_pageCount;
|
||||
}
|
||||
range.lastPage = (resetType == BandReset)? 0 : m_pageCount;
|
||||
m_ranges.append(range);
|
||||
m_pagesRanges.startNewRange();
|
||||
if (resetType == PageReset)
|
||||
m_datasources->setReportVariable("#PAGE",1);
|
||||
}
|
||||
|
||||
int ReportRender::findLastPageNumber(int currentPage)
|
||||
{
|
||||
foreach (PagesRange range, m_ranges) {
|
||||
if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) )
|
||||
return (range.lastPage-(range.firstPage))+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ReportRender::findPageNumber(int currentPage)
|
||||
{
|
||||
foreach (PagesRange range, m_ranges) {
|
||||
if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) )
|
||||
return (currentPage - range.firstPage)+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ReportRender::cutGroups()
|
||||
{
|
||||
m_popupedExpression.clear();
|
||||
@ -1406,6 +1375,10 @@ void ReportRender::moveTearOffBand(){
|
||||
|
||||
void ReportRender::savePage(bool isLast)
|
||||
{
|
||||
if (m_renderPageItem->isTOC())
|
||||
m_pagesRanges.addTOCPage();
|
||||
else
|
||||
m_pagesRanges.addPage();
|
||||
|
||||
m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",isLast);
|
||||
m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",m_datasources->variable("#PAGE").toInt()==1);
|
||||
@ -1427,14 +1400,12 @@ void ReportRender::savePage(bool isLast)
|
||||
}
|
||||
}
|
||||
|
||||
if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) {
|
||||
if (m_pagesRanges.currentRange(m_patternPageItem->isTOC()).firstPage == 0) {
|
||||
m_datasources->setReportVariable("#PAGE",1);
|
||||
} else {
|
||||
m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1);
|
||||
}
|
||||
|
||||
currentRange(m_renderingFirstTOC).lastPage = m_pageCount;
|
||||
|
||||
BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter);
|
||||
if (pageFooter) pageFooter->setBandIndex(++m_currentIndex);
|
||||
m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem));
|
||||
@ -1478,4 +1449,96 @@ void ReportRender::cancelRender(){
|
||||
m_renderCanceled = true;
|
||||
}
|
||||
|
||||
int PagesRanges::findLastPageNumber(int index)
|
||||
{
|
||||
index++;
|
||||
foreach (PagesRange range, m_ranges) {
|
||||
if ( range.firstPage <= (index) && range.lastPage>= (index) )
|
||||
return (range.lastPage-(range.firstPage))+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PagesRanges::findPageNumber(int index)
|
||||
{
|
||||
index++;
|
||||
foreach (PagesRange range, m_ranges) {
|
||||
if ( range.firstPage <= (index) && range.lastPage >= (index) )
|
||||
return (index - range.firstPage)+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
PagesRange&PagesRanges::currentRange(bool isTOC)
|
||||
{
|
||||
Q_ASSERT( (isTOC && m_TOCRangeIndex!=-1) || !isTOC);
|
||||
if (isTOC && m_TOCRangeIndex !=-1) return m_ranges[m_TOCRangeIndex];
|
||||
return m_ranges.last();
|
||||
}
|
||||
|
||||
void PagesRanges::startNewRange(bool isTOC)
|
||||
{
|
||||
PagesRange range;
|
||||
if (!m_ranges.isEmpty()){
|
||||
range.firstPage = 0;
|
||||
range.lastPage = m_ranges.last().lastPage + 1;
|
||||
} else {
|
||||
range.firstPage = 0;
|
||||
range.lastPage = 0;
|
||||
}
|
||||
range.isTOC = isTOC;
|
||||
m_ranges.append(range);
|
||||
if (isTOC) m_TOCRangeIndex = m_ranges.size()-1;
|
||||
}
|
||||
|
||||
void PagesRanges::addTOCMarker(bool addNewRange)
|
||||
{
|
||||
if ( addNewRange || m_ranges.isEmpty()){
|
||||
startNewRange(true);
|
||||
} else {
|
||||
m_TOCRangeIndex = m_ranges.size()-1;
|
||||
m_ranges.last().isTOC = true;
|
||||
}
|
||||
}
|
||||
|
||||
void PagesRanges::addPage()
|
||||
{
|
||||
if (m_ranges.isEmpty()) startNewRange();
|
||||
if (m_ranges.last().firstPage == 0){
|
||||
m_ranges.last().firstPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage;
|
||||
m_ranges.last().lastPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage;
|
||||
} else {
|
||||
m_ranges.last().lastPage++;
|
||||
}
|
||||
}
|
||||
|
||||
void PagesRanges::shiftRangesNextToTOC(){
|
||||
for(int i = m_TOCRangeIndex+1; i < m_ranges.size(); ++i){
|
||||
m_ranges[i].firstPage++;
|
||||
m_ranges[i].lastPage++;
|
||||
}
|
||||
}
|
||||
|
||||
void PagesRanges::addTOCPage()
|
||||
{
|
||||
Q_ASSERT(m_TOCRangeIndex != -1);
|
||||
if (m_TOCRangeIndex != -1){
|
||||
PagesRange& tocRange = m_ranges[m_TOCRangeIndex];
|
||||
if (tocRange.firstPage == 0) {
|
||||
tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage;
|
||||
tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage;
|
||||
if (tocRange.lastPage == 1 && tocRange.lastPage == 1)
|
||||
shiftRangesNextToTOC();
|
||||
} else {
|
||||
tocRange.lastPage++;
|
||||
shiftRangesNextToTOC();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PagesRanges::clear()
|
||||
{
|
||||
m_ranges.clear();
|
||||
}
|
||||
|
||||
} // namespace LimeReport
|
||||
|
@ -61,6 +61,25 @@ private:
|
||||
struct PagesRange{
|
||||
int firstPage;
|
||||
int lastPage;
|
||||
bool isTOC;
|
||||
};
|
||||
|
||||
class PagesRanges{
|
||||
public:
|
||||
PagesRanges(): m_TOCRangeIndex(-1) {}
|
||||
int findLastPageNumber(int index);
|
||||
int findPageNumber(int index);
|
||||
PagesRange& currentRange(bool isTOC);
|
||||
void startNewRange(bool isTOC = false);
|
||||
void addTOCMarker(bool addNewRange);
|
||||
void addPage();
|
||||
void addTOCPage();
|
||||
void clear();
|
||||
private:
|
||||
void shiftRangesNextToTOC();
|
||||
private:
|
||||
QVector<PagesRange> m_ranges;
|
||||
int m_TOCRangeIndex;
|
||||
};
|
||||
|
||||
class ReportRender: public QObject
|
||||
@ -84,6 +103,7 @@ public:
|
||||
ReportPages renderPageToPages(PageItemDesignIntf *patternPage);
|
||||
ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages);
|
||||
void secondRenderPass(ReportPages renderedPages);
|
||||
void createTOCMarker(bool startNewRange);
|
||||
signals:
|
||||
void pageRendered(int renderedPageCount);
|
||||
public slots:
|
||||
@ -147,8 +167,8 @@ private:
|
||||
void startNewColumn();
|
||||
void startNewPage(bool isFirst = false);
|
||||
void resetPageNumber(ResetPageNuberType resetType);
|
||||
int findLastPageNumber(int currentPage);
|
||||
int findPageNumber(int currentPage);
|
||||
//int findLastPageNumber(int currentPage);
|
||||
//int findPageNumber(int currentPage);
|
||||
void savePage(bool isLast = false);
|
||||
QString toString();
|
||||
void initColumns();
|
||||
@ -161,7 +181,7 @@ private:
|
||||
void renameChildItems(BaseDesignIntf *item);
|
||||
void renderGroupFooterByHeader(BandDesignIntf *groupHeader);
|
||||
void updateTOC(BaseDesignIntf* item, int pageNumber);
|
||||
PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();}
|
||||
//PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();}
|
||||
void placeBandOnPage(BandDesignIntf *band, int columnIndex);
|
||||
private:
|
||||
DataSourceManager* m_datasources;
|
||||
@ -190,11 +210,10 @@ private:
|
||||
QVector<qreal> m_maxHeightByColumn;
|
||||
QVector<qreal> m_currentStartDataPos;
|
||||
int m_currentColumn;
|
||||
QList<PagesRange> m_ranges;
|
||||
PagesRanges m_pagesRanges;
|
||||
QVector<BandDesignIntf*> m_columnedBandItems;
|
||||
unsigned long long m_currentNameIndex;
|
||||
bool m_newPageStarted;
|
||||
bool m_renderingFirstTOC;
|
||||
|
||||
};
|
||||
} // namespace LimeReport
|
||||
|
Loading…
Reference in New Issue
Block a user