Skip to content

Commit

Permalink
MeasureGui: Avoid adding measurement to document during command inter…
Browse files Browse the repository at this point in the history
…action

format
  • Loading branch information
hlorus committed Jul 5, 2024
1 parent e583947 commit 94d101d
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 7 deletions.
78 changes: 71 additions & 7 deletions src/Gui/TaskMeasure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
#include "App/Document.h"
#include "App/DocumentObjectGroup.h"
#include <Gui/BitmapFactory.h>
#include <Gui/Document.h>
#include <Gui/ViewProviderDocumentObject.h>

#include <QFormLayout>
#include <QPushButton>
Expand Down Expand Up @@ -149,6 +151,59 @@ void TaskMeasure::setMeasureObject(Measure::MeasureBase* obj) {
}


App::DocumentObject* TaskMeasure::createObject(const std::string& measureClass) {
auto type = Base::Type::getTypeIfDerivedFrom(measureClass.c_str(),
App::DocumentObject::getClassTypeId(),
true);

if (type.isBad()) {
return nullptr;
}

auto measureObj = static_cast<App::DocumentObject*>(type.createInstance());
return measureObj;
}


Gui::ViewProviderDocumentObject* TaskMeasure::createViewObject(App::DocumentObject* measureObj) {
// Add view object
auto guiDoc = Gui::Application::Instance->activeDocument();
auto vpName = measureObj->getViewProviderName();
if ((vpName == nullptr) || (vpName[0] == '\0')) {
return nullptr;
}

auto vpType =
Base::Type::getTypeIfDerivedFrom(vpName,
Gui::ViewProviderDocumentObject::getClassTypeId(),
true);
if (vpType.isBad()) {
return nullptr;
}

auto vp = static_cast<Gui::ViewProviderDocumentObject*>(vpType.createInstance());

guiDoc->setAnnotationViewProvider(vp->getTypeId().getName(), vp);
vp->attach(measureObj);
vp->updateView();
vp->setActiveMode();

return vp;
}


void TaskMeasure::saveObject() {
if (_mViewObject) {
auto guiDoc = Gui::Application::Instance->activeDocument();
guiDoc->removeAnnotationViewProvider(_mViewObject->getTypeId().getName());
_mViewObject = nullptr;
}

App::Document* appDoc = App::GetApplication().getActiveDocument();
appDoc->addObject(_mMeasureObject, _mMeasureType->label.c_str());
}


void TaskMeasure::update() {
App::Document *doc = App::GetApplication().getActiveDocument();

Expand Down Expand Up @@ -183,14 +238,13 @@ void TaskMeasure::update() {
if (measureTypes.size() > 0) {
_mMeasureType = measureTypes.front();
}



if (!_mMeasureType) {

// Note: If there's no valid measure type we might just restart the selection,
// however this requires enough coverage of measuretypes that we can access all of them

// std::tuple<std::string, std::string> sel = selection.back();
// clearSelection();
// addElement(measureModule.c_str(), get<0>(sel).c_str(), get<1>(sel).c_str());
Expand Down Expand Up @@ -227,7 +281,7 @@ void TaskMeasure::update() {
else {
// Create measure object
setMeasureObject(
(Measure::MeasureBase*)doc->addObject(_mMeasureType->measureObject.c_str(), _mMeasureType->label.c_str())
(Measure::MeasureBase*)createObject(_mMeasureType->measureObject)
);
}
}
Expand All @@ -240,6 +294,8 @@ void TaskMeasure::update() {

// Get result
valueResult->setText(_mMeasureObject->getResultString());

_mViewObject = createViewObject(_mMeasureObject);
}

void TaskMeasure::close(){
Expand Down Expand Up @@ -272,6 +328,7 @@ void TaskMeasure::invoke() {
}

bool TaskMeasure::apply(){
saveObject();
ensureGroup(_mMeasureObject);
_mMeasureType = nullptr;
_mMeasureObject = nullptr;
Expand All @@ -297,7 +354,7 @@ void TaskMeasure::reset() {
_mMeasureType = nullptr;
this->clearSelection();

// Should the explicit mode also be reset?
// Should the explicit mode also be reset?
// setModeSilent(nullptr);
// explicitMode = false;

Expand All @@ -312,7 +369,14 @@ void TaskMeasure::removeObject() {
if (_mMeasureObject->isRemoving() ) {
return;
}
_mMeasureObject->getDocument()->removeObject (_mMeasureObject->getNameInDocument());

if (_mViewObject) {
auto guiDoc = Gui::Application::Instance->activeDocument();
guiDoc->removeAnnotationViewProvider(_mViewObject->getTypeId().getName());
_mViewObject = nullptr;
}

delete _mMeasureObject;
setMeasureObject(nullptr);
}

Expand All @@ -331,7 +395,7 @@ void TaskMeasure::onSelectionChanged(const Gui::SelectionChanges& msg)
&& msg.Type != SelectionChanges::SetSelection && msg.Type != SelectionChanges::ClrSelection) {

return;
}
}

update();
}
Expand Down Expand Up @@ -368,7 +432,7 @@ void TaskMeasure::onModeChanged(int index) {

void TaskMeasure::setModeSilent(App::MeasureType* mode) {
modeSwitch->blockSignals(true);

if (mode == nullptr) {
modeSwitch->setCurrentIndex(0);
}
Expand Down
5 changes: 5 additions & 0 deletions src/Gui/TaskMeasure.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class TaskMeasure : public TaskView::TaskDialog, public Gui::SelectionObserver {

App::MeasureType* _mMeasureType = nullptr;
Measure::MeasureBase *_mMeasureObject = nullptr;
Gui::ViewProviderDocumentObject* _mViewObject = nullptr;

QLineEdit* valueResult{nullptr};
QComboBox* modeSwitch{nullptr};
Expand All @@ -73,6 +74,10 @@ class TaskMeasure : public TaskView::TaskDialog, public Gui::SelectionObserver {
void setModeSilent(App::MeasureType* mode);
App::MeasureType* getMeasureType();
void enableAnnotateButton(bool state);
App::DocumentObject* createObject(const std::string& measureClass);
Gui::ViewProviderDocumentObject* createViewObject(App::DocumentObject* measureObj);
void saveObject();


// List of measure types
std::vector<App::DocumentObject> measureObjects;
Expand Down

0 comments on commit 94d101d

Please sign in to comment.