diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp index 8b4ebf94c..86427d307 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp @@ -17,6 +17,8 @@ */ #include "terminalstripitem.h" #include "../../qetgraphicsitem/qgraphicsitemutility.h" +#include "../terminalstrip.h" +#include "../ui/terminalstripeditorwindow.h" TerminalStripItem::TerminalStripItem(QPointer strip, QGraphicsItem *parent) : QetGraphicsItem{parent}, @@ -53,5 +55,12 @@ QRectF TerminalStripItem::boundingRect() const * @return usual name of this item */ QString TerminalStripItem::name() const { - return tr("plan de bornes"); + return tr("plan de bornes"); +} + +void TerminalStripItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED (event); + + TerminalStripEditorWindow::edit(m_strip); } diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h index 1fbb4f22c..78343c423 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h @@ -39,6 +39,8 @@ class TerminalStripItem : public QetGraphicsItem QRectF boundingRect() const override; QString name() const override; + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; + private: QPointer m_strip; TerminalStripDrawer m_drawer; diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp index 425eef77b..b60933c5c 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp @@ -19,6 +19,8 @@ #include "../UndoCommand/addterminalstripcommand.h" #include "freeterminaleditor.h" +#include "../../qetapp.h" +#include "../../qetdiagrameditor.h" #include "../../qetproject.h" #include "../realterminal.h" #include "../terminalstrip.h" @@ -27,6 +29,8 @@ #include "terminalstripeditorwindow.h" #include "terminalstriptreedockwidget.h" +QPointer TerminalStripEditorWindow::window_; + static const int EMPTY_PAGE = 0; static const int FREE_TERMINAL_PAGE = 1; static const int TERMINAL_STRIP_PAGE = 2; @@ -35,6 +39,16 @@ static const int TERMINAL_STRIP_PAGE = 2; * @param project * @param parent */ +void TerminalStripEditorWindow::edit(TerminalStrip *strip) +{ + if (const auto project_ = strip->project()) + { + auto editor_ = TerminalStripEditorWindow::instance(project_, QETApp::diagramEditor(project_)); + editor_->setCurrentStrip(strip); + editor_->show(); + } +} + TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidget *parent) : QMainWindow(parent), ui(new Ui::TerminalStripEditorWindow), @@ -59,7 +73,11 @@ TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidge */ TerminalStripEditorWindow::~TerminalStripEditorWindow() { - delete ui; + delete ui; +} + +void TerminalStripEditorWindow::setCurrentStrip(TerminalStrip *strip) { + m_tree_dock->setSelectedStrip(strip); } /** diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.h b/sources/TerminalStrip/ui/terminalstripeditorwindow.h index a31b709c0..65ab72bf6 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.h +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.h @@ -19,6 +19,8 @@ #define TERMINALSTRIPEDITORWINDOW_H #include +#include +#include class QETProject; class TerminalStripTreeDockWidget; @@ -35,16 +37,47 @@ class TerminalStripEditorWindow : public QMainWindow { Q_OBJECT - public: + private: + //We need to use a QPointer instead of a raw pointer because when window_ + //have got a parent widget, the parent widget can delete the window_ + //instance in her destrucor and then window_ become a dangling pointer. + static QPointer window_; + + public: + static TerminalStripEditorWindow* instance(QETProject *project, QWidget *parent = nullptr) { + static QMutex mutex_; + if (!window_) { + mutex_.lock(); + if (!window_) + window_ = new TerminalStripEditorWindow{project, parent}; + mutex_.unlock(); + } + return window_; + } + + static void dropInstance () { + static QMutex mutex; + if (window_) { + mutex.lock(); + window_->deleteLater(); + window_.clear(); + mutex.unlock(); + } + } + + static void edit(TerminalStrip *strip); + + public: explicit TerminalStripEditorWindow(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditorWindow(); + void setCurrentStrip(TerminalStrip *strip); + private slots: void on_m_add_terminal_strip_triggered(); void on_m_remove_terminal_triggered(); void on_m_reload_triggered(); void on_m_button_box_clicked(QAbstractButton *button); - void on_m_stacked_widget_currentChanged(int arg1); private: diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 481b16b48..132081e8b 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -36,6 +36,7 @@ #include "ui/aboutqetdialog.h" #include "ui/configpage/generalconfigurationpage.h" #include "machine_info.h" +#include "TerminalStrip/ui/terminalstripeditorwindow.h" #include #include @@ -159,6 +160,7 @@ QETApp::~QETApp() ElementFactory::dropInstance(); ElementPictureFactory::dropInstance(); MachineInfo::dropInstance(); + TerminalStripEditorWindow::dropInstance(); } @@ -1128,7 +1130,28 @@ QFont QETApp::indiTextsItemFont(qreal size) */ QList QETApp::diagramEditors() { - return(QETApp::instance() -> detectWindows()); + return(QETApp::instance() -> detectWindows()); +} + +/** + * @brief QETApp::diagramEditor + * @param project + * @return The diagram editor of @a project or nullptr. + */ +QETDiagramEditor *QETApp::diagramEditor(QETProject *project) +{ + for (const auto &editor : QETApp::instance()->detectWindows()) + { + for (const auto &project_view : editor->openedProjects()) + { + if (project_view->project() == project) + { + return editor; + } + } + } + + return nullptr; } /** diff --git a/sources/qetapp.h b/sources/qetapp.h index 6ef57d71e..186b30f94 100644 --- a/sources/qetapp.h +++ b/sources/qetapp.h @@ -148,7 +148,8 @@ class QETApp : public QObject static QFont indiTextsItemFont (qreal = -1.0); static QETDiagramEditor *diagramEditorForFile(const QString &); static QETDiagramEditor *diagramEditorAncestorOf (const QWidget *child); - static QList diagramEditors(); + static QList diagramEditors(); + static QETDiagramEditor* diagramEditor(QETProject *project); static QList elementEditors(); static QList elementEditors(QETProject *); static QList titleBlockTemplateEditors(); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 18376d12d..a61192701 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -447,8 +447,7 @@ void QETDiagramEditor::setUpActions() { if (auto project = this->currentProject()) { - auto tsew {new TerminalStripEditorWindow{project, this}}; - tsew->show(); + TerminalStripEditorWindow::instance(project, this)->show(); } });