Skip to content

Commit

Permalink
Extensions: Port ViewProvider of groups
Browse files Browse the repository at this point in the history
  • Loading branch information
ickby authored and wwmayer committed Oct 8, 2016
1 parent 8c002f1 commit 0a53953
Show file tree
Hide file tree
Showing 15 changed files with 321 additions and 136 deletions.
12 changes: 12 additions & 0 deletions src/App/DocumentObjectExtension.cpp
Expand Up @@ -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());
}
7 changes: 7 additions & 0 deletions src/App/DocumentObjectExtension.h
Expand Up @@ -45,6 +45,9 @@ class AppExport DocumentObjectExtension : public App::Extension
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);
Expand All @@ -58,6 +61,10 @@ class AppExport DocumentObjectExtension : public App::Extension
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
Expand Down
2 changes: 1 addition & 1 deletion src/App/Extension.cpp
Expand Up @@ -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");
Expand Down
12 changes: 7 additions & 5 deletions src/App/Extension.h
Expand Up @@ -31,6 +31,8 @@

namespace App {

class ExtensionContainer;

/**
* @brief Base class for all extension that can be added to a DocumentObject
*
Expand Down Expand Up @@ -135,10 +137,10 @@ class AppExport Extension : public virtual App::PropertyContainer
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();
Expand All @@ -153,8 +155,8 @@ class AppExport Extension : public virtual App::PropertyContainer
Py::Object ExtensionPythonObject;

private:
Base::Type m_extensionType;
App::DocumentObject* m_base = nullptr;
Base::Type m_extensionType;
App::ExtensionContainer* m_base = nullptr;
};


Expand Down
2 changes: 1 addition & 1 deletion src/App/ExtensionContainer.cpp
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/Gui/Application.cpp
Expand Up @@ -118,6 +118,7 @@
#include "TaskView/TaskDialogPython.h"
#include <Gui/Quarter/Quarter.h>
#include "View3DViewerPy.h"
#include "ViewProviderGroupExtension.h"
#include "GuiInitScript.h"


Expand Down Expand Up @@ -1471,6 +1472,7 @@ void Application::initTypes(void)
// View Provider
Gui::ViewProvider ::init();
Gui::ViewProviderExtension ::init();
Gui::ViewProviderGroupExtension ::init();
Gui::ViewProviderExtern ::init();
Gui::ViewProviderDocumentObject ::init();
Gui::ViewProviderFeature ::init();
Expand Down
2 changes: 2 additions & 0 deletions src/Gui/CMakeLists.txt
Expand Up @@ -822,6 +822,7 @@ SOURCE_GROUP("Quarter" FILES ${Quarter_SRCS})
SET(Viewprovider_CPP_SRCS
ViewProvider.cpp
ViewProviderExtension.cpp
ViewProviderGroupExtension.cpp
ViewProviderAnnotation.cpp
ViewProviderDocumentObject.cpp
ViewProviderDocumentObjectGroup.cpp
Expand Down Expand Up @@ -850,6 +851,7 @@ SET(Viewprovider_SRCS
${Viewprovider_CPP_SRCS}
ViewProvider.h
ViewProviderExtension.h
ViewProviderGroupExtension.h
ViewProviderAnnotation.h
ViewProviderDocumentObject.h
ViewProviderDocumentObjectGroup.h
Expand Down
7 changes: 7 additions & 0 deletions src/Gui/ViewProvider.cpp
Expand Up @@ -587,3 +587,10 @@ void ViewProvider::dropObject(App::DocumentObject* obj) {

throw Base::Exception("ViewProvider::dropObject: no extension for droping given object available.");
}

void ViewProvider::Restore(Base::XMLReader& reader) {

auto vector = getExtensionsDerivedFromType<Gui::ViewProviderExtension>();
for(Gui::ViewProviderExtension* ext : vector)
ext->extensionRestore(reader);
}
3 changes: 3 additions & 0 deletions src/Gui/ViewProvider.h
Expand Up @@ -309,6 +309,9 @@ class GuiExport ViewProvider : public App::TransactionalObject
public:
// this method is called by the viewer when the ViewProvider is in edit
static void eventCallback(void * ud, SoEventCallback * node);

//restoring the object from document: this may itnerest extensions, hence call them
virtual void Restore(Base::XMLReader& reader);

protected:
/** @name Display mask modes
Expand Down
110 changes: 6 additions & 104 deletions src/Gui/ViewProviderDocumentObjectGroup.cpp
Expand Up @@ -41,22 +41,24 @@
#include "Tree.h"
#include "View3DInventor.h"
#include "View3DInventorViewer.h"
#include <Base/Console.h>


using namespace Gui;


PROPERTY_SOURCE(Gui::ViewProviderDocumentObjectGroup, Gui::ViewProviderDocumentObject)
PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderDocumentObjectGroup, Gui::ViewProviderDocumentObject, (Gui::ViewProviderGroupExtension))


/**
* Creates the view provider for an object group.
*/
ViewProviderDocumentObjectGroup::ViewProviderDocumentObjectGroup() : visible(false)
ViewProviderDocumentObjectGroup::ViewProviderDocumentObjectGroup()
{
#if 0
setDefaultMode(SO_SWITCH_ALL);
#endif
ViewProviderGroupExtension::initExtension(this);
}

ViewProviderDocumentObjectGroup::~ViewProviderDocumentObjectGroup()
Expand All @@ -65,68 +67,16 @@ ViewProviderDocumentObjectGroup::~ViewProviderDocumentObjectGroup()

#else
Q_UNUSED(prop);
std::vector<App::DocumentObject*> ViewProviderDocumentObjectGroup::claimChildren(void)const
{
return std::vector<App::DocumentObject*>(static_cast<App::DocumentObjectGroup*>(getObject())->Group.getValues());
}

bool ViewProviderDocumentObjectGroup::canDragObjects() const
{
return true;
}

void ViewProviderDocumentObjectGroup::dragObject(App::DocumentObject* obj)
{
Gui::Command::doCommand(Gui::Command::Doc,"App.getDocument(\"%s\").getObject(\"%s\").removeObject("
"App.getDocument(\"%s\").getObject(\"%s\"))",
getObject()->getDocument()->getName(), getObject()->getNameInDocument(),
obj->getDocument()->getName(), obj->getNameInDocument() );
}

bool ViewProviderDocumentObjectGroup::canDropObjects() const
{
return true;
}

void ViewProviderDocumentObjectGroup::dropObject(App::DocumentObject* obj)
{
Gui::Command::doCommand(Gui::Command::Doc,"App.getDocument(\"%s\").getObject(\"%s\").addObject("
"App.getDocument(\"%s\").getObject(\"%s\"))",
getObject()->getDocument()->getName(), getObject()->getNameInDocument(),
obj->getDocument()->getName(), obj->getNameInDocument() );
}

std::vector<std::string> ViewProviderDocumentObjectGroup::getDisplayModes(void) const
{
// empty
return std::vector<std::string>();
}

bool ViewProviderDocumentObjectGroup::onDelete(const std::vector<std::string> &)
{
App::DocumentObjectGroup *group = static_cast<App::DocumentObjectGroup *> (getObject());
// If the group is nonempty ask the user if he wants to delete it's content
if ( group->Group.getSize () ) {
QMessageBox::StandardButton choice =
QMessageBox::question ( 0, QObject::tr ( "Delete group content?" ),
QObject::tr ( "The %1 is not empty, delete it's content as well?")
.arg ( QString::fromUtf8 ( group->Label.getValue () ) ),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes );

if ( choice == QMessageBox::Yes ) {
Gui::Command::doCommand(Gui::Command::Doc,
"App.getDocument(\"%s\").getObject(\"%s\").removeObjectsFromDocument()"
,getObject()->getDocument()->getName(), getObject()->getNameInDocument());
}
}
return true;
}

bool ViewProviderDocumentObjectGroup::allowDrop(const std::vector<const App::DocumentObject*> &objList,
Qt::KeyboardModifiers keys,
Qt::MouseButtons mouseBts,
const QPoint &pos)
{
Q_UNUSED(keys);
Q_UNUSED(mouseBts);
Q_UNUSED(pos);
Expand All @@ -139,7 +89,8 @@ bool ViewProviderDocumentObjectGroup::allowDrop(const std::vector<const App::Doc
}
}

return true;
return true;*/
Base::Console().Message("allow drop called");
}

void ViewProviderDocumentObjectGroup::drop(const std::vector<const App::DocumentObject*> &objList,
Expand Down Expand Up @@ -184,60 +135,11 @@ void ViewProviderDocumentObjectGroup::drop(const std::vector<const App::Document
gui->commitCommand();
}

void ViewProviderDocumentObjectGroup::hide(void)
{
// when reading the Visibility property from file then do not hide the
// objects of this group because they have stored their visibility status, too
if (!Visibility.testStatus(App::Property::User1) && this->visible) {
App::DocumentObject * group = getObject();
if (group && group->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId())) {
const std::vector<App::DocumentObject*> & links = static_cast<App::DocumentObjectGroup*>
(group)->Group.getValues();
Gui::Document* doc = Application::Instance->getDocument(group->getDocument());
for (std::vector<App::DocumentObject*>::const_iterator it = links.begin(); it != links.end(); ++it) {
ViewProvider* view = doc->getViewProvider(*it);
if (view) view->hide();
}
}
}

ViewProviderDocumentObject::hide();
this->visible = false;
}

void ViewProviderDocumentObjectGroup::show(void)
{
// when reading the Visibility property from file then do not hide the
// objects of this group because they have stored their visibility status, too
if (!Visibility.testStatus(App::Property::User1) && !this->visible) {
App::DocumentObject * group = getObject();
if (group && group->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId())) {
const std::vector<App::DocumentObject*> & links = static_cast<App::DocumentObjectGroup*>
(group)->Group.getValues();
Gui::Document* doc = Application::Instance->getDocument(group->getDocument());
for (std::vector<App::DocumentObject*>::const_iterator it = links.begin(); it != links.end(); ++it) {
ViewProvider* view = doc->getViewProvider(*it);
if (view) view->show();
}
}
}

ViewProviderDocumentObject::show();
this->visible = true;
}

bool ViewProviderDocumentObjectGroup::isShow(void) const
{
return Visibility.getValue();
}

void ViewProviderDocumentObjectGroup::Restore(Base::XMLReader &reader)
{
Visibility.setStatus(App::Property::User1, true); // tmp. set
ViewProviderDocumentObject::Restore(reader);
Visibility.setStatus(App::Property::User1, false); // unset
}

/**
* Extracts the associated view providers of the objects of the associated object group group.
*/
Expand Down
18 changes: 4 additions & 14 deletions src/Gui/ViewProviderDocumentObjectGroup.h
Expand Up @@ -27,35 +27,26 @@

#include "ViewProviderDocumentObject.h"
#include "ViewProviderPythonFeature.h"
#include "ViewProviderGroupExtension.h"

namespace Gui {

class GuiExport ViewProviderDocumentObjectGroup : public ViewProviderDocumentObject
class GuiExport ViewProviderDocumentObjectGroup : public ViewProviderDocumentObject,
public ViewProviderGroupExtension
{
PROPERTY_HEADER(Gui::ViewProviderDocumentObjectGroup);
PROPERTY_HEADER_WITH_EXTENSIONS(Gui::ViewProviderDocumentObjectGroup);

public:
/// constructor.
ViewProviderDocumentObjectGroup();
/// destructor.
virtual ~ViewProviderDocumentObjectGroup();

virtual std::vector<App::DocumentObject*> claimChildren(void)const;
virtual bool canDragObjects() const;
virtual void dragObject(App::DocumentObject*);
virtual bool canDropObjects() const;
virtual void dropObject(App::DocumentObject*);

void Restore(Base::XMLReader &reader);
QIcon getIcon(void) const;
/// returns a list of all possible modes
std::vector<std::string> getDisplayModes(void) const;
virtual void hide(void);
virtual void show(void);
bool isShow(void) const;

virtual bool onDelete(const std::vector<std::string> &);

/// get called if the user hover over a object in the tree
virtual bool allowDrop(const std::vector<const App::DocumentObject*> &objList,
Qt::KeyboardModifiers keys,
Expand All @@ -71,7 +62,6 @@ class GuiExport ViewProviderDocumentObjectGroup : public ViewProviderDocumentObj
void getViewProviders(std::vector<ViewProviderDocumentObject*>&) const;

private:
bool visible; // helper variable
std::vector<ViewProvider*> nodes;
};

Expand Down
23 changes: 14 additions & 9 deletions src/Gui/ViewProviderExtension.cpp
Expand Up @@ -44,12 +44,17 @@ ViewProviderExtension::~ViewProviderExtension()
{

}
/*
PyObject* ViewProviderExtension::getExtensionPyObject(void) {
if (ExtensionPythonObject.is(Py::_None())){
// ref counter is set to 1
ExtensionPythonObject = Py::Object(new ViewProviderExtensionPy(this),true);
}
return Py::new_reference_to(ExtensionPythonObject);
}*/

const ViewProviderDocumentObject* ViewProviderExtension::getExtendedViewProvider() const{

assert(getExtendedContainer()->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()));
return static_cast<const ViewProviderDocumentObject*>(getExtendedContainer());
}

ViewProviderDocumentObject* ViewProviderExtension::getExtendedViewProvider() {

assert(getExtendedContainer()->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()));
return static_cast<ViewProviderDocumentObject*>(getExtendedContainer());
}


0 comments on commit 0a53953

Please sign in to comment.