| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: https://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the Qt Assistant of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at https://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU |
| 19 | ** General Public License version 3 as published by the Free Software |
| 20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| 21 | ** included in the packaging of this file. Please review the following |
| 22 | ** information to ensure the GNU General Public License requirements will |
| 23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 24 | ** |
| 25 | ** $QT_END_LICENSE$ |
| 26 | ** |
| 27 | ****************************************************************************/ |
| 28 | #include "preferencesdialog.h" |
| 29 | |
| 30 | #include "centralwidget.h" |
| 31 | #include "fontpanel.h" |
| 32 | #include "helpenginewrapper.h" |
| 33 | #include "openpagesmanager.h" |
| 34 | #include "helpdocsettingswidget.h" |
| 35 | |
| 36 | #include <QtCore/QVersionNumber> |
| 37 | |
| 38 | #include <QtGui/QFontDatabase> |
| 39 | |
| 40 | #include <QtHelp/QHelpEngineCore> |
| 41 | #include <QtHelp/QHelpFilterData> |
| 42 | #include <QtHelp/QHelpFilterEngine> |
| 43 | #include <QtHelp/QHelpFilterSettingsWidget> |
| 44 | |
| 45 | #include <QtDebug> |
| 46 | |
| 47 | QT_BEGIN_NAMESPACE |
| 48 | |
| 49 | PreferencesDialog::PreferencesDialog(QWidget *parent) |
| 50 | : QDialog(parent) |
| 51 | , m_appFontChanged(false) |
| 52 | , m_browserFontChanged(false) |
| 53 | , helpEngine(HelpEngineWrapper::instance()) |
| 54 | , m_hideFiltersTab(!helpEngine.filterFunctionalityEnabled()) |
| 55 | , m_hideDocsTab(!helpEngine.documentationManagerEnabled()) |
| 56 | { |
| 57 | m_ui.setupUi(this); |
| 58 | |
| 59 | connect(sender: m_ui.buttonBox->button(which: QDialogButtonBox::Ok), signal: &QAbstractButton::clicked, |
| 60 | receiver: this, slot: &PreferencesDialog::okClicked); |
| 61 | connect(sender: m_ui.buttonBox->button(which: QDialogButtonBox::Apply), signal: &QAbstractButton::clicked, |
| 62 | receiver: this, slot: &PreferencesDialog::applyClicked); |
| 63 | connect(sender: m_ui.buttonBox->button(which: QDialogButtonBox::Cancel), signal: &QAbstractButton::clicked, |
| 64 | receiver: this, slot: &QDialog::reject); |
| 65 | |
| 66 | m_docSettings = HelpDocSettings::readSettings(helpEngine: helpEngine.helpEngine()); |
| 67 | |
| 68 | if (m_hideDocsTab) { |
| 69 | m_ui.tabWidget->removeTab(index: m_ui.tabWidget->indexOf(widget: m_ui.docsTab)); |
| 70 | } else { |
| 71 | connect(sender: m_ui.docSettingsWidget, signal: &HelpDocSettingsWidget::docSettingsChanged, |
| 72 | slot: [this](const HelpDocSettings &settings) { |
| 73 | m_docSettings = settings; |
| 74 | if (m_hideFiltersTab) |
| 75 | return; |
| 76 | |
| 77 | m_ui.filterSettingsWidget->setAvailableComponents(m_docSettings.components()); |
| 78 | m_ui.filterSettingsWidget->setAvailableVersions(m_docSettings.versions()); |
| 79 | }); |
| 80 | |
| 81 | m_ui.docSettingsWidget->setDocSettings(m_docSettings); |
| 82 | } |
| 83 | |
| 84 | if (m_hideFiltersTab) { |
| 85 | m_ui.tabWidget->removeTab(index: m_ui.tabWidget->indexOf(widget: m_ui.filtersTab)); |
| 86 | } else { |
| 87 | m_ui.filterSettingsWidget->setAvailableComponents(m_docSettings.components()); |
| 88 | m_ui.filterSettingsWidget->setAvailableVersions(m_docSettings.versions()); |
| 89 | m_ui.filterSettingsWidget->readSettings(filterEngine: helpEngine.filterEngine()); |
| 90 | } |
| 91 | |
| 92 | updateFontSettingsPage(); |
| 93 | updateOptionsPage(); |
| 94 | |
| 95 | if (helpEngine.usesAppFont()) |
| 96 | setFont(helpEngine.appFont()); |
| 97 | } |
| 98 | |
| 99 | void PreferencesDialog::okClicked() |
| 100 | { |
| 101 | applyChanges(); |
| 102 | accept(); |
| 103 | } |
| 104 | |
| 105 | void PreferencesDialog::applyClicked() |
| 106 | { |
| 107 | applyChanges(); |
| 108 | |
| 109 | m_docSettings = HelpDocSettings::readSettings(helpEngine: helpEngine.helpEngine()); |
| 110 | |
| 111 | if (!m_hideDocsTab) |
| 112 | m_ui.docSettingsWidget->setDocSettings(m_docSettings); |
| 113 | if (!m_hideFiltersTab) { |
| 114 | m_ui.filterSettingsWidget->setAvailableComponents(m_docSettings.components()); |
| 115 | m_ui.filterSettingsWidget->setAvailableVersions(m_docSettings.versions()); |
| 116 | m_ui.filterSettingsWidget->readSettings(filterEngine: helpEngine.filterEngine()); |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | void PreferencesDialog::applyChanges() |
| 121 | { |
| 122 | bool changed = false; |
| 123 | if (!m_hideDocsTab) |
| 124 | changed = HelpDocSettings::applySettings(helpEngine: helpEngine.helpEngine(), settings: m_docSettings); |
| 125 | if (!m_hideFiltersTab) |
| 126 | changed = changed || m_ui.filterSettingsWidget->applySettings(filterEngine: helpEngine.filterEngine()); |
| 127 | |
| 128 | if (changed) { |
| 129 | // In order to update the filtercombobox and indexwidget |
| 130 | // according to the new filter configuration. |
| 131 | helpEngine.setupData(); |
| 132 | } |
| 133 | |
| 134 | helpEngine.setShowTabs(m_ui.showTabs->isChecked()); |
| 135 | if (m_showTabs != m_ui.showTabs->isChecked()) |
| 136 | emit updateUserInterface(); |
| 137 | |
| 138 | if (m_appFontChanged) { |
| 139 | helpEngine.setAppFont(m_appFontPanel->selectedFont()); |
| 140 | helpEngine.setUseAppFont(m_appFontPanel->isChecked()); |
| 141 | helpEngine.setAppWritingSystem(m_appFontPanel->writingSystem()); |
| 142 | emit updateApplicationFont(); |
| 143 | m_appFontChanged = false; |
| 144 | } |
| 145 | |
| 146 | if (m_browserFontChanged) { |
| 147 | helpEngine.setBrowserFont(m_browserFontPanel->selectedFont()); |
| 148 | helpEngine.setUseBrowserFont(m_browserFontPanel->isChecked()); |
| 149 | helpEngine.setBrowserWritingSystem(m_browserFontPanel->writingSystem()); |
| 150 | emit updateBrowserFont(); |
| 151 | m_browserFontChanged = false; |
| 152 | } |
| 153 | |
| 154 | QString homePage = m_ui.homePageLineEdit->text(); |
| 155 | if (homePage.isEmpty()) |
| 156 | homePage = QLatin1String("help" ); |
| 157 | helpEngine.setHomePage(homePage); |
| 158 | |
| 159 | const int option = m_ui.helpStartComboBox->currentIndex(); |
| 160 | helpEngine.setStartOption(option); |
| 161 | } |
| 162 | |
| 163 | void PreferencesDialog::updateFontSettingsPage() |
| 164 | { |
| 165 | m_browserFontPanel = new FontPanel(this); |
| 166 | m_browserFontPanel->setCheckable(true); |
| 167 | m_ui.stackedWidget_2->insertWidget(index: 0, w: m_browserFontPanel); |
| 168 | |
| 169 | m_appFontPanel = new FontPanel(this); |
| 170 | m_appFontPanel->setCheckable(true); |
| 171 | m_ui.stackedWidget_2->insertWidget(index: 1, w: m_appFontPanel); |
| 172 | |
| 173 | m_ui.stackedWidget_2->setCurrentIndex(0); |
| 174 | |
| 175 | const QString customSettings(tr(s: "Use custom settings" )); |
| 176 | m_appFontPanel->setTitle(customSettings); |
| 177 | |
| 178 | QFont font = helpEngine.appFont(); |
| 179 | m_appFontPanel->setSelectedFont(font); |
| 180 | |
| 181 | QFontDatabase::WritingSystem system = helpEngine.appWritingSystem(); |
| 182 | m_appFontPanel->setWritingSystem(system); |
| 183 | |
| 184 | m_appFontPanel->setChecked(helpEngine.usesAppFont()); |
| 185 | |
| 186 | m_browserFontPanel->setTitle(customSettings); |
| 187 | |
| 188 | font = helpEngine.browserFont(); |
| 189 | m_browserFontPanel->setSelectedFont(font); |
| 190 | |
| 191 | system = helpEngine.browserWritingSystem(); |
| 192 | m_browserFontPanel->setWritingSystem(system); |
| 193 | |
| 194 | m_browserFontPanel->setChecked(helpEngine.usesBrowserFont()); |
| 195 | |
| 196 | connect(sender: m_appFontPanel, signal: &QGroupBox::toggled, |
| 197 | receiver: this, slot: &PreferencesDialog::appFontSettingToggled); |
| 198 | connect(sender: m_browserFontPanel, signal: &QGroupBox::toggled, |
| 199 | receiver: this, slot: &PreferencesDialog::browserFontSettingToggled); |
| 200 | |
| 201 | const QList<QComboBox*> &appCombos = m_appFontPanel->findChildren<QComboBox*>(); |
| 202 | for (QComboBox* box : appCombos) { |
| 203 | connect(sender: box, signal: QOverload<int>::of(ptr: &QComboBox::currentIndexChanged), |
| 204 | receiver: this, slot: &PreferencesDialog::appFontSettingChanged); |
| 205 | } |
| 206 | |
| 207 | const QList<QComboBox*> &browserCombos = m_browserFontPanel->findChildren<QComboBox*>(); |
| 208 | for (QComboBox* box : browserCombos) { |
| 209 | connect(sender: box, signal: QOverload<int>::of(ptr: &QComboBox::currentIndexChanged), |
| 210 | receiver: this, slot: &PreferencesDialog::browserFontSettingChanged); |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | void PreferencesDialog::appFontSettingToggled(bool on) |
| 215 | { |
| 216 | Q_UNUSED(on); |
| 217 | m_appFontChanged = true; |
| 218 | } |
| 219 | |
| 220 | void PreferencesDialog::appFontSettingChanged(int index) |
| 221 | { |
| 222 | Q_UNUSED(index); |
| 223 | m_appFontChanged = true; |
| 224 | } |
| 225 | |
| 226 | void PreferencesDialog::browserFontSettingToggled(bool on) |
| 227 | { |
| 228 | Q_UNUSED(on); |
| 229 | m_browserFontChanged = true; |
| 230 | } |
| 231 | |
| 232 | void PreferencesDialog::browserFontSettingChanged(int index) |
| 233 | { |
| 234 | Q_UNUSED(index); |
| 235 | m_browserFontChanged = true; |
| 236 | } |
| 237 | |
| 238 | void PreferencesDialog::updateOptionsPage() |
| 239 | { |
| 240 | m_ui.homePageLineEdit->setText(helpEngine.homePage()); |
| 241 | |
| 242 | int option = helpEngine.startOption(); |
| 243 | m_ui.helpStartComboBox->setCurrentIndex(option); |
| 244 | |
| 245 | m_showTabs = helpEngine.showTabs(); |
| 246 | m_ui.showTabs->setChecked(m_showTabs); |
| 247 | |
| 248 | connect(sender: m_ui.blankPageButton, signal: &QAbstractButton::clicked, |
| 249 | receiver: this, slot: &PreferencesDialog::setBlankPage); |
| 250 | connect(sender: m_ui.currentPageButton, signal: &QAbstractButton::clicked, |
| 251 | receiver: this, slot: &PreferencesDialog::setCurrentPage); |
| 252 | connect(sender: m_ui.defaultPageButton, signal: &QAbstractButton::clicked, |
| 253 | receiver: this, slot: &PreferencesDialog::setDefaultPage); |
| 254 | } |
| 255 | |
| 256 | void PreferencesDialog::setBlankPage() |
| 257 | { |
| 258 | m_ui.homePageLineEdit->setText(QLatin1String("about:blank" )); |
| 259 | } |
| 260 | |
| 261 | void PreferencesDialog::setCurrentPage() |
| 262 | { |
| 263 | QString homepage = CentralWidget::instance()->currentSource().toString(); |
| 264 | if (homepage.isEmpty()) |
| 265 | homepage = QLatin1String("help" ); |
| 266 | |
| 267 | m_ui.homePageLineEdit->setText(homepage); |
| 268 | } |
| 269 | |
| 270 | void PreferencesDialog::setDefaultPage() |
| 271 | { |
| 272 | m_ui.homePageLineEdit->setText(helpEngine.defaultHomePage()); |
| 273 | } |
| 274 | |
| 275 | QT_END_NAMESPACE |
| 276 | |