From 252405388748d6aaa8ef4dd6d00ce1e6bc587ac6 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Thu, 3 Aug 2017 11:24:13 -0400 Subject: [PATCH] Add Page level redraw signal --- src/Mod/TechDraw/App/DrawPage.cpp | 6 +++- src/Mod/TechDraw/App/DrawPage.h | 4 +++ src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 34 +++++++++++++++++------ src/Mod/TechDraw/Gui/ViewProviderPage.h | 4 +++ 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 79a52bf5ed..409d431869 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -128,7 +128,6 @@ void DrawPage::onChanged(const App::Property* prop) } } else if(prop == &Scale) { // touch all views in the Page as they may be dependent on this scale - // but the views know how to get their own Scale correctly. const std::vector &vals = Views.getValues(); for(std::vector::const_iterator it = vals.begin(); it < vals.end(); ++it) { TechDraw::DrawView *view = dynamic_cast(*it); @@ -281,6 +280,11 @@ int DrawPage::removeView(App::DocumentObject *docObj) return Views.getSize(); } +void DrawPage::requestPaint(void) +{ + signalGuiPaint(this); +} + void DrawPage::onDocumentRestored() { std::vector featViews = Views.getValues(); diff --git a/src/Mod/TechDraw/App/DrawPage.h b/src/Mod/TechDraw/App/DrawPage.h index 51d47b1df8..d37c5d13e1 100644 --- a/src/Mod/TechDraw/App/DrawPage.h +++ b/src/Mod/TechDraw/App/DrawPage.h @@ -24,6 +24,8 @@ #ifndef _DrawPage_h_ #define _DrawPage_h_ +#include + #include #include #include @@ -57,6 +59,7 @@ public: int addView(App::DocumentObject *docObj); int removeView(App::DocumentObject* docObj); short mustExecute() const; + boost::signal signalGuiPaint; /// returns the type name of the ViewProvider virtual const char* getViewProviderName(void) const { @@ -84,6 +87,7 @@ public: double getPageHeight() const; const char* getPageOrientation() const; bool isDeleting(void) { return nowDeleting; } + void requestPaint(void); protected: diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 52ea59d7e4..09b2dde131 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -29,6 +29,9 @@ # include # include #include +#include +#include + #endif /// Here the FreeCAD includes sorted by Base,App,Gui...... @@ -76,13 +79,6 @@ ViewProviderPage::ViewProviderPage() { sPixmap = "TechDraw_Tree_Page"; -// ADD_PROPERTY(HintScale,(10.0)); -// ADD_PROPERTY(HintOffsetX,(10.0)); -// ADD_PROPERTY(HintOffsetY,(10.0)); - - // do not show this in the property editor - //Visibility.StatusBits.set(3, true); - //DisplayMode.StatusBits.set(3, true); Visibility.setStatus(App::Property::Hidden,true); DisplayMode.setStatus(App::Property::Hidden,true); } @@ -94,6 +90,15 @@ ViewProviderPage::~ViewProviderPage() void ViewProviderPage::attach(App::DocumentObject *pcFeat) { ViewProviderDocumentObject::attach(pcFeat); + + auto bnd = boost::bind(&ViewProviderPage::onGuiRepaint, this, _1); + auto feature = getDrawPage(); + if (feature != nullptr) { + connectGuiRepaint = feature->signalGuiPaint.connect(bnd); + } else { + Base::Console().Log("VPP::attach has no Feature!\n"); + } + } void ViewProviderPage::setDisplayMode(const char* ModeName) @@ -138,11 +143,13 @@ void ViewProviderPage::updateData(const App::Property* prop) } } + //if a view is added/deleted, rebuild the visual if (prop == &(getDrawPage()->Views)) { if(!m_mdiView.isNull() && !getDrawPage()->isDeleting()) { m_mdiView->updateDrawing(); } + //if the template is changed, rebuild the visual } else if (prop == &(getDrawPage()->Template)) { if(m_mdiView && !getDrawPage()->isDeleting()) { @@ -207,7 +214,6 @@ bool ViewProviderPage::showMDIViewPage() m_mdiView->setWindowTitle(QObject::tr("Drawing viewer") + QString::fromLatin1("[*]")); m_mdiView->setWindowIcon(Gui::BitmapFactory().pixmap("TechDraw_Tree_Page")); m_mdiView->updateDrawing(true); - // m_mdiView->updateTemplate(true); //TODO: I don't think this is necessary? Ends up triggering a reload of SVG template, but the MDIViewPage constructor does too. Gui::getMainWindow()->addWindow(m_mdiView); m_mdiView->viewAll(); } else { @@ -221,7 +227,6 @@ std::vector ViewProviderPage::claimChildren(void) const { std::vector temp; - // Attach the template if it exists App::DocumentObject *templateFeat = 0; templateFeat = getDrawPage()->Template.getValue(); @@ -349,6 +354,17 @@ bool ViewProviderPage::isShow(void) const return Visibility.getValue(); } +//! Redo the whole visual page +void ViewProviderPage::onGuiRepaint(const TechDraw::DrawPage* dp) +{ + if (dp == getDrawPage()) { + if(!m_mdiView.isNull() && + !getDrawPage()->isDeleting()) { + m_mdiView->updateDrawing(); + } + } +} + TechDraw::DrawPage* ViewProviderPage::getDrawPage() const { //during redo, pcObject can become invalid, but non-zero?? diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index 2297d00350..b4e629edea 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -80,6 +80,10 @@ public: bool isRestoring(void) {return !m_docReady;} TechDraw::DrawPage* getDrawPage() const; + void onGuiRepaint(const TechDraw::DrawPage* dp); + typedef boost::signals::connection Connection; + Connection connectGuiRepaint; + void unsetEdit(int ModNum); MDIViewPage* getMDIViewPage(); bool showMDIViewPage();