Query can be edited. Project database can be exported

User can now define the information to display in the nomenclature
table. WIP
The internal database of project can be exported to file.
This commit is contained in:
Claveau Joshua
2020-04-01 18:39:19 +02:00
parent 46350c3860
commit b7d3db1ce6
16 changed files with 932 additions and 38 deletions

View File

@@ -102,7 +102,8 @@ INCLUDEPATH += sources \
sources/NameList/ui \ sources/NameList/ui \
sources/utils \ sources/utils \
sources/pugixml \ sources/pugixml \
sources/dataBase sources/dataBase \
sources/dataBase/ui
# Fichiers sources # Fichiers sources
@@ -132,7 +133,8 @@ HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) \
$$files(sources/NameList/ui/*.h) \ $$files(sources/NameList/ui/*.h) \
$$files(sources/utils/*.h) \ $$files(sources/utils/*.h) \
$$files(sources/pugixml/*.hpp) \ $$files(sources/pugixml/*.hpp) \
$$files(sources/dataBase/*.h) $$files(sources/dataBase/*.h) \
$$files(sources/dataBase/ui/*.h)
SOURCES += $$files(sources/*.cpp) \ SOURCES += $$files(sources/*.cpp) \
$$files(sources/editor/*.cpp) \ $$files(sources/editor/*.cpp) \
@@ -161,7 +163,8 @@ SOURCES += $$files(sources/*.cpp) \
$$files(sources/NameList/ui/*.cpp) \ $$files(sources/NameList/ui/*.cpp) \
$$files(sources/utils/*.cpp) \ $$files(sources/utils/*.cpp) \
$$files(sources/pugixml/*.cpp) \ $$files(sources/pugixml/*.cpp) \
$$files(sources/dataBase/*.cpp) $$files(sources/dataBase/*.cpp) \
$$files(sources/dataBase/ui/*.cpp)
# Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt # Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt
RESOURCES += qelectrotech.qrc RESOURCES += qelectrotech.qrc
@@ -184,7 +187,8 @@ FORMS += $$files(sources/richtext/*.ui) \
$$files(sources/ui/configpage/*.ui) \ $$files(sources/ui/configpage/*.ui) \
$$files(sources/SearchAndReplace/ui/*.ui) \ $$files(sources/SearchAndReplace/ui/*.ui) \
$$files(sources/NameList/ui/*.ui) \ $$files(sources/NameList/ui/*.ui) \
$$files(sources/qetgraphicsitem/ViewItem/ui/*.ui) $$files(sources/qetgraphicsitem/ViewItem/ui/*.ui) \
$$files(sources/dataBase/ui/*.ui)
UI_SOURCES_DIR = sources/ui/ UI_SOURCES_DIR = sources/ui/
UI_HEADERS_DIR = sources/ui/ UI_HEADERS_DIR = sources/ui/

View File

@@ -1,4 +1,4 @@
/* /*
Copyright 2006-2020 QElectroTech Team Copyright 2006-2020 QElectroTech Team
This file is part of QElectroTech. This file is part of QElectroTech.
@@ -20,6 +20,8 @@
#include "qetproject.h" #include "qetproject.h"
#include "elementprovider.h" #include "elementprovider.h"
#include "element.h" #include "element.h"
#include "diagram.h"
#include "diagramposition.h"
#include <QSqlError> #include <QSqlError>
@@ -36,6 +38,13 @@ projectDataBase::projectDataBase(QETProject *project, QObject *parent) :
createDataBase(); createDataBase();
} }
projectDataBase::projectDataBase(QETProject *project, const QString &connection_name, const QString &path, QObject *parent) :
QObject(parent),
m_project(project)
{
createDataBase(connection_name, path);
}
/** /**
* @brief projectDataBase::~projectDataBase * @brief projectDataBase::~projectDataBase
* Destructor * Destructor
@@ -75,6 +84,39 @@ QVector<QStringList> projectDataBase::elementsInfoFromQuery(const QString &query
return result_; return result_;
} }
/**
* @brief projectDataBase::headersFromElementsInfoQuery
* @param query
* @return the header according to @query.
* Header can be false, notably when user create is own query.
*/
QStringList projectDataBase::headersFromElementsInfoQuery(const QString &query)
{
QStringList header_string;
if (query.startsWith("SELECT ") && query.contains("FROM"))
{
auto header = query;
header.remove(0, 7); //Remove SELECT from the string;
header.truncate(header.indexOf("FROM")); //Now we only have the string between SELECT and FROM
header.replace(" ", ""); //remove white space
QStringList list = header.split(",");
if (!list.isEmpty())
{
for (int i=0 ; i<list.size() ; i++)
{
if (list.at(i) == "pos") {
header_string.append(tr("Position"));
} else {
header_string.append(QETApp::elementTranslatedInfoKey(list.at(i)));
}
}
}
}
return header_string;
}
/** /**
* @brief projectDataBase::updateDB * @brief projectDataBase::updateDB
* Up to date the content of the data base. * Up to date the content of the data base.
@@ -89,20 +131,33 @@ void projectDataBase::updateDB()
emit dataBaseUpdated(); emit dataBaseUpdated();
} }
/**
* @brief projectDataBase::project
* @return the project of this database
*/
QETProject *projectDataBase::project() const {
return m_project;
}
/** /**
* @brief projectDataBase::createDataBase * @brief projectDataBase::createDataBase
* Create the data base * Create the data base
* @return : true if the data base was successfully created. * @return : true if the data base was successfully created.
*/ */
bool projectDataBase::createDataBase() bool projectDataBase::createDataBase(const QString &connection_name, const QString &name)
{ {
QString connect_name("qet_project_db_" + m_project->uuid().toString());
QString connect_name=connection_name;
if (connect_name.isEmpty()) {
connect_name = "qet_project_db_" + m_project->uuid().toString();
}
if (m_data_base.connectionNames().contains(connect_name)) { if (m_data_base.connectionNames().contains(connect_name)) {
m_data_base = QSqlDatabase::database(connect_name); m_data_base = QSqlDatabase::database(connect_name);
} }
else else
{ {
m_data_base = QSqlDatabase::addDatabase("QSQLITE", connect_name); m_data_base = QSqlDatabase::addDatabase("QSQLITE", connect_name);
m_data_base.setDatabaseName(name);
if(!m_data_base.open()) if(!m_data_base.open())
{ {
m_data_base.close(); m_data_base.close();
@@ -177,6 +232,7 @@ void projectDataBase::populateElementsTable()
query.bindValue(":element_type", elmt->linkTypeToString()); query.bindValue(":element_type", elmt->linkTypeToString());
query.bindValue(":element_subtype", elmt->kindInformations()["type"].toString()); query.bindValue(":element_subtype", elmt->kindInformations()["type"].toString());
query.bindValue(":pos", elmt->diagram()->convertPosition(elmt->scenePos()).toString());
if (!query.exec()) { if (!query.exec()) {
qDebug() << "projectDataBase::populateElementsTable insert error : " << query.lastError(); qDebug() << "projectDataBase::populateElementsTable insert error : " << query.lastError();
@@ -210,10 +266,47 @@ QHash<QString, QString> projectDataBase::elementInfoToString(Element *elmt)
* @brief projectDataBase::elementsInfoKeys * @brief projectDataBase::elementsInfoKeys
* @return QETApp::elementInfoKeys() + "element_type" and "element_subtype" * @return QETApp::elementInfoKeys() + "element_type" and "element_subtype"
*/ */
QStringList projectDataBase::elementsInfoKeys() const QStringList projectDataBase::elementsInfoKeys()
{ {
auto keys_ = QETApp::elementInfoKeys(); auto keys_ = QETApp::elementInfoKeys();
keys_<< "element_type" << "element_subtype"; keys_<< "element_type" << "subtype" << "pos";
return keys_; return keys_;
} }
/**
* @brief projectDataBase::exportDb
* @param parent
* @param caption
* @param dir
* @param filter
* @param selectedFilter
* @param options
*/
void projectDataBase::exportDb(projectDataBase *db, QWidget *parent, const QString &caption, const QString &dir)
{
auto caption_ = caption;
if (caption_.isEmpty()) {
caption_ = tr("Exporter la base de données interne du projet");
}
auto dir_ = dir;
if(dir_.isEmpty()) {
dir_ = db->project()->filePath();
if (dir_.isEmpty()) {
dir_ = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first();
dir_ += QString("/") += tr("sans_nom") += ".sqlite";
} else {
dir_.remove(".qet");
dir_.append(".sqlite");
}
}
auto path_ = QFileDialog::getSaveFileName(parent, caption_, dir_, "*.sqlite");
if (path_.isNull()) {
return;
}
//Database is filled at creation, work is done.
projectDataBase file_db(db->project(), "export_project_db_" + db->project()->uuid().toString(), path_);
}

View File

@@ -1,4 +1,4 @@
/* /*
Copyright 2006-2020 QElectroTech Team Copyright 2006-2020 QElectroTech Team
This file is part of QElectroTech. This file is part of QElectroTech.
@@ -22,6 +22,7 @@
#include <QSqlDatabase> #include <QSqlDatabase>
#include <QSqlQuery> #include <QSqlQuery>
#include <QPointer> #include <QPointer>
#include <QFileDialog>
class Element; class Element;
class QETProject; class QETProject;
@@ -39,24 +40,33 @@ class projectDataBase : public QObject
public: public:
projectDataBase(QETProject *project, QObject *parent = nullptr); projectDataBase(QETProject *project, QObject *parent = nullptr);
private:
projectDataBase(QETProject *project, const QString &connection_name, const QString &path, QObject *parent = nullptr);
public:
virtual ~projectDataBase() override; virtual ~projectDataBase() override;
QVector<QStringList> elementsInfoFromQuery(const QString &query); QVector<QStringList> elementsInfoFromQuery(const QString &query);
void updateDB(); void updateDB();
QETProject *project() const;
static QStringList elementsInfoKeys();
static QStringList headersFromElementsInfoQuery(const QString &query);
signals: signals:
void dataBaseUpdated(); void dataBaseUpdated();
private: private:
bool createDataBase(); bool createDataBase(const QString &connection_name= QString(), const QString &name = QString());
void populateElementsTable(); void populateElementsTable();
static QHash<QString, QString> elementInfoToString(Element *elmt); static QHash<QString, QString> elementInfoToString(Element *elmt);
QStringList elementsInfoKeys() const;
private: private:
QPointer<QETProject> m_project; QPointer<QETProject> m_project;
QSqlDatabase m_data_base; QSqlDatabase m_data_base;
QSqlQuery m_insert_elements_query; QSqlQuery m_insert_elements_query;
public:
static void exportDb(projectDataBase *db, QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString());
}; };
#endif // PROJECTDATABASE_H #endif // PROJECTDATABASE_H

View File

@@ -0,0 +1,274 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
#include "elementquerywidget.h"
#include "ui_elementquerywidget.h"
#include "qetapp.h"
/**
* @brief ElementQueryWidget::ElementQueryWidget
* @param parent
*/
ElementQueryWidget::ElementQueryWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ElementQueryWidget)
{
ui->setupUi(this);
m_export_info.insert("pos", tr("Position"));
// m_export_info.insert("folio_title", tr("Titre du folio"));
// m_export_info.insert("folio_pos", tr("Position de folio"));
// m_export_info.insert("folio_num", tr("Numéro de folio"));
// m_export_info.insert("designation_qty", tr("Quantité (Numéro d'article)"));
m_button_group.setExclusive(false);
m_button_group.addButton(ui->m_all_cb, 0);
m_button_group.addButton(ui->m_terminal_cb, 1);
m_button_group.addButton(ui->m_simple_cb, 2);
m_button_group.addButton(ui->m_button_cb, 3);
m_button_group.addButton(ui->m_coil_cb, 4);
m_button_group.addButton(ui->m_protection_cb, 5);
connect(&m_button_group, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), [this](int id)
{
auto check_box = static_cast<QCheckBox *>(m_button_group.button(0));
if (id == 0)
{
switch (check_box->checkState()) {
case Qt::Checked :
for (auto button : m_button_group.buttons()) {
button->setChecked(true);
}
break;
case Qt::Unchecked :
for (auto button : m_button_group.buttons()) {
button->setChecked(false);
}
break;
default: break;
}
}
else
{
int checked = 0;
for (int i=1 ; i<5 ; ++i) {
if (m_button_group.button(i)->isChecked()) {++checked;}
}
switch (checked)
{
case 0 :
check_box->setCheckState(Qt::Unchecked);
break;
case 5:
check_box->setCheckState(Qt::Checked);
break;
default:
check_box->setCheckState(Qt::PartiallyChecked);
break;
}
}
updateQueryLine();
});
setUpItems();
}
/**
* @brief ElementQueryWidget::~ElementQueryWidget
*/
ElementQueryWidget::~ElementQueryWidget() {
delete ui;
}
/**
* @brief ElementQueryWidget::queryStr
* @return The current query
*/
QString ElementQueryWidget::queryStr() const
{
//User define is own query
if (ui->m_edit_sql_query_cb->isChecked()) {
return ui->m_sql_query->text();
}
//Made a string list with the colomns (keys) choosen by the user
QStringList keys = selectedKeys();
QString select ="SELECT ";
QString order_by = " ORDER BY ";
QString column;
bool first = true;
for (auto key: keys) {
if (first) {
first = false;
} else {
column += ", ";
order_by += ", ";
}
column += key;
order_by += key;
}
QString from = " FROM element_info";
QString where;
if (ui->m_all_cb->checkState() == Qt::PartiallyChecked)
{
if (ui->m_terminal_cb->isChecked()) {
where = " WHERE element_type = 'Terminale'";
}
if (ui->m_simple_cb->isChecked()) {
auto str = where.isEmpty() ? " WHERE element_type = 'Simple'" : " AND element_type = 'Simple'";
where += str;
}
if (ui->m_button_cb->isChecked()) {
auto str = where.isEmpty() ? " WHERE element_subtype = 'commutator'" : " AND element_subtype = 'commutator'";
where += str;
}
if (ui->m_coil_cb->isChecked()) {
auto str = where.isEmpty() ? " WHERE element_subtype = 'coil'" : " AND element_subtype = 'coil'";
where += str;
}
if (ui->m_protection_cb->isChecked()) {
auto str = where.isEmpty() ? " WHERE element_subtype = 'protection'" : " AND element_subtype = 'protection'";
where += str;
}
}
QString q(select + column + from + where + order_by);
return q;
}
/**
* @brief ElementQueryWidget::updateQueryLine
*/
void ElementQueryWidget::updateQueryLine() {
ui->m_sql_query->setText(queryStr());
}
/**
* @brief ElementQueryWidget::selectedKeys
* @return the current keys of selected infos to be exported
*/
QStringList ElementQueryWidget::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 ElementQueryWidget::setUpItems()
{
for(QString key : QETApp::elementInfoKeys())
{
auto item = new QListWidgetItem(QETApp::elementTranslatedInfoKey(key), ui->m_var_list);
item->setData(Qt::UserRole, key);
m_items_list << item;
}
for (auto key : m_export_info.keys())
{
auto item = new QListWidgetItem(m_export_info.value(key), ui->m_var_list);
item->setData(Qt::UserRole, key);
m_items_list << item;
}
}
/**
* @brief ElementQueryWidget::on_m_up_pb_clicked
*/
void ElementQueryWidget::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 ElementQueryWidget::on_m_add_pb_clicked
*/
void ElementQueryWidget::on_m_add_pb_clicked()
{
if (auto *item = ui->m_var_list->takeItem(ui->m_var_list->currentRow())) {
ui->m_choosen_list->addItem(item);
}
updateQueryLine();
}
/**
* @brief ElementQueryWidget::on_m_remove_pb_clicked
*/
void ElementQueryWidget::on_m_remove_pb_clicked()
{
if (auto *item = ui->m_choosen_list->takeItem(ui->m_choosen_list->currentRow())) {
ui->m_var_list->addItem(item);
}
updateQueryLine();
}
/**
* @brief ElementQueryWidget::on_m_down_pb_clicked
*/
void ElementQueryWidget::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();
}
/**
* @brief ElementQueryWidget::on_m_edit_sql_query_cb_clicked
*/
void ElementQueryWidget::on_m_edit_sql_query_cb_clicked()
{
ui->m_sql_query->setEnabled(ui->m_edit_sql_query_cb->isChecked());
ui->m_info_widget->setDisabled(ui->m_edit_sql_query_cb->isChecked());
ui->m_parametre_widget->setDisabled(ui->m_edit_sql_query_cb->isChecked());
if (ui->m_edit_sql_query_cb->isChecked() && !m_custom_query.isEmpty())
{
ui->m_sql_query->setText(m_custom_query);
}
else if (!ui->m_edit_sql_query_cb->isChecked())
{
m_custom_query = ui->m_sql_query->text();
updateQueryLine();
}
}

View File

@@ -0,0 +1,64 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
#ifndef ELEMENTQUERYWIDGET_H
#define ELEMENTQUERYWIDGET_H
#include <QWidget>
#include <QButtonGroup>
class QListWidgetItem;
namespace Ui {
class ElementQueryWidget;
}
/**
* @brief The ElementQueryWidget class
* A widget use to edit a sql query for get element information
* This widget only work to get information from ProjectDataBase
*/
class ElementQueryWidget : public QWidget
{
Q_OBJECT
public:
explicit ElementQueryWidget(QWidget *parent = nullptr);
~ElementQueryWidget();
QString queryStr() const;
private slots:
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();
void updateQueryLine();
QStringList selectedKeys() const;
void setUpItems();
private:
Ui::ElementQueryWidget *ui;
QHash <QString, QString> m_export_info;
QButtonGroup m_button_group;
QList <QListWidgetItem *> m_items_list;
QString m_custom_query;
};
#endif // ELEMENTQUERYWIDGET_H

View File

@@ -0,0 +1,363 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ElementQueryWidget</class>
<widget class="QWidget" name="ElementQueryWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>341</width>
<height>457</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="m_info_widget" native="true">
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Informations disponibles</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Informations à exporter</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>0</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QListWidget" name="m_var_list"/>
</item>
<item row="1" column="2">
<widget class="QListWidget" name="m_choosen_list"/>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,0,0,0,0,0">
<property name="spacing">
<number>6</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="m_up_pb">
<property name="toolTip">
<string>Monter la sélection</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/go-up.png</normaloff>:/ico/16x16/go-up.png</iconset>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="m_add_pb">
<property name="toolTip">
<string>Ajouter la sélection</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/list-add.png</normaloff>:/ico/16x16/list-add.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="m_remove_pb">
<property name="toolTip">
<string>Supprimer la sélection</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/list-remove.png</normaloff>:/ico/16x16/list-remove.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="m_down_pb">
<property name="toolTip">
<string>Descendre la sélection</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/go-down.png</normaloff>:/ico/16x16/go-down.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="m_parametre_widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Type d'éléments</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="4" column="0">
<widget class="QCheckBox" name="m_simple_cb">
<property name="text">
<string>Simples</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="m_all_cb">
<property name="text">
<string>Tous</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="m_coil_cb">
<property name="text">
<string>Contacteurs et relais</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="m_button_cb">
<property name="text">
<string>Boutons et commutateurs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="m_terminal_cb">
<property name="text">
<string>Borniers</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="m_protection_cb">
<property name="text">
<string>Organes de protection</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Configuration</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QPushButton" name="m_load_pb">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Ouvrir la configuration sélectionné</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/folder-open.png</normaloff>:/ico/16x16/folder-open.png</iconset>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="m_conf_cb">
<property name="editable">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="m_save_name_le"/>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="m_save_current_conf_pb">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Sauvegarder la configuration actuelle</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../qelectrotech.qrc">
<normaloff>:/ico/16x16/document-save.png</normaloff>:/ico/16x16/document-save.png</iconset>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_3">
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="m_edit_sql_query_cb">
<property name="toolTip">
<string>Requête SQL personnalisée</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Requête SQL :</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="m_sql_query">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../../../qelectrotech.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -412,16 +412,11 @@ void QETDiagramEditor::setUpActions()
/*******ONLY FOR TEST DURING DEVEL*********/ /*******ONLY FOR TEST DURING DEVEL*********/
auto model = new NomenclatureModel(this->currentProject(), this->currentProject()); auto model = new NomenclatureModel(this->currentProject(), this->currentProject());
model->query("SELECT plant, location, label, comment, description FROM element_info ORDER BY plant, location, label, comment, description"); model->query("SELECT plant, location, label, pos, comment, description FROM element_info ORDER BY plant, location, label, comment, description");
model->setData(model->index(0,0), Qt::AlignLeft, Qt::TextAlignmentRole); model->setData(model->index(0,0), Qt::AlignLeft, Qt::TextAlignmentRole);
model->setData(model->index(0,0), QETApp::diagramTextsFont(), Qt::FontRole); model->setData(model->index(0,0), QETApp::diagramTextsFont(), Qt::FontRole);
model->setHeaderData(0, Qt::Horizontal, Qt::AlignHCenter, Qt::TextAlignmentRole); model->setHeaderData(0, Qt::Horizontal, Qt::AlignHCenter, Qt::TextAlignmentRole);
model->setHeaderData(0, Qt::Horizontal, QETApp::diagramTextsFont(), Qt::FontRole); model->setHeaderData(0, Qt::Horizontal, QETApp::diagramTextsFont(), Qt::FontRole);
model->setHeaderData(0, Qt::Horizontal, "Installation");
model->setHeaderData(1, Qt::Horizontal, "Localisation");
model->setHeaderData(2, Qt::Horizontal, "Label");
model->setHeaderData(3, Qt::Horizontal, "Commentaire");
model->setHeaderData(4, Qt::Horizontal, "Description");
table->setModel(model); table->setModel(model);
/******************************************/ /******************************************/
@@ -445,6 +440,11 @@ void QETDiagramEditor::setUpActions()
} }
}); });
m_export_project_db = new QAction(QET::Icons::DocumentSpreadsheet, tr("Exporter la base de donnée interne du projet"), this);
connect(m_export_project_db, &QAction::triggered, [this]() {
projectDataBase::exportDb(this->currentProject()->dataBase(), this);
});
//MDI view style //MDI view style
m_tabbed_view_mode = new QAction(tr("en utilisant des onglets"), this); m_tabbed_view_mode = new QAction(tr("en utilisant des onglets"), this);
m_tabbed_view_mode->setStatusTip(tr("Présente les différents projets ouverts des onglets", "status bar tip")); m_tabbed_view_mode->setStatusTip(tr("Présente les différents projets ouverts des onglets", "status bar tip"));
@@ -789,6 +789,8 @@ void QETDiagramEditor::setUpMenu() {
menu_project -> addAction(m_csv_export); menu_project -> addAction(m_csv_export);
menu_project -> addAction(m_project_export_conductor_num); menu_project -> addAction(m_project_export_conductor_num);
menu_project -> addAction(m_project_terminalBloc); menu_project -> addAction(m_project_terminalBloc);
menu_project -> addSeparator();
menu_project -> addAction(m_export_project_db);
main_tool_bar -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la barre d'outils principale")); main_tool_bar -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la barre d'outils principale"));
view_tool_bar -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la barre d'outils Affichage")); view_tool_bar -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la barre d'outils Affichage"));

View File

@@ -187,6 +187,7 @@ class QETDiagramEditor : public QETMainWindow
QAction *m_add_nomenclature; ///< Add nomenclature graphics item; QAction *m_add_nomenclature; ///< Add nomenclature graphics item;
QAction *m_project_terminalBloc; ///< generate terminal block QAction *m_project_terminalBloc; ///< generate terminal block
QAction *m_project_export_conductor_num; ///<Export the wire num to csv QAction *m_project_export_conductor_num; ///<Export the wire num to csv
QAction *m_export_project_db; ///Export to file the internal database of the current project
QAction *m_tile_window; ///< Show MDI subwindows as tile QAction *m_tile_window; ///< Show MDI subwindows as tile
QAction *m_cascade_window; ///< Show MDI subwindows as cascade QAction *m_cascade_window; ///< Show MDI subwindows as cascade
QAction *m_previous_window; ///< Switch to the previous document QAction *m_previous_window; ///< Switch to the previous document

View File

@@ -102,12 +102,16 @@ QVariant NomenclatureModel::headerData(int section, Qt::Orientation orientation,
return QVariant(); return QVariant();
} }
if (m_header_data.contains(section))
{
auto hash_ = m_header_data.value(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 if (role == Qt::DisplayRole && !hash_.contains(Qt::DisplayRole)) { //special case to have the same behavior as Qt
return hash_.value(Qt::EditRole); return hash_.value(Qt::EditRole);
} }
return m_header_data.value(section).value(role); return m_header_data.value(section).value(role);
} }
return QVariant();
}
/** /**
* @brief NomenclatureModel::setData * @brief NomenclatureModel::setData
@@ -160,11 +164,35 @@ QVariant NomenclatureModel::data(const QModelIndex &index, int role) const
*/ */
void NomenclatureModel::query(const QString &query) void NomenclatureModel::query(const QString &query)
{ {
auto rm_ = m_query != query;
if (rm_)
{
auto headers = projectDataBase::headersFromElementsInfoQuery(query);
for (auto i=0 ; i<headers.size() ; ++i) {
this->setHeaderData(i, Qt::Horizontal, headers.at(i));
}
emit beginResetModel();
}
m_query = query; m_query = query;
if (m_project) { if (m_project)
m_project->dataBase()->updateDB(); {
if (rm_) {
disconnect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
} }
m_project->dataBase()->updateDB();
if (rm_) {
m_record = m_project->dataBase()->elementsInfoFromQuery(m_query);
connect(m_project->dataBase(), &projectDataBase::dataBaseUpdated, this, &NomenclatureModel::dataBaseUpdated);
}
}
if (rm_) { emit endResetModel();}
}
QETProject *NomenclatureModel::project() const {
return m_project.data();
} }
/** /**
@@ -173,10 +201,22 @@ void NomenclatureModel::query(const QString &query)
*/ */
void NomenclatureModel::dataBaseUpdated() void NomenclatureModel::dataBaseUpdated()
{ {
m_record.clear(); auto new_record = m_project->dataBase()->elementsInfoFromQuery(m_query);
m_record = m_project->dataBase()->elementsInfoFromQuery(m_query);
//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 beginInsertColumns(index(0,0), 0, m_record.size()-1);
m_record = new_record;
emit endInsertColumns();
}
else
{
m_record = new_record;
auto row = m_record.size(); auto row = m_record.size();
auto col = row ? m_record.first().count() : 1; auto col = row ? m_record.first().count() : 1;
emit dataChanged(this->index(0,0), this->index(row-1, col-1), QVector<int>(Qt::DisplayRole)); emit dataChanged(this->index(0,0), this->index(row-1, col-1), QVector<int>(Qt::DisplayRole));
} }
}

View File

@@ -42,6 +42,7 @@ class NomenclatureModel : public QAbstractTableModel
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) 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; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
void query(const QString &query); void query(const QString &query);
QETProject *project() const;
private: private:
void dataBaseUpdated(); void dataBaseUpdated();

View File

@@ -42,10 +42,14 @@ void QetGraphicsHeaderItem::setModel(QAbstractItemModel *model)
{ {
if (m_model) { if (m_model) {
disconnect(m_model, &QAbstractItemModel::headerDataChanged, this, &QetGraphicsHeaderItem::headerDataChanged); disconnect(m_model, &QAbstractItemModel::headerDataChanged, this, &QetGraphicsHeaderItem::headerDataChanged);
disconnect(m_model, &QAbstractItemModel::modelReset, this, &QetGraphicsHeaderItem::modelReseted);
disconnect(m_model, &QAbstractItemModel::columnsInserted, this, &QetGraphicsHeaderItem::modelReseted);
} }
m_model = model; m_model = model;
connect(m_model, &QAbstractItemModel::headerDataChanged, this, &QetGraphicsHeaderItem::headerDataChanged); connect(m_model, &QAbstractItemModel::headerDataChanged, this, &QetGraphicsHeaderItem::headerDataChanged);
connect(m_model, &QAbstractItemModel::modelReset, this, &QetGraphicsHeaderItem::modelReseted);
connect(m_model, &QAbstractItemModel::columnsInserted, this, &QetGraphicsHeaderItem::modelReseted);
setUpMinimumSectionsSize(); setUpMinimumSectionsSize();
m_current_sections_width.clear(); m_current_sections_width.clear();
m_current_sections_width.resize(m_sections_minimum_width.size()); m_current_sections_width.resize(m_sections_minimum_width.size());
@@ -264,3 +268,11 @@ void QetGraphicsHeaderItem::adjustSize()
update(); update();
} }
void QetGraphicsHeaderItem::modelReseted()
{
setUpMinimumSectionsSize();
m_current_sections_width.clear();
m_current_sections_width.resize(m_sections_minimum_width.size());
adjustSize();
}

View File

@@ -68,6 +68,7 @@ class QetGraphicsHeaderItem : public QGraphicsObject
void setUpBoundingRect(); void setUpBoundingRect();
void headerDataChanged(Qt::Orientations orientation, int first, int last); void headerDataChanged(Qt::Orientations orientation, int first, int last);
void adjustSize(); void adjustSize();
void modelReseted();
private: private:
QRectF m_bounding_rect; QRectF m_bounding_rect;

View File

@@ -66,8 +66,10 @@ QetGraphicsTableItem::~QetGraphicsTableItem()
*/ */
void QetGraphicsTableItem::setModel(QAbstractItemModel *model) void QetGraphicsTableItem::setModel(QAbstractItemModel *model)
{ {
if (m_model) { if (m_model)
{
disconnect(m_model, &QAbstractItemModel::dataChanged, this, &QetGraphicsTableItem::dataChanged); disconnect(m_model, &QAbstractItemModel::dataChanged, this, &QetGraphicsTableItem::dataChanged);
disconnect(m_model, &QAbstractItemModel::modelReset, this, &QetGraphicsTableItem::modelReseted);
} }
m_model = model; m_model = model;
m_header_item->setModel(model); m_header_item->setModel(model);
@@ -77,6 +79,7 @@ void QetGraphicsTableItem::setModel(QAbstractItemModel *model)
m_header_item->setPos(0, -m_header_item->rect().height()); m_header_item->setPos(0, -m_header_item->rect().height());
connect(m_model, &QAbstractItemModel::dataChanged, this, &QetGraphicsTableItem::dataChanged); connect(m_model, &QAbstractItemModel::dataChanged, this, &QetGraphicsTableItem::dataChanged);
connect(m_model, &QAbstractItemModel::modelReset, this, &QetGraphicsTableItem::modelReseted);
} }
/** /**
@@ -274,6 +277,10 @@ bool QetGraphicsTableItem::sceneEventFilter(QGraphicsItem *watched, QEvent *even
return false; return false;
} }
void QetGraphicsTableItem::modelReseted() {
dataChanged(m_model->index(0,0), m_model->index(0,0), QVector<int>());
}
/** /**
* @brief QetGraphicsTableItem::setUpColumnAndRowMinimumSize * @brief QetGraphicsTableItem::setUpColumnAndRowMinimumSize
* Calcule the minimum row height and the minimum column width for each columns * Calcule the minimum row height and the minimum column width for each columns
@@ -377,7 +384,8 @@ void QetGraphicsTableItem::adjustColumnsWidth()
auto b = a/std::max(1,m_model->columnCount()); //avoid divide by 0 auto b = a/std::max(1,m_model->columnCount()); //avoid divide by 0
for(auto i= 0 ; i<m_model->columnCount() ; ++i) { for(auto i= 0 ; i<m_model->columnCount() ; ++i) {
m_header_item->resizeSection(i, std::max(m_minimum_column_width.at(i), m_header_item->minimumSectionWidth().at(i)) + b); m_header_item->resizeSection(i, std::max(m_minimum_column_width.at(std::min(m_minimum_column_width.size()-1, i)),
m_header_item->minimumSectionWidth().at(std::min(m_header_item->minimumSectionWidth().size()-1, i))) + b);
} }
} }
@@ -391,7 +399,6 @@ void QetGraphicsTableItem::dataChanged(const QModelIndex &topLeft, const QModelI
setUpColumnAndRowMinimumSize(); setUpColumnAndRowMinimumSize();
adjustSize(); adjustSize();
setSize(size_); setSize(size_);
qDebug() << "data changed";
} }
/** /**

View File

@@ -18,6 +18,10 @@
#include "nomenclaturemodelpropertieswidget.h" #include "nomenclaturemodelpropertieswidget.h"
#include "ui_nomenclaturemodelpropertieswidget.h" #include "ui_nomenclaturemodelpropertieswidget.h"
#include "nomenclaturemodel.h" #include "nomenclaturemodel.h"
#include "qetproject.h"
#include "elementquerywidget.h"
#include <QDialogButtonBox>
/** /**
* @brief NomenclatureModelPropertiesWidget::NomenclatureModelPropertiesWidget * @brief NomenclatureModelPropertiesWidget::NomenclatureModelPropertiesWidget
@@ -49,11 +53,30 @@ void NomenclatureModelPropertiesWidget::setModel(NomenclatureModel *model) {
m_model = model; m_model = model;
} }
/**
* @brief NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked
*/
void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked() void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
{} {
QDialog d(this);
auto l = new QVBoxLayout(this);
d.setLayout(l);
auto query_widget = new ElementQueryWidget(&d);
l->addWidget(query_widget);
auto button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
l->addWidget(button_box);
connect(button_box, &QDialogButtonBox::accepted, &d, &QDialog::accept);
connect(button_box, &QDialogButtonBox::rejected, &d, &QDialog::reject);
if (d.exec()) {
m_model->query(query_widget->queryStr());
}
}
void NomenclatureModelPropertiesWidget::on_m_refresh_pb_clicked() { void NomenclatureModelPropertiesWidget::on_m_refresh_pb_clicked() {
if (m_model) { if (m_model && m_model->project()) {
m_model->query("SELECT plant, location, label, comment, description FROM element_info ORDER BY plant, location, label, comment, description"); m_model->project()->dataBase()->updateDB();
} }
} }

View File

@@ -60,7 +60,6 @@ class BOMExportDialog : public QDialog
QString headers() const; QString headers() const;
bool createDataBase(); bool createDataBase();
void populateDataBase(); void populateDataBase();
void prepareQuery(QStringList keys);
QHash<QString, QString> elementInfoToString(Element *elmt) const; QHash<QString, QString> elementInfoToString(Element *elmt) const;
QString queryStr() const; QString queryStr() const;
void updateQueryLine(); void updateQueryLine();

View File

@@ -1,5 +1,5 @@
/* /*
Copyright 2006-2019 The QElectroTech Team Copyright 2006-2020 The QElectroTech Team
This file is part of QElectroTech. This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify QElectroTech is free software: you can redistribute it and/or modify