Skip to content

Commit

Permalink
Gui: allow apply 'Create origin' option to existing objects
Browse files Browse the repository at this point in the history
Added button 'Apply to existing objects' in 'Preferences -> General ->
Objects'

Related #436
@roberto-di-paolo
  • Loading branch information
realthunder committed Jun 5, 2022
1 parent dd4f676 commit 1bda913
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 12 deletions.
50 changes: 40 additions & 10 deletions src/Gui/DlgSettingsObjects.cpp
Expand Up @@ -36,8 +36,11 @@ DlgSettingsObjects.define()
# include <QVBoxLayout>
# include <QHBoxLayout>
#endif
#include <Gui/PrefWidgets.h>
#include <App/GroupParams.h>
#include <App/Application.h>
#include <App/Document.h>
#include <App/Origin.h>
#include <App/AutoTransaction.h>
// Auto generated code (Tools/params_utils.py:490)
#include "DlgSettingsObjects.h"
using namespace Gui::Dialog;
Expand Down Expand Up @@ -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<App::Origin>(obj))
origin->getX(); // make sure all origin features are created
}
}
});
CreateOrigin->setEntryName("CreateOrigin");
CreateOrigin->setParamGrpPath("Group");

Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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"));
Expand All @@ -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) {
Expand All @@ -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]]]
2 changes: 2 additions & 0 deletions src/Gui/DlgSettingsObjects.h
Expand Up @@ -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)
};
Expand Down
64 changes: 62 additions & 2 deletions src/Gui/DlgSettingsObjects.py
Expand Up @@ -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
Expand All @@ -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<App::Origin>(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),
)
Expand Down

0 comments on commit 1bda913

Please sign in to comment.