/*************************************************************************** * This file is part of the Lime Report project * * Copyright (C) 2021 by Alexander Arin * * arin_a@bk.ru * * * ** GNU General Public License Usage ** * * * This library is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ** GNU Lesser General Public License ** * * * 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 3 of the * * License, or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public * * License along with this library. * * If not, see . * * * * 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 General Public License for more details. * ****************************************************************************/ #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" #else # define EASY_BLOCK(...) # define EASY_END_BLOCK # define EASY_PROFILER_ENABLE #endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_progressDialog(0), m_customers(0), m_orders(0) { ui->setupUi(this); report = new LimeReport::ReportEngine(this); connect(report, SIGNAL(renderStarted()), this, SLOT(renderStarted())); connect(report, SIGNAL(renderPageFinished(int)), this, SLOT(renderPageFinished(int))); connect(report, SIGNAL(renderFinished()), this, SLOT(renderFinished())); QFile dbFile(QApplication::applicationDirPath()+"/demo_reports/northwind.db"); if (dbFile.exists()){ m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(dbFile.fileName()); if (m_db.open()){ QSqlQueryModel* customersModel = new QSqlQueryModel(); customersModel->setQuery("select * from customers", m_db); report->dataManager()->addModel("external_customers_data",customersModel,true); QSqlQueryModel* ordersModel = new QSqlQueryModel(); ordersModel->setQuery("Select * from orders",m_db); report->dataManager()->addModel("external_orders_data",ordersModel,true); m_customers = new QSqlQuery("Select * from customers limit 10",m_db); m_customers->first(); m_orders = new QSqlQuery(m_db); m_orders->prepare("Select * from orders where CustomerID = :id"); int index = m_customers->record().indexOf("CustomerID"); m_orders->bindValue(":id",m_customers->value(index)); m_orders->exec(); } } LimeReport::ICallbackDatasource * callbackDatasource = report->dataManager()->createCallbackDatasource("master"); connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), this, SLOT(slotGetCallbackData(LimeReport::CallbackInfo,QVariant&))); connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)), this, SLOT(slotChangePos(const LimeReport::CallbackInfo::ChangePosType&,bool&))); callbackDatasource = report->dataManager()->createCallbackDatasource("detail"); connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), this, SLOT(slotGetCallbackChildData(LimeReport::CallbackInfo,QVariant&))); connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)), this, SLOT(slotChangeChildPos(const LimeReport::CallbackInfo::ChangePosType&,bool&))); callbackDatasource = report->dataManager()->createCallbackDatasource("oneSlotDS"); connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), this, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); QStringList simpleData; simpleData << "value1" << "value2" << "value3"; QStringListModel* stringListModel = new QStringListModel(); stringListModel->setStringList(simpleData); report->dataManager()->addModel("string_list",stringListModel,true); QStringList strList; strList<<"value1"<<"value2"; //QScriptValue value = qScriptValueFromSequence(report->scriptManager()->scriptEngine(),strList); //report->scriptManager()->scriptEngine()->globalObject().setProperty("test_list",value); } MainWindow::~MainWindow() { delete ui; delete m_customers; delete m_orders; } void MainWindow::on_pushButton_clicked() { EASY_PROFILER_ENABLE; EASY_BLOCK("design report"); report->dataManager()->clearUserVariables(); if (!ui->leVariableName->text().isEmpty() && !ui->leVariableValue->text().isEmpty()){ report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } report->setShowProgressDialog(false); report->designReport(); EASY_END_BLOCK; #ifdef BUILD_WITH_EASY_PROFILER profiler::dumpBlocksToFile("test.prof"); #endif } void MainWindow::on_pushButton_2_clicked() { QString fileName = QFileDialog::getOpenFileName(this,"Select report file",QApplication::applicationDirPath()+"/demo_reports/","*.lrxml"); if (!fileName.isEmpty()) { EASY_PROFILER_ENABLE; EASY_BLOCK("Load file"); report->loadFromFile(fileName); EASY_END_BLOCK; EASY_BLOCK("Set report variable"); if (!ui->leVariableName->text().isEmpty() && !ui->leVariableValue->text().isEmpty()){ report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } EASY_END_BLOCK; #ifdef BUILD_WITH_EASY_PROFILER profiler::dumpBlocksToFile("test.prof"); #endif // QPrinter* printer = new QPrinter; // QPrintDialog dialog(printer); // if (dialog.exec()){ // QMap printers; // printers.insert("default",printer); // report->printReport(printers); // } report->setShowProgressDialog(true); report->previewReport(); } } void MainWindow::renderStarted() { if (report->isShowProgressDialog()){ m_currentPage = 0; m_progressDialog = new QProgressDialog(tr("Start render"),tr("Cancel"),0,0,this); //m_progressDialog->setWindowModality(Qt::WindowModal); connect(m_progressDialog, SIGNAL(canceled()), report, SLOT(cancelRender())); QApplication::processEvents(); m_progressDialog->show(); } } void MainWindow::renderPageFinished(int renderedPageCount) { if (m_progressDialog){ m_progressDialog->setLabelText(QString::number(renderedPageCount)+tr(" page rendered")); m_progressDialog->setValue(renderedPageCount); } } void MainWindow::renderFinished() { if (m_progressDialog){ m_progressDialog->close(); delete m_progressDialog; } m_progressDialog = 0; } void MainWindow::prepareData(QSqlQuery* ds, LimeReport::CallbackInfo info, QVariant &data) { switch (info.dataType) { case LimeReport::CallbackInfo::ColumnCount: data = ds->record().count(); break; case LimeReport::CallbackInfo::IsEmpty: data = !ds->first(); break; case LimeReport::CallbackInfo::HasNext: data = ds->next(); ds->previous(); break; case LimeReport::CallbackInfo::ColumnHeaderData: if (info.index < ds->record().count()) data = ds->record().fieldName(info.index); break; case LimeReport::CallbackInfo::ColumnData: data = ds->value(ds->record().indexOf(info.columnName)); break; default: break; } } void MainWindow::slotGetCallbackData(LimeReport::CallbackInfo info, QVariant &data) { if (!m_customers) return; prepareData(m_customers, info, data); } void MainWindow::slotChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result) { QSqlQuery* ds = m_customers; if (!ds) return; if (type == LimeReport::CallbackInfo::First) {result = ds->first();} else {result = ds->next();} if (result){ m_orders->bindValue(":id",m_customers->value(m_customers->record().indexOf("CustomerID"))); m_orders->exec(); } } void MainWindow::slotGetCallbackChildData(LimeReport::CallbackInfo info, QVariant &data) { if (!m_orders) return ; prepareData(m_orders, info, data); } void MainWindow::slotChangeChildPos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result) { QSqlQuery* ds = m_orders; if (!ds) return; if (type == LimeReport::CallbackInfo::First) result = ds->first(); else result = ds->next(); } void MainWindow::slotOneSlotDS(LimeReport::CallbackInfo info, QVariant &data) { QStringList columns; columns << "Name" << "Value" << "Image"; switch (info.dataType) { case LimeReport::CallbackInfo::RowCount: data = 4; break; case LimeReport::CallbackInfo::ColumnCount: data = columns.size(); break; // case LimeReport::CallbackInfo::IsEmpty: // data = false; // break; case LimeReport::CallbackInfo::ColumnHeaderData: { data = columns.at(info.index); break; } case LimeReport::CallbackInfo::ColumnData: if (info.columnName == "Image") data = QImage(":/report//images/logo32"); else { data = info.columnName+" "+QString::number(info.index); } break; default: break; } }