/***************************************************************************
* 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 "lrscriptbrowser.h"
#include "ui_lrscriptbrowser.h"
#ifdef HAVE_UI_LOADER
#include
#include
#endif
#include
namespace LimeReport {
ScriptBrowser::ScriptBrowser(QWidget* parent): QWidget(parent), ui(new Ui::ScriptBrowser)
{
ui->setupUi(this);
int margin = Const::DOCKWIDGET_MARGINS;
ui->verticalLayout->setContentsMargins(margin, margin, margin, margin);
#ifndef HAVE_UI_LOADER
ui->tpDialogs->setVisible(false);
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tpDialogs));
#endif
}
ScriptBrowser::~ScriptBrowser() { delete ui; }
void ScriptBrowser::setReportEditor(ReportDesignWidget* designerWidget)
{
m_designerWidget = designerWidget;
connect(m_designerWidget, SIGNAL(cleared()), this, SLOT(slotClear()));
connect(m_designerWidget, SIGNAL(loadFinished()), this, SLOT(slotUpdate()));
#ifdef HAVE_UI_LOADER
connect(m_designerWidget->scriptContext(), SIGNAL(dialogAdded(QString)), this,
SLOT(slotDialogAdded(QString)));
#endif
updateFunctionTree();
}
void ScriptBrowser::updateFunctionTree()
{
ui->twFunctions->clear();
ScriptEngineManager* sm = reportEditor()->scriptManager();
QMap categ;
foreach (ScriptFunctionDesc fd, sm->functionsDescribers()) {
QString functionCategory = (fd.category != "") ? fd.category : tr("NO CATEGORY");
if (categ.contains(functionCategory)) {
QTreeWidgetItem* item
= new QTreeWidgetItem(categ.value(fd.category), QStringList(fd.name));
item->setIcon(0, QIcon(":/report/images/function"));
} else {
QTreeWidgetItem* categItem
= new QTreeWidgetItem(ui->twFunctions, QStringList(functionCategory));
categItem->setIcon(0, QIcon(":/report/images/folder"));
categ.insert(functionCategory, categItem);
QTreeWidgetItem* item = new QTreeWidgetItem(categItem, QStringList(fd.name));
item->setIcon(0, QIcon(":/report/images/function"));
}
}
}
#ifdef HAVE_UI_LOADER
void ScriptBrowser::fillProperties(QTreeWidgetItem* objectItem, QObject* item)
{
for (int i = 0; i < item->metaObject()->propertyCount(); ++i) {
QStringList row;
row << item->metaObject()->property(i).typeName() << item->metaObject()->property(i).name();
/*QTreeWidgetItem* propItem = */ new QTreeWidgetItem(objectItem, row);
}
}
void ScriptBrowser::fillDialog(QTreeWidgetItem* dialogItem, const QString& description)
{
QUiLoader loader;
QByteArray baDesc = description.toUtf8();
QBuffer buff(&baDesc);
buff.open(QIODevice::ReadOnly);
QDialog* dialog = dynamic_cast(loader.load(&buff));
if (dialog) {
foreach (QObject* child, dialog->children()) {
if (!child->objectName().isEmpty()) {
QStringList row;
row << child->metaObject()->className() << child->objectName();
QTreeWidgetItem* item = new QTreeWidgetItem(dialogItem, row);
item->setIcon(0, QIcon(":/scriptbrowser/images/item"));
fillProperties(item, child);
}
}
delete dialog;
}
}
void ScriptBrowser::updateDialogsTree()
{
ui->twDialogs->clear();
ScriptEngineContext* sc = reportEditor()->scriptContext();
foreach (DialogDescriber::Ptr dc, sc->dialogDescribers()) {
QTreeWidgetItem* dialogItem = new QTreeWidgetItem(ui->twDialogs, QStringList(dc->name()));
dialogItem->setIcon(0, QIcon(":/scriptbrowser/images/dialog"));
fillDialog(dialogItem, dc->description());
}
}
#endif
void ScriptBrowser::slotClear()
{
ui->twDialogs->clear();
ui->twFunctions->clear();
}
void ScriptBrowser::slotUpdate()
{
#ifdef HAVE_UI_LOADER
updateDialogsTree();
#endif
updateFunctionTree();
}
#ifdef HAVE_UI_LOADER
void ScriptBrowser::slotDialogAdded(QString) { updateDialogsTree(); }
void ScriptBrowser::on_tbAddDialog_clicked()
{
QFileDialog fileDialog(this);
if (fileDialog.exec() == QDialog::Accepted) {
QStringList fileNames = fileDialog.selectedFiles();
QUiLoader loader;
if (!fileNames.isEmpty()) {
foreach (QString fileName, fileNames) {
QFile file(fileName);
file.open(QIODevice::ReadOnly);
if (file.isOpen()) {
QWidget* widget = loader.load(&file);
QDialog* dialog = dynamic_cast(widget);
if (dialog) {
if (!m_designerWidget->scriptContext()->containsDialog(
dialog->objectName())) {
file.seek(0);
m_designerWidget->scriptContext()->addDialog(dialog->objectName(),
file.readAll());
// updateDialogsTree();
} else {
QMessageBox::critical(this, tr("Error"),
tr("Dialog with name: %1 already exists")
.arg(dialog->objectName()));
}
} else {
if (widget)
QMessageBox::critical(
this, tr("Error"),
tr("ui file must cointain QDialog instead QWidget or "
"QMainWindow"));
else
QMessageBox::critical(this, tr("Error"), tr("wrong file format"));
}
if (widget)
delete widget;
}
}
}
}
}
void ScriptBrowser::on_tbRunDialog_clicked()
{
if (ui->twDialogs->currentItem() && ui->twDialogs->currentItem()->parent() == 0) {
m_designerWidget->scriptContext()->previewDialog(ui->twDialogs->currentItem()->text(0));
}
}
void ScriptBrowser::on_tbDeleteDialog_clicked()
{
if (ui->twDialogs->currentItem() && ui->twDialogs->currentItem()->parent() == 0) {
m_designerWidget->scriptContext()->deleteDialog(ui->twDialogs->currentItem()->text(0));
updateDialogsTree();
}
}
#endif
} // namespace LimeReport