diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp
index 751723515..656ffd315 100644
--- a/sources/dataBase/projectdatabase.cpp
+++ b/sources/dataBase/projectdatabase.cpp
@@ -176,12 +176,16 @@ bool projectDataBase::createDataBase(const QString &connection_name, const QStri
}
createElementNomenclatureView();
+ createSummaryView();
}
updateDB();
return true;
}
+/**
+ * @brief projectDataBase::createElementNomenclatureView
+ */
void projectDataBase::createElementNomenclatureView()
{
QString create_view ("CREATE VIEW element_nomenclature_view AS SELECT "
@@ -216,6 +220,29 @@ void projectDataBase::createElementNomenclatureView()
}
}
+/**
+ * @brief projectDataBase::createSummaryView
+ */
+void projectDataBase::createSummaryView()
+{
+ QString create_view ("CREATE VIEW project_summary_view AS SELECT "
+ "di.title AS title,"
+ "di.author AS author,"
+ "di.folio AS folio,"
+ "di.plant AS plant,"
+ "di.locmach AS locmach,"
+ "di.indexrev AS indexrev,"
+ "di.date AS date,"
+ "d.pos AS pos"
+ " FROM diagram_info di, diagram d"
+ " WHERE di.diagram_uuid = d.uuid");
+
+ QSqlQuery query(m_data_base);
+ if (!query.exec(create_view)) {
+ qDebug() << query.lastError();
+ }
+}
+
void projectDataBase::populateDiagramTable()
{
QSqlQuery query_(m_data_base);
diff --git a/sources/dataBase/projectdatabase.h b/sources/dataBase/projectdatabase.h
index 9df219b29..3f62348ab 100644
--- a/sources/dataBase/projectdatabase.h
+++ b/sources/dataBase/projectdatabase.h
@@ -55,6 +55,7 @@ class projectDataBase : public QObject
private:
bool createDataBase(const QString &connection_name= QString(), const QString &name = QString());
void createElementNomenclatureView();
+ void createSummaryView();
void populateDiagramTable();
void populateElementTable();
void populateElementInfoTable();
diff --git a/sources/dataBase/ui/elementquerywidget.h b/sources/dataBase/ui/elementquerywidget.h
index 4a5e4a38b..80cd315b9 100644
--- a/sources/dataBase/ui/elementquerywidget.h
+++ b/sources/dataBase/ui/elementquerywidget.h
@@ -44,6 +44,8 @@ class ElementQueryWidget : public QWidget
QString queryStr() const;
QStringList header() const;
+ static QString modelIdentifier() {return "nomenclature";}
+
private slots:
void on_m_up_pb_clicked();
void on_m_add_pb_clicked();
diff --git a/sources/dataBase/ui/summaryquerywidget.cpp b/sources/dataBase/ui/summaryquerywidget.cpp
new file mode 100644
index 000000000..6a4ab8c71
--- /dev/null
+++ b/sources/dataBase/ui/summaryquerywidget.cpp
@@ -0,0 +1,217 @@
+/*
+ Copyright 2006-2020 The QElectroTech Team
+ This file is part of QElectroTech.
+
+ QElectroTech 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 2 of the License, or
+ (at your option) any later version.
+
+ QElectroTech 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.
+
+ You should have received a copy of the GNU General Public License
+ along with QElectroTech. If not, see .
+*/
+#include "summaryquerywidget.h"
+#include "ui_summaryquerywidget.h"
+
+#include "qetapp.h"
+
+#include
+
+/**
+ * @brief SummaryQueryWidget::SummaryQueryWidget
+ * @param parent
+ */
+SummaryQueryWidget::SummaryQueryWidget(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::SummaryQueryWidget)
+{
+ ui->setupUi(this);
+ ui->m_config_gb->setDisabled(true);
+
+ setUpItems();
+ fillSavedQuery();
+}
+
+/**
+ * @brief SummaryQueryWidget::~SummaryQueryWidget
+ */
+SummaryQueryWidget::~SummaryQueryWidget()
+{
+ delete ui;
+}
+
+/**
+ * @brief SummaryQueryWidget::queryStr
+ * @return
+ */
+QString SummaryQueryWidget::queryStr() const
+{
+ //User define is own query
+ if (ui->m_edit_sql_query_cb->isChecked()) {
+ return ui->m_user_query_le->text();
+ }
+
+ //Made a string list with the colomns (keys) choosen by the user
+ QStringList keys = selectedKeys();
+
+ QString select ="SELECT ";
+
+ QString column;
+ bool first = true;
+ for (auto key: keys) {
+ if (first) {
+ first = false;
+ } else {
+ column += ", ";
+ }
+ column += key;
+ }
+
+ QString from = " FROM project_summary_view";
+
+ QString q(select + column + from);
+ return q;
+}
+
+/**
+ * @brief SummaryQueryWidget::setUpItems
+ */
+void SummaryQueryWidget::setUpItems()
+{
+ for (auto key : QETApp::diagramInfoKeys())
+ {
+ if (key == "filename" || key == "display_folio") {
+ continue;
+ }
+ auto item = new QListWidgetItem(QETApp::diagramTranslatedInfoKey(key), ui->m_available_list);
+ item->setData(Qt::UserRole, key);
+ m_items_list << item;
+ }
+ auto item = new QListWidgetItem(tr("Position"), ui->m_available_list);
+ item->setData(Qt::UserRole, "pos");
+ m_items_list << item;
+}
+
+void SummaryQueryWidget::fillSavedQuery()
+{
+
+}
+
+/**
+ * @brief SummaryQueryWidget::updateQueryLine
+ */
+void SummaryQueryWidget::updateQueryLine() {
+ ui->m_user_query_le->setText(queryStr());
+}
+
+/**
+ * @brief SummaryQueryWidget::selectedKeys
+ * @return
+ */
+QStringList SummaryQueryWidget::selectedKeys() const
+{
+ //Made a string list with the colomns (keys) choosen by the user
+ QStringList keys;
+ int row = 0;
+ while (auto *item = ui->m_choosen_list->item(row))
+ {
+ keys.append(item->data(Qt::UserRole).toString());
+ ++row;
+ }
+
+ return keys;
+}
+void SummaryQueryWidget::on_m_available_list_itemDoubleClicked(QListWidgetItem *item)
+{
+ Q_UNUSED(item)
+ on_m_add_pb_clicked();
+}
+
+/**
+ * @brief SummaryQueryWidget::on_m_choosen_list_itemDoubleClicked
+ * @param item
+ */
+void SummaryQueryWidget::on_m_choosen_list_itemDoubleClicked(QListWidgetItem *item)
+{
+ Q_UNUSED(item)
+ on_m_remove_pb_clicked();
+}
+
+/**
+ * @brief SummaryQueryWidget::on_m_up_pb_clicked
+ */
+void SummaryQueryWidget::on_m_up_pb_clicked()
+{
+ auto row = ui->m_choosen_list->currentRow();
+ if(row <= 0) {
+ return;
+ }
+
+ auto *item = ui->m_choosen_list->takeItem(row);
+ ui->m_choosen_list->insertItem(row-1, item);
+ ui->m_choosen_list->setCurrentItem(item);
+
+ updateQueryLine();
+}
+
+/**
+ * @brief SummaryQueryWidget::on_m_add_pb_clicked
+ */
+void SummaryQueryWidget::on_m_add_pb_clicked()
+{
+ if (auto *item = ui->m_available_list->takeItem(ui->m_available_list->currentRow())) {
+ ui->m_choosen_list->addItem(item);
+ }
+
+ updateQueryLine();
+}
+
+/**
+ * @brief SummaryQueryWidget::on_m_remove_pb_clicked
+ */
+void SummaryQueryWidget::on_m_remove_pb_clicked()
+{
+ if (auto *item = ui->m_choosen_list->takeItem(ui->m_choosen_list->currentRow())) {
+ ui->m_available_list->addItem(item);
+ }
+
+ updateQueryLine();
+}
+
+/**
+ * @brief SummaryQueryWidget::on_m_down_pb_clicked
+ */
+void SummaryQueryWidget::on_m_down_pb_clicked()
+{
+ auto row = ui->m_choosen_list->currentRow();
+ if (row == -1) {
+ return;
+ }
+
+ auto *item = ui->m_choosen_list->takeItem(row);
+ ui->m_choosen_list->insertItem(row+1, item);
+ ui->m_choosen_list->setCurrentItem(item);
+
+ updateQueryLine();
+}
+
+void SummaryQueryWidget::on_m_edit_sql_query_cb_clicked()
+{
+ ui->m_user_query_le->setEnabled(ui->m_edit_sql_query_cb->isChecked());
+ ui->m_info_widget->setDisabled(ui->m_edit_sql_query_cb->isChecked());
+
+ if (ui->m_edit_sql_query_cb->isChecked() && !m_custom_query.isEmpty())
+ {
+ ui->m_user_query_le->setText(m_custom_query);
+ }
+ else if (!ui->m_edit_sql_query_cb->isChecked())
+ {
+ m_custom_query = ui->m_user_query_le->text();
+ updateQueryLine();
+ }
+}
diff --git a/sources/dataBase/ui/summaryquerywidget.h b/sources/dataBase/ui/summaryquerywidget.h
new file mode 100644
index 000000000..d6263afc6
--- /dev/null
+++ b/sources/dataBase/ui/summaryquerywidget.h
@@ -0,0 +1,61 @@
+/*
+ Copyright 2006-2020 The QElectroTech Team
+ This file is part of QElectroTech.
+
+ QElectroTech 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 2 of the License, or
+ (at your option) any later version.
+
+ QElectroTech 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.
+
+ You should have received a copy of the GNU General Public License
+ along with QElectroTech. If not, see .
+*/
+#ifndef SUMMARYQUERYWIDGET_H
+#define SUMMARYQUERYWIDGET_H
+
+#include
+
+class QListWidgetItem;
+
+namespace Ui {
+class SummaryQueryWidget;
+}
+
+class SummaryQueryWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SummaryQueryWidget(QWidget *parent = nullptr);
+ ~SummaryQueryWidget();
+
+ static QString modelIdentifier() {return "summary";}
+ QString queryStr() const;
+
+ private:
+ void setUpItems();
+ void fillSavedQuery();
+ void updateQueryLine();
+ QStringList selectedKeys() const;
+
+ private slots:
+ void on_m_available_list_itemDoubleClicked(QListWidgetItem *item);
+ void on_m_choosen_list_itemDoubleClicked(QListWidgetItem *item);
+ void on_m_up_pb_clicked();
+ void on_m_add_pb_clicked();
+ void on_m_remove_pb_clicked();
+ void on_m_down_pb_clicked();
+ void on_m_edit_sql_query_cb_clicked();
+
+ private:
+ Ui::SummaryQueryWidget *ui;
+ QList m_items_list;
+ QString m_custom_query;
+};
+
+#endif // SUMMARYQUERYWIDGET_H
diff --git a/sources/dataBase/ui/summaryquerywidget.ui b/sources/dataBase/ui/summaryquerywidget.ui
new file mode 100644
index 000000000..b2ec8d29d
--- /dev/null
+++ b/sources/dataBase/ui/summaryquerywidget.ui
@@ -0,0 +1,176 @@
+
+
+ SummaryQueryWidget
+
+
+
+ 0
+ 0
+ 347
+ 277
+
+
+
+ Form
+
+
+ -
+
+
+
-
+
+
+ -
+
+
+ Informations disponibles
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ -
+
+
+ Information à afficher
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+
+
+
+
+ :/ico/16x16/go-up.png:/ico/16x16/go-up.png
+
+
+
+ -
+
+
+
+
+
+
+ :/ico/16x16/list-add.png:/ico/16x16/list-add.png
+
+
+
+ -
+
+
+
+
+
+
+ :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png
+
+
+
+ -
+
+
+
+
+
+
+ :/ico/16x16/go-down.png:/ico/16x16/go-down.png
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Configuration
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
+
+ Requête SQL :
+
+
+
+ -
+
+
+ false
+
+
+
+
+
+
+
+
+
+ ConfigSaveLoaderWidget
+ QGroupBox
+
+ 1
+
+
+
+
+
+
+
diff --git a/sources/factory/propertieseditorfactory.cpp b/sources/factory/propertieseditorfactory.cpp
index c9e3801cf..6966fec09 100644
--- a/sources/factory/propertieseditorfactory.cpp
+++ b/sources/factory/propertieseditorfactory.cpp
@@ -32,8 +32,8 @@
#include "elementtextitemgroup.h"
#include "qetgraphicstableitem.h"
#include "graphicstablepropertieseditor.h"
-#include "nomenclaturemodel.h"
-#include "nomenclaturemodelpropertieswidget.h"
+#include "projectdbmodelpropertieswidget.h"
+#include "projectdbmodel.h"
/**
* @brief PropertiesEditorFactory::propertiesEditor
@@ -48,15 +48,15 @@ PropertiesEditorWidget *PropertiesEditorFactory::propertiesEditor(QAbstractItemM
Q_UNUSED(editor)
Q_UNUSED(parent)
- if (auto m = static_cast(model))
+ if (auto m = static_cast(model))
{
if (editor &&
- editor->metaObject()->className() == NomenclatureModelPropertiesWidget::staticMetaObject.className())
+ editor->metaObject()->className() == ProjectDBModelPropertiesWidget::staticMetaObject.className())
{
- static_cast(editor)->setModel(m);
+ static_cast(editor)->setModel(m);
return editor;
}
- return new NomenclatureModelPropertiesWidget(m, parent);
+ return new ProjectDBModelPropertiesWidget(m, parent);
}
return nullptr;
}
diff --git a/sources/factory/qetgraphicstablefactory.cpp b/sources/factory/qetgraphicstablefactory.cpp
index 7c55a848d..da768584a 100644
--- a/sources/factory/qetgraphicstablefactory.cpp
+++ b/sources/factory/qetgraphicstablefactory.cpp
@@ -17,12 +17,14 @@
*/
#include "qetgraphicstablefactory.h"
#include "qetgraphicstableitem.h"
-#include "nomenclaturemodel.h"
+#include "projectdbmodel.h"
#include "elementquerywidget.h"
#include "diagram.h"
#include "qetgraphicsheaderitem.h"
#include "addtabledialog.h"
#include "qetutils.h"
+#include "elementquerywidget.h"
+#include "summaryquerywidget.h"
#include
@@ -33,48 +35,72 @@ QetGraphicsTableFactory::QetGraphicsTableFactory()
/**
* @brief QetGraphicsTableFactory::createAndAddNomenclature
- * Create a nomenclature table, open a dialog for ask to user the config of the table,
+ * Open a dialog for ask user the config of the table ,create a nomenclature table
* and add it to diagram @diagram;
* @param diagram
*/
void QetGraphicsTableFactory::createAndAddNomenclature(Diagram *diagram)
{
- QScopedPointer d(new AddTableDialog(diagram->views().first()));
+ QScopedPointer d(new AddTableDialog(new ElementQueryWidget(), diagram->views().first()));
d->setWindowTitle(QObject::tr("Ajouter une nomenclature"));
- if (d->exec())
+ if (d->exec()) {
+ create(diagram, d.data());
+ }
+}
+
+/**
+ * @brief QetGraphicsTableFactory::createAndAddSummary
+ * Open a dialog for ask user the config of the table ,create a summary table
+ * and add it to diagram @diagram;
+ * @param diagram
+ */
+void QetGraphicsTableFactory::createAndAddSummary(Diagram *diagram)
+{
+ QScopedPointer d(new AddTableDialog(new SummaryQueryWidget(), diagram->views().first()));
+ d->setWindowTitle(QObject::tr("Ajouter un sommaire"));
+
+ if (d->exec()) {
+ create(diagram, d.data());
+ }
+}
+
+void QetGraphicsTableFactory::create(Diagram *diagram, AddTableDialog *dialog)
+{
+ auto table_ = newTable(diagram, dialog);
+ if (dialog->adjustTableToFolio()) {
+ QetGraphicsTableItem::adjustTableToFolio(table_);
+ }
+
+
+ //Add new table if needed and option checked
+ dialog->addNewTableToNewDiagram();
+ qDebug() << "model " << table_->model();
+ table_->model()->rowCount();
+ table_->displayNRow();
+ if (dialog->addNewTableToNewDiagram() && table_->model()->rowCount() > table_->displayNRow())
{
- auto table_ = newTable(diagram, d.data());
- if (d->adjustTableToFolio()) {
- QetGraphicsTableItem::adjustTableToFolio(table_);
- }
+ auto already_displayed_rows = table_->displayNRow();
+ auto project_ = diagram->project();
+ auto actual_diagram = diagram;
+ auto previous_table = table_;
-
- //Add new table if needed and option checked
- if (d->addNewTableToNewDiagram() && table_->model()->rowCount() > table_->displayNRow())
+ table_->setTableName(dialog->tableName() + QString(" 1"));
+ int table_number = 2;
+ while (already_displayed_rows < table_->model()->rowCount())
{
- auto already_displayed_rows = table_->displayNRow();
- auto project_ = diagram->project();
- auto actual_diagram = diagram;
- auto previous_table = table_;
-
- table_->setTableName(d->tableName() + QString(" 1"));
- int table_number = 2;
- while (already_displayed_rows < table_->model()->rowCount())
- {
- //Add a new diagram after the current one
- actual_diagram = project_->addNewDiagram(project_->folioIndex(actual_diagram)+1);
- table_ = newTable(actual_diagram, d.data(), previous_table);
- table_->setTableName(d->tableName() + QString(" %1").arg(table_number));
- //Adjust table
- if (d->adjustTableToFolio()) {
- QetGraphicsTableItem::adjustTableToFolio(table_);
- }
- //Update some variable for the next loop
- already_displayed_rows += table_->displayNRow();
- previous_table = table_;
- ++table_number;
+ //Add a new diagram after the current one
+ actual_diagram = project_->addNewDiagram(project_->folioIndex(actual_diagram)+1);
+ table_ = newTable(actual_diagram, dialog, previous_table);
+ table_->setTableName(dialog->tableName() + QString(" %1").arg(table_number));
+ //Adjust table
+ if (dialog->adjustTableToFolio()) {
+ QetGraphicsTableItem::adjustTableToFolio(table_);
}
+ //Update some variable for the next loop
+ already_displayed_rows += table_->displayNRow();
+ previous_table = table_;
+ ++table_number;
}
}
}
@@ -95,8 +121,20 @@ QetGraphicsTableItem *QetGraphicsTableFactory::newTable(Diagram *diagram, AddTab
if (!previous_table)
{
- auto model = new NomenclatureModel(diagram->project(), diagram->project());
- model->query(dialog->queryStr());
+ QString identifier_;
+ QString query_;
+
+ if (auto query_widget = dynamic_cast(dialog->contentWidget())) {
+ identifier_ = query_widget->modelIdentifier();
+ query_ = query_widget->queryStr();
+ } else if (auto query_widget = dynamic_cast(dialog->contentWidget())) {
+ identifier_ = query_widget->modelIdentifier();
+ query_ = query_widget->queryStr();
+ }
+
+ auto model = new ProjectDBModel(diagram->project(), diagram->project());
+ model->setIdentifier(identifier_);
+ model->setQuery(query_);
model->setData(model->index(0,0), int(dialog->tableAlignment()), Qt::TextAlignmentRole);
model->setData(model->index(0,0), dialog->tableFont(), Qt::FontRole);
model->setData(model->index(0,0), QETUtils::marginsToString(dialog->headerMargins()), Qt::UserRole+1);
diff --git a/sources/factory/qetgraphicstablefactory.h b/sources/factory/qetgraphicstablefactory.h
index ab2ca2b70..4ad36068b 100644
--- a/sources/factory/qetgraphicstablefactory.h
+++ b/sources/factory/qetgraphicstablefactory.h
@@ -31,7 +31,9 @@ class QetGraphicsTableFactory
QetGraphicsTableFactory();
static void createAndAddNomenclature(Diagram *diagram);
+ static void createAndAddSummary(Diagram *diagram);
private:
+ static void create(Diagram *diagram, AddTableDialog *dialog);
static QetGraphicsTableItem *newTable(Diagram *diagram, AddTableDialog *dialog, QetGraphicsTableItem *previous_table = nullptr);
};
diff --git a/sources/factory/ui/addtabledialog.cpp b/sources/factory/ui/addtabledialog.cpp
index c6626c953..517382360 100644
--- a/sources/factory/ui/addtabledialog.cpp
+++ b/sources/factory/ui/addtabledialog.cpp
@@ -24,17 +24,21 @@
#include
/**
- * @brief AddTableDialog::AddNomenclatureDialog
- * @param parent
+ * @brief AddTableDialog::AddTableDialog
+ * @param content_widget : the widget to display in the "content" tab.
+ * This dialog take ownership of @content_widget.
+ * @param parent : parent widget.
*/
-AddTableDialog::AddTableDialog(QWidget *parent) :
+AddTableDialog::AddTableDialog(QWidget *content_widget, QWidget *parent) :
QDialog(parent),
ui(new Ui::AddTableDialog)
{
ui->setupUi(this);
ui->m_header_font_pb->setText(m_header_font.family());
ui->m_table_font_pb->setText(m_table_font.family());
- ui->m_tab->addTab(m_query_widget, tr("Contenu"));
+ m_content_widget = content_widget;
+ content_widget->setParent(this);
+ ui->m_tab->addTab(content_widget, tr("Contenu"));
fillSavedQuery();
connect(ui->m_config_gb, &ConfigSaveLoaderWidget::saveClicked, this, &AddTableDialog::saveConfig);
@@ -58,14 +62,6 @@ void AddTableDialog::setQueryWidget(QWidget *widget) {
Q_UNUSED(widget)
}
-/**
- * @brief AddTableDialog::queryStr
- * @return
- */
-QString AddTableDialog::queryStr() {
- return m_query_widget->queryStr();
-}
-
/**
* @brief AddTableDialog::adjustTableToFolio
* @return
@@ -154,6 +150,10 @@ QFont AddTableDialog::tableFont() const {
return m_table_font;
}
+QWidget *AddTableDialog::contentWidget() const {
+ return m_content_widget;
+}
+
void AddTableDialog::on_m_header_font_pb_clicked()
{
bool b;
diff --git a/sources/factory/ui/addtabledialog.h b/sources/factory/ui/addtabledialog.h
index cdf3e5c76..484e44d84 100644
--- a/sources/factory/ui/addtabledialog.h
+++ b/sources/factory/ui/addtabledialog.h
@@ -20,7 +20,6 @@
#include
-#include "elementquerywidget.h"
#include "qetapp.h"
namespace Ui {
@@ -40,11 +39,10 @@ class AddTableDialog : public QDialog
Q_OBJECT
public:
- explicit AddTableDialog(QWidget *parent = nullptr);
+ explicit AddTableDialog(QWidget *content_widget, QWidget *parent = nullptr);
~AddTableDialog();
void setQueryWidget(QWidget *widget);
- QString queryStr();
bool adjustTableToFolio() const;
bool addNewTableToNewDiagram() const;
@@ -57,6 +55,7 @@ class AddTableDialog : public QDialog
QMargins tableMargins() const;
Qt::Alignment tableAlignment() const;
QFont tableFont() const;
+ QWidget *contentWidget() const;
private slots:
void on_m_header_font_pb_clicked();
@@ -69,7 +68,8 @@ class AddTableDialog : public QDialog
private:
Ui::AddTableDialog *ui;
- ElementQueryWidget *m_query_widget = new ElementQueryWidget();
+
+ QWidget *m_content_widget = nullptr;
QMargins m_header_margins = QMargins(5,5,10,5),
m_table_margins = QMargins(5,5,10,5);
@@ -77,6 +77,8 @@ class AddTableDialog : public QDialog
QFont m_header_font = QETApp::diagramTextsFont();
QFont m_table_font = QETApp::diagramTextsFont();
+ QString m_identifier;
+
};
#endif // ADDTABLEDIALOG_H
diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp
index 3fe55551e..875917b1f 100644
--- a/sources/qetdiagrameditor.cpp
+++ b/sources/qetdiagrameditor.cpp
@@ -403,6 +403,14 @@ void QETDiagramEditor::setUpActions()
}
});
+ //Add a summary item
+ m_add_summary = new QAction(QET::Icons::TableOfContent, tr("Ajouter un sommaire"), this);
+ connect(m_add_summary, &QAction::triggered, [this]() {
+ if(this->currentDiagramView()) {
+ QetGraphicsTableFactory::createAndAddSummary(this->currentDiagramView()->diagram());
+ }
+ });
+
//Lauch the plugin of terminal generator
m_project_terminalBloc = new QAction(QET::Icons::TerminalStrip, tr("Lancer le plugin de création de borniers"), this);
connect(m_project_terminalBloc, &QAction::triggered, this, &QETDiagramEditor::generateTerminalBlock);
@@ -769,6 +777,7 @@ void QETDiagramEditor::setUpMenu() {
menu_project -> addSeparator();
menu_project -> addAction(m_project_folio_list);
menu_project -> addAction(m_add_nomenclature);
+ menu_project -> addAction(m_add_summary);
menu_project -> addAction(m_csv_export);
menu_project -> addAction(m_project_export_conductor_num);
menu_project -> addAction(m_project_terminalBloc);
@@ -1449,6 +1458,7 @@ void QETDiagramEditor::slot_updateActions()
m_clean_project -> setEnabled(editable_project);
m_project_folio_list -> setEnabled(editable_project);
m_add_nomenclature->setEnabled(editable_project);
+ m_add_summary->setEnabled(editable_project);
m_csv_export -> setEnabled(editable_project);
m_export_diagram -> setEnabled(opened_diagram);
m_print -> setEnabled(opened_diagram);
diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h
index 599dfe844..126b639f4 100644
--- a/sources/qetdiagrameditor.h
+++ b/sources/qetdiagrameditor.h
@@ -185,6 +185,7 @@ class QETDiagramEditor : public QETMainWindow
QAction *m_project_folio_list; ///< Sommaire des schemas
QAction *m_csv_export; ///< generate nomenclature
QAction *m_add_nomenclature; ///< Add nomenclature graphics item;
+ QAction *m_add_summary; ///.
-*/
-#include "nomenclaturemodel.h"
-#include "qetapp.h"
-#include "qetproject.h"
-#include "qetxml.h"
-
-#include
-#include
-#include
-#include
-#include
-
-
-/**
- * @brief NomenclatureModel::NomenclatureModel
- * @param project :project of this nomenclature
- * @param parent : parent QObject
- */
-NomenclatureModel::NomenclatureModel(QETProject *project, QObject *parent) :
- QAbstractTableModel(parent),
- m_project(project)
-{
- connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
-}
-
-/**
- * @brief NomenclatureModel::NomenclatureModel
- * @param other_model
- */
-NomenclatureModel::NomenclatureModel(const NomenclatureModel &other_model):
- QAbstractTableModel(other_model.parent())
-{
- this->setParent(other_model.parent());
- m_project = other_model.m_project;
- connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
- m_index_0_0_data = other_model.m_index_0_0_data;
- query(other_model.queryString());
-}
-
-/**
- * @brief NomenclatureModel::rowCount
- * Reimplemented for QAbstractTableModel
- * @param parent
- * @return
- */
-int NomenclatureModel::rowCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
-
- return m_record.count();
-}
-
-/**
- * @brief NomenclatureModel::columnCount
- * Reimplemented for QAbstractTableModel
- * @param parent
- * @return
- */
-int NomenclatureModel::columnCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
-
- if (m_record.count()) {
- return m_record.first().count();
- }
-
- return 0;
-}
-
-/**
- * @brief NomenclatureModel::setHeaderData
- * Reimplemented from QAbstractTableModel.
- * Only horizontal orientation is accepted.
- * @param section
- * @param orientation
- * @param value
- * @param role
- * @return
- */
-bool NomenclatureModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
-{
- if (orientation == Qt::Vertical) {
- return false;
- }
- auto hash_ = m_header_data.value(section);
- hash_.insert(role, value);
- m_header_data.insert(section, hash_);
- headerDataChanged(orientation, section, section);
- return true;
-}
-
-/**
- * @brief NomenclatureModel::headerData
- * Reimplemented from QAbstractTableModel.
- * @param section
- * @param orientation
- * @param role
- * @return
- */
-QVariant NomenclatureModel::headerData(int section, Qt::Orientation orientation, int role) const
-{
- if (orientation == Qt::Vertical) {
- return QVariant();
- }
-
- if (m_header_data.contains(section))
- {
- auto hash_ = m_header_data.value(section);
- if (role == Qt::DisplayRole && !hash_.contains(Qt::DisplayRole)) { //special case to have the same behavior as Qt
- return hash_.value(Qt::EditRole);
- }
- return m_header_data.value(section).value(role);
- }
- return QVariant();
-}
-
-/**
- * @brief NomenclatureModel::setData
- * Only store the data for the index 0.0
- * @param index
- * @param value
- * @param role
- * @return
- */
-bool NomenclatureModel::setData(const QModelIndex &index, const QVariant &value, int role)
-{
- if (!index.isValid() || index.row() != 0 || index.column() != 0) {
- return false;
- }
- m_index_0_0_data.insert(role, value);
- emit dataChanged(index, index, QVector(role));
- return true;
-}
-
-/**
- * @brief NomenclatureModel::data
- * Reimplemented for QAbstractTableModel
- * @param index
- * @param role
- * @return
- */
-QVariant NomenclatureModel::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid())
- return QVariant();
-
- if (index.row() == 0 &&
- index.column() == 0 &&
- role != Qt::DisplayRole) {
- return m_index_0_0_data.value(role);
- }
-
- if (role == Qt::DisplayRole) {
- QVariant v(m_record.at(index.row()).at(index.column()));
- return v;
- }
-
- return QVariant();
-}
-
-/**
- * @brief NomenclatureModel::query
- * Query the internall bd with @query.
- * @param query
- */
-void NomenclatureModel::query(const QString &query)
-{
- auto rm_ = m_query != query;
- if (rm_) {
- emit beginResetModel();
- }
-
- m_query = query;
-
- if (m_project)
- {
- if (rm_) {
- disconnect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
- }
- m_project->dataBase()->updateDB();
- if (rm_) {
- setHeaderString();
- fillValue();
- connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
- }
- }
-
- if (rm_) { emit endResetModel();}
-
-
-}
-
-/**
- * @brief NomenclatureModel::queryString
- * @return the current query used by this model
- */
-QString NomenclatureModel::queryString() const {
- return m_query;
-}
-
-QETProject *NomenclatureModel::project() const {
- return m_project.data();
-}
-
-/**
- * @brief NomenclatureModel::toXml
- * Save the model to xml,since model can have unlimited data we only save few data (only these used by qelectrotech).
- * The query, all header data. and some data of index::(0,0). All other data are not saved.
- * @param document
- * @return
- */
-QDomElement NomenclatureModel::toXml(QDomDocument &document) const
-{
- auto dom_element = document.createElement(xmlTagName());
-
- //query
- auto dom_query = document.createElement("query");
- auto dom_query_txt = document.createTextNode(m_query);
- dom_query.appendChild(dom_query_txt);
- dom_element.appendChild(dom_query);
-
- //Add index 0,0 data
- auto index_00 = document.createElement("index00");
- index_00.setAttribute("font", m_index_0_0_data.value(Qt::FontRole).toString());
- auto me = QMetaEnum::fromType();
- index_00.setAttribute("alignment", me.valueToKey(m_index_0_0_data.value(Qt::TextAlignmentRole).toInt()));
- dom_element.appendChild(index_00);
- index_00.setAttribute("margins", m_index_0_0_data.value(Qt::UserRole+1).toString());
-
- //header data
- QHash> horizontal_;
- for (auto key : m_header_data.keys())
- {
- //We save all data except the display role, because he was generated in the fly
- auto list = m_header_data.value(key).keys();
- list.removeAll(Qt::DisplayRole);
-
- horizontal_.insert(key, list);
- }
-
- dom_element.appendChild(QETXML::modelHeaderDataToXml(document, this, horizontal_, QHash>()));
-
- return dom_element;
-}
-
-/**
- * @brief NomenclatureModel::fromXml
- * Restore the model from xml
- * @param element
- */
-void NomenclatureModel::fromXml(const QDomElement &element)
-{
- if (element.tagName() != xmlTagName())
- return;
-
- query(element.firstChildElement("query").text());
-
- //Index 0,0
- auto index_00 = element.firstChildElement("index00");
- QFont font_;
- font_.fromString(index_00.attribute("font"));
- m_index_0_0_data.insert(Qt::FontRole, font_);
- auto me = QMetaEnum::fromType();
- m_index_0_0_data.insert(Qt::TextAlignmentRole, me.keyToValue(index_00.attribute("alignment").toStdString().data()));
- m_index_0_0_data.insert(Qt::UserRole+1, index_00.attribute("margins"));
-
- QETXML::modelHeaderDataFromXml(element.firstChildElement("header_data"), this);
-}
-
-/**
- * @brief NomenclatureModel::dataBaseUpdated
- * slot called when the project database is updated
- */
-void NomenclatureModel::dataBaseUpdated()
-{
- auto original_record = m_record;
- fillValue();
- auto new_record = m_record;
- m_record = original_record;
-
- //This a very special case, if this nomenclature model is added
- //befor any element, column count return 0, so in this case we emit column inserted
- if (new_record.size() != m_record.size())
- {
- emit beginResetModel();
- m_record = new_record;
- emit endResetModel();
- }
- else
- {
- m_record = new_record;
- auto row = m_record.size();
- auto col = row ? m_record.first().count() : 1;
-
- emit dataChanged(this->index(0,0), this->index(row-1, col-1), QVector(Qt::DisplayRole));
- }
-}
-
-void NomenclatureModel::setHeaderString()
-{
- auto q = m_project->dataBase()->newQuery(m_query);
- auto record = q.record();
-
- for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, header_name);
- }
-}
-
-void NomenclatureModel::fillValue()
-{
- m_record.clear();
-
- auto query_ = m_project->dataBase()->newQuery(m_query);
- if (!query_.exec()) {
- qDebug() << "Query error : " << query_.lastError();
- }
-
- while (query_.next())
- {
- QStringList record_;
- auto i=0;
- while (query_.value(i).isValid())
- {
- record_ << query_.value(i).toString();
- ++i;
- }
- m_record << record_;
-
- }
-}
diff --git a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h b/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h
deleted file mode 100644
index 6df27c19c..000000000
--- a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- Copyright 2006-2020 QElectroTech Team
- This file is part of QElectroTech.
-
- QElectroTech 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 2 of the License, or
- (at your option) any later version.
-
- QElectroTech 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.
-
- You should have received a copy of the GNU General Public License
- along with QElectroTech. If not, see .
-*/
-#ifndef NOMENCLATUREMODEL_H
-#define NOMENCLATUREMODEL_H
-
-#include
-#include
-#include
-
-class QETProject;
-
-/**
- * @brief The NomenclatureModel class
- * An element nomenclature Model.
- * This model represent a 2D data.
- *
- * NOTE : qelectrotech use the data Qt::UserRole+1 on this model to store a QMargins formated to a QString
- * This is important because to/from XML of this class store the data Qt::UserRole+1 as QString.
- */
-class NomenclatureModel : public QAbstractTableModel
-{
- Q_OBJECT
-
- public:
- explicit NomenclatureModel(QETProject *project, QObject *parent = nullptr);
- explicit NomenclatureModel (const NomenclatureModel &other_model);
-
- int rowCount(const QModelIndex &parent = QModelIndex()) const override;
- int columnCount(const QModelIndex &parent = QModelIndex()) const override;
- bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
- bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
- QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
- void query(const QString &query);
- QString queryString() const;
- QETProject *project() const;
-
- QDomElement toXml(QDomDocument &document) const;
- void fromXml(const QDomElement &element);
- static QString xmlTagName() {return QString("nomenclature_model");}
-
- private:
- void dataBaseUpdated();
- void setHeaderString();
- void fillValue();
-
- private:
- QPointer m_project;
- QString m_query;
- QVector m_record;
- QHash> m_header_data; //First int = section, second int = Qt::role, QVariant = value
- QHash m_index_0_0_data;
-};
-
-#endif // NOMENCLATUREMODEL_H
diff --git a/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp
new file mode 100644
index 000000000..66aad69ef
--- /dev/null
+++ b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp
@@ -0,0 +1,378 @@
+/*
+ Copyright 2006-2020 QElectroTech Team
+ This file is part of QElectroTech.
+
+ QElectroTech 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 2 of the License, or
+ (at your option) any later version.
+
+ QElectroTech 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.
+
+ You should have received a copy of the GNU General Public License
+ along with QElectroTech. If not, see .
+*/
+#include "projectdbmodel.h"
+#include "projectdatabase.h"
+#include "qetproject.h"
+#include "qetxml.h"
+#include "qetapp.h"
+
+#include
+#include
+
+/**
+ * @brief ProjectDBModel::ProjectDBModel
+ * @param project :project of this nomenclature
+ * @param parent : parent QObject
+ */
+ProjectDBModel::ProjectDBModel(QETProject *project, QObject *parent) :
+ QAbstractTableModel(parent),
+ m_project(project)
+{
+ connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &ProjectDBModel::dataBaseUpdated);
+}
+
+/**
+ * @brief ProjectDBModel::ProjectDBModel
+ * @param other_model
+ */
+ProjectDBModel::ProjectDBModel(const ProjectDBModel &other_model) :
+ QAbstractTableModel(other_model.parent())
+{
+ this->setParent(other_model.parent());
+ m_project = other_model.m_project;
+ connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &ProjectDBModel::dataBaseUpdated);
+ m_index_0_0_data = other_model.m_index_0_0_data;
+ setQuery(other_model.queryString());
+}
+
+/**
+ * @brief ProjectDBModel::rowCount
+ * Reimplemented for QAbstractTableModel
+ * @param parent
+ * @return
+ */
+int ProjectDBModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return m_record.count();
+}
+
+/**
+ * @brief ProjectDBModel::columnCount
+ * Reimplemented for QAbstractTableModel
+ * @param parent
+ * @return
+ */
+int ProjectDBModel::columnCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ if (m_record.count()) {
+ return m_record.first().count();
+ }
+
+ return 0;
+}
+
+/**
+ * @brief ProjectDBModel::setHeaderData
+ * Reimplemented from QAbstractTableModel.
+ * Only horizontal orientation is accepted.
+ * @param section
+ * @param orientation
+ * @param value
+ * @param role
+ * @return
+ */
+bool ProjectDBModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
+{
+ if (orientation == Qt::Vertical) {
+ return false;
+ }
+ auto hash_ = m_header_data.value(section);
+ hash_.insert(role, value);
+ m_header_data.insert(section, hash_);
+ headerDataChanged(orientation, section, section);
+ return true;
+}
+
+/**
+ * @brief ProjectDBModel::headerData
+ * Reimplemented from QAbstractTableModel.
+ * @param section
+ * @param orientation
+ * @param role
+ * @return
+ */
+QVariant ProjectDBModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if (orientation == Qt::Vertical) {
+ return QVariant();
+ }
+
+ if (m_header_data.contains(section))
+ {
+ auto hash_ = m_header_data.value(section);
+ if (role == Qt::DisplayRole && !hash_.contains(Qt::DisplayRole)) { //special case to have the same behavior as Qt
+ return hash_.value(Qt::EditRole);
+ }
+ return m_header_data.value(section).value(role);
+ }
+ return QVariant();
+}
+
+/**
+ * @brief ProjectDBModel::setData
+ * Only store the data for the index 0.0
+ * @param index
+ * @param value
+ * @param role
+ * @return
+ */
+bool ProjectDBModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (!index.isValid() || index.row() != 0 || index.column() != 0) {
+ return false;
+ }
+ m_index_0_0_data.insert(role, value);
+ emit dataChanged(index, index, QVector(role));
+ return true;
+}
+
+/**
+ * @brief ProjectDBModel::data
+ * Reimplemented for QAbstractTableModel
+ * @param index
+ * @param role
+ * @return
+ */
+QVariant ProjectDBModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() == 0 &&
+ index.column() == 0 &&
+ role != Qt::DisplayRole) {
+ return m_index_0_0_data.value(role);
+ }
+
+ if (role == Qt::DisplayRole) {
+ QVariant v(m_record.at(index.row()).at(index.column()));
+ return v;
+ }
+
+ return QVariant();
+}
+
+/**
+ * @brief ProjectDBModel::setQuery
+ * Query the internall bd with @query.
+ * @param query
+ */
+void ProjectDBModel::setQuery(const QString &query)
+{
+ auto rm_ = m_query != query;
+ if (rm_) {
+ emit beginResetModel();
+ }
+
+ m_query = query;
+
+ if (m_project)
+ {
+ if (rm_) {
+ disconnect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &ProjectDBModel::dataBaseUpdated);
+ }
+ m_project->dataBase()->updateDB();
+ if (rm_) {
+ setHeaderString();
+ fillValue();
+ connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &ProjectDBModel::dataBaseUpdated);
+ }
+ }
+
+ if (rm_) {
+ emit endResetModel();
+ }
+}
+
+/**
+ * @brief ProjectDBModel::queryString
+ * @return the current query used by this model
+ */
+QString ProjectDBModel::queryString() const {
+ return m_query;
+}
+
+QETProject *ProjectDBModel::project() const {
+ return m_project.data();
+}
+
+/**
+ * @brief ProjectDBModel::toXml
+ * Save the model to xml,since model can have unlimited data we only save few data (only these used by qelectrotech).
+ * The query, all header data. and some data of index::(0,0). All other data are not saved.
+ * @param document
+ * @return
+ */
+QDomElement ProjectDBModel::toXml(QDomDocument &document) const
+{
+ auto dom_element = document.createElement(xmlTagName());
+
+ //Identifier
+ auto dom_identifier = document.createElement("identifier");
+ auto dom_identifier_text = document.createTextNode(m_identifier);
+ dom_identifier.appendChild(dom_identifier_text);
+ dom_element.appendChild(dom_identifier);
+
+ //query
+ auto dom_query = document.createElement("query");
+ auto dom_query_text = document.createTextNode(m_query);
+ dom_query.appendChild(dom_query_text);
+ dom_element.appendChild(dom_query);
+
+ //Add index 0,0 data
+ auto index_00 = document.createElement("index00");
+ index_00.setAttribute("font", m_index_0_0_data.value(Qt::FontRole).toString());
+ auto me = QMetaEnum::fromType();
+ index_00.setAttribute("alignment", me.valueToKey(m_index_0_0_data.value(Qt::TextAlignmentRole).toInt()));
+ dom_element.appendChild(index_00);
+ index_00.setAttribute("margins", m_index_0_0_data.value(Qt::UserRole+1).toString());
+
+ //header data
+ QHash> horizontal_;
+ for (auto key : m_header_data.keys())
+ {
+ //We save all data except the display role, because he was generated in the fly
+ auto list = m_header_data.value(key).keys();
+ list.removeAll(Qt::DisplayRole);
+
+ horizontal_.insert(key, list);
+ }
+
+ dom_element.appendChild(QETXML::modelHeaderDataToXml(document, this, horizontal_, QHash>()));
+
+ return dom_element;
+}
+
+/**
+ * @brief ProjectDBModel::fromXml
+ * Restore the model from xml
+ * @param element
+ */
+void ProjectDBModel::fromXml(const QDomElement &element)
+{
+ if (element.tagName() != xmlTagName())
+ return;
+
+ setIdentifier(element.firstChildElement("identifier").text());
+ setQuery(element.firstChildElement("query").text());
+
+ //Index 0,0
+ auto index_00 = element.firstChildElement("index00");
+ QFont font_;
+ font_.fromString(index_00.attribute("font"));
+ m_index_0_0_data.insert(Qt::FontRole, font_);
+ auto me = QMetaEnum::fromType();
+ m_index_0_0_data.insert(Qt::TextAlignmentRole, me.keyToValue(index_00.attribute("alignment").toStdString().data()));
+ m_index_0_0_data.insert(Qt::UserRole+1, index_00.attribute("margins"));
+
+ QETXML::modelHeaderDataFromXml(element.firstChildElement("header_data"), this);
+}
+
+/**
+ * @brief ProjectDBModel::setIdentifier
+ * Set the identifier of this model to @identifier
+ * @param identifier
+ */
+void ProjectDBModel::setIdentifier(const QString &identifier) {
+ m_identifier = identifier;
+}
+
+/**
+ * @brief ProjectDBModel::dataBaseUpdated
+ * slot called when the project database is updated
+ */
+void ProjectDBModel::dataBaseUpdated()
+{
+ auto original_record = m_record;
+ fillValue();
+ auto new_record = m_record;
+ m_record = original_record;
+
+ //This a very special case, if this nomenclature model is added
+ //befor any element, column count return 0, so in this case we emit column inserted
+ if (new_record.size() != m_record.size())
+ {
+ emit beginResetModel();
+ m_record = new_record;
+ emit endResetModel();
+ }
+ else
+ {
+ m_record = new_record;
+ auto row = m_record.size();
+ auto col = row ? m_record.first().count() : 1;
+
+ emit dataChanged(this->index(0,0), this->index(row-1, col-1), QVector(Qt::DisplayRole));
+ }
+}
+
+void ProjectDBModel::setHeaderString()
+{
+ auto q = m_project->dataBase()->newQuery(m_query);
+ auto record = q.record();
+
+ for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, header_name);
+ }
+}
+
+void ProjectDBModel::fillValue()
+{
+ m_record.clear();
+
+ auto query_ = m_project->dataBase()->newQuery(m_query);
+ if (!query_.exec()) {
+ qDebug() << "Query error : " << query_.lastError();
+ }
+
+ while (query_.next())
+ {
+ QStringList record_;
+ auto i=0;
+ while (query_.value(i).isValid())
+ {
+ record_ << query_.value(i).toString();
+ ++i;
+ }
+ m_record << record_;
+ }
+}
+
diff --git a/sources/qetgraphicsitem/ViewItem/projectdbmodel.h b/sources/qetgraphicsitem/ViewItem/projectdbmodel.h
new file mode 100644
index 000000000..8097aac93
--- /dev/null
+++ b/sources/qetgraphicsitem/ViewItem/projectdbmodel.h
@@ -0,0 +1,73 @@
+/*
+ Copyright 2006-2020 QElectroTech Team
+ This file is part of QElectroTech.
+
+ QElectroTech 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 2 of the License, or
+ (at your option) any later version.
+
+ QElectroTech 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.
+
+ You should have received a copy of the GNU General Public License
+ along with QElectroTech. If not, see .
+*/
+#ifndef PROJECTDBMODEL_H
+#define PROJECTDBMODEL_H
+
+#include
+#include
+#include
+
+class QETProject;
+
+/**
+ * @brief The ProjectDBModel class
+ * This model is intended to be use with the @class projectDataBase
+ * and is designed to be displayed by the @class QetGraphicsTableItem (but can be use by other view class since it inherit from QAbstractTableModel).
+ * This class should be sufficient to display the content of the project data base from a query set by the method void ProjectDBModel::setQuery(const QString &query).
+ * The indentifier method is used by widget editor to retrieve the good widget for edit the query. By defaut identifer return the string 'unknow'.
+ * You should use setIdentfier method to set your custom identifier.
+ */
+class ProjectDBModel : public QAbstractTableModel
+{
+ Q_OBJECT
+
+ public:
+ explicit ProjectDBModel(QETProject *project, QObject *parent = nullptr);
+ explicit ProjectDBModel (const ProjectDBModel &other_model);
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
+ bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ void setQuery(const QString &setQuery);
+ QString queryString() const;
+ QETProject *project() const;
+
+ QDomElement toXml(QDomDocument &document) const;
+ void fromXml(const QDomElement &element);
+ void setIdentifier(const QString &identifier);
+ QString indentifier() const {return m_identifier;}
+ static QString xmlTagName() {return QString("project_data_base_model");}
+
+ private:
+ void dataBaseUpdated();
+ void setHeaderString();
+ void fillValue();
+
+ private:
+ QPointer m_project;
+ QString m_query;
+ QVector m_record;
+ QHash> m_header_data; //First int = section, second int = Qt::role, QVariant = value
+ QHash m_index_0_0_data;
+ QString m_identifier = "unknow";
+};
+
+#endif // PROJECTDBMODEL_H
diff --git a/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp b/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp
index 65feaf385..66ca8ad7e 100644
--- a/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp
+++ b/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp
@@ -23,6 +23,7 @@
#include "nomenclaturemodel.h"
#include "elementprovider.h"
#include "qetutils.h"
+#include "projectdbmodel.h"
#include
#include
@@ -343,7 +344,7 @@ void QetGraphicsTableItem::setPreviousTable(QetGraphicsTableItem *table)
}
else //Copie the model of old previous table
{
- setModel(new NomenclatureModel(*static_cast(old_previous_table->model())));
+ setModel(new ProjectDBModel(*static_cast(old_previous_table->model())));
}
if (old_previous_table &&
@@ -473,8 +474,8 @@ QDomElement QetGraphicsTableItem::toXml(QDomDocument &dom_document) const
{
//Add model
auto dom_model = dom_document.createElement("model");
- auto nomenclature_model = static_cast(m_model);
- dom_model.appendChild(nomenclature_model->toXml(dom_document));
+ auto project_db_model = static_cast(m_model);
+ dom_model.appendChild(project_db_model->toXml(dom_document));
dom_table.appendChild(dom_model);
}
@@ -511,8 +512,8 @@ void QetGraphicsTableItem::fromXml(const QDomElement &dom_element)
else if (this->diagram()) //The table haven't got a previous table, so there should be a model save to xml
{
//Get table
- auto model_ = new NomenclatureModel(this->diagram()->project(), this->diagram()->project());
- model_->fromXml(dom_element.firstChildElement("model").firstChildElement(NomenclatureModel::xmlTagName()));
+ auto model_ = new ProjectDBModel(this->diagram()->project(), this->diagram()->project());
+ model_->fromXml(dom_element.firstChildElement("model").firstChildElement(ProjectDBModel::xmlTagName()));
this->setModel(model_);
}
diff --git a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.cpp
similarity index 67%
rename from sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp
rename to sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.cpp
index 53e87e4f8..3aba98fc1 100644
--- a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp
+++ b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.cpp
@@ -15,48 +15,48 @@
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see .
*/
-#include "nomenclaturemodelpropertieswidget.h"
-#include "ui_nomenclaturemodelpropertieswidget.h"
-#include "nomenclaturemodel.h"
+#include "projectdbmodelpropertieswidget.h"
+#include "ui_projectdbmodelpropertieswidget.h"
+#include "projectdbmodel.h"
#include "qetproject.h"
#include "elementquerywidget.h"
#include
/**
- * @brief NomenclatureModelPropertiesWidget::NomenclatureModelPropertiesWidget
+ * @brief projectDBModelPropertiesWidget::projectDBModelPropertiesWidget
* @param model
* @param parent
*/
-NomenclatureModelPropertiesWidget::NomenclatureModelPropertiesWidget(NomenclatureModel *model, QWidget *parent) :
+ProjectDBModelPropertiesWidget::ProjectDBModelPropertiesWidget(ProjectDBModel *model, QWidget *parent) :
PropertiesEditorWidget(parent),
- ui(new Ui::NomenclatureModelPropertiesWidget)
+ ui(new Ui::ProjectDBModelPropertiesWidget)
{
ui->setupUi(this);
setModel(model);
}
/**
- * @brief NomenclatureModelPropertiesWidget::~NomenclatureModelPropertiesWidget
+ * @brief projectDBModelPropertiesWidget::~projectDBModelPropertiesWidget
*/
-NomenclatureModelPropertiesWidget::~NomenclatureModelPropertiesWidget() {
+ProjectDBModelPropertiesWidget::~ProjectDBModelPropertiesWidget() {
delete ui;
}
/**
- * @brief NomenclatureModelPropertiesWidget::setModel
+ * @brief projectDBModelPropertiesWidget::setModel
* @param model
*/
-void NomenclatureModelPropertiesWidget::setModel(NomenclatureModel *model) {
+void ProjectDBModelPropertiesWidget::setModel(ProjectDBModel *model) {
m_model = model;
ui->m_edit_query_pb->setEnabled(m_model);
ui->m_refresh_pb->setEnabled(m_model);
}
/**
- * @brief NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked
+ * @brief projectDBModelPropertiesWidget::on_m_edit_query_pb_clicked
*/
-void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
+void ProjectDBModelPropertiesWidget::on_m_edit_query_pb_clicked()
{
QDialog d(this);
auto l = new QVBoxLayout;
@@ -73,7 +73,7 @@ void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
if (d.exec())
{
- m_model->query(query_widget->queryStr());
+ m_model->setQuery(query_widget->queryStr());
auto headers = query_widget->header();
for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, headers.at(i));
@@ -81,7 +81,7 @@ void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
}
}
-void NomenclatureModelPropertiesWidget::on_m_refresh_pb_clicked() {
+void ProjectDBModelPropertiesWidget::on_m_refresh_pb_clicked() {
if (m_model && m_model->project()) {
m_model->project()->dataBase()->updateDB();
}
diff --git a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.h b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.h
similarity index 62%
rename from sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.h
rename to sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.h
index af4be3e1f..5babea85f 100644
--- a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.h
+++ b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.h
@@ -15,38 +15,39 @@
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see .
*/
-#ifndef NOMENCLATUREMODELPROPERTIESWIDGET_H
-#define NOMENCLATUREMODELPROPERTIESWIDGET_H
+#ifndef PROJECTDBMODELPROPERTIESWIDGET_H
+#define PROJECTDBMODELPROPERTIESWIDGET_H
#include "PropertiesEditor/propertieseditorwidget.h"
-class NomenclatureModel;
+class ProjectDBModel;
namespace Ui {
-class NomenclatureModelPropertiesWidget;
+class ProjectDBModelPropertiesWidget;
}
/**
- * @brief The NomenclatureModelPropertiesWidget class
+ * @brief The projectDBModelPropertiesWidget class
* This class is an editor for a NomenclatureModel
*/
-class NomenclatureModelPropertiesWidget : public PropertiesEditorWidget
+class ProjectDBModelPropertiesWidget : public PropertiesEditorWidget
{
Q_OBJECT
public:
- explicit NomenclatureModelPropertiesWidget(NomenclatureModel *model = nullptr, QWidget *parent = nullptr);
- ~NomenclatureModelPropertiesWidget();
+ explicit ProjectDBModelPropertiesWidget(ProjectDBModel *model = nullptr, QWidget *parent = nullptr);
+ ~ProjectDBModelPropertiesWidget();
- void setModel(NomenclatureModel *model);
+ void setModel(ProjectDBModel *model);
private slots:
void on_m_edit_query_pb_clicked();
void on_m_refresh_pb_clicked();
private:
- Ui::NomenclatureModelPropertiesWidget *ui;
- NomenclatureModel *m_model = nullptr;
+ Ui::ProjectDBModelPropertiesWidget *ui;
+ ProjectDBModel *m_model = nullptr;
};
-#endif // NOMENCLATUREMODELPROPERTIESWIDGET_H
+#endif // PROJECTDBMODELPROPERTIESWIDGET_H
+
diff --git a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.ui b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui
similarity index 92%
rename from sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.ui
rename to sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui
index 867a9c8b3..3ce470886 100644
--- a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.ui
+++ b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui
@@ -1,7 +1,7 @@
- NomenclatureModelPropertiesWidget
-
+ ProjectDBModelPropertiesWidget
+
0