diff options
Diffstat (limited to 'src/plugins/texteditor/highlightersettingspage.cpp')
-rw-r--r-- | src/plugins/texteditor/highlightersettingspage.cpp | 178 |
1 files changed, 66 insertions, 112 deletions
diff --git a/src/plugins/texteditor/highlightersettingspage.cpp b/src/plugins/texteditor/highlightersettingspage.cpp index ceb8f7d48f1..4cc16a488a6 100644 --- a/src/plugins/texteditor/highlightersettingspage.cpp +++ b/src/plugins/texteditor/highlightersettingspage.cpp @@ -13,7 +13,6 @@ #include <utils/layoutbuilder.h> #include <utils/pathchooser.h> -#include <QApplication> #include <QDir> #include <QLabel> #include <QLineEdit> @@ -24,24 +23,50 @@ using namespace Utils; namespace TextEditor { -namespace Internal { -class HighlighterSettingsPageWidget : public QWidget +class HighlighterSettingsPageWidget; + +class HighlighterSettingsPagePrivate +{ +public: + void ensureInitialized() + { + if (m_initialized) + return; + m_initialized = true; + m_settings.fromSettings(m_settingsPrefix, Core::ICore::settings()); + migrateGenericHighlighterFiles(); + } + + void migrateGenericHighlighterFiles() + { + QDir userDefinitionPath(m_settings.definitionFilesPath().toString()); + if (userDefinitionPath.mkdir("syntax")) { + const auto link = Utils::HostOsInfo::isAnyUnixHost() + ? static_cast<bool(*)(const QString &, const QString &)>(&QFile::link) + : static_cast<bool(*)(const QString &, const QString &)>(&QFile::copy); + + for (const QFileInfo &file : userDefinitionPath.entryInfoList({"*.xml"}, QDir::Files)) + link(file.filePath(), file.absolutePath() + "/syntax/" + file.fileName()); + } + } + + bool m_initialized = false; + const QString m_settingsPrefix{"Text"}; + + HighlighterSettings m_settings; + + QPointer<HighlighterSettingsPageWidget> m_widget; +}; + +class HighlighterSettingsPageWidget : public Core::IOptionsPageWidget { public: - QLabel *definitionsInfolabel; - QPushButton *downloadDefinitions; - QLabel *updateStatus; - PathChooser *definitionFilesPath; - QPushButton *reloadDefinitions; - QPushButton *resetCache; - QLineEdit *ignoreEdit; - - HighlighterSettingsPageWidget() + HighlighterSettingsPageWidget(HighlighterSettingsPagePrivate *d) : d(d) { - resize(521, 332); + d->ensureInitialized(); - definitionsInfolabel = new QLabel(this); + auto definitionsInfolabel = new QLabel(this); definitionsInfolabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); definitionsInfolabel->setTextFormat(Qt::RichText); definitionsInfolabel->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter); @@ -51,24 +76,25 @@ public: "<a href=\"https://api.kde.org/frameworks/syntax-highlighting/html/index.html\">" "KSyntaxHighlighting</a> engine.</p></body></html>")); - downloadDefinitions = new QPushButton(Tr::tr("Download Definitions")); + auto downloadDefinitions = new QPushButton(Tr::tr("Download Definitions")); downloadDefinitions->setToolTip(Tr::tr("Download missing and update existing syntax definition files.")); - updateStatus = new QLabel; + auto updateStatus = new QLabel; updateStatus->setObjectName("updateStatus"); - definitionFilesPath = new PathChooser; - definitionFilesPath->setExpectedKind(PathChooser::ExistingDirectory); - definitionFilesPath->setHistoryCompleter("TextEditor.Highlighter.History"); + m_definitionFilesPath = new PathChooser; + m_definitionFilesPath->setFilePath(d->m_settings.definitionFilesPath()); + m_definitionFilesPath->setExpectedKind(PathChooser::ExistingDirectory); + m_definitionFilesPath->setHistoryCompleter("TextEditor.Highlighter.History"); - reloadDefinitions = new QPushButton(Tr::tr("Reload Definitions")); + auto reloadDefinitions = new QPushButton(Tr::tr("Reload Definitions")); reloadDefinitions->setToolTip(Tr::tr("Reload externally modified definition files.")); - resetCache = new QPushButton(Tr::tr("Reset Remembered Definitions")); + auto resetCache = new QPushButton(Tr::tr("Reset Remembered Definitions")); resetCache->setToolTip(Tr::tr("Reset definitions remembered for files that can be " "associated with more than one highlighter definition.")); - ignoreEdit = new QLineEdit; + m_ignoreEdit = new QLineEdit(d->m_settings.ignoredFilesPatterns()); using namespace Layouting; Column { @@ -79,11 +105,11 @@ public: Column { Row { downloadDefinitions, updateStatus, st }, Row { Tr::tr("User Highlight Definition Files"), - definitionFilesPath, reloadDefinitions }, + m_definitionFilesPath, reloadDefinitions }, Row { st, resetCache } } }, - Row { Tr::tr("Ignored file patterns:"), ignoreEdit }, + Row { Tr::tr("Ignored file patterns:"), m_ignoreEdit }, st }.attachTo(this); @@ -102,53 +128,25 @@ public: Highlighter::clearDefinitionForDocumentCache(); }); } -}; - -} // Internal - -using namespace Internal; - -class HighlighterSettingsPagePrivate -{ -public: - HighlighterSettingsPagePrivate() = default; - - void ensureInitialized(); - void migrateGenericHighlighterFiles(); - - void settingsFromUI(); - void settingsToUI(); - bool settingsChanged(); - - bool m_initialized = false; - const QString m_settingsPrefix{"Text"}; - HighlighterSettings m_settings; + void apply() final + { + bool changed = d->m_settings.definitionFilesPath() != m_definitionFilesPath->filePath() + || d->m_settings.ignoredFilesPatterns() != m_ignoreEdit->text(); + + if (changed) { + d->m_settings.setDefinitionFilesPath(m_definitionFilesPath->filePath()); + d->m_settings.setIgnoredFilesPatterns(m_ignoreEdit->text()); + d->m_settings.toSettings(d->m_settingsPrefix, Core::ICore::settings()); + } + } - QPointer<HighlighterSettingsPageWidget> m_widget; + PathChooser *m_definitionFilesPath; + QLineEdit *m_ignoreEdit; + HighlighterSettingsPagePrivate *d; }; -void HighlighterSettingsPagePrivate::migrateGenericHighlighterFiles() -{ - QDir userDefinitionPath(m_settings.definitionFilesPath().toString()); - if (userDefinitionPath.mkdir("syntax")) { - const auto link = Utils::HostOsInfo::isAnyUnixHost() - ? static_cast<bool(*)(const QString &, const QString &)>(&QFile::link) - : static_cast<bool(*)(const QString &, const QString &)>(&QFile::copy); - - for (const QFileInfo &file : userDefinitionPath.entryInfoList({"*.xml"}, QDir::Files)) - link(file.filePath(), file.absolutePath() + "/syntax/" + file.fileName()); - } -} - -void HighlighterSettingsPagePrivate::ensureInitialized() -{ - if (m_initialized) - return; - m_initialized = true; - m_settings.fromSettings(m_settingsPrefix, Core::ICore::settings()); - migrateGenericHighlighterFiles(); -} +// HighlighterSettingsPage HighlighterSettingsPage::HighlighterSettingsPage() : d(new HighlighterSettingsPagePrivate) @@ -158,6 +156,7 @@ HighlighterSettingsPage::HighlighterSettingsPage() setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY); setDisplayCategory(Tr::tr("Text Editor")); setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH); + setWidgetCreator([this] { return new HighlighterSettingsPageWidget(d); }); } HighlighterSettingsPage::~HighlighterSettingsPage() @@ -165,55 +164,10 @@ HighlighterSettingsPage::~HighlighterSettingsPage() delete d; } -QWidget *HighlighterSettingsPage::widget() -{ - if (!d->m_widget) { - d->m_widget = new HighlighterSettingsPageWidget; - d->settingsToUI(); - } - return d->m_widget; -} - -void HighlighterSettingsPage::apply() -{ - if (!d->m_widget) // page was not shown - return; - if (d->settingsChanged()) - d->settingsFromUI(); -} - -void HighlighterSettingsPage::finish() -{ - delete d->m_widget; - d->m_widget = nullptr; -} - const HighlighterSettings &HighlighterSettingsPage::highlighterSettings() const { d->ensureInitialized(); return d->m_settings; } -void HighlighterSettingsPagePrivate::settingsFromUI() -{ - ensureInitialized(); - m_settings.setDefinitionFilesPath(m_widget->definitionFilesPath->filePath()); - m_settings.setIgnoredFilesPatterns(m_widget->ignoreEdit->text()); - m_settings.toSettings(m_settingsPrefix, Core::ICore::settings()); -} - -void HighlighterSettingsPagePrivate::settingsToUI() -{ - ensureInitialized(); - m_widget->definitionFilesPath->setFilePath(m_settings.definitionFilesPath()); - m_widget->ignoreEdit->setText(m_settings.ignoredFilesPatterns()); -} - -bool HighlighterSettingsPagePrivate::settingsChanged() -{ - ensureInitialized(); - return m_settings.definitionFilesPath() != m_widget->definitionFilesPath->filePath() - || m_settings.ignoredFilesPatterns() != m_widget->ignoreEdit->text(); -} - } // TextEditor |