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

@@ -1,4 +1,4 @@
/*
/*
Copyright 2006-2020 QElectroTech Team
This file is part of QElectroTech.
@@ -20,6 +20,8 @@
#include "qetproject.h"
#include "elementprovider.h"
#include "element.h"
#include "diagram.h"
#include "diagramposition.h"
#include <QSqlError>
@@ -36,6 +38,13 @@ projectDataBase::projectDataBase(QETProject *project, QObject *parent) :
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
* Destructor
@@ -75,6 +84,39 @@ QVector<QStringList> projectDataBase::elementsInfoFromQuery(const QString &query
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
* Up to date the content of the data base.
@@ -89,20 +131,33 @@ void projectDataBase::updateDB()
emit dataBaseUpdated();
}
/**
* @brief projectDataBase::project
* @return the project of this database
*/
QETProject *projectDataBase::project() const {
return m_project;
}
/**
* @brief projectDataBase::createDataBase
* Create the data base
* @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)) {
m_data_base = QSqlDatabase::database(connect_name);
}
else
{
m_data_base = QSqlDatabase::addDatabase("QSQLITE", connect_name);
m_data_base.setDatabaseName(name);
if(!m_data_base.open())
{
m_data_base.close();
@@ -177,6 +232,7 @@ void projectDataBase::populateElementsTable()
query.bindValue(":element_type", elmt->linkTypeToString());
query.bindValue(":element_subtype", elmt->kindInformations()["type"].toString());
query.bindValue(":pos", elmt->diagram()->convertPosition(elmt->scenePos()).toString());
if (!query.exec()) {
qDebug() << "projectDataBase::populateElementsTable insert error : " << query.lastError();
@@ -210,10 +266,47 @@ QHash<QString, QString> projectDataBase::elementInfoToString(Element *elmt)
* @brief projectDataBase::elementsInfoKeys
* @return QETApp::elementInfoKeys() + "element_type" and "element_subtype"
*/
QStringList projectDataBase::elementsInfoKeys() const
QStringList projectDataBase::elementsInfoKeys()
{
auto keys_ = QETApp::elementInfoKeys();
keys_<< "element_type" << "element_subtype";
keys_<< "element_type" << "subtype" << "pos";
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
This file is part of QElectroTech.
@@ -22,6 +22,7 @@
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QPointer>
#include <QFileDialog>
class Element;
class QETProject;
@@ -39,24 +40,33 @@ class projectDataBase : public QObject
public:
projectDataBase(QETProject *project, QObject *parent = nullptr);
private:
projectDataBase(QETProject *project, const QString &connection_name, const QString &path, QObject *parent = nullptr);
public:
virtual ~projectDataBase() override;
QVector<QStringList> elementsInfoFromQuery(const QString &query);
void updateDB();
QETProject *project() const;
static QStringList elementsInfoKeys();
static QStringList headersFromElementsInfoQuery(const QString &query);
signals:
void dataBaseUpdated();
private:
bool createDataBase();
bool createDataBase(const QString &connection_name= QString(), const QString &name = QString());
void populateElementsTable();
static QHash<QString, QString> elementInfoToString(Element *elmt);
QStringList elementsInfoKeys() const;
private:
QPointer<QETProject> m_project;
QSqlDatabase m_data_base;
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

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>