+ fixes #0001838: When In Sketcher Make It Difficult To Mistakenly Delete A Feature

This commit is contained in:
wmayer 2014-12-25 22:43:09 +01:00
parent a6b8bd6815
commit e8802adcbe
2 changed files with 57 additions and 37 deletions

View File

@ -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();
} }
} }
} }

View File

@ -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();