diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index 16b0b25e6c..9949d16b2e 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -239,6 +239,11 @@ public: } } + Sketcher::SketchObject* getSketchObject() const + { + return sketchView->getSketchObject(); + } + int ElementNbr; int StartingVertex; int MidVertex; @@ -586,6 +591,47 @@ void ElementView::changeLayer(int layer) doc->commitTransaction(); } +void ElementView::changeLayer(ElementItem* item, int layer) +{ + App::Document* doc = App::GetApplication().getActiveDocument(); + + if (!doc) { + return; + } + + doc->openTransaction("Geometry Layer Change"); + + auto sketchObject = item->getSketchObject(); + + auto geometry = sketchObject->Geometry.getValues(); + auto newGeometry(geometry); + + auto geoid = item->ElementNbr; + + // currently only internal geometry can be changed from one layer to another + if (geoid >= 0) { + auto currentLayer = getSafeGeomLayerId(geometry[geoid]); + + if (currentLayer != layer) { + auto geo = geometry[geoid]->clone(); + setSafeGeomLayerId(geo, layer); + newGeometry[geoid] = geo; + + sketchObject->Geometry.setValues(std::move(newGeometry)); + sketchObject->solve(); + } + } + else { + Gui::TranslatedUserWarning( + sketchObject, + QObject::tr("Unsupported visual layer operation"), + QObject::tr("It is currently unsupported to move external geometry to another " + "visual layer. External geometry will be omitted")); + } + + doc->commitTransaction(); +} + void ElementView::contextMenuEvent(QContextMenuEvent* event) { QMenu menu; @@ -788,14 +834,11 @@ void ElementView::onIndexHovered(QModelIndex index) Q_EMIT onItemHovered(itemFromIndex(index)); } -void ElementView::onIndexChecked(QModelIndex, Qt::CheckState state) +void ElementView::onIndexChecked(QModelIndex index, Qt::CheckState state) { - if (state == Qt::Checked) { - changeLayer(static_cast(ElementItem::Layer::Default)); - } - else { - changeLayer(static_cast(ElementItem::Layer::Hidden)); - } + auto item = itemFromIndex(index); + + changeLayer(item, static_cast(state == Qt::Checked ? ElementItem::Layer::Default : ElementItem::Layer::Hidden)); } ElementItem* ElementView::itemFromIndex(const QModelIndex& index) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.h b/src/Mod/Sketcher/Gui/TaskSketcherElements.h index 1284a804d2..6965b44ea1 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.h @@ -109,6 +109,7 @@ Q_SIGNALS: private: void changeLayer(int layer); + void changeLayer(ElementItem* item, int layer); }; class ElementFilterList;