diff --git a/src/Mod/TechDraw/Gui/ViewProviderBalloon.cpp b/src/Mod/TechDraw/Gui/ViewProviderBalloon.cpp index 9912224bee..8f323ded17 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderBalloon.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderBalloon.cpp @@ -39,6 +39,7 @@ #include #include "PreferencesGui.h" +#include "ZVALUE.h" #include "QGIViewBalloon.h" #include "TaskBalloon.h" #include "ViewProviderBalloon.h" @@ -65,8 +66,7 @@ ViewProviderBalloon::ViewProviderBalloon() ADD_PROPERTY_TYPE(LineVisible, (true), group, (App::PropertyType)(App::Prop_None), "Balloon line visible or hidden"); ADD_PROPERTY_TYPE(Color, (PreferencesGui::dimColor()), group, App::Prop_None, "Color of the balloon"); - //Dimensions take their stacking order from the parent View - StackOrder.setStatus(App::Property::Hidden,true); + StackOrder.setValue(ZVALUE::DIMENSION); } ViewProviderBalloon::~ViewProviderBalloon() diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp index 6411f0d1f5..b299a9fbc4 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp @@ -40,6 +40,7 @@ #include #include "PreferencesGui.h" +#include "ZVALUE.h" #include "TaskDimension.h" #include "QGIViewDimension.h" #include "ViewProviderDimension.h" @@ -86,8 +87,7 @@ ViewProviderDimension::ViewProviderDimension() ADD_PROPERTY_TYPE(GapFactorASME, (Preferences::GapASME()), group, App::Prop_None, "Adjusts the gap between dimension point and extension line"); - //Dimensions take their stacking order from the parent View - StackOrder.setStatus(App::Property::Hidden,true); + StackOrder.setValue(ZVALUE::DIMENSION); } ViewProviderDimension::~ViewProviderDimension() diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index f234bcf3a5..696a01170b 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -28,6 +28,8 @@ #include #endif +#include + #include #include #include @@ -347,40 +349,73 @@ void ViewProviderDrawingView::stackDown() void ViewProviderDrawingView::stackTop() { - Gui::Document* gDoc = getDocument(); - std::vector vps = gDoc->getViewProvidersOfType(TechDrawGui::ViewProviderDrawingView::getClassTypeId()); - int maxZ = 0; - for (auto& vp: vps) { - ViewProviderDrawingView* vpdv = static_cast(vp); - int z = vpdv->StackOrder.getValue(); - if (z > maxZ) { - maxZ = z; + QGIView* qView = getQView(); + if (!qView || !getViewProviderPage()) { + //no view, nothing to stack + return; + } + int maxZ = INT_MIN; + auto parent = qView->parentItem(); + if (parent) { + //if we have a parentItem, we have to stack within the parentItem, not within the page + auto siblings = parent->childItems(); + for (auto& child : siblings) { + if (child->zValue() > maxZ) { + maxZ = child->zValue(); + } + } + } else { + //if we have no parentItem, we are a top level QGIView and we need to stack + //with respect to the other top level views on this page + std::vector peerObjects = getViewProviderPage()->claimChildren(); + Gui::Document* gDoc = getDocument(); + for (auto& peer: peerObjects) { + auto vpPeer = gDoc->getViewProvider(peer); + ViewProviderDrawingView* vpdv = static_cast(vpPeer); + int z = vpdv->StackOrder.getValue(); + if (z > maxZ) { + maxZ = z; + } } } StackOrder.setValue(maxZ + 1); - QGIView* v = getQView(); - if (v) { - v->setStack(maxZ + 1); - } + qView->setStack(maxZ + 1); } void ViewProviderDrawingView::stackBottom() { - Gui::Document* gDoc = getDocument(); - std::vector vps = gDoc->getViewProvidersOfType(TechDrawGui::ViewProviderDrawingView::getClassTypeId()); - int minZ = 0; - for (auto& vp: vps) { - ViewProviderDrawingView* vpdv = static_cast(vp); - int z = vpdv->StackOrder.getValue(); - if (z < minZ) { - minZ = z; + QGIView* qView = getQView(); + if (!qView || !getViewProviderPage()) { + //no view, nothing to stack + return; + } + int minZ = INT_MAX; + auto parent = qView->parentItem(); + if (parent) { + //if we have a parentItem, we have to stack within the parentItem, not within the page + auto siblings = parent->childItems(); + for (auto& child : siblings) { + if (child->zValue() < minZ) { + minZ = child->zValue(); + } + } + } else { + //TODO: need to special case DPGI or any other member of a collection + //if we have no parentItem, we are a top level QGIView and we need to stack + //with respect to the other top level views on this page + std::vector peerObjects = getViewProviderPage()->claimChildren(); + Gui::Document* gDoc = getDocument(); + for (auto& peer: peerObjects) { + auto vpPeer = gDoc->getViewProvider(peer); + ViewProviderDrawingView* vpdv = static_cast(vpPeer); + int z = vpdv->StackOrder.getValue(); + if (z < minZ) { + minZ = z; + } } } StackOrder.setValue(minZ - 1); - QGIView* v = getQView(); - if (v) { - v->setStack(minZ - 1); - } + qView->setStack(minZ - 1); } TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp b/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp index 2c9161d7da..7367874bf0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp @@ -41,6 +41,7 @@ #include #include "PreferencesGui.h" +#include "ZVALUE.h" #include "QGIView.h" #include "TaskLeaderLine.h" #include "ViewProviderLeader.h" @@ -71,6 +72,8 @@ ViewProviderLeader::ViewProviderLeader() LineStyle.setEnums(LineStyleEnums); ADD_PROPERTY_TYPE(LineStyle, (1), group, (App::PropertyType)(App::Prop_None), "Line style"); ADD_PROPERTY_TYPE(Color, (getDefLineColor()), group, App::Prop_None, "Color of the Markup"); + + StackOrder.setValue(ZVALUE::DIMENSION); } ViewProviderLeader::~ViewProviderLeader() diff --git a/src/Mod/TechDraw/Gui/ViewProviderRichAnno.cpp b/src/Mod/TechDraw/Gui/ViewProviderRichAnno.cpp index 6ec4f0851a..e433a266e9 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderRichAnno.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderRichAnno.cpp @@ -31,6 +31,7 @@ #include #include "PreferencesGui.h" +#include "ZVALUE.h" #include "QGIView.h" #include "TaskRichAnno.h" #include "QGSPage.h" @@ -64,6 +65,7 @@ ViewProviderRichAnno::ViewProviderRichAnno() ADD_PROPERTY_TYPE(LineStyle, (1), group, (App::PropertyType)(App::Prop_None), "Frame line style"); ADD_PROPERTY_TYPE(LineColor, (getDefLineColor()), group, App::Prop_None, "The color of the frame"); + StackOrder.setValue(ZVALUE::DIMENSION); } ViewProviderRichAnno::~ViewProviderRichAnno()