From bbf5bbbcbc948bd80b5bd9fcaf6b987f4b013b65 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 21 Jul 2012 20:07:27 +0200 Subject: [PATCH] 0000791: Placement dialog leaves unapplied changes --- src/Gui/Placement.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/Gui/Placement.h | 10 ++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Gui/Placement.cpp b/src/Gui/Placement.cpp index 091c10512..5697814e9 100644 --- a/src/Gui/Placement.cpp +++ b/src/Gui/Placement.cpp @@ -99,10 +99,15 @@ Placement::Placement(QWidget* parent, Qt::WFlags fl) connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(onPlacementChanged(int))); + connectAct = Application::Instance->signalActiveDocument.connect + (boost::bind(&Placement::slotActiveDocument, this, _1)); + App::Document* activeDoc = App::GetApplication().getActiveDocument(); + if (activeDoc) documents.insert(activeDoc->getName()); } Placement::~Placement() { + connectAct.disconnect(); delete ui; } @@ -113,6 +118,36 @@ void Placement::showDefaultButtons(bool ok) ui->applyButton->setVisible(ok); } +void Placement::slotActiveDocument(const Gui::Document& doc) +{ + documents.insert(doc.getDocument()->getName()); +} + +void Placement::revertTransformation() +{ + for (std::set::iterator it = documents.begin(); it != documents.end(); ++it) { + Gui::Document* document = Application::Instance->getDocument(it->c_str()); + if (!document) continue; + + std::vector obj = document->getDocument()-> + getObjectsOfType(App::DocumentObject::getClassTypeId()); + if (!obj.empty()) { + for (std::vector::iterator it=obj.begin();it!=obj.end();++it) { + std::map props; + (*it)->getPropertyMap(props); + // search for the placement property + std::map::iterator jt; + jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); + if (jt != props.end()) { + Base::Placement cur = static_cast(jt->second)->getValue(); + Gui::ViewProvider* vp = document->getViewProvider(*it); + if (vp) vp->setTransformation(cur.toMatrix()); + } + } + } + } +} + void Placement::applyPlacement(const Base::Placement& p, bool incremental, bool data) { Gui::Document* document = Application::Instance->activeDocument(); @@ -225,12 +260,15 @@ void Placement::reject() QVariant data = QVariant::fromValue(plm); /*emit*/ placementChanged(data, true, false); + revertTransformation(); QDialog::reject(); } void Placement::accept() { on_applyButton_clicked(); + + revertTransformation(); QDialog::accept(); } diff --git a/src/Gui/Placement.h b/src/Gui/Placement.h index 1df314702..233284d1a 100644 --- a/src/Gui/Placement.h +++ b/src/Gui/Placement.h @@ -28,9 +28,14 @@ #include #include +#include +#include + class QSignalMapper; namespace Gui { +class Document; + namespace Dialog { class Ui_Placement; @@ -64,6 +69,8 @@ private: Base::Placement getPlacementData() const; void directionActivated(int); void applyPlacement(const Base::Placement& p, bool incremental, bool data); + void revertTransformation(); + void slotActiveDocument(const Gui::Document&); Q_SIGNALS: void placementChanged(const QVariant &, bool, bool); @@ -71,10 +78,13 @@ Q_SIGNALS: private: typedef Gui::LocationInterfaceComp Ui_PlacementComp; + typedef boost::BOOST_SIGNALS_NAMESPACE::connection Connection; Ui_PlacementComp* ui; QSignalMapper* signalMapper; + Connection connectAct; Base::Placement ref; std::string propertyName; // the name of the placement property + std::set documents; friend class TaskPlacement; };