From d711d8fb4abc4586c1b33343b2540cac30483e43 Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 11 Jun 2025 22:43:41 +0200 Subject: [PATCH] Terminal strip editor can now edit multiple project. Before this this commit the terminal strip editor couldn't only work on the first project opened into this editor, all other project opened after couldn't be edited. This is now past, terminal strip editor can now edit every project open in QElectroTech. --- .../TerminalStrip/ui/freeterminaleditor.cpp | 35 +++++++++++-- sources/TerminalStrip/ui/freeterminaleditor.h | 8 +-- .../TerminalStrip/ui/freeterminalmodel.cpp | 52 +++++++++++++------ sources/TerminalStrip/ui/freeterminalmodel.h | 1 + .../TerminalStrip/ui/terminalstripeditor.cpp | 43 +++++++++------ .../TerminalStrip/ui/terminalstripeditor.h | 8 +-- .../ui/terminalstripeditorwindow.cpp | 17 ++++-- .../ui/terminalstripeditorwindow.h | 5 +- .../ui/terminalstriptreedockwidget.cpp | 34 ++++++++++-- .../ui/terminalstriptreedockwidget.h | 4 +- 10 files changed, 159 insertions(+), 48 deletions(-) diff --git a/sources/TerminalStrip/ui/freeterminaleditor.cpp b/sources/TerminalStrip/ui/freeterminaleditor.cpp index 2f41c6a24..7f5393fb7 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.cpp +++ b/sources/TerminalStrip/ui/freeterminaleditor.cpp @@ -32,16 +32,20 @@ */ FreeTerminalEditor::FreeTerminalEditor(QETProject *project, QWidget *parent) : QWidget(parent), - ui(new Ui::FreeTerminalEditor), - m_project(project) + ui(new Ui::FreeTerminalEditor), + m_project(project) { ui->setupUi(this); ui->m_table_view->setItemDelegate(new FreeTerminalModelDelegate(ui->m_table_view)); - m_model = new FreeTerminalModel(m_project, this); + m_model = new FreeTerminalModel(m_project, this); ui->m_table_view->setModel(m_model); ui->m_table_view->setCurrentIndex(m_model->index(0,0)); + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + //Disabled the move if the table is currently edited (yellow cell) connect(m_model, &FreeTerminalModel::dataChanged, this, [=] { this->setDisabledMove(); @@ -135,6 +139,31 @@ void FreeTerminalEditor::apply() reload(); } +/** + * @brief FreeTerminalEditor::setProject + * Set @project as project handled by this editor. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void FreeTerminalEditor::setProject(QETProject *project) +{ + if(m_project) { + disconnect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + m_project = project; + if (m_model) { + m_model->setProject(project); + } + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + reload(); +} + void FreeTerminalEditor::on_m_type_cb_activated(int index) { if (m_model) diff --git a/sources/TerminalStrip/ui/freeterminaleditor.h b/sources/TerminalStrip/ui/freeterminaleditor.h index a185a109e..6c1455d03 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.h +++ b/sources/TerminalStrip/ui/freeterminaleditor.h @@ -19,8 +19,8 @@ #define FREETERMINALEDITOR_H #include +#include "../../qetproject.h" -class QETProject; class RealTerminal; class FreeTerminalModel; class QTableView; @@ -40,6 +40,8 @@ class FreeTerminalEditor : public QWidget void reload(); void apply(); + void setProject(QETProject *project); + private slots: void on_m_type_cb_activated(int index); void on_m_function_cb_activated(int index); @@ -52,7 +54,7 @@ class FreeTerminalEditor : public QWidget private: Ui::FreeTerminalEditor *ui; - QETProject *m_project = nullptr; - FreeTerminalModel *m_model = nullptr; + QPointer m_project; + FreeTerminalModel *m_model {nullptr}; }; #endif // FREETERMINALEDITOR_H diff --git a/sources/TerminalStrip/ui/freeterminalmodel.cpp b/sources/TerminalStrip/ui/freeterminalmodel.cpp index 426b60e07..d3b59ef05 100644 --- a/sources/TerminalStrip/ui/freeterminalmodel.cpp +++ b/sources/TerminalStrip/ui/freeterminalmodel.cpp @@ -56,10 +56,30 @@ FreeTerminalModel::Column FreeTerminalModel::columnTypeForIndex(const QModelInde * @param parent */ FreeTerminalModel::FreeTerminalModel(QETProject *project, QObject *parent) : - QAbstractTableModel(parent), - m_project(project) + QAbstractTableModel(parent) { + setProject(project); +} + +/** + * @brief FreeTerminalModel::setProject + * Set @project as project handled by this model. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void FreeTerminalModel::setProject(QETProject *project) { - fillTerminalVector(); + if(m_project) { + disconnect(m_project, &QObject::destroyed, this, &FreeTerminalModel::clear); + } + m_project = project; + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalModel::clear); + } + clear(); } /** @@ -305,20 +325,22 @@ QVector > FreeTerminalModel::realTerminalForIndex(c */ void FreeTerminalModel::fillTerminalVector() { - ElementProvider provider_(m_project); - auto free_terminal_vector = provider_.freeTerminal(); + if (m_project) { + ElementProvider provider_(m_project); + auto free_terminal_vector = provider_.freeTerminal(); - std::sort(free_terminal_vector.begin(), free_terminal_vector.end(), - [](TerminalElement *a, TerminalElement *b) - { - return QETUtils::sortBeginIntString(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), - b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); - }); + std::sort(free_terminal_vector.begin(), free_terminal_vector.end(), + [](TerminalElement *a, TerminalElement *b) + { + return QETUtils::sortBeginIntString(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), + b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); + }); - for (const auto &terminal_ : free_terminal_vector) { - m_terminal_vector.append(terminal_->realTerminal()); - m_real_t_data.append(modelRealTerminalData::data(terminal_->realTerminal())); - } + for (const auto &terminal_ : free_terminal_vector) { + m_terminal_vector.append(terminal_->realTerminal()); + m_real_t_data.append(modelRealTerminalData::data(terminal_->realTerminal())); + } + } } /**************************************************************** diff --git a/sources/TerminalStrip/ui/freeterminalmodel.h b/sources/TerminalStrip/ui/freeterminalmodel.h index 5d13cafc4..bc64dd0dd 100644 --- a/sources/TerminalStrip/ui/freeterminalmodel.h +++ b/sources/TerminalStrip/ui/freeterminalmodel.h @@ -47,6 +47,7 @@ class FreeTerminalModel : public QAbstractTableModel public: explicit FreeTerminalModel(QETProject *project, QObject *parent = nullptr); + void setProject(QETProject *project); int rowCount(const QModelIndex &parent) const override; int columnCount(const QModelIndex &parent) const override; diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index a2ff47b99..d65d1c128 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -84,6 +84,12 @@ TerminalStripEditor::~TerminalStripEditor() { delete ui; } +void TerminalStripEditor::setProject(QETProject *project) +{ + m_project = project; + setCurrentStrip(nullptr); +} + /** * @brief TerminalStripEditor::setCurrentStrip * Set the current terminal strip edited to \p strip_ @@ -98,27 +104,15 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_) if (m_current_strip) { disconnect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::reload); disconnect(m_current_strip, &TerminalStrip::bridgeChanged, this, &TerminalStripEditor::reload); + disconnect(m_current_strip, &QObject::destroyed, this, &TerminalStripEditor::clear); } ui->m_move_to_cb->clear(); - if (!strip_) - { - ui->m_installation_le ->clear(); - ui->m_location_le ->clear(); - ui->m_name_le ->clear(); - ui->m_comment_le ->clear(); - ui->m_description_te ->clear(); - m_current_strip = nullptr; - - ui->m_table_widget->setModel(nullptr); - if (m_model) { - m_model->deleteLater(); - m_model = nullptr; - } + if (!strip_) { + clear(); } - else - { + else { ui->m_installation_le ->setText(strip_->installation()); ui->m_location_le ->setText(strip_->location()); ui->m_name_le ->setText(strip_->name()); @@ -159,6 +153,7 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_) connect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::reload); connect(m_current_strip, &TerminalStrip::bridgeChanged, this, &TerminalStripEditor::reload); + connect(m_current_strip, &QObject::destroyed, this, &TerminalStripEditor::clear); } } @@ -230,6 +225,22 @@ void TerminalStripEditor::apply() reload(); } +void TerminalStripEditor::clear() +{ + ui->m_installation_le ->clear(); + ui->m_location_le ->clear(); + ui->m_name_le ->clear(); + ui->m_comment_le ->clear(); + ui->m_description_te ->clear(); + m_current_strip.clear(); + + ui->m_table_widget->setModel(nullptr); + if (m_model) { + m_model->deleteLater(); + m_model = nullptr; + } +} + /** * @brief TerminalStripEditor::spanMultiLevelTerminals * Span row of m_table_widget for multi-level terminal diff --git a/sources/TerminalStrip/ui/terminalstripeditor.h b/sources/TerminalStrip/ui/terminalstripeditor.h index 5ca482892..f7f839957 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.h +++ b/sources/TerminalStrip/ui/terminalstripeditor.h @@ -41,11 +41,13 @@ class TerminalStripEditor : public QWidget public: explicit TerminalStripEditor(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditor() override; + void setProject(QETProject *project); void setCurrentStrip(TerminalStrip *strip_); void reload(); void apply(); private: + void clear(); void spanMultiLevelTerminals(); void selectionChanged(); QSize setUpBridgeCellWidth(); @@ -67,9 +69,9 @@ class TerminalStripEditor : public QWidget private: Ui::TerminalStripEditor *ui; - QETProject *m_project {nullptr}; - TerminalStrip *m_current_strip {nullptr}; - TerminalStripModel *m_model {nullptr}; + QPointer m_project; + QPointer m_current_strip; + TerminalStripModel *m_model {nullptr}; }; #endif // TERMINALSTRIPEDITOR_H diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp index 24a826ea7..7ec4d3c41 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp @@ -51,8 +51,8 @@ void TerminalStripEditorWindow::edit(TerminalStrip *strip) TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidget *parent) : QMainWindow(parent), - ui(new Ui::TerminalStripEditorWindow), - m_project(project) + ui(new Ui::TerminalStripEditorWindow), + m_project(project) { ui->setupUi(this); ui->m_remove_terminal->setDisabled(true); @@ -76,6 +76,18 @@ TerminalStripEditorWindow::~TerminalStripEditorWindow() delete ui; } +/** + * @brief TerminalStripEditorWindow::setProject + * @param project + */ +void TerminalStripEditorWindow::setProject(QETProject *project) +{ + m_project = project; + m_tree_dock->setProject(project); + m_free_terminal_editor->setProject(project); + m_terminal_strip_editor->setProject(project); +} + void TerminalStripEditorWindow::setCurrentStrip(TerminalStrip *strip) { m_tree_dock->setSelectedStrip(strip); } @@ -200,4 +212,3 @@ void TerminalStripEditorWindow::on_m_button_box_clicked(QAbstractButton *button) void TerminalStripEditorWindow::on_m_stacked_widget_currentChanged(int arg1) { ui->m_button_box->setHidden(arg1 == EMPTY_PAGE); } - diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.h b/sources/TerminalStrip/ui/terminalstripeditorwindow.h index b303d5c35..5ae4a8288 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.h +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.h @@ -51,6 +51,8 @@ class TerminalStripEditorWindow : public QMainWindow if (!window_) window_ = new TerminalStripEditorWindow{project, parent}; mutex_.unlock(); + } else { + window_->setProject(project); } return window_; } @@ -71,6 +73,7 @@ class TerminalStripEditorWindow : public QMainWindow explicit TerminalStripEditorWindow(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditorWindow(); + void setProject(QETProject *project); void setCurrentStrip(TerminalStrip *strip); private slots: @@ -87,7 +90,7 @@ class TerminalStripEditorWindow : public QMainWindow private: Ui::TerminalStripEditorWindow *ui{nullptr}; - QETProject *m_project {nullptr}; + QPointer m_project; TerminalStripTreeDockWidget *m_tree_dock{nullptr}; FreeTerminalEditor *m_free_terminal_editor {nullptr}; TerminalStripEditor *m_terminal_strip_editor {nullptr}; diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp index 360d4190d..2e5a5922f 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp @@ -30,11 +30,10 @@ TerminalStripTreeDockWidget::TerminalStripTreeDockWidget(QETProject *project, QWidget *parent) : QDockWidget(parent), - ui(new Ui::TerminalStripTreeDockWidget), - m_project(project) + ui(new Ui::TerminalStripTreeDockWidget) { ui->setupUi(this); - buildTree(); + setProject(project); #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex()); @@ -48,6 +47,32 @@ TerminalStripTreeDockWidget::~TerminalStripTreeDockWidget() delete ui; } +/** + * @brief TerminalStripTreeDockWidget::setProject + * Set @project as project handled by this tree dock. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void TerminalStripTreeDockWidget::setProject(QETProject *project) +{ + if(m_project && m_project_destroy_connection) { + disconnect(m_project_destroy_connection); + } + m_project = project; + if (m_project) { + m_project_destroy_connection = connect(m_project, &QObject::destroyed, [this](){ + this->m_current_strip.clear(); + this->reload(); + }); + } + m_current_strip.clear(); + reload(); +} + /** * @brief TerminalStripTreeDockWidget::reload */ @@ -205,6 +230,9 @@ void TerminalStripTreeDockWidget::on_m_tree_view_currentItemChanged(QTreeWidgetI */ void TerminalStripTreeDockWidget::buildTree() { + if(!m_project) { + return; + } auto title_ = m_project->title(); if (title_.isEmpty()) { diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h index 6fdbb1ee1..327bca079 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h @@ -49,6 +49,7 @@ class TerminalStripTreeDockWidget : public QDockWidget explicit TerminalStripTreeDockWidget(QETProject *project, QWidget *parent = nullptr); ~TerminalStripTreeDockWidget(); + void setProject(QETProject *project = nullptr); void reload(); bool currentIsStrip() const; TerminalStrip* currentStrip() const; @@ -78,7 +79,8 @@ class TerminalStripTreeDockWidget : public QDockWidget QHash> m_uuid_terminal_H; QHash> m_uuid_strip_H; QVector m_strip_changed_connection; - bool m_current_is_free_terminal{false}; + bool m_current_is_free_terminal{false}; + QMetaObject::Connection m_project_destroy_connection; }; #endif // TERMINALSTRIPTREEDOCKWIDGET_H