PD: Replace helper functions in subclasses of TaskDlgFeatureParameters with a template function

This commit is contained in:
wmayer
2024-07-18 00:02:07 +02:00
parent 01d1e2b374
commit b1029bc682
21 changed files with 107 additions and 97 deletions

View File

@@ -340,20 +340,12 @@ TaskDlgChamferParameters::~TaskDlgChamferParameters() = default;
//==== calls from the TaskView ===============================================================
//void TaskDlgChamferParameters::open()
//{
// // a transaction is already open at creation time of the chamfer
// if (!Gui::Command::hasPendingCommand()) {
// QString msg = tr("Edit chamfer");
// Gui::Command::openCommand((const char*)msg.toUtf8());
// }
//}
bool TaskDlgChamferParameters::accept()
{
auto obj = vp->getObject();
if (!obj->isError())
auto obj = getObject();
if (!obj->isError()) {
parameter->showObject();
}
parameter->apply();

View File

@@ -302,9 +302,10 @@ TaskDlgDraftParameters::~TaskDlgDraftParameters() = default;
bool TaskDlgDraftParameters::accept()
{
auto tobj = vp->getObject();
if (!tobj->isError())
auto tobj = getObject();
if (!tobj->isError()) {
parameter->showObject();
}
parameter->apply();

View File

@@ -456,10 +456,10 @@ TaskDlgDressUpParameters::~TaskDlgDressUpParameters() = default;
bool TaskDlgDressUpParameters::accept()
{
getDressUpView()->highlightReferences(false);
getViewObject<ViewProviderDressUp>()->highlightReferences(false);
std::vector<std::string> refs = parameter->getReferences();
std::stringstream str;
str << Gui::Command::getObjectCmd(vp->getObject()) << ".Base = ("
str << Gui::Command::getObjectCmd(getObject()) << ".Base = ("
<< Gui::Command::getObjectCmd(parameter->getBase()) << ",[";
for (const auto & ref : refs)
str << "\"" << ref << "\",";
@@ -470,7 +470,7 @@ bool TaskDlgDressUpParameters::accept()
bool TaskDlgDressUpParameters::reject()
{
getDressUpView()->highlightReferences(false);
getViewObject<ViewProviderDressUp>()->highlightReferences(false);
return TaskDlgFeatureParameters::reject();
}

View File

@@ -113,9 +113,6 @@ public:
explicit TaskDlgDressUpParameters(ViewProviderDressUp *DressUpView);
~TaskDlgDressUpParameters() override;
ViewProviderDressUp* getDressUpView() const
{ return static_cast<ViewProviderDressUp*>(vp); }
public:
/// is called by the framework if the dialog is accepted (Ok)
bool accept() override;

View File

@@ -59,6 +59,34 @@ private:
void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) override;
protected:
template<typename T = PartDesignGui::ViewProvider> T* getViewObject() const
{
static_assert(std::is_base_of<PartDesignGui::ViewProvider, T>::value,
"Wrong template argument");
return dynamic_cast<T*>(vp);
}
template<typename T = App::DocumentObject> T* getObject() const
{
static_assert(std::is_base_of<App::DocumentObject, T>::value, "Wrong template argument");
if (vp) {
return dynamic_cast<T*>(vp->getObject());
}
return nullptr;
}
Gui::Document* getGuiDocument() const
{
return vp ? vp->getDocument() : nullptr;
}
App::Document* getAppDocument() const
{
auto obj = getObject();
return obj ? obj->getDocument() : nullptr;
}
bool isUpdateBlocked() const
{
return blockUpdate;
@@ -98,11 +126,25 @@ public:
/// is called by the framework if the dialog is rejected (Cancel)
bool reject() override;
/// Returns the view provider dialog is runed for
PartDesignGui::ViewProvider *viewProvider() const { return vp; }
template<typename T = PartDesignGui::ViewProvider> T* getViewObject() const
{
static_assert(std::is_base_of<PartDesignGui::ViewProvider, T>::value,
"Wrong template argument");
return dynamic_cast<T*>(vp);
}
protected:
PartDesignGui::ViewProvider *vp;
template<typename T = App::DocumentObject> T* getObject() const
{
static_assert(std::is_base_of<App::DocumentObject, T>::value, "Wrong template argument");
if (vp) {
return dynamic_cast<T*>(vp->getObject());
}
return nullptr;
}
private:
PartDesignGui::ViewProvider* vp;
};
} //namespace PartDesignGui

View File

@@ -209,20 +209,12 @@ TaskDlgFilletParameters::~TaskDlgFilletParameters() = default;
//==== calls from the TaskView ===============================================================
//void TaskDlgFilletParameters::open()
//{
// // a transaction is already open at creation time of the fillet
// if (!Gui::Command::hasPendingCommand()) {
// QString msg = tr("Edit fillet");
// Gui::Command::openCommand((const char*)msg.toUtf8());
// }
//}
bool TaskDlgFilletParameters::accept()
{
auto obj = vp->getObject();
if (!obj->isError())
auto obj = getObject();
if (!obj->isError()) {
parameter->showObject();
}
parameter->apply();

View File

@@ -134,9 +134,6 @@ class TaskDlgHelixParameters : public TaskDlgSketchBasedParameters
public:
explicit TaskDlgHelixParameters(ViewProviderHelix* HelixView);
ViewProviderHelix* getHelixView() const
{ return static_cast<ViewProviderHelix*>(vp); }
};
} //namespace PartDesignGui

View File

@@ -1185,7 +1185,7 @@ TaskDlgHoleParameters::TaskDlgHoleParameters(ViewProviderHole* HoleView)
: TaskDlgSketchBasedParameters(HoleView)
{
assert(HoleView);
parameter = new TaskHoleParameters(static_cast<ViewProviderHole*>(vp));
parameter = new TaskHoleParameters(HoleView);
Content.push_back(parameter);
}

View File

@@ -146,8 +146,6 @@ public:
explicit TaskDlgHoleParameters(ViewProviderHole *HoleView);
~TaskDlgHoleParameters() override;
ViewProviderHole* getHoleView() const { return static_cast<ViewProviderHole*>(vp); }
protected:
TaskHoleParameters *parameter;
};

View File

@@ -375,17 +375,18 @@ TaskDlgLoftParameters::~TaskDlgLoftParameters() = default;
bool TaskDlgLoftParameters::accept()
{
PartDesign::Loft* pcLoft = static_cast<PartDesign::Loft*>(vp->getObject());
static_cast<ViewProviderLoft*>(vp)->highlightReferences(ViewProviderLoft::Both, false);
if (auto loft = getObject<PartDesign::Loft>()) {
getViewObject<ViewProviderLoft>()->highlightReferences(ViewProviderLoft::Both, false);
// First verify that the loft can be built and then hide the sections as otherwise
// they will remain hidden if the loft's recompute fails
if (TaskDlgSketchBasedParameters::accept()) {
for (App::DocumentObject* obj : pcLoft->Sections.getValues()) {
Gui::cmdAppObjectHide(obj);
// First verify that the loft can be built and then hide the sections as otherwise
// they will remain hidden if the loft's recompute fails
if (TaskDlgSketchBasedParameters::accept()) {
for (App::DocumentObject* obj : loft->Sections.getValues()) {
Gui::cmdAppObjectHide(obj);
}
return true;
}
return true;
}
return false;

View File

@@ -87,9 +87,6 @@ public:
explicit TaskDlgLoftParameters(ViewProviderLoft *LoftView,bool newObj=false);
~TaskDlgLoftParameters() override;
ViewProviderLoft* getLoftView() const
{ return static_cast<ViewProviderLoft*>(vp); }
/// is called by the framework if the dialog is accepted (Ok)
bool accept() override;

View File

@@ -62,10 +62,11 @@ class TaskDlgPadParameters : public TaskDlgExtrudeParameters
public:
explicit TaskDlgPadParameters(ViewProviderPad *PadView, bool newObj=false);
ViewProviderPad* getPadView() const { return static_cast<ViewProviderPad*>(vp); }
protected:
TaskExtrudeParameters* getTaskParameters() override { return parameters; };
TaskExtrudeParameters* getTaskParameters() override
{
return parameters;
}
private:
TaskPadParameters* parameters;

View File

@@ -1097,21 +1097,21 @@ void TaskDlgPipeParameters::onButtonToggled(QAbstractButton *button, bool checke
switch (id) {
case StateHandlerTaskPipe::SelectionModes::refProfile:
static_cast<ViewProviderPipe*>(vp)->highlightReferences(ViewProviderPipe::Profile, checked);
getViewObject<ViewProviderPipe>()->highlightReferences(ViewProviderPipe::Profile, checked);
break;
case StateHandlerTaskPipe::SelectionModes::refSpine:
case StateHandlerTaskPipe::SelectionModes::refSpineEdgeAdd:
case StateHandlerTaskPipe::SelectionModes::refSpineEdgeRemove:
static_cast<ViewProviderPipe*>(vp)->highlightReferences(ViewProviderPipe::Spine, checked);
getViewObject<ViewProviderPipe>()->highlightReferences(ViewProviderPipe::Spine, checked);
break;
case StateHandlerTaskPipe::SelectionModes::refAuxSpine:
case StateHandlerTaskPipe::SelectionModes::refAuxSpineEdgeAdd:
case StateHandlerTaskPipe::SelectionModes::refAuxSpineEdgeRemove:
static_cast<ViewProviderPipe*>(vp)->highlightReferences(ViewProviderPipe::AuxiliarySpine, checked);
getViewObject<ViewProviderPipe>()->highlightReferences(ViewProviderPipe::AuxiliarySpine, checked);
break;
case StateHandlerTaskPipe::SelectionModes::refSectionAdd:
case StateHandlerTaskPipe::SelectionModes::refSectionRemove:
static_cast<ViewProviderPipe*>(vp)->highlightReferences(ViewProviderPipe::Section, checked);
getViewObject<ViewProviderPipe>()->highlightReferences(ViewProviderPipe::Section, checked);
break;
default:
break;

View File

@@ -65,11 +65,11 @@ class TaskDlgPocketParameters : public TaskDlgExtrudeParameters
public:
explicit TaskDlgPocketParameters(ViewProviderPocket *PocketView);
ViewProviderPocket* getPocketView() const
{ return static_cast<ViewProviderPocket*>(vp); }
protected:
TaskExtrudeParameters* getTaskParameters() override { return parameters; }
TaskExtrudeParameters* getTaskParameters() override
{
return parameters;
}
private:
TaskPocketParameters* parameters;

View File

@@ -122,11 +122,6 @@ class TaskDlgRevolutionParameters : public TaskDlgSketchBasedParameters
public:
explicit TaskDlgRevolutionParameters(PartDesignGui::ViewProvider *RevolutionView);
ViewProvider* getRevolutionView() const
{
return vp;
}
};
} //namespace PartDesignGui

View File

@@ -250,19 +250,20 @@ TaskDlgSketchBasedParameters::~TaskDlgSketchBasedParameters() = default;
//==== calls from the TaskView ===============================================================
bool TaskDlgSketchBasedParameters::accept() {
App::DocumentObject* feature = vp->getObject();
bool TaskDlgSketchBasedParameters::accept()
{
auto feature = getObject<PartDesign::ProfileBased>();
// Make sure the feature is what we are expecting
// Should be fine but you never know...
if (!feature->isDerivedFrom<PartDesign::ProfileBased>()) {
if (!feature) {
throw Base::TypeError("Bad object processed in the sketch based dialog.");
}
// First verify that the feature can be built and then hide the profile as otherwise
// it will remain hidden if the feature's recompute fails
if (TaskDlgFeatureParameters::accept()) {
App::DocumentObject* sketch = static_cast<PartDesign::ProfileBased*>(feature)->Profile.getValue();
App::DocumentObject* sketch = feature->Profile.getValue();
Gui::cmdAppObjectHide(sketch);
return true;
}
@@ -272,24 +273,29 @@ bool TaskDlgSketchBasedParameters::accept() {
bool TaskDlgSketchBasedParameters::reject()
{
PartDesign::ProfileBased* pcSketchBased = static_cast<PartDesign::ProfileBased*>(vp->getObject());
App::DocumentObjectWeakPtrT weakptr(pcSketchBased);
// get the Sketch
Sketcher::SketchObject *pcSketch = static_cast<Sketcher::SketchObject*>(pcSketchBased->Profile.getValue());
bool rv;
auto feature = getObject<PartDesign::ProfileBased>();
// rv should be true anyway but to be on the safe side due to further changes better respect it.
rv = TaskDlgFeatureParameters::reject();
// Make sure the feature is what we are expecting
// Should be fine but you never know...
if (!feature) {
throw Base::TypeError("Bad object processed in the sketch based dialog.");
}
App::DocumentObjectWeakPtrT weakptr(feature);
auto sketch = dynamic_cast<Sketcher::SketchObject*>(feature->Profile.getValue());
bool value = TaskDlgFeatureParameters::reject();
// if abort command deleted the object the sketch is visible again.
// The previous one feature already should be made visible
if (weakptr.expired()) {
// Make the sketch visible
if (pcSketch && Gui::Application::Instance->getViewProvider(pcSketch))
Gui::Application::Instance->getViewProvider(pcSketch)->show();
if (sketch && Gui::Application::Instance->getViewProvider(sketch)) {
Gui::Application::Instance->getViewProvider(sketch)->show();
}
}
return rv;
return value;
}
#include "moc_TaskSketchBasedParameters.cpp"

View File

@@ -280,7 +280,7 @@ TaskDlgThicknessParameters::~TaskDlgThicknessParameters() = default;
bool TaskDlgThicknessParameters::accept()
{
auto obj = vp->getObject();
auto obj = getObject();
if (!obj->isError()) {
parameter->showObject();
}

View File

@@ -615,13 +615,10 @@ void TaskTransformedParameters::indexesMoved()
// TaskDialog
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TaskDlgTransformedParameters::TaskDlgTransformedParameters(
ViewProviderTransformed* TransformedView_)
: TaskDlgFeatureParameters(TransformedView_)
TaskDlgTransformedParameters::TaskDlgTransformedParameters(ViewProviderTransformed* viewProvider)
: TaskDlgFeatureParameters(viewProvider)
{
assert(vp);
message = new TaskTransformedMessages(getTransformedView());
message = new TaskTransformedMessages(viewProvider);
Content.push_back(message);
}
@@ -639,7 +636,6 @@ bool TaskDlgTransformedParameters::reject()
{
// ensure that we are not in selection mode
parameter->exitSelectionMode();
return TaskDlgFeatureParameters::reject();
}

View File

@@ -295,11 +295,6 @@ class TaskDlgTransformedParameters: public PartDesignGui::TaskDlgFeatureParamete
public:
explicit TaskDlgTransformedParameters(ViewProviderTransformed* TransformedView);
ViewProviderTransformed* getTransformedView() const
{
return static_cast<ViewProviderTransformed*>(vp);
}
/// is called by the framework if the dialog is accepted (Ok)
bool accept() override;
/// is called by the framework if the dialog is rejected (Cancel)

View File

@@ -88,7 +88,7 @@ bool ViewProvider::setEdit(int ModNum)
Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog();
TaskDlgFeatureParameters *featureDlg = qobject_cast<TaskDlgFeatureParameters *>(dlg);
// NOTE: if the dialog is not partDesigan dialog the featureDlg will be NULL
if (featureDlg && featureDlg->viewProvider() != this) {
if (featureDlg && featureDlg->getViewObject() != this) {
featureDlg = nullptr; // another feature left open its task panel
}
if (dlg && !featureDlg) {

View File

@@ -70,7 +70,7 @@ bool ViewProviderHole::setEdit(int ModNum)
// the task panel
Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog();
TaskDlgHoleParameters *holeDlg = qobject_cast<TaskDlgHoleParameters *>(dlg);
if (holeDlg && holeDlg->getHoleView() != this)
if (holeDlg && holeDlg->getViewObject() != this)
holeDlg = nullptr; // another hole left open its task panel
if (dlg && !holeDlg) {
QMessageBox msgBox;