From 1bda913cacbba868d22843c2e5080f754307f414 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 5 Jun 2022 13:03:47 +0800 Subject: [PATCH] Gui: allow apply 'Create origin' option to existing objects Added button 'Apply to existing objects' in 'Preferences -> General -> Objects' Related #436 @roberto-di-paolo --- src/Gui/DlgSettingsObjects.cpp | 50 ++++++++++++++++++++------ src/Gui/DlgSettingsObjects.h | 2 ++ src/Gui/DlgSettingsObjects.py | 64 ++++++++++++++++++++++++++++++++-- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/src/Gui/DlgSettingsObjects.cpp b/src/Gui/DlgSettingsObjects.cpp index 67f518e6224c..24e439daaef3 100644 --- a/src/Gui/DlgSettingsObjects.cpp +++ b/src/Gui/DlgSettingsObjects.cpp @@ -36,8 +36,11 @@ DlgSettingsObjects.define() # include # include #endif -#include #include +#include +#include +#include +#include // Auto generated code (Tools/params_utils.py:490) #include "DlgSettingsObjects.h" using namespace Gui::Dialog; @@ -81,9 +84,35 @@ DlgSettingsObjects::DlgSettingsObjects(QWidget* parent) ExportChildren->setParamGrpPath("Group"); // Auto generated code (Tools/params_utils.py:349) + // Auto generated code (Gui/DlgSettingsObjects.py:60) CreateOrigin = new Gui::PrefCheckBox(this); - layoutGroupobjects->addWidget(CreateOrigin, 3, 0); - CreateOrigin->setChecked(App::GroupParams::defaultCreateOrigin()); + buttonCreateOrigin = new QPushButton(this); + { + auto layoutHoriz = new QHBoxLayout(); + layoutHoriz->addWidget(CreateOrigin); + layoutHoriz->addWidget(buttonCreateOrigin); + layoutGroupobjects->addLayout(layoutHoriz, 3, 0); + } + buttonCreateOrigin->setEnabled(CreateOrigin->isChecked()); + connect(CreateOrigin, SIGNAL(toggled(bool)), buttonCreateOrigin, SLOT(setEnabled(bool))); + + // Auto generated code (Gui/DlgSettingsObjects.py:73) + QObject::connect(buttonCreateOrigin, &QPushButton::clicked, []() { + for (auto doc : App::GetApplication().getDocuments()) { + if (doc->testStatus(App::Document::TempDoc) + || doc->testStatus(App::Document::PartialDoc)) + continue; + App::GetApplication().setActiveDocument(doc); + App::AutoTransaction guard("Init origins"); + // getObjects() below returns a const reference, so we must copy + // objects here in order to iterate it safely while adding objects + auto objs = doc->getObjects(); + for (auto obj : objs) { + if (auto origin = Base::freecad_dynamic_cast(obj)) + origin->getX(); // make sure all origin features are created + } + } + }); CreateOrigin->setEntryName("CreateOrigin"); CreateOrigin->setParamGrpPath("Group"); @@ -99,13 +128,12 @@ DlgSettingsObjects::DlgSettingsObjects(QWidget* parent) } -#include "DlgSettingsObjects.h" -// Auto generated code (Tools/params_utils.py:510) +// Auto generated code (Tools/params_utils.py:509) DlgSettingsObjects::~DlgSettingsObjects() { } -// Auto generated code (Tools/params_utils.py:516) +// Auto generated code (Tools/params_utils.py:515) void DlgSettingsObjects::saveSettings() { // Auto generated code (Tools/params_utils.py:381) @@ -116,7 +144,7 @@ void DlgSettingsObjects::saveSettings() GeoGroupAllowCrossLink->onSave(); } -// Auto generated code (Tools/params_utils.py:523) +// Auto generated code (Tools/params_utils.py:522) void DlgSettingsObjects::loadSettings() { // Auto generated code (Tools/params_utils.py:371) @@ -127,7 +155,7 @@ void DlgSettingsObjects::loadSettings() GeoGroupAllowCrossLink->onRestore(); } -// Auto generated code (Tools/params_utils.py:530) +// Auto generated code (Tools/params_utils.py:529) void DlgSettingsObjects::retranslateUi() { setWindowTitle(QObject::tr("Objects")); @@ -140,11 +168,13 @@ void DlgSettingsObjects::retranslateUi() ExportChildren->setText(QObject::tr("Export children by visibility")); CreateOrigin->setToolTip(QApplication::translate("GroupParams", App::GroupParams::docCreateOrigin())); CreateOrigin->setText(QObject::tr("Always create origin features in origin group")); + // Auto generated code (Gui/DlgSettingsObjects.py:94) + buttonCreateOrigin->setText(tr("Apply to existing objects")); GeoGroupAllowCrossLink->setToolTip(QApplication::translate("GroupParams", App::GroupParams::docGeoGroupAllowCrossLink())); GeoGroupAllowCrossLink->setText(QObject::tr("Allow cross coordinate links in GeoFeatureGroup (App::Part)")); } -// Auto generated code (Tools/params_utils.py:543) +// Auto generated code (Tools/params_utils.py:542) void DlgSettingsObjects::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { @@ -153,6 +183,6 @@ void DlgSettingsObjects::changeEvent(QEvent *e) QWidget::changeEvent(e); } -// Auto generated code (Tools/params_utils.py:554) +// Auto generated code (Tools/params_utils.py:553) #include "moc_DlgSettingsObjects.cpp" //[[[end]]] diff --git a/src/Gui/DlgSettingsObjects.h b/src/Gui/DlgSettingsObjects.h index a2bee28173b5..43c78fcdf6b0 100644 --- a/src/Gui/DlgSettingsObjects.h +++ b/src/Gui/DlgSettingsObjects.h @@ -74,6 +74,8 @@ class DlgSettingsObjects : public Gui::Dialog::PreferencePage Gui::PrefCheckBox *KeepHiddenChildren = nullptr; Gui::PrefCheckBox *ExportChildren = nullptr; Gui::PrefCheckBox *CreateOrigin = nullptr; + // Auto generated code (Gui/DlgSettingsObjects.py:55) + QPushButton *buttonCreateOrigin = nullptr; Gui::PrefCheckBox *GeoGroupAllowCrossLink = nullptr; // Auto generated code (Tools/params_utils.py:449) }; diff --git a/src/Gui/DlgSettingsObjects.py b/src/Gui/DlgSettingsObjects.py index 27d6ede1e65e..b2f4eb669e7c 100644 --- a/src/Gui/DlgSettingsObjects.py +++ b/src/Gui/DlgSettingsObjects.py @@ -21,14 +21,14 @@ # *************************************************************************** '''Auto code generator for preference page of General/Objects ''' -import sys +import cog, sys from os import sys, path # import Tools/params_utils.py sys.path.append(path.join(path.dirname(path.dirname(path.abspath(__file__))), 'Tools')) import params_utils -from params_utils import ParamBool, ParamInt, ParamString, ParamUInt, ParamFloat +from params_utils import ParamProxy, auto_comment sys.path.append(path.join(path.dirname(path.dirname(path.abspath(__file__))), 'App')) import GroupParams @@ -37,6 +37,66 @@ NameSpace = 'Gui' ClassName = 'DlgSettingsObjects' ClassDoc = 'Preference dialog for various document objects related settings' + +_GroupParams = { param.name : param for param in GroupParams.Params } + +class ParamCreateOrigin(ParamProxy): + def __init__(self, param): + super().__init__() + param.proxy = self + param.header_file = ['App/Application.h', + 'App/Document.h', + 'App/Origin.h', + 'App/AutoTransaction.h'] + + def declare_widget(self, param): + super().declare_widget(param) + cog.out(f''' + {auto_comment()} + QPushButton *button{param.widget_name} = nullptr;''') + + def init_widget(self, param, row, group_name): + cog.out(f''' + {auto_comment()} + {param.widget_name} = new {param.widget_type}(this); + button{param.widget_name} = new QPushButton(this); + {{ + auto layoutHoriz = new QHBoxLayout(); + layoutHoriz->addWidget({param.widget_name}); + layoutHoriz->addWidget(button{param.widget_name}); + layout{group_name}->addLayout(layoutHoriz, {row}, 0); + }} + button{param.widget_name}->setEnabled({param.widget_name}->isChecked()); + connect({param.widget_name}, SIGNAL(toggled(bool)), button{param.widget_name}, SLOT(setEnabled(bool))); +''') + cog.out(f''' + {auto_comment()} + QObject::connect(button{param.widget_name}, &QPushButton::clicked, []() {{ + for (auto doc : App::GetApplication().getDocuments()) {{ + if (doc->testStatus(App::Document::TempDoc) + || doc->testStatus(App::Document::PartialDoc)) + continue; + App::GetApplication().setActiveDocument(doc); + App::AutoTransaction guard("Init origins"); + // getObjects() below returns a const reference, so we must copy + // objects here in order to iterate it safely while adding objects + auto objs = doc->getObjects(); + for (auto obj : objs) {{ + if (auto origin = Base::freecad_dynamic_cast(obj)) + origin->getX(); // make sure all origin features are created + }} + }} + }});''') + + def retranslate(self, param): + super().retranslate(param) + cog.out(f''' + {auto_comment()} + button{param.widget_name}->setText(tr("Apply to existing objects"));''') + + +ParamCreateOrigin(_GroupParams['CreateOrigin']) + ParamGroup = ( ('Group objects', GroupParams.Params), )