8 #include "../misc/dialogutils.h" 10 #include "ui_settingsdialog.h" 12 #include <QItemSelectionModel> 13 #include <QMessageBox> 14 #include <QScrollArea> 16 #include <QStringBuilder> 35 , m_currentCategory(nullptr)
36 , m_tabBarAlwaysVisible(true)
39 makeHeading(m_ui->headingLabel);
40 setStyleSheet(dialogStyle());
42 m_categoryFilterModel->setSourceModel(m_categoryModel);
43 m_ui->categoriesListView->setModel(m_categoryFilterModel);
46 connect(m_ui->categoriesListView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &SettingsDialog::currentCategoryChanged);
48 connect(m_ui->abortPushButton, &QPushButton::clicked,
this, &SettingsDialog::reject);
49 connect(m_ui->applyPushButton, &QPushButton::clicked,
this, &SettingsDialog::apply);
50 connect(m_ui->okPushButton, &QPushButton::clicked,
this, &SettingsDialog::accept);
52 connect(
this, &SettingsDialog::accepted,
this, &SettingsDialog::apply);
53 connect(
this, &SettingsDialog::rejected,
this, &SettingsDialog::reset);
55 connect(m_ui->filterLineEdit, &QLineEdit::textChanged, m_categoryFilterModel, &OptionCategoryFilterModel::setFilterFixedString);
56 connect(m_ui->filterLineEdit, &QLineEdit::textChanged,
this, &SettingsDialog::updateTabWidget);
72 m_tabBarAlwaysVisible = value;
73 if (m_currentCategory) {
74 m_ui->pagesTabWidget->tabBar()->setHidden(!value && m_currentCategory->
pages().size() == 1);
86 return m_categoryModel->
category(categoryIndex);
99 if (pageIndex < category->pages().length()) {
111 if (!event->spontaneous()) {
129 void SettingsDialog::currentCategoryChanged(
const QModelIndex &index)
140 if (m_currentCategory) {
141 m_currentCategory->
setCurrentIndex(m_ui->pagesTabWidget->currentIndex());
144 if (m_currentCategory !=
category) {
149 m_currentCategory =
nullptr;
150 m_ui->headingLabel->setText(tr(
"No category selected"));
166 bool hasSingleCategory = singleCategory !=
nullptr;
167 m_ui->filterLineEdit->setHidden(hasSingleCategory);
168 m_ui->categoriesListView->setHidden(hasSingleCategory);
169 m_ui->headingLabel->setHidden(hasSingleCategory);
170 if (hasSingleCategory) {
171 m_ui->filterLineEdit->clear();
180 void SettingsDialog::updateTabWidget()
182 if (m_currentCategory) {
183 m_ui->pagesTabWidget->setUpdatesEnabled(
false);
184 const QString searchKeyWord = m_ui->filterLineEdit->text();
185 int index = 0, pageIndex = 0;
188 QScrollArea *scrollArea;
189 if (index < m_ui->pagesTabWidget->count()) {
190 scrollArea = qobject_cast<QScrollArea *>(m_ui->pagesTabWidget->widget(index));
191 scrollArea->takeWidget();
192 m_ui->pagesTabWidget->setTabText(index,
page->
widget()->windowTitle());
193 m_ui->pagesTabWidget->setTabIcon(index,
page->
widget()->windowIcon());
195 scrollArea =
new QScrollArea(m_ui->pagesTabWidget);
196 scrollArea->setFrameStyle(QFrame::NoFrame);
197 scrollArea->setBackgroundRole(QPalette::Base);
198 scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
199 scrollArea->setWidgetResizable(
true);
200 m_ui->pagesTabWidget->addTab(scrollArea,
page->
widget()->windowTitle());
201 m_ui->pagesTabWidget->setTabIcon(index,
page->
widget()->windowIcon());
204 page->
widget()->layout()->setAlignment(Qt::AlignTop | Qt::AlignLeft);
210 m_ui->pagesTabWidget->setCurrentIndex(pageIndex);
214 while (index < m_ui->pagesTabWidget->count()) {
215 QScrollArea *scrollArea = qobject_cast<QScrollArea *>(m_ui->pagesTabWidget->widget(index));
216 scrollArea->takeWidget();
217 m_ui->pagesTabWidget->removeTab(index);
220 m_ui->pagesTabWidget->tabBar()->setHidden(!m_tabBarAlwaysVisible && m_ui->pagesTabWidget->count() == 1);
221 m_ui->pagesTabWidget->setUpdatesEnabled(
true);
223 m_ui->pagesTabWidget->clear();
232 bool SettingsDialog::apply()
235 QString errorMessage;
244 if (errorMessage.isEmpty()) {
245 errorMessage = tr(
"<p><b>Errors occurred when applying changes:</b></p><ul>");
247 QStringList &errors =
const_cast<OptionPage *
>(
page)->errors();
248 if (errors.isEmpty()) {
250 % QStringLiteral(
"</i>: ") % tr(
"unknonw error") % QStringLiteral(
"</li>"));
252 for (
const QString &error : errors) {
254 % QStringLiteral(
"</i>: ") % error % QStringLiteral(
"</li>"));
262 if (!errorMessage.isEmpty()) {
263 errorMessage.append(QStringLiteral(
"</ul>"));
264 QMessageBox::warning(
this, windowTitle(), errorMessage);
269 return errorMessage.isEmpty();
276 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.
void setSingleCategory(OptionCategory *singleCategory)
Enables single-category mode to show only the specified singleCategory.
void showEvent(QShowEvent *event) override
Resets all pages before the dialog is shown by the application.
bool hasBeenShown() const
Returns an indication whether the option page has been shown yet.
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 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.
void setCurrentIndex(int currentIndex)
Sets the current index.
~SettingsDialog() override
Destroys the settings dialog.
The OptionCategoryFilterModel class is used by SettingsDialog to filter option categories.