+ fixes #0001838: When In Sketcher Make It Difficult To Mistakenly Delete A Feature
This commit is contained in:
parent
a6b8bd6815
commit
e8802adcbe
|
@ -1017,54 +1017,77 @@ void StdCmdDelete::activated(int iMsg)
|
||||||
Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(*it);
|
Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(*it);
|
||||||
std::vector<Gui::SelectionObject> sel = rSel.getSelectionEx((*it)->getName());
|
std::vector<Gui::SelectionObject> sel = rSel.getSelectionEx((*it)->getName());
|
||||||
if (!sel.empty()) {
|
if (!sel.empty()) {
|
||||||
bool doDeletion = true;
|
bool autoDeletion = true;
|
||||||
// check if we can delete the object
|
|
||||||
for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) {
|
// if an object is in edit mode handle only this object even if unselected (#0001838)
|
||||||
App::DocumentObject* obj = ft->getObject();
|
Gui::ViewProvider* vpedit = pGuiDoc->getInEdit();
|
||||||
Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject());
|
if (vpedit) {
|
||||||
// if the object is in edit mode we allow to continue because only sub-elements will be removed
|
// check if the edited view provider is selected
|
||||||
if (!vp || !vp->isEditing()) {
|
for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) {
|
||||||
|
App::DocumentObject* obj = ft->getObject();
|
||||||
|
Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject());
|
||||||
|
if (vp == vpedit) {
|
||||||
|
if (!ft->getSubNames().empty()) {
|
||||||
|
// handle the view provider
|
||||||
|
Gui::getMainWindow()->setUpdatesEnabled(false);
|
||||||
|
|
||||||
|
(*it)->openTransaction("Delete");
|
||||||
|
vpedit->onDelete(ft->getSubNames());
|
||||||
|
(*it)->commitTransaction();
|
||||||
|
|
||||||
|
Gui::getMainWindow()->setUpdatesEnabled(true);
|
||||||
|
Gui::getMainWindow()->update();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// check if we can delete the object
|
||||||
|
for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) {
|
||||||
|
App::DocumentObject* obj = ft->getObject();
|
||||||
|
Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject());
|
||||||
std::vector<App::DocumentObject*> links = obj->getInList();
|
std::vector<App::DocumentObject*> links = obj->getInList();
|
||||||
if (!links.empty()) {
|
if (!links.empty()) {
|
||||||
// check if the referenced objects are groups or are selected too
|
// check if the referenced objects are groups or are selected too
|
||||||
for (std::vector<App::DocumentObject*>::iterator lt = links.begin(); lt != links.end(); ++lt) {
|
for (std::vector<App::DocumentObject*>::iterator lt = links.begin(); lt != links.end(); ++lt) {
|
||||||
if (!(*lt)->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId()) && !rSel.isSelected(*lt)) {
|
if (!(*lt)->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId()) && !rSel.isSelected(*lt)) {
|
||||||
doDeletion = false;
|
autoDeletion = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doDeletion) {
|
if (!autoDeletion) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!doDeletion) {
|
if (!autoDeletion) {
|
||||||
int ret = QMessageBox::question(Gui::getMainWindow(),
|
int ret = QMessageBox::question(Gui::getMainWindow(),
|
||||||
qApp->translate("Std_Delete", "Object dependencies"),
|
qApp->translate("Std_Delete", "Object dependencies"),
|
||||||
qApp->translate("Std_Delete", "This object is referenced by other objects and thus these objects might get broken.\n"
|
qApp->translate("Std_Delete", "This object is referenced by other objects and thus these objects might get broken.\n"
|
||||||
"Are you sure to continue?"),
|
"Are you sure to continue?"),
|
||||||
QMessageBox::Yes, QMessageBox::No);
|
QMessageBox::Yes, QMessageBox::No);
|
||||||
if (ret == QMessageBox::Yes)
|
if (ret == QMessageBox::Yes)
|
||||||
doDeletion = true;
|
autoDeletion = true;
|
||||||
}
|
}
|
||||||
if (doDeletion) {
|
if (autoDeletion) {
|
||||||
Gui::getMainWindow()->setUpdatesEnabled(false);
|
Gui::getMainWindow()->setUpdatesEnabled(false);
|
||||||
(*it)->openTransaction("Delete");
|
(*it)->openTransaction("Delete");
|
||||||
for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) {
|
for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) {
|
||||||
Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject());
|
Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject());
|
||||||
if (vp) {
|
if (vp) {
|
||||||
// ask the ViewProvider if it wants to do some clean up
|
// ask the ViewProvider if it wants to do some clean up
|
||||||
if (vp->onDelete(ft->getSubNames()))
|
if (vp->onDelete(ft->getSubNames()))
|
||||||
doCommand(Doc,"App.getDocument(\"%s\").removeObject(\"%s\")"
|
doCommand(Doc,"App.getDocument(\"%s\").removeObject(\"%s\")"
|
||||||
,(*it)->getName(), ft->getFeatName());
|
,(*it)->getName(), ft->getFeatName());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
(*it)->commitTransaction();
|
||||||
|
Gui::getMainWindow()->setUpdatesEnabled(true);
|
||||||
|
Gui::getMainWindow()->update();
|
||||||
}
|
}
|
||||||
(*it)->commitTransaction();
|
|
||||||
Gui::getMainWindow()->setUpdatesEnabled(true);
|
|
||||||
Gui::getMainWindow()->update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4497,10 +4497,7 @@ Sketcher::SketchObject *ViewProviderSketch::getSketchObject(void) const
|
||||||
bool ViewProviderSketch::onDelete(const std::vector<std::string> &subList)
|
bool ViewProviderSketch::onDelete(const std::vector<std::string> &subList)
|
||||||
{
|
{
|
||||||
if (edit) {
|
if (edit) {
|
||||||
std::vector<Gui::SelectionObject> selection = Gui::Selection().getSelectionEx();
|
std::vector<std::string> SubNames = subList;
|
||||||
if (selection.empty())
|
|
||||||
return false;
|
|
||||||
const std::vector<std::string> &SubNames = selection[0].getSubNames();
|
|
||||||
|
|
||||||
Gui::Selection().clearSelection();
|
Gui::Selection().clearSelection();
|
||||||
resetPreselectPoint();
|
resetPreselectPoint();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user