diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index 200d4037ceed0217c9624b770e76598d8c00a659..93eb7504029c64bfe7aad420227b5d4a5a93b702 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -315,6 +315,8 @@ void CMakeSettingsPage::saveSettings() const void CMakeSettingsPage::apply() { + if (!m_pathchooser) // page was never shown + return; if (m_cmakeExecutable == m_pathchooser->path()) return; m_cmakeExecutable = m_pathchooser->path(); diff --git a/src/plugins/coreplugin/actionmanager/commandmappings.cpp b/src/plugins/coreplugin/actionmanager/commandmappings.cpp index c62aa11827021fdef8a3a7cbb30a5e3fc066fb43..f49f621bc994ba4e23a62ace1d6b793bd5c5884c 100644 --- a/src/plugins/coreplugin/actionmanager/commandmappings.cpp +++ b/src/plugins/coreplugin/actionmanager/commandmappings.cpp @@ -54,7 +54,7 @@ using namespace Core; using namespace Core::Internal; CommandMappings::CommandMappings(QObject *parent) - : IOptionsPage(parent) + : IOptionsPage(parent), m_page(0) { } @@ -140,7 +140,10 @@ void CommandMappings::setTargetHeader(const QString &s) void CommandMappings::finish() { + if (!m_page) // page was never shown + return; delete m_page; + m_page = 0; } void CommandMappings::commandChanged(QTreeWidgetItem *current) diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index b408c2db04c22d4aa9e82ae2984ae8004f410446..e88cb0b10c35d18d48b7db3877b27b6b0794d962 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -34,14 +34,19 @@ \mainclass \brief The IOptionsPage is an interface for providing options pages. + You need to subclass this interface and put an instance of your subclass + into the plugin manager object pool (e.g. ExtensionSystem::PluginManager::addObject). Guidelines for implementing: \list - \o id() is an id used for filtering when calling ICore:: showOptionsDialog() - \o displayName() is the (translated) name for display. - \o category() is the category used for filtering when calling ICore:: showOptionsDialog() - \o displayCategory() is the translated category + \o id() is a unique identifier for referencing this page + \o displayName() is the (translated) name for display + \o category() is the unique id for the category that the page should be displayed in + \o displayCategory() is the translated name of the category + \o createPage() is called to retrieve the widget to show in the preferences dialog + The widget will be destroyed by the widget hierarchy when the dialog closes \o apply() is called to store the settings. It should detect if any changes have been - made and store those. - \o matches() is used for the options dialog search filter. + made and store those + \o finish() is called directly before the preferences dialog closes + \o matches() is used for the options dialog search filter \endlist */ diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h index 7818921e7e1fa0904471a44e284975c8990ca10e..6a64736d5e80ae27f9140d4f62d3bf1dd226fe1c 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -60,6 +60,29 @@ public: virtual void finish() = 0; }; +/* + Alternative way for providing option pages instead of adding IOptionsPage + objects into the plugin manager pool. Should only be used if creation of the + actual option pages is not possible or too expensive at Qt Creator startup. + (Like the designer integration, which needs to initialize designer plugins + before the options pages get available.) +*/ + +class CORE_EXPORT IOptionsPageProvider : public QObject +{ + Q_OBJECT + +public: + IOptionsPageProvider(QObject *parent = 0) : QObject(parent) {} + virtual ~IOptionsPageProvider() {} + + virtual QString category() const = 0; + virtual QString displayCategory() const = 0; + virtual QIcon categoryIcon() const = 0; + + virtual QList<IOptionsPage *> pages() const = 0; +}; + } // namespace Core #endif // IOPTIONSPAGE_H diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index a87f81270f4ad066147e481bd1a6d335e6852ef0..e5c6a1825f37228fe324e601b734186b4ed8cfff 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -72,7 +72,8 @@ public: QString id; QString displayName; QIcon icon; - QList<IOptionsPage*> pages; + QList<IOptionsPage *> pages; + QList<IOptionsPageProvider *> providers; int index; QTabWidget *tabWidget; }; @@ -86,7 +87,8 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - void setPages(const QList<IOptionsPage*> &pages); + void setPages(const QList<IOptionsPage*> &pages, + const QList<IOptionsPageProvider *> &providers); const QList<Category*> &categories() const { return m_categories; } private: @@ -130,7 +132,8 @@ QVariant CategoryModel::data(const QModelIndex &index, int role) const return QVariant(); } -void CategoryModel::setPages(const QList<IOptionsPage*> &pages) +void CategoryModel::setPages(const QList<IOptionsPage*> &pages, + const QList<IOptionsPageProvider *> &providers) { // Clear any previous categories qDeleteAll(m_categories); @@ -143,13 +146,32 @@ void CategoryModel::setPages(const QList<IOptionsPage*> &pages) if (!category) { category = new Category; category->id = categoryId; + category->tabWidget = 0; + category->index = -1; + m_categories.append(category); + } + if (category->displayName.isEmpty()) category->displayName = page->displayCategory(); + if (category->icon.isNull()) category->icon = page->categoryIcon(); - category->pages.append(page); + category->pages.append(page); + } + + foreach (IOptionsPageProvider *provider, providers) { + const QString &categoryId = provider->category(); + Category *category = findCategoryById(categoryId); + if (!category) { + category = new Category; + category->id = categoryId; + category->tabWidget = 0; + category->index = -1; m_categories.append(category); - } else { - category->pages.append(page); } + if (category->displayName.isEmpty()) + category->displayName = provider->displayCategory(); + if (category->icon.isNull()) + category->icon = provider->categoryIcon(); + category->providers.append(provider); } reset(); @@ -277,26 +299,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) : setWindowTitle(tr("Options")); #endif - m_model->setPages(m_pages); - - // Create the tab widgets with the pages in each category - const QList<Category*> &categories = m_model->categories(); - for (int i = 0; i < categories.size(); ++i) { - Category *category = categories.at(i); - - QTabWidget *tabWidget = new QTabWidget; - for (int j = 0; j < category->pages.size(); ++j) { - IOptionsPage *page = category->pages.at(j); - QWidget *widget = page->createPage(0); - tabWidget->addTab(widget, page->displayName()); - } - - connect(tabWidget, SIGNAL(currentChanged(int)), - this, SLOT(currentTabChanged(int))); - - category->tabWidget = tabWidget; - category->index = m_stackedLayout->addWidget(tabWidget); - } + m_model->setPages(m_pages, + ExtensionSystem::PluginManager::instance()->getObjects<IOptionsPageProvider>()); m_proxyModel->setSourceModel(m_model); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); @@ -383,6 +387,7 @@ void SettingsDialog::createGui() mainGridLayout->addWidget(buttonBox, 2, 0, 1, 2); mainGridLayout->setColumnStretch(1, 4); setLayout(mainGridLayout); + setMinimumSize(1070, 680); } SettingsDialog::~SettingsDialog() @@ -392,7 +397,7 @@ SettingsDialog::~SettingsDialog() void SettingsDialog::showCategory(int index) { Category *category = m_model->categories().at(index); - + ensureCategoryWidget(category); // Update current category and page m_currentCategory = category->id; const int currentTabIndex = category->tabWidget->currentIndex(); @@ -408,6 +413,29 @@ void SettingsDialog::showCategory(int index) updateEnabledTabs(category, m_filterLineEdit->text()); } +void SettingsDialog::ensureCategoryWidget(Category *category) +{ + if (category->tabWidget != 0) + return; + foreach (const IOptionsPageProvider *provider, category->providers) { + category->pages += provider->pages(); + } + qStableSort(category->pages.begin(), category->pages.end(), optionsPageLessThan); + + QTabWidget *tabWidget = new QTabWidget; + for (int j = 0; j < category->pages.size(); ++j) { + IOptionsPage *page = category->pages.at(j); + QWidget *widget = page->createPage(0); + tabWidget->addTab(widget, page->displayName()); + } + + connect(tabWidget, SIGNAL(currentChanged(int)), + this, SLOT(currentTabChanged(int))); + + category->tabWidget = tabWidget; + category->index = m_stackedLayout->addWidget(tabWidget); +} + void SettingsDialog::updateEnabledTabs(Category *category, const QString &searchText) { for (int i = 0; i < category->pages.size(); ++i) { diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h index 4172f036f871c8dc0e6d4eee858b3398c879d88c..f942b03c523c098cf692872dcab16eaf10d80b65 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.h +++ b/src/plugins/coreplugin/dialogs/settingsdialog.h @@ -93,6 +93,7 @@ private: void showCategory(int index); void showPage(const QString &categoryId, const QString &pageId); void updateEnabledTabs(Category *category, const QString &searchText); + void ensureCategoryWidget(Category *category); const QList<Core::IOptionsPage*> m_pages; diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index dec8e22cbb12a995c8c282c17370fbcc86cf97ba..844b3550057c6b773e506af61a9d160e3194cf7f 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -53,7 +53,7 @@ using namespace Core::Internal; GeneralSettings::GeneralSettings(): - m_dialog(0) + m_page(0), m_dialog(0) { } @@ -188,6 +188,8 @@ bool GeneralSettings::matches(const QString &s) const void GeneralSettings::apply() { + if (!m_page) // wasn't shown, can't be changed + return; int currentIndex = m_page->languageBox->currentIndex(); setLanguage(m_page->languageBox->itemData(currentIndex, Qt::UserRole).toString()); // Apply the new base color if accepted @@ -205,7 +207,10 @@ void GeneralSettings::apply() void GeneralSettings::finish() { + if (!m_page) // page was never shown + return; delete m_page; + m_page = 0; } void GeneralSettings::resetInterfaceColor() diff --git a/src/plugins/cpaster/fileshareprotocolsettingspage.cpp b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp index ea19de63e27e2a728a2e8772d1e22667f3e5066c..fd0a19c2989bcbd880cf3607f3405af5b983c09a 100644 --- a/src/plugins/cpaster/fileshareprotocolsettingspage.cpp +++ b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp @@ -96,7 +96,7 @@ FileShareProtocolSettings FileShareProtocolSettingsWidget::settings() const // ----------FileShareProtocolSettingsPage FileShareProtocolSettingsPage::FileShareProtocolSettingsPage(const QSharedPointer<FileShareProtocolSettings> &s, QObject *parent) : - Core::IOptionsPage(parent), m_settings(s) + Core::IOptionsPage(parent), m_settings(s), m_widget(0) { } @@ -134,6 +134,8 @@ QWidget *FileShareProtocolSettingsPage::createPage(QWidget *parent) void FileShareProtocolSettingsPage::apply() { + if (!m_widget) // page was never shown + return; const FileShareProtocolSettings newSettings = m_widget->settings(); if (newSettings != *m_settings) { *m_settings = newSettings; diff --git a/src/plugins/cpaster/settingspage.cpp b/src/plugins/cpaster/settingspage.cpp index 3d59b7ac07550706e7fa3f77791bf66f51f3280d..346e75088a18e25bc2d67cecace5980bbfa36215 100644 --- a/src/plugins/cpaster/settingspage.cpp +++ b/src/plugins/cpaster/settingspage.cpp @@ -76,7 +76,7 @@ Settings SettingsWidget::settings() } SettingsPage::SettingsPage(const QSharedPointer<Settings> &settings) : - m_settings(settings) + m_settings(settings), m_widget(0) { } @@ -121,7 +121,8 @@ QWidget *SettingsPage::createPage(QWidget *parent) void SettingsPage::apply() { - QTC_ASSERT(m_widget, return) + if (!m_widget) // page was never shown + return; const Settings newSettings = m_widget->settings(); if (newSettings != *m_settings) { *m_settings = newSettings; diff --git a/src/plugins/cpptools/completionsettingspage.cpp b/src/plugins/cpptools/completionsettingspage.cpp index 2db7dc3087f4a6d56c946303f8a8c6e2731e54de..995ee2d7d8e032aaa049137c915ccc6df8dc748d 100644 --- a/src/plugins/cpptools/completionsettingspage.cpp +++ b/src/plugins/cpptools/completionsettingspage.cpp @@ -40,7 +40,7 @@ using namespace CppTools::Internal; CompletionSettingsPage::CompletionSettingsPage() - : m_page(new Ui_CompletionSettingsPage) + : m_page(0) { } @@ -62,6 +62,7 @@ QString CompletionSettingsPage::displayName() const QWidget *CompletionSettingsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); + m_page = new Ui_CompletionSettingsPage; m_page->setupUi(w); const TextEditor::CompletionSettings &settings = @@ -113,6 +114,8 @@ QWidget *CompletionSettingsPage::createPage(QWidget *parent) void CompletionSettingsPage::apply() { + if (!m_page) // page was never shown + return; TextEditor::CompletionSettings settings; settings.m_caseSensitivity = caseSensitivity(); settings.m_completionTrigger = completionTrigger(); @@ -151,3 +154,11 @@ TextEditor::CompletionTrigger CompletionSettingsPage::completionTrigger() const return TextEditor::AutomaticCompletion; } } + +void CompletionSettingsPage::finish() +{ + if (!m_page) // page was never shown + return; + delete m_page; + m_page = 0; +} diff --git a/src/plugins/cpptools/completionsettingspage.h b/src/plugins/cpptools/completionsettingspage.h index c2b0c56dc30105a5bb372fff43bbaa294edc3609..25ceac12583c513f5c2dc930674d9d238dbdb2ff 100644 --- a/src/plugins/cpptools/completionsettingspage.h +++ b/src/plugins/cpptools/completionsettingspage.h @@ -55,7 +55,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() { } + void finish(); virtual bool matches(const QString &) const; private: diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index 7884defae84b9e4e0041fc7a843b3fba16448df1..6ac2251e4f9fdebfef6bdc52182d857adfb4a070 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -139,6 +139,7 @@ void GdbOptionsPage::writeGdbBinarySettings() /* static */ } GdbOptionsPage::GdbOptionsPage() + : m_ui(0) { } @@ -170,67 +171,68 @@ QIcon GdbOptionsPage::categoryIcon() const QWidget *GdbOptionsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); - m_ui.setupUi(w); - m_ui.gdbChooserWidget->setGdbBinaries(gdbBinaryToolChainMap); - m_ui.scriptFileChooser->setExpectedKind(Utils::PathChooser::File); - m_ui.scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File")); + m_ui = new Ui::GdbOptionsPage; + m_ui->setupUi(w); + m_ui->gdbChooserWidget->setGdbBinaries(gdbBinaryToolChainMap); + m_ui->scriptFileChooser->setExpectedKind(Utils::PathChooser::File); + m_ui->scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File")); m_group.clear(); m_group.insert(debuggerCore()->action(GdbScriptFile), - m_ui.scriptFileChooser); + m_ui->scriptFileChooser); m_group.insert(debuggerCore()->action(GdbEnvironment), - m_ui.environmentEdit); + m_ui->environmentEdit); m_group.insert(debuggerCore()->action(AdjustBreakpointLocations), - m_ui.checkBoxAdjustBreakpointLocations); + m_ui->checkBoxAdjustBreakpointLocations); m_group.insert(debuggerCore()->action(GdbWatchdogTimeout), - m_ui.spinBoxGdbWatchdogTimeout); + m_ui->spinBoxGdbWatchdogTimeout); m_group.insert(debuggerCore()->action(UseMessageBoxForSignals), - m_ui.checkBoxUseMessageBoxForSignals); + m_ui->checkBoxUseMessageBoxForSignals); m_group.insert(debuggerCore()->action(SkipKnownFrames), - m_ui.checkBoxSkipKnownFrames); + m_ui->checkBoxSkipKnownFrames); m_group.insert(debuggerCore()->action(EnableReverseDebugging), - m_ui.checkBoxEnableReverseDebugging); + m_ui->checkBoxEnableReverseDebugging); m_group.insert(debuggerCore()->action(GdbWatchdogTimeout), 0); #if 1 - m_ui.groupBoxPluginDebugging->hide(); + m_ui->groupBoxPluginDebugging->hide(); #else // The related code (handleAqcuiredInferior()) is disabled as well. m_group.insert(debuggerCore()->action(AllPluginBreakpoints), - m_ui.radioButtonAllPluginBreakpoints); + m_ui->radioButtonAllPluginBreakpoints); m_group.insert(debuggerCore()->action(SelectedPluginBreakpoints), - m_ui.radioButtonSelectedPluginBreakpoints); + m_ui->radioButtonSelectedPluginBreakpoints); m_group.insert(debuggerCore()->action(NoPluginBreakpoints), - m_ui.radioButtonNoPluginBreakpoints); + m_ui->radioButtonNoPluginBreakpoints); m_group.insert(debuggerCore()->action(SelectedPluginBreakpointsPattern), - m_ui.lineEditSelectedPluginBreakpointsPattern); + m_ui->lineEditSelectedPluginBreakpointsPattern); #endif - m_ui.lineEditSelectedPluginBreakpointsPattern-> + m_ui->lineEditSelectedPluginBreakpointsPattern-> setEnabled(debuggerCore()->action(SelectedPluginBreakpoints)->value().toBool()); - connect(m_ui.radioButtonSelectedPluginBreakpoints, SIGNAL(toggled(bool)), - m_ui.lineEditSelectedPluginBreakpointsPattern, SLOT(setEnabled(bool))); + connect(m_ui->radioButtonSelectedPluginBreakpoints, SIGNAL(toggled(bool)), + m_ui->lineEditSelectedPluginBreakpointsPattern, SLOT(setEnabled(bool))); // FIXME - m_ui.environmentEdit->hide(); - m_ui.labelEnvironment->hide(); + m_ui->environmentEdit->hide(); + m_ui->labelEnvironment->hide(); if (m_searchKeywords.isEmpty()) { QLatin1Char sep(' '); QTextStream(&m_searchKeywords) - << sep << m_ui.groupBoxLocations->title() - << sep << m_ui.labelEnvironment->text() - << sep << m_ui.labelGdbStartupScript->text() - << sep << m_ui.labelGdbWatchdogTimeout->text() - << sep << m_ui.checkBoxEnableReverseDebugging->text() - << sep << m_ui.checkBoxSkipKnownFrames->text() - << sep << m_ui.checkBoxUseMessageBoxForSignals->text() - << sep << m_ui.checkBoxAdjustBreakpointLocations->text() - << sep << m_ui.groupBoxPluginDebugging->title() - << sep << m_ui.radioButtonAllPluginBreakpoints->text() - << sep << m_ui.radioButtonSelectedPluginBreakpoints->text() - << sep << m_ui.labelSelectedPluginBreakpoints->text() - << sep << m_ui.radioButtonNoPluginBreakpoints->text() + << sep << m_ui->groupBoxLocations->title() + << sep << m_ui->labelEnvironment->text() + << sep << m_ui->labelGdbStartupScript->text() + << sep << m_ui->labelGdbWatchdogTimeout->text() + << sep << m_ui->checkBoxEnableReverseDebugging->text() + << sep << m_ui->checkBoxSkipKnownFrames->text() + << sep << m_ui->checkBoxUseMessageBoxForSignals->text() + << sep << m_ui->checkBoxAdjustBreakpointLocations->text() + << sep << m_ui->groupBoxPluginDebugging->title() + << sep << m_ui->radioButtonAllPluginBreakpoints->text() + << sep << m_ui->radioButtonSelectedPluginBreakpoints->text() + << sep << m_ui->labelSelectedPluginBreakpoints->text() + << sep << m_ui->radioButtonNoPluginBreakpoints->text() ; m_searchKeywords.remove(QLatin1Char('&')); } @@ -239,17 +241,22 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent) void GdbOptionsPage::apply() { + if (!m_ui) // page never shown + return; m_group.apply(Core::ICore::instance()->settings()); - - if (m_ui.gdbChooserWidget->isDirty()) { + if (m_ui->gdbChooserWidget->isDirty()) { gdbBinariesChanged = true; - gdbBinaryToolChainMap = m_ui.gdbChooserWidget->gdbBinaries(); - m_ui.gdbChooserWidget->clearDirty(); + gdbBinaryToolChainMap = m_ui->gdbChooserWidget->gdbBinaries(); + m_ui->gdbChooserWidget->clearDirty(); } } void GdbOptionsPage::finish() { + if (!m_ui) // page never shown + return; + delete m_ui; + m_ui = 0; m_group.finish(); } diff --git a/src/plugins/debugger/gdb/gdboptionspage.h b/src/plugins/debugger/gdb/gdboptionspage.h index 445dac36e58c8da6c7da2fa3a01695d3c1bda379..6a4a9567c2fdab789ca3372579f70f1c5d5499d0 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.h +++ b/src/plugins/debugger/gdb/gdboptionspage.h @@ -64,7 +64,7 @@ public: static void writeGdbBinarySettings(); private: - Ui::GdbOptionsPage m_ui; + Ui::GdbOptionsPage *m_ui; Utils::SavedActionSet m_group; QString m_searchKeywords; }; diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index 1c10c422ab061c2a6c4a5867db3a5e4a47d88d60..a2155ebb2ab818a69792c4441b458b386fa94057 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -37,6 +37,7 @@ # include "cppsettingspage.h" #endif +#include "settingspage.h" #include "designerconstants.h" #include <coreplugin/icore.h> @@ -84,6 +85,7 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error) initializeTemplates(); addAutoReleasedObject(new FormEditorFactory); + addAutoReleasedObject(new SettingsPageProvider); // Ensure that loading designer translations is done before FormEditorW is instantiated const QString locale = Core::ICore::instance()->userInterfaceLanguage(); @@ -97,18 +99,9 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error) qApp->installTranslator(qtr); } error->clear(); - // Delayed loading: Make sure settings pages are there if options - // dialog is requested. - connect(Core::ICore::instance(), SIGNAL(optionsDialogRequested()), - this, SLOT(ensurePluginInitialized())); return true; } -void FormEditorPlugin::ensurePluginInitialized() -{ - FormEditorW::instance()->ensureInitStage(FormEditorW::RegisterPlugins); -} - void FormEditorPlugin::extensionsInitialized() { // 4) test and make sure everything works (undo, saving, editors, opening/closing multiple files, dirtiness etc) diff --git a/src/plugins/designer/formeditorplugin.h b/src/plugins/designer/formeditorplugin.h index 47ce3d3949780bf0aff1cfdd2aace82aa36c8731..7ee2afa0802fdfd9e5bf853261bea3093ce9810c 100644 --- a/src/plugins/designer/formeditorplugin.h +++ b/src/plugins/designer/formeditorplugin.h @@ -57,9 +57,6 @@ public: bool initialize(const QStringList &arguments, QString *error_message = 0); void extensionsInitialized(); -public slots: - void ensurePluginInitialized(); - private: void initializeTemplates(); diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index 86b6a989a60856c28b03b7f97d540492c3424949..012fa46b4951e51826b5c3c6773c414e9381e4cb 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -186,7 +186,6 @@ FormEditorW::FormEditorW() : foreach (QDesignerOptionsPageInterface *designerPage, m_formeditor->optionsPages()) { SettingsPage *settingsPage = new SettingsPage(designerPage); - ExtensionSystem::PluginManager::instance()->addObject(settingsPage); m_settingsPages.append(settingsPage); } @@ -213,10 +212,8 @@ FormEditorW::~FormEditorW() } delete m_formeditor; - foreach (SettingsPage *settingsPage, m_settingsPages) { - ExtensionSystem::PluginManager::instance()->removeObject(settingsPage); - delete settingsPage; - } + qDeleteAll(m_settingsPages); + m_settingsPages.clear(); delete m_integration; m_self = 0; @@ -389,6 +386,11 @@ void FormEditorW::initDesignerSubWindows() m_designerSubWindows[ActionEditorSubWindow] = ae; } +QList<Core::IOptionsPage *> FormEditorW::optionsPages() const +{ + return m_settingsPages; +} + void FormEditorW::ensureInitStage(InitializationStage s) { if (Designer::Constants::Internal::debug) diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h index e54ee40f90e152ce57b0d1813151b1952eaf48d8..fc4d2573be5e28272dabb3c6b51e66188ae3f35b 100644 --- a/src/plugins/designer/formeditorw.h +++ b/src/plugins/designer/formeditorw.h @@ -32,7 +32,8 @@ #include "designerconstants.h" -#include "coreplugin/icontext.h" +#include <coreplugin/icontext.h> +#include <coreplugin/dialogs/ioptionspage.h> #include <QtCore/QMap> #include <QtCore/QObject> @@ -85,12 +86,10 @@ class DesignerContext; * The plugin uses this stage at first by calling ensureInitStage(). * Requesting an editor via instance() will fully initialize the class. * This is based on the assumption that the Designer settings work with - * no plugins loaded. If that does not work, full initialization can be - * triggered by connection to the ICore::optionsDialogRequested() signal. + * no plugins loaded. * * The form editor shows a read-only XML editor in edit mode and Qt Designer - * in Design mode. It connects to void EditorManager::currentEditorChanged() - * and switches modes if a designer XML editor is activated. */ + * in Design mode. */ class FormEditorW : public QObject { Q_OBJECT @@ -117,6 +116,7 @@ public: inline QWidget * const*designerSubWindows() const { return m_designerSubWindows; } EditorData activeEditor() const; + QList<Core::IOptionsPage *> optionsPages() const; private slots: void activateEditMode(int id); @@ -178,7 +178,7 @@ private: QAction *m_lockAction; QAction *m_resetLayoutAction; - QList<SettingsPage *> m_settingsPages; + QList<Core::IOptionsPage *> m_settingsPages; QActionGroup *m_actionGroupEditMode; QAction *m_actionPrint; QAction *m_actionPreview; diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp index f316a6e78cb0b82d4359646f15b4d1823d5c5a0e..729ab94539d4080c3a98c0f88798edbf2c14d5da 100644 --- a/src/plugins/designer/settingspage.cpp +++ b/src/plugins/designer/settingspage.cpp @@ -29,6 +29,7 @@ #include "settingspage.h" #include "designerconstants.h" +#include "formeditorw.h" #include <extensionsystem/pluginmanager.h> #include "qt_private/abstractoptionspage_p.h" @@ -37,7 +38,7 @@ using namespace Designer::Internal; SettingsPage::SettingsPage(QDesignerOptionsPageInterface *designerPage) : - m_designerPage(designerPage) + m_designerPage(designerPage), m_initialized(false) { } @@ -72,15 +73,52 @@ QIcon SettingsPage::categoryIcon() const QWidget *SettingsPage::createPage(QWidget *parent) { + m_initialized = true; return m_designerPage->createPage(parent); } void SettingsPage::apply() { - m_designerPage->apply(); + if (m_initialized) + m_designerPage->apply(); } void SettingsPage::finish() { - m_designerPage->finish(); + if (m_initialized) + m_designerPage->finish(); +} + +SettingsPageProvider::SettingsPageProvider(QObject *parent) + : IOptionsPageProvider(parent), m_initialized(false) +{ +} + +SettingsPageProvider::~SettingsPageProvider() +{ +} + +QString SettingsPageProvider::category() const +{ + return QLatin1String(Designer::Constants::SETTINGS_CATEGORY); +} + +QString SettingsPageProvider::displayCategory() const +{ + return QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_TR_CATEGORY); +} + +QIcon SettingsPageProvider::categoryIcon() const +{ + return QIcon(QLatin1String(Designer::Constants::SETTINGS_CATEGORY_ICON)); +} + +QList<Core::IOptionsPage *> SettingsPageProvider::pages() const +{ + if (!m_initialized) { + // get options pages from designer + m_initialized = true; + FormEditorW::ensureInitStage(FormEditorW::RegisterPlugins); + } + return FormEditorW::instance()->optionsPages(); } diff --git a/src/plugins/designer/settingspage.h b/src/plugins/designer/settingspage.h index 0732e386fac46d3ade416b1063eb8ca283084417..3853f2ff5dffb7aaa87e8ba41457afce7611eb44 100644 --- a/src/plugins/designer/settingspage.h +++ b/src/plugins/designer/settingspage.h @@ -61,6 +61,25 @@ public: private: QDesignerOptionsPageInterface *m_designerPage; + bool m_initialized; +}; + +class SettingsPageProvider : public Core::IOptionsPageProvider +{ + Q_OBJECT + +public: + SettingsPageProvider(QObject *parent = 0); + ~SettingsPageProvider(); + + QString category() const; + QString displayCategory() const; + QIcon categoryIcon() const; + + QList<Core::IOptionsPage *> pages() const; + +private: + mutable bool m_initialized; }; } // namespace Internal diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index dc4daff803d407c551a214d823b02f2d4a1e4c11..b70c4e003e75db91430c9a5d900d3f8b267b0cc5 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -54,6 +54,7 @@ using namespace Help::Internal; GeneralSettingsPage::GeneralSettingsPage() + : m_ui(0) { m_font = qApp->font(); #if !defined(QT_NO_WEBKIT) @@ -90,10 +91,10 @@ QIcon GeneralSettingsPage::categoryIcon() const QWidget *GeneralSettingsPage::createPage(QWidget *parent) { QWidget *widget = new QWidget(parent); - - m_ui.setupUi(widget); - m_ui.sizeComboBox->setEditable(false); - m_ui.styleComboBox->setEditable(false); + m_ui = new Ui::GeneralSettingsPage; + m_ui->setupUi(widget); + m_ui->sizeComboBox->setEditable(false); + m_ui->styleComboBox->setEditable(false); Core::HelpManager *manager = Core::HelpManager::instance(); m_font = qVariantValue<QFont>(manager->customValue(QLatin1String("font"), @@ -109,58 +110,60 @@ QWidget *GeneralSettingsPage::createPage(QWidget *parent) m_homePage = manager->customValue(QLatin1String("DefaultHomePage"), Help::Constants::AboutBlank).toString(); } - m_ui.homePageLineEdit->setText(m_homePage); + m_ui->homePageLineEdit->setText(m_homePage); const int startOption = manager->customValue(QLatin1String("StartOption"), Help::Constants::ShowLastPages).toInt(); - m_ui.helpStartComboBox->setCurrentIndex(startOption); + m_ui->helpStartComboBox->setCurrentIndex(startOption); m_contextOption = manager->customValue(QLatin1String("ContextHelpOption"), Help::Constants::SideBySideIfPossible).toInt(); - m_ui.contextHelpComboBox->setCurrentIndex(m_contextOption); + m_ui->contextHelpComboBox->setCurrentIndex(m_contextOption); - connect(m_ui.currentPageButton, SIGNAL(clicked()), this, SLOT(setCurrentPage())); - connect(m_ui.blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage())); - connect(m_ui.defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage())); + connect(m_ui->currentPageButton, SIGNAL(clicked()), this, SLOT(setCurrentPage())); + connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage())); + connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage())); HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer(); if (!viewer) - m_ui.currentPageButton->setEnabled(false); + m_ui->currentPageButton->setEnabled(false); - m_ui.errorLabel->setVisible(false); - connect(m_ui.importButton, SIGNAL(clicked()), this, SLOT(importBookmarks())); - connect(m_ui.exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks())); + m_ui->errorLabel->setVisible(false); + connect(m_ui->importButton, SIGNAL(clicked()), this, SLOT(importBookmarks())); + connect(m_ui->exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks())); if (m_searchKeywords.isEmpty()) { - QTextStream(&m_searchKeywords) << ' ' << m_ui.contextHelpLabel->text() - << ' ' << m_ui.startPageLabel->text() << ' ' << m_ui.homePageLabel->text() - << ' ' << m_ui.bookmarkGroupBox->title(); + QTextStream(&m_searchKeywords) << ' ' << m_ui->contextHelpLabel->text() + << ' ' << m_ui->startPageLabel->text() << ' ' << m_ui->homePageLabel->text() + << ' ' << m_ui->bookmarkGroupBox->title(); m_searchKeywords.remove(QLatin1Char('&')); } m_returnOnClose = manager->customValue(QLatin1String("ReturnOnClose"), false).toBool(); - m_ui.m_returnOnClose->setChecked(m_returnOnClose); + m_ui->m_returnOnClose->setChecked(m_returnOnClose); return widget; } void GeneralSettingsPage::apply() { + if (!m_ui) // page was never shown + return; QFont newFont; - const QString &family = m_ui.familyComboBox->currentFont().family(); + const QString &family = m_ui->familyComboBox->currentFont().family(); newFont.setFamily(family); int fontSize = 14; - int currentIndex = m_ui.sizeComboBox->currentIndex(); + int currentIndex = m_ui->sizeComboBox->currentIndex(); if (currentIndex != -1) - fontSize = m_ui.sizeComboBox->itemData(currentIndex).toInt(); + fontSize = m_ui->sizeComboBox->itemData(currentIndex).toInt(); newFont.setPointSize(fontSize); QString fontStyle = QLatin1String("Normal"); - currentIndex = m_ui.styleComboBox->currentIndex(); + currentIndex = m_ui->styleComboBox->currentIndex(); if (currentIndex != -1) - fontStyle = m_ui.styleComboBox->itemText(currentIndex); + fontStyle = m_ui->styleComboBox->itemText(currentIndex); newFont.setBold(m_fontDatabase.bold(family, fontStyle)); if (fontStyle.contains(QLatin1String("Italic"))) newFont.setStyle(QFont::StyleItalic); @@ -180,15 +183,15 @@ void GeneralSettingsPage::apply() emit fontChanged(); } - QString homePage = m_ui.homePageLineEdit->text(); + QString homePage = m_ui->homePageLineEdit->text(); if (homePage.isEmpty()) homePage = Help::Constants::AboutBlank; manager->setCustomValue(QLatin1String("HomePage"), homePage); - const int startOption = m_ui.helpStartComboBox->currentIndex(); + const int startOption = m_ui->helpStartComboBox->currentIndex(); manager->setCustomValue(QLatin1String("StartOption"), startOption); - const int helpOption = m_ui.contextHelpComboBox->currentIndex(); + const int helpOption = m_ui->contextHelpComboBox->currentIndex(); if (m_contextOption != helpOption) { m_contextOption = helpOption; manager->setCustomValue(QLatin1String("ContextHelpOption"), helpOption); @@ -201,7 +204,7 @@ void GeneralSettingsPage::apply() emit contextHelpOptionChanged(); } - const bool close = m_ui.m_returnOnClose->isChecked(); + const bool close = m_ui->m_returnOnClose->isChecked(); if (m_returnOnClose != close) { m_returnOnClose = close; manager->setCustomValue(QLatin1String("ReturnOnClose"), close); @@ -213,24 +216,24 @@ void GeneralSettingsPage::setCurrentPage() { HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer(); if (viewer) - m_ui.homePageLineEdit->setText(viewer->source().toString()); + m_ui->homePageLineEdit->setText(viewer->source().toString()); } void GeneralSettingsPage::setBlankPage() { - m_ui.homePageLineEdit->setText(Help::Constants::AboutBlank); + m_ui->homePageLineEdit->setText(Help::Constants::AboutBlank); } void GeneralSettingsPage::setDefaultPage() { const QString &defaultHomePage = Core::HelpManager::instance() ->customValue(QLatin1String("DefaultHomePage"), QString()).toString(); - m_ui.homePageLineEdit->setText(defaultHomePage); + m_ui->homePageLineEdit->setText(defaultHomePage); } void GeneralSettingsPage::importBookmarks() { - m_ui.errorLabel->setVisible(false); + m_ui->errorLabel->setVisible(false); QString fileName = QFileDialog::getOpenFileName(0, tr("Import Bookmarks"), QDir::currentPath(), tr("Files (*.xbel)")); @@ -246,13 +249,13 @@ void GeneralSettingsPage::importBookmarks() return; } - m_ui.errorLabel->setVisible(true); - m_ui.errorLabel->setText(tr("There was an error while importing bookmarks!")); + m_ui->errorLabel->setVisible(true); + m_ui->errorLabel->setText(tr("There was an error while importing bookmarks!")); } void GeneralSettingsPage::exportBookmarks() { - m_ui.errorLabel->setVisible(false); + m_ui->errorLabel->setVisible(false); QString fileName = QFileDialog::getSaveFileName(0, tr("Save File"), "untitled.xbel", tr("Files (*.xbel)")); @@ -277,18 +280,18 @@ void GeneralSettingsPage::updateFontSize() if (pointSizes.empty()) pointSizes = QFontDatabase::standardSizes(); - m_ui.sizeComboBox->clear(); - m_ui.sizeComboBox->setCurrentIndex(-1); - m_ui.sizeComboBox->setEnabled(!pointSizes.empty()); + m_ui->sizeComboBox->clear(); + m_ui->sizeComboBox->setCurrentIndex(-1); + m_ui->sizeComboBox->setEnabled(!pointSizes.empty()); // try to maintain selection or select closest. if (!pointSizes.empty()) { QString n; foreach (int pointSize, pointSizes) - m_ui.sizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize)); + m_ui->sizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize)); const int closestIndex = closestPointSizeIndex(m_font.pointSize()); if (closestIndex != -1) - m_ui.sizeComboBox->setCurrentIndex(closestIndex); + m_ui->sizeComboBox->setCurrentIndex(closestIndex); } } @@ -297,32 +300,32 @@ void GeneralSettingsPage::updateFontStyle() const QString &fontStyle = m_fontDatabase.styleString(m_font); const QStringList &styles = m_fontDatabase.styles(m_font.family()); - m_ui.styleComboBox->clear(); - m_ui.styleComboBox->setCurrentIndex(-1); - m_ui.styleComboBox->setEnabled(!styles.empty()); + m_ui->styleComboBox->clear(); + m_ui->styleComboBox->setCurrentIndex(-1); + m_ui->styleComboBox->setEnabled(!styles.empty()); if (!styles.empty()) { int normalIndex = -1; const QString normalStyle = QLatin1String("Normal"); foreach (const QString &style, styles) { // try to maintain selection or select 'normal' preferably - const int newIndex = m_ui.styleComboBox->count(); - m_ui.styleComboBox->addItem(style); + const int newIndex = m_ui->styleComboBox->count(); + m_ui->styleComboBox->addItem(style); if (fontStyle == style) { - m_ui.styleComboBox->setCurrentIndex(newIndex); + m_ui->styleComboBox->setCurrentIndex(newIndex); } else { if (fontStyle == normalStyle) normalIndex = newIndex; } } - if (m_ui.styleComboBox->currentIndex() == -1 && normalIndex != -1) - m_ui.styleComboBox->setCurrentIndex(normalIndex); + if (m_ui->styleComboBox->currentIndex() == -1 && normalIndex != -1) + m_ui->styleComboBox->setCurrentIndex(normalIndex); } } void GeneralSettingsPage::updateFontFamily() { - m_ui.familyComboBox->setCurrentFont(m_font); + m_ui->familyComboBox->setCurrentFont(m_font); } int GeneralSettingsPage::closestPointSizeIndex(int desiredPointSize) const @@ -331,9 +334,9 @@ int GeneralSettingsPage::closestPointSizeIndex(int desiredPointSize) const int closestIndex = -1; int closestAbsError = 0xFFFF; - const int pointSizeCount = m_ui.sizeComboBox->count(); + const int pointSizeCount = m_ui->sizeComboBox->count(); for (int i = 0; i < pointSizeCount; i++) { - const int itemPointSize = m_ui.sizeComboBox->itemData(i).toInt(); + const int itemPointSize = m_ui->sizeComboBox->itemData(i).toInt(); const int absError = qAbs(desiredPointSize - itemPointSize); if (absError < closestAbsError) { closestIndex = i; @@ -353,3 +356,11 @@ bool GeneralSettingsPage::matches(const QString &s) const { return m_searchKeywords.contains(s, Qt::CaseInsensitive); } + +void GeneralSettingsPage::finish() +{ + if (!m_ui) // page was never shown + return; + delete m_ui; + m_ui = 0; +} diff --git a/src/plugins/help/generalsettingspage.h b/src/plugins/help/generalsettingspage.h index 87a93b5b130f42cedb3c99dbbb044f0b88be7314..60d0b7ba0d4eae2df8b5fe29ffebf20e2263f8b8 100644 --- a/src/plugins/help/generalsettingspage.h +++ b/src/plugins/help/generalsettingspage.h @@ -53,7 +53,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() {} + void finish(); virtual bool matches(const QString &s) const; signals: @@ -85,7 +85,7 @@ private: bool m_returnOnClose; QString m_searchKeywords; - Ui::GeneralSettingsPage m_ui; + Ui::GeneralSettingsPage *m_ui; }; } // Internal diff --git a/src/plugins/qmldesigner/settingspage.cpp b/src/plugins/qmldesigner/settingspage.cpp index 104ae4d94d17388f02c33716af491035aae1bc06..9363a02853339da585e2422ee73fc279415885dd 100644 --- a/src/plugins/qmldesigner/settingspage.cpp +++ b/src/plugins/qmldesigner/settingspage.cpp @@ -109,6 +109,8 @@ QWidget *SettingsPage::createPage(QWidget *parent) void SettingsPage::apply() { + if (!m_widget) // page was never shown + return; BauhausPlugin::pluginInstance()->setSettings(m_widget->settings()); } diff --git a/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp b/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp index 776fdfbd7d62bd4f6c606d32e7f949c4c2f14df7..686d57a1e7d18b6f1da253e43e699aae429db861 100644 --- a/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp +++ b/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp @@ -161,6 +161,8 @@ QWidget *QuickToolBarSettingsPage::createPage(QWidget *parent) void QuickToolBarSettingsPage::apply() { + if (!m_widget) // page was never shown + return; m_widget->settings().set(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp index 81d48aa0ec95a1c5888d0139d8bbde9f80befd52..47aa0e558d86fbc05f53db1f024e4f89fc5d97ed 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp @@ -411,7 +411,8 @@ QWidget *S60DevicesPreferencePane::createPage(QWidget *parent) void S60DevicesPreferencePane::apply() { - QTC_ASSERT(m_widget, return) + if (!m_widget) // page was never shown + return; m_devices->setDevices(m_widget->devices()); } diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp index e62e3e447192b03b7dee57aaffceb2b4db8bf686..dff55fddd006bfc1bd2d94f3cdff98a32d72a70a 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.cpp +++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp @@ -133,6 +133,8 @@ QWidget *QtOptionsPage::createPage(QWidget *parent) void QtOptionsPage::apply() { + if (!m_widget) // page was never shown + return; m_widget->finish(); QtVersionManager *vm = QtVersionManager::instance(); diff --git a/src/plugins/texteditor/behaviorsettingspage.cpp b/src/plugins/texteditor/behaviorsettingspage.cpp index 3c44039d8e78b0fd21a80e81490d4cfc370503ac..874d5a6cc74db3939e6e9af29c60b3b1c8043fb9 100644 --- a/src/plugins/texteditor/behaviorsettingspage.cpp +++ b/src/plugins/texteditor/behaviorsettingspage.cpp @@ -49,7 +49,7 @@ struct BehaviorSettingsPage::BehaviorSettingsPagePrivate explicit BehaviorSettingsPagePrivate(const BehaviorSettingsPageParameters &p); const BehaviorSettingsPageParameters m_parameters; - Ui::BehaviorSettingsPage m_page; + Ui::BehaviorSettingsPage *m_page; TabSettings m_tabSettings; StorageSettings m_storageSettings; @@ -60,7 +60,7 @@ struct BehaviorSettingsPage::BehaviorSettingsPagePrivate BehaviorSettingsPage::BehaviorSettingsPagePrivate::BehaviorSettingsPagePrivate (const BehaviorSettingsPageParameters &p) - : m_parameters(p) + : m_parameters(p), m_page(0) { if (const QSettings *s = Core::ICore::instance()->settings()) { m_tabSettings.fromSettings(m_parameters.settingsPrefix, s); @@ -94,30 +94,31 @@ QString BehaviorSettingsPage::displayName() const QWidget *BehaviorSettingsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); - m_d->m_page.setupUi(w); + m_d->m_page = new Ui::BehaviorSettingsPage; + m_d->m_page->setupUi(w); settingsToUI(); if (m_d->m_searchKeywords.isEmpty()) { QLatin1Char sep(' '); QTextStream(&m_d->m_searchKeywords) - << m_d->m_page.insertSpaces->text() - << sep << m_d->m_page.autoInsertSpaces->text() - << sep << m_d->m_page.autoIndent->text() - << sep << m_d->m_page.smartBackspace->text() - << sep << m_d->m_page.indentBlocksLabel->text() - << sep << m_d->m_page.continuationAlignLabel->text() - << sep << m_d->m_page.tabKeyIndentLabel->text() - << sep << m_d->m_page.cleanWhitespace->text() - << sep << m_d->m_page.inEntireDocument->text() - << sep << m_d->m_page.cleanIndentation->text() - << sep << m_d->m_page.addFinalNewLine->text() - << sep << m_d->m_page.encodingLabel->text() - << sep << m_d->m_page.utf8BomLabel->text() - << sep << m_d->m_page.mouseNavigation->text() - << sep << m_d->m_page.scrollWheelZooming->text() - << sep << m_d->m_page.groupBoxTabAndIndentSettings->title() - << sep << m_d->m_page.groupBoxStorageSettings->title() - << sep << m_d->m_page.groupBoxEncodings->title() - << sep << m_d->m_page.groupBoxMouse->title(); + << m_d->m_page->insertSpaces->text() + << sep << m_d->m_page->autoInsertSpaces->text() + << sep << m_d->m_page->autoIndent->text() + << sep << m_d->m_page->smartBackspace->text() + << sep << m_d->m_page->indentBlocksLabel->text() + << sep << m_d->m_page->continuationAlignLabel->text() + << sep << m_d->m_page->tabKeyIndentLabel->text() + << sep << m_d->m_page->cleanWhitespace->text() + << sep << m_d->m_page->inEntireDocument->text() + << sep << m_d->m_page->cleanIndentation->text() + << sep << m_d->m_page->addFinalNewLine->text() + << sep << m_d->m_page->encodingLabel->text() + << sep << m_d->m_page->utf8BomLabel->text() + << sep << m_d->m_page->mouseNavigation->text() + << sep << m_d->m_page->scrollWheelZooming->text() + << sep << m_d->m_page->groupBoxTabAndIndentSettings->title() + << sep << m_d->m_page->groupBoxStorageSettings->title() + << sep << m_d->m_page->groupBoxEncodings->title() + << sep << m_d->m_page->groupBoxMouse->title(); m_d->m_searchKeywords.remove(QLatin1Char('&')); } @@ -143,18 +144,20 @@ QWidget *BehaviorSettingsPage::createPage(QWidget *parent) name += QLatin1String(" / "); name += QString::fromLatin1(alias); } - m_d->m_page.encodingBox->addItem(name); + m_d->m_page->encodingBox->addItem(name); if (defaultTextCodec == codec) - m_d->m_page.encodingBox->setCurrentIndex(i); + m_d->m_page->encodingBox->setCurrentIndex(i); } - m_d->m_page.utf8BomBox->setCurrentIndex(Core::EditorManager::instance()->utf8BomSetting()); + m_d->m_page->utf8BomBox->setCurrentIndex(Core::EditorManager::instance()->utf8BomSetting()); return w; } void BehaviorSettingsPage::apply() { + if (!m_d->m_page) // page was never shown + return; TabSettings newTabSettings; StorageSettings newStorageSettings; BehaviorSettings newBehaviorSettings; @@ -190,61 +193,69 @@ void BehaviorSettingsPage::apply() QSettings* settings = Core::ICore::instance()->settings(); settings->setValue(QLatin1String(Core::Constants::SETTINGS_DEFAULTTEXTENCODING), - m_codecs.at(m_d->m_page.encodingBox->currentIndex())->name()); + m_codecs.at(m_d->m_page->encodingBox->currentIndex())->name()); Core::EditorManager::instance()->setUtf8BomSetting( - Core::IFile::Utf8BomSetting(m_d->m_page.utf8BomBox->currentIndex())); + Core::IFile::Utf8BomSetting(m_d->m_page->utf8BomBox->currentIndex())); +} + +void BehaviorSettingsPage::finish() +{ + if (!m_d->m_page) // page was never shown + return; + delete m_d->m_page; + m_d->m_page = 0; } void BehaviorSettingsPage::settingsFromUI(TabSettings &tabSettings, StorageSettings &storageSettings, BehaviorSettings &behaviorSettings) const { - tabSettings.m_spacesForTabs = m_d->m_page.insertSpaces->isChecked(); - tabSettings.m_autoSpacesForTabs = m_d->m_page.autoInsertSpaces->isChecked(); - tabSettings.m_autoIndent = m_d->m_page.autoIndent->isChecked(); - tabSettings.m_smartBackspace = m_d->m_page.smartBackspace->isChecked(); - tabSettings.m_tabSize = m_d->m_page.tabSize->value(); - tabSettings.m_indentSize = m_d->m_page.indentSize->value(); - tabSettings.m_indentBraces = m_d->m_page.indentBlocksBehavior->currentIndex() >= 1; - tabSettings.m_doubleIndentBlocks = m_d->m_page.indentBlocksBehavior->currentIndex() >= 2; - - tabSettings.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)m_d->m_page.tabKeyBehavior->currentIndex(); - tabSettings.m_continuationAlignBehavior = (TabSettings::ContinuationAlignBehavior)m_d->m_page.continuationAlignBehavior->currentIndex(); - - storageSettings.m_cleanWhitespace = m_d->m_page.cleanWhitespace->isChecked(); - storageSettings.m_inEntireDocument = m_d->m_page.inEntireDocument->isChecked(); - storageSettings.m_cleanIndentation = m_d->m_page.cleanIndentation->isChecked(); - storageSettings.m_addFinalNewLine = m_d->m_page.addFinalNewLine->isChecked(); - - behaviorSettings.m_mouseNavigation = m_d->m_page.mouseNavigation->isChecked(); - behaviorSettings.m_scrollWheelZooming = m_d->m_page.scrollWheelZooming->isChecked(); + tabSettings.m_spacesForTabs = m_d->m_page->insertSpaces->isChecked(); + tabSettings.m_autoSpacesForTabs = m_d->m_page->autoInsertSpaces->isChecked(); + tabSettings.m_autoIndent = m_d->m_page->autoIndent->isChecked(); + tabSettings.m_smartBackspace = m_d->m_page->smartBackspace->isChecked(); + tabSettings.m_tabSize = m_d->m_page->tabSize->value(); + tabSettings.m_indentSize = m_d->m_page->indentSize->value(); + tabSettings.m_indentBraces = m_d->m_page->indentBlocksBehavior->currentIndex() >= 1; + tabSettings.m_doubleIndentBlocks = m_d->m_page->indentBlocksBehavior->currentIndex() >= 2; + + tabSettings.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)m_d->m_page->tabKeyBehavior->currentIndex(); + tabSettings.m_continuationAlignBehavior = (TabSettings::ContinuationAlignBehavior)m_d->m_page->continuationAlignBehavior->currentIndex(); + + storageSettings.m_cleanWhitespace = m_d->m_page->cleanWhitespace->isChecked(); + storageSettings.m_inEntireDocument = m_d->m_page->inEntireDocument->isChecked(); + storageSettings.m_cleanIndentation = m_d->m_page->cleanIndentation->isChecked(); + storageSettings.m_addFinalNewLine = m_d->m_page->addFinalNewLine->isChecked(); + + behaviorSettings.m_mouseNavigation = m_d->m_page->mouseNavigation->isChecked(); + behaviorSettings.m_scrollWheelZooming = m_d->m_page->scrollWheelZooming->isChecked(); } void BehaviorSettingsPage::settingsToUI() { const TabSettings &tabSettings = m_d->m_tabSettings; - m_d->m_page.insertSpaces->setChecked(tabSettings.m_spacesForTabs); - m_d->m_page.autoInsertSpaces->setChecked(tabSettings.m_autoSpacesForTabs); - m_d->m_page.autoIndent->setChecked(tabSettings.m_autoIndent); - m_d->m_page.smartBackspace->setChecked(tabSettings.m_smartBackspace); - m_d->m_page.tabSize->setValue(tabSettings.m_tabSize); - m_d->m_page.indentSize->setValue(tabSettings.m_indentSize); - m_d->m_page.indentBlocksBehavior->setCurrentIndex(tabSettings.m_indentBraces ? + m_d->m_page->insertSpaces->setChecked(tabSettings.m_spacesForTabs); + m_d->m_page->autoInsertSpaces->setChecked(tabSettings.m_autoSpacesForTabs); + m_d->m_page->autoIndent->setChecked(tabSettings.m_autoIndent); + m_d->m_page->smartBackspace->setChecked(tabSettings.m_smartBackspace); + m_d->m_page->tabSize->setValue(tabSettings.m_tabSize); + m_d->m_page->indentSize->setValue(tabSettings.m_indentSize); + m_d->m_page->indentBlocksBehavior->setCurrentIndex(tabSettings.m_indentBraces ? (tabSettings.m_doubleIndentBlocks ? 2 : 1) : 0); - m_d->m_page.tabKeyBehavior->setCurrentIndex(tabSettings.m_tabKeyBehavior); - m_d->m_page.continuationAlignBehavior->setCurrentIndex(tabSettings.m_continuationAlignBehavior); + m_d->m_page->tabKeyBehavior->setCurrentIndex(tabSettings.m_tabKeyBehavior); + m_d->m_page->continuationAlignBehavior->setCurrentIndex(tabSettings.m_continuationAlignBehavior); const StorageSettings &storageSettings = m_d->m_storageSettings; - m_d->m_page.cleanWhitespace->setChecked(storageSettings.m_cleanWhitespace); - m_d->m_page.inEntireDocument->setChecked(storageSettings.m_inEntireDocument); - m_d->m_page.cleanIndentation->setChecked(storageSettings.m_cleanIndentation); - m_d->m_page.addFinalNewLine->setChecked(storageSettings.m_addFinalNewLine); + m_d->m_page->cleanWhitespace->setChecked(storageSettings.m_cleanWhitespace); + m_d->m_page->inEntireDocument->setChecked(storageSettings.m_inEntireDocument); + m_d->m_page->cleanIndentation->setChecked(storageSettings.m_cleanIndentation); + m_d->m_page->addFinalNewLine->setChecked(storageSettings.m_addFinalNewLine); const BehaviorSettings &behaviorSettings = m_d->m_behaviorSettings; - m_d->m_page.mouseNavigation->setChecked(behaviorSettings.m_mouseNavigation); - m_d->m_page.scrollWheelZooming->setChecked(behaviorSettings.m_scrollWheelZooming); + m_d->m_page->mouseNavigation->setChecked(behaviorSettings.m_mouseNavigation); + m_d->m_page->scrollWheelZooming->setChecked(behaviorSettings.m_scrollWheelZooming); } const TabSettings &BehaviorSettingsPage::tabSettings() const @@ -264,5 +275,5 @@ const BehaviorSettings &BehaviorSettingsPage::behaviorSettings() const bool BehaviorSettingsPage::matches(const QString &s) const { - return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive); + return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive); } diff --git a/src/plugins/texteditor/behaviorsettingspage.h b/src/plugins/texteditor/behaviorsettingspage.h index bf765766c1bc97e655144961196b30ca33eaf49f..756418ae200103b695d2820b0b0314ea1d422e3e 100644 --- a/src/plugins/texteditor/behaviorsettingspage.h +++ b/src/plugins/texteditor/behaviorsettingspage.h @@ -62,7 +62,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() { } + void finish(); bool matches(const QString &s) const; const TabSettings &tabSettings() const; diff --git a/src/plugins/texteditor/displaysettingspage.cpp b/src/plugins/texteditor/displaysettingspage.cpp index 6a30c609c5dade107a1676f8e0dd226b00f7d639..56f7515d91090fec9fe1989ebccf9d430d1b3039 100644 --- a/src/plugins/texteditor/displaysettingspage.cpp +++ b/src/plugins/texteditor/displaysettingspage.cpp @@ -43,14 +43,14 @@ struct DisplaySettingsPage::DisplaySettingsPagePrivate explicit DisplaySettingsPagePrivate(const DisplaySettingsPageParameters &p); const DisplaySettingsPageParameters m_parameters; - Ui::DisplaySettingsPage m_page; + Ui::DisplaySettingsPage *m_page; DisplaySettings m_displaySettings; QString m_searchKeywords; }; DisplaySettingsPage::DisplaySettingsPagePrivate::DisplaySettingsPagePrivate (const DisplaySettingsPageParameters &p) - : m_parameters(p) + : m_parameters(p), m_page(0) { if (const QSettings *s = Core::ICore::instance()->settings()) { m_displaySettings.fromSettings(m_parameters.settingsPrefix, s); @@ -82,18 +82,19 @@ QString DisplaySettingsPage::displayName() const QWidget *DisplaySettingsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); - m_d->m_page.setupUi(w); + m_d->m_page = new Ui::DisplaySettingsPage; + m_d->m_page->setupUi(w); settingsToUI(); if (m_d->m_searchKeywords.isEmpty()) { - QTextStream(&m_d->m_searchKeywords) << m_d->m_page.displayLineNumbers->text() - << ' ' << m_d->m_page.highlightCurrentLine->text() - << ' ' << m_d->m_page.displayFoldingMarkers->text() - << ' ' << m_d->m_page.highlightBlocks->text() - << ' ' << m_d->m_page.visualizeWhitespace->text() - << ' ' << m_d->m_page.animateMatchingParentheses->text() - << ' ' << m_d->m_page.enableTextWrapping->text() - << ' ' << m_d->m_page.autoFoldFirstComment->text() - << ' ' << m_d->m_page.centerOnScroll->text(); + QTextStream(&m_d->m_searchKeywords) << m_d->m_page->displayLineNumbers->text() + << ' ' << m_d->m_page->highlightCurrentLine->text() + << ' ' << m_d->m_page->displayFoldingMarkers->text() + << ' ' << m_d->m_page->highlightBlocks->text() + << ' ' << m_d->m_page->visualizeWhitespace->text() + << ' ' << m_d->m_page->animateMatchingParentheses->text() + << ' ' << m_d->m_page->enableTextWrapping->text() + << ' ' << m_d->m_page->autoFoldFirstComment->text() + << ' ' << m_d->m_page->centerOnScroll->text(); m_d->m_searchKeywords.remove(QLatin1Char('&')); } return w; @@ -101,43 +102,53 @@ QWidget *DisplaySettingsPage::createPage(QWidget *parent) void DisplaySettingsPage::apply() { + if (!m_d->m_page) // page was never shown + return; DisplaySettings newDisplaySettings; settingsFromUI(newDisplaySettings); setDisplaySettings(newDisplaySettings); } +void DisplaySettingsPage::finish() +{ + if (!m_d->m_page) // page was never shown + return; + delete m_d->m_page; + m_d->m_page = 0; +} + void DisplaySettingsPage::settingsFromUI(DisplaySettings &displaySettings) const { - displaySettings.m_displayLineNumbers = m_d->m_page.displayLineNumbers->isChecked(); - displaySettings.m_textWrapping = m_d->m_page.enableTextWrapping->isChecked(); - displaySettings.m_showWrapColumn = m_d->m_page.showWrapColumn->isChecked(); - displaySettings.m_wrapColumn = m_d->m_page.wrapColumn->value(); - displaySettings.m_visualizeWhitespace = m_d->m_page.visualizeWhitespace->isChecked(); - displaySettings.m_displayFoldingMarkers = m_d->m_page.displayFoldingMarkers->isChecked(); - displaySettings.m_highlightCurrentLine = m_d->m_page.highlightCurrentLine->isChecked(); - displaySettings.m_highlightBlocks = m_d->m_page.highlightBlocks->isChecked(); - displaySettings.m_animateMatchingParentheses = m_d->m_page.animateMatchingParentheses->isChecked(); - displaySettings.m_markTextChanges = m_d->m_page.markTextChanges->isChecked(); - displaySettings.m_autoFoldFirstComment = m_d->m_page.autoFoldFirstComment->isChecked(); - displaySettings.m_centerCursorOnScroll = m_d->m_page.centerOnScroll->isChecked(); + displaySettings.m_displayLineNumbers = m_d->m_page->displayLineNumbers->isChecked(); + displaySettings.m_textWrapping = m_d->m_page->enableTextWrapping->isChecked(); + displaySettings.m_showWrapColumn = m_d->m_page->showWrapColumn->isChecked(); + displaySettings.m_wrapColumn = m_d->m_page->wrapColumn->value(); + displaySettings.m_visualizeWhitespace = m_d->m_page->visualizeWhitespace->isChecked(); + displaySettings.m_displayFoldingMarkers = m_d->m_page->displayFoldingMarkers->isChecked(); + displaySettings.m_highlightCurrentLine = m_d->m_page->highlightCurrentLine->isChecked(); + displaySettings.m_highlightBlocks = m_d->m_page->highlightBlocks->isChecked(); + displaySettings.m_animateMatchingParentheses = m_d->m_page->animateMatchingParentheses->isChecked(); + displaySettings.m_markTextChanges = m_d->m_page->markTextChanges->isChecked(); + displaySettings.m_autoFoldFirstComment = m_d->m_page->autoFoldFirstComment->isChecked(); + displaySettings.m_centerCursorOnScroll = m_d->m_page->centerOnScroll->isChecked(); } void DisplaySettingsPage::settingsToUI() { const DisplaySettings &displaySettings = m_d->m_displaySettings; - m_d->m_page.displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers); - m_d->m_page.enableTextWrapping->setChecked(displaySettings.m_textWrapping); - m_d->m_page.showWrapColumn->setChecked(displaySettings.m_showWrapColumn); - m_d->m_page.wrapColumn->setValue(displaySettings.m_wrapColumn); - m_d->m_page.visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace); - m_d->m_page.displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers); - m_d->m_page.highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine); - m_d->m_page.highlightBlocks->setChecked(displaySettings.m_highlightBlocks); - m_d->m_page.animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses); - m_d->m_page.markTextChanges->setChecked(displaySettings.m_markTextChanges); - m_d->m_page.autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment); - m_d->m_page.centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll); + m_d->m_page->displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers); + m_d->m_page->enableTextWrapping->setChecked(displaySettings.m_textWrapping); + m_d->m_page->showWrapColumn->setChecked(displaySettings.m_showWrapColumn); + m_d->m_page->wrapColumn->setValue(displaySettings.m_wrapColumn); + m_d->m_page->visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace); + m_d->m_page->displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers); + m_d->m_page->highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine); + m_d->m_page->highlightBlocks->setChecked(displaySettings.m_highlightBlocks); + m_d->m_page->animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses); + m_d->m_page->markTextChanges->setChecked(displaySettings.m_markTextChanges); + m_d->m_page->autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment); + m_d->m_page->centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll); } const DisplaySettings &DisplaySettingsPage::displaySettings() const diff --git a/src/plugins/texteditor/displaysettingspage.h b/src/plugins/texteditor/displaysettingspage.h index dc43ee5a683d1f0e30a46d27c65ea140e3bac5eb..012d4909f6e2ae49330a2de832565c3921e79add 100644 --- a/src/plugins/texteditor/displaysettingspage.h +++ b/src/plugins/texteditor/displaysettingspage.h @@ -60,7 +60,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() { } + void finish(); virtual bool matches(const QString &s) const; const DisplaySettings &displaySettings() const; diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index 2f27b940ab455467c2abae89f1c32b1f9c14d802..5a8dabcfd476fbae107ba6b00d51bab78db8ff66 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -129,7 +129,7 @@ public: TextEditor::FormatDescriptions m_descriptions; FontSettings m_value; FontSettings m_lastValue; - Ui::FontSettingsPage ui; + Ui::FontSettingsPage *m_ui; SchemeListModel *m_schemeListModel; bool m_refreshingSchemeList; QString m_searchKeywords; @@ -180,6 +180,7 @@ FontSettingsPagePrivate::FontSettingsPagePrivate(const TextEditor::FormatDescrip m_displayName(displayName), m_settingsGroup(Utils::settingsKey(category)), m_descriptions(fd), + m_ui(0), m_schemeListModel(new SchemeListModel), m_refreshingSchemeList(false) { @@ -331,28 +332,29 @@ QString FontSettingsPage::displayName() const QWidget *FontSettingsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); - d_ptr->ui.setupUi(w); - d_ptr->ui.schemeComboBox->setModel(d_ptr->m_schemeListModel); + d_ptr->m_ui = new Ui::FontSettingsPage; + d_ptr->m_ui->setupUi(w); + d_ptr->m_ui->schemeComboBox->setModel(d_ptr->m_schemeListModel); QFontDatabase db; const QStringList families = db.families(); - d_ptr->ui.familyComboBox->addItems(families); + d_ptr->m_ui->familyComboBox->addItems(families); const int idx = families.indexOf(d_ptr->m_value.family()); - d_ptr->ui.familyComboBox->setCurrentIndex(idx); + d_ptr->m_ui->familyComboBox->setCurrentIndex(idx); - d_ptr->ui.antialias->setChecked(d_ptr->m_value.antialias()); - d_ptr->ui.zoomSpinBox->setValue(d_ptr->m_value.fontZoom()); + d_ptr->m_ui->antialias->setChecked(d_ptr->m_value.antialias()); + d_ptr->m_ui->zoomSpinBox->setValue(d_ptr->m_value.fontZoom()); - d_ptr->ui.schemeEdit->setFormatDescriptions(d_ptr->m_descriptions); - d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font()); - d_ptr->ui.schemeEdit->setColorScheme(d_ptr->m_value.colorScheme()); + d_ptr->m_ui->schemeEdit->setFormatDescriptions(d_ptr->m_descriptions); + d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font()); + d_ptr->m_ui->schemeEdit->setColorScheme(d_ptr->m_value.colorScheme()); - connect(d_ptr->ui.familyComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontFamilySelected(QString))); - connect(d_ptr->ui.sizeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontSizeSelected(QString))); - connect(d_ptr->ui.zoomSpinBox, SIGNAL(valueChanged(int)), this, SLOT(fontZoomChanged())); - connect(d_ptr->ui.schemeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(colorSchemeSelected(int))); - connect(d_ptr->ui.copyButton, SIGNAL(clicked()), this, SLOT(copyColorScheme())); - connect(d_ptr->ui.deleteButton, SIGNAL(clicked()), this, SLOT(confirmDeleteColorScheme())); + connect(d_ptr->m_ui->familyComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontFamilySelected(QString))); + connect(d_ptr->m_ui->sizeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontSizeSelected(QString))); + connect(d_ptr->m_ui->zoomSpinBox, SIGNAL(valueChanged(int)), this, SLOT(fontZoomChanged())); + connect(d_ptr->m_ui->schemeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(colorSchemeSelected(int))); + connect(d_ptr->m_ui->copyButton, SIGNAL(clicked()), this, SLOT(copyColorScheme())); + connect(d_ptr->m_ui->deleteButton, SIGNAL(clicked()), this, SLOT(confirmDeleteColorScheme())); updatePointSizes(); @@ -361,12 +363,12 @@ QWidget *FontSettingsPage::createPage(QWidget *parent) if (d_ptr->m_searchKeywords.isEmpty()) { QLatin1Char sep(' '); d_ptr->m_searchKeywords = - d_ptr->ui.fontGroupBox->title() + sep - + d_ptr->ui.familyLabel->text() + sep - + d_ptr->ui.sizeLabel->text() + sep - + d_ptr->ui.zoomLabel->text() + sep - + d_ptr->ui.antialias->text() + sep - + d_ptr->ui.colorSchemeGroupBox->title(); + d_ptr->m_ui->fontGroupBox->title() + sep + + d_ptr->m_ui->familyLabel->text() + sep + + d_ptr->m_ui->sizeLabel->text() + sep + + d_ptr->m_ui->zoomLabel->text() + sep + + d_ptr->m_ui->antialias->text() + sep + + d_ptr->m_ui->colorSchemeGroupBox->title(); d_ptr->m_searchKeywords.remove(QLatin1Char('&')); } return w; @@ -375,7 +377,7 @@ QWidget *FontSettingsPage::createPage(QWidget *parent) void FontSettingsPage::fontFamilySelected(const QString &family) { d_ptr->m_value.setFamily(family); - d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font()); + d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font()); updatePointSizes(); } @@ -383,13 +385,13 @@ void FontSettingsPage::updatePointSizes() { // Update point sizes const int oldSize = d_ptr->m_value.fontSize(); - if (d_ptr->ui.sizeComboBox->count()) { - const QString curSize = d_ptr->ui.sizeComboBox->currentText(); + if (d_ptr->m_ui->sizeComboBox->count()) { + const QString curSize = d_ptr->m_ui->sizeComboBox->currentText(); bool ok = true; int oldSize = curSize.toInt(&ok); if (!ok) oldSize = d_ptr->m_value.fontSize(); - d_ptr->ui.sizeComboBox->clear(); + d_ptr->m_ui->sizeComboBox->clear(); } const QList<int> sizeLst = pointSizesForSelectedFont(); int idx = -1; @@ -397,16 +399,16 @@ void FontSettingsPage::updatePointSizes() for (; i < sizeLst.count(); ++i) { if (idx == -1 && sizeLst.at(i) >= oldSize) idx = i; - d_ptr->ui.sizeComboBox->addItem(QString::number(sizeLst.at(i))); + d_ptr->m_ui->sizeComboBox->addItem(QString::number(sizeLst.at(i))); } if (idx != -1) - d_ptr->ui.sizeComboBox->setCurrentIndex(idx); + d_ptr->m_ui->sizeComboBox->setCurrentIndex(idx); } QList<int> FontSettingsPage::pointSizesForSelectedFont() const { QFontDatabase db; - const QString familyName = d_ptr->ui.familyComboBox->currentText(); + const QString familyName = d_ptr->m_ui->familyComboBox->currentText(); QList<int> sizeLst = db.pointSizes(familyName); if (!sizeLst.isEmpty()) return sizeLst; @@ -426,13 +428,13 @@ void FontSettingsPage::fontSizeSelected(const QString &sizeString) const int size = sizeString.toInt(&ok); if (ok) { d_ptr->m_value.setFontSize(size); - d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font()); + d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font()); } } void FontSettingsPage::fontZoomChanged() { - d_ptr->m_value.setFontZoom(d_ptr->ui.zoomSpinBox->value()); + d_ptr->m_value.setFontZoom(d_ptr->m_ui->zoomSpinBox->value()); } void FontSettingsPage::colorSchemeSelected(int index) @@ -446,16 +448,16 @@ void FontSettingsPage::colorSchemeSelected(int index) const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index); readOnly = entry.readOnly; d_ptr->m_value.loadColorScheme(entry.fileName, d_ptr->m_descriptions); - d_ptr->ui.schemeEdit->setColorScheme(d_ptr->m_value.colorScheme()); + d_ptr->m_ui->schemeEdit->setColorScheme(d_ptr->m_value.colorScheme()); } - d_ptr->ui.copyButton->setEnabled(index != -1); - d_ptr->ui.deleteButton->setEnabled(!readOnly); - d_ptr->ui.schemeEdit->setReadOnly(readOnly); + d_ptr->m_ui->copyButton->setEnabled(index != -1); + d_ptr->m_ui->deleteButton->setEnabled(!readOnly); + d_ptr->m_ui->schemeEdit->setReadOnly(readOnly); } void FontSettingsPage::copyColorScheme() { - QInputDialog *dialog = new QInputDialog(d_ptr->ui.copyButton->window()); + QInputDialog *dialog = new QInputDialog(d_ptr->m_ui->copyButton->window()); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setInputMode(QInputDialog::TextInput); dialog->setWindowTitle(tr("Copy Color Scheme")); @@ -468,7 +470,7 @@ void FontSettingsPage::copyColorScheme() void FontSettingsPage::copyColorScheme(const QString &name) { - int index = d_ptr->ui.schemeComboBox->currentIndex(); + int index = d_ptr->m_ui->schemeComboBox->currentIndex(); if (index == -1) return; @@ -483,7 +485,7 @@ void FontSettingsPage::copyColorScheme(const QString &name) maybeSaveColorScheme(); // Make sure we're copying the current version - d_ptr->m_value.setColorScheme(d_ptr->ui.schemeEdit->colorScheme()); + d_ptr->m_value.setColorScheme(d_ptr->m_ui->schemeEdit->colorScheme()); ColorScheme scheme = d_ptr->m_value.colorScheme(); scheme.setDisplayName(name); @@ -496,7 +498,7 @@ void FontSettingsPage::copyColorScheme(const QString &name) void FontSettingsPage::confirmDeleteColorScheme() { - const int index = d_ptr->ui.schemeComboBox->currentIndex(); + const int index = d_ptr->m_ui->schemeComboBox->currentIndex(); if (index == -1) return; @@ -508,7 +510,7 @@ void FontSettingsPage::confirmDeleteColorScheme() tr("Delete Color Scheme"), tr("Are you sure you want to delete this color scheme permanently?"), QMessageBox::Discard | QMessageBox::Cancel, - d_ptr->ui.deleteButton->window()); + d_ptr->m_ui->deleteButton->window()); // Change the text and role of the discard button QPushButton *deleteButton = static_cast<QPushButton*>(messageBox->button(QMessageBox::Discard)); @@ -524,7 +526,7 @@ void FontSettingsPage::confirmDeleteColorScheme() void FontSettingsPage::deleteColorScheme() { - const int index = d_ptr->ui.schemeComboBox->currentIndex(); + const int index = d_ptr->m_ui->schemeComboBox->currentIndex(); QTC_ASSERT(index != -1, return) const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index); @@ -536,15 +538,15 @@ void FontSettingsPage::deleteColorScheme() void FontSettingsPage::maybeSaveColorScheme() { - if (d_ptr->m_value.colorScheme() == d_ptr->ui.schemeEdit->colorScheme()) + if (d_ptr->m_value.colorScheme() == d_ptr->m_ui->schemeEdit->colorScheme()) return; QMessageBox *messageBox = new QMessageBox(QMessageBox::Warning, tr("Color Scheme Changed"), tr("The color scheme \"%1\" was modified, do you want to save the changes?") - .arg(d_ptr->ui.schemeEdit->colorScheme().displayName()), + .arg(d_ptr->m_ui->schemeEdit->colorScheme().displayName()), QMessageBox::Discard | QMessageBox::Save, - d_ptr->ui.schemeComboBox->window()); + d_ptr->m_ui->schemeComboBox->window()); // Change the text of the discard button QPushButton *discardButton = static_cast<QPushButton*>(messageBox->button(QMessageBox::Discard)); @@ -553,7 +555,7 @@ void FontSettingsPage::maybeSaveColorScheme() messageBox->setDefaultButton(QMessageBox::Save); if (messageBox->exec() == QMessageBox::Save) { - const ColorScheme &scheme = d_ptr->ui.schemeEdit->colorScheme(); + const ColorScheme &scheme = d_ptr->m_ui->schemeEdit->colorScheme(); scheme.save(d_ptr->m_value.colorSchemeFileName()); } } @@ -594,7 +596,7 @@ void FontSettingsPage::refreshColorSchemeList() d_ptr->m_refreshingSchemeList = true; d_ptr->m_schemeListModel->setColorSchemes(colorSchemes); - d_ptr->ui.schemeComboBox->setCurrentIndex(selected); + d_ptr->m_ui->schemeComboBox->setCurrentIndex(selected); d_ptr->m_refreshingSchemeList = false; } @@ -605,16 +607,18 @@ void FontSettingsPage::delayedChange() void FontSettingsPage::apply() { - d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked()); + if (!d_ptr->m_ui) // page was never shown + return; + d_ptr->m_value.setAntialias(d_ptr->m_ui->antialias->isChecked()); - if (d_ptr->m_value.colorScheme() != d_ptr->ui.schemeEdit->colorScheme()) { + if (d_ptr->m_value.colorScheme() != d_ptr->m_ui->schemeEdit->colorScheme()) { // Update the scheme and save it under the name it already has - d_ptr->m_value.setColorScheme(d_ptr->ui.schemeEdit->colorScheme()); + d_ptr->m_value.setColorScheme(d_ptr->m_ui->schemeEdit->colorScheme()); const ColorScheme &scheme = d_ptr->m_value.colorScheme(); scheme.save(d_ptr->m_value.colorSchemeFileName()); } - int index = d_ptr->ui.schemeComboBox->currentIndex(); + int index = d_ptr->m_ui->schemeComboBox->currentIndex(); if (index != -1) { const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index); if (entry.fileName != d_ptr->m_value.colorSchemeFileName()) @@ -637,8 +641,12 @@ void FontSettingsPage::saveSettings() void FontSettingsPage::finish() { + if (!d_ptr->m_ui) // page was never shown + return; // If changes were applied, these are equal. Otherwise restores last value. d_ptr->m_value = d_ptr->m_lastValue; + delete d_ptr->m_ui; + d_ptr->m_ui = 0; } const FontSettings &FontSettingsPage::fontSettings() const diff --git a/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp b/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp index ffa8086225392ded35315987574023bb2241a2a8..b27498b1f7e1322e6766d012e8b65a6ee69b9d14 100644 --- a/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp +++ b/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp @@ -53,14 +53,15 @@ struct HighlighterSettingsPage::HighlighterSettingsPagePrivate HighlighterSettings m_settings; - Ui::HighlighterSettingsPage m_page; + Ui::HighlighterSettingsPage *m_page; }; HighlighterSettingsPage::HighlighterSettingsPagePrivate:: HighlighterSettingsPagePrivate(const QString &id) : m_id(id), m_displayName(tr("Generic Highlighter")), - m_settingsPrefix(QLatin1String("Text")) + m_settingsPrefix(QLatin1String("Text")), + m_page(0) {} HighlighterSettingsPage::HighlighterSettingsPage(const QString &id, QObject *parent) : @@ -90,27 +91,28 @@ QString HighlighterSettingsPage::displayName() const QWidget *HighlighterSettingsPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); - m_d->m_page.setupUi(w); - m_d->m_page.definitionFilesPath->setExpectedKind(Utils::PathChooser::Directory); - m_d->m_page.definitionFilesPath->addButton(tr("Download Definitions"), this, + m_d->m_page = new Ui::HighlighterSettingsPage; + m_d->m_page->setupUi(w); + m_d->m_page->definitionFilesPath->setExpectedKind(Utils::PathChooser::Directory); + m_d->m_page->definitionFilesPath->addButton(tr("Download Definitions"), this, SLOT(requestAvailableDefinitionsMetaData())); - m_d->m_page.fallbackDefinitionFilesPath->setExpectedKind(Utils::PathChooser::Directory); - m_d->m_page.fallbackDefinitionFilesPath->addButton(tr("Autodetect"), this, + m_d->m_page->fallbackDefinitionFilesPath->setExpectedKind(Utils::PathChooser::Directory); + m_d->m_page->fallbackDefinitionFilesPath->addButton(tr("Autodetect"), this, SLOT(resetDefinitionsLocation())); settingsToUI(); if (m_d->m_searchKeywords.isEmpty()) { - QTextStream(&m_d->m_searchKeywords) << m_d->m_page.definitionFilesGroupBox->title() - << m_d->m_page.locationLabel->text() - << m_d->m_page.alertWhenNoDefinition->text() - << m_d->m_page.useFallbackLocation->text() - << m_d->m_page.ignoreLabel->text(); + QTextStream(&m_d->m_searchKeywords) << m_d->m_page->definitionFilesGroupBox->title() + << m_d->m_page->locationLabel->text() + << m_d->m_page->alertWhenNoDefinition->text() + << m_d->m_page->useFallbackLocation->text() + << m_d->m_page->ignoreLabel->text(); } - connect(m_d->m_page.useFallbackLocation, SIGNAL(clicked(bool)), + connect(m_d->m_page->useFallbackLocation, SIGNAL(clicked(bool)), this, SLOT(setFallbackLocationState(bool))); - connect(m_d->m_page.definitionFilesPath, SIGNAL(validChanged(bool)), + connect(m_d->m_page->definitionFilesPath, SIGNAL(validChanged(bool)), this, SLOT(setDownloadDefinitionsState(bool))); connect(w, SIGNAL(destroyed()), this, SLOT(ignoreDownloadReply())); @@ -119,6 +121,8 @@ QWidget *HighlighterSettingsPage::createPage(QWidget *parent) void HighlighterSettingsPage::apply() { + if (!m_d->m_page) // page was not shown + return; if (settingsChanged()) settingsFromUI(); @@ -128,6 +132,14 @@ void HighlighterSettingsPage::apply() } } +void HighlighterSettingsPage::finish() +{ + if (!m_d->m_page) // page was not shown + return; + delete m_d->m_page; + m_d->m_page = 0; +} + bool HighlighterSettingsPage::matches(const QString &s) const { return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive); @@ -139,34 +151,34 @@ const HighlighterSettings &HighlighterSettingsPage::highlighterSettings() const } void HighlighterSettingsPage::settingsFromUI() -{ +{ if (!m_requestMimeTypeRegistration && ( - m_d->m_settings.definitionFilesPath() != m_d->m_page.definitionFilesPath->path() || + m_d->m_settings.definitionFilesPath() != m_d->m_page->definitionFilesPath->path() || m_d->m_settings.fallbackDefinitionFilesPath() != - m_d->m_page.fallbackDefinitionFilesPath->path() || - m_d->m_settings.useFallbackLocation() != m_d->m_page.useFallbackLocation->isChecked())) { + m_d->m_page->fallbackDefinitionFilesPath->path() || + m_d->m_settings.useFallbackLocation() != m_d->m_page->useFallbackLocation->isChecked())) { m_requestMimeTypeRegistration = true; } - m_d->m_settings.setDefinitionFilesPath(m_d->m_page.definitionFilesPath->path()); - m_d->m_settings.setFallbackDefinitionFilesPath(m_d->m_page.fallbackDefinitionFilesPath->path()); - m_d->m_settings.setAlertWhenNoDefinition(m_d->m_page.alertWhenNoDefinition->isChecked()); - m_d->m_settings.setUseFallbackLocation(m_d->m_page.useFallbackLocation->isChecked()); - m_d->m_settings.setIgnoredFilesPatterns(m_d->m_page.ignoreEdit->text()); + m_d->m_settings.setDefinitionFilesPath(m_d->m_page->definitionFilesPath->path()); + m_d->m_settings.setFallbackDefinitionFilesPath(m_d->m_page->fallbackDefinitionFilesPath->path()); + m_d->m_settings.setAlertWhenNoDefinition(m_d->m_page->alertWhenNoDefinition->isChecked()); + m_d->m_settings.setUseFallbackLocation(m_d->m_page->useFallbackLocation->isChecked()); + m_d->m_settings.setIgnoredFilesPatterns(m_d->m_page->ignoreEdit->text()); if (QSettings *s = Core::ICore::instance()->settings()) m_d->m_settings.toSettings(m_d->m_settingsPrefix, s); } void HighlighterSettingsPage::settingsToUI() { - m_d->m_page.definitionFilesPath->setPath(m_d->m_settings.definitionFilesPath()); - m_d->m_page.fallbackDefinitionFilesPath->setPath(m_d->m_settings.fallbackDefinitionFilesPath()); - m_d->m_page.alertWhenNoDefinition->setChecked(m_d->m_settings.alertWhenNoDefinition()); - m_d->m_page.useFallbackLocation->setChecked(m_d->m_settings.useFallbackLocation()); - m_d->m_page.ignoreEdit->setText(m_d->m_settings.ignoredFilesPatterns()); - - setFallbackLocationState(m_d->m_page.useFallbackLocation->isChecked()); - setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid()); + m_d->m_page->definitionFilesPath->setPath(m_d->m_settings.definitionFilesPath()); + m_d->m_page->fallbackDefinitionFilesPath->setPath(m_d->m_settings.fallbackDefinitionFilesPath()); + m_d->m_page->alertWhenNoDefinition->setChecked(m_d->m_settings.alertWhenNoDefinition()); + m_d->m_page->useFallbackLocation->setChecked(m_d->m_settings.useFallbackLocation()); + m_d->m_page->ignoreEdit->setText(m_d->m_settings.ignoredFilesPatterns()); + + setFallbackLocationState(m_d->m_page->useFallbackLocation->isChecked()); + setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid()); } void HighlighterSettingsPage::resetDefinitionsLocation() @@ -176,7 +188,7 @@ void HighlighterSettingsPage::resetDefinitionsLocation() QMessageBox::information(0, tr("Autodetect Definitions"), tr("No pre-installed definitions could be found.")); else - m_d->m_page.fallbackDefinitionFilesPath->setPath(location); + m_d->m_page->fallbackDefinitionFilesPath->setPath(location); } void HighlighterSettingsPage::requestAvailableDefinitionsMetaData() @@ -206,43 +218,43 @@ void HighlighterSettingsPage::ignoreDownloadReply() void HighlighterSettingsPage::manageDefinitions(const QList<HighlightDefinitionMetaData> &metaData) { ManageDefinitionsDialog dialog(metaData, - m_d->m_page.definitionFilesPath->path() + QLatin1Char('/'), - m_d->m_page.definitionFilesPath->buttonAtIndex(1)->window()); + m_d->m_page->definitionFilesPath->path() + QLatin1Char('/'), + m_d->m_page->definitionFilesPath->buttonAtIndex(1)->window()); if (dialog.exec() && !m_requestMimeTypeRegistration) m_requestMimeTypeRegistration = true; - setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid()); + setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid()); } void HighlighterSettingsPage::showError() { - QMessageBox::critical(m_d->m_page.definitionFilesPath->buttonAtIndex(1)->window(), + QMessageBox::critical(m_d->m_page->definitionFilesPath->buttonAtIndex(1)->window(), tr("Error connecting to server."), tr("Not possible to retrieve data.")); - setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid()); + setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid()); } void HighlighterSettingsPage::setFallbackLocationState(bool checked) { - m_d->m_page.fallbackDefinitionFilesPath->setEnabled(checked); + m_d->m_page->fallbackDefinitionFilesPath->setEnabled(checked); } void HighlighterSettingsPage::setDownloadDefinitionsState(bool valid) { - m_d->m_page.definitionFilesPath->buttonAtIndex(1)->setEnabled(valid); + m_d->m_page->definitionFilesPath->buttonAtIndex(1)->setEnabled(valid); } bool HighlighterSettingsPage::settingsChanged() const -{ - if (m_d->m_settings.definitionFilesPath() != m_d->m_page.definitionFilesPath->path()) +{ + if (m_d->m_settings.definitionFilesPath() != m_d->m_page->definitionFilesPath->path()) return true; if (m_d->m_settings.fallbackDefinitionFilesPath() != - m_d->m_page.fallbackDefinitionFilesPath->path()) + m_d->m_page->fallbackDefinitionFilesPath->path()) return true; - if (m_d->m_settings.alertWhenNoDefinition() != m_d->m_page.alertWhenNoDefinition->isChecked()) + if (m_d->m_settings.alertWhenNoDefinition() != m_d->m_page->alertWhenNoDefinition->isChecked()) return true; - if (m_d->m_settings.useFallbackLocation() != m_d->m_page.useFallbackLocation->isChecked()) + if (m_d->m_settings.useFallbackLocation() != m_d->m_page->useFallbackLocation->isChecked()) return true; - if (m_d->m_settings.ignoredFilesPatterns() != m_d->m_page.ignoreEdit->text()) + if (m_d->m_settings.ignoredFilesPatterns() != m_d->m_page->ignoreEdit->text()) return true; return false; } diff --git a/src/plugins/texteditor/generichighlighter/highlightersettingspage.h b/src/plugins/texteditor/generichighlighter/highlightersettingspage.h index a5096c71f91c84b16696e5637b38d719ec8873b3..4c6409b58055e72aeac2bcfc56e31825f5f4ac27 100644 --- a/src/plugins/texteditor/generichighlighter/highlightersettingspage.h +++ b/src/plugins/texteditor/generichighlighter/highlightersettingspage.h @@ -56,7 +56,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() {} + void finish(); bool matches(const QString &s) const; const HighlighterSettings &highlighterSettings() const;