mirror of
https://github.com/python-LimeReport/LimeReport.git
synced 2025-10-08 21:53:14 +03:00
Optionally monitor changes to files loaded with ReportEngine::loadFromFile()
When using the designer as a stand alone application and the renderer/preview in the user application, the preview window would have to be closed and opened again every time a change was made to the report. This change adds an optional QFileSystemWatcher to monitor changes to the report file and automatically refreshes the preview in the application when it is saved. It may be turned on using the new parameter to ReportEngine::loadFromFile(). If the preview window is open in the application and the file name changes or the file is removed, inform the user and close the preview window.
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#include <QMessageBox>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QFileSystemWatcher>
|
||||
|
||||
#include "time.h"
|
||||
|
||||
@@ -59,13 +60,15 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) :
|
||||
m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false),
|
||||
m_showProgressDialog(true), m_reportName(""), m_activePreview(0),
|
||||
m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")),
|
||||
m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy")
|
||||
m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"),
|
||||
m_fileWatcher( new QFileSystemWatcher( this ) )
|
||||
{
|
||||
m_datasources = new DataSourceManager(this);
|
||||
m_datasources->setReportSettings(&m_reportSettings);
|
||||
m_scriptEngineContext = new ScriptEngineContext(this);
|
||||
m_datasources->setObjectName("datasources");
|
||||
connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString)));
|
||||
connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &)));
|
||||
}
|
||||
|
||||
ReportEnginePrivate::~ReportEnginePrivate()
|
||||
@@ -457,6 +460,63 @@ void ReportEnginePrivate::setCurrentReportsDir(const QString &dirName)
|
||||
m_reportsDir = dirName;
|
||||
}
|
||||
|
||||
bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName)
|
||||
{
|
||||
PreviewReportWindow *currentPreview = qobject_cast<PreviewReportWindow *>(m_activePreview);
|
||||
|
||||
if (!QFile::exists(fileName))
|
||||
{
|
||||
if ( hasActivePreview() )
|
||||
{
|
||||
QMessageBox::information( NULL,
|
||||
tr( "Report File Change" ),
|
||||
tr( "The report file \"%1\" has changed names or been deleted.\n\nThis preview is no longer valid." ).arg( fileName )
|
||||
);
|
||||
|
||||
clearReport();
|
||||
|
||||
currentPreview->close();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
clearReport();
|
||||
|
||||
ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName);
|
||||
reader->setPassPhrase(m_passPhrase);
|
||||
if (reader->first()){
|
||||
if (reader->readItem(this)){
|
||||
m_fileName=fileName;
|
||||
QFileInfo fi(fileName);
|
||||
m_reportName = fi.fileName();
|
||||
|
||||
QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db";
|
||||
if (QFile::exists(dbSettingFileName)){
|
||||
QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat);
|
||||
foreach (ConnectionDesc* connection, dataManager()->conections()) {
|
||||
if (!connection->keepDBCredentials()){
|
||||
dbcredentals.beginGroup(connection->name());
|
||||
connection->setUserName(dbcredentals.value("user").toString());
|
||||
connection->setPassword(dbcredentals.value("password").toString());
|
||||
dbcredentals.endGroup();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dataManager()->connectAutoConnections();
|
||||
|
||||
if ( hasActivePreview() )
|
||||
{
|
||||
currentPreview->reloadPreview();
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
m_lastError = reader->lastError();
|
||||
return false;
|
||||
}
|
||||
|
||||
void ReportEnginePrivate::cancelRender()
|
||||
{
|
||||
if (m_reportRender)
|
||||
@@ -509,39 +569,20 @@ QSettings*ReportEnginePrivate::settings()
|
||||
}
|
||||
}
|
||||
|
||||
bool ReportEnginePrivate::loadFromFile(const QString &fileName)
|
||||
bool ReportEnginePrivate::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange)
|
||||
{
|
||||
if (!QFile::exists(fileName)) return false;
|
||||
// only watch one file at a time
|
||||
if ( !m_fileWatcher->files().isEmpty() )
|
||||
{
|
||||
m_fileWatcher->removePaths( m_fileWatcher->files() );
|
||||
}
|
||||
|
||||
clearReport();
|
||||
if ( autoLoadPreviewOnChange )
|
||||
{
|
||||
m_fileWatcher->addPath( fileName );
|
||||
}
|
||||
|
||||
ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName);
|
||||
reader->setPassPhrase(m_passPhrase);
|
||||
if (reader->first()){
|
||||
if (reader->readItem(this)){
|
||||
m_fileName=fileName;
|
||||
QFileInfo fi(fileName);
|
||||
m_reportName = fi.fileName();
|
||||
|
||||
QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db";
|
||||
if (QFile::exists(dbSettingFileName)){
|
||||
QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat);
|
||||
foreach (ConnectionDesc* connection, dataManager()->conections()) {
|
||||
if (!connection->keepDBCredentials()){
|
||||
dbcredentals.beginGroup(connection->name());
|
||||
connection->setUserName(dbcredentals.value("user").toString());
|
||||
connection->setPassword(dbcredentals.value("password").toString());
|
||||
dbcredentals.endGroup();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dataManager()->connectAutoConnections();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
m_lastError = reader->lastError();
|
||||
return false;
|
||||
return slotLoadFromFile( fileName );
|
||||
}
|
||||
|
||||
bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &name){
|
||||
@@ -880,10 +921,10 @@ IScriptEngineManager* ReportEngine::scriptManager()
|
||||
return d->scriptManagerIntf();
|
||||
}
|
||||
|
||||
bool ReportEngine::loadFromFile(const QString &fileName)
|
||||
bool ReportEngine::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange)
|
||||
{
|
||||
Q_D(ReportEngine);
|
||||
return d->loadFromFile(fileName);
|
||||
return d->loadFromFile(fileName, autoLoadPreviewOnChange);
|
||||
}
|
||||
|
||||
bool ReportEngine::loadFromByteArray(QByteArray* data){
|
||||
|
Reference in New Issue
Block a user