8 #include "../misc/dialogutils.h" 10 #include "ui_settingsdialog.h" 12 #include <QItemSelectionModel> 14 #include <QScrollArea> 15 #include <QStringBuilder> 16 #include <QMessageBox> 34 m_currentCategory(nullptr),
35 m_tabBarAlwaysVisible(true)
38 makeHeading(m_ui->headingLabel);
41 m_categoryFilterModel->setSourceModel(m_categoryModel);
42 m_ui->categoriesListView->setModel(m_categoryFilterModel);
45 connect(m_ui->categoriesListView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &SettingsDialog::currentCategoryChanged);
47 connect(m_ui->abortPushButton, &QPushButton::clicked,
this, &SettingsDialog::reject);
48 connect(m_ui->applyPushButton, &QPushButton::clicked,
this, &SettingsDialog::apply);
49 connect(m_ui->okPushButton, &QPushButton::clicked,
this, &SettingsDialog::accept);
51 connect(
this, &SettingsDialog::accepted,
this, &SettingsDialog::apply);
52 connect(
this, &SettingsDialog::rejected,
this, &SettingsDialog::reset);
54 connect(m_ui->filterLineEdit, &QLineEdit::textChanged, m_categoryFilterModel, &OptionCategoryFilterModel::setFilterFixedString);
55 connect(m_ui->filterLineEdit, &QLineEdit::textChanged,
this, &SettingsDialog::updateTabWidget);
70 m_tabBarAlwaysVisible = value;
71 if(m_currentCategory) {
72 m_ui->pagesTabWidget->tabBar()->setHidden(!value && m_currentCategory->
pages().size() == 1);
84 return m_categoryModel->
category(categoryIndex);
96 if(pageIndex < category->pages().length()) {
108 if(!event->spontaneous()) {
122 void SettingsDialog::currentCategoryChanged(
const QModelIndex &index)
132 if(m_currentCategory) {
133 m_currentCategory->
setCurrentIndex(m_ui->pagesTabWidget->currentIndex());
136 if(m_currentCategory != category) {
138 m_ui->headingLabel->setText(category->
displayName());
141 m_currentCategory =
nullptr;
142 m_ui->headingLabel->setText(tr(
"No category selected"));
155 bool hasSingleCategory = singleCategory !=
nullptr;
156 m_ui->filterLineEdit->setHidden(hasSingleCategory);
157 m_ui->categoriesListView->setHidden(hasSingleCategory);
158 m_ui->headingLabel->setHidden(hasSingleCategory);
159 if(hasSingleCategory) {
160 m_ui->filterLineEdit->clear();
169 void SettingsDialog::updateTabWidget()
171 if(m_currentCategory) {
172 m_ui->pagesTabWidget->setUpdatesEnabled(
false);
173 const QString searchKeyWord = m_ui->filterLineEdit->text();
174 int index = 0, pageIndex = 0;
177 QScrollArea *scrollArea;
178 if(index < m_ui->pagesTabWidget->count()) {
179 scrollArea = qobject_cast<QScrollArea *>(m_ui->pagesTabWidget->widget(index));
180 scrollArea->takeWidget();
181 m_ui->pagesTabWidget->setTabText(index,
page->
widget()->windowTitle());
182 m_ui->pagesTabWidget->setTabIcon(index,
page->
widget()->windowIcon());
184 scrollArea =
new QScrollArea(m_ui->pagesTabWidget);
185 scrollArea->setFrameStyle(QFrame::NoFrame);
186 scrollArea->setBackgroundRole(QPalette::Base);
187 scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
188 scrollArea->setWidgetResizable(
true);
189 m_ui->pagesTabWidget->addTab(scrollArea,
page->
widget()->windowTitle());
190 m_ui->pagesTabWidget->setTabIcon(index,
page->
widget()->windowIcon());
193 page->
widget()->layout()->setAlignment(Qt::AlignTop | Qt::AlignLeft);
199 m_ui->pagesTabWidget->setCurrentIndex(pageIndex);
203 while(index < m_ui->pagesTabWidget->count()) {
204 QScrollArea *scrollArea = qobject_cast<QScrollArea *>(m_ui->pagesTabWidget->widget(index));
205 scrollArea->takeWidget();
206 m_ui->pagesTabWidget->removeTab(index);
209 m_ui->pagesTabWidget->tabBar()->setHidden(!m_tabBarAlwaysVisible && m_ui->pagesTabWidget->count() == 1);
210 m_ui->pagesTabWidget->setUpdatesEnabled(
true);
212 m_ui->pagesTabWidget->clear();
219 bool SettingsDialog::apply()
221 QString errorMessage;
225 if(errorMessage.isEmpty()) {
226 errorMessage = tr(
"<p><b>Errors occured when applying changes:</b></p><ul>");
229 if(errors.isEmpty()) {
230 errorMessage.append(QStringLiteral(
"<li><i>")
234 % QStringLiteral(
"</i>: ")
235 % tr(
"unknonw error")
236 % QStringLiteral(
"</li>"));
238 for(
const QString &error : errors) {
239 errorMessage.append(QStringLiteral(
"<li><i>")
243 % QStringLiteral(
"</i>: ")
245 % QStringLiteral(
"</li>"));
252 if(!errorMessage.isEmpty()) {
253 errorMessage.append(QStringLiteral(
"</ul>"));
254 QMessageBox::warning(
this, windowTitle(), errorMessage);
257 return errorMessage.isEmpty();
263 void SettingsDialog::reset()
QString displayName
Returns the display name of the category.
QWidget * widget()
Returns the widget for the option page.
The OptionCategoryModel class is used by SettingsDialog to store and display option categories...
bool matches(const QString &searchKeyWord)
Returns whether the pages matches the specified searchKeyWord.
The OptionCategory class wraps associated option pages.
The OptionPage class is the base class for SettingsDialog pages.
void setCategories(const QList< OptionCategory *> categories)
Sets the categories for the model.
OptionPage * page(int categoryIndex, int pageIndex) const
Returns the page for the specified categoryIndex and the specified pageIndex.
OptionCategory * category(const QModelIndex &index) const
Returns the category for the specified model index.
OptionCategory * category(int categoryIndex) const
Returns the category for the specified categoryIndex.
const QList< OptionCategory * > & categories() const
Returns the categories.
~SettingsDialog()
Destroys the settings dialog.
void setSingleCategory(OptionCategory *singleCategory)
Enables single-category mode to show only the specified singleCategory.
Provides common dialogs such as AboutDialog, EnterPasswordDialog and SettingsDialog.
void resetAllPages()
Resets all pages.
int currentIndex() const
Returns the index of the currently shown page.
SettingsDialog(QWidget *parent=nullptr)
Constructs a settings dialog.
QList< OptionPage * > pages
Returns the assigned pages.
void showEvent(QShowEvent *event)
Resets all pages before the dialog is shown by the application.
void setTabBarAlwaysVisible(bool value)
Sets whether the tab bar is always visible.
virtual void reset()=0
Discards altered settings and resets relevant widgets.
virtual bool apply()=0
Applies altered settings.
The SettingsDialog class provides a framework for creating settings dialogs with different categories...
void showCategory(OptionCategory *category)
Sets the current category to the specified category and updates the relevant widgets to show it...
OptionCategoryModel * categoryModel()
Returns the category model used by the settings dialog to manage the categories.
const QString QT_UTILITIES_EXPORT & dialogStyle()
Returns the stylesheet for dialogs and other windows used in my applications.
void setCurrentIndex(int currentIndex)
Sets the current index.
The OptionCategoryFilterModel class is used by SettingsDialog to filter option categories.