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