diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index f3e67e3af455..338e806d5a01 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -641,7 +641,7 @@ void Application::slotNewDocument(const App::Document& Doc) signalNewDocument(*pDoc); - pDoc->createView("View3DIv"); + pDoc->createView(View3DInventor::getClassTypeId()); qApp->processEvents(); // make sure to show the window stuff on the right place } diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp index 7146769f518a..85f4c1affdbc 100644 --- a/src/Gui/CommandView.cpp +++ b/src/Gui/CommandView.cpp @@ -1576,7 +1576,7 @@ StdCmdViewCreate::StdCmdViewCreate() void StdCmdViewCreate::activated(int iMsg) { - getActiveGuiDocument()->createView("View3DIv"); + getActiveGuiDocument()->createView(View3DInventor::getClassTypeId()); getActiveGuiDocument()->getActiveView()->viewAll(); } diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 1425fff76b3c..6db42bad4767 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -27,6 +27,7 @@ # include # include # include +# include # include # include # include @@ -920,41 +921,44 @@ void Document::addRootObjectsToGroup(const std::vector& ob } } -void Document::createView(const char* sType) +void Document::createView(const Base::Type& typeId) { - View3DInventor* view3D = new View3DInventor(this, getMainWindow()); - - //get first view override mode and copy - std::list theViews = this->getMDIViews(); - std::list::iterator viewIt; - for (viewIt = theViews.begin(); viewIt != theViews.end(); ++viewIt) - { - View3DInventor *tempView = dynamic_cast(*viewIt); - if (!tempView) - continue; - std::string overrideMode = tempView->getViewer()->getOverrideMode(); - view3D->getViewer()->setOverrideMode(overrideMode); - break; - } - - // attach the viewprovider - std::map::const_iterator It1; - for (It1=d->_ViewProviderMap.begin();It1!=d->_ViewProviderMap.end();++It1) - view3D->getViewer()->addViewProvider(It1->second); - std::map::const_iterator It2; - for (It2=d->_ViewProviderMapAnnotation.begin();It2!=d->_ViewProviderMapAnnotation.end();++It2) - view3D->getViewer()->addViewProvider(It2->second); + if (!typeId.isDerivedFrom(MDIView::getClassTypeId())) + return; - const char* name = getDocument()->Label.getValue(); + std::list theViews = this->getMDIViewsOfType(typeId); + if (typeId == View3DInventor::getClassTypeId()) { + View3DInventor* firstView = 0; + QGLWidget* shareWidget = 0; + if (!theViews.empty()) { + firstView = dynamic_cast(theViews.front()); + shareWidget = qobject_cast(firstView->getViewer()->getGLWidget()); + } - QString title = QString::fromAscii("%1 : %2[*]") - .arg(QString::fromUtf8(name)).arg(d->_iWinCount++); + View3DInventor* view3D = new View3DInventor(this, getMainWindow(), shareWidget); + if (firstView) { + std::string overrideMode = firstView->getViewer()->getOverrideMode(); + view3D->getViewer()->setOverrideMode(overrideMode); + } - view3D->setWindowTitle(title); - view3D->setWindowModified(this->isModified()); - view3D->setWindowIcon(QApplication::windowIcon()); - view3D->resize(400, 300); - getMainWindow()->addWindow(view3D); + // attach the viewprovider + std::map::const_iterator It1; + for (It1=d->_ViewProviderMap.begin();It1!=d->_ViewProviderMap.end();++It1) + view3D->getViewer()->addViewProvider(It1->second); + std::map::const_iterator It2; + for (It2=d->_ViewProviderMapAnnotation.begin();It2!=d->_ViewProviderMapAnnotation.end();++It2) + view3D->getViewer()->addViewProvider(It2->second); + + const char* name = getDocument()->Label.getValue(); + QString title = QString::fromAscii("%1 : %2[*]") + .arg(QString::fromUtf8(name)).arg(d->_iWinCount++); + + view3D->setWindowTitle(title); + view3D->setWindowModified(this->isModified()); + view3D->setWindowIcon(QApplication::windowIcon()); + view3D->resize(400, 300); + getMainWindow()->addWindow(view3D); + } } void Document::attachView(Gui::BaseView* pcView, bool bPassiv) diff --git a/src/Gui/Document.h b/src/Gui/Document.h index dca5c0ad880d..38fbc772e0a4 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -142,7 +142,7 @@ class GuiExport Document : public Base::Persistence Gui::MDIView* getActiveView(void) const; Gui::MDIView* getViewOfViewProvider(Gui::ViewProvider*) const; /// Creat a new view - void createView(const char* sType); + void createView(const Base::Type& typeId); /** send messages to the active view * Send a specific massage to the active view and is able to recive a * return massage diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index 4d5bebf9883a..cd3abf6c9776 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -98,7 +98,8 @@ void GLOverlayWidget::paintEvent(QPaintEvent* ev) TYPESYSTEM_SOURCE_ABSTRACT(Gui::View3DInventor,Gui::MDIView); -View3DInventor::View3DInventor(Gui::Document* pcDocument, QWidget* parent, Qt::WFlags wflags) +View3DInventor::View3DInventor(Gui::Document* pcDocument, QWidget* parent, + const QGLWidget* sharewidget, Qt::WFlags wflags) : MDIView(pcDocument, parent, wflags), _viewerPy(0) { stack = new QStackedWidget(this); @@ -106,39 +107,47 @@ View3DInventor::View3DInventor(Gui::Document* pcDocument, QWidget* parent, Qt::W setMouseTracking(true); // accept drops on the window, get handled in dropEvent, dragEnterEvent setAcceptDrops(true); - + // attach parameter Observer hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); hGrp->Attach(this); - //anti aliasing settings + //anti-aliasing settings QGLFormat f; + bool smoothing = false; + bool glformat = false; switch( hGrp->GetInt("AntiAliasing",0) ) { case View3DInventorViewer::MSAA2x: + glformat = true; f.setSampleBuffers(true); f.setSamples(2); - _viewer = new View3DInventorViewer(f,this); break; case View3DInventorViewer::MSAA4x: + glformat = true; f.setSampleBuffers(true); f.setSamples(4); - _viewer = new View3DInventorViewer(f,this); break; case View3DInventorViewer::MSAA8x: + glformat = true; f.setSampleBuffers(true); f.setSamples(8); - _viewer = new View3DInventorViewer(f,this); break; case View3DInventorViewer::Smoothing: - _viewer = new View3DInventorViewer(this); - _viewer->getSoRenderManager()->getGLRenderAction()->setSmoothing(true); + smoothing = true; break; case View3DInventorViewer::None: default: - _viewer = new View3DInventorViewer(this); break; } + if (glformat) + _viewer = new View3DInventorViewer(f, this, sharewidget); + else + _viewer = new View3DInventorViewer(this, sharewidget); + + if (smoothing) + _viewer->getSoRenderManager()->getGLRenderAction()->setSmoothing(true); + // create the inventor widget and set the defaults #if !defined (NO_USE_QT_MDI_AREA) _viewer->setDocument(this->_pcDocument); diff --git a/src/Gui/View3DInventor.h b/src/Gui/View3DInventor.h index e1471dfbe9d7..4f734c9d3e36 100644 --- a/src/Gui/View3DInventor.h +++ b/src/Gui/View3DInventor.h @@ -67,7 +67,7 @@ class GuiExport View3DInventor : public MDIView, public ParameterGrp::ObserverTy TYPESYSTEM_HEADER(); public: - View3DInventor(Gui::Document* pcDocument, QWidget* parent, Qt::WFlags wflags=0); + View3DInventor(Gui::Document* pcDocument, QWidget* parent, const QGLWidget* sharewidget = 0, Qt::WFlags wflags=0); ~View3DInventor(); /// Message handler diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index b94c18969813..e0a2160c06ae 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -297,16 +297,16 @@ class SpaceNavigatorDevice : public Quarter::InputDevice { // ************************************************************************* -View3DInventorViewer::View3DInventorViewer(QWidget* parent) - : Quarter::SoQTQuarterAdaptor(parent), editViewProvider(0), navigation(0), +View3DInventorViewer::View3DInventorViewer(QWidget* parent, const QGLWidget* sharewidget) + : Quarter::SoQTQuarterAdaptor(parent, sharewidget), editViewProvider(0), navigation(0), framebuffer(0), axisCross(0), axisGroup(0), editing(FALSE), redirected(FALSE), allowredir(FALSE), overrideMode("As Is") { init(); }; -View3DInventorViewer::View3DInventorViewer(const QGLFormat& format, QWidget* parent) - : Quarter::SoQTQuarterAdaptor(format, parent), editViewProvider(0), navigation(0), +View3DInventorViewer::View3DInventorViewer(const QGLFormat& format, QWidget* parent, const QGLWidget* sharewidget) + : Quarter::SoQTQuarterAdaptor(format, parent, sharewidget), editViewProvider(0), navigation(0), framebuffer(0), axisCross(0), axisGroup(0), editing(FALSE), redirected(FALSE), allowredir(FALSE), overrideMode("As Is") { diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index faaeb8b2fcd9..03ad4869881a 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -120,8 +120,8 @@ class GuiExport View3DInventorViewer : public Quarter::SoQTQuarterAdaptor, publi }; //@} - View3DInventorViewer (QWidget *parent); - View3DInventorViewer (const QGLFormat& format, QWidget *parent); + View3DInventorViewer (QWidget *parent, const QGLWidget* sharewidget = 0); + View3DInventorViewer (const QGLFormat& format, QWidget *parent, const QGLWidget* sharewidget = 0); virtual ~View3DInventorViewer(); void init();