mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-18 13:30:34 +01:00
Add nomenclature model
Add class NomenclatureModel witch is used with QetGraphicsTableItem. Add ProjectDataBase class, the goal of this class is to store all information of a project at an instant T to easilly find it. This class is still in development and not provide all information that she should.
This commit is contained in:
@@ -102,6 +102,7 @@ INCLUDEPATH += sources \
|
|||||||
sources/NameList/ui \
|
sources/NameList/ui \
|
||||||
sources/utils \
|
sources/utils \
|
||||||
sources/pugixml \
|
sources/pugixml \
|
||||||
|
sources/dataBase
|
||||||
|
|
||||||
|
|
||||||
# Fichiers sources
|
# Fichiers sources
|
||||||
@@ -130,7 +131,8 @@ HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) \
|
|||||||
$$files(sources/NameList/*.h) \
|
$$files(sources/NameList/*.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)
|
||||||
|
|
||||||
SOURCES += $$files(sources/*.cpp) \
|
SOURCES += $$files(sources/*.cpp) \
|
||||||
$$files(sources/editor/*.cpp) \
|
$$files(sources/editor/*.cpp) \
|
||||||
@@ -158,7 +160,8 @@ SOURCES += $$files(sources/*.cpp) \
|
|||||||
$$files(sources/NameList/*.cpp) \
|
$$files(sources/NameList/*.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)
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
206
sources/dataBase/projectdatabase.cpp
Normal file
206
sources/dataBase/projectdatabase.cpp
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "projectdatabase.h"
|
||||||
|
#include "qetapp.h"
|
||||||
|
#include "qetproject.h"
|
||||||
|
#include "elementprovider.h"
|
||||||
|
#include "element.h"
|
||||||
|
|
||||||
|
#include <QSqlError>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::projectDataBase
|
||||||
|
* Default constructor
|
||||||
|
* @param project : project from the database work
|
||||||
|
* @param parent : parent QObject
|
||||||
|
*/
|
||||||
|
projectDataBase::projectDataBase(QETProject *project, QObject *parent) :
|
||||||
|
QObject(parent),
|
||||||
|
m_project(project)
|
||||||
|
{
|
||||||
|
createDataBase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::~projectDataBase
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
projectDataBase::~projectDataBase() {
|
||||||
|
m_data_base.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::elementsInfoFromQuery
|
||||||
|
* @param query
|
||||||
|
* @return quickly return all information about elements from @query, ensure that all
|
||||||
|
* record returned by the query can be casted to string.
|
||||||
|
* Each item of the Qvector represent an element and each value of the QStringList represent the recorded value.
|
||||||
|
*/
|
||||||
|
QVector<QStringList> projectDataBase::elementsInfoFromQuery(const QString &query)
|
||||||
|
{
|
||||||
|
QVector<QStringList> result_;
|
||||||
|
|
||||||
|
QSqlQuery query_(query, m_data_base);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
result_ << record_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::createDataBase
|
||||||
|
* Create the data base
|
||||||
|
* @return : true if the data base was successfully created.
|
||||||
|
*/
|
||||||
|
bool projectDataBase::createDataBase()
|
||||||
|
{
|
||||||
|
QString 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);
|
||||||
|
if(!m_data_base.open())
|
||||||
|
{
|
||||||
|
m_data_base.close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create the elements table
|
||||||
|
QString elements_table("CREATE TABLE element_info(");
|
||||||
|
bool first = true;
|
||||||
|
for (auto string : elementsInfoKeys())
|
||||||
|
{
|
||||||
|
if (first) {
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
elements_table += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
elements_table += string += " VARCHAR(512)";
|
||||||
|
}
|
||||||
|
elements_table += ");";
|
||||||
|
|
||||||
|
QSqlQuery query_(elements_table, m_data_base);
|
||||||
|
query_.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
populateElementsTable();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::populateElementsTable
|
||||||
|
* Populate the elements table
|
||||||
|
*/
|
||||||
|
void projectDataBase::populateElementsTable()
|
||||||
|
{
|
||||||
|
//Very ugly, in futur we should update the table instead of delete all
|
||||||
|
QSqlQuery clear_table(m_data_base);
|
||||||
|
if (!clear_table.exec("DELETE FROM element_info")) {
|
||||||
|
qDebug() << "last error " << clear_table.lastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Prepare the query used for insert new record
|
||||||
|
QStringList bind_values;
|
||||||
|
for (auto key : elementsInfoKeys()) {
|
||||||
|
bind_values << key.prepend(":");
|
||||||
|
}
|
||||||
|
QString insert("INSERT INTO element_info (" +
|
||||||
|
elementsInfoKeys().join(", ") +
|
||||||
|
") VALUES (" +
|
||||||
|
bind_values.join(", ") +
|
||||||
|
")");
|
||||||
|
|
||||||
|
QSqlQuery query(m_data_base);
|
||||||
|
query.prepare(insert);
|
||||||
|
|
||||||
|
|
||||||
|
for (auto *diagram : m_project->diagrams())
|
||||||
|
{
|
||||||
|
ElementProvider ep(diagram);
|
||||||
|
QList<Element *> elements_list = ep.find(Element::Simple | Element::Terminale | Element::Master);
|
||||||
|
|
||||||
|
//Insert all value into the database
|
||||||
|
for (auto elmt : elements_list)
|
||||||
|
{
|
||||||
|
auto hash = elementInfoToString(elmt);
|
||||||
|
for (auto key : hash.keys())
|
||||||
|
{
|
||||||
|
QString value = hash.value(key);
|
||||||
|
QString bind = key.prepend(":");
|
||||||
|
query.bindValue(bind, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
query.bindValue(":element_type", elmt->linkTypeToString());
|
||||||
|
query.bindValue(":element_subtype", elmt->kindInformations()["type"].toString());
|
||||||
|
|
||||||
|
if (!query.exec()) {
|
||||||
|
qDebug() << "projectDataBase::populateElementsTable insert error : " << query.lastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::elementInfoToString
|
||||||
|
* @param elmt
|
||||||
|
* @return the element information in hash as key for the info name and value as the information value.
|
||||||
|
*/
|
||||||
|
QHash<QString, QString> projectDataBase::elementInfoToString(Element *elmt)
|
||||||
|
{
|
||||||
|
QHash<QString, QString> hash; //Store the value for each columns
|
||||||
|
for (auto key : QETApp::elementInfoKeys())
|
||||||
|
{
|
||||||
|
if (key == "label") {
|
||||||
|
hash.insert(key, elmt->actualLabel());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hash.insert(key, elmt->elementInformations()[key].toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief projectDataBase::elementsInfoKeys
|
||||||
|
* @return QETApp::elementInfoKeys() + "element_type" and "element_subtype"
|
||||||
|
*/
|
||||||
|
QStringList projectDataBase::elementsInfoKeys() const
|
||||||
|
{
|
||||||
|
auto keys_ = QETApp::elementInfoKeys();
|
||||||
|
keys_<< "element_type" << "element_subtype";
|
||||||
|
|
||||||
|
return keys_;
|
||||||
|
}
|
||||||
59
sources/dataBase/projectdatabase.h
Normal file
59
sources/dataBase/projectdatabase.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef PROJECTDATABASE_H
|
||||||
|
#define PROJECTDATABASE_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlQuery>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
|
#include "qetproject.h"
|
||||||
|
|
||||||
|
class Element;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The projectDataBase class
|
||||||
|
* This class wrap a sqlite data base where you can find several thing about
|
||||||
|
* the content of a project.
|
||||||
|
*
|
||||||
|
* NOTE this class is still in developement.
|
||||||
|
*/
|
||||||
|
class projectDataBase : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
projectDataBase(QETProject *project, QObject *parent = nullptr);
|
||||||
|
virtual ~projectDataBase() override;
|
||||||
|
|
||||||
|
QVector<QStringList> elementsInfoFromQuery(const QString &query);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool createDataBase();
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PROJECTDATABASE_H
|
||||||
@@ -297,15 +297,15 @@ QStringList QETApp::elementInfoKeys()
|
|||||||
|
|
||||||
<< "comment"
|
<< "comment"
|
||||||
<< "function"
|
<< "function"
|
||||||
<< "tension-protocol"
|
<< "tension_protocol"
|
||||||
<< "auxiliary1"
|
<< "auxiliary1"
|
||||||
<< "auxiliary2"
|
<< "auxiliary2"
|
||||||
|
|
||||||
<< "description"
|
<< "description"
|
||||||
<< "designation"
|
<< "designation"
|
||||||
<< "manufacturer"
|
<< "manufacturer"
|
||||||
<< "manufacturer-reference"
|
<< "manufacturer_reference"
|
||||||
<< "machine-manufacturer-reference"
|
<< "machine_manufacturer_reference"
|
||||||
<< "supplier"
|
<< "supplier"
|
||||||
<< "quantity"
|
<< "quantity"
|
||||||
<< "unity";
|
<< "unity";
|
||||||
@@ -328,15 +328,15 @@ QString QETApp::elementTranslatedInfoKey(const QString &info)
|
|||||||
|
|
||||||
else if (info == "comment") return tr("Commentaire");
|
else if (info == "comment") return tr("Commentaire");
|
||||||
else if (info == "function") return tr("Fonction");
|
else if (info == "function") return tr("Fonction");
|
||||||
else if (info == "tension-protocol") return tr("Tension / Protocole");
|
else if (info == "tension_protocol") return tr("Tension / Protocole");
|
||||||
else if (info == "auxiliary1") return tr("Bloc auxiliaire 1");
|
else if (info == "auxiliary1") return tr("Bloc auxiliaire 1");
|
||||||
else if (info == "auxiliary2") return tr("Bloc auxiliaire 2");
|
else if (info == "auxiliary2") return tr("Bloc auxiliaire 2");
|
||||||
|
|
||||||
else if (info == "description") return tr("Description textuelle");
|
else if (info == "description") return tr("Description textuelle");
|
||||||
else if (info == "designation") return tr("Numéro d'article");
|
else if (info == "designation") return tr("Numéro d'article");
|
||||||
else if (info == "manufacturer") return tr("Fabricant");
|
else if (info == "manufacturer") return tr("Fabricant");
|
||||||
else if (info == "manufacturer-reference") return tr("Numéro de commande");
|
else if (info == "manufacturer_reference") return tr("Numéro de commande");
|
||||||
else if (info == "machine-manufacturer-reference") return tr("Numéro interne");
|
else if (info == "machine_manufacturer_reference") return tr("Numéro interne");
|
||||||
else if (info == "supplier") return tr("Fournisseur");
|
else if (info == "supplier") return tr("Fournisseur");
|
||||||
else if (info == "quantity") return tr("Quantité");
|
else if (info == "quantity") return tr("Quantité");
|
||||||
else if (info == "unity") return tr("Unité");
|
else if (info == "unity") return tr("Unité");
|
||||||
@@ -362,16 +362,16 @@ QString QETApp::elementInfoToVar(const QString &info)
|
|||||||
else if (info == "description") return QString("%{description}");
|
else if (info == "description") return QString("%{description}");
|
||||||
else if (info == "designation") return QString("%{designation}");
|
else if (info == "designation") return QString("%{designation}");
|
||||||
else if (info == "manufacturer") return QString("%{manufacturer}");
|
else if (info == "manufacturer") return QString("%{manufacturer}");
|
||||||
else if (info == "manufacturer-reference") return QString("%{manufacturer-reference}");
|
else if (info == "manufacturer_reference") return QString("%{manufacturer_reference}");
|
||||||
else if (info == "supplier") return QString("%{supplier}");
|
else if (info == "supplier") return QString("%{supplier}");
|
||||||
else if (info == "quantity") return QString("%{quantity}");
|
else if (info == "quantity") return QString("%{quantity}");
|
||||||
else if (info == "unity") return QString("%{unity}");
|
else if (info == "unity") return QString("%{unity}");
|
||||||
else if (info == "auxiliary1") return QString("%{auxiliary1}");
|
else if (info == "auxiliary1") return QString("%{auxiliary1}");
|
||||||
else if (info == "auxiliary2") return QString("%{auxiliary2}");
|
else if (info == "auxiliary2") return QString("%{auxiliary2}");
|
||||||
else if (info == "machine-manufacturer-reference") return QString("%{machine-manufacturer-reference}");
|
else if (info == "machine_manufacturer_reference") return QString("%{machine_manufacturer_reference}");
|
||||||
else if (info == "location") return QString("%{location}");
|
else if (info == "location") return QString("%{location}");
|
||||||
else if (info == "function") return QString("%{function}");
|
else if (info == "function") return QString("%{function}");
|
||||||
else if (info == "tension-protocol") return QString("%{tension-protocol}");
|
else if (info == "tension_protocol") return QString("%{tension_protocol}");
|
||||||
|
|
||||||
return (QString ("%{void}"));
|
return (QString ("%{void}"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
#include "addelementtextcommand.h"
|
#include "addelementtextcommand.h"
|
||||||
#include "conductornumexport.h"
|
#include "conductornumexport.h"
|
||||||
#include "qetgraphicstableitem.h"
|
#include "qetgraphicstableitem.h"
|
||||||
|
#include "nomenclaturemodel.h"
|
||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
@@ -403,9 +404,29 @@ void QETDiagramEditor::setUpActions()
|
|||||||
|
|
||||||
//Add a nomenclature item
|
//Add a nomenclature item
|
||||||
m_add_nomenclature = new QAction(QET::Icons::TableOfContent, tr("Ajouter un tableau lambda (Fonctionnalité en cours de devellopement)"),this);
|
m_add_nomenclature = new QAction(QET::Icons::TableOfContent, tr("Ajouter un tableau lambda (Fonctionnalité en cours de devellopement)"),this);
|
||||||
connect(m_add_nomenclature, &QAction::triggered, [this]() {
|
connect(m_add_nomenclature, &QAction::triggered, [this]()
|
||||||
if(this->currentDiagramView()) {
|
{
|
||||||
this->currentDiagramView()->diagram()->addItem(new QetGraphicsTableItem());
|
if(this->currentDiagramView())
|
||||||
|
{
|
||||||
|
auto table = new QetGraphicsTableItem();
|
||||||
|
|
||||||
|
/*******ONLY FOR TEST DURING DEVEL*********/
|
||||||
|
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->setData(model->index(0,0), Qt::AlignLeft, Qt::TextAlignmentRole);
|
||||||
|
model->setData(model->index(0,0), QETApp::diagramTextsFont(), Qt::FontRole);
|
||||||
|
model->setHeaderData(0, Qt::Horizontal, Qt::AlignHCenter, Qt::TextAlignmentRole);
|
||||||
|
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);
|
||||||
|
/******************************************/
|
||||||
|
|
||||||
|
this->currentDiagramView()->diagram()->addItem(table);
|
||||||
|
table->setPos(50,50);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
164
sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp
Normal file
164
sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "nomenclaturemodel.h"
|
||||||
|
#include "qetapp.h"
|
||||||
|
|
||||||
|
#include <QModelIndex>
|
||||||
|
#include <QFont>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief NomenclatureModel::NomenclatureModel
|
||||||
|
* @param project :project of this nomenclature
|
||||||
|
* @param parent : parent QObject
|
||||||
|
*/
|
||||||
|
NomenclatureModel::NomenclatureModel(QETProject *project, QObject *parent) :
|
||||||
|
QAbstractTableModel(parent),
|
||||||
|
m_project(project),
|
||||||
|
m_database(project)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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<int>(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)
|
||||||
|
{
|
||||||
|
m_query = query;
|
||||||
|
m_record.clear();
|
||||||
|
m_record = m_database.elementsInfoFromQuery(query);
|
||||||
|
}
|
||||||
57
sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h
Normal file
57
sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef NOMENCLATUREMODEL_H
|
||||||
|
#define NOMENCLATUREMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
#include <QPointer>
|
||||||
|
#include "projectdatabase.h"
|
||||||
|
|
||||||
|
|
||||||
|
class QETProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The NomenclatureModel class
|
||||||
|
* An element nomenclature Model.
|
||||||
|
* This model represent a 2D data.
|
||||||
|
*/
|
||||||
|
class NomenclatureModel : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit NomenclatureModel(QETProject *project, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPointer<QETProject> m_project;
|
||||||
|
QString m_query;
|
||||||
|
projectDataBase m_database;
|
||||||
|
QVector<QStringList> m_record;
|
||||||
|
QHash<int, QHash<int, QVariant>> m_header_data;
|
||||||
|
QHash<int, QVariant> m_index_0_0_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NOMENCLATUREMODEL_H
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2006-2019 QElectroTech Team
|
Copyright 2006-2020 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
|
||||||
|
|||||||
@@ -52,31 +52,6 @@ QetGraphicsTableItem::QetGraphicsTableItem(QGraphicsItem *parent) :
|
|||||||
connect(m_header_item, &QetGraphicsHeaderItem::heightResized, this, [this]() {
|
connect(m_header_item, &QetGraphicsHeaderItem::heightResized, this, [this]() {
|
||||||
m_header_item->setPos(0, 0-m_header_item->rect().height());
|
m_header_item->setPos(0, 0-m_header_item->rect().height());
|
||||||
});
|
});
|
||||||
|
|
||||||
/*******ONLY FOR TEST DURING DEVEL*********/
|
|
||||||
auto model = new QStandardItemModel(this);
|
|
||||||
int r = 20;
|
|
||||||
int c = 5;
|
|
||||||
|
|
||||||
for (int row = 0; row < r; ++row)
|
|
||||||
{
|
|
||||||
for (int column = 0; column < c; ++column) {
|
|
||||||
QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
|
|
||||||
model->setItem(row, column, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
model->setData(model->index(0,0), Qt::AlignLeft, Qt::TextAlignmentRole);
|
|
||||||
model->setData(model->index(0,0), QETApp::diagramTextsFont(), Qt::FontRole);
|
|
||||||
model->setHeaderData(0, Qt::Horizontal, Qt::AlignHCenter, Qt::TextAlignmentRole);
|
|
||||||
model->setHeaderData(0, Qt::Horizontal, QETApp::diagramTextsFont(), Qt::FontRole);
|
|
||||||
model->setHeaderData(0, Qt::Horizontal, "Label");
|
|
||||||
model->setHeaderData(1, Qt::Horizontal, "Folio");
|
|
||||||
model->setHeaderData(2, Qt::Horizontal, "Fonction");
|
|
||||||
model->setHeaderData(3, Qt::Horizontal, "Fabricant");
|
|
||||||
model->setHeaderData(4, Qt::Horizontal, "Installation");
|
|
||||||
this->setModel(model);
|
|
||||||
this->setPos(50,50);
|
|
||||||
/******************************************/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QetGraphicsTableItem::~QetGraphicsTableItem()
|
QetGraphicsTableItem::~QetGraphicsTableItem()
|
||||||
@@ -399,7 +374,7 @@ void QetGraphicsTableItem::handlerMouseReleaseEvent(QGraphicsSceneMouseEvent *ev
|
|||||||
void QetGraphicsTableItem::adjustColumnsWidth()
|
void QetGraphicsTableItem::adjustColumnsWidth()
|
||||||
{
|
{
|
||||||
auto a = m_current_size.width() - minimumSize().width();
|
auto a = m_current_size.width() - minimumSize().width();
|
||||||
auto b = a/m_model->columnCount();
|
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(i), m_header_item->minimumSectionWidth().at(i)) + b);
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ class QetGraphicsHeaderItem;
|
|||||||
* Text font.
|
* Text font.
|
||||||
* Text alignment in the cell
|
* Text alignment in the cell
|
||||||
* These two last parameters are not settable directly with the table but trough the model to be displayed by the table.
|
* These two last parameters are not settable directly with the table but trough the model to be displayed by the table.
|
||||||
|
* The table search for font and alignment only in the index(0,0) for all the table.
|
||||||
|
* By consequence, set data in other index than 0,0 is useless also the alignment and font can't be set individually for each cell.
|
||||||
*/
|
*/
|
||||||
class QetGraphicsTableItem : public QetGraphicsItem
|
class QetGraphicsTableItem : public QetGraphicsItem
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -249,8 +249,10 @@ void GraphicsTablePropertiesEditor::updateUi()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_header_button_group->button(m_table_item->model()->headerData(0, Qt::Horizontal, Qt::TextAlignmentRole).toInt())->setChecked(true);
|
if (auto button = m_header_button_group->button(m_table_item->model()->headerData(0, Qt::Horizontal, Qt::TextAlignmentRole).toInt()))
|
||||||
m_table_button_group->button(m_table_item->model()->data(m_table_item->model()->index(0,0), Qt::TextAlignmentRole).toInt())->setChecked(true);
|
button->setChecked(true);
|
||||||
|
if (auto button = m_table_button_group->button(m_table_item->model()->data(m_table_item->model()->index(0,0), Qt::TextAlignmentRole).toInt()))
|
||||||
|
button->setChecked(true);
|
||||||
|
|
||||||
setUpEditConnection();
|
setUpEditConnection();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,6 +112,14 @@ QETProject::~QETProject() {
|
|||||||
qDeleteAll(m_diagrams_list);
|
qDeleteAll(m_diagrams_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief QETProject::uuid
|
||||||
|
* @return the uuid of this project
|
||||||
|
*/
|
||||||
|
QUuid QETProject::uuid() const {
|
||||||
|
return m_uuid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief QETProject::init
|
* @brief QETProject::init
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ class QETProject : public QObject
|
|||||||
|
|
||||||
// methods
|
// methods
|
||||||
public:
|
public:
|
||||||
|
QUuid uuid() const;
|
||||||
ProjectState state() const;
|
ProjectState state() const;
|
||||||
QList<Diagram *> diagrams() const;
|
QList<Diagram *> diagrams() const;
|
||||||
int getFolioSheetsQuantity() const; /// get the folio sheets quantity for this project
|
int getFolioSheetsQuantity() const; /// get the folio sheets quantity for this project
|
||||||
@@ -266,6 +267,7 @@ class QETProject : public QObject
|
|||||||
QTimer m_save_backup_timer,
|
QTimer m_save_backup_timer,
|
||||||
m_autosave_timer;
|
m_autosave_timer;
|
||||||
KAutoSaveFile *m_backup_file = nullptr;
|
KAutoSaveFile *m_backup_file = nullptr;
|
||||||
|
QUuid m_uuid = QUuid::createUuid();
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QETProject *)
|
Q_DECLARE_METATYPE(QETProject *)
|
||||||
|
|||||||
Reference in New Issue
Block a user