Extensions: Port ViewProvider of groups

This commit is contained in:
Stefan Tröger
2016-08-27 11:56:38 +02:00
committed by wmayer
parent b5f4023050
commit f61bb9062e
15 changed files with 321 additions and 136 deletions

View File

@@ -75,3 +75,15 @@ PyObject* DocumentObjectExtension::getExtensionPyObject(void) {
}
return Py::new_reference_to(ExtensionPythonObject);
}
const DocumentObject* DocumentObjectExtension::getExtendedObject() const {
assert(getExtendedContainer()->isDerivedFrom(DocumentObject::getClassTypeId()));
return static_cast<const DocumentObject*>(getExtendedContainer());
}
DocumentObject* DocumentObjectExtension::getExtendedObject() {
assert(getExtendedContainer()->isDerivedFrom(DocumentObject::getClassTypeId()));
return static_cast<DocumentObject*>(getExtendedContainer());
}

View File

@@ -45,6 +45,9 @@ public:
DocumentObjectExtension ();
virtual ~DocumentObjectExtension ();
App::DocumentObject* getExtendedObject();
const App::DocumentObject* getExtendedObject() const;
//override if execution is nesseccary
virtual short extensionMustExecute(void);
virtual App::DocumentObjectExecReturn *extensionExecute(void);
@@ -58,6 +61,10 @@ public:
virtual void onExtendedUnsetupObject();
virtual PyObject* getExtensionPyObject(void);
/// returns the type name of the ViewProviderExtension which is automatically attached
/// to the viewprovider object when it is initiated
virtual const char* getViewProviderExtensionName(void) const {return "";};
};
} //App

View File

@@ -66,7 +66,7 @@ void Extension::initExtension(Base::Type type) {
throw Base::Exception("Extension: Extension type not set");
}
void Extension::initExtension(DocumentObject* obj) {
void Extension::initExtension(ExtensionContainer* obj) {
if(m_extensionType.isBad())
throw Base::Exception("Extension: Extension type not set");

View File

@@ -31,6 +31,8 @@
namespace App {
class ExtensionContainer;
/**
* @brief Base class for all extension that can be added to a DocumentObject
*
@@ -135,10 +137,10 @@ public:
Extension();
virtual ~Extension();
void initExtension(App::DocumentObject* obj);
void initExtension(App::ExtensionContainer* obj);
App::DocumentObject* getExtendedObject() {return m_base;};
const App::DocumentObject* getExtendedObject() const {return m_base;};
App::ExtensionContainer* getExtendedContainer() {return m_base;};
const App::ExtensionContainer* getExtendedContainer() const {return m_base;};
//get extension name without namespace
const char* name();
@@ -153,8 +155,8 @@ protected:
Py::Object ExtensionPythonObject;
private:
Base::Type m_extensionType;
App::DocumentObject* m_base = nullptr;
Base::Type m_extensionType;
App::ExtensionContainer* m_base = nullptr;
};

View File

@@ -47,7 +47,7 @@ ExtensionContainer::~ExtensionContainer() {
void ExtensionContainer::registerExtension(Base::Type extension, Extension* ext) {
if(ext->getExtendedObject() != this)
if(ext->getExtendedContainer() != this)
throw Base::Exception("ExtensionContainer::registerExtension: Extension has not this as base object");
//no duplicate extensions (including base classes)