0
0
mirror of https://github.com/fralx/LimeReport.git synced 2024-12-24 00:33:02 +03:00

Merge pull request #5 from fralx/master

sincro fork
This commit is contained in:
newsages 2016-03-31 01:57:53 +02:00
commit adcac14617
19 changed files with 620 additions and 320 deletions

View File

@ -11,6 +11,7 @@ CONFIG(release, debug|release){
}
BUILD_DIR = $$PWD/build/$${QT_VERSION}
DEST_INCLUDE_DIR = $$PWD/include/
unix:!macx {
ARCH_DIR = $${OUT_PWD}/unix

View File

@ -0,0 +1,53 @@
#ifndef LRPREVIEWREPORTWIDGET_H
#define LRPREVIEWREPORTWIDGET_H
#include <QWidget>
#include "lrglobal.h"
namespace LimeReport {
namespace Ui {
class PreviewReportWidget;
}
class PreviewReportWidgetPrivate;
class ReportEnginePrivate;
class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget
{
Q_OBJECT
friend class ReportEnginePrivate;
friend class PreviewReportWindow;
friend class PreviewReportWidgetPrivate;
public:
explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0);
~PreviewReportWidget();
void initPreview();
void setErrorsMesagesVisible(bool visible);
void setErrorMessages(const QStringList &value);
void refreshPages();
public slots:
void slotZoomIn();
void slotZoomOut();
void slotFirstPage();
void slotPriorPage();
void slotNextPage();
void slotLastPage();
void slotPrint();
void slotPrintToPDF();
void slotPageNavigatorChanged(int value);
void slotSaveToFile();
signals:
void pageChanged(int page);
private slots:
void slotSliderMoved(int value);
void reportEngineDestroyed(QObject* object);
private:
Ui::PreviewReportWidget *ui;
PreviewReportWidgetPrivate* d_ptr;
};
} // namespace LimeReport
#endif // LRPREVIEWREPORTWIDGET_H

View File

@ -37,6 +37,7 @@
#include "lrglobal.h"
#include "lrdatasourcemanagerintf.h"
#include "lrscriptenginemanagerintf.h"
#include "lrpreviewreportwidget.h"
class QPrinter;
@ -75,7 +76,6 @@ public:
void setShowProgressDialog(bool value);
IDataSourceManager* dataManager();
IScriptEngineManager* scriptManager();
bool loadFromFile(const QString& fileName);
bool loadFromByteArray(QByteArray *data);
bool loadFromString(const QString& data);
@ -88,6 +88,7 @@ public:
void setCurrentReportsDir(const QString& dirName);
void setReportName(const QString& name);
QString reportName();
PreviewReportWidget *createPreviewWidget(QWidget *parent = 0);
signals:
void renderStarted();
void renderFinished();

View File

@ -81,6 +81,8 @@ SOURCES += \
$$REPORT_PATH/lrreportrender.cpp \
$$REPORT_PATH/lrscriptenginemanager.cpp \
$$REPORT_PATH/lrpreviewreportwindow.cpp \
$$REPORT_PATH/lrpreviewreportwidget.cpp \
$$REPORT_PATH/lrgraphicsviewzoom.cpp \
$$REPORT_PATH/lrvariablesholder.cpp \
$$REPORT_PATH/lrgroupfunctions.cpp \
$$REPORT_PATH/lrsimplecrypt.cpp \
@ -157,6 +159,8 @@ HEADERS += \
$$REPORT_PATH/bands/lrsubdetailband.h \
$$REPORT_PATH/lrreportrender.h \
$$REPORT_PATH/lrpreviewreportwindow.h \
$$REPORT_PATH/lrpreviewreportwidget.h \
$$REPORT_PATH/lrgraphicsviewzoom.h \
$$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \
$$REPORT_PATH/objectinspector/editors/lrfonteditor.h \
$$REPORT_PATH/items/lrimageitem.h \
@ -178,7 +182,8 @@ HEADERS += \
$$REPORT_PATH/lrsimplecrypt.h \
$$REPORT_PATH/lraboutdialog.h \
$$REPORT_PATH/lrcallbackdatasourceintf.h \
$$REPORT_PATH/lrsettingdialog.h
$$REPORT_PATH/lrsettingdialog.h \
$$PWD/lrpreviewreportwidget_p.h
contains(CONFIG,zint){
HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h
@ -191,6 +196,7 @@ FORMS += \
$$REPORT_PATH/databrowser/lrvariabledialog.ui \
$$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \
$$REPORT_PATH/lrpreviewreportwindow.ui \
$$REPORT_PATH/lrpreviewreportwidget.ui \
$$REPORT_PATH/items/lrtextitemeditor.ui \
$$REPORT_PATH/lraboutdialog.ui \
$$REPORT_PATH/lrsettingdialog.ui

View File

@ -23,31 +23,27 @@ EXTRA_FILES += \
include(limereport.pri)
DEST_DIR = $$PWD/../include/
unix {
DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib
QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t)
#for(FILE,EXTRA_FILES){
# QMAKE_POST_LINK += $$quote($$QMAKE_COPY $${FILE} $${DEST_DIR}) $$escape_expand(\\n\\t)
#}
DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib
#QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t)
for(FILE,EXTRA_FILES){
QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DESTDIR}/include/) $$escape_expand(\\n\\t)
QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}/include/) $$escape_expand(\\n\\t)
}
QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DEST_DIR})
}
win32 {
EXTRA_FILES ~= s,/,\\,g
DEST_DIR ~= s,/,\\,g
BUILD_DIR ~= s,/,\\,g
DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib
DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib
DEST_DIR = $$DESTDIR/include/
DEST_DIR ~= s,/,\\,g
DEST_INCLUDE_DIR ~= s,/,\\,g
for(FILE,EXTRA_FILES){
QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t)
QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t)
}
QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DEST_DIR})
}
contains(CONFIG,zint){

View File

@ -0,0 +1,58 @@
#include "lrgraphicsviewzoom.h"
#include <QMouseEvent>
#include <QApplication>
#include <QtMath>
namespace LimeReport{
GraphicsViewZoomer::GraphicsViewZoomer(QGraphicsView* view)
: QObject(view), m_view(view)
{
m_view->viewport()->installEventFilter(this);
m_view->setMouseTracking(true);
m_modifiers = Qt::ControlModifier;
m_zoomFactorBase = 1.0015;
}
void GraphicsViewZoomer::gentleZoom(double factor) {
m_view->scale(factor, factor);
m_view->centerOn(m_targetScenePos);
QPointF delta_viewport_pos = m_targetViewportPos - QPointF(m_view->viewport()->width() / 2.0,
m_view->viewport()->height() / 2.0);
QPointF viewport_center = m_view->mapFromScene(m_targetScenePos) - delta_viewport_pos;
m_view->centerOn(m_view->mapToScene(viewport_center.toPoint()));
emit zoomed();
}
void GraphicsViewZoomer::setModifiers(Qt::KeyboardModifiers modifiers) {
m_modifiers = modifiers;
}
void GraphicsViewZoomer::setZoomFactorBase(double value) {
m_zoomFactorBase = value;
}
bool GraphicsViewZoomer::eventFilter(QObject *object, QEvent *event) {
if (event->type() == QEvent::MouseMove) {
QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
QPointF delta = m_targetViewportPos - mouse_event->pos();
if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) {
m_targetViewportPos = mouse_event->pos();
m_targetScenePos = m_view->mapToScene(mouse_event->pos());
}
} else if (event->type() == QEvent::Wheel) {
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
if (QApplication::keyboardModifiers() == m_modifiers) {
if (wheel_event->orientation() == Qt::Vertical) {
double angle = wheel_event->delta();
double factor = qPow(m_zoomFactorBase, angle);
gentleZoom(factor);
return true;
}
}
}
Q_UNUSED(object)
return false;
}
} //namespace LimeReport

View File

@ -0,0 +1,28 @@
#ifndef GRAPHICSVIEWZOOM_H
#define GRAPHICSVIEWZOOM_H
#include <QObject>
#include <QGraphicsView>
namespace LimeReport {
class GraphicsViewZoomer : public QObject {
Q_OBJECT
public:
GraphicsViewZoomer(QGraphicsView* view);
void gentleZoom(double factor);
void setModifiers(Qt::KeyboardModifiers modifiers);
void setZoomFactorBase(double value);
private:
QGraphicsView* m_view;
Qt::KeyboardModifiers m_modifiers;
double m_zoomFactorBase;
QPointF m_targetScenePos, m_targetViewportPos;
bool eventFilter(QObject* object, QEvent* event);
signals:
void zoomed();
};
} // namespace LimeReport
#endif // GRAPHICSVIEWZOOM_H

View File

@ -0,0 +1,259 @@
#include "lrpreviewreportwidget.h"
#include "ui_lrpreviewreportwidget.h"
#include <QPrinter>
#include <QPrintDialog>
#include <QScrollBar>
#include <QFileDialog>
#include "lrpagedesignintf.h"
#include "lrreportrender.h"
#include "lrreportengine_p.h"
#include "lrpreviewreportwidget_p.h"
#include "serializators/lrxmlwriter.h"
namespace LimeReport {
bool PreviewReportWidgetPrivate::pageIsVisible(){
QGraphicsView* view = q_ptr->ui->graphicsView;
PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1);
return page->mapToScene(page->rect()).boundingRect().intersects(
view->mapToScene(view->viewport()->geometry()).boundingRect()
);
}
QRectF PreviewReportWidgetPrivate::calcPageShift(){
QGraphicsView *view = q_ptr->ui->graphicsView;
PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1);
qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height();
qreal viewHeight = view->mapToScene(
0, view->viewport()->height()
).y() - view->mapToScene(0,0).y();
viewHeight = (pageHeight<viewHeight)?pageHeight:viewHeight;
QRectF pageStartPos = m_reportPages.at(m_currentPage-1)->mapRectToScene(
m_reportPages.at(m_currentPage-1)->rect()
);
return QRectF(0,pageStartPos.y(),0,viewHeight);
}
void PreviewReportWidgetPrivate::setPages(ReportPages pages)
{
m_reportPages = pages;
if (!m_reportPages.isEmpty()){
m_previewPage->setPageItems(m_reportPages);
m_changingPage = true;
m_currentPage = 1;
if (pages.at(0)) pages.at(0)->setSelected(true);
m_changingPage = false;
q_ptr->initPreview();
}
}
PreviewReportWidget::PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent) :
QWidget(parent),
ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this))
{
ui->setupUi(this);
d_ptr->m_previewPage = report->createPreviewPage();
d_ptr->m_previewPage->setItemMode( LimeReport::PreviewMode );
d_ptr->m_report = report;
ui->errorsView->setVisible(false);
connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
connect(d_ptr->m_report, SIGNAL(destroyed(QObject*)), this, SLOT(reportEngineDestroyed(QObject*)));
d_ptr->m_zoomer = new GraphicsViewZoomer(ui->graphicsView);
}
PreviewReportWidget::~PreviewReportWidget()
{
delete d_ptr->m_previewPage;
d_ptr->m_previewPage = 0;
delete d_ptr->m_zoomer;
delete d_ptr;
delete ui;
}
void PreviewReportWidget::initPreview()
{
ui->graphicsView->setScene(d_ptr->m_previewPage);
ui->graphicsView->centerOn(0, 0);
ui->graphicsView->scale(0.5,0.5);
}
void PreviewReportWidget::setErrorsMesagesVisible(bool visible)
{
ui->errorsView->setVisible(visible);
}
void PreviewReportWidget::slotZoomIn()
{
ui->graphicsView->scale(1.2,1.2);
}
void PreviewReportWidget::slotZoomOut()
{
ui->graphicsView->scale(1/1.2,1/1.2);
}
void PreviewReportWidget::slotFirstPage()
{
d_ptr->m_changingPage=true;
if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){
d_ptr->m_currentPage=1;
ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
emit pageChanged(d_ptr->m_currentPage);
}
d_ptr->m_changingPage=false;
}
void PreviewReportWidget::slotPriorPage()
{
d_ptr->m_changingPage=true;
if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){
d_ptr->m_currentPage--;
ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
emit pageChanged(d_ptr->m_currentPage);
}
d_ptr->m_changingPage=false;
}
void PreviewReportWidget::slotNextPage()
{
d_ptr->m_changingPage=true;
if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){
d_ptr->m_currentPage++;
ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
emit pageChanged(d_ptr->m_currentPage);
}
d_ptr->m_changingPage=false;
}
void PreviewReportWidget::slotLastPage()
{
d_ptr->m_changingPage=true;
if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){
d_ptr->m_currentPage=d_ptr->m_reportPages.count();
ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
emit pageChanged(d_ptr->m_currentPage);
}
d_ptr->m_changingPage=false;
}
void PreviewReportWidget::slotPrint()
{
QPrinter printer(QPrinter::HighResolution);
QPrintDialog dialog(&printer,QApplication::activeWindow());
if (dialog.exec()==QDialog::Accepted){
if (!d_ptr->m_reportPages.isEmpty())
ReportEnginePrivate::printReport(
d_ptr->m_reportPages,
printer,
PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage())
);
}
}
void PreviewReportWidget::slotPrintToPDF()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF(*.pdf)" );
if (!fileName.isEmpty()){
QPrinter printer;
printer.setOutputFileName(fileName);
printer.setOutputFormat(QPrinter::PdfFormat);
if (!d_ptr->m_reportPages.isEmpty()){
ReportEnginePrivate::printReport(d_ptr->m_reportPages,printer,PrintRange());
}
foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){
d_ptr->m_previewPage->reactivatePageItem(pageItem);
}
}
}
void PreviewReportWidget::slotPageNavigatorChanged(int value)
{
if (d_ptr->m_changingPage) return;
d_ptr->m_changingPage = true;
if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count() >= value) && value>0){
d_ptr->m_currentPage = value;
ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
}
d_ptr->m_changingPage=false;
}
void PreviewReportWidget::slotSaveToFile()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name"));
if (!fileName.isEmpty()){
QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
foreach (PageItemDesignIntf::Ptr page, d_ptr->m_reportPages){
writer->putItem(page.data());
}
writer->saveToFile(fileName);
}
}
void PreviewReportWidget::setErrorMessages(const QStringList &value)
{
foreach (QString line, value) {
ui->errorsView->append(line);
}
}
void PreviewReportWidget::refreshPages()
{
if (d_ptr->m_report){
try{
d_ptr->m_report->dataManager()->setDesignTime(false);
ReportPages pages = d_ptr->m_report->renderToPages();
d_ptr->m_report->dataManager()->setDesignTime(true);
if (pages.count()>0){
d_ptr->m_reportPages = pages;
if (!d_ptr->m_reportPages.isEmpty()){
d_ptr->m_previewPage->setPageItems(d_ptr->m_reportPages);
d_ptr->m_changingPage = true;
d_ptr->m_currentPage = 1;
if (pages.at(0)) pages.at(0)->setSelected(true);
d_ptr->m_changingPage = false;
}
ui->graphicsView->centerOn(0, 0);
}
} catch (ReportError &exception){
d_ptr->m_report->saveError(exception.what());
d_ptr->m_report->showError(exception.what());
}
}
}
void PreviewReportWidget::slotSliderMoved(int value)
{
if (ui->graphicsView->verticalScrollBar()->minimum()==value){
d_ptr->m_currentPage = 1;
} else if (ui->graphicsView->verticalScrollBar()->maximum()==value){
d_ptr->m_currentPage = d_ptr->m_reportPages.count();
}
if (!d_ptr->pageIsVisible()){
if (value>d_ptr->m_priorScrolValue){
d_ptr->m_currentPage++;
} else {
d_ptr->m_currentPage--;
}
}
d_ptr->m_changingPage = true;
emit pageChanged(d_ptr->m_currentPage);
d_ptr->m_changingPage = false;
d_ptr->m_priorScrolValue = value;
}
void PreviewReportWidget::reportEngineDestroyed(QObject *object)
{
if (object == d_ptr->m_report){
d_ptr->m_report = 0;
}
}
}

View File

@ -0,0 +1,54 @@
#ifndef LRPREVIEWREPORTWIDGET_H
#define LRPREVIEWREPORTWIDGET_H
#include <QWidget>
#include "lrglobal.h"
namespace LimeReport {
namespace Ui {
class PreviewReportWidget;
}
class PreviewReportWidgetPrivate;
class ReportEnginePrivate;
class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget
{
Q_OBJECT
friend class ReportEnginePrivate;
friend class PreviewReportWindow;
friend class PreviewReportWidgetPrivate;
public:
explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0);
~PreviewReportWidget();
public slots:
void refreshPages();
void slotZoomIn();
void slotZoomOut();
void slotFirstPage();
void slotPriorPage();
void slotNextPage();
void slotLastPage();
void slotPrint();
void slotPrintToPDF();
void slotPageNavigatorChanged(int value);
void slotSaveToFile();
signals:
void pageChanged(int page);
private slots:
void slotSliderMoved(int value);
void reportEngineDestroyed(QObject* object);
private:
void initPreview();
void setErrorsMesagesVisible(bool visible);
void setErrorMessages(const QStringList &value);
private:
Ui::PreviewReportWidget *ui;
PreviewReportWidgetPrivate* d_ptr;
};
} // namespace LimeReport
#endif // LRPREVIEWREPORTWIDGET_H

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LimeReport::PreviewReportWidget</class>
<widget class="QWidget" name="LimeReport::PreviewReportWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>740</width>
<height>418</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QGraphicsView" name="graphicsView"/>
</item>
<item>
<widget class="QTextEdit" name="errorsView"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,33 @@
#ifndef LRPREVIEWREPORTWIDGET_P_H
#define LRPREVIEWREPORTWIDGET_P_H
#include "lrpagedesignintf.h"
#include "lrreportrender.h"
#include "lrgraphicsviewzoom.h"
namespace LimeReport{
class PreviewReportWidget;
class PreviewReportWidgetPrivate
{
public:
PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): q_ptr(previewReportWidget),
m_currentPage(1), m_changingPage(false), m_priorScrolValue(0){}
bool pageIsVisible();
QRectF calcPageShift();
void setPages( ReportPages pages);
public:
PageDesignIntf* m_previewPage;
ReportPages m_reportPages;
ReportEnginePrivate* m_report;
GraphicsViewZoomer* m_zoomer;
int m_currentPage;
bool m_changingPage;
int m_priorScrolValue;
PreviewReportWidget* q_ptr;
};
}
#endif // LRPREVIEWREPORTWIDGET_P_H

View File

@ -32,6 +32,8 @@
#include "serializators/lrxmlreader.h"
#include "serializators/lrxmlwriter.h"
#include "lrreportengine_p.h"
#include "lrpreviewreportwidget.h"
#include "lrpreviewreportwidget_p.h"
#include <QPrinter>
#include <QPrintDialog>
@ -43,24 +45,22 @@ namespace LimeReport{
PreviewReportWindow::PreviewReportWindow(ReportEnginePrivate *report,QWidget *parent, QSettings *settings, Qt::WindowFlags flags) :
QMainWindow(parent,flags),
ui(new Ui::PreviewReportWindow), m_currentPage(1), m_changingPage(false), m_settings(settings), m_ownedSettings(false),
m_priorScrolValue(0)
ui(new Ui::PreviewReportWindow), m_settings(settings), m_ownedSettings(false)
{
ui->setupUi(this);
setWindowTitle("Lime Report Preview");
m_previewPage = report->createPreviewPage();
m_previewPage->setItemMode( LimeReport::PreviewMode );
m_pagesNavigator = new QSpinBox(this);
m_pagesNavigator->setMaximum(10000000);
m_pagesNavigator->setPrefix(tr("Page: "));
m_pagesNavigator->setMinimumWidth(120);
ui->toolBar->insertWidget(ui->actionNextPage,m_pagesNavigator);
m_simpleScene = new QGraphicsScene(this);
ui->actionShowMessages->setVisible(false);
ui->errorsView->setVisible(false);
connect(m_pagesNavigator,SIGNAL(valueChanged(int)),this,SLOT(slotPageNavigatorChanged(int)));
connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
connect(ui->actionShowMessages, SIGNAL(triggered()), this, SLOT(slotShowErrors()));
m_previewReportWidget = new PreviewReportWidget(report,this);
setCentralWidget(m_previewReportWidget);
layout()->setContentsMargins(1,1,1,1);
connect(m_previewReportWidget,SIGNAL(pageChanged(int)), this,SLOT(slotPageChanged(int)) );
restoreSetting();
}
@ -102,7 +102,7 @@ PreviewReportWindow::~PreviewReportWindow()
{
if (m_ownedSettings)
delete m_settings;
delete m_previewPage;
//delete m_previewPage;
delete ui;
}
@ -111,11 +111,7 @@ void PreviewReportWindow::initPreview(int pagesCount)
m_pagesNavigator->setSuffix(tr(" of %1").arg(pagesCount));
m_pagesNavigator->setMinimum(1);
m_pagesNavigator->setMaximum(pagesCount);
ui->graphicsView->setScene(m_previewPage);
ui->graphicsView->centerOn(0, 0);
ui->graphicsView->scale(0.5,0.5);
m_currentPage=1;
m_pagesNavigator->setValue(m_currentPage);
m_pagesNavigator->setValue(1);
}
void PreviewReportWindow::setSettings(QSettings* value)
@ -129,9 +125,7 @@ void PreviewReportWindow::setSettings(QSettings* value)
void PreviewReportWindow::setErrorMessages(const QStringList &value){
ui->actionShowMessages->setVisible(true);
foreach (QString line, value) {
ui->errorsView->append(line);
}
m_previewReportWidget->setErrorMessages(value);
}
QSettings*PreviewReportWindow::settings()
@ -147,26 +141,20 @@ QSettings*PreviewReportWindow::settings()
void PreviewReportWindow::setReportReader(ItemsReaderIntf::Ptr reader)
{
m_reader=reader;
if (!reader.isNull()){
if (reader->first()) reader->readItem(m_previewPage->pageItem());
int pagesCount = reader->firstLevelItemsCount();
m_previewPage->pageItem()->setItemMode(PreviewMode);
initPreview(pagesCount);
}
// m_reader=reader;
// if (!reader.isNull()){
// if (reader->first()) reader->readItem(m_previewPage->pageItem());
// int pagesCount = reader->firstLevelItemsCount();
// m_previewPage->pageItem()->setItemMode(PreviewMode);
// initPreview(pagesCount);
// }
}
void PreviewReportWindow::setPages(ReportPages pages)
{
m_reportPages = pages;
if (!m_reportPages.isEmpty()){
//m_previewPage->setPageItem(m_reportPages.at(0));
m_previewPage->setPageItems(m_reportPages);
m_changingPage = true;
initPreview(m_reportPages.count());
m_currentPage = 1;
if (pages.at(0)) pages.at(0)->setSelected(true);
m_changingPage = false;
m_previewReportWidget->d_ptr->setPages(pages);
if (!pages.isEmpty()){
initPreview(pages.count());
}
}
@ -215,104 +203,37 @@ void PreviewReportWindow::moveEvent(QMoveEvent* e)
void PreviewReportWindow::slotPrint()
{
QPrinter printer(QPrinter::HighResolution);
QPrintDialog dialog(&printer,QApplication::activeWindow());
if (dialog.exec()==QDialog::Accepted){
if (!m_reportPages.isEmpty())
ReportEnginePrivate::printReport(
m_reportPages,
printer,
PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage())
);
else ReportEnginePrivate::printReport(m_reader,printer);
foreach(PageItemDesignIntf::Ptr pageItem, m_reportPages){
m_previewPage->reactivatePageItem(pageItem);
}
}
m_previewReportWidget->slotPrint();
}
void PreviewReportWindow::slotPriorPage()
{
m_changingPage=true;
if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){
m_currentPage--;
//m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1));
ui->graphicsView->ensureVisible(
calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0
);
m_pagesNavigator->setValue(m_currentPage);
} else {
if (reader() && reader()->prior()){
m_previewPage->removeAllItems();
reader()->readItem(m_previewPage->pageItem());
m_currentPage--;
m_pagesNavigator->setValue(m_currentPage);
}
}
m_changingPage=false;
m_previewReportWidget->slotPriorPage();
}
void PreviewReportWindow::slotNextPage()
{
m_changingPage=true;
if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){
m_currentPage++;
//m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1));
ui->graphicsView->ensureVisible(
calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0
);
m_pagesNavigator->setValue(m_currentPage);
} else {
if (reader() && reader()->next()){
m_previewPage->removeAllItems();
reader()->readItem(m_previewPage->pageItem());
m_currentPage++;
m_pagesNavigator->setValue(m_currentPage);
}
}
m_changingPage=false;
m_previewReportWidget->slotNextPage();
}
void PreviewReportWindow::slotZoomIn()
{
ui->graphicsView->scale(1.2,1.2);
m_previewReportWidget->slotZoomIn();
}
void PreviewReportWindow::slotZoomOut()
{
ui->graphicsView->scale(1/1.2,1/1.2);
m_previewReportWidget->slotZoomOut();
}
void PreviewReportWindow::slotPageNavigatorChanged(int value)
{
if (m_changingPage) return;
m_changingPage = true;
if ((!m_reportPages.isEmpty())&&(m_reportPages.count() >= value)){
m_currentPage = value;
//m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1));
ui->graphicsView->ensureVisible(
calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0
);
} else {
if (reader()){
int direction = (m_currentPage>value)?-1:1;
while (m_currentPage != value){
if (direction == 1) reader()->next();
else reader()->prior();
m_currentPage += direction;
}
m_previewPage->removeAllItems();
reader()->readItem(m_previewPage->pageItem());
m_pagesNavigator->setValue(m_currentPage);
}
}
m_changingPage=false;
m_previewReportWidget->slotPageNavigatorChanged(value);
}
void PreviewReportWindow::slotShowErrors()
{
ui->errorsView->setVisible(ui->actionShowMessages->isChecked());
m_previewReportWidget->setErrorsMesagesVisible(ui->actionShowMessages->isChecked());
}
ItemsReaderIntf *PreviewReportWindow::reader()
@ -320,127 +241,29 @@ ItemsReaderIntf *PreviewReportWindow::reader()
return m_reader.data();
}
bool PreviewReportWindow::pageIsVisible(PageItemDesignIntf::Ptr page)
{
return page->mapToScene(page->rect()).boundingRect().intersects(
ui->graphicsView->mapToScene(ui->graphicsView->viewport()->geometry()).boundingRect()
);
}
QRectF PreviewReportWindow::calcPageShift(PageItemDesignIntf::Ptr page)
{
qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height();
qreal viewHeight = ui->graphicsView->mapToScene(
0,ui->graphicsView->viewport()->height()
).y()-ui->graphicsView->mapToScene(0,0).y();
viewHeight = (pageHeight<viewHeight)?pageHeight:viewHeight;
QRectF pageStartPos = m_reportPages.at(m_currentPage-1)->mapRectToScene(
m_reportPages.at(m_currentPage-1)->rect()
);
return QRectF(0,pageStartPos.y(),0,viewHeight);
}
void PreviewReportWindow::on_actionSaveToFile_triggered()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name"));
if (!fileName.isEmpty()){
QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
foreach (PageItemDesignIntf::Ptr page, m_reportPages){
writer->putItem(page.data());
}
writer->saveToFile(fileName);
}
m_previewReportWidget->slotSaveToFile();
}
void PreviewReportWindow::slotFirstPage()
{
m_changingPage=true;
if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){
m_currentPage=1;
//m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1));
ui->graphicsView->ensureVisible(
calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0
);
m_pagesNavigator->setValue(m_currentPage);
} else {
if (reader() && reader()->prior()){
while (reader()->prior()) {
}
m_previewPage->removeAllItems();
reader()->readItem(m_previewPage->pageItem());
m_currentPage=1;
m_pagesNavigator->setValue(m_currentPage);
}
}
m_changingPage=false;
m_previewReportWidget->slotFirstPage();
}
void PreviewReportWindow::slotLastPage()
{
m_changingPage=true;
if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){
m_currentPage=m_reportPages.count();
//m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1));
ui->graphicsView->ensureVisible(
calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0
);
m_pagesNavigator->setValue(m_currentPage);
} else {
if (reader() && reader()->next()){
m_currentPage++;
while (reader()->next()) {
m_currentPage++;
}
m_previewPage->removeAllItems();
reader()->readItem(m_previewPage->pageItem());
m_pagesNavigator->setValue(m_currentPage);
}
}
m_changingPage=false;
m_previewReportWidget->slotLastPage();
}
void PreviewReportWindow::slotPrintToPDF()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF(*.pdf)" );
qDebug()<<fileName;
if (!fileName.isEmpty()){
QPrinter printer;
printer.setOutputFileName(fileName);
printer.setOutputFormat(QPrinter::PdfFormat);
if (!m_reportPages.isEmpty()){
ReportEnginePrivate::printReport(m_reportPages,printer,PrintRange());
} else {
ReportEnginePrivate::printReport(m_reader,printer);
}
foreach(PageItemDesignIntf::Ptr pageItem, m_reportPages){
m_previewPage->reactivatePageItem(pageItem);
}
}
m_previewReportWidget->slotPrintToPDF();
}
void PreviewReportWindow::slotSliderMoved(int value)
void PreviewReportWindow::slotPageChanged(int pageIndex)
{
if (ui->graphicsView->verticalScrollBar()->minimum()==value){
m_currentPage = 1;
} else if (ui->graphicsView->verticalScrollBar()->maximum()==value){
m_currentPage = m_reportPages.count();
}
if (!pageIsVisible(m_reportPages.at(m_currentPage-1))){
if (value>m_priorScrolValue){
m_currentPage++;
} else {
m_currentPage--;
}
}
m_changingPage = true;
m_pagesNavigator->setValue(m_currentPage);
m_changingPage = false;
m_priorScrolValue = value;
m_pagesNavigator->setValue(pageIndex);
}
}// namespace LimeReport

View File

@ -38,6 +38,7 @@
#include "lrreportrender.h"
#include "serializators/lrstorageintf.h"
#include "serializators/lrxmlreader.h"
#include "lrpreviewreportwidget.h"
namespace LimeReport {
@ -76,25 +77,20 @@ public slots:
void slotFirstPage();
void slotLastPage();
void slotPrintToPDF();
private slots:
void slotSliderMoved(int value);
void slotPageChanged(int pageIndex);
private:
ItemsReaderIntf* reader();
bool pageIsVisible(PageItemDesignIntf::Ptr page);
QRectF calcPageShift(PageItemDesignIntf::Ptr page);
//bool pageIsVisible(PageItemDesignIntf::Ptr page);
//QRectF calcPageShift(PageItemDesignIntf::Ptr page);
private:
Ui::PreviewReportWindow *ui;
QSpinBox* m_pagesNavigator;
QSharedPointer<ItemsReaderIntf> m_reader;
int m_currentPage;
PageDesignIntf* m_previewPage;
QGraphicsScene* m_simpleScene;
ReportPages m_reportPages;
QEventLoop m_eventLoop;
bool m_changingPage;
QSettings* m_settings;
bool m_ownedSettings;
int m_priorScrolValue;
PreviewReportWidget* m_previewReportWidget;
};
} //namespace LimeReport
#endif // LRPREVIEWREPORTWINDOW_H

View File

@ -27,12 +27,6 @@
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QGraphicsView" name="graphicsView"/>
</item>
<item>
<widget class="QTextEdit" name="errorsView"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
@ -41,7 +35,7 @@
<x>0</x>
<y>0</y>
<width>800</width>
<height>20</height>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuView">
@ -232,8 +226,8 @@
</action>
</widget>
<resources>
<include location="report.qrc"/>
<include location="databrowser/lrdatabrowser.qrc"/>
<include location="report.qrc"/>
</resources>
<connections>
<connection>

View File

@ -42,62 +42,9 @@
#include <QFileDialog>
#include <QApplication>
namespace LimeReport {
//GraphicsViewZoom
GraphicsViewZoom::GraphicsViewZoom(QGraphicsView* view)
: QObject(view), m_view(view)
{
m_view->viewport()->installEventFilter(this);
m_view->setMouseTracking(true);
m_modifiers = Qt::ControlModifier;
m_zoomFactorBase = 1.0015;
}
void GraphicsViewZoom::gentleZoom(double factor) {
m_view->scale(factor, factor);
m_view->centerOn(m_targetScenePos);
QPointF delta_viewport_pos = m_targetViewportPos - QPointF(m_view->viewport()->width() / 2.0,
m_view->viewport()->height() / 2.0);
QPointF viewport_center = m_view->mapFromScene(m_targetScenePos) - delta_viewport_pos;
m_view->centerOn(m_view->mapToScene(viewport_center.toPoint()));
emit zoomed();
}
void GraphicsViewZoom::setModifiers(Qt::KeyboardModifiers modifiers) {
m_modifiers = modifiers;
}
void GraphicsViewZoom::setZoomFactorBase(double value) {
m_zoomFactorBase = value;
}
bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event) {
if (event->type() == QEvent::MouseMove) {
QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
QPointF delta = m_targetViewportPos - mouse_event->pos();
if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) {
m_targetViewportPos = mouse_event->pos();
m_targetScenePos = m_view->mapToScene(mouse_event->pos());
}
} else if (event->type() == QEvent::Wheel) {
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
if (QApplication::keyboardModifiers() == m_modifiers) {
if (wheel_event->orientation() == Qt::Vertical) {
double angle = wheel_event->delta();
double factor = qPow(m_zoomFactorBase, angle);
gentleZoom(factor);
return true;
}
}
}
Q_UNUSED(object)
return false;
}
// ReportDesignIntf
//ReportDesignWidget* ReportDesignWidget::m_instance=0;
ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) :
QWidget(parent), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false)
@ -128,7 +75,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow
m_view->scale(0.5,0.5);
//m_instance=this;
//m_view->viewport()->installEventFilter(this);
m_zoomer = new GraphicsViewZoom(m_view);
m_zoomer = new GraphicsViewZoomer(m_view);
#ifdef Q_OS_WIN
m_defaultFont = QFont("Arial",10);
#endif
@ -193,7 +140,9 @@ void ReportDesignWidget::loadState(QSettings* settings)
}
ReportDesignWidget::~ReportDesignWidget()
{ /*m_instance=0;*/}
{
delete m_zoomer;
}
void ReportDesignWidget::setActivePage(PageDesignIntf *page)
{

View File

@ -39,6 +39,7 @@
#include "lrdatasourcemanager.h"
#include "lrcollection.h"
#include "lrreportengine_p.h"
#include "lrgraphicsviewzoom.h"
namespace LimeReport {
@ -47,24 +48,6 @@ class ReportEnginePrivate;
class DataBrowser;
class ReportDesignWindow;
class GraphicsViewZoom : public QObject {
Q_OBJECT
public:
GraphicsViewZoom(QGraphicsView* view);
void gentleZoom(double factor);
void setModifiers(Qt::KeyboardModifiers modifiers);
void setZoomFactorBase(double value);
private:
QGraphicsView* m_view;
Qt::KeyboardModifiers m_modifiers;
double m_zoomFactorBase;
QPointF m_targetScenePos, m_targetViewportPos;
bool eventFilter(QObject* object, QEvent* event);
signals:
void zoomed();
};
class ReportDesignWidget : public QWidget
{
Q_OBJECT
@ -158,7 +141,7 @@ private:
ReportEnginePrivate* m_report;
QGraphicsView *m_view;
QMainWindow *m_mainWindow;
GraphicsViewZoom* m_zoomer;
GraphicsViewZoomer* m_zoomer;
QFont m_defaultFont;
int m_verticalGridStep;
int m_horizontalGridStep;

View File

@ -47,6 +47,8 @@
#include "serializators/lrxmlreader.h"
#include "lrreportrender.h"
#include "lrpreviewreportwindow.h"
#include "lrpreviewreportwidget.h"
#include "lrpreviewreportwidget_p.h"
namespace LimeReport{
@ -312,6 +314,22 @@ void ReportEnginePrivate::previewReport()
}
}
PreviewReportWidget* ReportEnginePrivate::createPreviewWidget(QWidget* parent){
PreviewReportWidget* widget = new PreviewReportWidget(this, parent);
try{
dataManager()->setDesignTime(false);
ReportPages pages = renderToPages();
dataManager()->setDesignTime(true);
if (pages.count()>0)
widget->d_ptr->setPages(pages);
} catch (ReportError &exception){
saveError(exception.what());
showError(exception.what());
}
return widget;
}
PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){
PageDesignIntf* result = 0;
try {
@ -595,6 +613,12 @@ void ReportEngine::designReport()
d->designReport();
}
PreviewReportWidget* ReportEngine::createPreviewWidget(QWidget *parent)
{
Q_D(ReportEngine);
return d->createPreviewWidget(parent);
}
void ReportEngine::setShowProgressDialog(bool value)
{
Q_D(ReportEngine);

View File

@ -37,6 +37,7 @@
#include "lrglobal.h"
#include "lrdatasourcemanagerintf.h"
#include "lrscriptenginemanagerintf.h"
#include "lrpreviewreportwidget.h"
class QPrinter;
@ -75,7 +76,6 @@ public:
void setShowProgressDialog(bool value);
IDataSourceManager* dataManager();
IScriptEngineManager* scriptManager();
bool loadFromFile(const QString& fileName);
bool loadFromByteArray(QByteArray *data);
bool loadFromString(const QString& data);
@ -88,6 +88,7 @@ public:
void setCurrentReportsDir(const QString& dirName);
void setReportName(const QString& name);
QString reportName();
PreviewReportWidget *createPreviewWidget(QWidget *parent = 0);
signals:
void renderStarted();
void renderFinished();

View File

@ -55,6 +55,7 @@ class ReportEnginePrivate : public QObject, public ICollectionContainer
Q_DECLARE_PUBLIC(ReportEngine)
Q_PROPERTY(ACollectionProperty pages READ fakeCollectionReader())
Q_PROPERTY(QObject* datasourcesManager READ dataManager())
friend class PreviewReportWidget;
public:
static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer);
static void printReport(ReportPages pages, QPrinter &printer, const PrintRange &printRange);
@ -93,7 +94,6 @@ public:
bool isNeedToSave();
QString lastError();
ReportEngine * q_ptr;
PageDesignIntf *createPreviewScene(QObject *parent);
void emitSaveReport();
bool emitLoadReport();
bool isSaved();
@ -102,6 +102,8 @@ public:
void setReportName(const QString& reportName){ m_reportName=reportName;}
QString reportName(){ return m_reportName;}
bool hasActivePreview(){return m_activePreview;}
PageDesignIntf *createPreviewScene(QObject *parent);
PreviewReportWidget *createPreviewWidget(QWidget *parent);
signals:
void pagesLoadFinished();
void datasourceCollectionLoadFinished(const QString& collectionName);