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(); //@}