PartDesign/Gui: start to unify view providers code
- Moved all common code for part design features view providers to a base class. - Move shared code for Sketch based features to newly created ViewProviderSketchBased class - Add ViewProviderSketchBased to initialization - Make Pad and Pocket ViewProviders to use the shared code - Minor fixes to TaskFeatureParameters and some derived classes
This commit is contained in:
committed by
Stefan Tröger
parent
6266d514d3
commit
5ee0cea467
@@ -24,26 +24,28 @@
|
||||
#include "PreCompiled.h"
|
||||
|
||||
#ifndef _PreComp_
|
||||
# include <QMessageBox>
|
||||
#endif
|
||||
|
||||
#include "ViewProvider.h"
|
||||
#include "Workbench.h"
|
||||
#include <Mod/PartDesign/App/Body.h>
|
||||
#include <Mod/Part/App/PropertyTopoShape.h>
|
||||
#include <Gui/Command.h>
|
||||
#include <Gui/MDIView.h>
|
||||
#include <Gui/Control.h>
|
||||
#include <Gui/Application.h>
|
||||
#include <Base/Exception.h>
|
||||
#include <Mod/PartDesign/App/Body.h>
|
||||
#include <Mod/PartDesign/App/Feature.h>
|
||||
|
||||
#include "TaskFeatureParameters.h"
|
||||
|
||||
#include "ViewProvider.h"
|
||||
|
||||
using namespace PartDesignGui;
|
||||
|
||||
PROPERTY_SOURCE(PartDesignGui::ViewProvider,PartGui::ViewProviderPart)
|
||||
PROPERTY_SOURCE(PartDesignGui::ViewProvider, PartGui::ViewProviderPart)
|
||||
|
||||
ViewProvider::ViewProvider()
|
||||
:oldWb(""), oldTip(NULL)
|
||||
{
|
||||
oldWb = "";
|
||||
oldTip = NULL;
|
||||
}
|
||||
|
||||
ViewProvider::~ViewProvider()
|
||||
@@ -51,12 +53,13 @@ ViewProvider::~ViewProvider()
|
||||
}
|
||||
|
||||
bool ViewProvider::doubleClicked(void)
|
||||
{
|
||||
PartDesign::Body* activeBody = Gui::Application::Instance->activeView()->getActiveObject<PartDesign::Body*>(PDBODYKEY);
|
||||
if (activeBody != NULL) {
|
||||
{
|
||||
PartDesign::Body* body = PartDesign::Body::findBodyOf(getObject());
|
||||
|
||||
if (body != NULL) {
|
||||
// Drop into insert mode so that the user doesn't see all the geometry that comes later in the tree
|
||||
// Also, this way the user won't be tempted to use future geometry as external references for the sketch
|
||||
oldTip = activeBody->Tip.getValue();
|
||||
oldTip = body->Tip.getValue();
|
||||
if (oldTip != this->pcObject)
|
||||
Gui::Command::doCommand(Gui::Command::Gui,"FreeCADGui.runCommand('PartDesign_MoveTip')");
|
||||
else
|
||||
@@ -69,7 +72,8 @@ bool ViewProvider::doubleClicked(void)
|
||||
std::string Msg("Edit ");
|
||||
Msg += this->pcObject->Label.getValue();
|
||||
Gui::Command::openCommand(Msg.c_str());
|
||||
Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().setEdit('%s',0)",this->pcObject->getNameInDocument());
|
||||
Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().setEdit('%s',0)",
|
||||
this->pcObject->getNameInDocument());
|
||||
}
|
||||
catch (const Base::Exception&) {
|
||||
Gui::Command::abortCommand();
|
||||
@@ -77,6 +81,56 @@ bool ViewProvider::doubleClicked(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ViewProvider::setEdit(int ModNum)
|
||||
{
|
||||
if (ModNum == ViewProvider::Default ) {
|
||||
// When double-clicking on the item for this feature the
|
||||
// object unsets and sets its edit mode without closing
|
||||
// the task panel
|
||||
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) {
|
||||
featureDlg = 0; // another feature left open its task panel
|
||||
}
|
||||
if (dlg && !featureDlg) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(QObject::tr("A dialog is already open in the task panel"));
|
||||
msgBox.setInformativeText(QObject::tr("Do you want to close this dialog?"));
|
||||
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
|
||||
msgBox.setDefaultButton(QMessageBox::Yes);
|
||||
int ret = msgBox.exec();
|
||||
if (ret == QMessageBox::Yes) {
|
||||
Gui::Control().reject();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// clear the selection (convenience)
|
||||
Gui::Selection().clearSelection();
|
||||
|
||||
// always change to PartDesign WB, remember where we come from
|
||||
oldWb = Gui::Command::assureWorkbench("PartDesignWorkbench");
|
||||
|
||||
// start the edit dialog
|
||||
if (featureDlg) {
|
||||
Gui::Control().showDialog(featureDlg);
|
||||
} else {
|
||||
Gui::Control().showDialog(this->getEditDialog());
|
||||
}
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return PartGui::ViewProviderPart::setEdit(ModNum);
|
||||
}
|
||||
}
|
||||
|
||||
TaskDlgFeatureParameters *ViewProvider::getEditDialog()
|
||||
{
|
||||
throw Base::Exception("getEditDialog() not implemented");
|
||||
}
|
||||
|
||||
void ViewProvider::unsetEdit(int ModNum)
|
||||
{
|
||||
// return to the WB we were in before editing the PartDesign feature
|
||||
@@ -102,7 +156,8 @@ void ViewProvider::unsetEdit(int ModNum)
|
||||
|
||||
void ViewProvider::updateData(const App::Property* prop)
|
||||
{
|
||||
if (prop->getTypeId() == Part::PropertyPartShape::getClassTypeId() &&
|
||||
// TODO What's that? (2015-07-24, Fat-Zer)
|
||||
if (prop->getTypeId() == Part::PropertyPartShape::getClassTypeId() &&
|
||||
strcmp(prop->getName(),"AddSubShape") == 0) {
|
||||
return;
|
||||
}
|
||||
@@ -112,19 +167,32 @@ void ViewProvider::updateData(const App::Property* prop)
|
||||
|
||||
bool ViewProvider::onDelete(const std::vector<std::string> &)
|
||||
{
|
||||
// Body feature housekeeping
|
||||
Part::BodyBase* body = Part::BodyBase::findBodyOf(getObject());
|
||||
if (body != NULL) {
|
||||
body->removeFeature(getObject());
|
||||
// Make the new Tip and the previous solid feature visible again
|
||||
App::DocumentObject* tip = body->Tip.getValue();
|
||||
App::DocumentObject* prev = body->getPrevSolidFeature();
|
||||
if (tip != NULL) {
|
||||
Gui::Application::Instance->getViewProvider(tip)->show();
|
||||
if ((tip != prev) && (prev != NULL))
|
||||
Gui::Application::Instance->getViewProvider(prev)->show();
|
||||
}
|
||||
App::DocumentObject* previous;
|
||||
PartDesign::Feature* feature = static_cast<PartDesign::Feature*>(getObject());
|
||||
|
||||
try {
|
||||
previous = feature->getBaseObject();
|
||||
} catch (const Base::Exception &ex) {
|
||||
previous = 0;
|
||||
}
|
||||
|
||||
// Make the tip or the previous feature visiable again with preference to the previous one
|
||||
// if the feature was visiable itself
|
||||
if (isShow()) {
|
||||
// TODO TaskDlgFeatureParameters::reject has the same code. May be this one is excess?
|
||||
// (2015-07-24, Fat-Zer)
|
||||
if (previous && Gui::Application::Instance->getViewProvider(previous)) {
|
||||
Gui::Application::Instance->getViewProvider(previous)->show();
|
||||
} else {
|
||||
// Body feature housekeeping
|
||||
Part::BodyBase* body = PartDesign::Body::findBodyOf(getObject());
|
||||
if (body != NULL) {
|
||||
App::DocumentObject* tip = body->Tip.getValue();
|
||||
if (tip && Gui::Application::Instance->getViewProvider(tip)) {
|
||||
Gui::Application::Instance->getViewProvider(tip)->show();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user