Expose edit signals to Gui observer

This commit is contained in:
ickby
2018-10-03 14:34:53 +02:00
committed by wmayer
parent 835c75421f
commit 761881fe99
5 changed files with 96 additions and 4 deletions

View File

@@ -96,6 +96,7 @@
#include "SplitView3DInventor.h"
#include "View3DInventor.h"
#include "ViewProvider.h"
#include "ViewProviderDocumentObject.h"
#include "ViewProviderExtension.h"
#include "ViewProviderExtern.h"
#include "ViewProviderFeature.h"
@@ -678,8 +679,9 @@ void Application::slotNewDocument(const App::Document& Doc)
pDoc->signalChangedObject.connect(boost::bind(&Gui::Application::slotChangedObject, this, _1, _2));
pDoc->signalRelabelObject.connect(boost::bind(&Gui::Application::slotRelabelObject, this, _1));
pDoc->signalActivatedObject.connect(boost::bind(&Gui::Application::slotActivatedObject, this, _1));
pDoc->signalInEdit.connect(boost::bind(&Gui::Application::slotInEdit, this, _1));
pDoc->signalResetEdit.connect(boost::bind(&Gui::Application::slotResetEdit, this, _1));
signalNewDocument(*pDoc);
pDoc->createView(View3DInventor::getClassTypeId());
// FIXME: Do we really need this further? Calling processEvents() mixes up order of execution in an
@@ -781,6 +783,16 @@ void Application::slotActivatedObject(const ViewProvider& vp)
this->signalActivatedObject(vp);
}
void Application::slotInEdit(const Gui::ViewProviderDocumentObject& vp)
{
this->signalInEdit(vp);
}
void Application::slotResetEdit(const Gui::ViewProviderDocumentObject& vp)
{
this->signalResetEdit(vp);
}
void Application::onLastWindowClosed(Gui::Document* pcDoc)
{
if (!d->isClosing && pcDoc) {

View File

@@ -43,6 +43,7 @@ class MDIView;
class MainWindow;
class MenuItem;
class ViewProvider;
class ViewProviderDocumentObject;
/** The Application main class
* This is the central class of the GUI
@@ -115,6 +116,10 @@ public:
boost::signal<void (const char*)> signalRemoveWorkbench;
/// signal on activating view
boost::signal<void (const Gui::MDIView*)> signalActivateView;
/// signal on entering in edit mode
boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalInEdit;
/// signal on leaving edit mode
boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalResetEdit;
//@}
/** @name methods for Document handling */
@@ -131,6 +136,8 @@ protected:
void slotChangedObject(const ViewProvider&, const App::Property& Prop);
void slotRelabelObject(const ViewProvider&);
void slotActivatedObject(const ViewProvider&);
void slotInEdit(const Gui::ViewProviderDocumentObject&);
void slotResetEdit(const Gui::ViewProviderDocumentObject&);
public:
/// message when a GuiDocument is about to vanish

View File

@@ -29,6 +29,7 @@
#include "Application.h"
#include "Document.h"
#include "ViewProvider.h"
#include "ViewProviderDocumentObject.h"
#include "DocumentObserverPython.h"
#include <Base/Interpreter.h>
#include <Base/Console.h>
@@ -77,6 +78,11 @@ DocumentObserverPython::DocumentObserverPython(const Py::Object& obj) : inst(obj
this->connectDocumentChangedObject = Gui::Application::Instance->signalChangedObject.connect(boost::bind
(&DocumentObserverPython::slotChangedObject, this, _1, _2));
this->connectDocumentObjectInEdit = Gui::Application::Instance->signalInEdit.connect(boost::bind
(&DocumentObserverPython::slotInEdit, this, _1));
this->connectDocumentObjectResetEdit = Gui::Application::Instance->signalResetEdit.connect(boost::bind
(&DocumentObserverPython::slotResetEdit, this, _1));
}
DocumentObserverPython::~DocumentObserverPython()
@@ -90,6 +96,9 @@ DocumentObserverPython::~DocumentObserverPython()
this->connectDocumentCreatedObject.disconnect();
this->connectDocumentDeletedObject.disconnect();
this->connectDocumentChangedObject.disconnect();
this->connectDocumentObjectInEdit.disconnect();
this->connectDocumentObjectResetEdit.disconnect();
}
void DocumentObserverPython::slotCreatedDocument(const Gui::Document& Doc)
@@ -234,3 +243,37 @@ void DocumentObserverPython::slotChangedObject(const Gui::ViewProvider& Obj,
e.ReportException();
}
}
void DocumentObserverPython::slotInEdit(const Gui::ViewProviderDocumentObject& Obj)
{
Base::PyGILStateLocker lock;
try {
if (this->inst.hasAttr(std::string("slotInEdit"))) {
Py::Callable method(this->inst.getAttr(std::string("slotInEdit")));
Py::Tuple args(1);
args.setItem(0, Py::Object(const_cast<Gui::ViewProviderDocumentObject&>(Obj).getPyObject(), true));
method.apply(args);
}
}
catch (Py::Exception&) {
Base::PyException e; // extract the Python error text
e.ReportException();
}
}
void DocumentObserverPython::slotResetEdit(const Gui::ViewProviderDocumentObject& Obj)
{
Base::PyGILStateLocker lock;
try {
if (this->inst.hasAttr(std::string("slotResetEdit"))) {
Py::Callable method(this->inst.getAttr(std::string("slotResetEdit")));
Py::Tuple args(1);
args.setItem(0, Py::Object(const_cast<Gui::ViewProviderDocumentObject&>(Obj).getPyObject(), true));
method.apply(args);
}
}
catch (Py::Exception&) {
Base::PyException e; // extract the Python error text
e.ReportException();
}
}

View File

@@ -66,6 +66,10 @@ private:
void slotDeletedObject(const Gui::ViewProvider& Obj);
/** The property of an observed object has changed */
void slotChangedObject(const Gui::ViewProvider& Obj, const App::Property& Prop);
/** The object was set into edit mode */
void slotInEdit(const Gui::ViewProviderDocumentObject& Obj);
/** The has left edit mode */
void slotResetEdit(const Gui::ViewProviderDocumentObject& Obj);
private:
Py::Object inst;
@@ -80,6 +84,8 @@ private:
Connection connectDocumentCreatedObject;
Connection connectDocumentDeletedObject;
Connection connectDocumentChangedObject;
Connection connectDocumentObjectInEdit;
Connection connectDocumentObjectResetEdit;
};
} //namespace Gui

View File

@@ -1446,6 +1446,13 @@ class DocumentObserverCases(unittest.TestCase):
self.parameter.append(obj)
self.parameter2.append(prop)
def slotInEdit(self, obj):
self.signal.append('ObjInEdit');
self.parameter.append(obj)
def slotResetEdit(self, obj):
self.signal.append('ObjResetEdit');
self.parameter.append(obj)
def setUp(self):
self.Obs = self.Observer();
@@ -1631,7 +1638,10 @@ class DocumentObserverCases(unittest.TestCase):
self.Obs.parameter2 = []
def testGuiObserver(self):
if not FreeCAD.GuiUp:
return
self.GuiObs = self.GuiObserver()
FreeCAD.Gui.addDocumentObserver(self.GuiObs)
self.Doc1 = FreeCAD.newDocument("Observer1");
@@ -1682,7 +1692,7 @@ class DocumentObserverCases(unittest.TestCase):
self.failUnless(self.GuiObs.signal.pop(0) == 'ObjChanged')
self.failUnless(self.GuiObs.parameter.pop(0) is obj.ViewObject)
self.failUnless(self.GuiObs.parameter2.pop(0) == "Visibility")
self.failUnless(not self.Obs.signal and not self.Obs.parameter and not self.Obs.parameter2)
self.failUnless(not self.GuiObs.signal and not self.GuiObs.parameter and not self.GuiObs.parameter2)
obj.ViewObject.addProperty("App::PropertyLength","Prop","Group","test property")
self.failUnless(self.Obs.signal.pop() == 'ObjAddDynProp')
@@ -1705,6 +1715,18 @@ class DocumentObserverCases(unittest.TestCase):
self.failUnless(not self.Obs.signal and not self.Obs.parameter and not self.Obs.parameter2)
self.failUnless(not self.GuiObs.signal and not self.GuiObs.parameter and not self.GuiObs.parameter2)
self.GuiDoc1.setEdit('obj', 0)
self.failUnless(not self.Obs.signal and not self.Obs.parameter and not self.Obs.parameter2)
self.failUnless(self.GuiObs.signal.pop(0) == 'ObjInEdit')
self.failUnless(self.GuiObs.parameter.pop(0) is obj.ViewObject)
self.failUnless(not self.GuiObs.signal and not self.GuiObs.parameter and not self.GuiObs.parameter2)
self.GuiDoc1.resetEdit()
self.failUnless(not self.Obs.signal and not self.Obs.parameter and not self.Obs.parameter2)
self.failUnless(self.GuiObs.signal.pop(0) == 'ObjResetEdit')
self.failUnless(self.GuiObs.parameter.pop(0) is obj.ViewObject)
self.failUnless(not self.GuiObs.signal and not self.GuiObs.parameter and not self.GuiObs.parameter2)
vo = obj.ViewObject
FreeCAD.ActiveDocument.removeObject(obj.Name)
self.failUnless(self.Obs.signal.pop() == 'ObjDeleted')
@@ -1722,6 +1744,8 @@ class DocumentObserverCases(unittest.TestCase):
self.failUnless(self.GuiObs.parameter.pop() is self.GuiDoc1)
self.failUnless(not self.GuiObs.signal and not self.GuiObs.parameter and not self.GuiObs.parameter2)
FreeCAD.Gui.removeDocumentObserver(self.GuiObs)
def tearDown(self):
#closing doc
FreeCAD.removeDocumentObserver(self.Obs)