diff --git a/src/Gui/DlgPreferences.ui b/src/Gui/DlgPreferences.ui
index aa54ee4c1f..35557edc1d 100644
--- a/src/Gui/DlgPreferences.ui
+++ b/src/Gui/DlgPreferences.ui
@@ -6,95 +6,163 @@
0
0
- 570
- 454
+ 800
+ 600
Preferences
+
+
+
true
true
-
-
- 9
-
-
- 6
-
- -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 120
+ 0
+
+
+
+
+ 128
+ 16777215
+
+
+
+ Reset All
+
+
+
+ -
+
+
+ QDialogButtonBox::Help
+
+
+
+ -
+
+
+ QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
+
+
+ Reset Tab
+
+
+
+ -
6
-
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
0
-
-
-
-
- 0
- 0
-
-
-
-
- 120
- 0
-
-
-
-
- 128
- 16777215
-
-
-
- QFrame::StyledPanel
-
-
- QFrame::Sunken
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- 96
- 96
-
-
-
- 12
-
-
- QListView::IconMode
-
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 120
+ 0
+
+
+
+
+ 128
+ 16777215
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Sunken
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+
+ 96
+ 96
+
+
+
+ 12
+
+
+ QListView::IconMode
+
+
+ Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 120
+ 40
+
+
+
+
+
+
+
+
-
- -
-
-
- QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok|QDialogButtonBox::Reset
-
-
-
-
- listBox
-
diff --git a/src/Gui/DlgPreferencesImp.cpp b/src/Gui/DlgPreferencesImp.cpp
index bd5eca34b9..f212ed93cf 100644
--- a/src/Gui/DlgPreferencesImp.cpp
+++ b/src/Gui/DlgPreferencesImp.cpp
@@ -29,6 +29,7 @@
# include
# include
# include
+# include
# include
# include
# include
@@ -73,16 +74,29 @@ DlgPreferencesImp::DlgPreferencesImp(QWidget* parent, Qt::WindowFlags fl)
invalidParameter(false), canEmbedScrollArea(true), restartRequired(false)
{
ui->setupUi(this);
+ setupConnections();
+
QFontMetrics fm(font());
int length = QtTools::horizontalAdvance(fm, longestGroupName());
ui->listBox->setFixedWidth(Base::clamp(length + 20, 108, 120));
- ui->listBox->setGridSize(QSize(108, 75));
+ ui->listBox->setGridSize(QSize(Base::clamp(length + 20, 108, 120), 75));
+
+ ui->buttonResetGroup->setFixedWidth(Base::clamp(length + 20, 108, 120));
+ ui->buttonResetGroup->setLayout(new QVBoxLayout(ui->buttonResetGroup));
+ auto ResetGroup = new QLabel(ui->buttonResetGroup);
+ ResetGroup->setAlignment(Qt::AlignCenter);
+ ResetGroup->setWordWrap(true);
+ ui->buttonResetGroup->layout()->setMargin(0);
+ ui->buttonResetGroup->layout()->addWidget(ResetGroup);
+
+ ui->buttonResetAll->setFixedWidth(Base::clamp(length + 20, 108, 120));
+
// remove unused help button
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
connect(ui->buttonBox, &QDialogButtonBox::clicked,
this, &DlgPreferencesImp::onButtonBoxClicked);
- connect(ui->buttonBox, &QDialogButtonBox::helpRequested,
+ connect(ui->buttonBox_2, &QDialogButtonBox::helpRequested,
getMainWindow(), &MainWindow::whatsThis);
connect(ui->listBox, &QListWidget::currentItemChanged,
this, &DlgPreferencesImp::changeGroup);
@@ -105,6 +119,17 @@ DlgPreferencesImp::~DlgPreferencesImp()
}
}
+void DlgPreferencesImp::setupConnections()
+{
+ connect(ui->buttonResetTab, &QToolButton::clicked,
+ this, &DlgPreferencesImp::onButtonResetTabClicked);
+ connect(ui->buttonResetGroup, &QToolButton::clicked,
+ this, &DlgPreferencesImp::onButtonResetGroupClicked);
+ connect(ui->buttonResetAll, &QToolButton::clicked,
+ this, &DlgPreferencesImp::restoreDefaults);
+}
+
+
void DlgPreferencesImp::setupPages()
{
// make sure that pages are ready to create
@@ -204,11 +229,37 @@ void DlgPreferencesImp::createPageInGroup(QTabWidget *tabWidget, const std::stri
}
}
+void DlgPreferencesImp::relabelResetButtons()
+{
+ int groupIndex = ui->listBox->currentRow();
+ QFontMetrics fm(font());
+ QString group = fm.elidedText(ui->listBox->item(groupIndex)->text(), Qt::ElideRight, ui->buttonResetGroup->width()-4);
+
+ QTabWidget* tabWidget = static_cast(ui->tabWidgetStack->currentWidget());
+ int tabIndex = tabWidget->currentIndex();
+
+ static_cast(ui->buttonResetGroup->layout()->itemAt(0)->widget())->setText(tr("Reset Group %1").arg(group));
+ ui->buttonResetTab->setText(tr("Reset Tab %1").arg(tabWidget->tabText(tabIndex)));
+}
+
+void DlgPreferencesImp::changeTab(int current)
+{
+ Q_UNUSED(current);
+
+ relabelResetButtons();
+}
+
void DlgPreferencesImp::changeGroup(QListWidgetItem *current, QListWidgetItem *previous)
{
if (!current)
current = previous;
ui->tabWidgetStack->setCurrentIndex(ui->listBox->row(current));
+
+ auto tabWidget = static_cast(ui->tabWidgetStack->currentWidget());
+ connect(tabWidget, &QTabWidget::currentChanged,
+ this, &DlgPreferencesImp::changeTab);
+
+ relabelResetButtons();
}
/**
@@ -352,8 +403,6 @@ void DlgPreferencesImp::onButtonBoxClicked(QAbstractButton* btn)
{
if (ui->buttonBox->standardButton(btn) == QDialogButtonBox::Apply)
applyChanges();
- else if (ui->buttonBox->standardButton(btn) == QDialogButtonBox::Reset)
- restoreDefaults();
}
void DlgPreferencesImp::restoreDefaults()
@@ -578,6 +627,14 @@ void DlgPreferencesImp::changeEvent(QEvent *e)
QByteArray group = item->data(GroupNameRole).toByteArray();
item->setText(QObject::tr(group.constData()));
}
+
+ //resizes items list and buttons
+ QFontMetrics fm(font());
+ int length = QtTools::horizontalAdvance(fm, longestGroupName());
+ ui->listBox->setFixedWidth(Base::clamp(length + 20, 108, 120));
+ ui->listBox->setGridSize(QSize(Base::clamp(length + 20, 108, 120), 75));
+ ui->buttonResetGroup->setFixedWidth(Base::clamp(length + 20, 108, 120));
+ ui->buttonResetAll->setFixedWidth(Base::clamp(length + 20, 108, 120));
} else {
QWidget::changeEvent(e);
}
@@ -596,4 +653,86 @@ void DlgPreferencesImp::reload()
applyChanges();
}
+void DlgPreferencesImp::restorePageDefaults(PreferencePage** page)
+{
+ QList prefs = (*page)->findChildren();
+
+ for (const auto & pref : prefs) {
+ if (!pref->property("prefPath").isNull() && !pref->property("prefEntry").isNull()) {
+ std::string path = pref->property("prefPath").toString().toStdString();
+ std::string entry = pref->property("prefEntry").toString().toStdString();
+
+ ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath(std::string("User parameter:BaseApp/Preferences/" + path).c_str());
+
+ for (const auto & pn : hGrp->GetParameterNames(entry.c_str())){
+ hGrp->RemoveAttribute(pn.first, pn.second.c_str());
+ }
+ }
+ }
+
+ std::string pageName = (*page)->property("PageName").toString().toStdString();
+ (*page) = WidgetFactory().createPreferencePage(pageName.c_str());
+ (*page)->loadSettings();
+ (*page)->setProperty("PageName", QVariant(QString::fromStdString(pageName)));
+}
+
+void DlgPreferencesImp::onButtonResetTabClicked()
+{
+ auto tabWidget = static_cast(ui->tabWidgetStack->widget(ui->listBox->currentRow()));
+
+ QMessageBox box(this);
+ box.setIcon(QMessageBox::Question);
+ box.setWindowTitle(tr("Reset Tab Parameters"));
+ box.setText(tr("All the parameters for the Tab %1 will be deleted.").arg(tabWidget->tabText(tabWidget->currentIndex())));
+ box.setInformativeText(tr("Do you want to continue?"));
+ box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ box.setDefaultButton(QMessageBox::No);
+
+ if (box.exec() == QMessageBox::Yes) {
+ int pageIndex = tabWidget->currentIndex();
+ QString pageText = tabWidget->tabText(pageIndex);
+ PreferencePage* page = qobject_cast(tabWidget->widget(pageIndex));
+
+ restorePageDefaults(&page);
+ page->setProperty("GroupName", tabWidget->property("GroupName"));
+
+ tabWidget->removeTab(pageIndex);
+ tabWidget->insertTab(pageIndex, page, pageText);
+ tabWidget->setCurrentIndex(pageIndex);
+
+ applyChanges();
+ }
+}
+
+void DlgPreferencesImp::onButtonResetGroupClicked()
+{
+ QMessageBox box(this);
+ box.setIcon(QMessageBox::Question);
+ box.setWindowTitle(tr("Reset Group Parameters"));
+ box.setText(tr("All the parameters for the Group %1 will be deleted.").arg(ui->listBox->currentItem()->text()));
+ box.setInformativeText(tr("Do you want to continue?"));
+ box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ box.setDefaultButton(QMessageBox::No);
+
+ if (box.exec() == QMessageBox::Yes) {
+ auto tabWidget = static_cast(ui->tabWidgetStack->widget(ui->listBox->currentRow()));
+ int pageIndex = tabWidget->currentIndex();
+
+ for (int i = 0; i < tabWidget->count(); i++) {
+ QString pageText = tabWidget->tabText(i);
+ PreferencePage* page = qobject_cast(tabWidget->widget(i));
+
+ restorePageDefaults(&page);
+ page->setProperty("GroupName", tabWidget->property("GroupName"));
+
+ tabWidget->removeTab(i);
+ tabWidget->insertTab(i, page, pageText);
+ }
+
+ tabWidget->setCurrentIndex(pageIndex);
+
+ applyChanges();
+ }
+}
+
#include "moc_DlgPreferencesImp.cpp"
diff --git a/src/Gui/DlgPreferencesImp.h b/src/Gui/DlgPreferencesImp.h
index f734128d50..dd7486a2a2 100644
--- a/src/Gui/DlgPreferencesImp.h
+++ b/src/Gui/DlgPreferencesImp.h
@@ -130,12 +130,17 @@ public:
void activeGroupPage(QString& group, int& index) const;
protected:
+ void setupConnections();
void changeEvent(QEvent *e) override;
void showEvent(QShowEvent*) override;
void resizeEvent(QResizeEvent*) override;
+ void onButtonResetTabClicked();
+ void onButtonResetGroupClicked();
+ void relabelResetButtons();
protected Q_SLOTS:
+ void changeTab(int current);
void changeGroup(QListWidgetItem *current, QListWidgetItem *previous);
void onButtonBoxClicked(QAbstractButton*);
void resizeWindow(int w, int h);
@@ -149,6 +154,7 @@ private:
void createPageInGroup(QTabWidget* tabWidget, const std::string& pageName);
void applyChanges();
void restoreDefaults();
+ void restorePageDefaults(PreferencePage**);
QString longestGroupName() const;
void restartIfRequired();
//@}