diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp index 0989b9e19..7a8adbb01 100644 --- a/sources/dataBase/projectdatabase.cpp +++ b/sources/dataBase/projectdatabase.cpp @@ -93,23 +93,48 @@ QVector projectDataBase::elementsInfoFromQuery(const QString &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 (!query.startsWith("SELECT ") && !query.contains("FROM")) { + return header_string; + } - if (!list.isEmpty()) + 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(","); //split each column + + if (list.isEmpty()) { + return header_string; + } + + for (int i=0 ; isetupUi(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_export_info.insert("e.pos", tr("Position")); + m_export_info.insert("di.title", tr("Titre du folio")); + m_export_info.insert("d.pos", tr("Position du folio")); + m_export_info.insert("di.folio", tr("Numéro du folio")); m_button_group.setExclusive(false); m_button_group.addButton(ui->m_all_cb, 0); @@ -110,6 +109,7 @@ QString ElementQueryWidget::queryStr() const QString select ="SELECT "; QString order_by = " ORDER BY "; + QString filter_; QString column; bool first = true; @@ -122,35 +122,64 @@ QString ElementQueryWidget::queryStr() const } column += key; order_by += key; + + auto f = FilterFor(key); + switch (f.first) + { + case 0: //No filter + break; + case 1: //Not empty + filter_ += QString(" AND ") += key += " IS NOT NULL"; + break; + case 2: //empty + filter_ += QString(" AND ") += key += " IS NULL"; + break; + case 3: // contain + filter_ += QString(" AND ") += key += QString(" LIKE'%") += f.second += "%'"; + break; + case 4: // not contain + filter_ += QString(" AND ") += key += QString(" NOT LIKE'%") += f.second += "%'"; + break; + case 5: // is equal + filter_ += QString(" AND ") += key += QString("='") += f.second += "'"; + break; + case 6: // is not equal + filter_ += QString(" AND ") += key += QString("!='") += f.second += "'"; + break; + } } - QString from = " FROM element_info"; - QString where; + QString from = " FROM element_info ei, element e, diagram d, diagram_info di"; + QString where = " WHERE ei.element_uuid = e.uuid" + " AND di.diagram_uuid = d.uuid" + " AND e.diagram_uuid = d.uuid"; + 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; - } + if (ui->m_terminal_cb->isChecked()) {where += " AND e.type = 'Terminale'";} + if (ui->m_simple_cb->isChecked()) {where += " AND e.type = 'Simple'";} + if (ui->m_button_cb->isChecked()) {where += " AND e.sub_type = 'commutator'";} + if (ui->m_coil_cb->isChecked()) {where += " AND e.sub_type = 'coil'";} + if (ui->m_protection_cb->isChecked()) {where += " AND e.sub_type = 'protection'";} + } + + + QString q(select + column + from + where + filter_ + order_by); + return q; +} + +QStringList ElementQueryWidget::header() const +{ + //Made a string list with the colomns (keys) choosen by the user + QStringList headers; + int row = 0; + while (auto *item = ui->m_choosen_list->item(row)) + { + headers.append(item->data(Qt::DisplayRole).toString()); + ++row; } - QString q(select + column + from + where + order_by); - return q; + return headers; } /** @@ -183,10 +212,11 @@ void ElementQueryWidget::setUpItems() for(QString key : QETApp::elementInfoKeys()) { auto item = new QListWidgetItem(QETApp::elementTranslatedInfoKey(key), ui->m_var_list); - item->setData(Qt::UserRole, key); + item->setData(Qt::UserRole, "ei." + 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); @@ -195,6 +225,15 @@ void ElementQueryWidget::setUpItems() } } +/** + * @brief ElementQueryWidget::FilterFor + * @param key + * @return the filter associated to key + */ +QPair ElementQueryWidget::FilterFor(const QString &key) const { + return m_filter.value(key, qMakePair(0, QString())); +} + /** * @brief ElementQueryWidget::on_m_up_pb_clicked */ @@ -272,3 +311,54 @@ void ElementQueryWidget::on_m_edit_sql_query_cb_clicked() updateQueryLine(); } } + +void ElementQueryWidget::on_m_plant_textChanged(const QString &arg1) { + Q_UNUSED(arg1) + updateQueryLine(); +} + +void ElementQueryWidget::on_m_location_textChanged(const QString &arg1) { + Q_UNUSED(arg1) + updateQueryLine(); +} + +void ElementQueryWidget::on_m_filter_le_textEdited(const QString &arg1) +{ + if (auto item = ui->m_choosen_list->currentItem()) + { + auto key = item->data(Qt::UserRole).toString(); + auto type = ui->m_filter_type_cb->currentIndex(); + auto value = arg1; + + m_filter.insert(key, qMakePair(type, value)); + updateQueryLine(); + } +} + +void ElementQueryWidget::on_m_filter_type_cb_activated(int index) +{ + if (auto item = ui->m_choosen_list->currentItem()) + { + auto key = item->data(Qt::UserRole).toString(); + auto type = index; + auto value = ui->m_filter_le->text(); + + m_filter.insert(key, qMakePair(type, value)); + ui->m_filter_le->setDisabled(index <= 2); + updateQueryLine(); + } +} + +void ElementQueryWidget::on_m_choosen_list_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) +{ + Q_UNUSED(previous) + + if (!current) + return; + + auto key = current->data(Qt::UserRole).toString(); + auto p = FilterFor(key); + ui->m_filter_type_cb->setCurrentIndex(p.first); + ui->m_filter_le->setText(p.second); + ui->m_filter_le->setEnabled(p.first>=3); +} diff --git a/sources/dataBase/ui/elementquerywidget.h b/sources/dataBase/ui/elementquerywidget.h index 4b9e126ba..09a7c6e09 100644 --- a/sources/dataBase/ui/elementquerywidget.h +++ b/sources/dataBase/ui/elementquerywidget.h @@ -41,6 +41,7 @@ class ElementQueryWidget : public QWidget ~ElementQueryWidget(); QString queryStr() const; + QStringList header() const; private slots: void on_m_up_pb_clicked(); @@ -48,17 +49,25 @@ class ElementQueryWidget : public QWidget void on_m_remove_pb_clicked(); void on_m_down_pb_clicked(); void on_m_edit_sql_query_cb_clicked(); + void on_m_plant_textChanged(const QString &arg1); + void on_m_location_textChanged(const QString &arg1); + void on_m_filter_le_textEdited(const QString &arg1); + void on_m_filter_type_cb_activated(int index); void updateQueryLine(); QStringList selectedKeys() const; void setUpItems(); + QPair FilterFor(const QString &key) const; - private: + void on_m_choosen_list_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + + private: Ui::ElementQueryWidget *ui; QHash m_export_info; QButtonGroup m_button_group; QList m_items_list; QString m_custom_query; + QHash > m_filter; }; #endif // ELEMENTQUERYWIDGET_H diff --git a/sources/dataBase/ui/elementquerywidget.ui b/sources/dataBase/ui/elementquerywidget.ui index deacb2419..3973c78ab 100644 --- a/sources/dataBase/ui/elementquerywidget.ui +++ b/sources/dataBase/ui/elementquerywidget.ui @@ -7,7 +7,7 @@ 0 0 341 - 457 + 527 @@ -163,6 +163,61 @@ + + + + + + + + Pas de filtre + + + + + N'est pas vide + + + + + Est vide + + + + + Contient + + + + + Ne contient pas + + + + + Est égal à + + + + + N'est pas égale à + + + + + + + + + + + Filtre : + + + + + + diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index a13da9e07..123d76b2a 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -412,11 +412,12 @@ void QETDiagramEditor::setUpActions() /*******ONLY FOR TEST DURING DEVEL*********/ auto model = new NomenclatureModel(this->currentProject(), this->currentProject()); - QString query("SELECT ei.plant AS plant, ei.location AS location, di.title AS title, ei.label AS label, ei.comment AS comment, e.pos AS pos" + QString query("SELECT ei.plant, ei.location, ei.label, ei.comment, e.pos, di.title, di.folio" " FROM element_info ei, element e, diagram_info di" " WHERE ei.element_uuid = e.uuid AND e.diagram_uuid = di.diagram_uuid" - " ORDER BY plant, location, title, label, pos"); + " ORDER BY ei.plant, ei.location, ei.label"); model->query(query); + model->autoHeaders(); 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); diff --git a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp b/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp index 7a4abc734..e46c650ff 100644 --- a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp +++ b/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.cpp @@ -165,12 +165,7 @@ QVariant NomenclatureModel::data(const QModelIndex &index, int role) const void NomenclatureModel::query(const QString &query) { auto rm_ = m_query != query; - if (rm_) - { - auto headers = projectDataBase::headersFromElementsInfoQuery(query); - for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, headers.at(i)); - } + if (rm_) { emit beginResetModel(); } @@ -195,6 +190,18 @@ QETProject *NomenclatureModel::project() const { return m_project.data(); } +/** + * @brief NomenclatureModel::autoHeaders + * Try to determine the name of each columns header + */ +void NomenclatureModel::autoHeaders() +{ + auto headers = projectDataBase::headersFromElementsInfoQuery(m_query); + for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, headers.at(i)); + } +} + /** * @brief NomenclatureModel::dataBaseUpdated * slot called when the project database is updated diff --git a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h b/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h index b9f9cecc3..e4b52f70b 100644 --- a/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h +++ b/sources/qetgraphicsitem/ViewItem/nomenclaturemodel.h @@ -43,6 +43,7 @@ class NomenclatureModel : public QAbstractTableModel QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; void query(const QString &query); QETProject *project() const; + void autoHeaders(); private: void dataBaseUpdated(); diff --git a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp b/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp index 35355aad5..4c9ea6cee 100644 --- a/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp +++ b/sources/qetgraphicsitem/ViewItem/ui/nomenclaturemodelpropertieswidget.cpp @@ -70,8 +70,13 @@ void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked() connect(button_box, &QDialogButtonBox::accepted, &d, &QDialog::accept); connect(button_box, &QDialogButtonBox::rejected, &d, &QDialog::reject); - if (d.exec()) { + if (d.exec()) + { m_model->query(query_widget->queryStr()); + auto headers = query_widget->header(); + for (auto i=0 ; isetHeaderData(i, Qt::Horizontal, headers.at(i)); + } } }