mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-21 16:50:53 +01:00
Element query widget : widget restor is state according to the current query
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
#include "ui_elementquerywidget.h"
|
#include "ui_elementquerywidget.h"
|
||||||
#include "qetapp.h"
|
#include "qetapp.h"
|
||||||
|
|
||||||
|
#include <QRegularExpression>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ElementQueryWidget::ElementQueryWidget
|
* @brief ElementQueryWidget::ElementQueryWidget
|
||||||
* @param parent
|
* @param parent
|
||||||
@@ -63,7 +65,7 @@ ElementQueryWidget::ElementQueryWidget(QWidget *parent) :
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int checked = 0;
|
int checked = 0;
|
||||||
for (int i=1 ; i<5 ; ++i) {
|
for (int i=1 ; i<6 ; ++i) {
|
||||||
if (m_button_group.button(i)->isChecked()) {++checked;}
|
if (m_button_group.button(i)->isChecked()) {++checked;}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,6 +96,164 @@ ElementQueryWidget::~ElementQueryWidget() {
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ElementQueryWidget::setQuery
|
||||||
|
* @param query
|
||||||
|
* Set the current query to @query.
|
||||||
|
* If it's possible, rebuild the state of the widget from the query
|
||||||
|
*/
|
||||||
|
void ElementQueryWidget::setQuery(const QString &query)
|
||||||
|
{
|
||||||
|
if (query.startsWith("SELECT"))
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
|
||||||
|
ui->m_sql_query->setText(query);
|
||||||
|
|
||||||
|
QString select = query;
|
||||||
|
select.remove(0,7); //Remove SELECT
|
||||||
|
select.truncate(select.indexOf("FROM")); //Truncate at FROM
|
||||||
|
select.replace(" ", ""); //Remove withe space
|
||||||
|
|
||||||
|
//Get the select -> the item in the right list
|
||||||
|
QStringList split = select.split(",");
|
||||||
|
for (auto str : split)
|
||||||
|
{
|
||||||
|
for (auto item : m_items_list)
|
||||||
|
{
|
||||||
|
if (item->data(Qt::UserRole).toString() == str) {
|
||||||
|
ui->m_var_list->takeItem(ui->m_var_list->row(item));
|
||||||
|
ui->m_choosen_list->addItem(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//There is not filter return now.
|
||||||
|
if (!query.contains("WHERE")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get the filter
|
||||||
|
auto where = query;
|
||||||
|
where.remove(0, where.indexOf("WHERE") + 6);
|
||||||
|
where.truncate(where.indexOf("ORDER BY"));
|
||||||
|
|
||||||
|
//Element type filter
|
||||||
|
if (where.contains("element_sub_type") || where.contains("element_type"))
|
||||||
|
{
|
||||||
|
int c=0;
|
||||||
|
ui->m_simple_cb->setChecked (where.contains("Simple") ? true : false);
|
||||||
|
if (ui->m_simple_cb->isChecked()) {
|
||||||
|
++c;
|
||||||
|
where.remove("element_type = 'Simple' ");
|
||||||
|
}
|
||||||
|
ui->m_terminal_cb->setChecked (where.contains("Terminale") ? true : false);
|
||||||
|
if (ui->m_terminal_cb->isChecked()) {
|
||||||
|
++c;
|
||||||
|
where.remove("element_type = 'Terminale'");
|
||||||
|
}
|
||||||
|
ui->m_coil_cb->setChecked (where.contains("coil") ? true : false);
|
||||||
|
if (ui->m_coil_cb->isChecked()) {
|
||||||
|
++c;
|
||||||
|
where.remove("element_sub_type = 'coil' ");
|
||||||
|
}
|
||||||
|
ui->m_button_cb->setChecked (where.contains("commutator") ? true : false);
|
||||||
|
if (ui->m_button_cb->isChecked()) {
|
||||||
|
++c;
|
||||||
|
where.remove("element_sub_type = 'commutator' ");
|
||||||
|
}
|
||||||
|
ui->m_protection_cb->setChecked(where.contains("protection") ? true : false);
|
||||||
|
if (ui->m_protection_cb) {
|
||||||
|
++c;
|
||||||
|
where.remove("element_sub_type = 'protection'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == 5) {
|
||||||
|
ui->m_all_cb->setCheckState(Qt::Checked);
|
||||||
|
} else if (c > 0) {
|
||||||
|
ui->m_all_cb->setCheckState(Qt::PartiallyChecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
where.remove("OR");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Filter for selected data
|
||||||
|
QStringList strl;
|
||||||
|
for (auto item : m_items_list) {
|
||||||
|
strl.append(item->data(Qt::UserRole).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString beginning_rx;
|
||||||
|
beginning_rx.append(QString("^(").append(strl.join("|")));
|
||||||
|
beginning_rx.append(")");
|
||||||
|
|
||||||
|
QRegularExpression rx_is_not_null(beginning_rx + " IS NOT NULL$");
|
||||||
|
QRegularExpression rx_is_null (beginning_rx + " IS NULL$");
|
||||||
|
QRegularExpression rx_like (beginning_rx + QString(" LIKE'%(.+)%'$"));
|
||||||
|
QRegularExpression rx_not_like (beginning_rx + QString(" NOT LIKE'%(.+)%'$"));
|
||||||
|
QRegularExpression rx_equal (beginning_rx + QString("='(.+)'$"));
|
||||||
|
QRegularExpression rx_not_equal (beginning_rx + QString("!='(.+)'$"));
|
||||||
|
|
||||||
|
|
||||||
|
QStringList split_where;
|
||||||
|
|
||||||
|
//Remove the white space at begin and end of each string
|
||||||
|
for (auto str : where.split("AND "))
|
||||||
|
{
|
||||||
|
if (str.startsWith(" "))
|
||||||
|
str.remove(0,1);
|
||||||
|
if (str.endsWith(" "))
|
||||||
|
str.remove(str.size()-1, 1);
|
||||||
|
|
||||||
|
split_where.append(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QRegularExpressionMatch rxm;
|
||||||
|
for (auto str : split_where)
|
||||||
|
{
|
||||||
|
rxm = rx_is_not_null.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(1, QString()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxm = rx_is_null.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(2, QString()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxm = rx_like.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(3, rxm.captured(2)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxm = rx_not_like.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(4, rxm.captured(2)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxm = rx_equal.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(5, rxm.captured(2)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxm = rx_not_equal.match(str);
|
||||||
|
if (rxm.hasMatch()) {
|
||||||
|
m_filter.insert(rxm.captured(1), qMakePair(6, rxm.captured(2)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ElementQueryWidget::queryStr
|
* @brief ElementQueryWidget::queryStr
|
||||||
* @return The current query
|
* @return The current query
|
||||||
@@ -122,7 +282,7 @@ QString ElementQueryWidget::queryStr() const
|
|||||||
}
|
}
|
||||||
column += key;
|
column += key;
|
||||||
order_by += key;
|
order_by += key;
|
||||||
|
|
||||||
auto f = FilterFor(key);
|
auto f = FilterFor(key);
|
||||||
switch (f.first)
|
switch (f.first)
|
||||||
{
|
{
|
||||||
@@ -154,7 +314,7 @@ QString ElementQueryWidget::queryStr() const
|
|||||||
QString where;
|
QString where;
|
||||||
if (ui->m_all_cb->checkState() == Qt::PartiallyChecked)
|
if (ui->m_all_cb->checkState() == Qt::PartiallyChecked)
|
||||||
{
|
{
|
||||||
where = " WHERE ";
|
where = " WHERE (";
|
||||||
bool b = false;
|
bool b = false;
|
||||||
if (ui->m_terminal_cb->isChecked()) {
|
if (ui->m_terminal_cb->isChecked()) {
|
||||||
if (b) where +=" OR";
|
if (b) where +=" OR";
|
||||||
@@ -180,6 +340,12 @@ QString ElementQueryWidget::queryStr() const
|
|||||||
if (b) where +=" OR";
|
if (b) where +=" OR";
|
||||||
where += " element_sub_type = 'protection'";
|
where += " element_sub_type = 'protection'";
|
||||||
}
|
}
|
||||||
|
where.append(")");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (where.isEmpty() && !filter_.isEmpty()) {
|
||||||
|
filter_.remove(0, 4); //Remove the first " AND" of filter.
|
||||||
|
filter_.prepend( " WHERE");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString q(select + column + from + where + filter_ + order_by);
|
QString q(select + column + from + where + filter_ + order_by);
|
||||||
@@ -333,16 +499,6 @@ void ElementQueryWidget::on_m_edit_sql_query_cb_clicked()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
void ElementQueryWidget::on_m_filter_le_textEdited(const QString &arg1)
|
||||||
{
|
{
|
||||||
if (auto item = ui->m_choosen_list->currentItem())
|
if (auto item = ui->m_choosen_list->currentItem())
|
||||||
@@ -393,3 +549,18 @@ void ElementQueryWidget::on_m_choosen_list_itemDoubleClicked(QListWidgetItem *it
|
|||||||
Q_UNUSED(item)
|
Q_UNUSED(item)
|
||||||
on_m_remove_pb_clicked();
|
on_m_remove_pb_clicked();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ElementQueryWidget::reset
|
||||||
|
* Clear this widget aka set to initial state
|
||||||
|
*/
|
||||||
|
void ElementQueryWidget::reset()
|
||||||
|
{
|
||||||
|
while (ui->m_choosen_list->item(0) != nullptr) {
|
||||||
|
on_m_remove_pb_clicked();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->m_all_cb->setChecked(true);
|
||||||
|
ui->m_sql_query->clear();
|
||||||
|
m_filter.clear();
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2006-2020 The QElectroTech Team
|
Copyright 2006-2020 The QElectroTech Team
|
||||||
This file is part of QElectroTech.
|
This file is part of QElectroTech.
|
||||||
|
|
||||||
@@ -40,6 +40,7 @@ class ElementQueryWidget : public QWidget
|
|||||||
explicit ElementQueryWidget(QWidget *parent = nullptr);
|
explicit ElementQueryWidget(QWidget *parent = nullptr);
|
||||||
~ElementQueryWidget();
|
~ElementQueryWidget();
|
||||||
|
|
||||||
|
void setQuery(const QString &query);
|
||||||
QString queryStr() const;
|
QString queryStr() const;
|
||||||
QStringList header() const;
|
QStringList header() const;
|
||||||
|
|
||||||
@@ -49,8 +50,6 @@ class ElementQueryWidget : public QWidget
|
|||||||
void on_m_remove_pb_clicked();
|
void on_m_remove_pb_clicked();
|
||||||
void on_m_down_pb_clicked();
|
void on_m_down_pb_clicked();
|
||||||
void on_m_edit_sql_query_cb_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_le_textEdited(const QString &arg1);
|
||||||
void on_m_filter_type_cb_activated(int index);
|
void on_m_filter_type_cb_activated(int index);
|
||||||
|
|
||||||
@@ -63,7 +62,9 @@ class ElementQueryWidget : public QWidget
|
|||||||
void on_m_var_list_itemDoubleClicked(QListWidgetItem *item);
|
void on_m_var_list_itemDoubleClicked(QListWidgetItem *item);
|
||||||
void on_m_choosen_list_itemDoubleClicked(QListWidgetItem *item);
|
void on_m_choosen_list_itemDoubleClicked(QListWidgetItem *item);
|
||||||
|
|
||||||
private:
|
void reset();
|
||||||
|
|
||||||
|
private:
|
||||||
Ui::ElementQueryWidget *ui;
|
Ui::ElementQueryWidget *ui;
|
||||||
QHash <QString, QString> m_export_info;
|
QHash <QString, QString> m_export_info;
|
||||||
QButtonGroup m_button_group;
|
QButtonGroup m_button_group;
|
||||||
|
|||||||
@@ -187,6 +187,14 @@ void NomenclatureModel::query(const QString &query)
|
|||||||
if (rm_) { emit endResetModel();}
|
if (rm_) { emit endResetModel();}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief NomenclatureModel::queryString
|
||||||
|
* @return the current query used by this model
|
||||||
|
*/
|
||||||
|
QString NomenclatureModel::queryString() const {
|
||||||
|
return m_query;
|
||||||
|
}
|
||||||
|
|
||||||
QETProject *NomenclatureModel::project() const {
|
QETProject *NomenclatureModel::project() const {
|
||||||
return m_project.data();
|
return m_project.data();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,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);
|
||||||
|
QString queryString() const;
|
||||||
QETProject *project() const;
|
QETProject *project() const;
|
||||||
void autoHeaders();
|
void autoHeaders();
|
||||||
|
|
||||||
|
|||||||
@@ -59,10 +59,11 @@ void NomenclatureModelPropertiesWidget::setModel(NomenclatureModel *model) {
|
|||||||
void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
|
void NomenclatureModelPropertiesWidget::on_m_edit_query_pb_clicked()
|
||||||
{
|
{
|
||||||
QDialog d(this);
|
QDialog d(this);
|
||||||
auto l = new QVBoxLayout(this);
|
auto l = new QVBoxLayout;
|
||||||
d.setLayout(l);
|
d.setLayout(l);
|
||||||
|
|
||||||
auto query_widget = new ElementQueryWidget(&d);
|
auto query_widget = new ElementQueryWidget(&d);
|
||||||
|
query_widget->setQuery(m_model->queryString());
|
||||||
l->addWidget(query_widget);
|
l->addWidget(query_widget);
|
||||||
|
|
||||||
auto button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
auto button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||||
|
|||||||
Reference in New Issue
Block a user