[TD]prevent detail object deletion during task dialog

This commit is contained in:
wandererfan
2025-07-17 18:35:49 -04:00
committed by Yorik van Havre
parent 1d64a3a983
commit c47cd6bece
3 changed files with 34 additions and 3 deletions

View File

@@ -651,6 +651,17 @@ void TaskDlgDetail::modifyStandardButtons(QDialogButtonBox* box)
widget->saveButtons(btnOK, btnCancel);
}
std::string TaskDlgDetail::getDetailName() const
{
DrawViewDetail* detailObj = widget->getDetailFeat();
if (!detailObj) {
return {"not found"};
}
return detailObj->getNameInDocument();
}
//==== calls from the TaskView ===============================================================
void TaskDlgDetail::open()
{

View File

@@ -65,6 +65,9 @@ public:
QPushButton* btnCancel);
void enableTaskButtons(bool button);
TechDraw::DrawViewPart* getBaseFeat();
TechDraw::DrawViewDetail* getDetailFeat();
public Q_SLOTS:
void onDraggerClicked(bool clicked);
void onHighlightMoved(QPointF dragEnd);
@@ -93,8 +96,6 @@ protected:
void restoreDetailState();
QPointF getAnchorScene();
TechDraw::DrawViewPart* getBaseFeat();
TechDraw::DrawViewDetail* getDetailFeat();
private:
std::unique_ptr<Ui_TaskDetail> ui;
@@ -152,6 +153,8 @@ public:
void modifyStandardButtons(QDialogButtonBox* box) override;
std::string getDetailName() const;
private:
TaskDetail * widget;
Gui::TaskView::TaskBox* taskbox;

View File

@@ -365,12 +365,28 @@ void ViewProviderViewPart::handleChangedPropertyType(Base::XMLReader &reader, co
bool ViewProviderViewPart::onDelete(const std::vector<std::string> & subNames)
{
// Base::Console().message("VPVP::onDelete(%d subNames)\n", subNames.size());
// we cannot delete if the view has a section or detail view
(void) subNames;
QString bodyMessage;
QTextStream bodyMessageStream(&bodyMessage);
// this code should be in a ViewProviderDetail if we had one. Since we do not, we have to deal
// with a derived class here in the parent
Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog();
auto* dlgDetail = dynamic_cast<TaskDlgDetail*>(dlg);
if (dlgDetail) {
std::string dlgDetailTarget = dlgDetail->getDetailName(); //new method
if (getViewObject()->getNameInDocument() == dlgDetailTarget) {
bodyMessageStream << qApp->translate("Std_Delete",
"Close open dialog before deleting detail object");
bodyMessage = bodyMessageStream.readLine();
QMessageBox::warning(Gui::getMainWindow(),
qApp->translate("Std_Delete", "Object dependencies"), bodyMessage,
QMessageBox::Ok);
return false;
}
}
// get child views
auto viewSection = getViewObject()->getSectionRefs();
auto viewDetail = getViewObject()->getDetailRefs();
@@ -378,6 +394,7 @@ bool ViewProviderViewPart::onDelete(const std::vector<std::string> & subNames)
if (!viewSection.empty() || !viewDetail.empty()) {
bodyMessageStream << qApp->translate("Std_Delete",
"You cannot delete this view because it has one or more dependent views that would become broken.");
bodyMessage = bodyMessageStream.readLine();
QMessageBox::warning(Gui::getMainWindow(),
qApp->translate("Std_Delete", "Object dependencies"), bodyMessage,
QMessageBox::Ok);