Gui: add virtual method containsViewProvider to MDIView and re-implement it in some sub-classes

Improve Document::setActiveView to not always switch to the first 3D view but check the currently active view before
This commit is contained in:
wmayer
2019-12-29 15:00:35 +01:00
parent ad95219129
commit eb4e2d2c56
8 changed files with 73 additions and 18 deletions

View File

@@ -1956,44 +1956,56 @@ MDIView* Document::getActiveView(void) const
return 0;
}
MDIView *Document::setActiveView(ViewProviderDocumentObject *vp, Base::Type typeId) {
MDIView *view = 0;
if(!vp)
MDIView *Document::setActiveView(ViewProviderDocumentObject *vp, Base::Type typeId)
{
MDIView *view = nullptr;
if (!vp) {
view = getActiveView();
else{
}
else {
view = vp->getMDIView();
if(!view) {
if (!view) {
auto obj = vp->getObject();
if(!obj)
if (!obj) {
view = getActiveView();
}
else {
auto linked = obj->getLinkedObject(true);
if(linked!=obj) {
if (linked!=obj) {
auto vpLinked = dynamic_cast<ViewProviderDocumentObject*>(
Application::Instance->getViewProvider(linked));
if(vpLinked)
if (vpLinked)
view = vpLinked->getMDIView();
}
if(!view && typeId.isBad())
typeId = View3DInventor::getClassTypeId();
if (!view && typeId.isBad()) {
MDIView* active = getActiveView();
if (active && active->containsViewProvider(vp))
view = active;
else
typeId = View3DInventor::getClassTypeId();
}
}
}
}
if(!view || (!typeId.isBad() && !view->isDerivedFrom(typeId))) {
view = 0;
if (!view || (!typeId.isBad() && !view->isDerivedFrom(typeId))) {
view = nullptr;
for (auto *v : d->baseViews) {
if(v->isDerivedFrom(MDIView::getClassTypeId()) &&
(typeId.isBad() || v->isDerivedFrom(typeId)))
{
if (v->isDerivedFrom(MDIView::getClassTypeId()) &&
(typeId.isBad() || v->isDerivedFrom(typeId))) {
view = static_cast<MDIView*>(v);
break;
}
}
}
if(!view && !typeId.isBad())
if (!view && !typeId.isBad())
view = createView(typeId);
if(view)
if (view)
getMainWindow()->setActiveWindow(view);
return view;
}

View File

@@ -35,6 +35,7 @@ QT_END_NAMESPACE
namespace Gui
{
class Document;
class ViewProvider;
class ViewProviderDocumentObject;
/** Base class of all windows belonging to a document.
@@ -131,6 +132,16 @@ public:
return ActiveObjects.hasObject(o,n,subname);
}
/*!
* \brief containsViewProvider
* Checks if the given view provider is part of this view. The default implementation
* returns false.
* \return bool
*/
virtual bool containsViewProvider(const ViewProvider*) const {
return false;
}
public Q_SLOTS:
virtual void setOverrideCursor(const QCursor&);
virtual void restoreOverrideCursor();

View File

@@ -72,6 +72,16 @@ void AbstractSplitView::deleteSelf()
MDIView::deleteSelf();
}
bool AbstractSplitView::containsViewProvider(const ViewProvider* vp) const
{
for (auto it = _viewer.begin(); it != _viewer.end(); ++it) {
if ((*it)->containsViewProvider(vp))
return true;
}
return false;
}
void AbstractSplitView::setupSettings()
{
// attach Parameter Observer

View File

@@ -56,6 +56,7 @@ public:
View3DInventorViewer *getViewer(unsigned int) const;
void setOverrideCursor(const QCursor&);
virtual bool containsViewProvider(const ViewProvider*) const;
PyObject *getPyObject(void);
void setPyObject(PyObject *);

View File

@@ -84,6 +84,7 @@
#include <Inventor/nodes/SoOrthographicCamera.h>
#include "View3DInventorExamples.h"
#include "ViewProviderDocumentObject.h"
#include "SoFCSelectionAction.h"
#include "View3DPy.h"
#include "SoFCDB.h"
@@ -516,6 +517,11 @@ void View3DInventor::print(QPrinter* printer)
p.end();
}
bool View3DInventor::containsViewProvider(const ViewProvider* vp) const
{
return _viewer->containsViewProvider(vp);
}
// **********************************************************************************
bool View3DInventor::onMsg(const char* pMsg, const char** ppReturn)

View File

@@ -106,7 +106,8 @@ public:
void removeOverlayWidget();
View3DInventorViewer *getViewer(void) const {return _viewer;}
virtual bool containsViewProvider(const ViewProvider*) const;
public Q_SLOTS:
/// override the cursor in this view
void setOverrideCursor(const QCursor&);

View File

@@ -968,6 +968,15 @@ SbBool View3DInventorViewer::hasViewProvider(ViewProvider* pcProvider) const
return _ViewProviderSet.find(pcProvider) != _ViewProviderSet.end();
}
SbBool View3DInventorViewer::containsViewProvider(const ViewProvider* vp) const
{
SoSearchAction sa;
sa.setNode(const_cast<ViewProvider*>(vp)->getRoot());
sa.setSearchingAll(true);
sa.apply(getSoRenderManager()->getSceneGraph());
return sa.getPath() != nullptr;
}
/// adds an ViewProvider to the view, e.g. from a feature
void View3DInventorViewer::addViewProvider(ViewProvider* pcProvider)
{

View File

@@ -181,7 +181,12 @@ public:
/** @name Handling of view providers */
//@{
/// Checks if the view provider is a top-level object of the scene
SbBool hasViewProvider(ViewProvider*) const;
/// Checks if the view provider is part of the scene.
/// In contrast to hasViewProvider() this method also checks if the view
/// provider is a child of another view provider
SbBool containsViewProvider(const ViewProvider*) const;
/// adds an ViewProvider to the view, e.g. from a feature
void addViewProvider(ViewProvider*);
/// remove a ViewProvider