From 2ac560e7b027590e8d6b534b84020d4c1624ece5 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sun, 10 Jul 2016 10:10:23 -0400 Subject: [PATCH] Fix template field dialog multiple instances --- src/Mod/TechDraw/Gui/DlgTemplateField.cpp | 10 +++++ src/Mod/TechDraw/Gui/DlgTemplateField.h | 3 +- src/Mod/TechDraw/Gui/DlgTemplateField.ui | 10 ++--- src/Mod/TechDraw/Gui/QGISVGTemplate.cpp | 4 +- src/Mod/TechDraw/Gui/QGISVGTemplate.h | 2 +- src/Mod/TechDraw/Gui/TemplateTextField.cpp | 23 +++++++---- src/Mod/TechDraw/Gui/TemplateTextField.h | 44 +++++++++++----------- 7 files changed, 57 insertions(+), 39 deletions(-) diff --git a/src/Mod/TechDraw/Gui/DlgTemplateField.cpp b/src/Mod/TechDraw/Gui/DlgTemplateField.cpp index f375923a0..9de42b895 100644 --- a/src/Mod/TechDraw/Gui/DlgTemplateField.cpp +++ b/src/Mod/TechDraw/Gui/DlgTemplateField.cpp @@ -66,4 +66,14 @@ std::string DlgTemplateField::getFieldContent() return result.toStdString(); } +void DlgTemplateField::accept() +{ + QDialog::accept(); +} + +void DlgTemplateField::reject() +{ + QDialog::reject(); +} + #include "moc_DlgTemplateField.cpp" diff --git a/src/Mod/TechDraw/Gui/DlgTemplateField.h b/src/Mod/TechDraw/Gui/DlgTemplateField.h index 28e5d3c70..80fd4dee7 100644 --- a/src/Mod/TechDraw/Gui/DlgTemplateField.h +++ b/src/Mod/TechDraw/Gui/DlgTemplateField.h @@ -43,10 +43,11 @@ public: std::string getFieldContent(); public Q_SLOTS: + void accept(); + void reject(); protected: void changeEvent(QEvent *e); - //Ui_dlgTemplateField* ui; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/DlgTemplateField.ui b/src/Mod/TechDraw/Gui/DlgTemplateField.ui index 6ca427c0a..fa9a7ed8a 100644 --- a/src/Mod/TechDraw/Gui/DlgTemplateField.ui +++ b/src/Mod/TechDraw/Gui/DlgTemplateField.ui @@ -3,7 +3,7 @@ TechDrawGui::dlgTemplateField - Qt::WindowModal + Qt::ApplicationModal @@ -95,11 +95,11 @@ accept() - 195 + 209 126 - 193 + 209 79 @@ -111,11 +111,11 @@ reject() - 195 + 209 126 - 193 + 209 79 diff --git a/src/Mod/TechDraw/Gui/QGISVGTemplate.cpp b/src/Mod/TechDraw/Gui/QGISVGTemplate.cpp index 9c87121b5..0d8b01df6 100644 --- a/src/Mod/TechDraw/Gui/QGISVGTemplate.cpp +++ b/src/Mod/TechDraw/Gui/QGISVGTemplate.cpp @@ -48,7 +48,7 @@ using namespace TechDrawGui; QGISVGTemplate::QGISVGTemplate(QGraphicsScene *scene, QWidget* srWidget) : QGITemplate(scene), - upperLevelWidget(srWidget) + qgview(srWidget) { m_svgItem.setSharedRenderer(&m_svgRender); @@ -167,7 +167,7 @@ void QGISVGTemplate::load(const QString &fileName) double width = editClickBoxSize; double height = editClickBoxSize; - TemplateTextField *item = new TemplateTextField(this, tmplte, nameMatch[1].str(), upperLevelWidget); + TemplateTextField *item = new TemplateTextField(this, tmplte, nameMatch[1].str(), qgview); float pad = 1; item->setRect(x - pad, -tmplte->getHeight() + y - height - pad, width + 2 * pad, height + 2 * pad); diff --git a/src/Mod/TechDraw/Gui/QGISVGTemplate.h b/src/Mod/TechDraw/Gui/QGISVGTemplate.h index 85f5cd34e..4c91ad088 100644 --- a/src/Mod/TechDraw/Gui/QGISVGTemplate.h +++ b/src/Mod/TechDraw/Gui/QGISVGTemplate.h @@ -61,7 +61,7 @@ Q_SIGNALS: protected: void openFile(const QFile &file); void load (const QString & fileName); - QWidget* upperLevelWidget; //for parenting dlgTemplateField + QWidget* qgview; //for parenting dlgTemplateField protected: TechDraw::DrawSVGTemplate * getSVGTemplate(); diff --git a/src/Mod/TechDraw/Gui/TemplateTextField.cpp b/src/Mod/TechDraw/Gui/TemplateTextField.cpp index 6b1056ac2..5e6670ad9 100644 --- a/src/Mod/TechDraw/Gui/TemplateTextField.cpp +++ b/src/Mod/TechDraw/Gui/TemplateTextField.cpp @@ -32,7 +32,6 @@ #include #include "TemplateTextField.h" -#include "DlgTemplateField.h" //#include @@ -41,11 +40,12 @@ using namespace TechDrawGui; TemplateTextField::TemplateTextField(QGraphicsItem*parent, TechDraw::DrawTemplate *myTmplte, const std::string &myFieldName, - QWidget* upperWidget) + QWidget* qgview) : QGraphicsRectItem(parent), + ui(nullptr), tmplte(myTmplte), fieldNameStr(myFieldName), - dlgOwner(upperWidget) + dlgOwner(qgview) { } @@ -54,11 +54,8 @@ TemplateTextField::~TemplateTextField() { } -void TemplateTextField::mousePressEvent(QGraphicsSceneMouseEvent *event) +void TemplateTextField::execDialog() { - DlgTemplateField* ui = new DlgTemplateField(dlgOwner); - ui->setFieldName(fieldNameStr); - ui->setFieldContent(tmplte->EditableTexts[fieldNameStr]); int uiCode = ui->exec(); std::string newContent = ""; if(uiCode == QDialog::Accepted) { @@ -69,5 +66,15 @@ void TemplateTextField::mousePressEvent(QGraphicsSceneMouseEvent *event) tmplte->EditableTexts.setValue(fieldNameStr, newContent); } } - ui->deleteLater(); + ui = nullptr; //ui memory will be release by ui's parent Widget +} + +void TemplateTextField::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (!ui) { + ui = new DlgTemplateField(dlgOwner); + ui->setFieldName(fieldNameStr); + ui->setFieldContent(tmplte->EditableTexts[fieldNameStr]); + execDialog(); + } } diff --git a/src/Mod/TechDraw/Gui/TemplateTextField.h b/src/Mod/TechDraw/Gui/TemplateTextField.h index 99e1d25a6..9218ac216 100644 --- a/src/Mod/TechDraw/Gui/TemplateTextField.h +++ b/src/Mod/TechDraw/Gui/TemplateTextField.h @@ -27,12 +27,9 @@ #include +#include "DlgTemplateField.h" #include "../App/DrawTemplate.h" -QT_BEGIN_NAMESPACE -class QGI; -QT_END_NAMESPACE - namespace TechDrawGui { /// QGraphicsRectItem-derived class for the text fields in title blocks @@ -42,28 +39,31 @@ namespace TechDrawGui * Property in the Drawing's template can be modified. * Dear English, I'm sorry. */ - class TechDrawGuiExport TemplateTextField : public QGraphicsRectItem - { - public: - TemplateTextField(QGraphicsItem*parent, - TechDraw::DrawTemplate *myTmplte, - const std::string &myFieldName, - QWidget* upperWidget=0); +class TechDrawGuiExport TemplateTextField : public QGraphicsRectItem +{ + public: + TemplateTextField(QGraphicsItem*parent, + TechDraw::DrawTemplate *myTmplte, + const std::string &myFieldName, + QWidget* upperWidget=0); - ~TemplateTextField(); + ~TemplateTextField(); - enum {Type = QGraphicsItem::UserType + 160}; - int type() const { return Type;} + enum {Type = QGraphicsItem::UserType + 160}; + int type() const { return Type;} - /// Returns the field name that this TemplateTextField represents - std::string fieldName() const { return fieldNameStr; } - protected: - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); - TechDraw::DrawTemplate *tmplte; - std::string fieldNameStr; - QWidget* dlgOwner; - }; + /// Returns the field name that this TemplateTextField represents + std::string fieldName() const { return fieldNameStr; } + + protected: + void execDialog(void); + DlgTemplateField* ui; + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + TechDraw::DrawTemplate *tmplte; + std::string fieldNameStr; + QWidget* dlgOwner; +}; } // namespace TechDrawGui #endif // #ifndef DRAWINGGUI_TEMPLATETEXTFIELD_H